🔌 MCP 协议详解
MCP (Model Context Protocol) 是由 Anthropic 于 2024 年底推出的开放协议,旨在为 AI 模型与外部工具/数据源之间建立标准化的通信接口。类比 USB-C 之于硬件外设,MCP 旨在成为 AI 领域的"通用接口"。
🌟 起源与设计理念
❌ MCP 出现之前
- 每个 AI 应用各自实现工具集成
- 工具接口碎片化,缺乏统一标准
- 工具开发者需适配每个 AI 平台
- 重复造轮子,维护成本高
✅ MCP 的设计目标
- 一次编写,到处运行 —— Server 实现一次,所有 MCP Client 可用
- 标准化接口 —— 统一工具发现、调用、结果返回
- 安全可控 —— 用户明确授权,最小权限原则
- 可扩展 —— 支持社区贡献的第三方 Server
🏗️ 架构设计
MCP 三层架构
🖥️ MCP Host
Claude Desktop / IDE / 应用
↕ JSON-RPC
🔗 MCP Client
协议客户端 · 连接管理
↕ Transport (stdio / HTTP SSE)
🛠️ MCP Server
工具 · 资源 · 提示模板
核心概念
- MCP Host
- 运行 MCP Client 的宿主应用(如 Claude Desktop、VS Code、自建应用)
- MCP Client
- 与 MCP Server 建立 1:1 连接的协议客户端,负责发起请求
- MCP Server
- 暴露工具(Tools)、资源(Resources)、提示模板(Prompts)的服务端
- Transport
- 传输层,支持 stdio(本地进程通信)和 HTTP+SSE(远程通信)
- JSON-RPC 2.0
- 底层通信协议,所有消息均为 JSON-RPC 格式的请求/响应/通知
🔌 Stdio vs HTTP 传输对比
| 特性 | stdio | HTTP + SSE |
|---|---|---|
| 通信方式 | 标准输入/输出流 | HTTP POST + Server-Sent Events |
| 适用场景 | 本地工具(文件系统、数据库、Shell) | 远程工具(云端 API、多用户共享) |
| 连接模型 | 1:1,进程生命周期绑定 | 支持 1:N,长连接可复用 |
| 启动方式 | Client 作为子进程启动 Server | Server 独立运行,Client 主动连接 |
| 安全性 | ✅ 天然隔离,仅限本地 | ⚠️ 需 TLS + 认证授权 |
| 性能 | ✅ 延迟极低 | ⚠️ 有网络开销 |
| 跨机器 | ❌ 仅限本机 | ✅ 任意网络可达 |
| 典型用例 | 本地文件操作、SQLite 查询 | 企业 API 网关、云数据库代理 |
🔄 MCP vs Function Calling
⚠️ 关键理解:不是替代,是互补
MCP 和 Function Calling 解决的是不同层面的问题。Function Calling 是模型能力(LLM 如何输出工具调用),MCP 是接口协议(工具如何被标准化地发现和调用)。
| 维度 | Function Calling | MCP |
|---|---|---|
| 定位 | LLM 的原生工具调用能力 | 工具与 AI 应用间的标准接口协议 |
| 层次 | 模型层 | 传输/接口层 |
| 定义方 | 模型厂商(OpenAI、Anthropic 等) | Anthropic 开源协议 |
| 标准化 | 各厂商格式不统一 | ✅ 统一 JSON-RPC 接口 |
| 工具发现 | 需手动注册 Schema | ✅ 自动发现(list_tools) |
| 资源管理 | 不涉及 | ✅ 资源模板、URI 管理 |
| 协作关系 | 模型输出 tool_calls | Client 将 MCP tools 转为 FC Schema 发给模型 |
典型协作流程
MCP Server —tools/list →→ MCP Client —转为 FC Schema →→ LLM
LLM —tool_calls →→ MCP Client —tools/call →→ MCP Server
LLM —tool_calls →→ MCP Client —tools/call →→ MCP Server
🌍 MCP 生态现状
✅ 官方支持
Claude Desktop、Anthropic API 原生集成 MCP
🔌 SDK 覆盖
Python、TypeScript、Java、Kotlin 官方 SDK
🏢 企业采用
Block、Apollo、Replit、Codeium 等已集成
🔄 社区生态
开源 Server 快速增长,覆盖数据库、文件、API 等领域
📦 MCP Server 示例
| Server | 类别 | 功能 | 传输方式 | 官方/社区 |
|---|---|---|---|---|
| @modelcontextprotocol/server-filesystem | 文件系统 | 读写文件、目录操作、搜索 | stdio | 官方 |
| @modelcontextprotocol/server-postgres | 数据库 | PostgreSQL 只读查询 | stdio | 官方 |
| @modelcontextprotocol/server-sqlite | 数据库 | SQLite 数据库操作 | stdio | 官方 |
| @modelcontextprotocol/server-github | API | 仓库管理、PR、Issue 操作 | stdio | 官方 |
| @modelcontextprotocol/server-brave-search | 搜索 | Web 搜索和本地搜索 | stdio | 官方 |
| @modelcontextprotocol/server-puppeteer | 浏览器 | 网页截图、自动化操作 | stdio | 官方 |
| @modelcontextprotocol/server-google-maps | API | 地图查询、路线规划 | stdio | 官方 |
| mcp-server-sentry | 监控 | Sentry 错误追踪分析 | stdio | 社区 |
| mcp-server-kubernetes | 基础设施 | K8s 集群管理操作 | stdio | 社区 |
| mcp-server-notion | 生产力 | Notion 页面读写 | stdio | 社区 |
💡 MCP 最佳实践
- 最小权限原则:Server 只暴露必要的工具和资源,限制文件访问路径范围
- 用户授权确认:敏感操作(如文件写入、网络请求)应先获得用户明确许可
- 错误友好处理:返回结构化错误信息,包含错误码和人类可读的描述
- 工具描述精准:清晰的 name + description 帮助 LLM 正确选择工具
- 优先使用 stdio:本地工具优先 stdio,安全且延迟低;远程场景再用 HTTP
- 版本兼容:遵循协议版本协商机制,确保前后兼容
- 资源管理:合理使用 Resource 模板,为大文件提供分页支持