引言:为什么需要 MCP?
当我们构建 AI Agent 时,一个核心问题是:大语言模型如何与外部世界安全、标准地交互?
过去,每个 AI 应用都需要自行实现工具调用逻辑 —— 网页搜索、数据库查询、文件操作、API 集成……这些功能在不同框架中重复造轮子,且互不兼容。Anthropic 提出的 Model Context Protocol (MCP) 正是为了解决这个问题:它定义了一套开放标准,让 LLM 能够以统一的方式连接各种数据源和工具。
本文将从协议设计、架构原理到实战部署,带你全面理解 MCP。
一、MCP 协议核心设计理念
1.1 客户端-服务器架构
MCP 采用经典的 Host - Client - Server 三层架构:
- Host:宿主应用,如 IDE、AI 助手桌面端,负责协调 LLM 与多个 MCP Server 的连接
- Client:客户端,在 Host 内部维护与 Server 的通信会话
- Server:服务提供者,暴露特定的工具(Tools)、资源(Resources)和提示(Prompts)
1.2 JSON-RPC 2.0 通信协议
MCP 底层基于 JSON-RPC 2.0 协议,支持两种传输方式:
- stdio:标准输入输出,适合本地进程间通信
- SSE (Server-Sent Events):基于 HTTP 的服务器推送,适合远程服务部署
1.3 三大核心原语
MCP 定义了三种核心能力,Agent 通过它们与外部系统交互:
| 原语 | 说明 | 典型示例 |
|---|---|---|
| Tools(工具) | LLM 可调用的函数 | 搜索网页、执行SQL、发送邮件 |
| Resources(资源) | 可读取的数据源 | 文件内容、数据库记录、API响应 |
| Prompts(提示) | 预定义的提示模板 | 代码审查、数据摘要模板 |
二、MCP 与 Function Calling 的关系
很多人会问:MCP 和 OpenAI 的 Function Calling 有什么区别?
简单来说,Function Calling 是 LLM 输出结构化意图的能力,而 MCP 是 意图到执行之间缺失的那一层标准化协议。Function Calling 告诉你"该调用什么",MCP 规定了"怎么找到并调用它"。
打个比方:Function Calling 像是知道"我要打车",MCP 则是网约车平台的统一调度系统 —— 它让不同的"车辆"(工具/服务)以标准化的方式接入。
三、实战:用 Python 构建一个 MCP Server
下面我们动手创建一个简单的天气查询 MCP Server,完整演示开发流程。
3.1 环境准备
pip install mcp httpx
3.2 服务端实现
import httpx
from mcp.server import Server
from mcp.server.stdio import stdio_server
from mcp.types import Tool, TextContent
app = Server("weather-mcp")
@app.list_tools()
async def list_tools():
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):
if name == "get_weather":
city = arguments["city"]
async with httpx.AsyncClient() as client:
# 调用第三方天气API
resp = await client.get(
f"https://wttr.in/{city}?format=j1"
)
data = resp.json()
current = data["current_condition"][0]
result = f"{city} 当前天气:{current['weatherDesc'][0]['value']},温度 {current['temp_°C']}°C,湿度 {current['humidity']}%"
return [TextContent(type="text", text=result)]
async def main():
async with stdio_server() as (read_stream, write_stream):
await app.run(read_stream, write_stream, app.create_initialization_options())
if __name__ == "__main__":
import asyncio
asyncio.run(main())
3.3 客户端调用
from mcp.client.streamable_http import streamablehttp_client
from mcp import ClientSession
async def query_weather():
async with streamablehttp_client("http://localhost:8000/mcp") as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
# 列出可用工具
tools = await session.list_tools()
print("可用工具:", [t.name for t in tools.tools])
# 调用工具
result = await session.call_tool("get_weather", {"city": "北京"})
print("结果:", result.content[0].text)
四、MCP 的安全考量
MCP 在设计时就高度关注安全性,核心原则包括:
4.1 用户知情同意
任何 Tool 调用都必须经过用户的明确确认,Server 不能擅自执行高风险操作。
4.2 最小权限原则
Server 只暴露必要的能力范围,客户端可以限制资源访问的边界。
4.3 数据隔离
MCP 不要求 LLM 直接访问原始数据,Server 可以在代理层做脱敏和过滤。
4.4 传输安全
生产环境中推荐使用 TLS 加密传输,本地开发可使用 stdio 避免网络暴露。
五、生产环境最佳实践
5.1 Server 设计原则
- 单一职责:每个 Server 聚焦一类功能(数据库、搜索、通知等)
- 幂等设计:工具调用应可重复执行而不产生副作用
- 超时控制:设置合理的超时时间,避免长时间阻塞
- 错误友好:返回结构化错误信息,让 LLM 能理解和恢复
5.2 性能优化
- 使用连接池复用外部 API 连接
- 对高频查询结果做缓存
- 合理设置 Tool 列表大小,超过 20 个工具时考虑分组加载
5.3 监控与可观测性
- 记录每次 Tool 调用的耗时、成功率和 token 消耗
- 设置异常告警(频繁超时、权限错误等)
- 追踪用户行为模式,优化工具设计
六、MCP 生态现状与未来
截至 2025 年下半年,MCP 生态已初具规模:
- 官方 SDK:Python、TypeScript、Java、Rust、Go 等多语言实现
- 主流框架支持:Claude Desktop、Cursor、Windsurf、Cline 等 IDE 已原生集成
- 开源 Server 仓库:GitHub 上已有 PostgreSQL、Slack、GitHub、Google Drive 等数十种官方和社区的 Server 实现
- 云服务商:AWS、Google Cloud 均在探索 MCP 的云端托管方案
MCP 正在成为 AI Agent 工具调用的事实标准。随着更多厂商的加入和协议的演进,我们有理由相信,未来的 AI 应用开发将呈现出"写一次 Tool,到处可接入"的理想图景。
七、总结
MCP 协议填补了 LLM 应用生态中工具调用标准化的空白:
- 它用 JSON-RPC 2.0 定义了统一的通信格式
- 通过 Host-Client-Server 架构实现了安全的解耦设计
- 三大原语(Tools、Resources、Prompts)覆盖了 Agent 与外部世界交互的核心需求
- 开源生态正在快速壮大,主流 IDE 和框架已广泛支持
对于 AI 应用开发者而言,理解并拥抱 MCP 将是构建下一代 Agent 应用的必备技能。

发表评论 取消回复