Documentation
¶
Index ¶
- Constants
- Variables
- func AllowedRoots(ctx context.Context) []string
- func ClientSupportsExtension(ctx context.Context, extensionID string) bool
- func ClientSupportsExtensionForRequest(ctx context.Context, extensionID string, requestCapsRaw json.RawMessage) bool
- func ClientSupportsTasks(ctx context.Context) bool
- func ClientSupportsTasksV1(ctx context.Context) bool
- func ClientSupportsUI(ctx context.Context) bool
- func CollectResponseHeaders(ctx context.Context) map[string]string
- func ContentChunkMethodFromContext(ctx context.Context) string
- func ContextWithSession(ctx context.Context, notify NotifyFunc, request RequestFunc, ...) context.Context
- func DecodeDataURI(uri string) (data []byte, mediaType, filename string, err error)
- func DetachForBackground(ctx context.Context) context.Context
- func DetachFromClient(ctx context.Context) context.Context
- func EmitContent(ctx context.Context, requestID json.RawMessage, content Content)
- func EmitLog(ctx context.Context, level LogLevel, logger string, data any)
- func EmitProgress(ctx context.Context, token any, progress, total float64, message string)
- func EmitSSERetry(ctx context.Context, retryAfter time.Duration) error
- func EncodeDataURI(data []byte, mediaType, filename string) string
- func EncodeMRTRStatePlaintext(state MRTRRoundState) (string, error)
- func FileInputArrayProperty(desc FileInputDescriptor) map[string]any
- func FileInputProperty(desc FileInputDescriptor) map[string]any
- func FileMatchesAccept(mediaType, filename string, accept []string) bool
- func FileURIToPath(uri string) string
- func GenerateSchema[T any]() json.RawMessage
- func GetSessionID(ctx context.Context) string
- func HasFileInputs(ctx context.Context) bool
- func HasScope(ctx context.Context, scope string) bool
- func IntPtr(v int) *int
- func IsDataURI(s string) bool
- func IsJSONRPCResponse(data []byte) bool
- func IsPathAllowed(ctx context.Context, path string) bool
- func IsTemplateURI(uri string) bool
- func MCPToSlogLevel(level LogLevel) slog.Level
- func MarshalJSON(v any) ([]byte, error)
- func MarshalNotification(method string, params any) (json.RawMessage, error)
- func Notify(ctx context.Context, method string, params any) bool
- func NotifyElicitationComplete(ctx context.Context, elicitationID string) bool
- func NotifyResourceUpdated(ctx context.Context, uri string)
- func NotifyResourcesChanged(ctx context.Context)
- func ParseWWWAuthenticate(header string) (resourceMetadata string, scopes []string, err error)
- func ReplaceSessionNotifyFunc(ctx context.Context, fn NotifyFunc) context.Context
- func ReplaceSessionRequestFunc(ctx context.Context, fn RequestFunc) context.Context
- func SetAllowedRoots(ctx context.Context, fn func() []string) context.Context
- func SetDetachStrategy(ctx context.Context, strategy DetachStrategy) context.Context
- func SetNotifyResourceUpdated(ctx context.Context, fn func(uri string)) context.Context
- func SetResponseHeader(ctx context.Context, key, value string)
- func SetSSERetryHint(ctx context.Context, fn func(ms int)) context.Context
- func SetSchemaGenerator(sg SchemaGenerator)
- func SetSessionID(ctx context.Context, id string)
- func SignMRTRState(key []byte, state MRTRRoundState, ttl time.Duration) (string, error)
- func SignRequestState(key []byte, taskID string, ttl time.Duration) string
- func StripFileInputKeywords(schema any) any
- func URITemplateVars(uri string) []string
- func ValidateFileInput(uri string, desc *FileInputDescriptor) error
- func VerifyRequestState(key []byte, state string) (taskID string, err error)
- func WithContentChunkMethod(ctx context.Context, method string) context.Context
- func WithResponseHeaderCollector(ctx context.Context) context.Context
- type AuthError
- type AuthValidator
- type AuthorizationDenial
- type BaseContext
- func (bc BaseContext) AllowedRoots() []string
- func (bc BaseContext) AuthClaims() *Claims
- func (bc BaseContext) ClientSupportsExtension(extensionID string) bool
- func (bc BaseContext) ClientSupportsUI() bool
- func (bc BaseContext) DetachFromClient() BaseContext
- func (bc BaseContext) Elicit(req ElicitationRequest) (ElicitationResult, error)
- func (bc BaseContext) EmitLog(level LogLevel, logger string, data any)
- func (bc BaseContext) EmitSSERetry(retryAfter time.Duration) error
- func (bc BaseContext) HasScope(scope string) bool
- func (bc BaseContext) IsPathAllowed(path string) bool
- func (bc BaseContext) Notify(method string, params any) bool
- func (bc BaseContext) NotifyResourceUpdated(uri string)
- func (bc BaseContext) NotifyResourcesChanged()
- func (bc BaseContext) Sample(req CreateMessageRequest) (CreateMessageResult, error)
- func (bc BaseContext) SessionID() string
- type CancelTaskResult
- type CancelTaskResultV1
- type CancelledTask
- type Claims
- type ClaimsProvider
- type ClientCapabilities
- type ClientExtensionCap
- type ClientInfo
- type ClientTasksCap
- type CompletedTask
- type CompletionArgument
- type CompletionCompleteResult
- type CompletionHandler
- type CompletionRef
- type CompletionResult
- type Content
- type ContentChunk
- type CreateMessageRequest
- type CreateMessageResult
- type CreateTaskResult
- type CreateTaskResultV1
- type DetachStrategy
- type DetailedTask
- type DisplayMode
- type ElicitationCap
- type ElicitationCompleteParams
- type ElicitationFormCap
- type ElicitationMeta
- type ElicitationRequest
- type ElicitationResult
- type ElicitationURLCap
- type Error
- type Extension
- type ExtensionCapability
- type ExtensionProvider
- type FailedTask
- type FileInputDescriptor
- type FileTooLargeData
- type FileTooLargeError
- type FileTypeNotAcceptedData
- type FileTypeNotAcceptedError
- type GetTaskResult
- type GetTaskResultV1
- type InitializeResult
- type InputRequest
- type InputRequests
- type InputRequiredResult
- type InputRequiredTask
- type InputResponses
- type ListTasksResultV1
- type LogLevel
- type LogMessage
- type LoggingTransport
- func (t *LoggingTransport) Call(ctx context.Context, req *Request) (*Response, error)
- func (t *LoggingTransport) Close() error
- func (t *LoggingTransport) Connect(ctx context.Context) error
- func (t *LoggingTransport) Notify(ctx context.Context, req *Request) error
- func (t *LoggingTransport) SessionID() string
- type MCPLogHandler
- type MCPLogHandlerOptions
- type MRTRRoundState
- type MethodContext
- type ModelHint
- type ModelPreferences
- type NotificationHandler
- type NotifyFunc
- type PingResult
- type ProgressNotification
- type PromptArgument
- type PromptContext
- type PromptDef
- type PromptHandler
- type PromptMessage
- type PromptRequest
- type PromptResult
- type PromptsCap
- type PromptsListResult
- type RefValidator
- type RelatedTaskMeta
- type RemediationHint
- type Request
- type RequestFunc
- type ResourceContent
- type ResourceContentMeta
- type ResourceContext
- type ResourceDef
- type ResourceHandler
- type ResourceReadContent
- type ResourceRequest
- type ResourceResult
- type ResourceTemplate
- type ResourceTemplatesListResult
- type ResourceUpdatedNotification
- type ResourcesCap
- type ResourcesListResult
- type Response
- func NewAuthorizationDenialError(id []byte, code int, message string, denial AuthorizationDenial) *Response
- func NewErrorResponse(id json.RawMessage, code int, message string) *Response
- func NewErrorResponseWithData(id json.RawMessage, code int, message string, data any) *Response
- func NewResponse(id json.RawMessage, result any) *Response
- func NewURLElicitationRequiredError(id json.RawMessage, message string, data URLElicitationRequiredErrorData) *Response
- type ResultType
- type Root
- type RootsCap
- type RootsListResult
- type SamplingMessage
- type SamplingMeta
- type SchemaGenerator
- type ScopeAwareTokenSource
- type ServerCapabilities
- type ServerInfo
- type ServerRequestHandler
- type Stability
- type TaskError
- type TaskInfo
- type TaskInfoV2
- type TaskStatus
- type TaskSupport
- type TasksCap
- type TasksCapElicitationMethods
- type TasksCapMethod
- type TasksCapRequests
- type TasksCapSamplingMethods
- type TasksCapToolsMethods
- type TemplateHandler
- type TokenSource
- type ToolContext
- func (tc ToolContext) DetachFromClient() ToolContext
- func (tc ToolContext) EmitContent(requestID json.RawMessage, content Content)
- func (tc ToolContext) EmitProgress(token any, progress, total float64, message string)
- func (tc ToolContext) HasInputResponses() bool
- func (tc ToolContext) InputResponse(key string) json.RawMessage
- func (tc ToolContext) InputResponses() InputResponses
- func (tc ToolContext) Progress(progress, total float64, message string)
- func (tc ToolContext) ProgressToken() any
- func (tc ToolContext) RequestInput(reqs InputRequests) (ToolResult, error)
- func (tc ToolContext) RequestState() string
- type ToolDef
- type ToolExecution
- type ToolHandler
- type ToolMeta
- type ToolRequest
- type ToolResult
- type ToolResultMeta
- type ToolsCap
- type ToolsListResult
- type Transport
- type TypedToolOption
- type TypedToolResult
- type UICSPConfig
- type UIMetadata
- type UIVisibility
- type URLElicitationRequiredErrorData
- type UpdateTaskRequest
- type UpdateTaskResult
- type WorkingTask
Constants ¶
const ( // RemediationTypeURL indicates remediation via URL-mode elicitation. // Composes with the existing URLElicitationRequiredError (-32042). RemediationTypeURL = "url" // RemediationTypeOAuthRAR indicates the client should re-authorize with // RFC 9396 Rich Authorization Request authorization_details. The hint // carries an "authorization_details" field at the top level. RemediationTypeOAuthRAR = "oauth_authorization_details" )
SEP-defined remediation hint type values.
const ( // ElicitModeForm is the default form-based elicitation mode. // The server sends a JSON schema and the client renders a form. ElicitModeForm = "form" // ElicitModeURL is the URL-based elicitation mode (SEP-1036). // The server directs the user to a URL for out-of-band interaction. // The MCP client's bearer token remains unchanged. ElicitModeURL = "url" )
Elicitation mode constants (SEP-1036).
const ( FileInputReasonTooLarge = "file_too_large" FileInputReasonTypeNotAccepted = "file_type_not_accepted" )
File-input error reason strings. Pinned by the conformance suite as stable machine-readable identifiers — clients can branch on these without parsing the human-readable message. JS-side bridge errors (ext/ui/assets/file-picker.ts) use the same constants.
const ( // Standard JSON-RPC 2.0 error codes — use only for JSON-RPC protocol errors. ErrCodeParse = -32700 // Invalid JSON ErrCodeInvalidRequest = -32600 // Not a valid JSON-RPC request ErrCodeMethodNotFound = -32601 // Method not found ErrCodeInvalidParams = -32602 // Invalid params ErrCodeInternal = -32603 // Internal JSON-RPC error (marshaling, framework bugs) // ErrCodeServerError is the base of the implementation-defined range (-32000 to -32099). // Avoid using this directly — prefer the MCP-specific codes below. ErrCodeServerError = -32000 // MCP application error codes — outside the JSON-RPC reserved range. // These indicate application-level failures in tool, resource, or prompt handlers. ErrCodeToolExecutionError = -31000 // Tool handler returned an error ErrCodeResourceError = -31001 // Resource handler returned an error ErrCodePromptError = -31002 // Prompt handler returned an error ErrCodeCompletionError = -31003 // Completion handler returned an error // ErrCodeURLElicitationRequired indicates that the request cannot proceed // until the user completes one or more URL-based elicitation flows (SEP-1036). // The error data contains an elicitations array with URL-mode elicitation // requests. Clients should present the URLs to the user and retry after // receiving notifications/elicitation/complete. // // This error code is also the composition point for FineGrainedAuth (UC1): // the authorization denial envelope is additive metadata in the same data // object, alongside the elicitations array. ErrCodeURLElicitationRequired = -32042 )
Standard JSON-RPC 2.0 error codes (https://www.jsonrpc.org/specification#error_object).
Reserved ranges:
-32700 Parse error (invalid JSON) -32600 Invalid Request (not a valid JSON-RPC request) -32601 Method not found -32602 Invalid params -32603 Internal error -32000 to -32099 Server error (implementation-defined)
const AppMIMEType = "text/html;profile=mcp-app"
AppMIMEType is the MIME type for MCP App HTML resources. This profile parameter distinguishes MCP App HTML from regular HTML — hosts use it to decide whether to render in a sandboxed iframe.
const DataURIDefaultMediaType = "text/plain;charset=US-ASCII"
DataURIDefaultMediaType is the media type assumed when a data URI omits the mediatype component (per RFC 2397 §3).
const DataURIPrefix = "data:"
DataURIPrefix is the literal prefix that all data URIs share.
const DefaultContentChunkMethod = "notifications/tools/content_chunk"
DefaultContentChunkMethod is the default notification method for streaming tool content. This is an mcpkit extension — not yet standardized in MCP spec. Override per-server via server.WithContentChunkMethod(method).
const FileInputSchemaKey = "x-mcp-file"
FileInputSchemaKey is the JSON Schema extension keyword used to mark a string property as a file input (SEP-2356). Servers attach a FileInputDescriptor under this key on schema properties of {"type": "string", "format": "uri"} to signal "render a file picker here."
Clients that declare the fileInputs capability encode selected files as RFC 2397 data URIs and pass them as the property's string value.
const MaxCompletionValues = 100
MaxCompletionValues is the MCP spec limit on the number of values in a completion response (schema maxItems: 100).
const MetaKeyAuthorizationContextID = "io.modelcontextprotocol/authorization-context-id"
Retry meta key per SEP-2643. The client MUST echo the server-issued authorizationContextId verbatim under this key on retry.
const PerRequestClientCapsKey = "io.modelcontextprotocol/clientCapabilities"
PerRequestClientCapsKey is the SEP-2575 _meta key under which a client may declare a per-request capability override. The value is shaped like ClientCapabilities and is merged additively on top of the session-level capabilities for the duration of one request.
const StreamableHTTPAccept = "application/json, text/event-stream"
StreamableHTTPAccept is the Accept header value for Streamable HTTP requests. Per MCP spec: clients MUST include both application/json and text/event-stream.
const TasksExtensionID = "io.modelcontextprotocol/tasks"
TasksExtensionID is the protocol extension identifier for SEP-2663 Tasks. Servers advertise it under capabilities.extensions in the initialize response; clients declare support under capabilities.extensions in the initialize request (or per-request via SEP-2575 _meta).
const UIExtensionID = "io.modelcontextprotocol/ui"
UIExtensionID is the extension identifier for MCP Apps. Used in initialize handshake for both server advertisement and client capability declaration.
Variables ¶
var ( ErrNotDataURI = errors.New("not a data URI") ErrMalformedDataURI = errors.New("malformed data URI") ErrNonBase64DataURI = errors.New("data URI is not base64-encoded") ErrInvalidDataURIName = errors.New("data URI name parameter is malformed") )
Sentinel errors returned by DecodeDataURI.
var ( ErrElicitationNotSupported = errors.New("client does not support elicitation") ErrElicitationURLNotSupported = errors.New("client does not support URL-mode elicitation") )
Sentinel errors for elicitation.
var ( ErrFileTooLarge = errors.New("file too large") ErrFileTypeNotAccepted = errors.New("file type not accepted") )
Sentinel errors for callers that just want to test category. The typed errors below carry structured fields; these constants are useful for `errors.Is` checks.
var ErrNoRequestFunc = errors.New("server-to-client requests not available in this context")
ErrNoRequestFunc is returned when Sample() or Elicit() is called outside a session context where server-to-client requests are not available (e.g., no transport wired, or stateless mode).
var ErrRequestStateExpired = errors.New("requestState expired")
ErrRequestStateExpired indicates the payload's expiry is in the past.
var ErrRequestStateInvalidSignature = errors.New("requestState signature invalid")
ErrRequestStateInvalidSignature indicates the HMAC signature did not match — either tampered payload or wrong key.
var ErrRequestStateMalformed = errors.New("requestState malformed")
ErrRequestStateMalformed indicates the encoded requestState couldn't be parsed (missing separator, bad base64, bad JSON inside the payload).
var ErrSamplingNotSupported = errors.New("client does not support sampling")
Sentinel errors for sampling.
Functions ¶
func AllowedRoots ¶ added in v0.1.26
AllowedRoots returns the current enforced roots for the session, or nil if no roots enforcement is configured. The returned slice is the snapshot from the allowed-roots function — it may change on the next call if client roots update.
func ClientSupportsExtension ¶
ClientSupportsExtension checks whether the connected client declared support for the given extension ID during the initialize handshake. Returns false if no session context is present or the client did not advertise the extension.
Usage in a tool handler:
if core.ClientSupportsExtension(ctx, "io.modelcontextprotocol/ui") {
// client can render MCP Apps
}
func ClientSupportsExtensionForRequest ¶ added in v0.2.41
func ClientSupportsExtensionForRequest(ctx context.Context, extensionID string, requestCapsRaw json.RawMessage) bool
ClientSupportsExtensionForRequest reports whether the client supports the given extension at session level (initialize handshake) OR per-request level (SEP-2575 _meta override). Per-request opt-in is additive — it cannot revoke a session-level declaration.
requestCapsRaw is the raw JSON bytes from the SEP-2575 _meta override; the caller extracts it from a typed envelope (e.g., a json.RawMessage field tagged "io.modelcontextprotocol/clientCapabilities" inside _meta). Pass an empty slice if the request had no override.
func ClientSupportsTasks ¶ added in v0.2.41
ClientSupportsTasks checks whether the connected client declared support for the SEP-2663 Tasks extension during the initialize handshake. Equivalent to ClientSupportsExtension(ctx, TasksExtensionID).
func ClientSupportsTasksV1 ¶ added in v0.2.41
ClientSupportsTasksV1 reports whether the connected client declared the v1 ServerCapabilities.Tasks slot during the initialize handshake. Used by hybrid v1+v2 servers to dispatch tasks/* methods to the v1 path when the client opted into v1 (and not the io.modelcontextprotocol/tasks extension).
V2-only servers and clients can ignore this — see ClientSupportsTasks / ClientSupportsExtension(TasksExtensionID) instead.
func ClientSupportsUI ¶
ClientSupportsUI checks whether the connected client declared support for the MCP Apps extension during the initialize handshake. Tool handlers can use this to decide whether to include UI-specific content or fall back to text-only.
func CollectResponseHeaders ¶ added in v0.2.41
CollectResponseHeaders returns a snapshot of the response headers staged on the current request via SetResponseHeader. HTTP transports call this after dispatch returns, before writing response headers. Returns nil when no collector was attached or no headers were staged.
func ContentChunkMethodFromContext ¶ added in v0.1.17
ContentChunkMethodFromContext returns the configured content chunk method, or DefaultContentChunkMethod if not set.
func ContextWithSession ¶
func ContextWithSession(ctx context.Context, notify NotifyFunc, request RequestFunc, logLevel *atomic.Pointer[LogLevel], clientCaps *ClientCapabilities, claims *Claims) context.Context
ContextWithSession returns a context carrying the session's notification state, request sender, client capabilities, and authenticated claims. Exported for use by the server sub-package; tool handlers should use EmitLog, Sample, Elicit, AuthClaims instead.
func DecodeDataURI ¶ added in v0.2.43
DecodeDataURI parses an RFC 2397 base64 data URI as produced by EncodeDataURI. Returns the decoded payload, the media type (with the default substituted when omitted), and the decoded filename from any `name=` parameter (empty when absent).
Non-base64 data URIs are rejected with ErrNonBase64DataURI; SEP-2356 requires the base64 form because payloads are binary.
func DetachForBackground ¶ added in v0.2.41
DetachForBackground returns a context suitable for background goroutines. It preserves session state (notifications, claims, capabilities) but replaces transport-scoped functions with session-level equivalents.
If the server registered a detach strategy (via SetDetachStrategy), it is used. Otherwise, falls back to context.WithoutCancel (preserves values, detaches cancellation).
Use this instead of context.WithoutCancel when spawning goroutines that need to send server-to-client requests (elicitation, sampling) after the original HTTP request has returned.
func DetachFromClient ¶ added in v0.1.25
DetachFromClient returns a context that preserves all session state (EmitLog, EmitSSERetry, Sample, Elicit, AuthClaims, etc.) but is NOT cancelled when the client's HTTP request context is cancelled. Use this in a tool handler that needs to continue processing after the client disconnects — e.g., long-running computations where the result is delivered via EventStore replay on reconnection.
Under the hood, this calls context.WithoutCancel (Go 1.21+), which copies all context Values but strips the parent's Done channel and any inherited deadlines/timeouts.
Important caveats:
Any per-tool timeout (ToolDef.Timeout, WithToolTimeout) set by the server is inherited BEFORE the handler runs. DetachFromClient strips it. If the handler needs a deadline, add one explicitly: ctx = core.DetachFromClient(ctx) ctx, cancel := context.WithTimeout(ctx, 1*time.Hour) defer cancel()
Session idle timeouts (WithSessionTimeout) may reap the session while the detached tool is still running if the client doesn't reconnect within the idle window. Combine with a generous WithSSEGracePeriod to keep the session alive long enough.
Notifications (EmitLog, EmitSSERetry) emitted after the client disconnects are buffered in the EventStore (if configured) and replayed on reconnection. Without an EventStore, they are dropped.
The tool's final ToolResult is still serialized as an SSE event via emitSSEEvent — if the client has disconnected but the session is alive (grace period), the event lands in the store and is replayed.
Example:
func longRunningTool(ctx context.Context, req core.ToolRequest) (core.ToolResult, error) {
// Hint the client to reconnect in 5 minutes
core.EmitSSERetry(ctx, 5*time.Minute)
// Detach: tool keeps running even if the client drops the connection
ctx = core.DetachFromClient(ctx)
// Long computation — ctx.Done() no longer fires on client disconnect
result := doExpensiveWork(ctx)
return core.TextResult(result), nil
}
func EmitContent ¶ added in v0.1.17
func EmitContent(ctx context.Context, requestID json.RawMessage, content Content)
EmitContent sends a partial content block to the client during tool execution. Each call emits a notification via the session's notify function, delivered as an SSE event on streaming transports.
On non-streaming transports (JSON response path), the notification is silently dropped — the final ToolResult is the only response.
The tool's final ToolResult should contain the complete aggregated content. Streaming chunks are a preview for responsive UX; the final result is authoritative.
Example:
func myTool(ctx context.Context, req core.ToolRequest) (core.ToolResult, error) {
core.EmitContent(ctx, req.RequestID, core.Content{Type: "text", Text: "Step 1..."})
// ... work ...
core.EmitContent(ctx, req.RequestID, core.Content{Type: "text", Text: "Step 2..."})
return core.TextResult("Complete"), nil
}
func EmitLog ¶
EmitLog sends a notifications/message to the connected client if the session's log level allows it. Safe to call even if no session context is present (no-op).
level is the severity of the message. logger is an optional logger name (typically the tool or subsystem name). data is the log payload (string, map, etc.).
Usage in a tool handler:
func myHandler(ctx context.Context, req mcpkit.ToolRequest) (mcpkit.ToolResult, error) {
mcpkit.EmitLog(ctx, mcpkit.LogInfo, "my-tool", "processing started")
// ... do work ...
return mcpkit.TextResult("done"), nil
}
func EmitProgress ¶
EmitProgress sends a notifications/progress to the connected client. Safe to call even if no session context is present or if token is nil (both are no-ops).
token is the ProgressToken from the ToolRequest — pass req.ProgressToken directly. progress is the current progress value, total is the expected total (0 for indeterminate). message is an optional human-readable status string.
Usage in a tool handler:
func myHandler(ctx context.Context, req mcpkit.ToolRequest) (mcpkit.ToolResult, error) {
mcpkit.EmitProgress(ctx, req.ProgressToken, 0, 100, "starting")
// ... do work ...
mcpkit.EmitProgress(ctx, req.ProgressToken, 50, 100, "halfway")
// ... more work ...
mcpkit.EmitProgress(ctx, req.ProgressToken, 100, 100, "done")
return mcpkit.TextResult("complete"), nil
}
func EmitSSERetry ¶ added in v0.1.23
EmitSSERetry emits an SSE "retry:" hint to the connected client on the current session's SSE stream. The retryAfter duration is rounded down to whole milliseconds and sent to the client as the next reconnection delay.
No-op on non-SSE transports (stdio, in-process, Streamable HTTP responses that chose the JSON path over SSE). Returns nil in all cases — callers don't need to branch on transport type.
Non-positive durations are dropped (no hint emitted). The servicekit writer additionally drops zero/negative retry values to prevent "reconnect immediately" thundering herds.
Thread safety: safe to call from any goroutine spawned by the handler. Delivery is asynchronous — the function returns as soon as the message is enqueued on the SSE hub writer.
Usage in a tool handler:
func longRunningTool(ctx context.Context, req mcpkit.ToolRequest) (mcpkit.ToolResult, error) {
// Tell the client to back off for 30s before reconnecting if the
// connection drops. The tool continues running regardless.
mcpkit.EmitSSERetry(ctx, 30*time.Second)
// ...do long work...
return mcpkit.TextResult("done"), nil
}
func EncodeDataURI ¶ added in v0.2.43
EncodeDataURI builds an RFC 2397 base64 data URI suitable for SEP-2356 file inputs. mediaType is embedded verbatim (e.g. "image/png"); pass an empty string to omit it (the consumer will assume text/plain;charset=US-ASCII per RFC 2397). filename is optional; if non-empty it is percent-encoded and emitted as a `name=` parameter.
func EncodeMRTRStatePlaintext ¶ added in v0.2.41
func EncodeMRTRStatePlaintext(state MRTRRoundState) (string, error)
EncodeMRTRStatePlaintext returns a base64url-encoded JSON of state with no integrity guarantee — used by the dispatcher in plaintext mode when no signing key is configured. The encoded form is parseable but trivially forgeable; SEP-2322 servers without a signing key must treat it as untrusted regardless.
func FileInputArrayProperty ¶ added in v0.2.43
func FileInputArrayProperty(desc FileInputDescriptor) map[string]any
FileInputArrayProperty builds a JSON Schema property for an array of file inputs. The returned map is shaped as `{"type": "array", "items": {"type": "string", "format": "uri", "x-mcp-file": desc}}`.
func FileInputProperty ¶ added in v0.2.43
func FileInputProperty(desc FileInputDescriptor) map[string]any
FileInputProperty builds a JSON Schema property for a single file input. The returned map is shaped as `{"type": "string", "format": "uri", "x-mcp-file": desc}` and is suitable for embedding in a tool's inputSchema properties.
func FileMatchesAccept ¶ added in v0.2.44
FileMatchesAccept implements the SEP-2356 accept-pattern matcher. Pattern rules — same set as the JS-side bridge matcher in ext/ui/assets/file-picker.ts so both sides agree on what passes:
- "image/png" — exact MIME match (case-sensitive on type, as RFC 6838)
- "image/*" — wildcard subtype match (prefix on `type/`)
- ".pdf" — extension match against filename suffix (case-insensitive)
Empty / nil accept means anything matches.
func FileURIToPath ¶ added in v0.1.26
FileURIToPath converts a file:// URI to a local filesystem path. Returns the path portion with the "file://" prefix stripped. Returns the input unchanged if it doesn't have a file:// prefix. Used by the server dispatch layer to convert client-provided root URIs to paths for IsPathAllowed.
func GenerateSchema ¶ added in v0.2.26
func GenerateSchema[T any]() json.RawMessage
GenerateSchema derives a JSON Schema from a Go type using the current schema generator. Panics if no generator is set.
func GetSessionID ¶ added in v0.2.41
GetSessionID returns the session ID from a raw context.Context. For use in middleware that doesn't have a typed BaseContext. Returns empty string if no session context is present.
func HasFileInputs ¶ added in v0.2.43
HasFileInputs reports whether the connected client declared the SEP-2356 fileInputs capability during the initialize handshake. Servers consult this before advertising x-mcp-file in tool inputSchemas — per spec, the keyword MUST NOT appear if the client cannot handle it.
func HasScope ¶
HasScope checks if the context's authenticated claims include the given scope. Returns false if no claims are present.
func IntPtr ¶ added in v0.2.41
IntPtr returns a pointer to the given int. Convenience for setting TaskInfo.TTL.
func IsDataURI ¶ added in v0.2.43
IsDataURI reports whether s starts with the "data:" scheme prefix. Cheap prefix check; use DecodeDataURI to actually parse.
func IsJSONRPCResponse ¶
isJSONRPCResponse detects whether raw JSON is a JSON-RPC response (not a request). A response has an "id" field and either "result" or "error", but no "method" field. Used by transports to route incoming client messages that are responses to server-to-client requests (sampling/createMessage, elicitation/create).
func IsPathAllowed ¶ added in v0.1.26
IsPathAllowed reports whether the given file path falls within at least one of the session's enforced roots. Returns true if:
- No session context is present (bare context, no sandbox)
- No allowed-roots function is installed (no WithAllowedRoots, no client roots)
- The allowed-roots function returns nil (no restriction)
Returns false if the allowed-roots function returns a non-nil empty slice (explicit "nothing allowed") or the path doesn't match any root.
Path matching uses cleaned, directory-prefix semantics: "/workspace" allows "/workspace/src/main.go" but NOT "/workspace-other/y". Both the root and the path are cleaned via filepath.Clean before comparison.
func IsTemplateURI ¶ added in v0.2.4
IsTemplateURI reports whether uri is a valid RFC 6570 URI template with at least one variable expression.
func MCPToSlogLevel ¶ added in v0.2.28
MCPToSlogLevel maps an MCP LogLevel to the nearest slog.Level.
LogDebug, LogNotice → slog.LevelDebug / slog.LevelInfo LogInfo → slog.LevelInfo LogWarning → slog.LevelWarn LogError → slog.LevelError LogCritical+ → slog.LevelError + 4
func MarshalJSON ¶ added in v0.2.19
MarshalJSON encodes v as JSON without HTML-escaping <, >, &. Go's json.Marshal escapes these to \u003c/\u003e/\u0026 for HTML safety, but JSON-RPC payloads are not HTML contexts. This matches how Node.js and Python serialize JSON.
func MarshalNotification ¶
func MarshalNotification(method string, params any) (json.RawMessage, error)
MarshalNotification builds a JSON-RPC notification (no id field). Exported for use by the server transport sub-package.
func Notify ¶
Notify sends an arbitrary server-to-client JSON-RPC notification. Returns false if no notification sender is available in the context. This is the low-level API; prefer EmitLog for logging notifications.
func NotifyElicitationComplete ¶ added in v0.2.41
NotifyElicitationComplete sends a notifications/elicitation/complete notification to the client (SEP-1036). Call this after the user completes the out-of-band URL-mode elicitation flow so the client knows it can retry the original request.
func NotifyResourceUpdated ¶ added in v0.1.28
NotifyResourceUpdated sends a notifications/resources/updated to all sessions subscribed to the given resource URI. This is the handler-facing wrapper around Server.NotifyResourceUpdated — it routes through the subscription registry to fan out across sessions, not just the caller's session.
No-op if subscriptions are not enabled or no session context is present. Uses the existing MCP spec subscription mechanism (exact URI match); no wildcard or pattern extensions.
Usage in a tool handler:
func updateWidget(ctx context.Context, req core.ToolRequest) (core.ToolResult, error) {
db.UpdateWidget(args.ID, args.Name)
core.NotifyResourceUpdated(ctx, "widgets/" + args.ID)
return core.TextResult("updated"), nil
}
func NotifyResourcesChanged ¶
NotifyResourcesChanged sends a notifications/resources/list_changed notification to the connected client, signaling that the set of available resources has changed. MCP App tool handlers should call this after mutating state that affects the UI resource, so clients know to re-fetch resources/list.
Note: this notifies the CURRENT session only (via sc.notify). For targeted fan-out to all sessions subscribed to a specific resource URI, use NotifyResourceUpdated(ctx, uri) instead.
Safe to call even if no session context is present (no-op).
func ParseWWWAuthenticate ¶
ParseWWWAuthenticate extracts the resource_metadata URL and scopes from a WWW-Authenticate: Bearer header value. Used by MCP clients to discover the PRM endpoint after receiving a 401, and to parse required scopes from a 403 insufficient_scope response.
Per MCP spec (2025-11-25): clients MUST use resource_metadata from WWW-Authenticate when present.
func ReplaceSessionNotifyFunc ¶ added in v0.2.41
func ReplaceSessionNotifyFunc(ctx context.Context, fn NotifyFunc) context.Context
ReplaceSessionNotifyFunc returns a new context with the session's notifyFunc replaced. Used by detach strategies to swap the dead POST-scoped notifyFunc with a live session-level one.
No-op if the context has no session.
func ReplaceSessionRequestFunc ¶ added in v0.2.41
func ReplaceSessionRequestFunc(ctx context.Context, fn RequestFunc) context.Context
ReplaceSessionRequestFunc returns a new context with the session's requestFunc replaced. Used by detach strategies to swap the dead POST-scoped requestFunc with a live session-level one.
No-op if the context has no session.
func SetAllowedRoots ¶ added in v0.1.26
SetAllowedRoots installs an allowed-roots supplier on the session stored in ctx. Exported for the server dispatch layer to wire in the computed root set during session setup. Must be called AFTER ContextWithSession.
func SetDetachStrategy ¶ added in v0.2.41
func SetDetachStrategy(ctx context.Context, strategy DetachStrategy) context.Context
SetDetachStrategy registers a background detach strategy on the context. Called by the server's dispatch layer to provide transport-aware detachment.
func SetNotifyResourceUpdated ¶ added in v0.1.28
SetNotifyResourceUpdated installs the resource-updated fan-out function on the session context. Exported for the server dispatch layer to wire the subscription registry's notify method. Must be called AFTER ContextWithSession.
func SetResponseHeader ¶ added in v0.2.41
SetResponseHeader stages an HTTP response header that the transport applies before writing the response body. Used by middleware and handlers that need to surface protocol metadata at the HTTP layer (e.g., the v2 task middleware emits Mcp-Name: <taskId> per SEP-2243). Silent no-op when the request was not wrapped with WithResponseHeaderCollector (e.g., non-HTTP transports).
func SetSSERetryHint ¶ added in v0.1.23
SetSSERetryHint installs a retry-hint emitter on the session stored in ctx. Exported for the server transport layer to wire in an SSE-capable emitter during session setup. Non-SSE transports omit this call and EmitSSERetry becomes a silent no-op for handlers running under that transport.
Must be called AFTER ContextWithSession has populated the session context. Returns ctx unchanged if no session context is present (in which case the setter has nothing to attach to).
Idempotent: calling twice overwrites the previous emitter. Intended to be called exactly once per session during transport setup.
func SetSchemaGenerator ¶ added in v0.2.26
func SetSchemaGenerator(sg SchemaGenerator)
SetSchemaGenerator replaces the default schema generator used by TypedTool and TextTool. Call this once at program startup before registering tools.
core.SetSchemaGenerator(myCustomGen)
func SetSessionID ¶ added in v0.2.41
SetSessionID sets the transport-assigned session ID on the session context. Called by the server dispatch layer after session creation. No-op if no session context is present.
func SignMRTRState ¶ added in v0.2.41
SignMRTRState produces an HMAC-SHA256-signed requestState token wrapping state. ttl bounds the token's validity. Same wire format as SignRequestState ("<base64url-sig>.<base64url-payload>") so the same helpers in transports/middleware that already strip / re-add the prefix work uniformly. Panics if key is empty — callers should fall back to the plaintext encoder when no signing key is configured.
func SignRequestState ¶ added in v0.2.41
SignRequestState produces an HMAC-SHA256-signed requestState token for the given taskID, valid for ttl. The encoded form is opaque to clients and round-trippable via VerifyRequestState. Panics if key is empty — callers MUST check before invoking (see v2TaskRuntime.makeRequestState which falls back to plaintext when the key is unset).
func StripFileInputKeywords ¶ added in v0.2.44
StripFileInputKeywords returns a deep-copy of the given JSON Schema (typed as `any` because ToolDef.InputSchema and ElicitationRequest's requestedSchema both accept arbitrary shapes) with every occurrence of the `x-mcp-file` keyword removed. Properties remain — only the keyword is stripped, so a tool advertising `{type: "string", format: "uri", x-mcp-file: ...}` becomes `{type: "string", format: "uri"}` for clients that did not declare the SEP-2356 fileInputs capability.
Per spec interpretation locked by panyam/mcpconformance `pending` (`src/scenarios/server/file-inputs/`): keep the property visible (so legacy clients can still call the tool with a text-input fallback) instead of hiding the whole tool. The strip walks recursively into `properties` and array `items` so both single and array-of-files shapes are handled.
The input is not mutated. Schemas in shapes other than `map[string]any` (typed structs, json.RawMessage) pass through unchanged — they wouldn't have an `x-mcp-file` keyword at the expected path anyway.
func URITemplateVars ¶ added in v0.2.4
URITemplateVars parses uri as an RFC 6570 URI template and returns the variable names it contains. Returns nil when uri is not a valid template or contains no variables (i.e. is a concrete URI).
func ValidateFileInput ¶ added in v0.2.44
func ValidateFileInput(uri string, desc *FileInputDescriptor) error
ValidateFileInput decodes a data URI argument and verifies it against a server-declared FileInputDescriptor.
- Returns nil on success, or when desc is nil (no constraint).
- Returns *FileTooLargeError when MaxSize is set and exceeded.
- Returns *FileTypeNotAcceptedError when Accept is set and unmet.
- Returns the underlying decoder error when uri is malformed.
The returned typed errors carry structured fields that the dispatcher packs into the JSON-RPC `data` object — see the conformance suite for the frozen wire shape.
func VerifyRequestState ¶ added in v0.2.41
VerifyRequestState checks an incoming requestState token against the signing key and current time. Returns the embedded taskID on success. Errors:
- ErrRequestStateMalformed: structural parse failures (split, base64, JSON)
- ErrRequestStateInvalidSignature: signature mismatch (tampered or wrong key)
- ErrRequestStateExpired: payload exp is in the past
Uses hmac.Equal for constant-time signature comparison.
func WithContentChunkMethod ¶ added in v0.1.17
WithContentChunkMethod returns a context with a custom notification method for streaming content chunks. Used by the server to plumb the configured method name through to EmitContent calls in tool handlers.
func WithResponseHeaderCollector ¶ added in v0.2.41
WithResponseHeaderCollector attaches a fresh per-request HTTP response header collector to ctx. Transports call this on the inbound request context BEFORE dispatching so middleware/handlers can stage headers via SetResponseHeader, and the transport reads them via CollectResponseHeaders before writing the response. Non-HTTP transports skip this and the staging functions become silent no-ops.
Types ¶
type AuthError ¶
type AuthError struct {
Code int
Message string
WWWAuthenticate string // optional WWW-Authenticate header value
}
AuthError is returned when authentication fails.
type AuthValidator ¶
AuthValidator validates an HTTP request and returns claims on success.
type AuthorizationDenial ¶ added in v0.2.41
type AuthorizationDenial struct {
// Reason classifies the denial. The SEP currently defines a single value:
// "insufficient_authorization". Additional values may be defined in future SEPs.
Reason string `json:"reason"`
// AuthorizationContextID is an optional correlation handle. When provided,
// the client MUST echo it on retry in _meta under MetaKeyAuthorizationContextID.
// Per spec, servers MUST NOT reject a retry solely because the handle is
// absent or cannot be resolved.
AuthorizationContextID string `json:"authorizationContextId,omitempty"`
// CredentialDisposition signals the lifecycle relationship between a
// newly-issued credential and existing credentials.
// - "replacement" (default): new credential supersedes existing
// - "additional": new credential coexists with existing (UC3)
CredentialDisposition string `json:"credentialDisposition,omitempty"`
// RemediationHints are optional MCP-level hints that complement the
// transport's authorization challenge. Each hint has a type that
// determines its additional members (which appear at the top level of
// the hint object, NOT nested under a `data` field).
RemediationHints []RemediationHint `json:"remediationHints,omitempty"`
}
AuthorizationDenial is the structured authorization denial envelope returned in JSON-RPC error data. It classifies the failure and optionally carries remediation hints.
EXPERIMENTAL: subject to rename/removal as SEP-2643 evolves.
type BaseContext ¶ added in v0.2.0
BaseContext provides typed access to session capabilities shared by all MCP handler types (tools, resources, prompts, completions). It embeds context.Context so stdlib functions (Done(), Deadline(), WithTimeout) work transparently.
All methods are safe to call even when the underlying capability is unavailable (e.g., EmitLog on a transport without logging is a no-op).
func FromContext ¶ added in v0.2.0
func FromContext(ctx context.Context) BaseContext
FromContext returns a BaseContext for the given context.Context. This is the bridge for code using the free-function API — existing free functions like EmitLog(ctx, ...) delegate to FromContext(ctx).EmitLog(...).
Always returns a usable BaseContext (never nil). Methods become no-ops when no session state is present.
func (BaseContext) AllowedRoots ¶ added in v0.2.0
func (bc BaseContext) AllowedRoots() []string
AllowedRoots returns the current enforced roots for the session.
func (BaseContext) AuthClaims ¶ added in v0.2.0
func (bc BaseContext) AuthClaims() *Claims
AuthClaims returns the authenticated identity, or nil if unavailable.
func (BaseContext) ClientSupportsExtension ¶ added in v0.2.0
func (bc BaseContext) ClientSupportsExtension(extensionID string) bool
ClientSupportsExtension checks whether the client declared support for the given extension ID during initialize.
func (BaseContext) ClientSupportsUI ¶ added in v0.2.0
func (bc BaseContext) ClientSupportsUI() bool
ClientSupportsUI checks whether the client declared MCP Apps support.
func (BaseContext) DetachFromClient ¶ added in v0.2.0
func (bc BaseContext) DetachFromClient() BaseContext
DetachFromClient returns a BaseContext that preserves session state but is NOT cancelled when the client disconnects. See core.DetachFromClient.
func (BaseContext) Elicit ¶ added in v0.2.0
func (bc BaseContext) Elicit(req ElicitationRequest) (ElicitationResult, error)
Elicit sends an elicitation/create request to the connected client.
SEP-2356: if the client did not declare the `fileInputs` capability, the `x-mcp-file` keyword is stripped from `req.RequestedSchema` before the request goes on the wire (spec mandate for cap-less clients — matches the `tools/list` strip on the server-side dispatch path).
func (BaseContext) EmitLog ¶ added in v0.2.0
func (bc BaseContext) EmitLog(level LogLevel, logger string, data any)
EmitLog sends a log notification at the given severity level.
func (BaseContext) EmitSSERetry ¶ added in v0.2.0
func (bc BaseContext) EmitSSERetry(retryAfter time.Duration) error
EmitSSERetry emits an SSE "retry:" hint to the connected client.
func (BaseContext) HasScope ¶ added in v0.2.0
func (bc BaseContext) HasScope(scope string) bool
HasScope checks if the authenticated claims include the given scope.
func (BaseContext) IsPathAllowed ¶ added in v0.2.0
func (bc BaseContext) IsPathAllowed(path string) bool
IsPathAllowed reports whether the given file path falls within the session's enforced roots.
func (BaseContext) Notify ¶ added in v0.2.0
func (bc BaseContext) Notify(method string, params any) bool
Notify sends an arbitrary server-to-client JSON-RPC notification. Returns false if no notification sender is available.
func (BaseContext) NotifyResourceUpdated ¶ added in v0.2.0
func (bc BaseContext) NotifyResourceUpdated(uri string)
NotifyResourceUpdated sends a notifications/resources/updated to all sessions subscribed to the given URI.
func (BaseContext) NotifyResourcesChanged ¶ added in v0.2.0
func (bc BaseContext) NotifyResourcesChanged()
NotifyResourcesChanged sends a notifications/resources/list_changed to the current session.
func (BaseContext) Sample ¶ added in v0.2.0
func (bc BaseContext) Sample(req CreateMessageRequest) (CreateMessageResult, error)
Sample sends a sampling/createMessage request to the connected client.
func (BaseContext) SessionID ¶ added in v0.2.41
func (bc BaseContext) SessionID() string
SessionID returns the transport-assigned session ID for this request. Empty for stateless or stdio transports.
type CancelTaskResult ¶ added in v0.2.41
type CancelTaskResult struct {
// ResultType is the SEP-2322 polymorphic-dispatch discriminator. Always
// "complete" for the tasks/cancel ack (defaulted by MarshalJSON when empty).
ResultType ResultType `json:"resultType"`
}
CancelTaskResult is the (essentially empty) ack returned by tasks/cancel. Per SEP-2663, cancellation does not return task state — the client should issue tasks/get if it wants to observe the resulting "cancelled" status. Like UpdateTaskResult, the wire payload carries only the SEP-2322 resultType discriminator.
func (CancelTaskResult) MarshalJSON ¶ added in v0.2.41
func (c CancelTaskResult) MarshalJSON() ([]byte, error)
MarshalJSON defaults ResultType to ResultTypeComplete so the zero value (CancelTaskResult{}) emits the spec-compliant wire shape automatically.
type CancelTaskResultV1 ¶ added in v0.2.41
type CancelTaskResultV1 struct {
TaskInfo
}
CancelTaskResultV1 is the v1 response to tasks/cancel. Per spec 2025-11-25: flat Result & Task intersection — same shape as GetTaskResultV1. (V2 returns an empty ack per SEP-2663.)
type CancelledTask ¶ added in v0.2.41
type CancelledTask = DetailedTask
SEP-2663 narrowed aliases — convenient names for callers that have already branched on status. The wire shape is identical to DetailedTask; the alias just communicates which fields the caller expects to be populated.
type Claims ¶
type Claims struct {
// Subject is the authenticated principal (user ID or client ID).
Subject string `json:"sub"`
// Issuer identifies the authorization server that issued the token.
Issuer string `json:"iss"`
// Audience lists the intended recipients of the token (RFC 8707).
Audience []string `json:"aud"`
// Scopes lists the granted scopes.
Scopes []string `json:"scope"`
// Extra holds additional claims not covered by the standard fields.
Extra map[string]any `json:"extra,omitempty"`
}
Claims holds the authenticated identity extracted from a validated request. Populated by AuthValidators that also implement ClaimsProvider.
func AuthClaims ¶
AuthClaims returns the authenticated identity from the context, or nil if no auth was configured or the validator does not provide claims.
Usage in a tool handler:
func myHandler(ctx context.Context, req mcpkit.ToolRequest) (mcpkit.ToolResult, error) {
claims := mcpkit.AuthClaims(ctx)
if claims != nil {
log.Printf("called by %s", claims.Subject)
}
// ...
}
type ClaimsProvider ¶
ClaimsProvider is an optional interface for AuthValidators that can extract identity claims from a validated request. Called only after Validate succeeds.
Validators that only perform pass/fail checks (like bearerTokenValidator) do not need to implement this interface.
type ClientCapabilities ¶
type ClientCapabilities struct {
Sampling *struct{} `json:"sampling,omitempty"`
Roots *RootsCap `json:"roots,omitempty"`
Elicitation *ElicitationCap `json:"elicitation,omitempty"`
Tasks *ClientTasksCap `json:"tasks,omitempty"`
// FileInputs advertises SEP-2356 support: the client can render
// x-mcp-file schema properties as file pickers and encode the
// chosen files as RFC 2397 data URIs. Currently a marker — the
// SEP does not define sub-fields yet.
FileInputs *struct{} `json:"fileInputs,omitempty"`
// Extensions maps extension IDs to the client's capability declaration
// for that extension. Sent during initialize to advertise extension support.
Extensions map[string]ClientExtensionCap `json:"extensions,omitempty"`
}
ClientCapabilities describes features the client supports.
func PerRequestClientCaps ¶ added in v0.2.41
func PerRequestClientCaps(raw json.RawMessage) *ClientCapabilities
PerRequestClientCaps decodes the SEP-2575 per-request client-capabilities override from raw JSON bytes (typically the value of _meta[PerRequestClientCapsKey] in the calling middleware's typed envelope). Returns nil if the bytes are empty or malformed — the caller falls back to session-level caps.
type ClientExtensionCap ¶
type ClientExtensionCap struct {
// MIMETypes lists content types the client supports for this extension.
MIMETypes []string `json:"mimeTypes,omitempty"`
}
ClientExtensionCap describes a client's support for a specific extension. The contents are extension-specific; MCP Apps uses MIMETypes to declare which app content types the client can render.
type ClientInfo ¶
ClientInfo identifies an MCP client from the initialize request.
type ClientTasksCap ¶ added in v0.2.41
type ClientTasksCap struct {
List *TasksCapMethod `json:"list,omitempty"`
Cancel *TasksCapMethod `json:"cancel,omitempty"`
Requests *TasksCapRequests `json:"requests,omitempty"`
}
ClientTasksCap declares client support for tasks in ClientCapabilities. Mirrors TasksCap structure.
type CompletedTask ¶ added in v0.2.41
type CompletedTask = DetailedTask
SEP-2663 narrowed aliases — convenient names for callers that have already branched on status. The wire shape is identical to DetailedTask; the alias just communicates which fields the caller expects to be populated.
type CompletionArgument ¶
type CompletionArgument struct {
// Name is the argument name being completed.
Name string `json:"name"`
// Value is the partial input the user has typed so far.
Value string `json:"value"`
}
CompletionArgument describes the argument being completed and the partial input so far.
type CompletionCompleteResult ¶
type CompletionCompleteResult struct {
Completion CompletionResult `json:"completion"`
}
CompletionCompleteResult is the typed result for completion/complete responses.
type CompletionHandler ¶
type CompletionHandler func(ctx PromptContext, ref CompletionRef, arg CompletionArgument) (CompletionResult, error)
CompletionHandler provides autocompletion suggestions for a specific reference. ref identifies the prompt or resource being completed, arg contains the argument name and partial value. Return matching suggestions.
type CompletionRef ¶
type CompletionRef struct {
// Type is "ref/prompt" for prompt argument completion or "ref/resource" for resource URI completion.
Type string `json:"type"`
// Name is the prompt name (when Type is "ref/prompt").
Name string `json:"name,omitempty"`
// URI is the resource URI template (when Type is "ref/resource").
URI string `json:"uri,omitempty"`
}
CompletionRef identifies what is being completed — a prompt argument or resource URI.
type CompletionResult ¶
type CompletionResult struct {
// Values is the list of completion suggestions.
Values []string `json:"values"`
// Total is the total number of available completions (may be larger than len(Values)).
Total int `json:"total,omitempty"`
// HasMore indicates there are additional completions beyond what was returned.
HasMore bool `json:"hasMore"`
}
CompletionResult is the server's response with completion suggestions.
type Content ¶
type Content struct {
Type string `json:"type"`
Text string `json:"text,omitempty"`
MimeType string `json:"mimeType,omitempty"`
Data string `json:"data,omitempty"`
Resource *ResourceContent `json:"resource,omitempty"`
}
Content is a single content item in a tool result. Supports text, image, audio, and embedded resource types per MCP spec.
func (*Content) UnmarshalJSON ¶ added in v0.1.21
UnmarshalJSON decodes a Content, tolerating an array-form `resource` field from peers that confuse EmbeddedResource (single) with ReadResourceResult (array). The first array element wins. See #81 for cardinality rationale.
type ContentChunk ¶ added in v0.1.17
type ContentChunk struct {
// RequestID links the chunk to the original tools/call request.
RequestID json.RawMessage `json:"requestId"`
// Content is the partial content block.
Content Content `json:"content"`
}
ContentChunk is the notification payload for a streaming content block. Sent during tool execution to deliver partial results incrementally.
type CreateMessageRequest ¶
type CreateMessageRequest struct {
Messages []SamplingMessage `json:"messages"`
SystemPrompt string `json:"systemPrompt,omitempty"`
IncludeContext string `json:"includeContext,omitempty"` // "none", "thisServer", "allServers"
Temperature *float64 `json:"temperature,omitempty"`
MaxTokens int `json:"maxTokens"`
ModelPreferences *ModelPreferences `json:"modelPreferences,omitempty"`
StopSequences []string `json:"stopSequences,omitempty"`
Metadata map[string]any `json:"metadata,omitempty"`
Meta *SamplingMeta `json:"_meta,omitempty"`
}
CreateMessageRequest is the params for a sampling/createMessage server-to-client request. The server sends this to ask the client to perform LLM inference.
type CreateMessageResult ¶
type CreateMessageResult struct {
Model string `json:"model"`
StopReason string `json:"stopReason,omitempty"`
Role string `json:"role"`
Content Content `json:"content"`
}
CreateMessageResult is the client's response to a sampling/createMessage request.
func Sample ¶
func Sample(ctx context.Context, req CreateMessageRequest) (CreateMessageResult, error)
Sample sends a sampling/createMessage request to the connected client and blocks until the client responds with an LLM inference result.
Returns ErrNoRequestFunc if called outside a session context (e.g., no transport). Returns ErrSamplingNotSupported if the client did not declare sampling capability. Returns context.DeadlineExceeded if the context expires before the client responds.
Usage in a tool handler:
func myHandler(ctx context.Context, req mcpkit.ToolRequest) (mcpkit.ToolResult, error) {
result, err := mcpkit.Sample(ctx, mcpkit.CreateMessageRequest{
Messages: []mcpkit.SamplingMessage{{Role: "user", Content: mcpkit.Content{Type: "text", Text: "summarize this"}}},
MaxTokens: 1000,
})
if err != nil {
return mcpkit.ErrorResult(err.Error()), nil
}
return mcpkit.TextResult(result.Content.Text), nil
}
func (*CreateMessageResult) UnmarshalJSON ¶ added in v0.1.21
func (r *CreateMessageResult) UnmarshalJSON(data []byte) error
UnmarshalJSON decodes a CreateMessageResult, tolerating an array-form `content` field (first element wins) from peers that emit the array shape. See #81.
type CreateTaskResult ¶ added in v0.2.41
type CreateTaskResult struct {
ResultType ResultType `json:"resultType"`
TaskInfoV2
}
CreateTaskResult is returned by tools/call when the server elects to handle the call as an async task. Per SEP-2663 it is `Result & Task` — a flat intersection where the discriminator and the task fields share one object (taskId / status / ttlMs / ... at the top level alongside resultType).
Per SEP-2663, this envelope MUST NOT carry result, error, inputRequests, or requestState — those belong on tasks/get's DetailedTask response.
Wire shape (flat — no `task` wrapper):
{"resultType": "task", "taskId": "...", "status": "working",
"createdAt": "...", "lastUpdatedAt": "...", "ttlMs": 60000,
"pollIntervalMs": 1000}
TaskInfoV2 is embedded so encoding/json promotes its fields to the parent (same trick DetailedTask uses); no custom MarshalJSON is needed.
type CreateTaskResultV1 ¶ added in v0.2.41
type CreateTaskResultV1 struct {
Task TaskInfo `json:"task"`
}
CreateTaskResultV1 is returned by tools/call when a v1 task is created instead of the immediate tool result. Per spec 2025-11-25: nested under "task" key. (V1 wire format; v2 uses CreateTaskResult with resultType.)
type DetachStrategy ¶ added in v0.2.41
DetachStrategy is a function that creates a background-safe context from a request-scoped context. The server registers a strategy that replaces transport-scoped functions (like requestFunc) with session-level equivalents that remain valid after the original HTTP request completes.
type DetailedTask ¶ added in v0.2.41
type DetailedTask struct {
// ResultType is the SEP-2322 polymorphic-dispatch discriminator. For
// tasks/get responses it is always "complete" — the JSON-RPC request
// itself completes with this response, even when the underlying task
// is still running. (The task lifecycle is on the Status field.)
// MarshalJSON defaults this to ResultTypeComplete when empty so
// existing struct literals don't have to set it.
ResultType ResultType `json:"resultType"`
TaskInfoV2
// Result is inlined when Status == TaskCompleted. Includes the original
// ToolResult (with isError flag for tool-side errors).
Result *ToolResult `json:"result,omitempty"`
// Error is inlined when Status == TaskFailed. Mirrors the JSON-RPC error
// shape and represents protocol-level failures only.
Error *TaskError `json:"error,omitempty"`
// InputRequests is populated when Status == TaskInputRequired and lists
// the MRTR input requests the client must satisfy via tasks/update. // SEP-2322
InputRequests InputRequests `json:"inputRequests,omitempty"`
// RequestState is the opaque session-continuation token. // SEP-2322
RequestState string `json:"requestState,omitempty"`
}
DetailedTask is the SEP-2663 discriminated union returned by tasks/get. The Status field discriminates which optional fields are populated:
- working → no inlined payload
- input_required → InputRequests populated
- completed → Result populated
- failed → Error populated
- cancelled → no inlined payload
RequestState is opaque session-continuation state for stateless deployments; servers MAY include it on any status, clients MUST echo it back on the next tasks/get / tasks/update / tasks/cancel for the same task. // SEP-2322
func (DetailedTask) MarshalJSON ¶ added in v0.2.41
func (d DetailedTask) MarshalJSON() ([]byte, error)
MarshalJSON defaults ResultType to ResultTypeComplete when empty so every tasks/get response carries the SEP-2322 polymorphic discriminator without every call site having to set it. The task lifecycle stays on Status.
type DisplayMode ¶ added in v0.1.29
type DisplayMode string
DisplayMode represents an iframe display mode for MCP Apps.
const ( // DisplayModeInline renders the app inline within the host UI. DisplayModeInline DisplayMode = "inline" // DisplayModeFullscreen renders the app in a fullscreen overlay. DisplayModeFullscreen DisplayMode = "fullscreen" // DisplayModePIP renders the app in a picture-in-picture window. DisplayModePIP DisplayMode = "pip" )
type ElicitationCap ¶ added in v0.2.41
type ElicitationCap struct {
Form *ElicitationFormCap `json:"form,omitempty"`
URL *ElicitationURLCap `json:"url,omitempty"`
}
ElicitationCap describes client support for elicitation modes. Per SEP-1036: Form is the default mode (JSON schema → form). URL mode enables out-of-band interactions where the user visits a URL.
type ElicitationCompleteParams ¶ added in v0.2.41
type ElicitationCompleteParams struct {
ElicitationID string `json:"elicitationId"`
}
ElicitationCompleteParams is the params for the notifications/elicitation/complete notification (SEP-1036). The server sends this after the user completes an out-of-band URL-mode elicitation flow. The client uses elicitationId to correlate with the original elicitation request and may retry the denied operation.
type ElicitationFormCap ¶ added in v0.2.41
type ElicitationFormCap struct{}
ElicitationFormCap is a marker for form-mode elicitation support. Currently empty; future specs may add fields (e.g., schema constraints).
type ElicitationMeta ¶ added in v0.1.29
type ElicitationMeta struct {
// UI contains MCP Apps presentation metadata.
// When set, the host can render a UI resource during input collection
// instead of falling back to the default schema-driven form.
UI *UIMetadata `json:"ui,omitempty"`
// RelatedTask identifies the task this request is associated with.
// Set automatically by TaskContext.TaskElicit() so the client can
// correlate side-channel requests with the originating task.
RelatedTask *RelatedTaskMeta `json:"io.modelcontextprotocol/related-task,omitempty"`
}
ElicitationMeta holds protocol-level metadata for an elicitation request. Serialized as "_meta" in the elicitation/create params.
type ElicitationRequest ¶
type ElicitationRequest struct {
Message string `json:"message"`
RequestedSchema json.RawMessage `json:"requestedSchema,omitempty"`
Mode string `json:"mode,omitempty"` // "form" (default) or "url"
URL string `json:"url,omitempty"` // Required for url mode
ElicitationID string `json:"elicitationId,omitempty"` // Required for url mode; correlates with completion notification
Meta *ElicitationMeta `json:"_meta,omitempty"`
}
ElicitationRequest is the params for an elicitation/create server-to-client request. The server sends this to ask the client to collect structured user input.
For form mode (default): Message + RequestedSchema are used. For URL mode (SEP-1036): Message + URL + ElicitationID are used; RequestedSchema must NOT be set.
type ElicitationResult ¶
type ElicitationResult struct {
Action string `json:"action"` // "accept", "decline", or "cancel"
Content map[string]any `json:"content,omitempty"`
}
ElicitationResult is the client's response to an elicitation/create request.
func Elicit ¶
func Elicit(ctx context.Context, req ElicitationRequest) (ElicitationResult, error)
Elicit sends a form-mode elicitation/create request to the connected client and blocks until the client responds with user input.
Returns ErrNoRequestFunc if called outside a session context (e.g., no transport). Returns ErrElicitationNotSupported if the client did not declare elicitation capability. Returns context.DeadlineExceeded if the context expires before the client responds.
Usage in a tool handler:
func myHandler(ctx context.Context, req mcpkit.ToolRequest) (mcpkit.ToolResult, error) {
result, err := mcpkit.Elicit(ctx, mcpkit.ElicitationRequest{
Message: "Which database should I connect to?",
RequestedSchema: json.RawMessage(`{
"type": "object",
"properties": {"database": {"type": "string", "enum": ["prod", "staging", "dev"]}}
}`),
})
if err != nil {
return mcpkit.ErrorResult(err.Error()), nil
}
if result.Action != "accept" {
return mcpkit.TextResult("User declined"), nil
}
return mcpkit.TextResult(fmt.Sprintf("Selected: %v", result.Content["database"])), nil
}
func ElicitURL ¶ added in v0.2.41
func ElicitURL(ctx context.Context, req ElicitationRequest) (ElicitationResult, error)
ElicitURL sends a URL-mode elicitation/create request to the connected client (SEP-1036). The client presents the URL to the user for out-of-band interaction. The client's bearer token remains unchanged.
Returns ErrElicitationURLNotSupported if the client did not declare URL-mode elicitation capability.
After calling this, the server should send notifications/elicitation/complete (via NotifyElicitationComplete) when the out-of-band flow is done.
type ElicitationURLCap ¶ added in v0.2.41
type ElicitationURLCap struct{}
ElicitationURLCap is a marker for URL-mode elicitation support (SEP-1036). Currently empty; future specs may add fields (e.g., allowed domains).
type Error ¶
type Error struct {
Code int `json:"code"`
Message string `json:"message"`
Data any `json:"data,omitempty"`
}
Error is a JSON-RPC 2.0 error object.
type Extension ¶
type Extension struct {
// ID is the extension identifier (e.g., "io.mcpkit/auth").
ID string `json:"id"`
// SpecVersion is the version of the spec this extension implements.
SpecVersion string `json:"specVersion"`
// Stability indicates the maturity of this extension.
Stability Stability `json:"stability"`
// Config holds extension-specific configuration, if any.
Config map[string]any `json:"config,omitempty"`
}
Extension describes a protocol extension with maturity metadata. Extensions are advertised in the initialize response under capabilities.extensions.
type ExtensionCapability ¶
type ExtensionCapability struct {
SpecVersion string `json:"specVersion"`
Stability string `json:"stability"`
}
ExtensionCapability describes a server extension's metadata in the initialize response capabilities.
type ExtensionProvider ¶
type ExtensionProvider interface {
Extension() Extension
}
ExtensionProvider is implemented by sub-modules to declare their extension. This is how mcpkit/auth registers itself without the core module knowing about auth.
type FailedTask ¶ added in v0.2.41
type FailedTask = DetailedTask
SEP-2663 narrowed aliases — convenient names for callers that have already branched on status. The wire shape is identical to DetailedTask; the alias just communicates which fields the caller expects to be populated.
type FileInputDescriptor ¶ added in v0.2.43
type FileInputDescriptor struct {
// Accept is the list of accepted MIME patterns or file extensions.
// Each entry is one of:
// - exact MIME type: "image/png"
// - wildcard subtype: "image/*"
// - file extension: ".pdf" (matched against known MIME types)
//
// Empty Accept means any type is allowed.
Accept []string `json:"accept,omitempty"`
// MaxSize is the maximum size in bytes of the decoded file payload.
// nil means no server-declared limit (the client may still impose its own).
MaxSize *int `json:"maxSize,omitempty"`
}
FileInputDescriptor is the value of the x-mcp-file schema extension keyword (SEP-2356). It tells the client which file types the server will accept and the maximum decoded size in bytes.
Both fields are optional. An empty descriptor (`{}`) means "any file, any size" — the server still has to validate the payload at the transport boundary.
func ExtractFileInputDescriptor ¶ added in v0.2.43
func ExtractFileInputDescriptor(schemaProp map[string]any) *FileInputDescriptor
ExtractFileInputDescriptor pulls the x-mcp-file descriptor from a JSON Schema property, or nil if the keyword is absent.
The descriptor may have been built by FileInputProperty (Go map of FileInputDescriptor) or unmarshalled from JSON (map[string]any with "accept" / "maxSize" fields) — both shapes are handled.
type FileTooLargeData ¶ added in v0.2.44
type FileTooLargeData struct {
Reason string `json:"reason"` // always "file_too_large"
Field string `json:"field,omitempty"`
ActualSize int `json:"actualSize"`
MaxSize int `json:"maxSize"`
}
FileTooLargeData is the wire-shape of FileTooLargeError. Frozen by the conformance suite: `{reason, actualSize, maxSize}`.
type FileTooLargeError ¶ added in v0.2.44
type FileTooLargeError struct {
// Field is the JSON-Schema property path of the offending arg (e.g.
// "image" or "documents[0]"). Optional — empty when the validator
// doesn't have path context.
Field string
ActualSize int
MaxSize int
}
FileTooLargeError reports that a decoded payload exceeds the descriptor's MaxSize. The dispatcher serializes Data() as the JSON-RPC `error.data` object on the wire.
func (*FileTooLargeError) Data ¶ added in v0.2.44
func (e *FileTooLargeError) Data() FileTooLargeData
Data returns the structured wire payload for this error.
func (*FileTooLargeError) Error ¶ added in v0.2.44
func (e *FileTooLargeError) Error() string
func (*FileTooLargeError) Unwrap ¶ added in v0.2.44
func (e *FileTooLargeError) Unwrap() error
Unwrap lets errors.Is(err, ErrFileTooLarge) succeed.
type FileTypeNotAcceptedData ¶ added in v0.2.44
type FileTypeNotAcceptedData struct {
Reason string `json:"reason"` // always "file_type_not_accepted"
Field string `json:"field,omitempty"`
MediaType string `json:"mediaType"`
Filename string `json:"filename,omitempty"`
Accept []string `json:"accept"`
}
FileTypeNotAcceptedData is the wire-shape of FileTypeNotAcceptedError. Frozen by the conformance suite: `{reason, mediaType, accept}`.
type FileTypeNotAcceptedError ¶ added in v0.2.44
type FileTypeNotAcceptedError struct {
Field string
MediaType string
Filename string
Accept []string
}
FileTypeNotAcceptedError reports that a decoded payload's media type or filename does not match any pattern in the descriptor's Accept list.
func (*FileTypeNotAcceptedError) Data ¶ added in v0.2.44
func (e *FileTypeNotAcceptedError) Data() FileTypeNotAcceptedData
Data returns the structured wire payload for this error.
func (*FileTypeNotAcceptedError) Error ¶ added in v0.2.44
func (e *FileTypeNotAcceptedError) Error() string
func (*FileTypeNotAcceptedError) Unwrap ¶ added in v0.2.44
func (e *FileTypeNotAcceptedError) Unwrap() error
Unwrap lets errors.Is(err, ErrFileTypeNotAccepted) succeed.
type GetTaskResult ¶ added in v0.2.41
type GetTaskResult = DetailedTask
GetTaskResult is the response shape for tasks/get. Identical to DetailedTask.
type GetTaskResultV1 ¶ added in v0.2.41
type GetTaskResultV1 struct {
TaskInfo
}
GetTaskResultV1 is the v1 response to tasks/get. Per spec 2025-11-25: flat Result & Task intersection — task fields at the root level, no "task" wrapper. (V2 returns DetailedTask with inlined result/error/inputRequests.)
type InitializeResult ¶
type InitializeResult struct {
ProtocolVersion string `json:"protocolVersion"`
Capabilities ServerCapabilities `json:"capabilities"`
ServerInfo ServerInfo `json:"serverInfo"`
}
InitializeResult is the typed result for the initialize response.
type InputRequest ¶ added in v0.2.41
type InputRequest struct {
Method string `json:"method"`
Params json.RawMessage `json:"params,omitempty"`
}
InputRequest is a single MRTR input request enqueued by a server during tool execution: a method (e.g., "elicitation/create", "sampling/createMessage") plus opaque params encoded per that method's request schema. // SEP-2322
type InputRequests ¶ added in v0.2.41
type InputRequests = map[string]InputRequest
InputRequests is the wire-format map from request key to InputRequest. Keys are server-chosen identifiers (e.g., "elicit-1") that the client echoes verbatim in the matching InputResponses entry. // SEP-2322
type InputRequiredResult ¶ added in v0.2.46
type InputRequiredResult struct {
// ResultType is always "input_required". Defaulted by MarshalJSON when
// empty so server handlers can build the struct without thinking about
// it.
ResultType ResultType `json:"resultType"`
// InputRequests is the map of server-chosen request keys → InputRequest
// describing what the server needs from the client. Keys are echoed back
// verbatim by the client in the matching InputResponses entry.
InputRequests InputRequests `json:"inputRequests,omitempty"`
// RequestState is the opaque session-continuation token. SEP-2322 says
// servers MUST treat any echoed value as attacker-controlled; the helper
// API in dispatch HMAC-signs it when a key is configured.
RequestState string `json:"requestState,omitempty"`
}
InputRequiredResult is the SEP-2322 wire envelope returned by tools/call (and other request methods, in principle) when the server needs additional input from the client before it can produce a final result. Clients retry the same request with `inputResponses` (and the echoed `requestState`) until the server returns a complete result, a CreateTaskResult, or an error.
Renamed from IncompleteResult in SEP-2322 commit de6d76fb (merged 2026-05-06) per dsp-ant request. The wire `resultType` value flipped from "incomplete" to "input_required" at the same time. SEP-2663 had not yet adopted the rename as of 2026-05-07 PM, but Caitie committed to a coherent Draft Spec + Schema at the 5/15 RC (issue comment 4384052694), so the alignment direction is "input_required" both places.
Wire-format note: the `resultType` discriminator is camelCase like every other MCP wire field — Luca confirmed camelCase is the SEP-2322 spec standard. (The upstream conformance suite briefly used snake_case but that's being corrected on their side.)
func (InputRequiredResult) MarshalJSON ¶ added in v0.2.46
func (r InputRequiredResult) MarshalJSON() ([]byte, error)
MarshalJSON defaults ResultType to ResultTypeInputRequired so handlers that build an InputRequiredResult{} literal don't have to set the discriminator.
type InputRequiredTask ¶ added in v0.2.41
type InputRequiredTask = DetailedTask
SEP-2663 narrowed aliases — convenient names for callers that have already branched on status. The wire shape is identical to DetailedTask; the alias just communicates which fields the caller expects to be populated.
type InputResponses ¶ added in v0.2.41
type InputResponses = map[string]json.RawMessage
InputResponses is the wire-format map from request key to opaque response payload. Keys MUST match those previously returned in InputRequests. The payload shape is defined by the original request method. // SEP-2322
type ListTasksResultV1 ¶ added in v0.2.41
type ListTasksResultV1 struct {
Tasks []TaskInfo `json:"tasks"`
NextCursor string `json:"nextCursor,omitempty"`
}
ListTasksResultV1 is the v1 response to tasks/list with cursor pagination. (Removed in v2 — tasks/list is no longer part of the protocol.)
type LogLevel ¶
type LogLevel int
LogLevel represents MCP log severity levels (syslog-based, ascending severity). Used with logging/setLevel to control the minimum level of log notifications sent to the client, and with EmitLog to specify the severity of a message.
const ( LogDebug LogLevel = iota // debug: detailed debugging information LogInfo // info: general informational messages LogNotice // notice: normal but significant events LogWarning // warning: warning conditions LogError // error: error conditions LogCritical // critical: critical conditions LogAlert // alert: action must be taken immediately LogEmergency // emergency: system is unusable )
func ParseLogLevel ¶
ParseLogLevel converts a string to a LogLevel. Returns the level and true on success, or (LogDebug, false) for unknown strings.
func SlogToMCPLevel ¶ added in v0.2.28
SlogToMCPLevel maps a slog.Level to an MCP LogLevel.
slog.LevelDebug (-4) → LogDebug slog.LevelInfo (0) → LogInfo slog.LevelWarn (4) → LogWarning slog.LevelError (8) → LogError > slog.LevelError → LogCritical
type LogMessage ¶
type LogMessage struct {
Level string `json:"level"`
Logger string `json:"logger,omitempty"`
Data any `json:"data"`
}
LogMessage is the params payload for a notifications/message notification.
type LoggingTransport ¶ added in v0.2.27
type LoggingTransport struct {
// Inner is the wrapped transport.
Inner Transport
// Logger receives log output. If nil, log.Default() is used.
Logger *log.Logger
// LogBodies controls whether full JSON-RPC message bodies are included
// in log output. When false (default), only method names and direction
// are logged — suitable for production. When true, full request/response
// JSON is logged — useful for debugging but verbose.
LogBodies bool
}
LoggingTransport is a Transport decorator that logs every JSON-RPC message flowing through the transport. Use it for wire-level debugging, conformance testing, and audit logging.
Wraps any Transport — zero cost when not used. Complements server middleware (which operates at the method level, post-deserialization) by providing raw message visibility before parsing.
Example:
inner := server.NewInProcessTransport(srv)
logged := &core.LoggingTransport{Inner: inner, Logger: log.Default()}
c := client.NewClient("", info, client.WithTransport(logged))
func (*LoggingTransport) Call ¶ added in v0.2.27
Call delegates to the inner transport and logs the request, response, and latency.
func (*LoggingTransport) Close ¶ added in v0.2.27
func (t *LoggingTransport) Close() error
Close delegates to the inner transport and logs the close.
func (*LoggingTransport) Connect ¶ added in v0.2.27
func (t *LoggingTransport) Connect(ctx context.Context) error
Connect delegates to the inner transport and logs the result.
func (*LoggingTransport) Notify ¶ added in v0.2.27
func (t *LoggingTransport) Notify(ctx context.Context, req *Request) error
Notify delegates to the inner transport and logs the notification.
func (*LoggingTransport) SessionID ¶ added in v0.2.27
func (t *LoggingTransport) SessionID() string
SessionID delegates to the inner transport.
type MCPLogHandler ¶ added in v0.2.28
type MCPLogHandler struct {
// contains filtered or unexported fields
}
MCPLogHandler implements slog.Handler, routing structured log records through MCP's notifications/message protocol to the connected client.
The handler respects the per-session logging/setLevel — records below the client's requested level are dropped silently. slog levels are mapped to MCP LogLevel: Debug→debug, Info→info, Warn→warning, Error→error, >Error→critical.
Create via NewMCPLogHandler inside a tool/resource/prompt handler:
func myTool(ctx core.ToolContext, req core.ToolRequest) (core.ToolResult, error) {
logger := slog.New(core.NewMCPLogHandler(ctx, nil))
logger.Info("processing", "key", "value") // → notifications/message
...
}
func NewMCPLogHandler ¶ added in v0.2.28
func NewMCPLogHandler(ctx context.Context, opts *MCPLogHandlerOptions) *MCPLogHandler
NewMCPLogHandler creates an slog.Handler that sends log records as MCP notifications/message to the connected client. The ctx must carry an MCP session (as set by the dispatch layer in tool/resource/prompt handlers).
If ctx has no session (e.g., called outside a handler), the handler is a safe no-op — Enabled() returns false for all levels.
func (*MCPLogHandler) Enabled ¶ added in v0.2.28
Enabled reports whether the handler handles records at the given level. Returns false when: the slog level filter rejects it, the session has no logging enabled (client never called logging/setLevel), or the MCP session level threshold is above the mapped MCP level.
func (*MCPLogHandler) Handle ¶ added in v0.2.28
Handle sends the slog record as an MCP notifications/message.
type MCPLogHandlerOptions ¶ added in v0.2.28
type MCPLogHandlerOptions struct {
// Logger is the MCP logger name sent in the "logger" field of
// notifications/message. Defaults to "" (empty).
Logger string
// Level sets the minimum slog level. Records below this are dropped
// before the MCP session level check. If nil, only the session's
// logging/setLevel threshold applies.
Level slog.Leveler
}
MCPLogHandlerOptions configures NewMCPLogHandler.
type MRTRRoundState ¶ added in v0.2.41
type MRTRRoundState struct {
Tool string `json:"tool"`
Answered map[string]json.RawMessage `json:"answered,omitempty"`
Exp int64 `json:"exp"`
}
MRTRRoundState is the payload encoded inside an SEP-2322 ephemeral requestState token across multi-round flows. The dispatcher uses it to carry accumulated InputResponses from previous rounds back to the handler — the wire protocol only ships the current round's responses, so without this carry-over a stateless handler couldn't see history.
Tool is the tool name the token was issued for; replays against a different tool fail with ErrRequestStateInvalidSignature. Answered is the merged inputResponses map (raw, opaque per-key payloads). Exp is the unix-seconds expiry, mirroring the requestStatePayload semantics.
func DecodeMRTRStatePlaintext ¶ added in v0.2.41
func DecodeMRTRStatePlaintext(token string) (MRTRRoundState, error)
DecodeMRTRStatePlaintext parses a token produced by EncodeMRTRStatePlaintext. Returns ErrRequestStateMalformed for unparseable tokens and ErrRequestStateExpired when the embedded exp is in the past. No signature check (plaintext mode has none).
func VerifyMRTRState ¶ added in v0.2.41
func VerifyMRTRState(key []byte, token string) (MRTRRoundState, error)
VerifyMRTRState validates an incoming MRTR requestState token against the signing key + current time and returns the embedded round state. Errors:
- ErrRequestStateMalformed: structural parse failures (split, base64, JSON)
- ErrRequestStateInvalidSignature: signature mismatch (tampered or wrong key)
- ErrRequestStateExpired: payload exp is in the past
Uses hmac.Equal for constant-time signature comparison.
type MethodContext ¶ added in v0.2.34
type MethodContext struct {
BaseContext
}
MethodContext is the context passed to custom JSON-RPC method handlers registered via server.HandleMethod or server.WithMethodHandler. It embeds BaseContext with no additional methods — custom methods get the same session capabilities as other handlers (EmitLog, Sample, Elicit, etc.).
func NewMethodContext ¶ added in v0.2.34
func NewMethodContext(ctx context.Context) MethodContext
NewMethodContext constructs a MethodContext from a standard context.Context.
func (MethodContext) DetachFromClient ¶ added in v0.2.34
func (mc MethodContext) DetachFromClient() MethodContext
DetachFromClient returns a MethodContext that preserves session state but is NOT cancelled when the client disconnects.
type ModelHint ¶
type ModelHint struct {
Name string `json:"name,omitempty"`
}
ModelHint provides hints about which model the server prefers for sampling.
type ModelPreferences ¶
type ModelPreferences struct {
Hints []ModelHint `json:"hints,omitempty"`
CostPriority *float64 `json:"costPriority,omitempty"`
SpeedPriority *float64 `json:"speedPriority,omitempty"`
IntelligencePriority *float64 `json:"intelligencePriority,omitempty"`
}
ModelPreferences describes the server's preferences for model selection when the client performs LLM sampling.
type NotificationHandler ¶
NotificationHandler receives server-to-client notifications (logging, progress, resource updates). Used by tests to verify notification delivery.
type NotifyFunc ¶
NotifyFunc sends a server-to-client JSON-RPC notification. method is the notification method (e.g., "notifications/message"). params will be JSON-marshaled as the notification's params field. This type is reusable for all server→client notifications (logging, progress, etc.).
type PingResult ¶
type PingResult struct{}
PingResult is the typed result for ping responses. Currently empty per spec, but typed to allow future extension.
type ProgressNotification ¶
type ProgressNotification struct {
// ProgressToken is the token from the request's _meta.progressToken field.
// It links this notification to the original request.
ProgressToken any `json:"progressToken"`
// Progress is the current progress value (e.g., bytes processed, items completed).
Progress float64 `json:"progress"`
// Total is the expected total value. Zero means indeterminate progress.
Total float64 `json:"total,omitempty"`
// Message is an optional human-readable status message.
Message string `json:"message,omitempty"`
}
ProgressNotification is the params payload for a notifications/progress notification. Servers send this during long-running operations to report progress to the client. The ProgressToken must match the token from the client's original request _meta.
type PromptArgument ¶
type PromptArgument struct {
Name string `json:"name"`
Description string `json:"description,omitempty"`
Required bool `json:"required,omitempty"`
// Schema is an optional JSON Schema describing the expected value shape
// for this argument. Mirrors ToolDef.InputSchema: typically a
// map[string]any with "type", "enum", "minimum", etc. Arbitrary JSON
// Schema keywords ($ref, $defs, additionalProperties, ...) are preserved
// as-is through registration, serialization, and client deserialization.
//
// Enforced server-side: when set, the dispatcher validates incoming
// argument values against the schema before invoking the handler and
// returns -32602 Invalid Params with a structured errors list on
// failure (#184). Arguments without a Schema bypass validation.
// Use server.WithSchemaValidation(false) to opt out of call-time
// validation if you prefer to validate in the handler.
Schema any `json:"schema,omitempty"`
}
PromptArgument describes a single argument to a prompt.
type PromptContext ¶ added in v0.2.0
type PromptContext struct {
BaseContext
}
PromptContext is the context passed to PromptHandler and CompletionHandler functions. It embeds BaseContext with no additional methods.
func NewPromptContext ¶ added in v0.2.0
func NewPromptContext(ctx context.Context) PromptContext
NewPromptContext constructs a PromptContext from a standard context.Context.
func (PromptContext) DetachFromClient ¶ added in v0.2.0
func (pc PromptContext) DetachFromClient() PromptContext
DetachFromClient returns a PromptContext that preserves session state but is NOT cancelled when the client disconnects.
type PromptDef ¶
type PromptDef struct {
// Name is the prompt identifier used in prompts/get.
Name string `json:"name"`
// Title is an optional display title.
Title string `json:"title,omitempty"`
// Description explains what this prompt does.
Description string `json:"description,omitempty"`
// Arguments defines the parameters this prompt accepts.
Arguments []PromptArgument `json:"arguments,omitempty"`
// Annotations holds optional metadata for this prompt.
Annotations map[string]any `json:"annotations,omitempty"`
// Timeout is a per-prompt execution timeout. Not serialized to clients.
Timeout time.Duration `json:"-"`
}
PromptDef describes a prompt exposed via MCP.
type PromptHandler ¶
type PromptHandler func(ctx PromptContext, req PromptRequest) (PromptResult, error)
PromptHandler generates prompt messages, optionally using arguments.
type PromptMessage ¶
type PromptMessage struct {
Role string `json:"role"`
Content Content `json:"content"` // reuses Content from tool.go
}
PromptMessage is a single message in a prompt result.
func (*PromptMessage) UnmarshalJSON ¶ added in v0.1.21
func (m *PromptMessage) UnmarshalJSON(data []byte) error
UnmarshalJSON decodes a PromptMessage, tolerating an array-form `content` field from peers that emit the array shape by mistake. First element wins. See #81.
type PromptRequest ¶
PromptRequest is the validated input passed to a PromptHandler.
Arguments holds the decoded JSON values from the prompts/get request, keyed by argument name. Values retain their JSON types after decode: strings stay as string, numbers become float64, booleans stay bool, objects become map[string]any, arrays become []any. Handlers type-assert as needed. This shape mirrors how tool handlers receive ToolRequest.Arguments (raw JSON), but pre-decoded for ergonomic access — a prompt argument count is tiny, so eager decode is fine. See #87.
type PromptResult ¶
type PromptResult struct {
Description string `json:"description,omitempty"`
Messages []PromptMessage `json:"messages"`
}
PromptResult is the response from a prompt handler.
type PromptsCap ¶
type PromptsCap struct {
ListChanged bool `json:"listChanged,omitempty"`
}
PromptsCap describes the server's prompts capability.
type PromptsListResult ¶
type PromptsListResult struct {
Prompts []PromptDef `json:"prompts"`
NextCursor string `json:"nextCursor,omitempty"`
// TTL is the SEP-2549 cache freshness hint in seconds. See
// ToolsListResult.TTL for full semantics — same three-state pointer
// shape (nil = no guidance, &0 = do not cache, &N>0 = N seconds fresh).
TTL *int `json:"ttl,omitempty"`
}
PromptsListResult is the typed result for prompts/list responses.
type RefValidator ¶
type RefValidator interface {
ValidateRefs(tools []ToolDef, resourceURIs []string, templateURIs []string) []string
}
RefValidator is an optional interface that ExtensionProviders can implement to validate tool-to-resource references at server startup. The server calls ValidateRefs for each extension that implements this interface, passing all registered tools and the URIs of registered resources and templates. Returns a list of human-readable warning messages (empty if all refs resolve).
type RelatedTaskMeta ¶ added in v0.2.41
type RelatedTaskMeta struct {
TaskID string `json:"taskId"`
}
RelatedTaskMeta identifies a task associated with a result. Per MCP spec, tasks/result responses MUST include this in _meta["io.modelcontextprotocol/related-task"].
type RemediationHint ¶ added in v0.2.41
type RemediationHint struct {
// Type identifies the remediation mechanism. SEP-defined values:
// "url", "oauth_authorization_details".
Type string
// Extra carries type-specific members. These are flattened to the
// top level of the hint object on marshal (per SEP wire format).
Extra map[string]any
}
RemediationHint is a single remediation suggestion within an authorization denial. Per SEP-2643, each hint has a `type` field plus zero or more type-specific members at the **top level** of the object (not nested).
To match the SEP wire format, this type uses custom JSON marshaling that flattens Extra fields onto the top level alongside `type`.
Example wire format for the oauth_authorization_details hint:
{
"type": "oauth_authorization_details",
"authorization_details": [ ... ]
}
EXPERIMENTAL: subject to rename/removal as SEP-2643 evolves.
func OAuthAuthorizationDetailsHint ¶ added in v0.2.41
func OAuthAuthorizationDetailsHint(authorizationDetails any) RemediationHint
OAuthAuthorizationDetailsHint creates a SEP-2643 remediation hint of type "oauth_authorization_details" carrying an RFC 9396 authorization_details array. Used for UC2 example 2 (RAR) and UC3 (additional credential).
func URLHint ¶ added in v0.2.41
func URLHint() RemediationHint
URLHint creates a SEP-2643 remediation hint of type "url". Used for UC1 (URL-based approval composed with URLElicitationRequiredError).
func (RemediationHint) MarshalJSON ¶ added in v0.2.41
func (h RemediationHint) MarshalJSON() ([]byte, error)
MarshalJSON flattens Extra at the top level of the JSON object, alongside the "type" field, per SEP-2643.
func (*RemediationHint) UnmarshalJSON ¶ added in v0.2.41
func (h *RemediationHint) UnmarshalJSON(b []byte) error
UnmarshalJSON splits the "type" field from the other top-level members, reversing the flattening done by MarshalJSON.
type Request ¶
type Request struct {
JSONRPC string `json:"jsonrpc"`
ID json.RawMessage `json:"id"`
Method string `json:"method"`
Params json.RawMessage `json:"params,omitempty"`
}
Request is a JSON-RPC 2.0 request envelope.
func (*Request) IsNotification ¶
IsNotification returns true if this request has no ID (JSON-RPC notification).
type RequestFunc ¶
RequestFunc sends a server-to-client JSON-RPC request and blocks until the client sends a response. method is the JSON-RPC method (e.g., "sampling/createMessage"). params will be JSON-marshaled as the request's params field. Returns the raw JSON result on success, or an error on timeout, transport failure, or JSON-RPC error from the client.
type ResourceContent ¶
type ResourceContent struct {
URI string `json:"uri"`
MimeType string `json:"mimeType,omitempty"`
Text string `json:"text,omitempty"`
Blob string `json:"blob,omitempty"`
}
ResourceContent is an embedded resource reference in a tool result.
type ResourceContentMeta ¶
type ResourceContentMeta struct {
// UI contains MCP Apps presentation metadata.
UI *UIMetadata `json:"ui,omitempty"`
}
ResourceContentMeta holds per-content metadata in resources/read responses. Takes precedence over the resource-level metadata from resources/list.
type ResourceContext ¶ added in v0.2.0
type ResourceContext struct {
BaseContext
}
ResourceContext is the context passed to ResourceHandler and TemplateHandler functions. It embeds BaseContext with no additional methods — resources don't support progress or content streaming.
func NewResourceContext ¶ added in v0.2.0
func NewResourceContext(ctx context.Context) ResourceContext
NewResourceContext constructs a ResourceContext from a standard context.Context.
func (ResourceContext) DetachFromClient ¶ added in v0.2.0
func (rc ResourceContext) DetachFromClient() ResourceContext
DetachFromClient returns a ResourceContext that preserves session state but is NOT cancelled when the client disconnects.
type ResourceDef ¶
type ResourceDef struct {
// URI uniquely identifies this resource.
URI string `json:"uri"`
// Name is a human-readable short name.
Name string `json:"name"`
// Title is an optional display title.
Title string `json:"title,omitempty"`
// Description explains what this resource provides.
Description string `json:"description,omitempty"`
// MimeType is the MIME type of the resource content.
MimeType string `json:"mimeType,omitempty"`
// Annotations holds optional metadata for this resource.
Annotations map[string]any `json:"annotations,omitempty"`
// Timeout is a per-resource execution timeout. Not serialized to clients.
Timeout time.Duration `json:"-"`
}
ResourceDef describes a resource exposed via MCP.
type ResourceHandler ¶
type ResourceHandler func(ctx ResourceContext, req ResourceRequest) (ResourceResult, error)
ResourceHandler reads a resource by URI.
type ResourceReadContent ¶
type ResourceReadContent struct {
URI string `json:"uri"`
MimeType string `json:"mimeType,omitempty"`
Text string `json:"text,omitempty"`
Blob string `json:"blob,omitempty"`
// Meta holds per-content metadata (e.g., UI overrides).
// Takes precedence over the resource-level _meta from resources/list.
Meta *ResourceContentMeta `json:"_meta,omitempty"`
}
ResourceReadContent is a single content item returned by resources/read. Either Text or Blob is set, not both.
type ResourceRequest ¶
type ResourceRequest struct {
URI string
}
ResourceRequest is the validated input passed to a ResourceHandler.
type ResourceResult ¶
type ResourceResult struct {
Contents []ResourceReadContent `json:"contents"`
}
ResourceResult is the response from a resource handler.
func (*ResourceResult) UnmarshalJSON ¶ added in v0.1.21
func (r *ResourceResult) UnmarshalJSON(data []byte) error
UnmarshalJSON decodes a ResourceResult, tolerating a single-object `contents` form from peers that emit a bare object instead of the spec-canonical array. Single objects are wrapped into a 1-element slice. See #81.
type ResourceTemplate ¶
type ResourceTemplate struct {
// URITemplate is an RFC 6570 URI template (e.g., "file:///{path}").
// This serves as the unique identifier for the template in the registry —
// registering a template with the same URI template string overwrites the
// previous registration.
URITemplate string `json:"uriTemplate"`
// Name is a human-readable short name.
Name string `json:"name"`
// Title is an optional display title.
Title string `json:"title,omitempty"`
// Description explains what this template provides.
Description string `json:"description,omitempty"`
// MimeType is the default MIME type for resources matching this template.
MimeType string `json:"mimeType,omitempty"`
// Annotations holds optional metadata for this template.
Annotations map[string]any `json:"annotations,omitempty"`
// Timeout is a per-template execution timeout. Not serialized to clients.
Timeout time.Duration `json:"-"`
}
ResourceTemplate describes a parameterized resource URI template.
type ResourceTemplatesListResult ¶
type ResourceTemplatesListResult struct {
ResourceTemplates []ResourceTemplate `json:"resourceTemplates"`
NextCursor string `json:"nextCursor,omitempty"`
// TTL is the SEP-2549 cache freshness hint in seconds. See
// ToolsListResult.TTL for full semantics — same three-state pointer
// shape (nil = no guidance, &0 = do not cache, &N>0 = N seconds fresh).
TTL *int `json:"ttl,omitempty"`
}
ResourceTemplatesListResult is the typed result for resources/templates/list responses.
type ResourceUpdatedNotification ¶
type ResourceUpdatedNotification struct {
URI string `json:"uri"`
}
ResourceUpdatedNotification is the params payload for notifications/resources/updated. Sent by the server to subscribed clients when a resource's content has changed.
type ResourcesCap ¶
type ResourcesCap struct {
Subscribe bool `json:"subscribe,omitempty"`
ListChanged bool `json:"listChanged,omitempty"`
}
ResourcesCap describes the server's resources capability.
type ResourcesListResult ¶
type ResourcesListResult struct {
Resources []ResourceDef `json:"resources"`
NextCursor string `json:"nextCursor,omitempty"`
// TTL is the SEP-2549 cache freshness hint in seconds. See
// ToolsListResult.TTL for full semantics — same three-state pointer
// shape (nil = no guidance, &0 = do not cache, &N>0 = N seconds fresh).
TTL *int `json:"ttl,omitempty"`
}
ResourcesListResult is the typed result for resources/list responses.
type Response ¶
type Response struct {
JSONRPC string `json:"jsonrpc"`
ID json.RawMessage `json:"id"`
Result any `json:"result,omitempty"`
Error *Error `json:"error,omitempty"`
}
Response is a JSON-RPC 2.0 response.
func NewAuthorizationDenialError ¶ added in v0.2.41
func NewAuthorizationDenialError(id []byte, code int, message string, denial AuthorizationDenial) *Response
NewAuthorizationDenialError creates a JSON-RPC error response with an authorization denial envelope in the error data. The error code should be chosen based on the use case:
- UC1 (URL approval): use ErrCodeURLElicitationRequired (-32042)
- UC2/UC3 (credential change): use the tool execution error code
The denial is composed into the error data alongside any other fields (e.g., elicitations for UC1).
EXPERIMENTAL: subject to change as the FineGrainedAuth SEP evolves.
func NewErrorResponse ¶
func NewErrorResponse(id json.RawMessage, code int, message string) *Response
NewErrorResponse creates an error response for the given request ID.
func NewErrorResponseWithData ¶
NewErrorResponseWithData creates an error response with additional structured data. Used for protocol errors that carry machine-readable context (e.g., supported versions).
func NewResponse ¶
func NewResponse(id json.RawMessage, result any) *Response
NewResponse creates a success response for the given request ID. Result is stored as-is and serialized once when the transport sends it.
func NewURLElicitationRequiredError ¶ added in v0.2.41
func NewURLElicitationRequiredError(id json.RawMessage, message string, data URLElicitationRequiredErrorData) *Response
NewURLElicitationRequiredError creates a -32042 error response indicating that URL-based elicitation flows must be completed before retrying.
type ResultType ¶ added in v0.2.41
type ResultType string
ResultType is the discriminator on a tools/call response.
"task" indicates a task-based response (CreateTaskResult). The "complete" and "input_required" values come from MRTR (Multi-Round Tool Result, SEP-2322) and signal whether a tool result is final or expects further input rounds. The "input_required" variant was renamed from "incomplete" in SEP-2322 commit de6d76fb, merged 2026-05-06.
const ( ResultTypeTask ResultType = "task" ResultTypeComplete ResultType = "complete" // SEP-2322 ResultTypeInputRequired ResultType = "input_required" // SEP-2322 )
type Root ¶ added in v0.1.18
type Root struct {
// URI is the root's location (e.g., "file:///home/user/project").
URI string `json:"uri"`
// Name is an optional human-readable label for this root.
Name string `json:"name,omitempty"`
}
Root represents a filesystem root provided by the client. Roots inform the server about available directories for tool execution.
type RootsCap ¶
type RootsCap struct {
ListChanged bool `json:"listChanged,omitempty"`
}
RootsCap describes the client's roots capability.
type RootsListResult ¶ added in v0.1.18
type RootsListResult struct {
Roots []Root `json:"roots"`
}
RootsListResult is the response to a roots/list server-to-client request.
type SamplingMessage ¶
SamplingMessage is a single message in a sampling/createMessage request.
func (*SamplingMessage) UnmarshalJSON ¶ added in v0.1.21
func (m *SamplingMessage) UnmarshalJSON(data []byte) error
UnmarshalJSON decodes a SamplingMessage, tolerating an array-form `content` field (first element wins). The spec currently specifies single-content for SamplingMessage; widening to multi-part is tracked by #141 and will reuse this hook by switching to decodeContentSlice. See #81.
type SamplingMeta ¶ added in v0.1.29
type SamplingMeta struct {
// UI contains MCP Apps presentation metadata.
// When set, the host can associate the sampling request with a UI resource.
UI *UIMetadata `json:"ui,omitempty"`
// RelatedTask identifies the task this request is associated with.
// Set automatically by TaskContext.TaskSample() so the client can
// correlate side-channel requests with the originating task.
RelatedTask *RelatedTaskMeta `json:"io.modelcontextprotocol/related-task,omitempty"`
}
SamplingMeta holds protocol-level metadata for a sampling request. Serialized as "_meta" in the sampling/createMessage params.
type SchemaGenerator ¶ added in v0.2.26
type SchemaGenerator func(v any) json.RawMessage
SchemaGenerator converts a Go value (typically a pointer to a struct) into a JSON Schema representation. The value is used only for type reflection — its fields are not read.
Implementations should return a JSON-encoded schema suitable for ToolDef.InputSchema / OutputSchema (type: "object" with properties, required, etc.).
Example usage:
schema := sg(new(MyInput)) // reflects on MyInput struct tags
type ScopeAwareTokenSource ¶
type ScopeAwareTokenSource interface {
TokenSource
// TokenForScopes invalidates the cached token and triggers a new
// authorization flow with the given scopes merged into the existing set.
TokenForScopes(scopes []string) (string, error)
}
ScopeAwareTokenSource extends TokenSource with scope step-up capability. When the server returns 403 with required scopes in the WWW-Authenticate header, the client transport calls TokenForScopes to re-authenticate with broader permissions.
Implementations that support interactive re-auth (like OAuthTokenSource) should implement this interface. Static tokens and implementations that cannot acquire new scopes need not implement it — the transport will return a ClientAuthError instead of retrying.
type ServerCapabilities ¶
type ServerCapabilities struct {
Tools *ToolsCap `json:"tools,omitempty"`
Resources *ResourcesCap `json:"resources,omitempty"`
Prompts *PromptsCap `json:"prompts,omitempty"`
Tasks *TasksCap `json:"tasks,omitempty"`
Logging *struct{} `json:"logging,omitempty"`
Completions *struct{} `json:"completions,omitempty"`
Extensions map[string]ExtensionCapability `json:"extensions,omitempty"`
}
ServerCapabilities describes the features the server supports, returned in the initialize response.
type ServerInfo ¶
type ServerInfo struct {
Name string `json:"name"`
Version string `json:"version"`
Title string `json:"title,omitempty"`
Description string `json:"description,omitempty"`
Instructions string `json:"instructions,omitempty"`
WebsiteURL string `json:"websiteUrl,omitempty"`
}
ServerInfo identifies an MCP server in the initialize response.
type ServerRequestHandler ¶
ServerRequestHandler handles server-to-client JSON-RPC requests (sampling, elicitation). The client registers this on the transport so the server can send requests during tool execution and receive responses.
type Stability ¶
type Stability string
Stability represents the maturity level of an extension.
const ( // Experimental indicates the extension is in development and may change. Experimental Stability = "experimental" // Stable indicates the extension is production-ready. Stable Stability = "stable" // Deprecated indicates the extension will be removed in a future version. Deprecated Stability = "deprecated" )
type TaskError ¶ added in v0.2.41
type TaskError struct {
Code int `json:"code"`
Message string `json:"message"`
Data any `json:"data,omitempty"`
}
TaskError is the error shape for protocol-level failures (status: failed). Mirrors the JSON-RPC error object shape.
type TaskInfo ¶ added in v0.2.41
type TaskInfo struct {
TaskID string `json:"taskId"`
ParentTaskID string `json:"parentTaskId,omitempty"` // set for sub-tasks spawned by TaskContext.SpawnTool
Status TaskStatus `json:"status"`
StatusMessage string `json:"statusMessage,omitempty"`
CreatedAt string `json:"createdAt"`
LastUpdatedAt string `json:"lastUpdatedAt"`
TTL *int `json:"ttl"` // milliseconds; null = unlimited
PollInterval int `json:"pollInterval,omitempty"` // milliseconds
}
TaskInfo is the wire-format task object returned by tasks/* methods. TTL is required but nullable per spec: *int with null = unlimited.
type TaskInfoV2 ¶ added in v0.2.41
type TaskInfoV2 struct {
TaskID string `json:"taskId"`
Status TaskStatus `json:"status"`
StatusMessage string `json:"statusMessage,omitempty"`
CreatedAt string `json:"createdAt"`
LastUpdatedAt string `json:"lastUpdatedAt"`
TTLMs *int `json:"ttlMs"` // required+nullable, null = unlimited
PollIntervalMs *int `json:"pollIntervalMs,omitempty"` // optional
}
TaskInfoV2 is the v2 wire shape for task metadata. Differences from (v1) TaskInfo:
- ttl renamed to ttlMs. Units in the field name. Integer milliseconds.
- pollInterval renamed to pollIntervalMs. Integer milliseconds.
- parentTaskId removed. SEP-2663 does not expose task parentage.
The TaskStore already uses milliseconds internally, so the v2 wire surface is a pass-through (no unit conversion at the boundary). Per SEP-2663 the server MAY change ttlMs over the lifetime of a task (e.g. reset on each tasks/get to extend liveness while a client is observing it).
type TaskStatus ¶ added in v0.2.41
type TaskStatus string
TaskStatus is the lifecycle state of an MCP task.
const ( // TaskWorking means the task is actively executing. TaskWorking TaskStatus = "working" // TaskInputRequired means the task is paused, awaiting client input // (e.g., via elicitation or sampling). TaskInputRequired TaskStatus = "input_required" // TaskCompleted means the task succeeded (terminal). TaskCompleted TaskStatus = "completed" // TaskFailed means the task errored (terminal). TaskFailed TaskStatus = "failed" // TaskCancelled means the task was cancelled by the client (terminal). TaskCancelled TaskStatus = "cancelled" )
func (TaskStatus) IsTerminal ¶ added in v0.2.41
func (s TaskStatus) IsTerminal() bool
IsTerminal reports whether the status is a terminal state.
type TaskSupport ¶ added in v0.2.41
type TaskSupport string
TaskSupport declares how a tool interacts with the tasks capability. Set on ToolDef.Execution.TaskSupport.
const ( // TaskSupportRequired means clients SHOULD invoke as a task; servers // MUST return an error if clients ignore the requirement. TaskSupportRequired TaskSupport = "required" // TaskSupportOptional means clients may choose either synchronous // or task-based invocation. TaskSupportOptional TaskSupport = "optional" // TaskSupportForbidden means clients must NOT invoke as a task. TaskSupportForbidden TaskSupport = "forbidden" )
type TasksCap ¶ added in v0.2.41
type TasksCap struct {
List *TasksCapMethod `json:"list,omitempty"`
Cancel *TasksCapMethod `json:"cancel,omitempty"`
Requests *TasksCapRequests `json:"requests,omitempty"`
}
TasksCap declares server support for the tasks capability in ServerCapabilities. Per spec: nested structure with list, cancel, requests.
type TasksCapElicitationMethods ¶ added in v0.2.41
type TasksCapElicitationMethods struct {
Create *TasksCapMethod `json:"create,omitempty"`
}
TasksCapElicitationMethods declares which elicitation methods support task augmentation.
type TasksCapMethod ¶ added in v0.2.41
type TasksCapMethod struct{}
TasksCapMethod is an empty struct used as a marker in capability negotiation.
type TasksCapRequests ¶ added in v0.2.41
type TasksCapRequests struct {
Tools *TasksCapToolsMethods `json:"tools,omitempty"`
Sampling *TasksCapSamplingMethods `json:"sampling,omitempty"`
Elicitation *TasksCapElicitationMethods `json:"elicitation,omitempty"`
}
TasksCapRequests declares which request types support task-augmented responses.
type TasksCapSamplingMethods ¶ added in v0.2.41
type TasksCapSamplingMethods struct {
CreateMessage *TasksCapMethod `json:"createMessage,omitempty"`
}
TasksCapSamplingMethods declares which sampling methods support task augmentation.
type TasksCapToolsMethods ¶ added in v0.2.41
type TasksCapToolsMethods struct {
Call *TasksCapMethod `json:"call,omitempty"`
}
TasksCapToolsMethods declares which tool methods support task augmentation.
type TemplateHandler ¶
type TemplateHandler func(ctx ResourceContext, uri string, params map[string]string) (ResourceResult, error)
TemplateHandler reads a resource matched by a URI template. The uri parameter is the full resolved URI, params contains the extracted template variables.
type TokenSource ¶
type TokenSource interface {
// Token returns a valid access token, refreshing if necessary.
Token() (string, error)
}
TokenSource provides access tokens for the MCP client. Simple implementations return a static token; OAuth implementations handle the full flow including discovery, browser auth, and refresh.
type ToolContext ¶ added in v0.2.0
type ToolContext struct {
BaseContext
// contains filtered or unexported fields
}
ToolContext is the context passed to ToolHandler functions. It embeds BaseContext and adds tool-specific methods (EmitProgress, EmitContent).
func NewToolContext ¶ added in v0.2.0
func NewToolContext(ctx context.Context) ToolContext
NewToolContext constructs a ToolContext from a standard context.Context. Called by the dispatch layer before invoking tool handlers.
func NewToolContextWithMRTR ¶ added in v0.2.41
func NewToolContextWithMRTR(ctx context.Context, progressToken any, inputResponses InputResponses, requestState string) ToolContext
NewToolContextWithMRTR constructs a ToolContext for an SEP-2322 MRTR retry: progress token plus the inputResponses/requestState the client echoed back. Called by the tools/call dispatch layer after parsing the request envelope; handlers read the values via ctx.InputResponse / ctx.InputResponses / ctx.RequestState.
func NewToolContextWithProgress ¶ added in v0.2.26
func NewToolContextWithProgress(ctx context.Context, progressToken any) ToolContext
NewToolContextWithProgress constructs a ToolContext with a stored progress token. The dispatch layer passes the token from _meta.progressToken so that handlers can call ctx.Progress() without threading the token manually.
func (ToolContext) DetachFromClient ¶ added in v0.2.0
func (tc ToolContext) DetachFromClient() ToolContext
DetachFromClient returns a ToolContext that preserves session state but is NOT cancelled when the client disconnects.
func (ToolContext) EmitContent ¶ added in v0.2.0
func (tc ToolContext) EmitContent(requestID json.RawMessage, content Content)
EmitContent sends a partial content block to the client during tool execution. On non-streaming transports, the notification is silently dropped.
func (ToolContext) EmitProgress ¶ added in v0.2.0
func (tc ToolContext) EmitProgress(token any, progress, total float64, message string)
EmitProgress sends a notifications/progress to the connected client. No-op if token is nil. Prefer ctx.Progress() when the token is stored in the context (TypedTool handlers, or dispatch with NewToolContextWithProgress).
func (ToolContext) HasInputResponses ¶ added in v0.2.41
func (tc ToolContext) HasInputResponses() bool
HasInputResponses reports whether the client echoed any inputResponses back. Equivalent to len(ctx.InputResponses()) > 0; provided for readable branching in handlers ("if ctx.HasInputResponses() { ... }").
func (ToolContext) InputResponse ¶ added in v0.2.41
func (tc ToolContext) InputResponse(key string) json.RawMessage
InputResponse returns the raw response payload for a specific request key from the inputResponses map, or nil if the key is missing. The payload shape matches the method declared in the original InputRequest (ElicitResult, CreateMessageResult, ListRootsResult, ...) — callers json.Unmarshal it into the matching typed struct.
func (ToolContext) InputResponses ¶ added in v0.2.41
func (tc ToolContext) InputResponses() InputResponses
InputResponses returns the SEP-2322 inputResponses map the client echoed back into this tools/call. Nil on the first call (no prior InputRequiredResult) or when the client did not include the field.
Handlers branch on this to detect retries: nil = first call, ask for input; non-nil = client has answered, build the final result.
func (ToolContext) Progress ¶ added in v0.2.26
func (tc ToolContext) Progress(progress, total float64, message string)
Progress sends a notifications/progress using the stored progress token from _meta.progressToken. No-op if the client didn't request progress. This is the preferred method in TypedTool handlers where the token is automatically captured from the request.
func (ToolContext) ProgressToken ¶ added in v0.2.26
func (tc ToolContext) ProgressToken() any
ProgressToken returns the stored progress token, or nil if not set.
func (ToolContext) RequestInput ¶ added in v0.2.41
func (tc ToolContext) RequestInput(reqs InputRequests) (ToolResult, error)
RequestInput is the SEP-2322 ephemeral retry primitive. Handlers return the value as their ToolResult to signal "I need more input from the client before I can produce a final result"; the dispatch layer reshapes the response on the wire as an InputRequiredResult and mints a fresh requestState for the next round.
Usage in a tool handler:
func myTool(ctx core.ToolContext, req core.ToolRequest) (core.ToolResult, error) {
if !ctx.HasInputResponses() {
return ctx.RequestInput(core.InputRequests{
"user_name": {
Method: "elicitation/create",
Params: rawElicitationParams,
},
})
}
// Decode ctx.InputResponse("user_name") and build the final result.
}
The error return is always nil — the helper exists so the call site reads as a single return statement matching the ToolHandler signature.
func (ToolContext) RequestState ¶ added in v0.2.41
func (tc ToolContext) RequestState() string
RequestState returns the SEP-2322 requestState token the client echoed back. Empty on the first call. The token has already been verified by the dispatch layer (HMAC-checked when a signing key is configured), so handlers can trust its presence as proof the round-trip is intact — the embedded payload itself is opaque to handlers.
type ToolDef ¶
type ToolDef struct {
// Name is the tool identifier used in tools/call.
Name string `json:"name"`
// Description is a human-readable summary of what the tool does.
Description string `json:"description"`
// InputSchema is the JSON Schema for the tool's arguments.
// Typically a map[string]any with "type": "object", "properties": {...}, "required": [...].
// Arbitrary JSON Schema fields (e.g. "$schema", "$defs", "$ref",
// "additionalProperties") are preserved as-is through registration,
// serialization, and client-side deserialization.
InputSchema any `json:"inputSchema"`
// OutputSchema is an optional JSON Schema for the tool's structuredContent output.
// When present, the tool SHOULD return StructuredContent matching this schema.
// Per MCP spec: enables clients to validate and process tool output programmatically.
OutputSchema any `json:"outputSchema,omitempty"`
// Execution holds task-related execution metadata.
// Per MCP spec: declares whether this tool supports async task execution.
Execution *ToolExecution `json:"execution,omitempty"`
// Annotations holds optional metadata for this tool.
// Convention: {"experimental": true} marks experimental tools.
Annotations map[string]any `json:"annotations,omitempty"`
// Meta holds protocol-level metadata (e.g., UI presentation hints).
// Serialized as "_meta" in the tools/list response.
Meta *ToolMeta `json:"_meta,omitempty"`
// Timeout is a per-tool execution timeout. If set, overrides the
// server-wide WithToolTimeout for this tool. Not serialized to clients.
Timeout time.Duration `json:"-"`
// RequiredScopes are OAuth scopes the caller's access token must include
// to invoke this tool. Enforced by ext/auth's scope middleware
// (auth.NewToolScopeMiddleware), which returns HTTP 403 + WWW-Authenticate
// when scopes are missing — per SEP-2643 (FineGrainedAuth UC2).
//
// Not serialized to clients (it's enforcement metadata, not API contract).
// Empty/nil means no per-tool scope check; the tool is callable by any
// authenticated client (subject to global server.WithRequiredScopes).
RequiredScopes []string `json:"-"`
}
ToolDef describes a tool exposed via MCP.
type ToolExecution ¶ added in v0.2.41
type ToolExecution struct {
TaskSupport TaskSupport `json:"taskSupport"`
}
ToolExecution describes task-related execution metadata on a tool definition. Per MCP spec: declared at the tool level, not in annotations (because it implies binding guarantees about behavior, not hints).
type ToolHandler ¶
type ToolHandler func(ctx ToolContext, req ToolRequest) (ToolResult, error)
ToolHandler is the function signature for tool implementations. The ToolContext provides typed access to session capabilities (EmitLog, EmitProgress, EmitContent, Sample, Elicit, etc.) with IDE discoverability.
type ToolMeta ¶
type ToolMeta struct {
// UI contains MCP Apps presentation metadata.
UI *UIMetadata `json:"ui,omitempty"`
}
ToolMeta holds protocol-level metadata for a tool definition. Serialized as "_meta" in the tools/list response.
type ToolRequest ¶
type ToolRequest struct {
// Name of the tool being called.
Name string
// Arguments is the raw JSON arguments from the tools/call params.
Arguments json.RawMessage
// RequestID is the JSON-RPC request ID.
RequestID json.RawMessage
// ProgressToken is the token from the request's _meta.progressToken field.
// Nil if the client did not request progress reporting. Pass this to
// EmitProgress to send notifications/progress notifications.
ProgressToken any
// InputResponses is the SEP-2322 ephemeral MRTR retry payload — the
// client echoes the inputResponses map back into the SAME tools/call
// request that previously returned an InputRequiredResult. Keys MUST match
// those the server returned in the matching InputRequests; values are
// opaque per-method response payloads (ElicitResult, CreateMessageResult,
// ListRootsResult, ...). Nil on the first call.
//
// Handlers usually access this through ToolContext.InputResponses() /
// ToolContext.InputResponse(key); the raw field is here so middleware
// and conformance tests can inspect the wire payload directly.
InputResponses InputResponses
// RequestState is the opaque session-continuation token the client
// echoed back from a previous InputRequiredResult. The dispatch layer
// verifies it (HMAC when a key is configured) before invoking the
// handler. Empty on the first call.
RequestState string
}
ToolRequest is the validated input passed to a ToolHandler.
func (*ToolRequest) Bind ¶
func (r *ToolRequest) Bind(v any) error
Bind unmarshals the tool arguments into the provided struct.
type ToolResult ¶
type ToolResult struct {
// ResultType is the SEP-2322 polymorphic-dispatch discriminator. For
// sync tools/call responses the wire value is "complete" (defaulted by
// MarshalJSON when this field is empty). Task-creating responses use
// ResultTypeTask on CreateTaskResult; multi-round results use
// ResultTypeInputRequired on InputRequiredResult instead.
ResultType ResultType `json:"resultType"`
// Content is the list of content items to return.
Content []Content `json:"content"`
// IsError indicates the tool execution failed (but the JSON-RPC call itself succeeded).
IsError bool `json:"isError,omitempty"`
// StructuredContent holds optional structured data for the tool result.
// When the tool has an OutputSchema, this field carries typed data matching
// that schema. On error (IsError=true), it can carry structured error details.
// Per MCP spec: "If outputSchema is present, structuredContent SHOULD be included."
StructuredContent any `json:"structuredContent,omitempty"`
// Meta holds optional result metadata (e.g., pagination cursor).
Meta *ToolResultMeta `json:"_meta,omitempty"`
// IsInputRequired is the in-process sentinel signalling that the handler
// is returning an MRTR InputRequiredResult rather than a final tool result.
// Set by ctx.RequestInput; the dispatch layer detects it, mints / refreshes
// the requestState, and reshapes the wire payload as InputRequiredResult.
// Never serialized — this field is in-process plumbing only.
//
// Renamed from IsIncomplete in lockstep with the SEP-2322 wire-variant
// rename (commit de6d76fb merged 2026-05-06).
IsInputRequired bool `json:"-"`
// InputRequests is the SEP-2322 inputRequests map staged by ctx.RequestInput
// when IsInputRequired is true. Dispatch reads it to build the
// InputRequiredResult envelope. Nil for normal complete results. Never
// serialized through ToolResult — dispatch reshapes the response into
// InputRequiredResult.
InputRequests InputRequests `json:"-"`
}
ToolResult is the response from a tool handler.
func ErrorResult ¶
func ErrorResult(text string) ToolResult
ErrorResult creates a ToolResult marked as an error with the given message.
func StructuredError ¶
func StructuredError(text string, data any) ToolResult
StructuredError creates a ToolResult marked as an error with both text and structured error data. Use this to return machine-readable error details alongside a human-readable error message.
func StructuredResult ¶
func StructuredResult(text string, data any) ToolResult
StructuredResult creates a ToolResult with both text content and structured data. Use this when the tool has an OutputSchema — structuredContent carries typed data matching the schema, while content provides a human-readable summary.
func TextResult ¶
func TextResult(text string) ToolResult
TextResult creates a ToolResult with a single text content item.
func (ToolResult) MarshalJSON ¶ added in v0.2.41
func (r ToolResult) MarshalJSON() ([]byte, error)
MarshalJSON ensures every ToolResult on the wire carries a ResultType. Empty defaults to ResultTypeComplete so existing callers and struct literals don't have to set the field explicitly. SEP-2322 requires this discriminator on every non-task tools/call response so clients can dispatch sync vs task vs multi-round without inspecting payload shape.
func (*ToolResult) UnmarshalJSON ¶ added in v0.1.21
func (r *ToolResult) UnmarshalJSON(data []byte) error
UnmarshalJSON decodes a ToolResult, tolerating a single-object `content` form from peers that haven't caught up to the array-form spec. Single objects are wrapped into a 1-element slice. See #81.
type ToolResultMeta ¶ added in v0.1.18
type ToolResultMeta struct {
// NextCursor is a pagination cursor for fetching the next page.
// Empty when there are no more pages.
NextCursor string `json:"nextCursor,omitempty"`
// RelatedTask identifies a task associated with this result.
// Per MCP spec: set by tasks/result responses.
RelatedTask *RelatedTaskMeta `json:"io.modelcontextprotocol/related-task,omitempty"`
}
ToolResultMeta carries optional metadata on a tool result.
type ToolsCap ¶
type ToolsCap struct {
ListChanged bool `json:"listChanged,omitempty"`
}
ToolsCap describes the server's tools capability.
type ToolsListResult ¶
type ToolsListResult struct {
Tools []ToolDef `json:"tools"`
NextCursor string `json:"nextCursor,omitempty"`
// TTL is the SEP-2549 cache freshness hint in SECONDS that the client
// MAY use to cache the tools list before re-fetching. Semantics mirror
// HTTP Cache-Control: max-age:
//
// - nil (omitted on the wire) — no server guidance; client falls back
// to notifications/list_changed or its own heuristics.
// - &0 ("ttl": 0 on the wire) — explicit "do not cache"; client SHOULD
// re-fetch every time the list is needed.
// - >0 — the list is fresh for this many seconds; the client SHOULD NOT
// re-fetch before the TTL expires unless it receives list_changed.
//
// Pointer semantics matter: omitempty omits nil but keeps a pointer to 0,
// so the spec's three states (absent / 0 / positive) round-trip correctly.
TTL *int `json:"ttl,omitempty"`
}
ToolsListResult is the typed result for tools/list responses.
type Transport ¶
type Transport interface {
// Connect establishes the transport (e.g., SSE handshake, session creation).
Connect(ctx context.Context) error
// Call sends a JSON-RPC request and returns the response.
Call(ctx context.Context, req *Request) (*Response, error)
// Notify sends a JSON-RPC notification (no response expected).
Notify(ctx context.Context, req *Request) error
// Close shuts down the transport.
Close() error
// SessionID returns the transport's session identifier (empty if none).
SessionID() string
}
Transport is the minimal interface for client-server communication. Both HTTP transports and the in-process transport satisfy this interface. The client package consumes it; the server package provides implementations.
type TypedToolOption ¶ added in v0.2.26
type TypedToolOption func(*typedToolConfig)
TypedToolOption configures optional fields on a TypedTool.
func WithToolAnnotations ¶ added in v0.2.26
func WithToolAnnotations(a map[string]any) TypedToolOption
WithToolAnnotations sets the Annotations field on the generated ToolDef.
func WithToolMeta ¶ added in v0.2.26
func WithToolMeta(m *ToolMeta) TypedToolOption
WithToolMeta sets the Meta field on the generated ToolDef.
func WithToolRequiredScopes ¶ added in v0.2.41
func WithToolRequiredScopes(scopes ...string) TypedToolOption
WithToolRequiredScopes sets the RequiredScopes field on the generated ToolDef. When auth.NewToolScopeMiddleware is registered on the server, calls to this tool from clients without all of the named scopes are rejected at the transport layer with HTTP 403 + WWW-Authenticate per RFC 6750.
func WithTypedToolTimeout ¶ added in v0.2.26
func WithTypedToolTimeout(d time.Duration) TypedToolOption
WithTypedToolTimeout sets a per-tool execution timeout on the generated ToolDef.
type TypedToolResult ¶ added in v0.2.26
type TypedToolResult struct {
ToolDef
Handler ToolHandler
}
TypedToolResult holds the generated ToolDef and wrapped ToolHandler produced by TypedTool or TextTool. Use this to pass typed tool registrations to any registration API (server.Register, ext/ui.RegisterAppTool, etc.).
func TextTool ¶ added in v0.2.26
func TextTool[In any](name, desc string, handler func(ctx ToolContext, input In) (string, error), opts ...TypedToolOption, ) TypedToolResult
TextTool creates a ToolDef and ToolHandler with auto-derived InputSchema where the handler returns a string. This is sugar for TypedTool[In, string].
Example:
r := core.TextTool[GreetInput]("greet", "Say hello",
func(ctx core.ToolContext, input GreetInput) (string, error) {
return "Hello, " + input.Name, nil
},
)
func TypedTool ¶ added in v0.2.26
func TypedTool[In, Out any](name, desc string, handler func(ctx ToolContext, input In) (Out, error), opts ...TypedToolOption, ) TypedToolResult
TypedTool creates a ToolDef and ToolHandler with InputSchema (and optionally OutputSchema) auto-derived from Go struct types via the current SchemaGenerator. The handler receives typed input — no manual Bind() needed.
The Out type parameter controls output behavior:
- string: handler returns text, wrapped via TextResult. No OutputSchema.
- ToolResult: handler returns a ToolResult directly. No OutputSchema.
- any struct: handler returns typed data. OutputSchema auto-derived from Out. Result uses StructuredResult with JSON text fallback.
Example (text output — use TextTool for convenience):
r := core.TypedTool[SearchInput, string]("search", "Search books",
func(ctx core.ToolContext, input SearchInput) (string, error) {
return fmt.Sprintf("found %d books", len(results)), nil
},
)
Example (structured output):
r := core.TypedTool[SearchInput, SearchOutput]("search", "Search books",
func(ctx core.ToolContext, input SearchInput) (SearchOutput, error) {
return SearchOutput{Results: results, Total: len(results)}, nil
},
)
type UICSPConfig ¶
type UICSPConfig struct {
// ConnectDomains → CSP connect-src (fetch, XHR, WebSocket targets).
ConnectDomains []string `json:"connectDomains,omitempty"`
// ResourceDomains → CSP script-src, style-src, img-src, font-src, media-src.
ResourceDomains []string `json:"resourceDomains,omitempty"`
// FrameDomains → CSP frame-src (nested iframes).
FrameDomains []string `json:"frameDomains,omitempty"`
// BaseUriDomains → CSP base-uri.
BaseUriDomains []string `json:"baseUriDomains,omitempty"`
}
UICSPConfig declares external domains for Content-Security-Policy construction. Hosts use these declarations when sandboxing MCP App iframes.
type UIMetadata ¶
type UIMetadata struct {
// ResourceUri points to a ui:// resource containing the HTML to render.
// Required for tools that want inline UI rendering.
ResourceUri string `json:"resourceUri,omitempty"`
// Visibility controls who can see/call this tool.
// Default (nil): host applies its own default (typically ["model", "app"]).
Visibility []UIVisibility `json:"visibility,omitempty"`
// CSP declares external domains the app needs to load resources from.
// Hosts construct Content-Security-Policy from these declarations.
CSP *UICSPConfig `json:"csp,omitempty"`
// Permissions lists browser capabilities the app requests
// (e.g., "camera", "microphone", "geolocation", "clipboardWrite").
Permissions []string `json:"permissions,omitempty"`
// PrefersBorder hints whether the host should draw a visible border.
// nil = host decides, true = border, false = no border.
PrefersBorder *bool `json:"prefersBorder,omitempty"`
// Domain requests a dedicated sandbox origin for the app.
// Format is host-dependent (e.g., "myapp" → myapp.claudemcpcontent.com).
Domain string `json:"domain,omitempty"`
// SupportedDisplayModes declares which display modes this app can render in.
// Nil means the host decides. Hosts use this to offer mode switching UI.
SupportedDisplayModes []DisplayMode `json:"supportedDisplayModes,omitempty"`
}
UIMetadata describes UI presentation metadata for tools and resources. Serialized as the "_meta.ui" object in tools/list and resources/read responses. Part of the MCP Apps extension (io.modelcontextprotocol/ui).
type UIVisibility ¶
type UIVisibility string
UIVisibility controls tool access scope in the MCP Apps extension.
const ( // UIVisibilityModel means the tool appears in tools/list for the LLM. UIVisibilityModel UIVisibility = "model" // UIVisibilityApp means the tool is callable by apps from the same server. UIVisibilityApp UIVisibility = "app" )
type URLElicitationRequiredErrorData ¶ added in v0.2.41
type URLElicitationRequiredErrorData struct {
Elicitations []ElicitationRequest `json:"elicitations"`
Extra map[string]any `json:"-"`
}
URLElicitationRequiredErrorData is the structured data for a -32042 error. The Elicitations field carries URL-mode elicitation requests. Extra holds additional metadata (e.g., authorization denial context from FineGrainedAuth UC1). Extra keys are flattened into the top-level JSON object.
func (URLElicitationRequiredErrorData) MarshalJSON ¶ added in v0.2.41
func (d URLElicitationRequiredErrorData) MarshalJSON() ([]byte, error)
MarshalJSON flattens Extra keys into the top-level alongside elicitations.
type UpdateTaskRequest ¶ added in v0.2.41
type UpdateTaskRequest struct {
TaskID string `json:"taskId"`
InputResponses InputResponses `json:"inputResponses,omitempty"`
RequestState string `json:"requestState,omitempty"` // SEP-2322
}
UpdateTaskRequest is the params payload for tasks/update — the MRTR-driven resume path. The client supplies InputResponses keyed by the same ids returned in DetailedTask.InputRequests, optionally echoing RequestState. // SEP-2663
type UpdateTaskResult ¶ added in v0.2.41
type UpdateTaskResult struct {
// ResultType is the SEP-2322 polymorphic-dispatch discriminator. Always
// "complete" for the tasks/update ack (defaulted by MarshalJSON when empty).
ResultType ResultType `json:"resultType"`
}
UpdateTaskResult is the (essentially empty) ack returned by tasks/update. Servers resume task execution asynchronously; clients learn the outcome via the next tasks/get. The wire payload carries only the SEP-2322 resultType discriminator so polymorphic dispatch on tools/call vs tasks/update vs tasks/get is uniform across the protocol. // SEP-2663
func (UpdateTaskResult) MarshalJSON ¶ added in v0.2.41
func (u UpdateTaskResult) MarshalJSON() ([]byte, error)
MarshalJSON defaults ResultType to ResultTypeComplete so callers using the zero value (UpdateTaskResult{}) emit the spec-compliant wire shape without thinking about it.
type WorkingTask ¶ added in v0.2.41
type WorkingTask = DetailedTask
SEP-2663 narrowed aliases — convenient names for callers that have already branched on status. The wire shape is identical to DetailedTask; the alias just communicates which fields the caller expects to be populated.
Source Files
¶
- auth.go
- authorization_denial_experimental.go
- background.go
- cardinality.go
- completion.go
- datauri.go
- detach.go
- elicitation.go
- file_input.go
- file_validation.go
- handler_context.go
- interfaces.go
- jsonrpc.go
- logging.go
- logging_transport.go
- progress.go
- prompt.go
- protocol.go
- request.go
- resource.go
- resource_notify.go
- roots_allowed.go
- sampling.go
- schema.go
- session.go
- slog_handler.go
- sse_hint.go
- streaming.go
- task.go
- task_v2.go
- tool.go
- typed_tool.go
- ui.go
- uritemplate.go
- www_authenticate.go