2026-05-15AIAgent协议架构MCP

MCP协议:AI Agent互联互通的"USB-C"时刻终于来了

过去两年,AI Agent 生态有一个显著的痛点:每个平台、每个框架、每个模型供应商都有一套自己的 Agent 通信协议。

biluo·6701 words

前言: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的对比

维度 MCP OpenAI Assistants API
定位 通用 Agent 通信协议 OpenAI 专有工具调用协议
跨平台 支持任何模型/框架 仅限 OpenAI 模型
工具定义 JSON Schema,开放 OpenAI 定义的 schema
传输方式 Stdio + SSE REST API
生态 快速增长的 Server 生态 依赖 OpenAI 生态
适合场景 多模型多框架互操作 OpenAI 平台内的 Agent 开发

六、工程实践:用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 的互联互通,可能真的不远了。