游乐游手机版
首页/AI教程/文章详情

一文读懂MCP:让AI大模型万能插拔协议

时间:2026-07-12 16:04
MCP(模型上下文协议)由Anthropic提出,为AI大模型提供通用接口标准,解决工具调用碎片化问题。采用Host Client Server架构,支持动态发现工具,通过stdio或HTTP通信,实现工具即插即用、跨语言调用和统一对接规范。

前言:从 LLM + Tools = Agent 说起

先聊聊这个公式。如果你用过AI编程助手,比如Cursor、Trae这类工具,或者自己搭建过LLM Agent,对这个公式肯定不陌生:

从零理解 MCP:让 AI 大模型

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();

这个示例的关键点在于:

  1. getTools()就是“动态发现”——你的程序无需硬编码有哪些工具。
  2. bindTools(tools)将这些动态发现的工具注入LLM,让模型“知道”自己能调用什么。
  3. 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吧,你会发现自己动手比想象中简单得多。

来源:https://juejin.cn/post/7660793595750858767
上一篇BeeWeave开源:为AI Agent打造越用越懂你的知识创作台 下一篇Yank Note系列14:如何与AI协作写文章
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
天学会AI应用开发上下文与RAG阶段性总结
AI教程 · 2026-07-12

天学会AI应用开发上下文与RAG阶段性总结

系统梳理了AI应用开发中的上下文与RAG核心概念。搭建Python3 10开发环境后,通过提示词工程管理历史对话,利用截断、摘要提取及离线大模型压缩上下文。RAG采用加载文档、分块、向量化、存入FAISS或Chroma库、检索五个步骤,中文场景推荐BGE-small嵌入模型,实战证明离线检索有效。

Yank Note系列14:如何与AI协作写文章
AI教程 · 2026-07-12

Yank Note系列14:如何与AI协作写文章

YankNote3 92 1发布,新增“审阅批注”和“编辑装订线”扩展,聚焦AI写作的人机协作循环。审阅批注将反馈绑定到选中文本,编辑装订线高亮显示修改行,帮助人看清AI改动。同时升级Markdown-it至14 3 0,优化中日韩文本渲染。

BeeWeave开源:为AI Agent打造越用越懂你的知识创作台
AI教程 · 2026-07-12

BeeWeave开源:为AI Agent打造越用越懂你的知识创作台

BeeWeave是一个Agent原生的知识创作台,通过workbench和vault双层结构实现素材获取、内容创作、知识沉淀与上下文复用的持续闭环。它支持多Agent共用同一套知识库,内置41个Skills,采用MIT开源协议,旨在解决跨会话知识丢失问题。

AI闭环工程师自动推进工程任务
AI教程 · 2026-07-12

AI闭环工程师自动推进工程任务

LoopEngineer是一种将AI嵌入可执行、可验证、可持续迭代的工作循环中的工程协作方式。通过触发器、上下文、工具和验证机制,AI在循环中自动分析、执行、验证并调整,直至任务完成或需人工介入,实现复杂任务的可观察、可审计、可批准的分段自动化。