Spring AI 搭建 MCP 天气服务

引言

在当今的AI驱动世界中,如何有效地将AI模型与各种数据源和工具集成是一个关键问题。MCP(Model Context Protocol)协议应运而生,它提供了一种标准化的方式,使得AI应用能够无缝连接不同的数据源和工具。本文将介绍如何使用MCP协议构建一个基于Spring Boot的应用,并展示如何通过MCP协议获取天气信息。

MCP协议简介

MCP协议类似于USB-C接口,它为AI应用提供了一个标准化的连接方式。通过MCP协议,AI模型可以轻松地集成各种数据源和工具,从而构建复杂的代理和工作流。MCP协议的主要优势包括:

  • 预构建的集成:MCP提供了一系列预构建的集成,使得AI模型可以直接接入这些数据源和工具。

  • 灵活性:MCP允许在不同LLM提供商之间灵活切换。

  • 安全性:MCP提供了最佳实践,确保数据在基础设施中的安全性。

项目架构

本项目采用Spring Boot框架,并使用MCP协议来获取天气信息。项目的核心架构如下:

  1. MCP Server:负责与外部数据源(如天气API)进行交互,并将数据通过MCP协议暴露给客户端。

  2. Spring Boot应用:作为MCP客户端,通过MCP协议与MCP Server进行通信,获取所需的数据。

项目实现

1.环境信息

  • SpringBoot 3.3.6

  • Spring AI 1.0.0-SNAPSHOT

  • Maven 3.9.9

  • JDK 17

2.项目依赖

首先,我们需要在pom.xml文件中添加必要的依赖项,包括Spring Boot、Spring AI和MCP Server的相关依赖。

<dependencies>
    <dependency>
        <groupId>org.springframework.ai</groupId>
        <artifactId>spring-ai-mcp-server-webflux-spring-boot-starter</artifactId>
    </dependency>
</dependencies>

注:若依赖无法下载,需要配置下快照仓库地址,详见文末代码仓库。

3. 主应用类

McpServerUsefulToolsApplication.java中,我们定义了主应用类,并配置了MCP工具的回调。

@SpringBootApplication
public class McpServerUsefulToolsApplication {

    public static void main(String[] args) {
        SpringApplication.run(McpServerUsefulToolsApplication.class, args);
    }

    @Bean
    public ToolCallbackProvider weatherTools(WeatherService weatherService) {
        return MethodToolCallbackProvider.builder().toolObjects(weatherService).build();
    }

    @Bean
    public ToolCallbackProvider stockTools(StockService stockService) {
        return MethodToolCallbackProvider.builder().toolObjects(stockService).build();
    }
}

4. 天气服务

WeatherService.java中,我们实现了通过MCP协议获取天气信息的功能。

@Service
public class WeatherService {

    private static final String BASE_URL = "https://wttr.in";

    private final RestClient restClient;

    public WeatherService() {
        this.restClient = RestClient.builder()
                .baseUrl(BASE_URL)
                .defaultHeader("Accept", "application/geo+json")
                .defaultHeader("User-Agent", "WeatherApiClient/1.0 (your@email.com)")
                .build();
    }

    @Tool(description = "Get current weather information for a China city. Input is city name (e.g. 杭州, 上海)")
    public String getWeather(String cityName) {
        WeatherResponse response = restClient.get()
                .uri("/{city_name}?format=j1", cityName)
                .retrieve()
                .body(WeatherResponse.class);
        if (response != null && response.getCurrent_condition() != null && !response.getCurrent_condition().isEmpty()) {
            CurrentCondition currentCondition = response.getCurrent_condition().get(0);
            String result = String.format("""
                    城市: %s
                    天气情况: %s
                    气压: %s(mb)
                    温度: %s°C (Feels like: %s°C)
                    湿度: %s%%
                    降水量:%s (mm)
                    风速: %s km/h (%s)
                    能见度: %s 公里
                    紫外线指数: %s
                    观测时间: %s
                    """,
                    cityName,
                    currentCondition.getWeatherDesc().get(0).getValue(),
                    currentCondition.getPressure(),
                    currentCondition.getTemp_C(),
                    currentCondition.getFeelsLikeC(),
                    currentCondition.getHumidity(),
                    currentCondition.getPrecipMM(),
                    currentCondition.getWindspeedKmph(),
                    currentCondition.getWinddir16Point(),
                    currentCondition.getVisibility(),
                    currentCondition.getUvIndex(),
                    currentCondition.getLocalObsDateTime()
            );
            return result;
        } else {
            return "无法获取天气信息,请检查城市名称是否正确或稍后重试。";
        }
    }
}

