一文读懂MCP:让AI大模型万能插拔协议
MCP(模型上下文协议)由Anthropic提出,为AI大模型提供通用接口标准,解决工具调用碎片化问题。采用Host Client Server架构,支持动态发现工具,通过stdio或HTTP通信,实现工具即插即用、跨语言调用和统一对接规范。
前言:从 LLM + Tools = Agent 说起
先聊聊这个公式。如果你用过AI编程助手,比如Cursor、Trae这类工具,或者自己搭建过LLM Agent,对这个公式肯定不陌生:

LLM + Tools = Agent
大模型本质上只会“对话”,但一旦配上读文件、写文件、执行命令等工具,就能转变为一个真正能干活的Agent。
问题也随之而来:
- 工具被硬编码在Agent里,每新增一个工具都得改代码、重新部署,十分繁琐。
- 外部团队或第三方服务想开放给AI使用,却缺乏统一标准,对接成本极高。
- 不同语言编写的工具——Node调用Python、调用Java、调用Rust——彼此割裂。
- 本地工具与远程工具的通信方式各异,适配过程相当痛苦。
MCP正是为了解决这种“碎片化”问题而生的。
一、MCP 是什么?
MCP,全称Model Context Protocol,即模型上下文协议。它由Anthropic在2024年底提出,并于2025年贡献给开源社区,是一套开放协议。简单说,它是为AI大模型量身定制的通用接口标准。
如何理解呢?打个比方:
MCP的核心思想,是将具体的工具以及“如何调用工具”的规则,打包成一个独立的服务器进程。MCP与Tool不是并列关系,而是“容器”与“内容”的关系:
- 没有MCP之前:AI调用工具是硬编码的,每添加一个工具就需要编写大量胶水代码。
- 有了MCP之后:变为动态发现,Host启动时自动扫描Server暴露了哪些工具,运行时按需调用。
二、MCP 的架构:Host / Client / Server 三者关系
MCP采用经典的客户端-服务器架构,包含三个核心角色:
| 角色 | 说明 | 举例 |
|---|---|---|
| MCP Host(主机) | 需要连接外部世界的AI应用程序,是发起请求的“大脑” | Cursor、Claude Desktop、Trae |
| MCP Client(客户端) | 在Host内部运行,负责与MCP Server建立一对一连接 | Cursor内置的MCP Client,读取mcp.json并建立通信 |
| MCP Server(服务器) | 轻量级程序,通过标准协议对外暴露能力 | 你自己编写的my-mcp-server.mjs |
每一个MCP Server可以对外暴露三种核心能力:
| 能力 | 说明 | 示例 |
|---|---|---|
| Tools(工具) | AI可以执行的函数 | 查询用户、发送邮件、读取文件 |
| Resources(资源) | AI可以引用的上下文数据 | 数据库记录、本地文件、API返回内容 |
| Prompts(提示) | 可复用的预定义交互模板 | 引导AI完成特定任务的对话模板 |
三、MCP 的调用流程(7 个步骤)
当你在Cursor里说了一句“帮我查一下用户002的信息”,背后究竟发生了什么?
用户输入 prompt↓① Host 配置 mcp.json → 声明要连接哪些 Server↓② Client 发送 initialize 请求 → Server 返回所有 tools 列表(动态发现)↓③ 用户输入任务 prompt → Host 接收↓④ Host 分析 prompt → 从已发现的 tools 中检索匹配项↓⑤ Client 发起 tool 调用 → 通过 stdio / HTTP 传到 MCP Server↓⑥ Server 执行 tool 逻辑 → 返回结果↓⑦ 结果注入 LLM 上下文(ToolMessage) → LLM 继续推理 → 生成最终回复
关键一步:第②步的“动态发现”
这是MCP最大的亮点。Host无需在代码中写死“有哪些工具可用”,而是在启动时主动询问Server:“你能提供什么能力?”Server返回自己注册的所有工具的名称、描述、参数schema。随后当用户下达任务时,Host就能自动匹配合适的工具去执行。
配置示例(mcp.json)
{"mcpServers": {"my-mcp-server": {"command": "node","args": ["my-mcp-server.mjs"]}}}
四、MCP 的通信方式
MCP支持两种通信传输方式,覆盖本地和远程场景:
| 传输方式 | 适用场景 | 实现类 |
|---|---|---|
| stdio(标准输入输出流) | 本地子进程调用 | StdioServerTransport |
| HTTP(Streamable HTTP) | 远程服务器调用 | HttpServerTransport / Streamable HTTP |
这意味着你可以:
- 本地:通过子进程调用一个MCP Server——无论它是用Node、Python、Java还是Rust编写的。
- 远程:通过HTTP调用部署在云端的MCP Server,享受第三方服务。
五、手写一个 MCP Server(代码实战)
下面我们手写一个完整的MCP Server,代码不长,但功能齐全,用于“查询用户”。
5.1 依赖安装
pnpm add @modelcontextprotocol/sdk zod
5.2 完整代码:my-mcp-server.mjs
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';import { z } from 'zod';// 模拟数据库const database = {users: {"001": { id: "001", name: "张三", email: "zhangsan@example.com", role: "admin" },"002": { id: "002", name: "李四", email: "lisi@example.com", role: "user" },"003": { id: "003", name: "王五", email: "wangwu@example.com", role: "user" },}};// ① 创建 MCP Server 实例const server = new McpServer({name: 'my-mcp-server',version: '1.0.0',});// ② 注册 Tool:查询用户server.registerTool('query-user', {description: '查询数据库中的用户信息。输入用户ID,返回该用户的详细信息(姓名、邮箱、角色)。',inputSchema: {userId: z.string().describe("用户 ID,例如:001, 002, 003"),},}, async ({ userId }) => {const user = database.users[userId];if (!user) {return {content: [{type: 'text',text: `用户ID ${userId} 不存在。可用的ID: 001, 002, 003`,}],};}return {content: [{type: 'text',text: `用户信息:n- ID: ${user.id}n- 姓名: ${user.name}n- 邮箱: ${user.email}n- 角色: ${user.role}`,}],};});// ③ 注册 Resource:使用指南server.registerResource('使用指南', 'docs://guide', {description: 'MCP Server 使用文档',mimeType: 'text/plain',}, async () => {return {contents: [{uri: 'docs://guide',mimeType: 'text/plain',text: 'MCP Server 使用指南n功能:提供用户查询等工具。',}],};});// ④ 选择通信方式并启动const transport = new StdioServerTransport();await server.connect(transport);
5.3 MCP 开发流程总结
new McpServer()→创建 Server 实例server.registerTool()→注册工具(名称、描述、入参 schema、执行回调)server.registerResource()→注册资源(名称、URI、描述、内容回调)server.registerPrompt()→注册提示模板(可选)new StdioServerTransport() →选择通信方式server.connect(transport)→启动 Server,等待 Host 连接
六、把 MCP 集成到自己的 Agent 程序里
MCP Server写好后,不仅能在Cursor中使用,还可以通过LangChain等框架直接嵌入到你自己的Agent程序中,实现“可插拔”的工具集成。
下面是用LangChain + MCP Adapters的示例:
import { MultiServerMCPClient } from '@langchain/mcp-adapters';import { ChatOpenAI } from '@langchain/openai';import { HumanMessage, ToolMessage } from '@langchain/core/messages';const model = new ChatOpenAI({modelName: process.env.MODEL_NAME,apiKey: process.env.OPENAI_API_KEY,configuration: { baseURL: process.env.OPENAI_BASE_URL },});// ① 创建 MCP Client,连接 MCP Serverconst mcpClient = new MultiServerMCPClient({mcpServers: {'my-mcp-server': {command: 'node',args: ['/path/to/my-mcp-server.mjs'],},},});// ② 动态发现 + 获取 toolsconst tools = await mcpClient.getTools();// ③ 把 tools 绑定到模型上const modelWithTools = model.bindTools(tools);// ④ Agent 循环:推理 → 调用 tool → 拿结果 → 再推理async function runAgent(query, maxIterations = 30) {const messages = [new HumanMessage(query)];for (let i = 0; i < maxIterations; i++) {const response = await modelWithTools.invoke(messages);messages.push(response);// 没有 tool_calls 说明推理结束if (!response.tool_calls || response.tool_calls.length === 0) {return response.content;}// 执行每个 tool_call,把结果注入上下文for (const toolCall of response.tool_calls) {const foundTool = tools.find(t => t.name === toolCall.name);if (foundTool) {const toolResult = await foundTool.invoke(toolCall.args);messages.push(new ToolMessage({content: toolResult,tool_call_id: toolCall.id,}));}}}return messages[messages.length - 1].content;}// ⑤ 使用const result = await runAgent("查一下用户 002 的信息");console.log(result);await mcpClient.close();
这个示例的关键点在于:
getTools()就是“动态发现”——你的程序无需硬编码有哪些工具。bindTools(tools)将这些动态发现的工具注入LLM,让模型“知道”自己能调用什么。- Agent循环中,LLM决定是否调用工具、调用哪个工具,执行后将结果以
ToolMessage的形式反馈给LLM,形成闭环。
七、MCP 的核心价值总结
| 维度 | 传统方式 | MCP 方式 |
|---|---|---|
| 工具集成 | 硬编码,一改全改 | 动态发现,即插即用 |
| 跨语言调用 | 需要自己编写IPC / RPC胶水 | 统一协议,天然跨语言 |
| 第三方接入 | 各自定义接口,对接成本高 | 一套规范,大家都遵守 |
| 本地 vs 远程 | 需要分别适配 | stdio / HTTP双模式原生支持 |
| 生态扩展 | 封闭 | 开放,大厂可将服务以MCP方式对外提供 |
八、写在最后
说到这儿,其实能看出MCP的野心远不止是“又一个工具调用协议”。它试图定义的是AI时代的“USB-C接口”——一套通用、开放的标准,让AI能够无缝连接这个世界的各种服务和数据。
理解了MCP,就能理解为什么有人说“80%的App会消失”:当AI成为超级入口,用户不再需要逐一打开独立的App,而是直接对AI说“帮我查一下快递”“帮我订一张票”,AI通过MCP在背后调用对应服务,一切都变得透明。
希望这篇文章能帮你建立起对MCP的完整认知。现在就动手写一个自己的MCP Server吧,你会发现自己动手比想象中简单得多。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
天学会AI应用开发上下文与RAG阶段性总结
系统梳理了AI应用开发中的上下文与RAG核心概念。搭建Python3 10开发环境后,通过提示词工程管理历史对话,利用截断、摘要提取及离线大模型压缩上下文。RAG采用加载文档、分块、向量化、存入FAISS或Chroma库、检索五个步骤,中文场景推荐BGE-small嵌入模型,实战证明离线检索有效。
Yank Note系列14:如何与AI协作写文章
YankNote3 92 1发布,新增“审阅批注”和“编辑装订线”扩展,聚焦AI写作的人机协作循环。审阅批注将反馈绑定到选中文本,编辑装订线高亮显示修改行,帮助人看清AI改动。同时升级Markdown-it至14 3 0,优化中日韩文本渲染。
一文读懂MCP:让AI大模型万能插拔协议
MCP(模型上下文协议)由Anthropic提出,为AI大模型提供通用接口标准,解决工具调用碎片化问题。采用Host Client Server架构,支持动态发现工具,通过stdio或HTTP通信,实现工具即插即用、跨语言调用和统一对接规范。
BeeWeave开源:为AI Agent打造越用越懂你的知识创作台
BeeWeave是一个Agent原生的知识创作台,通过workbench和vault双层结构实现素材获取、内容创作、知识沉淀与上下文复用的持续闭环。它支持多Agent共用同一套知识库,内置41个Skills,采用MIT开源协议,旨在解决跨会话知识丢失问题。
AI闭环工程师自动推进工程任务
LoopEngineer是一种将AI嵌入可执行、可验证、可持续迭代的工作循环中的工程协作方式。通过触发器、上下文、工具和验证机制,AI在循环中自动分析、执行、验证并调整,直至任务完成或需人工介入,实现复杂任务的可观察、可审计、可批准的分段自动化。
- 热门数据榜
相关攻略
2026-07-12 15:04
2026-07-12 15:04
2026-07-12 15:04
2026-07-12 15:03
2026-07-12 15:03
2026-07-12 15:03
2026-07-12 15:03
2026-07-12 15:03
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程

