> 技术文档 > 基于SpringAI搭建一个查询ip归属地的MCP Server(SSE模式)_spring mcp server sse

基于SpringAI搭建一个查询ip归属地的MCP Server(SSE模式)_spring mcp server sse


文章目录

  • 1. 前言
  • 2. 环境
  • 3. 步骤
    • 3.1 使用Spring Initalizer搭建项目
    • 3.2 添加sse支持(依赖)
    • 3.3 编写工具
    • 3.4 编写mcp 服务类
    • 3.5 编写mcp 配置类
    • 3.6 配置文件
    • 3.7 启动应用
    • 3.8 在 Cherry Studio中配置mcp server
    • 3.9 在Cherry Studio对话中测试
  • 4. 参考

1. 前言

  • 本文将指导你如何使用SpringAI搭建一个查询ip归属地的MCP Serer(SSE模式),使用这个MCP server,用户可以直接在AI工具中直接使用自然语言查询ip归属地。
  • SpringAI于2025年5月21日发布了 1.0.0 GA 正式版本,这标志着SpringAI基本功能已经成熟,使用SpringAI,只要少量代码就可以实现一个MCP Server。

2. 环境

  • JDK 17
  • SpringBoot 3.5.0
  • SpringAI 1.0.0
  • Cherry Studio 1.3.12,作为 MCP Client调用MCP Server,用于测试。
  • IDEA 2022 社区版

3. 步骤

3.1 使用Spring Initalizer搭建项目

在浏览器中打开:https://start.spring.io/。如下图所示,Java版本选17,SpringBoot版本选择3.5.0, 包管理器选择Maven,依赖项选择“Model Context Protocal Server”(1),然后点击“GENERATE”按钮(2),它会下载一个压缩包。
基于SpringAI搭建一个查询ip归属地的MCP Server(SSE模式)_spring mcp server sse

解压压缩包,使用IDEA加载项目。

3.2 添加sse支持(依赖)

通过上一步骤引入的依赖,仅支持 mcp server的 stdio模式,如果要支持 sse模式,需要再引入其它的包。

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

3.3 编写工具类

在此我们使用百度的api来获取ip归属地。它的api很简单,只要通过get请求以下地址就可以了,记得将ip替换为你要查询的ip。
https://opendata.baidu.com/api.php?query=ip&co=&resource_id=6006&oe=utf8
将这个功能封装为一个工具类,如下:

@Slf4jpublic class IpSearchUtils { public static String getLocation(String ip) { String url = \"https://opendata.baidu.com/api.php?query=\" + ip + \" &co=&resource_id=6006&oe=utf8\"; try { String jsonStr = HttpUtil.get(url); IpInfoDto ipInfoDto = JSONUtil.toBean(jsonStr, IpInfoDto.class); if (ipInfoDto != null && ipInfoDto.getData() != null && ipInfoDto.getData().length > 0) { return ipInfoDto.getData()[0].getLocation(); } else { return null; } } catch (Exception e) { log.warn(\"获取ip位置信息失败\", e); return null; } }}

关于 IpInfoDto.java类要如何生成,这里有一个小技巧。
在浏览器中输入:

