前言
在用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}¤t=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以及大模型能够交互。