Documentation
      ¶
    
    
  
    
  
    Overview ¶
This file implements the core protocol layer for JSON-RPC communication in the MCP SDK. It handles the protocol-level concerns of JSON-RPC messaging, including request/response correlation, progress tracking, request cancellation, and error handling.
Key Components:
1. Protocol:
- Core type managing JSON-RPC communication
 - Handles message correlation and lifecycle
 - Supports:
 - Request/Response with timeouts
 - Notifications (one-way messages)
 - Progress updates during long operations
 - Request cancellation
 - Error propagation
 
2. Request Handling:
- Automatic request ID generation
 - Context-based cancellation
 - Configurable timeouts
 - Progress callback support
 - Response correlation using channels
 
3. Message Types:
- JSONRPCRequest: Outgoing requests with IDs
 - JSONRPCNotification: One-way messages
 - JSONRPCError: Error responses
 - Progress: Updates during long operations
 
4. Handler Registration:
- Request handlers for method calls
 - Notification handlers for events
 - Progress handlers for long operations
 - Error handlers for protocol errors
 
Thread Safety:
- All public methods are thread-safe
 - Uses sync.RWMutex for state protection
 - Safe for concurrent requests and handlers
 
Usage:
transport := NewStdioTransport()
protocol := NewProtocol(transport)
// Start protocol
protocol.Connect(transport)
defer protocol.Close()
// Make a request
ctx := context.Background()
response, err := protocol.Request(ctx, "method", params, &RequestOptions{
    Timeout: 5 * time.Second,
    OnProgress: func(p Progress) {
        // Handle progress updates
    },
})
Error Handling:
- Context-based cancellation
 - Timeout management
 - Proper cleanup of pending requests
 - Detailed error information
 
For more details, see the test file protocol_test.go.
Index ¶
- Constants
 - type Progress
 - type ProgressCallback
 - type Protocol
 - func (p *Protocol) Close() error
 - func (p *Protocol) Connect(tr transport.Transport) error
 - func (p *Protocol) Notification(method string, params interface{}) error
 - func (p *Protocol) RemoveNotificationHandler(method string)
 - func (p *Protocol) RemoveRequestHandler(method string)
 - func (p *Protocol) Request(ctx context.Context, method string, params interface{}, opts *RequestOptions) (interface{}, error)
 - func (p *Protocol) SetNotificationHandler(method string, ...)
 - func (p *Protocol) SetRequestHandler(method string, ...)
 
- type ProtocolOptions
 - type RequestHandlerExtra
 - type RequestOptions
 - type Result
 - type ResultMeta
 
Constants ¶
const DefaultRequestTimeoutMsec = 60000
    Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type ProgressCallback ¶
type ProgressCallback func(progress Progress)
ProgressCallback is a callback for progress notifications
type Protocol ¶
type Protocol struct {
	// Callback for when the connection is closed for any reason
	OnClose func()
	// Callback for when an error occurs
	OnError func(error)
	// Handler to invoke for any request types that do not have their own handler installed
	FallbackRequestHandler func(ctx context.Context, request *transport.BaseJSONRPCRequest) (transport.JsonRpcBody, error)
	// Handler to invoke for any notification types that do not have their own handler installed
	FallbackNotificationHandler func(notification *transport.BaseJSONRPCNotification) error
	// contains filtered or unexported fields
}
    Protocol implements MCP protocol framing on top of a pluggable transport, including features like request/response linking, notifications, and progress
func NewProtocol ¶
func NewProtocol(options *ProtocolOptions) *Protocol
NewProtocol creates a new Protocol instance
func (*Protocol) Connect ¶
Connect attaches to the given transport, starts it, and starts listening for messages
func (*Protocol) Notification ¶
Notification emits a notification, which is a one-way message that does not expect a response
func (*Protocol) RemoveNotificationHandler ¶
RemoveNotificationHandler removes the notification handler for the given method
func (*Protocol) RemoveRequestHandler ¶
RemoveRequestHandler removes the request handler for the given method
func (*Protocol) Request ¶
func (p *Protocol) Request(ctx context.Context, method string, params interface{}, opts *RequestOptions) (interface{}, error)
Request sends a request and waits for a response
func (*Protocol) SetNotificationHandler ¶
func (p *Protocol) SetNotificationHandler(method string, handler func(notification *transport.BaseJSONRPCNotification) error)
SetNotificationHandler registers a handler to invoke when this protocol object receives a notification with the given method
func (*Protocol) SetRequestHandler ¶
func (p *Protocol) SetRequestHandler(method string, handler func(context.Context, *transport.BaseJSONRPCRequest, RequestHandlerExtra) (transport.JsonRpcBody, error))
SetRequestHandler registers a handler to invoke when this protocol object receives a request with the given method
type ProtocolOptions ¶
type ProtocolOptions struct {
	// Whether to restrict emitted requests to only those that the remote side has indicated
	// that they can handle, through their advertised capabilities.
	EnforceStrictCapabilities bool
}
    ProtocolOptions contains additional initialization options
type RequestHandlerExtra ¶
type RequestHandlerExtra struct {
	// Context used to communicate if the request was cancelled from the sender's side
	Context context.Context
}
    RequestHandlerExtra contains extra data given to request handlers
type RequestOptions ¶
type RequestOptions struct {
	// OnProgress is called when progress notifications are received from the remote end
	OnProgress ProgressCallback
	// Context can be used to cancel an in-flight request
	Context context.Context
	// Timeout specifies a timeout for this request. If exceeded, an error with code
	// RequestTimeout will be returned. If not specified, DefaultRequestTimeoutMsec will be used
	Timeout time.Duration
}
    RequestOptions contains options that can be given per request
type Result ¶
type Result struct {
	// This result property is reserved by the protocol to allow clients and servers
	// to attach additional metadata to their responses.
	Meta ResultMeta `json:"_meta,omitempty" yaml:"_meta,omitempty" mapstructure:"_meta,omitempty"`
	AdditionalProperties interface{} `mapstructure:",remain"`
}
    type ResultMeta ¶
type ResultMeta map[string]interface{}
This result property is reserved by the protocol to allow clients and servers to attach additional metadata to their responses.