// JSON-RPC 2.0 协议类型定义. // // 本文件只保留数据类型;传输逻辑(帧格式,连接管理)由各 Transport 实现负责, // 请求/响应关联(pending map,nextID)由 Client 负责. // // 早期实现 将 JSON-RPC 类型和传输逻辑混在同一个类里. // 我们将类型单独抽出,使 StdioTransport / SSETransport / HTTPTransport // 都能复用相同的类型定义而不引入循环依赖. package mcp import ( "encoding/json" "fmt" ) // Request 是 JSON-RPC 2.0 请求(有 ID,需要响应). type Request struct { JSONRPC string `json:"jsonrpc"` ID json.RawMessage `json:"id"` Method string `json:"method"` Params any `json:"params,omitempty"` } // Response 是 JSON-RPC 2.0 响应. type Response struct { JSONRPC string `json:"jsonrpc"` ID json.RawMessage `json:"id"` Result json.RawMessage `json:"result,omitempty"` Error *RPCError `json:"error,omitempty"` } // Notification 是 JSON-RPC 2.0 通知(无 ID,不需要响应). type Notification struct { JSONRPC string `json:"jsonrpc"` Method string `json:"method"` Params json.RawMessage `json:"params,omitempty"` } // RPCError 是 JSON-RPC 2.0 错误对象. type RPCError struct { Code int `json:"code"` Message string `json:"message"` Data json.RawMessage `json:"data,omitempty"` } // Error 实现 error 接口. func (e *RPCError) Error() string { if e.Data != nil { return fmt.Sprintf("JSON-RPC error %d: %s (data: %s)", e.Code, e.Message, string(e.Data)) } return fmt.Sprintf("JSON-RPC error %d: %s", e.Code, e.Message) } // rawMessage 用于解析入站消息时区分响应(有 id)和通知(无 id,有 method). // // Client.dispatchLoop 使用此类型做初步路由,避免为每种消息定义独立解析路径. type rawMessage struct { JSONRPC string `json:"jsonrpc"` ID json.RawMessage `json:"id,omitempty"` // 非空("null"/数字/字符串)表示响应 Method string `json:"method,omitempty"` // 非空表示通知 Result json.RawMessage `json:"result,omitempty"` Error *RPCError `json:"error,omitempty"` Params json.RawMessage `json:"params,omitempty"` }