MCP协议基础
Model Context Protocol(MCP)是由Anthropic推出的开放协议, 旨在标准化AI应用与外部数据源和工具的连接方式。 本文将深入探讨MCP的设计理念、核心概念和实现原理。
预计阅读时间:50分钟·难度:中级·更新时间:2024年4月
MCP协议概述
什么是MCP
Model Context Protocol(模型上下文协议)是一个开放标准, 用于连接AI助手与系统中的数据源、工具和资源。 它提供了一种统一的方式让AI模型安全地访问和操作外部系统。
MCP的核心价值
- 标准化:提供统一的接口规范,避免为每个AI应用单独开发集成
- 安全性:通过明确的权限控制,安全地访问敏感数据
- 可扩展:支持各种类型的资源、工具和提示模板
- 互操作性:不同AI应用可以共享同一套MCP服务器
为什么需要MCP
在MCP出现之前,AI应用与外部系统的集成面临诸多问题:
传统集成方式的痛点
- 每个AI应用需要单独开发与各数据源的连接
- 缺乏统一的安全模型,权限管理混乱
- 数据源变更需要修改多个AI应用
- 工具和资源的定义不统一,难以复用
- 调试和监控困难
MCP解决的问题
- ✅ 一次开发,多处使用:MCP服务器可以被多个AI客户端使用
- ✅ 统一的安全模型:客户端控制访问权限
- ✅ 松耦合架构:数据源变更不影响客户端
- ✅ 标准化接口:易于理解、调试和维护
- ✅ 丰富的生态:社区贡献大量现成的MCP服务器
核心概念
MCP定义了三个核心概念:资源(Resources)、提示模板(Prompts)和工具(Tools)。 这三个概念构成了AI与外部系统交互的完整能力体系。
资源(Resources)
资源是MCP中最基本的概念,代表AI可以读取的数据。 资源可以是文件、数据库记录、API响应等任何结构化或非结构化数据。
资源示例
// 资源定义示例
{
"uri": "file:///path/to/document.md",
"name": "项目文档",
"description": "项目的README文档",
"mimeType": "text/markdown"
}
// 资源类型
- 文件资源:本地或远程文件
- 数据库资源:查询结果、表记录
- API资源:REST/GraphQL接口返回的数据
- 实时资源:日志流、传感器数据提示模板(Prompts)
提示模板是预定义的提示词模板,可以帮助用户快速完成常见任务。 模板支持参数化,可以根据上下文动态生成提示。
提示模板示例
// 提示模板定义
{
"name": "code_review",
"description": "代码审查模板",
"arguments": [
{
"name": "language",
"description": "编程语言",
"required": true
},
{
"name": "focus",
"description": "审查重点",
"required": false
}
]
}
// 使用时生成提示
"请审查以下{language}代码,重点关注{focus}方面..."
→ "请审查以下Python代码,重点关注安全性方面..."工具(Tools)
工具是AI可以调用的函数,用于执行操作或获取动态数据。 工具的定义与OpenAI Function Calling类似。
工具定义示例
// 工具定义
{
"name": "execute_query",
"description": "执行SQL查询",
"inputSchema": {
"type": "object",
"properties": {
"sql": {
"type": "string",
"description": "SQL查询语句"
}
},
"required": ["sql"]
}
}
// 工具特点
- 可执行操作(写入文件、发送消息等)
- 可返回动态数据
- 支持参数验证
- 可控制执行权限架构设计
客户端-服务器模型
MCP采用客户端-服务器架构。MCP服务器提供资源、提示和工具, MCP客户端(AI应用)连接服务器并使用这些能力。
MCP架构图
┌─────────────────────────────────────────────────────────────┐
│ AI 应用(MCP Client) │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Claude │ │ Cursor │ │ 其他AI应用 │ │
│ └──────┬──────┘ └──────┬──────┘ └──────┬──────┘ │
└─────────┼────────────────┼────────────────┼──────────────────┘
│ │ │
└────────────────┼────────────────┘
│ MCP Protocol
┌────────────────┼────────────────┐
│ │ │
┌─────┴─────┐ ┌─────┴─────┐ ┌─────┴─────┐
│ 文件系统 │ │ 数据库 │ │ API服务 │
│ MCP Server│ │ MCP Server │ │ MCP Server│
└───────────┘ └───────────┘ └───────────┘传输层
MCP支持多种传输方式:
传输方式
- stdio:标准输入输出,适合本地进程通信
- HTTP with SSE:HTTP + Server-Sent Events,适合远程服务
- 自定义传输:可根据需要实现自定义传输层
协议流程
能力协商
连接建立后,客户端和服务器会交换能力信息,确定双方支持的功能。
能力协商流程
1. 客户端 → 服务器:initialize
{
"protocolVersion": "2024-11-05",
"capabilities": {
"resources": { "subscribe": true },
"tools": {}
}
}
2. 服务器 → 客户端:initialize响应
{
"protocolVersion": "2024-11-05",
"capabilities": {
"resources": { "list": true, "read": true },
"tools": { "list": true, "execute": true },
"prompts": { "list": true, "get": true }
},
"serverInfo": {
"name": "filesystem-server",
"version": "1.0.0"
}
}
3. 客户端 → 服务器:initialized通知
连接正式建立消息流程
典型消息流程
# 获取资源列表
Client → Server: resources/list
Server → Client: { resources: [...] }
# 读取资源
Client → Server: resources/read { uri: "file:///..." }
Server → Client: { contents: [...] }
# 调用工具
Client → Server: tools/call {
name: "execute_query",
arguments: { sql: "SELECT..." }
}
Server → Client: { content: [...], isError: false }生态现状
官方MCP服务器
- Filesystem:文件系统访问
- PostgreSQL:数据库操作
- GitHub:GitHub API集成
- Google Drive:Google Drive集成
- Slack:Slack消息集成
- Puppeteer:浏览器自动化
支持MCP的客户端
- Claude Desktop:Anthropic官方客户端
- Cursor:AI代码编辑器
- Zed:高性能编辑器
- Continue:VS Code扩展
最佳实践
1. 合理划分服务器
按功能域划分MCP服务器,避免单个服务器过于复杂。
2. 安全优先
严格控制资源访问权限,敏感操作需要用户确认。
3. 提供清晰的描述
资源和工具的描述应该清晰明确,帮助AI理解其用途。
4. 错误处理
提供有意义的错误信息,帮助AI理解失败原因并调整策略。
上一篇
← 多智能体下一篇
MCP Server →