Documentation
¶
Overview ¶
Package mcp provides a framework for building MCP (Model Context Protocol) servers.
mcp-go aims to be the "Gin framework" for MCP servers, providing typed handlers with automatic JSON Schema generation, Gin-style middleware chains, pluggable transports (stdio, HTTP+SSE, WebSocket), and production-ready defaults.
Handler Signatures ¶
Tool handlers: func(input T) (R, error) or func(ctx, input T) (R, error)
Resource handlers receive URI and template params (e.g., "users://{id}"):
func(ctx, uri string, params map[string]string) (*ResourceContent, error)
Prompt handlers: func(ctx, args map[string]string) (*PromptResult, error)
Progress Reporting ¶
Use ProgressFromContext in long-running handlers. Report is thread-safe. Errors are non-fatal and typically ignored.
Error Handling ¶
Return errors from handlers. Use protocol.NewInvalidParams, protocol.NewNotFound, etc. for specific MCP error codes.
See examples/basic for a complete working example with tools, resources, and prompts.
Example ¶
ExampleNewServer demonstrates creating an MCP server with tools, resources, and prompts.
// Create server with capabilities and instructions
srv := mcp.NewServer(mcp.ServerInfo{
Name: "example-server",
Version: "1.0.0",
Capabilities: mcp.Capabilities{
Tools: true,
Resources: true,
Prompts: true,
},
}, mcp.WithInstructions("Use search to find documents."))
// Register a typed tool
type SearchInput struct {
Query string `json:"query" jsonschema:"required"`
Limit int `json:"limit" jsonschema:"maximum=100"`
}
srv.Tool("search").
Description("Search for documents").
Handler(func(ctx context.Context, input SearchInput) ([]string, error) {
return []string{"result1", "result2"}, nil
})
// Register a resource with URI template
srv.Resource("users://{id}").
Name("User").
MimeType("application/json").
Handler(func(ctx context.Context, uri string, params map[string]string) (*mcp.ResourceContent, error) {
id := params["id"] // extracted from template
return &mcp.ResourceContent{
URI: uri,
MimeType: "application/json",
Text: fmt.Sprintf(`{"id": "%s"}`, id),
}, nil
})
// Register a prompt
srv.Prompt("greet").
Description("Generate a greeting").
Argument("name", "Name to greet", true).
Handler(func(ctx context.Context, args map[string]string) (*mcp.PromptResult, error) {
return &mcp.PromptResult{
Messages: []mcp.PromptMessage{
{
Role: "user",
Content: mcp.TextContent{Type: "text", Text: "Hello, " + args["name"]},
},
},
}, nil
})
fmt.Println("Server created with tools, resources, and prompts")
Output: Server created with tools, resources, and prompts
Index ¶
- Constants
- Variables
- func ExtractParams[T any](params map[string]string) (T, error)
- func RequestIDFromContext(ctx context.Context) string
- func ServeGRPC(ctx context.Context, srv *Server, addr string, opts ...GRPCOption) error
- func ServeGRPCWithMiddleware(ctx context.Context, srv *Server, addr string, grpcOpts []GRPCOption, ...) error
- func ServeHTTP(ctx context.Context, srv *Server, addr string, opts ...HTTPOption) error
- func ServeHTTPWithMiddleware(ctx context.Context, srv *Server, addr string, httpOpts []HTTPOption, ...) error
- func ServeStdio(ctx context.Context, srv *Server, opts ...ServeOption) error
- func ServeWebSocket(ctx context.Context, srv *Server, addr string, opts ...WebSocketOption) error
- func ServeWebSocketWithMiddleware(ctx context.Context, srv *Server, addr string, wsOpts []WebSocketOption, ...) error
- type AuthOption
- type Authenticator
- type BuildInfo
- type CORSConfig
- type CancellationManager
- type CancelledNotification
- type Capabilities
- type ChannelMessage
- type ChannelSender
- type ClientCapabilities
- type CompletionArgument
- type CompletionHandler
- type CompletionRef
- type CompletionResult
- type Content
- type CreateMessageRequest
- type CreateMessageResult
- type ElicitRequest
- type ElicitResult
- type Elicitor
- type GRPCOption
- type HTTPOption
- type Icon
- type Identity
- type ImageContent
- type ListRootsResult
- type LogField
- type LogLevel
- type Logger
- type LoggingMessage
- type Middleware
- func Chain(middlewares ...Middleware) Middleware
- func DefaultMiddleware(logger Logger) []Middleware
- func DefaultMiddlewareWithTimeout(logger Logger, timeout time.Duration) []Middleware
- func Logging(logger Logger) Middleware
- func Recover() Middleware
- func RecoverWithHandler(...) Middleware
- func RequestID() Middleware
- func Timeout(d time.Duration) Middleware
- type MiddlewareHandlerFunc
- type ModelHint
- type ModelPreferences
- type NotificationSender
- type OTelOption
- type Option
- type Progress
- type ProgressReporter
- type ProgressToken
- type PromptAnnotations
- type PromptArgument
- type PromptInfo
- type PromptMessage
- type PromptResult
- type RateLimitOption
- type RequestSender
- type ResourceAnnotations
- type ResourceContent
- type ResourceInfo
- type ResourceTemplateInfo
- type ResourceUpdatedNotification
- type Role
- type Root
- type RootsCapability
- type SamplingMessage
- type ServeOption
- type Server
- type ServerInfo
- type Session
- type SessionOption
- type SetLevelRequest
- type ShutdownConfig
- type ShutdownManager
- type SizeLimitOption
- type StructuredResult
- type SubscribeRequest
- type SubscriptionManager
- type TextContent
- type ToolAnnotations
- type UnsubscribeRequest
- type WebSocketOption
Examples ¶
Constants ¶
const ( RoleUser = server.RoleUser RoleAssistant = server.RoleAssistant )
Role constants
const ( LogLevelDebug = server.LogLevelDebug LogLevelInfo = server.LogLevelInfo LogLevelNotice = server.LogLevelNotice LogLevelWarning = server.LogLevelWarning LogLevelError = server.LogLevelError LogLevelCritical = server.LogLevelCritical LogLevelAlert = server.LogLevelAlert LogLevelEmergency = server.LogLevelEmergency )
LogLevel constants
const ( KB = middleware.KB MB = middleware.MB )
Size limit presets.
Variables ¶
var ( Bool = server.Bool Float = server.Float )
Helper functions for annotation values
var ( NewTextContent = server.NewTextContent NewImageContent = server.NewImageContent )
Content constructors
var ( ContextWithCancellationManager = server.ContextWithCancellationManager CancellationManagerFromContext = server.CancellationManagerFromContext )
Context utilities for cancellation
var ( NewElicitor = server.NewElicitor ElicitFromContext = server.ElicitFromContext )
var ( NewChannelSender = server.NewChannelSender ChannelFromContext = server.ChannelFromContext )
var ( NewSession = server.NewSession WithClientCapabilities = server.WithClientCapabilities WithRootsChangeCallback = server.WithRootsChangeCallback ContextWithSession = server.ContextWithSession SessionFromContext = server.SessionFromContext )
var ( RateLimit = middleware.RateLimit RateLimitByMethod = middleware.RateLimitByMethod RateLimitByClient = middleware.RateLimitByClient WithRateLimitKeyFunc = middleware.WithRateLimitKeyFunc WithRateLimitLogger = middleware.WithRateLimitLogger )
RateLimit re-exports for convenience.
var ( SizeLimit = middleware.SizeLimit WithSizeLimitLogger = middleware.WithSizeLimitLogger )
var ( Auth = middleware.Auth WithAuthLogger = middleware.WithAuthLogger WithAuthSkipMethods = middleware.WithAuthSkipMethods WithAuthRealm = middleware.WithAuthRealm WithAuthErrorMessage = middleware.WithAuthErrorMessage APIKeyAuthenticator = middleware.APIKeyAuthenticator BearerTokenAuthenticator = middleware.BearerTokenAuthenticator StaticAPIKeys = middleware.StaticAPIKeys StaticTokens = middleware.StaticTokens ChainAuthenticators = middleware.ChainAuthenticators IdentityFromContext = middleware.IdentityFromContext ContextWithIdentity = middleware.ContextWithIdentity )
var ( DefaultCORSConfig = transport.DefaultCORSConfig WithCORS = transport.WithCORS WithDefaultCORS = transport.WithDefaultCORS )
var ( DefaultShutdownConfig = transport.DefaultShutdownConfig NewShutdownManager = transport.NewShutdownManager WithShutdownTimeout = transport.WithShutdownTimeout WithShutdownDrainDelay = transport.WithShutdownDrainDelay )
var ( // WithTitle sets a human-readable display name for the server. WithTitle = server.WithTitle // WithDescription sets a description of what the server does. WithDescription = server.WithDescription // WithWebsiteURL sets the server's documentation or homepage URL. WithWebsiteURL = server.WithWebsiteURL // WithIcons sets the icons for UI display. WithIcons = server.WithIcons // WithBuildInfo sets build metadata for debugging and version verification. WithBuildInfo = server.WithBuildInfo )
ServerInfo option functions
var ( OTel = middleware.OTel WithTracerProvider = middleware.WithTracerProvider WithMeterProvider = middleware.WithMeterProvider WithOTelServiceName = middleware.WithOTelServiceName WithOTelSkipMethods = middleware.WithOTelSkipMethods SpanFromContext = middleware.SpanFromContext AddSpanEvent = middleware.AddSpanEvent SetSpanAttribute = middleware.SetSpanAttribute )
var NewCancellationManager = server.NewCancellationManager
var NewSubscriptionManager = server.NewSubscriptionManager
var ProgressFromContext = server.ProgressFromContext
ProgressFromContext returns the progress reporter from context. Use this in tool handlers to report progress for long-running operations.
Example:
srv.Tool("process").Handler(func(ctx context.Context, input ProcessInput) (string, error) {
progress := mcp.ProgressFromContext(ctx)
total := 100.0
for i := 0; i < 100; i++ {
progress.Report(float64(i), &total)
// do work...
}
return "done", nil
})
var ShouldLog = server.ShouldLog
ShouldLog returns true if a message at the given level should be logged
var WithInstructions = server.WithInstructions
WithInstructions sets the server instructions that provide context to AI models about how to use this server effectively.
Functions ¶
func ExtractParams ¶ added in v1.2.0
ExtractParams extracts URI template parameters into a typed struct. Use this in resource handlers for type-safe parameter extraction.
Example:
type UserParams struct {
ID string `uri:"id"`
Page int `uri:"page"`
}
srv.Resource("users://{id}/page/{page}").Handler(func(ctx context.Context, uri string, params map[string]string) (*mcp.ResourceContent, error) {
p, err := mcp.ExtractParams[UserParams](params)
if err != nil {
return nil, err
}
// Use p.ID (string) and p.Page (int)
})
func RequestIDFromContext ¶
RequestIDFromContext returns the request ID from the context, or empty string if not set.
func ServeGRPC ¶ added in v1.2.1
ServeGRPC runs the server using gRPC transport with bidirectional streaming. This enables MCP communication over gRPC, providing benefits like binary encoding, built-in flow control, and native support for enterprise infrastructure. This blocks until the context is canceled or an error occurs.
func ServeGRPCWithMiddleware ¶ added in v1.2.1
func ServeGRPCWithMiddleware(ctx context.Context, srv *Server, addr string, grpcOpts []GRPCOption, serveOpts ...ServeOption) error
ServeGRPCWithMiddleware runs the server using gRPC transport with middleware support.
func ServeHTTP ¶
ServeHTTP runs the server using HTTP transport with SSE support. This blocks until the context is canceled or an error occurs.
func ServeHTTPWithMiddleware ¶
func ServeHTTPWithMiddleware(ctx context.Context, srv *Server, addr string, httpOpts []HTTPOption, serveOpts ...ServeOption) error
ServeHTTPWithMiddleware runs the server using HTTP transport with middleware support.
func ServeStdio ¶
func ServeStdio(ctx context.Context, srv *Server, opts ...ServeOption) error
ServeStdio runs the server using stdio transport. This blocks until the context is canceled or an error occurs.
func ServeWebSocket ¶
ServeWebSocket runs the server using WebSocket transport. This blocks until the context is canceled or an error occurs.
func ServeWebSocketWithMiddleware ¶
func ServeWebSocketWithMiddleware(ctx context.Context, srv *Server, addr string, wsOpts []WebSocketOption, serveOpts ...ServeOption) error
ServeWebSocketWithMiddleware runs the server using WebSocket transport with middleware support.
Types ¶
type AuthOption ¶
type AuthOption = middleware.AuthOption
type Authenticator ¶
type Authenticator = middleware.Authenticator
type CancellationManager ¶ added in v1.1.0
type CancellationManager = server.CancellationManager
type CancelledNotification ¶ added in v1.1.0
type CancelledNotification = server.CancelledNotification
Cancellation types
type Capabilities ¶
type Capabilities = server.Capabilities
Capabilities declares what features the server supports.
type ChannelMessage ¶ added in v1.9.0
type ChannelMessage = server.ChannelMessage
Channel types for server-initiated push messages
type ChannelSender ¶ added in v1.9.0
type ChannelSender = server.ChannelSender
type ClientCapabilities ¶ added in v1.1.0
type ClientCapabilities = server.ClientCapabilities
type CompletionArgument ¶ added in v1.2.0
type CompletionArgument = server.CompletionArgument
type CompletionHandler ¶ added in v1.2.0
type CompletionHandler = server.CompletionHandler
type CompletionRef ¶ added in v1.2.0
type CompletionRef = server.CompletionRef
Completion types for autocomplete support
type CompletionResult ¶ added in v1.2.0
type CompletionResult = server.CompletionResult
type CreateMessageRequest ¶ added in v1.1.0
type CreateMessageRequest = server.CreateMessageRequest
type CreateMessageResult ¶ added in v1.1.0
type CreateMessageResult = server.CreateMessageResult
type ElicitRequest ¶ added in v1.9.0
type ElicitRequest = server.ElicitRequest
Elicitation types for interactive user prompts
type ElicitResult ¶ added in v1.9.0
type ElicitResult = server.ElicitResult
type GRPCOption ¶ added in v1.2.1
type GRPCOption = grpctransport.Option
GRPCOption configures the gRPC transport.
func WithGRPCDrainDelay ¶ added in v1.2.1
func WithGRPCDrainDelay(d time.Duration) GRPCOption
WithGRPCDrainDelay sets the delay before starting connection draining. This allows load balancers to remove the server from rotation.
func WithGRPCShutdownTimeout ¶ added in v1.2.1
func WithGRPCShutdownTimeout(d time.Duration) GRPCOption
WithGRPCShutdownTimeout sets the maximum time to wait for graceful shutdown.
type HTTPOption ¶
type HTTPOption = transport.HTTPOption
HTTPOption configures the HTTP transport.
func WithDiscovery ¶ added in v1.8.0
func WithDiscovery(discovery *transport.ServerDiscovery) HTTPOption
WithDiscovery sets the server discovery metadata for the /.well-known/mcp endpoint.
func WithReadTimeout ¶
func WithReadTimeout(d time.Duration) HTTPOption
WithReadTimeout sets the read timeout for HTTP requests.
func WithWriteTimeout ¶
func WithWriteTimeout(d time.Duration) HTTPOption
WithWriteTimeout sets the write timeout for HTTP responses.
type ImageContent ¶
type ImageContent = server.ImageContent
type ListRootsResult ¶ added in v1.1.0
type ListRootsResult = server.ListRootsResult
type LogField ¶
type LogField = middleware.Field
type Logger ¶
type Logger = middleware.Logger
type LoggingMessage ¶ added in v1.1.0
type LoggingMessage = server.LoggingMessage
type Middleware ¶
type Middleware = middleware.Middleware
Middleware types
func Chain ¶
func Chain(middlewares ...Middleware) Middleware
Chain composes multiple middleware into a single middleware.
func DefaultMiddleware ¶
func DefaultMiddleware(logger Logger) []Middleware
DefaultMiddleware returns the recommended production middleware stack.
func DefaultMiddlewareWithTimeout ¶
func DefaultMiddlewareWithTimeout(logger Logger, timeout time.Duration) []Middleware
DefaultMiddlewareWithTimeout returns the default stack with a timeout middleware.
Example ¶
ExampleDefaultMiddlewareWithTimeout shows using the production middleware stack.
srv := mcp.NewServer(mcp.ServerInfo{Name: "server", Version: "1.0.0"})
// Create a logger (implement mcp.Logger interface)
var logger mcp.Logger // = yourLogger
// Use default production middleware: recover, request ID, timeout, logging
_ = logger
_ = srv
// mcp.ServeStdio(ctx, srv, mcp.WithMiddleware(
// mcp.DefaultMiddlewareWithTimeout(logger, 30*time.Second)...,
// ))
fmt.Println("Server configured with default middleware")
Output: Server configured with default middleware
func Logging ¶
func Logging(logger Logger) Middleware
Logging returns middleware that logs request details.
func Recover ¶
func Recover() Middleware
Recover returns middleware that catches panics and converts them to internal errors.
func RecoverWithHandler ¶
func RecoverWithHandler(handler func(ctx context.Context, req *protocol.Request, panicVal any) (*protocol.Response, error)) Middleware
RecoverWithHandler returns middleware that catches panics and calls the provided handler.
func RequestID ¶
func RequestID() Middleware
RequestID returns middleware that injects a unique request ID into the context.
func Timeout ¶
func Timeout(d time.Duration) Middleware
Timeout returns middleware that enforces a request deadline.
type MiddlewareHandlerFunc ¶
type MiddlewareHandlerFunc = middleware.HandlerFunc
type ModelPreferences ¶ added in v1.1.0
type ModelPreferences = server.ModelPreferences
type NotificationSender ¶ added in v1.1.0
type NotificationSender = server.NotificationSender
type OTelOption ¶ added in v1.2.0
type OTelOption = middleware.OTelOption
OpenTelemetry re-exports for convenience.
type ProgressReporter ¶
type ProgressReporter = server.ProgressReporter
type ProgressToken ¶
type ProgressToken = server.ProgressToken
Progress types for streaming tool responses
type PromptAnnotations ¶
type PromptAnnotations = server.PromptAnnotations
type PromptArgument ¶
type PromptArgument = server.PromptArgument
type PromptInfo ¶
type PromptInfo = server.PromptInfo
type PromptMessage ¶
type PromptMessage = server.PromptMessage
type RateLimitOption ¶
type RateLimitOption = middleware.RateLimitOption
type RequestSender ¶ added in v1.1.0
type RequestSender = server.RequestSender
type ResourceAnnotations ¶
type ResourceAnnotations = server.ResourceAnnotations
type ResourceInfo ¶
type ResourceInfo = server.ResourceInfo
type ResourceTemplateInfo ¶ added in v1.2.0
type ResourceTemplateInfo = server.ResourceTemplateInfo
Resource template types
type ResourceUpdatedNotification ¶ added in v1.1.0
type ResourceUpdatedNotification = server.ResourceUpdatedNotification
type RootsCapability ¶ added in v1.1.0
type RootsCapability = server.RootsCapability
type SamplingMessage ¶ added in v1.1.0
type SamplingMessage = server.SamplingMessage
Sampling types for server-initiated LLM completions
type ServeOption ¶
type ServeOption func(*serveOptions)
ServeOption configures how the server is run.
func WithLogger ¶
func WithLogger(l Logger) ServeOption
WithLogger sets the logger for the default middleware stack.
func WithMiddleware ¶
func WithMiddleware(m ...Middleware) ServeOption
WithMiddleware adds middleware to the request handling chain.
type Server ¶
Server is the MCP server instance.
func NewServer ¶
func NewServer(info ServerInfo, opts ...Option) *Server
NewServer creates a new MCP server with the given info and options.
type ServerInfo ¶
ServerInfo contains server metadata exposed to clients.
type SessionOption ¶ added in v1.1.0
type SessionOption = server.SessionOption
type SetLevelRequest ¶ added in v1.1.0
type SetLevelRequest = server.SetLevelRequest
type ShutdownConfig ¶
type ShutdownConfig = transport.ShutdownConfig
Shutdown configuration for HTTP transports.
type ShutdownManager ¶
type ShutdownManager = transport.ShutdownManager
type SizeLimitOption ¶
type SizeLimitOption = middleware.SizeLimitOption
SizeLimit re-exports for convenience.
type StructuredResult ¶ added in v1.9.0
type StructuredResult = server.StructuredResult
Structured result types for tool responses
type SubscribeRequest ¶ added in v1.1.0
type SubscribeRequest = server.SubscribeRequest
Subscription types for resource change notifications
type SubscriptionManager ¶ added in v1.1.0
type SubscriptionManager = server.SubscriptionManager
type TextContent ¶
type TextContent = server.TextContent
type ToolAnnotations ¶
type ToolAnnotations = server.ToolAnnotations
Annotation types for tools, resources, and prompts
type UnsubscribeRequest ¶ added in v1.1.0
type UnsubscribeRequest = server.UnsubscribeRequest
type WebSocketOption ¶
type WebSocketOption = transport.WebSocketOption
WebSocketOption configures the WebSocket transport.
func WithWebSocketReadTimeout ¶
func WithWebSocketReadTimeout(d time.Duration) WebSocketOption
WithWebSocketReadTimeout sets the read timeout for WebSocket messages.
func WithWebSocketWriteTimeout ¶
func WithWebSocketWriteTimeout(d time.Duration) WebSocketOption
WithWebSocketWriteTimeout sets the write timeout for WebSocket messages.
Directories
¶
| Path | Synopsis |
|---|---|
|
Package client provides an MCP client for connecting to MCP servers.
|
Package client provides an MCP client for connecting to MCP servers. |
|
examples
|
|
|
basic
command
Package main provides a basic example of an MCP server.
|
Package main provides a basic example of an MCP server. |
|
grpc
command
Package main provides an example of an MCP server using gRPC transport.
|
Package main provides an example of an MCP server using gRPC transport. |
|
http
command
Package main demonstrates HTTP transport usage in an MCP server.
|
Package main demonstrates HTTP transport usage in an MCP server. |
|
middleware
command
Package main demonstrates middleware usage in an MCP server.
|
Package main demonstrates middleware usage in an MCP server. |
|
minimal
command
Package main provides a minimal MCP server example.
|
Package main provides a minimal MCP server example. |
|
prompts
command
Package main demonstrates prompt usage in an MCP server.
|
Package main demonstrates prompt usage in an MCP server. |
|
resources
command
Package main demonstrates resource usage in an MCP server.
|
Package main demonstrates resource usage in an MCP server. |
|
session
command
Package main demonstrates v1.1 session features: sampling, roots, and logging.
|
Package main demonstrates v1.1 session features: sampling, roots, and logging. |
|
Package middleware provides middleware utilities for MCP request handling.
|
Package middleware provides middleware utilities for MCP request handling. |
|
Package protocol defines the MCP JSON-RPC 2.0 message types and error codes.
|
Package protocol defines the MCP JSON-RPC 2.0 message types and error codes. |
|
Package schema provides JSON Schema generation from Go types.
|
Package schema provides JSON Schema generation from Go types. |
|
Package server provides the core MCP server implementation.
|
Package server provides the core MCP server implementation. |
|
Package testutil provides testing utilities for MCP servers.
|
Package testutil provides testing utilities for MCP servers. |
|
Package transport provides MCP transport implementations.
|
Package transport provides MCP transport implementations. |
|
grpc
Package grpc provides MCP transport over gRPC.
|
Package grpc provides MCP transport over gRPC. |