5. 数据模型

CurrentCondition.javaWeatherDesc.javaWeatherResponse.java中,我们定义了天气数据的模型类。

public class CurrentCondition {
    private String feelsLikeC;
    private String humidity;
    private String localObsDateTime;
    private String precipMM;
    private String pressure;
    private String temp_C;
    private String uvIndex;
    private String visibility;
    private List<WeatherDesc> weatherDesc;
    private String winddir16Point;
    private String windspeedKmph;

    // Getters and Setters
}

public class WeatherDesc {
    private String value;

    // Getter and Setter
}

public class WeatherResponse {
    private List<CurrentCondition> current_condition;

    // Getter and Setter
}

    6.使用

    这里使用Cherry Studio进行天气查询MCP服务测试,具体配置可见文末文档地址。

    添加服务器

    设置服务地址

    选择SSE类型,填入服务地址

    聊天框启用服务

    天气服务使用

      MCP导航站

      这里推荐一个MCP服务导航网站https://mcphub.tools,里边收集了1000+MCP服务,网站首页按照star数量精选了一批应用

      首页

      分类

      可以按照分类进行筛选搜索

      结论

      通过MCP协议,我们可以轻松地将AI模型与各种数据源和工具集成,从而构建强大的AI应用。本文展示了如何使用MCP协议构建一个基于Spring Boot的应用,并通过MCP协议获取天气。希望本文能帮助你更好地理解MCP协议,并在实际项目中应用它。

      参考资料

      Introduction - Model Context Protocol

      Model Context Protocol (MCP) :: Spring AI Reference

      MCP 使用教程 | CherryStudio

      https://mcphub.tools

      代码仓库

      https://github.com/tmstack/mcp-server-useful-tools

      ### Spring与阿里云MCPAI应用程序中的集成 Spring框架及其生态系统提供了丰富的工具集来构建分布式微服务架构,而阿里云MCP(Microservice Control Plane)则专注于为企业提供全面的服务治理能力。两者结合可以显著提升AI应用开发效率和服务质量。 #### 使用Spring Boot简化AI应用开发 通过Spring Boot自动配置特性,开发者能够快速搭建起基于Java的应用程序骨架结构[^1]。对于机器学习模型部署而言,这意味着更少的手动设置工作量以及更高的灵活性: ```java @SpringBootApplication public class AiApplication { public static void main(String[] args) { SpringApplication.run(AiApplication.class, args); } } ``` #### 利用Alibaba Cloud MCP实现高效服务管理 针对大规模生产环境下的复杂需求场景,借助于阿里云MCP所提供的流量控制、熔断降级等功能模块,可有效保障线上业务稳定运行的同时支持弹性伸缩机制[^2]。具体到AI领域,则体现在以下几个方面: - **灰度发布**:允许新版本逐步替换旧版API接口,在不影响现有用户体验的前提下完成迭代升级; - **限流策略**:防止突发请求洪峰冲击导致系统崩溃,特别适用于预测类高并发调用场合; - **链路追踪**:配合Jaeger/Zipkin等开源组件记录每一次跨服务交互过程,便于定位性能瓶颈并优化整体响应时间; #### 实现端到端的安全性和可观测性 为了确保整个系统的安全性及透明度,建议采用如下措施加强防护力度: - 集成OAuth2.0认证授权协议保护敏感数据访问权限; - 开启日志审计功能跟踪异常行为模式变化趋势; - 结合Prometheus+Grafana监控平台实时展示各项指标状态图表。 综上所述,利用Spring生态体系搭配阿里云MCP不仅能满足现代企业对智能化转型过程中提出的多样化诉求,而且有助于打造更加健壮可靠的云端基础设施底座。
      评论
      添加红包

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

      当前余额3.43前往充值 >
      需支付:10.00
      成就一亿技术人!
      领取后你会自动成为博主和红包主的粉丝 规则
      hope_wisdom
      发出的红包
      实付
      使用余额支付
      点击重新获取
      扫码支付
      钱包余额 0

      抵扣说明:

      1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
      2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

      余额充值