Model Context Protocol (MCP) 是一个开放标准,用于标准化 AI 模型与外部数据和工具的连接方式。它被称为”AI 时代的 USB 协议”。
什么是 MCP?
在构建 AI 应用(如 Agent、IDE 助手)时,我们经常需要连接本地文件、数据库、API 等外部资源。传统做法是为每个数据源编写特定的连接器。
MCP 提供了一种通用协议,只需编写一次 MCP Server,任何支持 MCP 的 Client(如 Claude Desktop, Cursor, Windsurf)都可以连接和使用它。
核心价值:
- 标准化:统一的数据和工具接口
- 互操作性:写一次,到处运行
- 安全性:可控的资源访问权限
架构组件
MCP 协议包含三个主要角色:
flowchart LR
A[MCP Host] <--> B[MCP Client]
B <--> C[MCP Server]
C <--> D[Local Resources]
C <--> E[Remote APIs]| 组件 | 说明 | 示例 |
|---|---|---|
| MCP Host | 运行 AI 模型的宿主应用 | Claude Desktop, Cursor, Windsurf |
| MCP Client | Host 内部负责与 Server 通信的模块 | (内置在 Host 中) |
| MCP Server | 提供特定资源或工具的服务程序 | Postgres Server, Git Server, File System Server |
核心能力
MCP 定义了三种主要的原语:
1. Resources (资源)
类似于文件,是 AI 可以读取的数据。
- 特点:被动读取,包含内容和元数据
- 示例:数据库记录、API 响应日志、本地配置文件
- URI:使用自定义协议,如
postgres://users/1
2. Tools (工具)
AI 可以执行的函数(即 Function Calling)。
- 特点:主动执行,可能有副作用
- 示例:
execute_sql,git_commit,send_email - 流程:AI 请求调用 → Client 执行 → 返回结果
3. Prompts (提示词)
预定义的 Prompt 模板,用于规范化交互。
- 特点:可复用的指令片段
- 示例:
summarize-code,explain-error - 用途:帮助用户快速启动特定任务
开发 MCP Server
Python 示例
使用 mcp 官方 SDK 开发一个简单的计算器 Server。
安装依赖:
pip install mcp
代码实现 (server.py):
from mcp.server.fastmcp import FastMCP
# 创建 Server
mcp = FastMCP("Calculator")
# 定义工具
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
@mcp.tool()
def multiply(a: int, b: int) -> int:
"""Multiply two numbers"""
return a * b
# 定义资源
@mcp.resource("config://app")
def get_config() -> str:
"""Get application configuration"""
return '{"version": "1.0", "mode": "debug"}'
# 运行
if __name__ == "__main__":
mcp.run()
运行方式
MCP Server 通常通过 Stdio(标准输入输出)运行,由 Host 启动。
# 命令行测试
python server.py
在 Claude Desktop 中配置
要让 Claude Desktop 使用你的 MCP Server,需编辑配置文件:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
{
"mcpServers": {
"my-calculator": {
"command": "python",
"args": ["/path/to/server.py"]
}
}
}
重启 Claude Desktop 后,Claude 就能看到并调用 add 和 multiply 工具。
调试与测试
MCP Inspector
官方提供的调试工具,可以在浏览器中测试 MCP Server。
npx @modelcontextprotocol/inspector python server.py
这将启动一个 Web 界面,你可以在其中:
- 查看 Server 暴露的 Tools 和 Resources
- 手动调用 Tool 测试功能
- 查看通信日志
现有 MCP Server 生态
社区已经提供了许多现成的 MCP Server,无需重复造轮子:
| Server | 功能 |
|---|---|
| Filesystem | 允许 AI 读写本地文件 |
| Postgres | 只读访问数据库模式和数据 |
| Git | 读取 Git 历史、diff、提交信息 |
| Brave Search | 网页搜索能力 |
| Slack | 读取频道消息,发送消息 |
| Google Drive | 访问云端文档 |
GitHub 官方列表:github.com/modelcontextprotocol/servers
MCP vs Function Calling
| 特性 | Function Calling (OpenAI) | MCP |
|---|---|---|
| 范围 | 单个 LLM 会话 | 跨应用、系统级 |
| 定义位置 | API 请求的 tools 参数中 | 独立的 Server 进程中 |
| 生命周期 | 请求级别 | 长期运行的服务 |
| 连接方式 | 开发者手动实现回调 | 标准协议自动连接 |
| 适用场景 | 简单的临时工具 | 复杂的本地/远程资源集成 |
最佳实践
- 安全性优先:MCP Server 运行在本地,可能访问敏感数据。务必限制 Tool 的权限(如只读模式)。
- 单一职责:一个 Server 最好只负责一类资源(如 Git Server 只管 Git,不要混入 Docker 管理)。
- 错误处理:Tool 的错误应该返回清晰的文本消息,让 AI 能够自我纠正。
- 日志记录:通过 stderr 输出日志,方便 Host 捕获和调试。