 https://opendata.baidu.com/api.php?query=112.111.7.192&co=&resource_id=6006&oe=utf8

可以得取一个json响应,类似于以下:

{\"status\":\"0\",\"t\":\"\",\"set_cache_time\":\"\",\"data\":[{\"ExtendedLocation\":\"\",\"OriginQuery\":\"112.111.7.192\",\"SchemaVer\":\"\",\"appinfo\":\"\",\"disp_type\":0,\"fetchkey\":\"112.111.7.192\",\"location\":\"福建省福州市 联通\",\"origip\":\"112.111.7.192\",\"origipquery\":\"112.111.7.192\",\"resourceid\":\"6006\",\"role_id\":0,\"schemaID\":\"\",\"shareImage\":1,\"showLikeShare\":1,\"showlamp\":\"1\",\"strategyData\":{},\"titlecont\":\"IP地址查询\",\"tplt\":\"ip\"}]}

使用DeepSeek或通义灵码之类的AI工具,输入以下提示词,让它根据json生成dto:

根据以下json提取java dto,字段要加上注释,json中的值为示例值:{\"status\":\"0\",\"t\":\"\",\"set_cache_time\":\"\",\"data\":[{\"ExtendedLocation\":\"\",\"OriginQuery\":\"112.111.7.192\",\"SchemaVer\":\"\",\"appinfo\":\"\",\"disp_type\":0,\"fetchkey\":\"112.111.7.192\",\"location\":\"福建省福州市 联通\",\"origip\":\"112.111.7.192\",\"origipquery\":\"112.111.7.192\",\"resourceid\":\"6006\",\"role_id\":0,\"schemaID\":\"\",\"shareImage\":1,\"showLikeShare\":1,\"showlamp\":\"1\",\"strategyData\":{},\"titlecont\":\"IP地址查询\",\"tplt\":\"ip\"}]}

3.4 编写mcp 服务类

@Servicepublic class IpSearchService { @Tool(name = \"获取ip归属地\", description = \"根据ip获取归属地\") public String getLocationByIp(@ToolParam(description = \"ip地址, 使用ipv4的格式\") String ip) { if (Objects.isNull(ip)) { return \"错误:ip地址不能为空\"; } String location = IpSearchUtils.getLocation(ip); if (Objects.isNull(location)) { return \"错误:未查找到ip的归属地\"; } else { return \"ip归属地:\" + location; } }}

代码解析:

  • 跟常规的java服务类一样,它也使用@Service注解。
  • 它使用 @Tool(name = “获取ip归属地”, description = “根据ip获取归属地”) 将方法声明为 mcp工具。 @ToolParam为参数说明。

3.5 编写mcp 配置类

@Configurationpublic class McpConfig { @Bean public ToolCallbackProvider toolCallbackProvider(IpSearchService service) { return MethodToolCallbackProvider.builder().toolObjects(service).build(); }}

说明:

  • 以上代码将 IpSearchService中的工具暴露出去。

3.6 配置文件

server.port=7080spring.ai.mcp.server.sse-endpoint=/ssespring.ai.mcp.server.name=weather-mcp-serverspring.ai.mcp.server.version=1.0.0

说明:

  • 以上这个配置了服务的名称、版本、暴露了一个端点/sse。后续使用 http://localhost:7080/sse 可以访问到这个服务。

3.7 启动应用

如常规的SpringBoot应用一样启动。
基于SpringAI搭建一个查询ip归属地的MCP Server(SSE模式)_spring mcp server sse

在浏览器中输入: http://localhost:7080/sse, 可以得取以下结果:
基于SpringAI搭建一个查询ip归属地的MCP Server(SSE模式)_spring mcp server sse

3.8 在 Cherry Studio中配置mcp server

在此使用Cherry Studio作为 MCP Client调用MCP Server。关于cherry studio的基本用法,请参考官方技术文档,在此就不赘述了。
打开Cherry Studio,如下图所示进行配置: 点击左侧的“设置”图标(1),接着点击“MCP服务器”(2),然后点击“添加服务器”->“快速创建”(3)。
基于SpringAI搭建一个查询ip归属地的MCP Server(SSE模式)_spring mcp server sse
在弹出的对话框架中做如下配置,其中,名称随意填,只要能够区分就可以;类型选择sse, url填上一步得到的地址。
基于SpringAI搭建一个查询ip归属地的MCP Server(SSE模式)_spring mcp server sse
点击工具选择卡,如下图所示,可以看到我们代码中定义的工具。
基于SpringAI搭建一个查询ip归属地的MCP Server(SSE模式)_spring mcp server sse

3.9 在Cherry Studio对话中测试

进入Cherry Studio, 按下图所示,点击左侧“助手”图标(1), 然后在聊天框的工具栏中选择“MCP服务器”图标(3), 在菜单中选择之前配置的“ip归属地查询MCP Server”(3)。
基于SpringAI搭建一个查询ip归属地的MCP Server(SSE模式)_spring mcp server sse

在聊天窗口中输入以下问题:

122.224.33.10 属于哪里?

基于SpringAI搭建一个查询ip归属地的MCP Server(SSE模式)_spring mcp server sse

4. 参考

  • Spring AI 1.0 正式 GA
  • WebMVC Server Transport