怎样开辟 MCP 服务?保姆级教程!
最近这段时间有个 AI 相关的概念特别火,叫 MCP,全称模子上下文协议(Model Context Protocol)。这是由 Anthropic 推出的一项开放标准,目标是为大型语言模子和 AI 助手提供一个统一、标准化的接口,使 AI 能够轻松操纵外部工具并完成更复杂的使命。这篇文章,就带各人速通 MCP,了解其焦点概念,并且以我们给本身产品 面试鸭 开辟的面试搜题 MCP 服务为例,带各人实战 MCP 服务端和客户端的开辟!
开源指路:https://github.com/yuyuanweb/mcp-mianshiya-server
https://pic.yupi.icu/1/1744008993525-16f07f5b-e3b4-4f1a-97dd-ea886c8d945d.png
MCP 为啥如此告急?
以前,如果想让 AI 处理我们的数据,根本只能靠预训练数据或者上传数据,既麻烦又低效。而且,就算是很强大的 AI 模子,也会有数据隔离的问题,无法直接访问新数据,每次有新的数据进来,都要重新训练或上传,扩展起来比力困难。
现在,MCP 解决了这个问题,它突破了模子对静态知识库的依赖,使其具备更强的动态交互能力,能够像人类一样调用搜索引擎、访问本地文件、连接 API 服务,甚至直接操纵第三方库。所以 MCP 相称于在 AI 和数据之间架起了一座桥。更告急的是,只要各人都遵照 MCP 这套协议,AI 就能无缝连接本地数据、互联网资源、开辟工具、生产力软件,甚至整个社区生态,实现真正的“万物互联”,这将极大提升 AI 的协作和工作能力,代价不可估量。
https://pic.yupi.icu/1/1744006127873-09bedb4a-5c7c-4cd0-9c4d-3620f319eac7.png
MCP 总体架构
MCP 的焦点是 “客户端 - 服务器” 架构,其中 MCP 客户端主机可以连接到多个服务器。客户端主机是指希望通过 MCP 访问数据的程序,比如 Claude Desktop、IDE 或 AI 工具。
https://pic.yupi.icu/1/1742979138403-f9f03e19-3537-461e-95d5-6f8a9a413c3a.jpeg
MCP Java SDK 架构
我们可以使用 Spring AI 框架来开辟 MCP 服务,可以先通过 官方文档 来了解其根本架构。
遵照三层架构:
https://pic.yupi.icu/1/1742980122479-fdc478e9-b5a2-40b9-8ba1-5fd8817a8551.png
我们分别来看每一层的作用:
[*]客户端/服务器层:McpClient 处理客户端操纵,而 McpServer 管理服务器端协议操纵。两者都使用 McpSession 进行通信管理。
[*]会话层(McpSession):通过 DefaultMcpSession 实现管理通信模式和状态。
[*]传输层(McpTransport):处理 JSON-RPC 消息序列化和反序列化,支持多种传输实现。
MCP 客户端
MCP 客户端是 MCP 架构中的关键组件,主要负责和 MCP 服务器建立连接并进行通信。它能自动匹配服务器的协议版本,确认可用功能,并负责数据传输和 JSON-RPC 交互。别的,它还能发现和使用各种工具、管理资源,并与提示体系进行交互。
除了这些焦点功能,MCP 客户端还支持一些额外特性,比如根管理、采样控制,以及同步或异步操纵。为了适应不同场景,它提供了多种数据传输方式,包括标准输入/输出、基于 Java HttpClient 和 WebFlux 的 SSE 传输。
https://pic.yupi.icu/1/1742980741377-6e68d16e-900f-456b-8a92-c2c14975fbe8.png
MCP 服务端
MCP 服务器是整个 MCP 架构的焦点部门,主要用来为客户端提供各种工具、资源和功能支持。它负责处理客户端的请求,包括剖析协议、提供工具、管理资源以及处理各种交互信息。同时,它还能记录日志、发送通知,并且支持多个客户端同时连接,包管高效的通信和协作。它可以通过多种方式进行数据传输,比如标准输入/输出、Servlet、WebFlux 和 WebMVC,满足不同应用场景的需求。
https://pic.yupi.icu/1/1742980873671-f074c8e9-59eb-434e-be2c-ccdaf4d3c8a0.png
Spring AI 集成 MCP
可以通过引入一些依赖,直接让 Spring AI 和 MCP 进行集成,在 Spring Boot 项目中轻松使用。
比如客户端启动器:
[*]spring-ai-starter-mcp-client:焦点启动器,提供 STDIO 和基于 HTTP 的 SSE 支持
[*]spring-ai-starter-mcp-client-webflux:基于 WebFlux 的 SSE 流式传输实现
服务器启动器:
[*]spring-ai-starter-mcp-server:焦点服务器,具有 STDIO 传输支持
[*]spring-ai-starter-mcp-server-webmvc:基于 Spring MVC 的 SSE 流式传输实现
[*]spring-ai-starter-mcp-server-webflux:基于 WebFlux 的 SSE 流式传输实现
下面我们来实战 MCP 项目的开辟。
MCP 开辟
MCP 的使用分为两种模式,STDIO 模式(本地运行)和 SSE 模式(长途服务)。
MCP 服务端(基于stdio标准流)
基于 stdio 的实现是最常见的 MCP 客户端方案,它通过标准输入输出流与 MCP 服务器进行通信。这种方式简单直观,能够直接通过历程间通信实现数据交互,避免了额外的网络通信开销。特别适用于本地部署的 MCP 服务器,可以在同一台机器上启动 MCP 服务器历程,与客户端无缝对接。
1、引入依赖
<dependency><br> <groupId>org.springframework.ai</groupId><br> <artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId><br> <version>1.0.0-M6</version><br></dependency>2、配置 MCP 服务端
spring:<br>application:<br> name: mcp-server<br>main:<br> web-application-type: none # 必须禁用web应用类型<br> banner-mode: off # 禁用banner<br>ai:<br> mcp:<br> server:<br> stdio: true # 启用stdio模式<br> name: mcp-server # 服务器名称<br> version: 0.0.1 # 服务器版本3、实现 MCP 工具
@Tool 是 Spring AI MCP 框架中用于快速暴露业务能力为 AI 工具的焦点注解,该注解实现 Java 方法与 MCP 协议工具的自动映射,并且可以通过注解的属性 description,帮助人工智能模子根据用户输入的信息决定是否调用这些工具,并返回相应的结果。
下面是一段示例代码:
/**<br>* 根据搜索词搜索面试鸭面试题目<br>*<br>* @param searchText 搜索词<br>* @return 面试鸭搜索结果的题目链接<br>*/<br>@Tool(description = "根据搜索词搜索面试鸭面试题目(如果用户提的问题的技术面试题,优先搜索面试鸭的题目列表)")<br>public String callMianshiya(String searchText) {<br> // 执行从面试鸭数据库中搜索题目的逻辑(代码省略)<br> System.out.println("用户要搜索:" + searchText);<br>}
4、注册 MCP 工具
最后向 MCP 服务注册刚刚写的工具:
@Bean<br>public ToolCallbackProvider serverTools(MianshiyaService mianshiyaService) {<br> return MethodToolCallbackProvider.builder()<br> .toolObjects(mianshiyaService)<br> .build();<br>}这段代码界说了一个 Spring 的 Bean,用于将面试鸭的标题搜索服务MianshiyaService中所有用 @Tool 注解标记的方法注册为工具,供 AI 模子调用。ToolCallbackProvider是 Spring AI 中的一个接口,用于界说工具发现机制,主要负责将那些使用 @Tool 注解标记的方法转换为工具回调对象,并提供给 ChatClient 或ChatModel 使用,以便 AI 模子能够在对话过程中调用这些工具。
5、运行服务端
MCP 服务端代码写完之后,直接用 Maven 打包运行项目:
mvn clean package -DskipTests
MCP 客户端(基于 stdio 标准流)
1、引入依赖
<dependency><br> <groupId>org.springframework.ai</groupId><br> <artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId><br> <version>1.0.0-M6</version><br></dependency>2、配置 MCP 服务器
因为刚刚服务端是通过stdio实现的,需要在application.yml中配置MCP服务器的一些参数:
spring:<br>ai:<br> mcp:<br> client:<br> stdio:<br> # 指定MCP服务器配置文件<br> servers-configuration: classpath:/mcp-servers-config.json<br>mandatory-file-encoding: UTF-8其中 mcp-servers-config.json 的配置如下:
{<br> "mcpServers": {<br> "mianshiyaServer": {<br> "command": "java",<br> "args": [<br> "-Dspring.ai.mcp.server.stdio=true",<br> "-Dspring.main.web-application-type=none",<br> "-Dlogging.pattern.console=",<br> "-jar",<br> "/Users/yupi/Documents/mcp-server/target/mcp-server-0.0.1-SNAPSHOT.jar"<br> ],<br> "env": {}<br> }<br>}<br>}这个配置文件设置了 MCP 客户端的根本配置,包括 Java 命令参数,服务端 jar 包的绝对路径等。上述的 JSON 配置文件也可以直接写在application.yml里,结果是一样的。
mcp:<br> client:<br> stdio:<br> connections:<br> server1:<br> command: java<br> args:<br> - -Dspring.ai.mcp.server.stdio=true<br> - -Dspring.main.web-application-type=none<br> - -Dlogging.pattern.console=<br> - -jar<br> - /Users/yupi/Documents/mcp-server/target/mcp-server-0.0.1-SNAPSHOT.jar客户端我们使用阿里巴巴的通义千问模子,所以引入 spring-ai-alibaba-starter 依赖,如果你使用的是其他的模子,也可以使用对应的依赖项,比如 openAI 引入 spring-ai-openai-spring-boot-starter 这个依赖就行了。还需要配置大模子的密钥等信息,key 可以直接 去官网 申请,模子我们用的是 qwen-max。
spring:<br>ai:<br> dashscope:<br> api-key: ${通义千问的key}<br> chat:<br> options:<br> model: qwen-max3、初始化谈天客户端,一行代码就搞定了:
@Bean<br>public ChatClient initChatClient(ChatClient.Builder chatClientBuilder,<br> ToolCallbackProvider mcpTools) {<br> return chatClientBuilder.defaultTools(mcpTools).build();<br>}这段代码界说了一个 Spring Bean,用于初始化一个AI 谈天客户端,里面有两个参数:
[*]ChatClient.Builder 是 Spring AI 提供的 AI 谈天客户端构建器,用于构建 ChatClient 实例,是由 Spring AI自动注入的
[*]另一个是 ToolCallbackProvider,用于从 MCP 服务端发现并获取 AI 工具。
4、接口调用
直接调用ChatClient,将面试问题输入给AI即可,也不需要写过多的 prompt,因为在 MCP 服务端的工具形貌中,已经写的比力具体了 —— 比如用户想要搜索技能面试题,就会自动调用刚刚写的工具。
普通调用:
@PostMapping(value = "/ai/answer")<br>public String generate(@RequestBody AskRequest request) {<br> return chatClient.prompt()<br> .user(request.getContent())<br> .call()<br> .content();<br>}如果需要实时输出返回内容,可以进行 SSE 流式调用:
@PostMapping(value = "/ai/answer/sse", produces = MediaType.TEXT_EVENT_STREAM_VALUE)<br>public Flux<String> generateStreamAsString(@RequestBody AskRequest request) {<br> Flux<String> content = chatClient.prompt()<br> .user(request.getContent())<br> .stream()<br> .content();<br> return content<br> .concatWith(Flux.just(""));<br><br>}最后测试一下,输入面试标题 “HashMap的原理是啥”,就会返回 面试鸭 的标题以及链接。
https://pic.yupi.icu/1/1742995382158-d78ef20c-6212-4a57-869f-4db3d8b4dd1b.png
MCP 服务端(基于 SSE)
除了基于 stdio 的实现外,Spring AI 还提供了基于 Server-Sent Events (SSE) 的 MCP 客户端方案。相较于 stdio 方式,SSE 更适用于长途部署的 MCP 服务器,客户端可以通过标准 HTTP 协议与服务器建立连接,实现单向的实时数据推送。基于 SSE 的 MCP 服务器支持被多个客户端长途调用。
1、引入依赖
<dependency><br> <groupId>org.springframework.ai</groupId><br> <artifactId>spring-ai-mcp-server-webflux-spring-boot-starter</artifactId><br> <version>1.0.0-M6</version><br></dependency>2、配置 MCP 服务端
server:<br>port: 8090<br>spring:<br>application:<br> name: mcp-server<br>ai:<br> mcp:<br> server:<br> name: mcp-server # MCP服务器名称<br> version: 0.0.1 # 服务器版本号除了引入的依赖包不一样,以及配置文件不同,其他的不需要修改。
3、运行服务端
MCP 服务端写完之后,直接打包运行:
mvn clean package -DskipTests直接用 jar 选项运行 MCP 服务端:
java -jar target/mcp-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=prodMCP 客户端(基于 SSE)
1、引入依赖
<dependency><br> <groupId>org.springframework.ai</groupId><br> <artifactId>spring-ai-mcp-client-webflux-spring-boot-starter</artifactId><br> <version>1.0.0-M6</version><br></dependency>2、配置 MCP 服务器
因为刚刚服务端是通过 SSE 实现的,需要在application.yml中配置 MCP 服务器的 URL 端口:
spring:<br>ai:<br> mcp:<br> client:<br> enabled: true<br> name: mcp-client<br> version: 1.0.0<br> request-timeout: 30s<br> type: ASYNC # 类型同步或者异步<br> sse:<br> connections:<br> server1:<br> url: http://localhost:8090和 MCP 服务端的修改一样, 除了依赖和配置的修改,其他的也不需要调整。
最后测试一下,输入面试标题 “MySQL的事务是怎么实现的?”,就会返回 面试鸭 的标题以及链接等。
https://pic.yupi.icu/1/1743057898494-b41f995d-7eb9-4a5b-b6c9-fd569bc323a4.png
软件使用 MCP
除了利用程序去调用 MCP 服务外,MCP 服务端还恣意支持 MCP 协议的智能体助手,比如 Claude、Cursor 以及 Cherry Studio 等,都可以快速接入。(条件需要 Java 运行时环境)
首先下载我们 开源的面试鸭 MCP 服务 代码到本地:
git clone https://github.com/yuyuanweb/mcp-mianshiya-server 然后使用 Maven 打包构建项目:
cd mcp-mianshiya-server<br>mvn clean package下面我们以 Cherry Studio 这样一个 AI 客户端软件为例,演示怎样使用 MCP 服务。
1、打开 Cherry Studio 的 “设置”,点击 “MCP 服务器”:
https://pic.yupi.icu/1/1743063238632-2156707f-cfa4-4493-bf3e-68279f3972b9.png
2、点击 “编辑 JSON”,将以下 MCP 配置添加到配置文件中:
{<br> "mcpServers": {<br> "mianshiyaServer": {<br> "command": "java",<br> "args": [<br> "-Dspring.ai.mcp.server.stdio=true",<br> "-Dspring.main.web-application-type=none",<br> "-Dlogging.pattern.console=",<br> "-jar",<br> "/yourPath/mcp-server-0.0.1-SNAPSHOT.jar"<br> ],<br> "env": {}<br> }<br>}<br>}3、在 “设置 => 模子服务” 里选择一个模子,输入 API 密钥,选择模子设置,勾选下工具函数调用功能:
https://pic.yupi.icu/1/1743063246205-718e7d0b-5992-4b85-bbff-bc676adbab7b.png
4、进入谈天页面,在输入框下面勾选开启 MCP 服务:
https://pic.yupi.icu/1/1743063248363-b3a09c97-1bb9-4f97-ab0a-2cee5a641c83.png
配置完成,尝试搜索下面试标题,结果不戳!
https://pic.yupi.icu/1/1743063251268-145a5d00-4495-49e8-91db-f5536efca436.png
甚至还进行面经剖析,返回多个面试标题与答案的链接!
https://pic.yupi.icu/1/1743143537320-1fca3955-3128-42a6-bd32-0cace3bab2ab.png
当然这个功能我们面试鸭官方也实现了,帮助各人面试复盘:
https://pic.yupi.icu/1/1744008304237-fdfb2b99-9038-43de-94ed-ca0760afdf40.png
上传 MCP 服务
和开辟一个 APP 一样,我们也可以把做好的 MCP 服务分享到第三方 MCP 服务平台。比如 MCP.so,可以理解为 MCP 服务的应用市场。
https://pic.yupi.icu/1/1744008425870-c5b7958e-98cc-4a14-a4af-cba3af01fcde.png
直接点击头像左侧的提交按钮,然后填写 MCP 服务的项目地址、以及服务器配置实例,点击提交即可。
https://pic.yupi.icu/1/1744008547763-70effe90-c0aa-4683-bbc8-060639266529.png
提交完成后就可以在平台搜索到了:
https://pic.yupi.icu/1/1744008638998-003207ee-8394-4ded-9ea6-83dbf189477c.png
OK 就分享到这里,学会的话记得点赞收藏哦。也欢迎各人在批评区交流你对 MCP 的看法和理解~
更多编程学习资源
[*]Java前端程序员必做项目实战教程+毕设网站
[*]程序员免费编程学习交流社区(自学必备)
[*]程序员保姆级求职写简历指南(找工作必备)
[*]程序员免费面试刷题网站工具(找工作必备)
[*]最新Java零基础入门学习路线 + Java教程
[*]最新Python零基础入门学习路线 + Python教程
[*]最新前端零基础入门学习路线 + 前端教程
[*]最新数据结构和算法零基础入门学习路线 + 算法教程
[*]最新C++零基础入门学习路线、C++教程
[*]最新数据库零基础入门学习路线 + 数据库教程
[*]最新Redis零基础入门学习路线 + Redis教程
[*]最新盘算机基础入门学习路线 + 盘算机基础教程
[*]最新小程序入门学习路线 + 小程序开辟教程
[*]最新SQL零基础入门学习路线 + SQL教程
[*]最新Linux零基础入门学习路线 + Linux教程
[*]最新Git/GitHub零基础入门学习路线 + Git教程
[*]最新操纵体系零基础入门学习路线 + 操纵体系教程
[*]最新盘算机网络零基础入门学习路线 + 盘算机网络教程
[*]最新计划模式零基础入门学习路线 + 计划模式教程
[*]最新软件工程零基础入门学习路线 + 软件工程教程
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]