Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 46 additions & 0 deletions mcp/protocol.go
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,8 @@ type CallToolResultFor[Out any] struct {
IsError bool `json:"isError,omitempty"`
}

func (*CallToolResultFor[Out]) mcpResult() {}

// UnmarshalJSON handles the unmarshalling of content into the Content
// interface.
func (x *CallToolResultFor[Out]) UnmarshalJSON(data []byte) error {
Expand All @@ -97,6 +99,7 @@ func (x *CallToolResultFor[Out]) UnmarshalJSON(data []byte) error {
return nil
}

func (x *CallToolParamsFor[Out]) mcpParams() {}
func (x *CallToolParamsFor[Out]) GetProgressToken() any { return getProgressToken(x) }
func (x *CallToolParamsFor[Out]) SetProgressToken(t any) { setProgressToken(x, t) }

Expand All @@ -114,6 +117,7 @@ type CancelledParams struct {
RequestID any `json:"requestId"`
}

func (x *CancelledParams) mcpParams() {}
func (x *CancelledParams) GetProgressToken() any { return getProgressToken(x) }
func (x *CancelledParams) SetProgressToken(t any) { setProgressToken(x, t) }

Expand Down Expand Up @@ -207,6 +211,8 @@ type CompleteParams struct {
Ref *CompleteReference `json:"ref"`
}

func (*CompleteParams) mcpParams() {}

type CompletionResultDetails struct {
HasMore bool `json:"hasMore,omitempty"`
Total int `json:"total,omitempty"`
Expand All @@ -221,6 +227,8 @@ type CompleteResult struct {
Completion CompletionResultDetails `json:"completion"`
}

func (*CompleteResult) mcpResult() {}

type CreateMessageParams struct {
// This property is reserved by the protocol to allow clients and servers to
// attach additional metadata to their responses.
Expand All @@ -245,6 +253,7 @@ type CreateMessageParams struct {
Temperature float64 `json:"temperature,omitempty"`
}

func (x *CreateMessageParams) mcpParams() {}
func (x *CreateMessageParams) GetProgressToken() any { return getProgressToken(x) }
func (x *CreateMessageParams) SetProgressToken(t any) { setProgressToken(x, t) }

Expand All @@ -264,6 +273,7 @@ type CreateMessageResult struct {
StopReason string `json:"stopReason,omitempty"`
}

func (*CreateMessageResult) mcpResult() {}
func (r *CreateMessageResult) UnmarshalJSON(data []byte) error {
type result CreateMessageResult // avoid recursion
var wire struct {
Expand Down Expand Up @@ -291,6 +301,7 @@ type GetPromptParams struct {
Name string `json:"name"`
}

func (x *GetPromptParams) mcpParams() {}
func (x *GetPromptParams) GetProgressToken() any { return getProgressToken(x) }
func (x *GetPromptParams) SetProgressToken(t any) { setProgressToken(x, t) }

Expand All @@ -304,6 +315,8 @@ type GetPromptResult struct {
Messages []*PromptMessage `json:"messages"`
}

func (*GetPromptResult) mcpResult() {}

type InitializeParams struct {
// This property is reserved by the protocol to allow clients and servers to
// attach additional metadata to their responses.
Expand All @@ -315,6 +328,7 @@ type InitializeParams struct {
ProtocolVersion string `json:"protocolVersion"`
}

func (x *InitializeParams) mcpParams() {}
func (x *InitializeParams) GetProgressToken() any { return getProgressToken(x) }
func (x *InitializeParams) SetProgressToken(t any) { setProgressToken(x, t) }

Expand All @@ -338,12 +352,15 @@ type InitializeResult struct {
ServerInfo *Implementation `json:"serverInfo"`
}

func (*InitializeResult) mcpResult() {}

type InitializedParams struct {
// This property is reserved by the protocol to allow clients and servers to
// attach additional metadata to their responses.
Meta `json:"_meta,omitempty"`
}

func (x *InitializedParams) mcpParams() {}
func (x *InitializedParams) GetProgressToken() any { return getProgressToken(x) }
func (x *InitializedParams) SetProgressToken(t any) { setProgressToken(x, t) }

Expand All @@ -356,6 +373,7 @@ type ListPromptsParams struct {
Cursor string `json:"cursor,omitempty"`
}

func (x *ListPromptsParams) mcpParams() {}
func (x *ListPromptsParams) GetProgressToken() any { return getProgressToken(x) }
func (x *ListPromptsParams) SetProgressToken(t any) { setProgressToken(x, t) }
func (x *ListPromptsParams) cursorPtr() *string { return &x.Cursor }
Expand All @@ -371,6 +389,7 @@ type ListPromptsResult struct {
Prompts []*Prompt `json:"prompts"`
}

func (x *ListPromptsResult) mcpResult() {}
func (x *ListPromptsResult) nextCursorPtr() *string { return &x.NextCursor }

type ListResourceTemplatesParams struct {
Expand All @@ -382,6 +401,7 @@ type ListResourceTemplatesParams struct {
Cursor string `json:"cursor,omitempty"`
}

func (x *ListResourceTemplatesParams) mcpParams() {}
func (x *ListResourceTemplatesParams) GetProgressToken() any { return getProgressToken(x) }
func (x *ListResourceTemplatesParams) SetProgressToken(t any) { setProgressToken(x, t) }
func (x *ListResourceTemplatesParams) cursorPtr() *string { return &x.Cursor }
Expand All @@ -397,6 +417,7 @@ type ListResourceTemplatesResult struct {
ResourceTemplates []*ResourceTemplate `json:"resourceTemplates"`
}

func (x *ListResourceTemplatesResult) mcpResult() {}
func (x *ListResourceTemplatesResult) nextCursorPtr() *string { return &x.NextCursor }

type ListResourcesParams struct {
Expand All @@ -408,6 +429,7 @@ type ListResourcesParams struct {
Cursor string `json:"cursor,omitempty"`
}

func (x *ListResourcesParams) mcpParams() {}
func (x *ListResourcesParams) GetProgressToken() any { return getProgressToken(x) }
func (x *ListResourcesParams) SetProgressToken(t any) { setProgressToken(x, t) }
func (x *ListResourcesParams) cursorPtr() *string { return &x.Cursor }
Expand All @@ -423,6 +445,7 @@ type ListResourcesResult struct {
Resources []*Resource `json:"resources"`
}

func (x *ListResourcesResult) mcpResult() {}
func (x *ListResourcesResult) nextCursorPtr() *string { return &x.NextCursor }

type ListRootsParams struct {
Expand All @@ -431,6 +454,7 @@ type ListRootsParams struct {
Meta `json:"_meta,omitempty"`
}

func (x *ListRootsParams) mcpParams() {}
func (x *ListRootsParams) GetProgressToken() any { return getProgressToken(x) }
func (x *ListRootsParams) SetProgressToken(t any) { setProgressToken(x, t) }

Expand All @@ -444,6 +468,8 @@ type ListRootsResult struct {
Roots []*Root `json:"roots"`
}

func (*ListRootsResult) mcpResult() {}

type ListToolsParams struct {
// This property is reserved by the protocol to allow clients and servers to
// attach additional metadata to their responses.
Expand All @@ -453,6 +479,7 @@ type ListToolsParams struct {
Cursor string `json:"cursor,omitempty"`
}

func (x *ListToolsParams) mcpParams() {}
func (x *ListToolsParams) GetProgressToken() any { return getProgressToken(x) }
func (x *ListToolsParams) SetProgressToken(t any) { setProgressToken(x, t) }
func (x *ListToolsParams) cursorPtr() *string { return &x.Cursor }
Expand All @@ -468,6 +495,7 @@ type ListToolsResult struct {
Tools []*Tool `json:"tools"`
}

func (x *ListToolsResult) mcpResult() {}
func (x *ListToolsResult) nextCursorPtr() *string { return &x.NextCursor }

// The severity of a log message.
Expand All @@ -489,6 +517,7 @@ type LoggingMessageParams struct {
Logger string `json:"logger,omitempty"`
}

func (x *LoggingMessageParams) mcpParams() {}
func (x *LoggingMessageParams) GetProgressToken() any { return getProgressToken(x) }
func (x *LoggingMessageParams) SetProgressToken(t any) { setProgressToken(x, t) }

Expand Down Expand Up @@ -550,6 +579,7 @@ type PingParams struct {
Meta `json:"_meta,omitempty"`
}

func (x *PingParams) mcpParams() {}
func (x *PingParams) GetProgressToken() any { return getProgressToken(x) }
func (x *PingParams) SetProgressToken(t any) { setProgressToken(x, t) }

Expand All @@ -569,6 +599,8 @@ type ProgressNotificationParams struct {
Total float64 `json:"total,omitempty"`
}

func (*ProgressNotificationParams) mcpParams() {}

// A prompt or prompt template that the server offers.
type Prompt struct {
// See [specification/2025-06-18/basic/index#general-fields] for notes on _meta
Expand Down Expand Up @@ -606,6 +638,7 @@ type PromptListChangedParams struct {
Meta `json:"_meta,omitempty"`
}

func (x *PromptListChangedParams) mcpParams() {}
func (x *PromptListChangedParams) GetProgressToken() any { return getProgressToken(x) }
func (x *PromptListChangedParams) SetProgressToken(t any) { setProgressToken(x, t) }

Expand Down Expand Up @@ -646,6 +679,7 @@ type ReadResourceParams struct {
URI string `json:"uri"`
}

func (x *ReadResourceParams) mcpParams() {}
func (x *ReadResourceParams) GetProgressToken() any { return getProgressToken(x) }
func (x *ReadResourceParams) SetProgressToken(t any) { setProgressToken(x, t) }

Expand All @@ -657,6 +691,8 @@ type ReadResourceResult struct {
Contents []*ResourceContents `json:"contents"`
}

func (*ReadResourceResult) mcpResult() {}

// A known resource that the server is capable of reading.
type Resource struct {
// See [specification/2025-06-18/basic/index#general-fields] for notes on _meta
Expand Down Expand Up @@ -697,6 +733,7 @@ type ResourceListChangedParams struct {
Meta `json:"_meta,omitempty"`
}

func (x *ResourceListChangedParams) mcpParams() {}
func (x *ResourceListChangedParams) GetProgressToken() any { return getProgressToken(x) }
func (x *ResourceListChangedParams) SetProgressToken(t any) { setProgressToken(x, t) }

Expand Down Expand Up @@ -754,6 +791,7 @@ type RootsListChangedParams struct {
Meta `json:"_meta,omitempty"`
}

func (x *RootsListChangedParams) mcpParams() {}
func (x *RootsListChangedParams) GetProgressToken() any { return getProgressToken(x) }
func (x *RootsListChangedParams) SetProgressToken(t any) { setProgressToken(x, t) }

Expand Down Expand Up @@ -798,6 +836,7 @@ type SetLevelParams struct {
Level LoggingLevel `json:"level"`
}

func (x *SetLevelParams) mcpParams() {}
func (x *SetLevelParams) GetProgressToken() any { return getProgressToken(x) }
func (x *SetLevelParams) SetProgressToken(t any) { setProgressToken(x, t) }

Expand Down Expand Up @@ -873,6 +912,7 @@ type ToolListChangedParams struct {
Meta `json:"_meta,omitempty"`
}

func (x *ToolListChangedParams) mcpParams() {}
func (x *ToolListChangedParams) GetProgressToken() any { return getProgressToken(x) }
func (x *ToolListChangedParams) SetProgressToken(t any) { setProgressToken(x, t) }

Expand All @@ -886,6 +926,8 @@ type SubscribeParams struct {
URI string `json:"uri"`
}

func (*SubscribeParams) mcpParams() {}

// Sent from the client to request cancellation of resources/updated
// notifications from the server. This should follow a previous
// resources/subscribe request.
Expand All @@ -897,6 +939,8 @@ type UnsubscribeParams struct {
URI string `json:"uri"`
}

func (*UnsubscribeParams) mcpParams() {}

// A notification from the server to the client, informing it that a resource
// has changed and may need to be read again. This should only be sent if the
// client previously sent a resources/subscribe request.
Expand All @@ -908,6 +952,8 @@ type ResourceUpdatedNotificationParams struct {
URI string `json:"uri"`
}

func (*ResourceUpdatedNotificationParams) mcpParams() {}

// TODO(jba): add CompleteRequest and related types.

// TODO(jba): add ElicitRequest and related types.
Expand Down
7 changes: 7 additions & 0 deletions mcp/shared.go
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,9 @@ func setProgressToken(p Params, pt any) {

// Params is a parameter (input) type for an MCP call or notification.
type Params interface {
// mcpParams discourages implementation of Params outside of this package.
mcpParams()

// GetMeta returns metadata from a value.
GetMeta() map[string]any
// SetMeta sets the metadata on a value.
Expand All @@ -356,6 +359,9 @@ type RequestParams interface {

// Result is a result of an MCP call.
type Result interface {
// mcpResult discourages implementation of Result outside of this package.
mcpResult()

// GetMeta returns metadata from a value.
GetMeta() map[string]any
// SetMeta sets the metadata on a value.
Expand All @@ -366,6 +372,7 @@ type Result interface {
// Those methods cannot return nil, because jsonrpc2 cannot handle nils.
type emptyResult struct{}

func (*emptyResult) mcpResult() {}
func (*emptyResult) GetMeta() map[string]any { panic("should never be called") }
func (*emptyResult) SetMeta(map[string]any) { panic("should never be called") }

Expand Down