全部笔记All notes

MCP 协议详解

阅读 3m 16s3m 16s read

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 ClientHost 内部负责与 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 进程中
生命周期请求级别长期运行的服务
连接方式开发者手动实现回调标准协议自动连接
适用场景简单的临时工具复杂的本地/远程资源集成

最佳实践

  1. 安全性优先:MCP Server 运行在本地,可能访问敏感数据。务必限制 Tool 的权限(如只读模式)。
  2. 单一职责:一个 Server 最好只负责一类资源(如 Git Server 只管 Git,不要混入 Docker 管理)。
  3. 错误处理:Tool 的错误应该返回清晰的文本消息,让 AI 能够自我纠正。
  4. 日志记录:通过 stderr 输出日志,方便 Host 捕获和调试。

相关文档