package mcp import "encoding/json" // MCP Protocol constants const ( ProtocolVersion = "2024-11-05" ContentType = "application/json" ) // JSON-RPC 2.0 types type JSONRPCRequest struct { JSONRPC string `json:"jsonrpc"` ID interface{} `json:"id,omitempty"` Method string `json:"method"` Params json.RawMessage `json:"params,omitempty"` } type JSONRPCResponse struct { JSONRPC string `json:"jsonrpc"` ID interface{} `json:"id,omitempty"` Result interface{} `json:"result,omitempty"` Error *RPCError `json:"error,omitempty"` } type RPCError struct { Code int `json:"code"` Message string `json:"message"` Data interface{} `json:"data,omitempty"` } // Standard JSON-RPC error codes var ( ErrParseError = &RPCError{Code: -32700, Message: "Parse error"} ErrInvalidRequest = &RPCError{Code: -32600, Message: "Invalid request"} ErrMethodNotFound = &RPCError{Code: -32601, Message: "Method not found"} ErrInvalidParams = &RPCError{Code: -32602, Message: "Invalid params"} ErrInternal = &RPCError{Code: -32603, Message: "Internal error"} ) // MCP specific types type InitializeParams struct { ProtocolVersion string `json:"protocolVersion"` Capabilities ClientCapabilities `json:"capabilities"` ClientInfo ImplementationInfo `json:"clientInfo"` Meta map[string]interface{} `json:"_meta,omitempty"` } type InitializeResult struct { ProtocolVersion string `json:"protocolVersion"` Capabilities ServerCapabilities `json:"capabilities"` ServerInfo ImplementationInfo `json:"serverInfo"` Instructions string `json:"instructions,omitempty"` } type ClientCapabilities struct { Experimental map[string]interface{} `json:"experimental,omitempty"` Roots *RootsCapability `json:"roots,omitempty"` Sampling *SamplingCapability `json:"sampling,omitempty"` } type RootsCapability struct { ListChanged bool `json:"listChanged,omitempty"` } type SamplingCapability struct{} type ServerCapabilities struct { Experimental map[string]interface{} `json:"experimental,omitempty"` Tools *ToolsCapability `json:"tools,omitempty"` Resources *ResourcesCapability `json:"resources,omitempty"` } type ToolsCapability struct { ListChanged bool `json:"listChanged,omitempty"` } type ResourcesCapability struct { Subscribe bool `json:"subscribe,omitempty"` ListChanged bool `json:"listChanged,omitempty"` } type ImplementationInfo struct { Name string `json:"name"` Version string `json:"version"` } // Tool types type Tool struct { Name string `json:"name"` Description string `json:"description"` InputSchema InputSchema `json:"inputSchema"` } type InputSchema struct { Type string `json:"type"` Properties map[string]Property `json:"properties,omitempty"` Required []string `json:"required,omitempty"` AdditionalProperties bool `json:"additionalProperties"` } type Property struct { Type string `json:"type"` Description string `json:"description,omitempty"` } type ListToolsResult struct { Tools []Tool `json:"tools"` } type CallToolParams struct { Name string `json:"name"` Arguments map[string]interface{} `json:"arguments,omitempty"` } type CallToolResult struct { Content []ContentBlock `json:"content"` IsError bool `json:"isError,omitempty"` } type ContentBlock struct { Type string `json:"type"` Text string `json:"text"` } // Ping type PingResult struct{} // Resource types for subscriptions type Resource struct { URI string `json:"uri"` Name string `json:"name"` Description string `json:"description,omitempty"` MimeType string `json:"mimeType,omitempty"` } type ListResourcesResult struct { Resources []Resource `json:"resources"` } type ReadResourceParams struct { URI string `json:"uri"` } type ReadResourceResult struct { Contents []ResourceContents `json:"contents"` } type ResourceContents struct { URI string `json:"uri"` MimeType string `json:"mimeType,omitempty"` Text string `json:"text,omitempty"` Blob string `json:"blob,omitempty"` // base64 encoded } // Subscription types type SubscribeParams struct { URI string `json:"uri"` } type UnsubscribeParams struct { URI string `json:"uri"` } // Resource update notification type ResourceUpdatedNotification struct { URI string `json:"uri"` Contents ResourceContents `json:"contents"` } // JSON-RPC Notification type JSONRPCNotification struct { JSONRPC string `json:"jsonrpc"` Method string `json:"method"` Params interface{} `json:"params,omitempty"` } // CreateResourceNotification creates a JSON-RPC notification for resource updates func CreateResourceNotification(uri string, data interface{}) *JSONRPCNotification { // Marshal the data to JSON dataBytes, err := json.Marshal(data) if err != nil { dataBytes = []byte("{}") } return &JSONRPCNotification{ JSONRPC: "2.0", Method: "notifications/resources/updated", Params: ResourceUpdatedNotification{ URI: uri, Contents: ResourceContents{ URI: uri, MimeType: "application/json", Text: string(dataBytes), }, }, } }