MCP

36 阅读5分钟

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