MCP协议:AI Agent互联互通的"USB-C"时刻终于来了
过去两年,AI Agent 生态有一个显著的痛点:每个平台、每个框架、每个模型供应商都有一套自己的 Agent 通信协议。
前言:Agent孤岛困境
过去两年,AI Agent 生态有一个显著的痛点:每个平台、每个框架、每个模型供应商都有一套自己的 Agent 通信协议。
OpenAI 的 Agents SDK、Anthropic 的 Claude Agent SDK、LangChain、CrewAI、AutoGen——彼此之间鸡同鸭讲。一个用 CrewAI 写的多智能体团队,想调用 Google 的 Gemini 工具?要么自己写适配层,要么换平台。
这种碎片化带来的问题是:开发者每换一个模型或框架,Agent 间的通信协议就要重写。生态在"能跑"和"互通"之间挣扎。
Model Context Protocol(MCP) 就是为了解决这个问题而诞生的。它由 Anthropic 在 2025 年初提出,目标是成为 AI Agent 与外部世界交互的通用接口层——就像 USB-C 之于设备连接,让不同厂商的设备终于可以用同一套物理接口互联。
本文从协议设计角度,深度拆解 MCP 的架构、核心概念、以及工程实践。
一、MCP的核心设计哲学
1.1 三个角色
MCP 协议中定义了三个核心角色:
- **Host**:运行 AI 模型的主程序,比如一个聊天应用或 Agent 运行时。它管理整个会话的生命周期。
- **Client**:Host 内部的一个组件,负责与特定的 Server 建立 1:1 连接。
- **Server**:暴露特定工具或资源的进程。它向 Client 提供能力集(capabilities),不直接与模型交互。
`
Host (AI Application)
├── Client A ──→ Server A (Filesystem Tools)
├── Client B ──→ Server B (GitHub API Tools)
└── Client C ──→ Server C (Database Tools)
`
1.2 传输层:Stdio还是SSE?
MCP 支持两种传输方式:
Stdio(标准输入输出):通过子进程通信,Server 作为 Host 的子进程启动。适合本地工具扩展,延迟低,部署简单。
`json
// Server启动配置示例
{
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/dir"],
"env": {
"NODE_ENV": "production"
}
}
`
SSE(Server-Sent Events):通过 HTTP 长连接推送事件,适合远程 Server。Client 发起连接,Server 通过 SSE 推送通知和响应。
两种传输方式共用同一套 JSON-RPC 2.0 消息格式,所以协议层完全统一。
1.3 消息格式:JSON-RPC 2.0
MCP 的所有消息都基于 JSON-RPC 2.0,包含三类基本消息:
请求(Request):
`json
{
"jsonrpc": "2.0",
"id": 42,
"method": "tools/call",
"params": {
"name": "read_file",
"arguments": { "path": "/data/config.json" }
}
}
`
响应(Response):
`json
{
"jsonrpc": "2.0",
"id": 42,
"result": {
"content": [
{ "type": "text", "text": "{ ... config content ... }" }
],
"isError": false
}
}
`
通知(Notification):没有 id 的消息,用于单向事件通知,比如日志推送或进度更新。
二、核心能力:Tools、Resources、Prompts
MCP 协议围绕三大能力构建。
2.1 Tools(工具)
Tools 是 Agent 与外部系统交互的核心机制。Server 向 Client 声明自己提供哪些工具,Client 在运行时请求调用。
工具定义:
`typescript
interface Tool {
name: string; // 唯一标识符,如 "filesystem_read"
description: string; // 人类可读描述,模型用来决定是否调用
inputSchema: object; // JSON Schema,描述参数结构
}
`
调用流程:
1. Host 启动时,Client 发送 initialize 请求,Server 返回 tools/list 响应
2. 模型决定调用某个 Tool,Host 将其打包成 tools/call 请求
3. Server 执行,返回结构化结果
实战示例:一个提供 GitHub API 的 MCP Server:
`python
# Python MCP Server (使用 FastMCP 框架)
from mcp.server.fastmcp import FastMCP
mcp = FastMCP("GitHub Tools")
@mcp.tool()
def get_repo_info(owner: str, repo: str) -> dict:
"""获取GitHub仓库信息"""
response = requests.get(
f"https://api.github.com/repos/{owner}/{repo}",
headers={"Authorization": f"Bearer {GITHUB_TOKEN}"}
)
return response.json()
@mcp.tool()
def create_issue(owner: str, repo: str, title: str, body: str) -> dict:
"""创建GitHub Issue"""
response = requests.post(
f"https://api.github.com/repos/{owner}/{repo}/issues",
json={"title": title, "body": body},
headers={"Authorization": f"Bearer {GITHUB_TOKEN}"}
)
return response.json()
`
2.2 Resources(资源)
Resources 用于 Agent 读取数据但不执行副作用的场景。比如读取文件、查询数据库、获取配置。
资源 URI 格式:
`
filesystem://./config/app.yaml
github://owner/repo/README.md
postgres://localhost/mydb/users
`
订阅机制:MCP 还支持资源变更订阅(Subscriptions)。Client 可以订阅某个资源,当 Server 端数据变化时,主动推送通知。这对于实时数据场景(如股票行情、IoT 传感器数据)尤为重要。
`json
// Client订阅资源变更
{
"method": "resources/subscribe",
"params": { "uri": "postgres://localhost/mydb/users" }
}
// Server推送更新
{
"method": "notifications/resources/updated",
"params": { "uri": "postgres://localhost/mydb/users" }
}
`
2.3 Prompts(提示模板)
Server 可以提供预定义的 Prompt 模板,供 Host 在特定场景下使用。比如一个 GitHub Server 可以提供"Code Review"模板、"Issue Triage"模板。
`json
{
"name": "code_review",
"description": "对提交diff进行代码审查",
"arguments": [
{ "name": "diff", "description": "git diff内容", "required": true }
],
"template": "请审查以下代码变更,用JSON格式输出review结果:\n\n`\n${diff}\n`"
}
`
三、采样机制:让模型"主动"使用工具
MCP 有一个独特的机制:Sampling。
在标准协议中,Client 负责调用工具,Host 决定何时调用。但 Sampling 允许 Server 主动请求模型生成内容——这解决了"Agent 想生成子任务"的问题,比如:
- Agent 想生成一个子 Agent 来处理某个步骤
- Agent 需要模型对某个中间结果做"再理解"
- 多 Agent 协作时,子 Agent 需要动态请求主模型的决策
采样请求通过 SamplingMessage 类型传递,Server 发请求给 Host,Host 转发给模型,结果返回给 Server。
这个机制在多智能体编排场景下特别有价值。
四、安全模型:MCP的安全边界
MCP 协议对安全有明确的考量:
能力声明:每个 Server 在连接时声明自己的能力范围。Client 在 initialize 阶段会收到 Server 的 capabilities 列表,可以据此做权限过滤。
输入验证:所有工具参数都用 JSON Schema 做验证,防止注入攻击。
本地执行隔离:Stdio 模式下,Server 运行在子进程里,有独立的文件系统视图。通过配置 allowedDirectories,Host 可以限制 Server 的访问范围。
`json
// Host配置示例
{
"server": {
"command": "python",
"args": ["github_mcp_server.py"],
"allowedDirectories": ["/home/user/repos"]
}
}
`
远程Server的认证:SSE 模式下,Server 需要实现标准的 Bearer Token 或 OAuth 2.0 认证。协议本身不绑定认证方案,由具体实现决定。
五、与OpenAI Assistants API的对比
六、工程实践:用FastMCP快速构建Server
Anthropic 提供了官方 Python SDK fastmcp,可以快速构建 MCP Server:
`python
from fastmcp import FastMCP
mcp = FastMCP("Demo Server")
@mcp.tool()
def analyze_data(csv_path: str, column: str) -> dict:
"""分析CSV指定列的统计信息"""
import pandas as pd
df = pd.read_csv(csv_path)
col_data = df[column]
return {
"mean": float(col_data.mean()),
"median": float(col_data.median()),
"std": float(col_data.std()),
"null_count": int(col_data.isnull().sum())
}
@mcp.resource("csv://{path}")
def csv_resource(path: str) -> str:
"""将CSV文件作为资源暴露给Agent"""
with open(path) as f:
return f.read()
if __name__ == "__main__":
mcp.run(transport="stdio") # 生产环境用stdio
# mcp.run(transport="sse", port=8080) # 远程部署用SSE
`
运行后,任何 MCP-compatible Host(如 Claude Desktop、Cursor、Cline)都可以连接这个 Server,使用它的工具和资源。
七、生态现状与展望
截至2026年5月,MCP 生态已经相当成熟:
官方 Server 生态:Anthropic 官方维护着 filesystem、GitHub、Slack、PostgreSQL、CLI 等常用 Server。
社区 Server 收录:npm 上有 300+ MCP Server 包,涵盖数据库、API、云服务、开发工具等各个方向。
主流工具支持:Claude Desktop、Cursor AI、Cline(VSCode)、Windsurf、Continue.dev 均已支持 MCP。
框架集成:LangChain、AutoGen、CrewAI 都已或将 MCP 作为原生协议支持。
协议层互通的价值已经开始兑现——一个 CrewAI 的多智能体流程,现在可以调用 Google Gemini Tools 和 GitHub MCP Server,而不需要写任何自定义适配代码。
结语
MCP 的意义,不只是"让工具调用更方便"。它真正解决的是 AI Agent 生态的互操作性问题——当每个供应商都用同一套协议描述"我能做什么"和"我需要什么"时,整个生态的成本结构都会下降。
就像 USB-C 让设备互联从"每个厂商自己搞"走向标准化一样,MCP 正在让 AI Agent 的能力扩展走向标准化。
这不是终点,而是起点。接下来看社区能不能围绕 MCP 建立更丰富的 Server 生态,以及其他大厂愿不愿意真正拥抱它而不是另起炉灶。
如果答案是肯定的,AI Agent 的互联互通,可能真的不远了。