MCP协议规范
MCP 基础协议层Json-RPC 2.0
Json-RPC 2.0
协议的定位与标准状态
- 轻量级,语言无关,传输无关的远程过程调用协议
- 只规定语义,不规定如何传输-可应用在http,TCP,WebSocket,Stdio,SSE,消息队列等
消息抽象模型
- Request- 客户端服务端,期待响应
interface JSONRPCRequest {
jsonrpc:"2.0";
id: string | number;
method: string;
params?: object
}
- Response- 服务端-客户端,只出现在Reuqest之后
interface JSONRPCResponse {
jsonrpc:"2.0";
id: string | number;
result?: any;
error?: JSONRPCError
}
- 错误对象
interface JSONRPCError {
code:number;
message: string;
data?: any
}
- 通知消息
interface JSONRPCNotification {
jsonrpc:"2.0";
method: string;
params?: object
}
消息格式必须UTF-8 Json Object
- 公共字段 jsonrpc:"2.0"
- id String|Number|Null (Request/Response 必须相同;Notification 必须省略)
Request专有(result/error)
- result: Any
- params: Array| Object
Response 专有
- result Any
- error Error Object
标准错误代码-mcp 使用json-rpc2.0标准错误代码,并扩展了部分MCP特定的错误代码
enum JSONRPCErrorCode {
PARSE_ERROR =-32700, // 解析错误
INVALID_REQUEST = -32600, // 无效的请求
METHOD_NOT_FOUND =-32601, // 方法不存在
INVALID_PARAMS =-32602, // 无效参数
INTERNAL_ERROR =-32603, // 内部错误
// MCP 扩展的错误代码
TOOL_NOT_FOUND=-32000, // 工具不存在
RESOURCE_NOT_FOUND =-32001 // 资源不存在
PERMISSION_DENIDE =-32002 // 权限拒绝
RATE_LIMITED = -32003 // 速率限制
TIMEOUT = -32004 // 超时
INVALID_TOOL_INPUT =-32005 // 工具输入无效
}
传输规范-传输协议
mcp 支持多种传输协议,其只对传输内容格式进行标准化定义,传输方法任意
http/https
- 基本配置
{
"transport":{
"type":"http",
"host":"localhost",
"port":8080,
"path":"mcp",
"secure"true
"headers":{
"Content-Type":"application/json",
"User-Agent":"MCP-Client/1.0"
}
}
}
- 请求示例
POST /MCP HTTP/1.1
HOST: localhost:8080
CONTENT_TYPE:application/json
CONTENT_LENGTH:156
{
"jsonrpc":"2.0",
"id":1,
"method": "tools/call",
"params":{
"name": "get_weather",
"arguments":{
"city": "北京"
}
}
}
- 相应示例
HTTP/1.1 200 OK
CONTENT_TYPE:application/json
CONTENT_LENGTH:243
{
"jsonrpc":"2.0",
"id":1,
"result":{
"content":[
{
"type": "text",
"text":" 北京当前的温度25,天气晴朗"
}
]
}
}
websocket
studio - 适合进程间的通信以及命令行间的通信
消息层规范
sequenceDiagram
MCP CLIENT->> MCP SERVER: initialize(协议版本,能力声明)
MCP SERVER-) MCP CLIENT: initialized (服务器信息,能力确认)
MCP CLIENT-) MCP SERVER: tools/list (获取工具列表)
MCP SERVER-) MCP CLIENT: 工具列表
MCP CLIENT-) MCP SERVER: resources/list (获取可用资源列表)
MCP SERVER-) MCP CLIENT: 资源列表
核心概念
mcp 架构深度解析
架构设计原则
- 松耦合
- 模块化设计
- 清晰职责边界
- 标准化接口
- 高性能
核心架构组件
MCP 采用分层架构,每一层具有明确的职责
- 应用层:提供用户界面与AI模型
- 协议层:处理MCP通信以及消息路由
- 服务层:实现具体的工具与功能
- 资源层: 提供底层的数据服务
MCP 的核心架构模式
客户端-服务器模式
MCP 采用经典的客户端服务器架构
graph LR
subgraph "Host Enviroment"
A[AI Application]
B[MCP Client]
A --> B
end
subgraph "Tool Providers"
C[MCP Server1]
D[MCP Server2]
E[MCP Server3]
end
B-.->C
B-.->D
B-.->E
style B fill:#99ff99
style C fill:#ffcc99
style D fill:#ffcc99
style E fill:#ffcc99
特点
- 一对多的关系,一个客户端可以连接多个服务
- 双向通信,支持请求-响应与主动推送
- 动态连接:运动时动态发现连接服务器
- 安全隔离: 每个连接都是独立与安全的
提示词模版(Prompts)
提示词模版允许MCP服务器为AI模型提供预定义的提示词。
作用
- 引导AI行为,阐述AI如何使用工具
- 提供上下文:给AI提供背景信息
- 标准化交互: 确保一致的AI响应的质量
系统提示词模版示例
@app.prompt ("data_analyst_assistant")
async def data_analyst_prompt()-> str:
"""
数据分析师AI助手的系统提示词
"""
return """
你是一名专业的数据分析师助手,具有一下的能力:
## 核心职责
- 帮助用户分析业务数据
- 提供数据驱动的洞察与建议
- 创建清晰的素具可视化
- 识别数据中的趋势与异常
## 可用工具
- query_sales_data: 查询销售数据
- analyze_data: 执行统计分析
- create_chart: 生成数据图表
- export_report: 导出分析报告
## 工作流程
1.理解用户的需求分析
2.选择合适的数据源与工具
3.执行数据查询与分析
4.提供清晰的结论与建议
5. 如需要,生成可视化的图表
## 回答规范
- 总是先阐述分析思路
- 提供具体的数据支撑
- 使用简单明了的语言
- 主动提出进一步分析的建议
谨记: 目标为帮助用户做出基于数据的明智决策
"""
MCP 的最佳实践
五大核心原则
标准化通信
原则说明: MCP 使用JSON-RPC 2.0 作为通信基础,为所有的实现提供统一的请求,响应以及错误处理格式。
{
"jsonrpc": "2.0",
"method":"tools/call",
"params": {
"name": "weather_forecast",
"arguments": {
"location": "北京",
"days":3
}
}
}
用户为中心的设计
原则说明: 始终优先考量用户同意,控制与透明度
cost toolDefinition= {
name: "file_reader",
description: "读取指定文件内容,需要用户明确授权才能访问文件系统。"
parameters:{
type:"object",
properties:{
filePath:{
type: "string:,
description: "要读取的文件路径(仅用户授权的目录)"
}
}
}
}
// 执行前用户的确认
async function executeFileTool(params:any,userContext: UserContext) {
const userContext = await askUserPermission('是否允许读取文件:${params.filePath} ?',userContext);
if(! userContext) throw new Error("用户拒绝了文件访问请求");
}
安全第一
原则说明: 完备的安全措施,包括身份验证,授权以及速率限制
class SecurityChecker :
"""安全检查器"""
def validate_input (self, user_input: str)->bool:
"""输入验证-防止SQL注入"""
if self.contains_sql_injetion (user_input):
raise SecurityError("检测到潜在的SQL注入攻击")
if self.contains_xss_payload(user_input):
raise SecurityError("检测到潜在的XSS攻击")
return true
def check_rate_limit(self,user_id:str) -> bool
current_requests = self.get_user_request_count(user_id)
if current_requsts > self.MAX_REQUESTS_PER_MINUTE:
raise RateLimitError("请求过于频繁,请稍后重试")
return true
def verify_authorization(self,user:User,resource :str) -> bool:
if not self.haspermission(user,resource):
raise AuthorizationError("用户无权限访问该资源")
return true
模块化架构
原则说明: 设计MCP 服务器采用模块化方法,每个资源与工具有明确,专注的用途-【单一职责】
有状态连接
原则说明: 利用MCP维护多个请求间的状态,实现更为连贯的上下文感知与交互
class ChatSession:
def _init_(self,session_id:str):
self.session_id=session_id
self.conversation_history=[]
self.user_preferences=[]
self.context_data ={}
def add_message(self,role:str,content :str) :
self.conversation_history.append({"role:role,"content": content, "timestamp": datetime.now()"})
if len(self.conversation_history)>50
self.conversation_history = self.conversation_history[-50:]
def get_relevant_context (self, current_query : str) ->dict :
relevant_messages=self.find_relevant_messages(current_query)
return {
"history":relevant_messages,
"preferences": self.user_preferences,
"session_data": self.context_data
}
class ContextAwareReconmendationTool:
def execute (self, request: ToolRequest, session: ChatSession) :
user_history = session.conversion_hisory
preferences= session.user_references
//基于历史与偏好生成推荐
recommendations = self._generate_personalized_recommendations (request,query,user_history,perferences)
return recommendations