从前年开始折腾大模型应用,我最大的感受就是:模型本身越来越强,但接入外部系统的过程越来越碎。每家都要自己做工具调用、自己做认证、自己定义函数接口,换一个客户端就得重写一遍。后来社区开始推MCP,我陆陆续续把十几个服务封装成了MCP Server,从最基础的时钟工具到把内部REST接口批量包成MCP Tool,踩了不少坑,也把整套套路摸清楚了。这篇博文就围绕“MCP Server/Tool开发”这条主线,把协议原理、开发流程、调试方法和避坑经验一次性讲透,适合准备做智能体集成的后端、AI应用工程师,也适合想自己接一个MCP客户端玩玩的前端同学。
1. MCP协议核心概念与设计思路——动手之前先搞懂这套架构
1.1 MCP是什么,它到底解决什么问题
MCP的全称是Model Context Protocol,模型上下文协议,Anthropic在2024年底把它开源之后,很快就成了AI应用接入外部数据和工具的事实标准。你完全可以把它理解成“AI世界的USB-C接口”:以前每个AI应用都要给打印机、显示器、硬盘分别配线,MCP就是那个统一接口,只要设备端和主控端都遵守协议,插上就能用。
放在实际场景里,你会发现MCP解决的痛点非常具体。假设你的应用需要让模型查询订单、查天气、操作内部系统,传统做法是在代码里写死一大堆工具调用函数,每个函数都要自己定义输入输出,还要处理模型什么时候调用哪个函数的问题。客户端换一个,这套逻辑全部重写。而MCP把“能力暴露”和“能力使用”彻底解耦:服务端只需要提供标准化的MCP Server,客户端不管是Claude Desktop、Codex还是自己写的智能体,都可以通过同一套协议发现和调用这些能力。
我在很多分享里都见过一个类比,说大模型是大脑,MCP Server就是给大脑接上的手和眼睛。这话很形象,但我更喜欢把它说成“中间层”:MCP不是模型,不是应用,也不是普通的API网关,它是模型与应用能力之间的标准传输协议。协议层做对了,后续加工具、换模型、迁移服务都会轻松很多。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
1.2 客户端、服务器、工具,三条角色怎么分工
MCP架构里的角色其实特别简单,就三样东西。
- MCP Client(客户端):运行在AI应用侧,负责发现服务器、发起调用、把结果回传给模型。它通常会被集成在智能体框架、IDE插件或者聊天应用里。
- MCP Server(服务器):一个独立进程或者服务,向客户端暴露能力。它不关心你是谁,只关心你有没有按协议来调用。
- Tool / Resource / Prompt(能力载体):服务器暴露出的具体能力类型,其中Tool是最常用的一种,对应模型可以调用的“函数”。
很多新手一上来就纠结客户端和服务器的关系,其实你只需要记住一句话:MCP Server不是给浏览器访问的网页服务器,它是给AI模型“摸”的能力接口。普通的HTTP API是为人类或程序员设计的,而MCP Tool是为模型调用设计的,这就要求接口描述里包含足够详细的说明,让模型知道“这个工具是干什么的、什么时候该用”。
为了更清楚,我把服务器暴露的三种能力类型放在一起对比一下。
| 能力类型 | 作用 | 典型场景 | 调用方 |
|---|---|---|---|
| Tool | 可执行的操作,有输入输出 | 查天气、查数据库、发请求 | 模型自主决定调用 |
| Resource | 只读的数据资源,按URI加载 | 读取配置文件、加载文档模板 | 客户端主动获取 |
| Prompt | 预定义的提示词模板 | 生成报告、格式化输出 | 用户或模型按模板触发 |
Tool是最核心的,也是这篇指南的重点。资源和Prompt本质上只是数据或模板,而Tool背后是真实的函数逻辑,它的参数要能被模型正确理解,返回值要能被模型正确解析,任何一个环节出问题,都会直接导致调用失败或者结果乱套。
1.3 为什么不直接封装API,搞个MCP Server多一层
这是我在技术评审会上被问得最多的问题。很多人觉得,我直接给模型一个HTTP接口不就行了,为什么非得多包一层MCP?我的回答一般是三个理由。
第一,运行时的工具发现能力不一样。普通API接口是静态的,模型只能调用你提前写进prompt里的那些函数;而MCP Server支持动态发现,客户端随时可以问服务器“你有哪些工具”,这对于工具数量多的场景特别重要。
第二,统一的传输和认证方式。MCP规范定义了stdio和HTTP两种传输方式,还给出了标准的认证模型,这意味着你写的Server可以被任何支持MCP的客户端使用,不用每个项目单独做一套接入方案。这是“标准”带来的最大价值。
第三,生态红利。现在主流的智能体、IDE、代码编辑器基本都支持MCP,你封装好一个Server,就能立刻接入几百种客户端,省去了大量集成工作。这一点等你真正做完整套流程会体会更深。
当然,不是所有接口都适合用MCP。如果一个接口只是内部两个服务之间的私有调用,没人需要去发现它,那直接走RPC或HTTP反而更简单。MCP的价值在于“能力要被智能体发现和使用”,这里必须做取舍。
2. 开发前的准备与方案选型——从零搭一个最小MCP Server
2.1 选SDK还是自己实现协议,语言怎么选
MCP协议本身是JSON-RPC 2.0的封装,理论上你可以用任何语言实现。但我还是建议优先使用官方SDK,除非你有特别高的性能需求,或者想在协议层做深度定制。
官方已经提供了多种SDK,我列一下我自己的选型参考。
| 语言 | 官方SDK | 适合场景 | 上手难度 |
|---|---|---|---|
| Python | mcp |
快速原型、AI类服务、数据分析工具 | 低 |
| TypeScript | @modelcontextprotocol/sdk |
Web前端团队、Node服务 | 低 |
| Java | mcp-java-sdk(含Spring Boot起步依赖) |
企业后端、Spr |
