MCP:大模型的“万能插头“从零搞懂 Model Context Protocol
你可能听过 Function Calling、Plugin、RAG……但 MCP 把这所有东西统一成了一件事:让大模型安全、标准地"长出双手",去连接外部世界。
2026年7月 · 技术深度解析 · 阅读约 12
一、一句话讲清楚 MCP 是什么
MCP(Model Context Protocol,模型上下文协议) 是 Anthropic 在 2024 年底发布的一套开放协议标准。它的核心目标就一个:
让任何大模型应用,都能通过一套统一的接口,安全地访问本地文件、数据库、API、浏览器等外部资源。
你可以把它理解成大模型世界的 "USB-C 接口"。以前每个 AI 应用想接个数据库得自己写适配代码,想调个 API 得自己写胶水层……有了 MCP,所有外部能力都封装成标准化的 "Server",任何一个 MCP Client(也就是你的 AI 应用)插上就能用。
二、为什么需要 MCP?以前的方案有什么问题?
在 MCP 出现之前,如果你想做一个"能查数据库 + 能读本地文件 + 能发邮件"的 AI 助手,你有几条路:
| 方案 | 问题 |
|---|---|
| 自己写胶水代码 | 每个 AI 应用都要重写一遍,无法复用,维护成本巨大 |
| Function Calling | OpenAI 定义的格式,各家实现不统一,而且只管"调用",不管"发现和管理" |
| Plugin 机制 | ChatGPT Plugin、Copilot Extension……每家平台各自为政,换个平台全废 |
| RAG + Tool Use | 能做,但缺少统一的安全模型、资源发现机制、双向通信能力 |
MCP 就是来解决这些问题的:一次编写 Server,到处复用;统一的安全模型;标准化的能力发现机制。
三、MCP 的核心架构
MCP 采用经典的 Client-Server 架构:
┌─────────────────────────────────────────────────┐ │ MCP Client │ │ (你的 AI 应用,如 Claude Desktop) │ │ │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ Protocol │ │ Security │ │ Session │ │ │ │ Handler │ │ Manager │ │ Manager │ │ │ └─────┬────┘ └─────┬────┘ └─────┬────┘ │ │ └──────────────┼─────────────┘ │ └────────────────────────┼──────────────────────────┘ │ JSON-RPC 2.0 ┌────────────┼────────────┐ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ MCP │ │ MCP │ │ MCP │ │ Server │ │ Server │ │ Server │ │ (文件系统) │ │ (数据库) │ │ (浏览器) │ └──────────┘ └──────────┘ └──────────┘
三个核心概念
1. MCP Host(宿主) — 就是运行 AI 模型的那个应用程序,比如 Claude Desktop、Cursor、CodeBuddy 等。它负责管理多个 MCP Client 的生命周期。
2. MCP Client(客户端) — 每个 Client 和某个具体的 MCP Server 建立一对一的连接。负责协议握手、发现 Server 能力、调用工具和资源。
3. MCP Server(服务端) — 暴露出三类能力:
| 能力类型 | 说明 | 典型例子 |
|---|---|---|
| Tools(工具) | 可被模型调用的函数 | query_database、send_email、read_file |
| Resources(资源) | 可供模型读取的结构化数据 | 文件内容、数据库记录、API 响应 |
| Prompts(提示模板) | 预定义的提示词模板 | code_review_prompt、summarize_prompt |
四、MCP 的通信协议:JSON-RPC 2.0
MCP 基于 JSON-RPC 2.0 协议进行通信。之所以选它,是因为 JSON-RPC 足够简单、跨语言、跨平台,几乎所有编程语言都有现成的实现。
两种传输方式
1. stdio(标准输入输出)— 本地进程通信
Client 启动 Server 作为子进程,双方通过 stdin/stdout 交换 JSON-RPC 消息。优点是零网络配置、安全、适合本地工具。这是最常用的方式。
2. SSE over HTTP — 远程通信
Client 通过 HTTP POST 发送请求,通过 SSE 流接收 Server 的推送消息。适合团队共享的工具 Server。
协议生命周期
Phase 1:初始化
Client -> Server: initialize { capabilities, clientInfo }
Server -> Client: initialize { capabilities, serverInfo, instructions }
Client -> Server: initialized(通知)
Phase 2:能力发现与使用
Client -> Server: tools/list
Server -> Client: [ { name: "query_db", description: "...", inputSchema: {...} }, ... ]
Client -> Server: tools/call { name: "query_db", arguments: {...} }
Server -> Client: { content: [...], isError: false }
Client -> Server: resources/read { uri: "file:///data/report.txt" }
Server -> Client: { contents: [ { uri: "...", mimeType: "text/plain", text: "..." } ] }
Phase 3:生命周期管理
Server -> Client: notifications(进度、日志、资源变更通知) Client -> Server: ping(心跳检测)
五、如何搭建一个 MCP Server?
以 Python 为例,使用官方的 mcp SDK,20 行代码就能搭一个天气查询 Server:
Python 版本
import json
from mcp.server import Server, stdio_server
from mcp.types import Tool, TextContent
app = Server("weather-server")
@app.list_tools()
async def list_tools() -> list[Tool]:
return [
Tool(
name="get_weather",
description="查询指定城市的天气",
inputSchema={
"type": "object",
"properties": {
"city": {"type": "string", "description": "城市名称"}
},
"required": ["city"],
},
)
]
@app.call_tool()
async def call_tool(name: str, arguments: dict) -> list[TextContent]:
if name == "get_weather":
city = arguments["city"]
# 实际应该调用真实的天气 API
return [TextContent(type="text", text=f"{city}今天晴,22°C,微风")]
raise ValueError(f"Unknown tool: {name}")
if __name__ == "__main__":
import asyncio
asyncio.run(stdio_server(app))
Node.js 版本
import { Server } from "@anthropic-ai/mcp-sdk/server";
import { StdioServerTransport } from "@anthropic-ai/mcp-sdk/server/stdio.js";
const server = new Server({ name: "weather-server", version: "1.0.0" });
server.setRequestHandler("tools/list", async () => ({
tools: [{
name: "get_weather",
description: "查询指定城市的天气",
inputSchema: {
type: "object",
properties: { city: { type: "string" } },
required: ["city"],
},
}],
}));
server.setRequestHandler("tools/call", async (request) => {
if (request.params.name === "get_weather") {
const city = request.params.arguments.city;
return { content: [{ type: "text", text: `${city}今天晴,22°C,微风` }] };
}
});
const transport = new StdioServerTransport();
await server.connect(transport);
六、如何挂接和使用 MCP
在 Claude Desktop 中配置
编辑 Claude Desktop 配置文件:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"weather": {
"command": "python",
"args": ["/path/to/weather_server.py"]
},
"filesystem": {
"command": "npx",
"args": ["-y", "@anthropic-ai/mcp-server-filesystem", "/home/me/Docs"]
},
"postgres": {
"command": "npx",
"args": ["-y", "@anthropic-ai/mcp-server-postgres", "postgresql://localhost/mydb"]
}
}
}
重启 Claude Desktop,就能在对话中看到新挂载的工具了。
在 CodeBuddy 中配置
在项目根目录创建 .mcp.json:
{
"mcpServers": {
"design-converter": {
"command": "node",
"args": ["./mcp-servers/design-converter/index.js"]
},
"tencent-docs": {
"command": "python",
"args": ["./mcp-servers/tencent-docs/server.py"]
}
}
}
在代码中编程调用
import asyncio
from mcp import ClientSession, StdioServerParameters
from mcp.client import stdio_client
async def main():
server_params = StdioServerParameters(
command="python", args=["./weather_server.py"],
)
async with stdio_client(server_params) as (read, write):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()
result = await session.call_tool("get_weather", {"city": "上海"})
print(result.content[0].text)
asyncio.run(main())
七、MCP 适用场景全景图
本地文件操作数据库查询Git 操作终端命令Web 搜索内部知识库代码库搜索腾讯文档邮件收发日历管理浏览器控制设计稿读取图片生成PDF 处理视频处理
本地工具集成
| 场景 | 典型 MCP Server | 能力 |
|---|---|---|
| 文件操作 | @anthropic-ai/mcp-server-filesystem |
读写本地文件 |
| 数据库查询 | mcp-server-postgres / sqlite-server |
执行 SQL、查看表结构 |
| Git 操作 | git-mcp-server |
查看 diff、创建分支、提交 |
| 终端命令 | terminal-mcp-server |
安全执行 Shell 命令 |
知识检索
| 场景 | 典型 MCP Server | 能力 |
|---|---|---|
| 搜索引擎 | brave-search-mcp-server |
Web 联网搜索 |
| 内部知识库 | 自建 Server | 连接企业 Wiki、Confluence |
| 代码库搜索 | github-mcp-server |
搜索 Issues、PR、代码 |
八、MCP vs 其他方案对比
| 维度 | MCP | Function Calling | Plugin | 自研胶水代码 |
|---|---|---|---|---|
| 标准化程度 | ✅ 开放协议 | ⚠️ OpenAI 专有 | ❌ 平台不互通 | ❌ 无标准 |
| 能力发现 | ✅ 内置 tools/list | ⚠️ 手动注册 | ⚠️ 平台定义 | ❌ 硬编码 |
| 资源管理 | ✅ 内置 resources | ❌ 不支持 | ❌ 不支持 | ❌ 自己实现 |
| 安全模型 | ✅ 权限协商 | ❌ 无 | ⚠️ 平台控制 | ❌ 自己实现 |
| 传输方式 | ✅ stdio / SSE | HTTP POST | HTTP POST | 自定义 |
| 跨平台复用 | ✅ 任意 Client 可用 | ❌ 绑定 SDK | ❌ 绑定平台 | ❌ 绑定应用 |
核心差异:MCP 不是又一个 Tool Calling 方案,而是一个基础设施层的标准化协议。它解决的是"AI 应用如何分发和发现能力"这个问题,而不是"AI 如何调用一个函数"。
九、MCP 的安全模型
1. 能力声明与协商 — Server 启动时声明自己需要哪些权限(如访问文件系统、网络等),Client 可以选择性地授权。
2. 用户批准机制 — 对于敏感操作(如删除文件、发送邮件),Client 可以要求用户在调用前确认。
3. 沙箱隔离 — 每个 MCP Server 以独立进程运行,互不干扰。一个 Server 崩溃不会影响其他 Server。
4. 传输层安全 — 本地 Server 通过 stdio 通信,天然隔离网络攻击面。远程 Server 建议走 HTTPS。
十、MCP 的局限与未来
当前 MCP 还在快速迭代中,有一些可以改进的地方:
远程 Server 部署方面,目前 stdio 模式最成熟,SSE/HTTP 模式的生态还在构建中。Server 发现市场还没有像 VS Code 插件市场那样的统一分发平台。多模态支持主要集中文本交互,图片、视频等资源的处理在完善中。流式输出方面,Server 调用结果目前是同步返回,大文件流式读取还需要优化。
但整体方向非常清晰:MCP 正在成为 AI Agent 的"操作系统接口层"。未来你可能会看到 MCP Server 市场、MCP 服务网格、Server 热插拔等更高级的特性。
十一、总结
MCP 做的事情可以概括为三句话:
1. 统一接口 — 一套协议,连接任何外部能力
2. 一次编写,到处使用 — Server 写一次,任何 MCP Client 都能用
3. 安全可控 — 能力声明、权限协商、进程隔离
如果你在构建 AI 应用,无论是一个简单的 CLI 工具还是复杂的企业级 Agent 平台,MCP 都值得你认真考虑。它可能不是银弹,但它正在重新定义大模型和外部世界的交互方式。
更多推荐

所有评论(0)