Spring AI构建天气查询MCP服务并使用inspector测试的踩坑全记录

69 阅读2分钟

前言

在用Spring ai实现官网的MCP天气查询服务器时,遇到不少问题,故记录下来,希望能帮助初学者少走弯路。

背景

我先实现一个简易的基于纬度和经度的天气查询,作为MCP Server,并用MCP Inspector做MCP客户端调用调试。

环境搭建与基础配置

  • 开发环境
    JDK17、SpringBoot3.5.8、SpringAI1.1.0
  • 关键依赖项
    pom文件如下:
    ```
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.5.8</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>mcp-weather-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Spring AI MCP Weather - Server</name>
    <description>mcp-weather-server</description>

    <properties>
        <java.version>17</java.version>
        <spring-ai.version>1.1.0</spring-ai.version>
    </properties>

    <dependencyManagement>
        <dependencies>
<!--            使用物料清单统一管理Springai版本-->
            <dependency>
                <groupId>org.springframework.ai</groupId>
                <artifactId>spring-ai-bom</artifactId>
                <version>${spring-ai.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
```
  • 初始配置
    application.properties如下:
spring.ai.mcp.server.name=mcp-weather-server
spring.ai.mcp.server.request-timeout=1h

spring.ai.mcp.server.port=8080

spring.ai.mcp.server.protocol=STREAMABLE
logging.file.name=./mcp-weather-server/target/server.log

spring.ai.mcp.server.protocol=STREAMABLE 这个配置定义了服务器Streamable HTTP传输协议,我之前在配置中加了spring.ai.mcp.server.stdio=true,导致协议冲突,这个配置不写默认是false。

MCP天气查询服务的实现

用SpringAI实现MCP server的tool,核心代码如下:


@McpTool(description = "Get the temperature (in celsius) for a specific location")
public WeatherResponse getTemperature(
        @McpToolParam(description = "The location latitude") double latitude,
        @McpToolParam(description = "The location longitude") double longitude) {

    return RestClient.create()
            .get()
            .uri("https://api.open-meteo.com/v1/forecast?latitude={latitude}&longitude={longitude}&current=temperature_2m",
                    latitude, longitude)
            .retrieve()
            .body(WeatherResponse.class);
}

这几行代码就定义了一个可以被大模型使用的Tool。在IDE中启动SpringBoot项目,或用mvnw打包成jar再启动。打包启动命令如下:

./mvnw clean install -DskipTests 
java -jar target/mcp-weather-server-0.0.1-SNAPSHOT.jar

在服务启动后,服务器通过http://localhost:8080/mcp 暴露mcp服务。

使用MCP Inspector调试MCP服务

MCP Inspector是一个用来调试MCP Server的交互式的开发者工具,基于nodejs,如果没安装的话需要先安装nodejs环境。命令行界面使用npx @modelcontextprotocol/inspector命令可以启动一个MCP Inspector服务,该命令默认安装最新版的inspecctor,但我发现这个版本与我选择的SpringAI版本不兼容,于是使用以下命令重新启动:

npx @modelcontextprotocol/inspector@0.16.0

该命令在6274端口启动了一个web服务,浏览器会自动弹出窗口,如果没有弹出,可使用http://localhost:6274 访问。在浏览器界面Transport Type选择Streamable HTTP, URL填入 http://localhost:8080/mcp,在Configuration下Proxy Session Token中填入在命令行界面启动服务时自动生成的Session Token,然后点击Connect连接服务器。列出Tools,并运行getTemperature,就可测试MCP server是否正常运行。之前发生了跨域问题,我增加了处理跨域请求的代码,但我在复现跨域问题时去掉处理跨域的代码,跨域问题没有出现。一个简单的天气查询MCP Server完成。

总结

本文记录了搭建天气查询MCP Server并使用inspector测试的过程。后续将基于大模型构建MCP Client,让MCP Client、MCP Server以及大模型能够交互。