MCP协议
MCP协议
MCP(Model Context Protocol)是 Anthropic 推出的标准化协议,定义了 AI 模型与外部数据源、工具之间的通信方式。在 AI 生态中的角色类似 HTTP 在 Web 中的角色——提供统一接口规范,让不同来源的工具和数据能被 AI 模型统一调用。
MCP 知识结构:
解决的问题
没有 MCP 之前,每接入一个新数据源或工具都需要单独编写集成代码,导致 M×N 复杂度——M 个 AI 应用 × N 个工具 = M×N 个适配器。
MCP 将问题简化为 M+N:每个 AI 应用实现一次 MCP Client,每个工具实现一次 MCP Server,即互相通信。大幅降低集成成本,让工具复用成为可能。
核心概念
MCP 采用客户端-服务器架构,定义三种核心能力:
| 能力 | 说明 | 特点 |
|---|---|---|
| 工具(Tools) | AI 可调用的外部函数 | 由 Server 暴露,AI 根据需求决定调用哪个工具、传什么参数 |
| 资源(Resources) | AI 可读取的数据源 | 被动提供,AI 主动读取,用 URI 标识,支持文本和二进制 |
| 提示(Prompts) | 预定义模板 | 帮助 AI 更好地使用特定工具或处理特定场景 |
架构角色
Host 通过 Client 与 Server 通信。一个 Host 可连接多个 Server,每个 Client-Server 连接独立。Server 之间互不感知,Host 负责协调多个 Server 的工具调用。
| 角色 | 职责 | 示例 |
|---|---|---|
| MCP Host | 发起请求的应用程序 | Claude Code、Cursor |
| MCP Client | 维护与 Server 的 1:1 连接 | 内嵌在 Host 中 |
| MCP Server | 暴露工具/资源/提示 | GitHub Server、文件系统 Server |
MCP 通信架构:
通信机制
| 传输方式 | 适用场景 | 原理 |
|---|---|---|
| stdio | 本地 | Host 启动 Server 作为子进程,通过 stdin/stdout 交换 JSON-RPC 消息 |
| HTTP + SSE | 远程 | Server 作为 HTTP 服务运行,Client 通过 POST 发送请求、SSE 接收流式响应 |
stdio 方式简单高效,不需要网络配置,是 Claude Code 最常用方式。
MCP 工具调用时序:
使用场景
- 本地开发:Claude Code 通过 MCP 连接文件系统、Git、浏览器,实现代码读写、版本控制、网页测试
- 数据查询:MCP Server 封装数据库操作,AI 直接查询 MySQL、MongoDB 等数据源
- API 集成:让 AI 调用天气、邮件、日历等第三方服务
- 企业内部系统:自建 MCP Server,将内部 CRM、ERP 安全暴露给 AI 使用
配置示例
编辑 ~/.claude/settings.json:
{
"mcpServers": {
"github": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-github"],
"env": {
"GITHUB_PERSONAL_ACCESS_TOKEN": "ghp_xxxxx"
}
},
"filesystem": {
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/path/to/dir"]
}
}
}配置后在 Claude Code 中输入 /mcp 查看已注册 Server 和工具列表。命令行添加:
claude mcp add github -- npx -y @modelcontextprotocol/server-github常见问题
排查顺序:先确认 Server 能启动(可执行文件存在),再检查网络连通性,最后看环境变量和工具名冲突。
| 问题 | 原因 | 解决方案 |
|---|---|---|
| Server 启动失败 | 可执行文件未安装 | which uvx 或 npx --version 确认可用,检查代理配置 |
| 工具调用超时 | 远程 Server 网络延迟 | settings.json 的 env 中设置 API_TIMEOUT_MS 增大超时 |
| 环境变量未传递 | Host 不自动继承 shell 环境变量 | 在 env 字段显式声明;敏感信息通过环境变量传递,不要硬编码 |
| 工具名冲突 | 多 Server 暴露同名工具 | 使用语义化名称(如 github_create_issue),Host 按注册顺序调用最后注册的 |