☰
ai-guide 实战:用 Spring AI 从零开发 MCP 服务,打造 AI 面试搜题工具
2026/10/4 4:16:20 网站建设 项目流程
  • 文档
  • 教程
  • 知识库
  • 人工智能

【免费下载链接】ai-guide

程序员鱼皮的 AI 资源大全 + Vibe Coding 零基础教程,分享 OpenClaw 保姆级教程、大模型玩法(DeepSeek / GPT / Gemini / Claude / GLM)、最新 AI 资讯、Prompt 提示词大全、AI 知识百科(Agent Skills / RAG / MCP / A2A)、AI 编程教程(Harness Engineering)、AI 工具用法(Cursor / Claude Code / TRAE / Codex / Copilot)、AI 开发框架教程(Spring AI / LangChain)、AI 产品变现指南,帮你快速掌握 AI 技术,走在时代前沿。本项目为开源文档 aiguide,已升级为鱼皮 AI 导航网站

项目地址:https://gitcode.com/GitHub_Trending/aig/ai-guide
点击查看免费下载

从零开始开发 MCP 服务:理解模型上下文协议的核心价值与总体架构,以 Spring AI 为技术栈,分别实现基于 stdio 与 SSE 的 MCP 服务端和客户端,并完成 Cherry Studio 接入与 MCP.so 平台发布。

MCP(Model Context Protocol,模型上下文协议)是近年来 AI 领域最火的概念之一,它由 Anthropic 推出,是一套开放标准,目标是给大语言模型与 AI 助手提供统一、标准化的接口,让 AI 能够轻松操作外部工具、访问外部数据。本指南将以程序员鱼皮给自家产品"面试鸭"开发的面试搜题 MCP 服务为完整案例,带你从架构原理出发,走完 MCP 服务端、客户端的开发全流程,并演示如何让 Claude、Cherry Studio 等智能体接入你的 MCP 服务、如何将服务发布到 MCP 应用市场。读完本文,你将具备独立开发一个"可被任意 MCP 客户端调用"的 AI 工具服务的能力。


一、MCP 为什么如此重要

在 MCP 出现之前,想让 AI 处理我们的数据,基本只能依赖两条路:一是模型的预训练数据,二是手动上传数据。这两种方式既麻烦又低效——再强大的 AI 模型也存在数据隔离问题,无法直接访问新数据,也就无法完成"查询实时题库""读取本地文件""调用在线 API"这类动态任务。

MCP 恰恰解决了这个问题。它突破了模型对静态知识库的依赖,让 AI 具备更强的动态交互能力:能够像人类一样调用搜索引擎、访问本地文件、连接 API 服务,甚至直接操作第三方库。更进一步,只要大家都遵循 MCP 这一套协议,AI 就能无缝连接本地数据、互联网资源、开发工具、生产力软件乃至整个社区生态,实现真正的"万物互联",极大提升 AI 的协作和工作能力。

从开发模式演进的角度看,这一变化也符合 AI 应用开发的整体趋势。仓库中的 主流 AI 应用开发模式 一文指出,AI 应用开发已从"只调 API"演进到 SDK 封装、开发框架、低代码平台等多种模式,而 MCP 正是连接"应用"与"外部工具/数据"这一环节的标准化桥梁。

二、MCP 总体架构

MCP 的核心是"客户端-服务器"架构,其中 MCP 客户端主机可以同时连接到多个服务器。三个关键角色各司其职:

  • Host(客户端主机):希望通过 MCP 访问数据的程序,比如 Claude Desktop、IDE 或各类 AI 工具。它是用户交互的入口。
  • Client(MCP 客户端):内嵌于 Host 中,负责与对应的 MCP Server 建立连接、发起调用请求。
  • Server(MCP 服务器):暴露数据资源、工具函数(Tools)和提示模板(Prompts)的服务端,真正执行具体操作并返回结果。

仓库中的行业科普文章 Model Context Protocol,看这一篇就够了 用一个日常场景把这条调用链讲得很清楚:假设你正在使用 Claude Desktop(Host)询问"我桌面上有哪些文档?"——Claude 模型决定需要访问文件系统时,Host 内置的 MCP Client 被激活,连接文件系统 MCP Server,Server 执行扫描并返回文档列表,模型再结合结果生成最终回答。整条链路即:用户问题 → Host → 模型 → 需要外部信息 → MCP Client 连接 → MCP Server → 执行操作 → 返回结果 → 模型生成回答 → 展示给用户。

