模型上下文协议(Model Context Protocol,简称MCP)是一个由 Anthropic 在 2024 年 11 月 25 日开源的新标准。MCP 是一个开放标准,旨在连接AI助手与数据所在的系统,包括内容存储库、业务工具和开发环境。其目标是帮助前沿模型产生更好、更相关的响应。

MCP 遵循客户端-服务器架构,其中主机应用可以连接到多个服务器。
MCP 有三个关键组件:
- 主机(Host):代表任何提供 AI 交互环境的应用程序(如 Claude 桌面版、Cursor),它能访问工具和数据,并运行 MCP 客户端。
- 客户端(Client):在主机内运行,使其能与 MCP 服务器通信。
- 服务器(Server):暴露特定功能并提供数据访问
1 服务器的创建
1.1 引入依赖
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| <dependencies> <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-mcp-serverwebflux</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> <scope>provided</scope> </dependency> <dependency> <groupId>com.squareup.okhttp3</groupId> <artifactId>okhttp</artifactId> <version>4.12.0</version> </dependency> </dependencies> <dependencyManagement> <dependencies> <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>
|
配置文件
1 2 3 4 5 6 7 8
| spring: ai: mcp: server: name: autho-info-server version: 1.0.0 server: port: 9090
|
所谓Tool设计,就是当前这个MCP Server能具体提供哪些功能模块的服务。每一个Tool就是一个函数,只不过需要使用一些特殊的注解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| @Service public class OpenMyBlogTool { private static final String BLOG_HOME_URL = "https://blog.csdn.net/qq_38526573"; @Tool(name = "get-blog-info", description = "获取博客信息") public String getAuthorInfo() { OkHttpClient client = new OkHttpClient(); String htmlContent = getHtmlContent(client, BLOG_HOME_URL); if (htmlContent == null || htmlContent.isEmpty()) { System.err.println("无法获取网页内容"); return "无法获取网页内容"; } return htmlContent; }
private String getHtmlContent(OkHttpClient client, String url) { Request request = new Request.Builder() .url(url) .header("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36") .build(); try (Response response = client.newCall(request).execute()) { if (response.isSuccessful() && response.body() != null) { return response.body().string(); } else { System.err.println("请求失败,响应码:" + response.code()); return null; } } catch (IOException e) { System.err.println("网络请求异常:" + e.getMessage()); e.printStackTrace(); return null; } } }
|
可以看到,这个简单的ToolCalling,主要功能是获取博客的一些信息
1.3 注册暴露MCP
初始化ToolCallbackProvider的Bean对象,注册上面配置的Tools类
1 2 3 4 5 6 7
| @Configuration public class ToolCallbackProviderConfig { @Bean public ToolCallbackProvider OpenMyBlogTool(OpenMyBlogTool openMyBlogTool) { return MethodToolCallbackProvider.builder().toolObjects(openMyBlogTool).build(); } }
|
1.4 启动MCP Server

启动web之后,如果能看到registered tools这一行,后面为tool数量,那么就启动成功了。这样Server就被暴露在设置的端口下了,其他项目就可以通过MCP Client去找到暴露Server里面暴露的Tools进行调用
2 客户端创建
2.1 依赖
核心依赖
1 2 3 4
| <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter-mcp-clientwebflux</artifactId> </dependency>
|
2.2 配置文件
1 2 3 4 5 6 7
| spring.ai.mcp.client.toolcallback.enabled=true spring.ai.mcp.client.name=mcp-client spring.ai.mcp.client.enabled=true spring.ai.mcp.client.type=async
spring.ai.mcp.client.sse.connections.author-info server.url=http://localhost:9090
|
2.3 案例测试
1 2 3 4 5 6 7 8 9 10 11 12 13
| @Autowired private OpenAiChatModel model; @Autowired private ToolCallbackProvider tools;
@Test void mcpTest(){ ChatClient client = ChatClient.builder(model) .defaultToolCallbacks(tools) .build(); String content = client.prompt("获取博客的作者和内容信息").call().content(); System.out.println(content); }
|