
最近有个朋友问我现在 AI 已经这么强了为什么每次要给它接一个内部系统还得单独写一遍适配器这个问题问到点子上了。他所在的团队已经有了一堆 AI 场景想聊天式查数据库、画图、跑测试、改配置但每个系统都需要单独对接不同 AI 工具的对接方式还不一样。模型本身越来越聪明工具之间的“接口方言”却越堆越多。这正是 MCPModel Context Protocol模型上下文协议要解决的问题。MCP 等于给 AI 工具之间定了一门“普通话”让模型不用学每个工具各自的方言只要说普通话就能调用任何一个接进来的工具、数据源或工作流。这篇文章我会把 MCP 是什么、它怎么工作、哪些场景已经有人把它用起来了以及如果你也想把手里的 REST 服务变成 MCP Server应该怎么动手都讲清楚。不管你之前有没有写过协议层代码读完应该都能理解 MCP 到底帮我们省了什么。1. MCP 为何出现AI 多了接口方言也跟着多了1.1 最初的痛点每接一个系统就要写一个适配器先还原一个很典型的开发场景。假设你所在的团队想给公司内部的 AI 助手增加新能力用自然语言查业务数据库、读取某个项目的工单、在代码仓库里自动建合并请求再把设计稿里的组件信息拉出来给 AI 分析。如果没有 MCP这件事通常怎么做你需要在 AI 与每个系统之间写一层“适配器”。小一点的团队会用 HTTP 回调把某个查询封装成接口大一点的团队可能会把各种 API 统一包装成 OpenAI Function Calling 的格式。但这个做法有两个绕不开的问题。第一个问题是重复造轮子。数据库能查了换个用户要查权限逻辑得重来工单系统回传的字段格式和设计软件完全不同你写了一版对接闭源模型客户端的格式换成本地部署的开源模型又要重写一遍。第二个问题更头疼维护成本随着系统数量线性膨胀。适配器的数量越多改动越频繁。任何一个系统升级接口、任何一个 AI 产品调整调用约束牵一发动全身。你维护的其实是“每个 AI 与每个系统之间的一对一名词表”而不是一套稳定通用的通信机制。我在早几年做机器人流程自动化的时候几乎天天面对这种事。系统越多越能体会到什么叫“每个工具都在讲方言”这台机器只认这种方式那个订单一套专属接口换个客户又要重新接。这个状态其实软件行业早就遇到过比如数据库访问领域出现过 ODBC/JDBC为了屏蔽不同数据库的差异让应用层用统一接口访问消息中间件也走向了统一消息协议;前端组件则通过统一接口约束来降低复用成本。只要出现“两端都要对接、组合太多”的局面行业的自然解法就是抽一层通用协议出来。MCP 就是 AI 工具生态走到这一步之后的必然产物。1.2 MCP 的核心思路让工具自己说话AI 只学一门通用语言MCP 由 Anthropic 在 2024 年底推出目标很明确让 AI 应用比如聊天助手、Cursor、自研的 Agent以统一方式调用外部工具也让外部工具以统一方式暴露能力。用一句话概括模型不需要懂一千种 API只需要懂一种 MCP。这里要特别强调一点MCP 并没有规定业务逻辑。它不关心你怎么查数据库、怎么做渲染、怎么生成图片。它只规定双方怎么自我介绍、怎么描述自身能力、怎么发起一次调用、怎么返回结果。一旦双方都遵守这套规则任何支持 MCP 的 AI 客户端就能对接任何 MCP Server反过来任何实现了 MCP Server 的工具也能服务所有支持 MCP 的客户端。这种“一端接入处处可用”的效应很像 USB 接口刚普及时的情况。当年你不需要知道打印机内部的命令格式只要设备有 USB 口电脑插上就能用。MCP 把“AI 要用的能力”做成了类似 USB 口的统一接口标准生态里每个参与者只需要关心自己这边怎么实现不用管对面是什么牌子、什么系统。这个思路带来的转变非常关键原来我们考虑的是“AI 能对接什么”现在考虑的是“工具主动宣布自己有什么能力AI 按声明来使用”。能力的发现、描述、调用、返回全都标准化这正是 MCP 最值钱的地方。2. MCP 的核心技术设计Server、Client、Host 怎么分工2.1 三个角色先理清Host、Client、ServerMCP 的架构里通常有三个角色名称看着眼熟但含义值得仔细理解。首先是 Host宿主机。它是用户直接面对的 AI 应用程序比如 Claude Desktop、Cursor、自研的 Agent 聊天界面。Host 负责接收用户输入、调度模型推理同时把模型需要使用外部能力时的请求转发给 MCP Client。其次是 Client客户端。 Client 在这里不是用户电脑上那个 App而是宿主程序内部的一个连接器。它按照 MCP 协议与对应的远端 Server 通信完成握手、发现工具、发起调用等操作。一个 Host 里通常会包含多个 MCP Client每个 Client 连接一个 Server。最后是 Server服务端。它是实际干活的一方真正知道某个工具怎么执行。Server 可以跑在本地进程里也可以是一台远程服务甚至可以直接包装一个 SDK、数据库驱动或命令行工具。打个比喻Host 像前台用户需求先找它Client 像翻译把需求转成标准协议再往外传Server 像业务部门真正干活。翻译不需要懂每个部门内部的黑话只按照统一的话术沟通各部门也不用学会每个客户的语言只要告诉翻译自己能干什么就行。这种分层带来的最大好处是一个 Host 支持 MCP 之后它想增加更多工具不需要改 Host 本体只需要加对应的 Client 连接一个 Server 想被更多 AI 使用也不需要针对每个 AI 单独适配因为对所有连接者说的都是同一套协议。两端的解耦才是 MCP 价值能成立的根本原因。2.2 三种核心对象Tools、Resources、PromptsMCP 协议定义了三类能力对象。我用最直白的说法解释。第一类是 Tools工具。它代表一个可以被 AI 主动调用的函数比如“查询用户订单”“创建绘图”“把 Blender 里选中的物体改名”。工具必须能被模型识别它叫什么名字、参数长什么样、干什么用、返回什么格式。调用权在模型手里模型判断任务需要时会决定是否调用。第二类是 Resources资源。它代表可被 AI 读取的数据资源相当于把文件、数据库记录、API 返回内容暴露给 AI 阅读和检索。Resource 和 Tool 的区别简单说就是Resource 是“给数据”Tool 是“给动作”。比如把项目文档作为 Resource 提供模型可以直接读把“生成周报”作为一个 Tool模型可以通过调用来触发动作。第三类是 Prompts提示词模板。它代表一组组织好的、可复用的交互模板比如“从失败日志中生成复盘报告”“按团队规范撰写代码审查意见”。Prompt 的目标是帮用户在客户端中快速唤起一个标准流程省去反复描述需求的力气。这三类对象把 AI 与外部世界的交互拆成了三种基本姿势读数据、用工具、按模板跑标准事。实际开发中Tools 用得最多Resources 其次Prompts 相对少一些但对某些固定业务流程非常实用。一个 MCP Server 可以只暴露 Tools也可以把三类对象全部暴露出来取决于业务需要。2.3 为什么叫“普通话”而不是简单的“统一语言”“普通话”这个说法背后有双重含义一是标准统一二是彼此听得懂。放在 MCP 场景里它还有更深的一层意思——人不需要再为每个 AI 工具单独定制一套接口规范了。以前对接大模型厂商的接口时要适配它那套函数规格格式对接本地模型时又是另一套提示词与函数描述方式。这些工作虽然都叫“写接口”但大量时间花在翻译不同厂商的“方言”上。MCP 出现后Server 只需要实现一次标准的列表描述和调用协议所有支持 MCP 的模型与客户端都能直接用。它把“词法差异”都收敛到一个协议层里。你可能会问每个模型厂商都会支持 MCP 吗从目前趋势看支持度扩散很快。Claude 家族原生支持很多基于大模型的应用已经把 MCP Client 内置进去连不少开发工具、浏览器插件和云端 IDE 都开始内置 MCP 的接入层。原因也不难理解对模型厂商来说接入 MCP 等于立刻拥有了整个工具生态而不是自己一家家去谈适配这笔账怎么算都划算所以大家自然愿意跟进。3. 一次 MCP 会话是怎么跑起来的从初始化到调用3.1 第一次见面Initialize 与能力协商当 Host 启动并加载一个 MCP Server 时Client 要做的第一件事不是急着调工具而是先发一条 Initialize 请求。Initialize 请求里带着客户端支持的协议版本、客户端名称和标识。Server 收到后会返回它支持的协议版本、Server 名称和版本以及它声明的能力范围。这很像两个国家建交先交换国书和外交官名单然后再谈具体合作。这里有一步很容易被忽视版本协商。如果客户端只支持 MCP 1.0而 Server 只实现了 0.9双方就要商量按哪个版本继续。客户端如果在 Initialize 的响应里发现 Server 版本与自己的差异太大可以选择降级也可以直接放弃这个 Server。实际开发里很多“连不上”“看不到工具”的问题根因就是版本不匹配。初始化完成后Client 还要给 Server 发一个 Initialized 通知告诉它“我已经知道你的能力了我们可以开始正式干活了”。到这一步会话层才算真正建立。3.2 第二步列能力清单模型看到的是“说明书”初始化之后Host 里的模型需要知道 Server 能提供什么。Client 会向 Server 发出工具列表请求对应协议里就是 Tools/List类似地还有资源列表、提示模板列表的请求。Server 收到请求后会返回一个工具数组。每个工具的信息至少包含三块name工具名必须唯一description功能描述这段描述会进入模型上下文成为模型决策的依据inputSchema入参的 JSON Schema描述参数有哪些字段、各自的类型、是否必填这一段对模型来说基本就是“说明书”。但说明书写得好不好直接影响模型能否正确选工具、正确组装参数。我见过不少团队把工具描述写成“查询接口”这种级别结果模型根本分不清这个接口是查订单还是查商品要么选错要么反复尝试。规范一点的团队会在描述里补上输入示例、边界条件、典型错误码的含义这样模型的判断准确率会高出很多。这套机制的好处在于模型不需要在训练时见过这些工具运行阶段拿到描述和 Schema 就能现场理解用法。所以 MCP 才能支持“任意新工具”而不是只支持训练数据里出现过的那几个。3.3 第三步调用工具把“动词”变成真实动作当模型推理时判断“我需要查一下订单状态”它不会直接访问数据库而是走 MCP Client 发出一个 Tools/Call 请求。参数就是模型根据 Schema 生成的那个 JSON 结果。Server 收到请求后执行真实的业务逻辑比如查库、渲染、发请求然后把结构化结果返回给模型。返回结果大致分两类正常返回与错误返回。正常返回可以包含文本、结构化数据、图片资源链接错误返回里则包含 error 信息和可选的回退内容。模型拿到返回结果后会把结果当作上下文的一部分继续推理输出最终回答或者执行下一步动作。这也是 Agent 类应用能连续干活的关键模型可以在同一轮对话里多次调用不同工具反复观察结果、修正计划直到目标达成。MCP 不限制调用次数真正限制的是模型的上下文长度和自身的任务编排能力。4. 动手做一个 MCP Server把 Java REST 服务接入 MCP4.1 先想清楚是独立写一个 Server还是改造现有服务假设你手头有一个 Spring Boot 服务已经暴露了一些 HTTP 接口比如 GET /api/order/{id}。你想让 AI 能通过 MCP 直接查询订单信息该怎么做有两条路线。第一种写一个独立的 MCP Server 进程在它的 Tool 实现里用 HTTP Client 去调用老服务接口。这种做法的好处是不侵入老系统独立部署、独立扩容还能用别的语言写缺点是网络多绕一跳还会多一个部署组件。第二种在现有 Spring Boot 服务里直接集成 MCP Server 能力。比如用官方 Java SDK 的 Spring Boot Starter把服务层的普通方法直接暴露成 MCP Tool。好处是开发成本低工具实现直接调用原有业务逻辑还能复用现有的认证、监控、日志链路。如果项目从零起步我个人更推荐第二种如果是改造一个常年没人敢动、升级成本很高的老系统就选择第一种在外面套一层壳。核心原则是别为了集成 MCP 而给老项目埋下大坑引入了新 SDK 却升级不上后续维护很难受。4.2 用 Spring Boot Starter 把一个 Service 方法变成 Tool用 Java 官方 SDK 来做这件事实现起来比想象中简单。MCP 官方提供了 Spring Boot Starter你只需要引入依赖再给普通方法打上注解。dependency groupIdio.modelcontextprotocol.sdk/groupId artifactIdmcpserver-spring-boot-starter/artifactId version0.11.0/version /dependency之后在任意 Bean 上加注解即可Service public class OrderService { Tool(description 根据订单号查询订单的状态和基本信息订单号以OD开头例如OD20240001) public OrderDTO getOrder( ToolParam(description 订单号格式为OD加8位数字如OD20240001) String orderId ) { // 这里走原有查询逻辑比如调用 OrderRepository return orderRepository.findByOrderId(orderId); } }应用启动后MCP Server 会自动把带 Tool 注解的方法注册为可调用工具。MCP 客户端连接服务的默认 /mcp 路径具体按 Starter 的默认配置就能发现 getOrder 这个工具。这里有几个我踩过的细节值得留意Tool 上的 description 一定要写清楚业务语义。模型靠描述选工具不靠方法名描述写得太泛模型就会“乱点鸳鸯谱”。ToolParam 上的 description 也别省。尤其参数格式有强约束时比如“OD加8位数字”一定要写出来否则模型可能生成一个完全不符合预期的值。返回对象尽量用干净 DTO别把 Entity 直接返回。字段越多模型上下文被无关信息占用的越多响应也越慢。4.3 验证用 MCP 客户端连上来说一句话试试验证阶段不需要先写一堆代码。可以先在支持 MCP 的桌面应用里配置好 Server 地址然后输入一句自然语言比如“帮我查一下 OD20240001 这个订单的当前状态”。Host 内部的流程是先拉取工具列表模型判断需要调 getOrder从问题里提取订单号组装参数发起调用拿到结果后再组织成人类能读懂的答案返回。如果工具一直没被加载出来优先翻日志看三步初始化是否成功、版本协商是否通过、Tools/List 是否正常返回。常见问题里十有八九出在服务地址填错、认证失败、返回格式不符合 JSON Schema 这三个地方。如果你更熟悉 Python官方 Python SDK 或者 FastMCP 也能很快搭一个。FastMCP 的写法非常直观from fastmcp import FastMCP mcp FastMCP(OrderServer) mcp.tool() def get_order(order_id: str) - dict: 根据订单号查询订单的信息订单号以OD开头例如OD20240001 # 这里可以调用你已有的 REST 接口 # resp requests.get(fhttps://internal.example.com/api/order/{order_id}) # return resp.json() return {orderId: order_id, status: 已发货} if __name__ __main__: mcp.run()这个版本对刚接触 MCP 的人特别友好适合先跑通一遍再深入到 Java SDK。5. MCP 已经落地的场景设计、3D、安全、编程5.1 Figma MCPAI 直接读设计稿的图层信息设计工具生态里Figma MCP 是目前普及度最高的场景之一。设计师在设计稿里调排版、改颜色、定命名开发人员或者 AI 助手可通过 Figma MCP 读取文件节点树、图层名、样式参数。比如你在 Cursor 里配好 Figma MCP对 AI 说一句“根据设计稿生成页面代码”模型就能先调用 MCP 拉取当前 Frame 的节点和样式再基于真实数据生成前端代码而不是凭空想象一套“看起来像设计稿”的界面。使用 Figma MCP 时通常会需要配置一个个人访问令牌也就是热词里有人在搜的“figma mcp token 在哪获取”。令牌可以在 Figma 账号设置的 Personal Access Token 里生成权限范围尽量只勾选 File content 读取即可。令牌这东西只该出现在本地配置和受控环境里一旦泄露等于把设计稿数据敞开了给别人看。5.2 Blender MCP用自然语言操作 3D 建模Blender MCP 把 Blender 内部可编程能力暴露给 AI。你可以在聊天窗口里说“在场景中创建一个圆柱体半径为 0.5高度为 2并把材质设为金属”AI 通过 MCP Server 调用 Blender 的 Python API场景里就真的出现了这个圆柱体。这对不熟悉 Blender 快捷键的新手帮助很大但我用下来有一个明显感受复杂的建模任务如果全部丢给 AI模型容易钻牛角尖、反复试错内存占用也容易涨得很快。更稳妥的方式是把任务拆成小步骤一次让 AI 做一个小需求比如先“建一个底座”再“把底座移动到 x0”逐步推进出问题的概率小得多。5.3 安全测试BurpSuite 和 Yakit 的 MCP 接入热词里出现了 burpsuite mcp 和 yakit mcp 如何使用这说明安全工具生态也在主动拥抱 MCP。BurpSuite 是 Web 安全测试者的主力工具通过 MCP 接入后AI 可以辅助读取请求包、修改参数、重放请求、分析漏洞特征。Yakit 的 MCP 也类似相当于把常用渗透测试能力暴露给 Agent。但这里我必须提醒一句安全测试本身是一个高度依赖授权范围的领域。MCP 让测试工具调起来更顺手了不等于可以顺手乱扫。接入 AI 之前一定先把目标和授权边界写清楚最好在工具描述里也限定用途。这个不是说教而是这类工具的特性决定了——效率提升的另一面是风险同步放大。5.4 编程工具Cursor、Codex 里的 MCP 是什么角色在 Coder 类产品中MCP 目前是把 Agent 从“只读写当前工作区”扩展到“连通外部系统”的关键管道。Cursor 内置了 MCP client可以配置团队内部的文档、数据库、监控系统等 MCP Server。写代码时让 AI 查某个依赖包的最新版本它可以直接调用 MCP 工具拿实时数据而不是靠训练数据里的旧版本信息。Codex 也在逐步支持 MCP给命令行环境里的 Agent 提供外部工具接入能力。这类场景的商业价值特别明显AI 能触达的数据越具体、越贴近团队真实环境产出的代码质量和判断质量就越高。从整个开发流程看MCP 正在变成 AI 应用的“行为接口层”——模型不仅能读到数据还能真正执行操作。6. MCP 与 Agent 的关系Agent 的“手”和“口”6.1 Agent 跑一个任务时MCP 到底参与了哪一步AI Agent 的经典工作模式可以简化成接收目标、规划、调用工具、观察结果、继续执行、完成任务。在这个闭环里MCP 的核心贡献是“调用工具”这一步的统一。没有 MCP 的时候Agent 想查订单代码里得写死一个查询函数想查知识库得调另一个函数每新增一个服务Agent 主程序就要改一轮。改到最后Agent 的逻辑慢慢变成一团乱麻新成员上手成本高功能一多就理不清。有了 MCP 之后Agent 的调度核心不再关心每个工具的内部实现和具体地址。它只需要从 MCP Client 拿到工具清单按任务决定用哪个工具把参数组装好交给客户端去和 Server 通信。Agent 的主程序变得轻量扩展能力从“改主程序”变成了“加一个 Server 配置”。6.2 Agent Skill 和 MCP 有什么区别到底该用哪个热词里有一条“agent skill 和mcp有什么区别”这是个高频疑问。我个人的理解是MCP 是“工具接入的标准协议”Agent Skill 更像“Agent 行为能力的封装单元”两者不在同一个层上但可以配合使用。Skill 可以包含一系列提示词、代码片段、脚本用来教会 Agent 完成某类复杂任务比如“怎么根据设计稿写代码”“怎么做一次完整的版本发布”。它可以封装调用某些工具的流程。而 MCP 解决的是工具与模型之间的标准化通信问题让模型在运行时能可靠地调用外部能力。选型逻辑可以这样看如果目标是让 Agent 学会一个复杂的工作流比如“从需求文档到 MR 创建”用 Skill 封装流程更合适如果只是让它能稳定调用某个外部能力比如“查订单”“发通知”上 MCP 就够了。实际项目里两者常常同时出现一个 Skill 内部去调用多个 MCP Tool完成从信息获取到动作执行的完整链路。这个组合很自然也很难被单纯某一方替代。6.3 本地 Server 还是远程 Server怎么选更稳妥MCP Server 可以部署在本地进程也可以做成远程 HTTP 服务这是它能适配不同场景的原因。本地部署的好处是数据不出本地适合个人开发工具、设计工具、需要直连本地文件或数据库的场景远程部署的好处是团队共享、统一运维适合公司内部的知识库、生产数据查询等等。我在项目里通常按一个朴素原则判断涉及敏感生产数据的工具用远程服务加严格鉴权并且按最小权限配置个人本机工具优先本地。不要给 AI 开一个比员工自身权限还大的口子。MCP 能把工具接入的门槛降得很低但同时也把数据通路拉宽了权限设计必须与数据敏感度匹配这是我从上线项目里得来的实际教训。7. 实战经验与常见坑帮大家少走弯路7.1 工具描述写不好模型就会“选错工具”“工具加载不出来”是显性问题“工具能被加载但模型总在几个相似工具之间犹豫或者选错、参数拼错”是隐性问题更常见也更难排查。根因大部分集中在工具定义写得不好。我现在的写法比较固定名称用“动词 对象”比如 query_order、create_gitlab_mr不要用 getData 这种谁都看不懂的命名。description 里写清楚使用时机也要写清楚反面边界。像“该工具仅在用户需要查询订单时使用不要用于查询产品信息”这种话对模型帮助极大。参数 Schema 尽量精确。对枚举值、默认值、取值范围给出明确约束模型的参数生成准确率会明显上升。7.2 安全边界不要把内部能力直接暴露给 AIMCP 的便利是把工具暴露给 AI但同时也意味着暴露给了所有能接触这个 Host 的人。如果服务内部方法直接加 Tool 就发布出去等于给攻击者多开了一扇门。我在实践中会做一个“瘦封装层”只暴露业务上允许 AI 操作的少数方法调用前再加鉴权、限流和审计记录。那些内部维护、逻辑复杂的 DAO 方法永远不加 MCP 注解。另外建议工具返回值不要带上数据库主键、内部地址、Token 等字段。MCP 的返回数据会完整进入模型上下文模型再把它输出到对话里这就是一次天然的数据泄露链路。所以返回 DTO 的字段真的需要一个个过一遍再放行。7.3 排查“连不上”“看不到工具”“调用失败”的方法如果你连一个 MCP Server 时遇到问题别急着乱试。我一般按这样的顺序排查初始化是否成功。看日志里有没有 Initialize 请求、版本协商的结果。版本不一致经常导致后续请求全部失效。工具列表是否返回。检查 Server 返回的 JSON Schema 是否合法。很多时候是 Schema 里写了非法约束导致模型侧把整个工具过滤掉了。调用结果是否符合模型预期。有些 Server 返回 HTTP 200但业务逻辑其实是失败的比如“订单不存在”模型可能误以为调用成功。建议错误信息写得醒目一些至少要带上“失败”两个字并附上原因和建议动作。日志在整个排查过程里最重要。MCP 的链路结构比较干净先看 Host 拿到的工具列表再看它选了哪个工具最后看请求参数和返回值基本很快就能定位问题出在哪一环。最后说点个人体会我自己用 MCP 这段时间最大的感觉是它现在更像是 AI 应用从“能跑 Demo”走向“真正生产”的一根主心骨。工具生态还在快速洗牌协议本身也在迭代各平台对 Resources、Prompts 的适配程度参差不齐安全体系也还在完善。这些东西确实值得持续关注但有一条大方向不会变让 AI 能真正读取数据、调用系统、执行操作它才能从一个“会聊天的程序”变成“能干活的生产力工具”而 MCP 正在给这种互动提供一套系统化的标准。最后分享一个小建议如果你手头正好有一个平时总要手工操作的内部系统不管是查数据、发请求还是做批量处理花半天时间把它包成一个 MCP Server。第二天你再用对话的方式去调它那种体验真的很不一样。你会发现AI 距离“真正懂事”又近了一大截。