这种架构设计带来一个关键收益:模型通过工具的结构化描述(prompt)来选择调用哪个工具,而非依赖特定平台的专有函数调用格式。从该文对官方 Python SDK 客户端示例的源码分析可以推断,客户端会将所有工具的 name、description、参数 schema 格式化为文本注入 system prompt,模型据此决定"是否调用、调用哪个、传什么参数";工具执行结果会被重新发回给模型,用于生成最终回复。这也意味着:精心编写工具的名称、docstring 和参数说明,直接影响模型选工具的正确率——这一点在后文@Tool注解的编写中会再次体现。

三、MCP 服务端开发(基于 stdio 标准流)

MCP 的使用分为两种模式:STDIO 模式(本地运行)和SSE 模式(远程服务)。基于 stdio 的实现是最常见的 MCP 客户端方案,它通过标准输入输出流与 MCP 服务器通信,特别适用于本地部署的 MCP 服务器。本节以 Java + Spring AI 为例,逐步搭建一个"根据搜索词查询面试题目"的 MCP 服务端。

3.1 引入依赖

在 Maven 的pom.xml中引入 Spring AI 提供的 MCP 服务端 Starter:

<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-mcp-server-spring-boot-starter</artifactId> <version>1.0.0-M6</version> </dependency>

3.2 配置 MCP 服务端

在application.yml中完成服务端配置。注意三个关键点:必须禁用 Web 应用类型(stdio 模式下服务以进程方式运行,不对外提供 HTTP 端口)、关闭 Banner、开启 stdio 模式:

spring: application: name: mcp-server main: web-application-type: none # 必须禁用web应用类型 banner-mode: off # 禁用banner ai: mcp: server: stdio: true # 启用stdio模式 name: mcp-server # 服务器名称 version: 0.0.1 # 服务器版本

其中spring.ai.mcp.server.name和spring.ai.mcp.server.version会被 MCP 协议用于握手阶段的服务标识,客户端(如 Claude、Cherry Studio)在工具列表中展示的名称即来源于此。

3.3 实现 MCP 工具

@Tool是 Spring AI MCP 框架中用于快速暴露业务能力为 AI 工具的核心注解。被注解的方法会由框架自动扫描,并将其方法名、注解描述与参数 schema 注册为该 MCP Server 提供的一个工具。下面是一段示例代码:

/** * 根据搜索词搜索面试鸭面试题目 */ @Tool(description = "根据搜索词搜索面试鸭面试题目") public String callMianshiya(String searchText) { // 执行从面试鸭数据库中搜索题目的逻辑 System.out.println("用户要搜索:" + searchText); }

结合前面提到的工具选择原理可以推断,这里的description就是模型决策时看到的核心文本,建议写成"做什么 + 适用场景"的自然语言描述;方法参数searchText会作为工具的输入参数 schema 暴露给模型,因此参数命名要语义清晰,必要时可通过注解补充参数说明,帮助模型正确传参。

3.4 注册 MCP 工具

定义好工具方法后,需要通过ToolCallbackProvider将业务对象中的@Tool方法批量注册给 MCP 框架:

@Bean public ToolCallbackProvider serverTools(MianshiyaService mianshiyaService) { return MethodToolCallbackProvider.builder() .toolObjects(mianshiyaService) .build(); }

MethodToolCallbackProvider.builder().toolObjects(...)会扫描传入对象中的所有@Tool注解方法并转换为可被 MCP 协议调用的 Tool Callback。业务服务(如MianshiyaService)通过 Spring 依赖注入进入 Bean 方法,保证了工具实现与业务逻辑解耦。

3.5 运行服务端

使用 Maven 打包即可得到可直接通过 stdio 启动的 jar 包:

mvn clean package -DskipTests

打包后生成target/mcp-server-0.0.1-SNAPSHOT.jar,后续无论是自研客户端还是第三方智能体,都以"命令行启动该 jar 并通过标准输入输出流通信"的方式接入。

四、MCP 客户端开发(基于 stdio 标准流)

服务端就绪后,再开发一个 MCP 客户端应用,把"搜题能力"接入到自己产品的 AI 对话接口中。

4.1 引入依赖

<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-mcp-client-spring-boot-starter</artifactId> <version>1.0.0-M6</version> </dependency>

4.2 配置 MCP 服务器

客户端通过 JSON 配置文件声明要连接的 MCP Server 及其启动命令:

spring: ai: mcp: client: stdio: servers-configuration: classpath:/mcp-servers-config.json

其中mcp-servers-config.json的配置如下:

{ "mcpServers": { "mianshiyaServer": { "command": "java", "args": [ "-Dspring.ai.mcp.server.stdio=true", "-Dspring.main.web-application-type=none", "-Dlogging.pattern.console=", "-jar", "/yourPath/mcp-server-0.0.1-SNAPSHOT.jar" ] } } }

这份配置是客户端接入的关键:command+args组合指定了如何以子进程方式拉起服务端。这里通过命令行参数覆盖了服务端的三个启动项:开启 stdio 模式、禁用 Web 应用类型、清空控制台日志格式(避免日志污染标准输出流,防止破坏 MCP 协议通信)。/yourPath/mcp-server-0.0.1-SNAPSHOT.jar需替换为第 3.5 步打包产物的实际路径。

4.3 初始化聊天客户端

声明一个ChatClientBean,并把 MCP 工具注入为它的默认工具集:

@Bean public ChatClient initChatClient(ChatClient.Builder chatClientBuilder, ToolCallbackProvider mcpTools) { return chatClientBuilder.defaultTools(mcpTools).build(); }

defaultTools(mcpTools)将 MCP Server 暴露的所有工具挂载到 ChatClient 上——模型在回答用户问题时,会自动决定是否需要调用这些搜题工具。

4.4 接口调用

客户端应用只需一个 HTTP 接口,即可把用户问题转发给大模型,并在需要时自动触发 MCP 工具调用:

@PostMapping(value = "/ai/answer") public String generate(@RequestBody AskRequest request) { return chatClient.prompt() .user(request.getContent()) .call() .content(); }

chatClient.prompt().user(...).call().content()是 Spring AI 的链式调用 API:提交用户消息 → 模型判断是否调用 MCP 工具 → 拿到工具结果 → 生成最终回答。整个"工具发现、调用、结果回填"的过程被框架封装,业务代码里无需手工拼接任何工具调用逻辑。

五、MCP 服务端开发(基于 SSE,远程部署)

除了 stdio,Spring AI 还提供基于Server-Sent Events(SSE)的 MCP 方案。相较于 stdio 方式,SSE 更适用于远程部署的 MCP 服务器——服务端以 HTTP 服务形式常驻,客户端通过网络访问,无需共享本地文件系统。

5.1 引入依赖

SSE 方案基于 WebFlux,需引入对应的 Starter:

<dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-mcp-server-webflux-spring-boot-starter</artifactId> <version>1.0.0-M6</version> </dependency>

5.2 配置 MCP 服务端

与 stdio 模式不同,SSE 模式需要显式配置 HTTP 端口,且不需要设置spring.main.web-application-type: none(因为此时 Web 容器正是通信载体):

server: port: 8090 spring: ai: mcp: server: name: mcp-server version: 0.0.1

server.port指定对外服务端口,客户端连接远程服务器时即使用该端口访问 MCP 的 SSE 端点。

5.3 运行服务端

打包并以 jar 方式后台常驻运行:

mvn clean package -DskipTests java -jar target/mcp-server-0.0.1-SNAPSHOT.jar

服务启动后监听8090端口,即可被本地或远程的 MCP 客户端通过 HTTP + SSE 接入。从仓库中 Spring AI - AI 超级智能体项目实战 的技术选型(Java 21 + Spring Boot 3 + Spring AI,并明确将 MCP 模型上下文协议列入核心技术栈)可以看出,SSE 服务端正是支撑"AI 智能体调用外部服务"这一能力落地的关键一环。

六、软件直接使用 MCP 服务

除了用程序调用 MCP 服务外,MCP 服务端还支持任意支持 MCP 协议的智能体助手,比如 Claude、Cursor 以及 Cherry Studio 等,都可以快速接入。这意味着:一个 MCP 服务开发完成后,既能被自研产品调用,也能立刻被市面上主流的 AI 客户端复用。

以 Cherry Studio 为例,接入流程如下:

  1. 打开 Cherry Studio 的"设置",点击"MCP 服务器";
  2. 点击"编辑 JSON",将 MCP 配置添加到配置文件中;
  3. 在"设置 => 模型服务"里选择一个模型,勾选工具函数调用功能;
  4. 进入聊天页面,在输入框下面勾选开启 MCP 服务。

配置完成后,直接在对话中尝试搜索面试题目即可生效。该搜题 MCP 服务还能进行面经解析,返回多个面试题目与答案的链接。正如原教程所展示的,面试鸭官方产品也已实现同类功能,用于帮助用户面试复盘——这正体现了"MCP 服务一次开发、多端复用"的工程价值。

七、上传发布 MCP 服务

和开发一个 APP 一样,我们也可以把做好的 MCP 服务分享到第三方 MCP 服务平台。比如MCP.so,可以把它理解为 MCP 服务的"应用市场"。

发布流程非常简单:

  1. 点击平台头像左侧的提交按钮;
  2. 填写 MCP 服务的项目地址(如 GitHub 仓库地址);
  3. 填写服务器配置实例(即类似 4.2 节mcpServers中的command与args配置);
  4. 点击提交。

提交完成后,服务即可在 MCP.so 平台被搜索到,其他开发者可以直接复制配置接入使用,实现 MCP 服务的社区化传播。

八、在 ai-guide 中继续深入 MCP

本文是 ai-guide 仓库 Vibe Coding 零基础教程 中编程学习板块的核心实战内容,MCP 的学习路径可以进一步延伸:

  • 想补充 MCP 的行业背景、工具选择底层原理与 Python FastMCP 实现,可阅读 Model Context Protocol,看这一篇就够了,其中还给出了用mcp dev启动 Inspector 调试服务端、通过claude_desktop_config.json接入 Claude Desktop 的完整流程;
  • 想把 MCP 服务开发能力放到真实企业级应用中落地,可参考 Spring AI - AI 超级智能体项目实战,该项目以 Spring AI 为核心,覆盖 Tool Calling 工具调用、MCP 模型上下文协议、ReAct Agent 智能体构建等完整链路;
  • 想搞清楚 MCP 在 AI 应用开发全貌中的位置,可阅读 主流 AI 应用开发模式,理解 HTTP API、SDK、开发框架、低代码平台与智能体模式各自的适用场景。

九、小结

回顾整个 MCP 服务开发流程:stdio 服务端负责把业务能力通过@Tool注解暴露为标准工具并以进程方式运行;stdio 客户端通过 JSON 配置拉起服务端子进程,把工具挂载进ChatClient,让模型在对话中自动决策调用;SSE 服务端则将同样的能力以 HTTP 服务形态远程开放;最后,通过 Cherry Studio 等智能体直接接入、通过 MCP.so 发布共享,一个 MCP 服务的完整生命周期就此闭环。

开发 MCP 服务的三个关键心法值得牢记:

  • 描述决定效果:工具的名称、description与参数 schema 就是模型的"使用说明书",写得越清晰,模型选对工具、传对参数的概率越高;
  • 模式决定部署:本地工具用 stdio,远程服务用 SSE,选择传输模式前先想清楚服务的部署形态;
  • 协议决定生态:只要遵循 MCP 标准,同一份服务即可被任意支持 MCP 的客户端复用,这正是 MCP 生态价值的来源。
  • 文档
  • 教程
  • 知识库
  • 人工智能

【免费下载链接】ai-guide

程序员鱼皮的 AI 资源大全 + Vibe Coding 零基础教程,分享 OpenClaw 保姆级教程、大模型玩法(DeepSeek / GPT / Gemini / Claude / GLM)、最新 AI 资讯、Prompt 提示词大全、AI 知识百科(Agent Skills / RAG / MCP / A2A)、AI 编程教程(Harness Engineering)、AI 工具用法(Cursor / Claude Code / TRAE / Codex / Copilot)、AI 开发框架教程(Spring AI / LangChain)、AI 产品变现指南,帮你快速掌握 AI 技术,走在时代前沿。本项目为开源文档 aiguide,已升级为鱼皮 AI 导航网站

项目地址:https://gitcode.com/GitHub_Trending/aig/ai-guide
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询