mirror of
https://github.com/zeromicro/go-zero.git
synced 2026-05-07 15:10:01 +08:00
4.6 KiB
4.6 KiB
Migration to Official MCP SDK
This document describes the migration from the custom MCP implementation to the official go-sdk.
Changes
Dependencies
Added the official MCP SDK:
go get github.com/modelcontextprotocol/go-sdk@v1.2.0
Type System
All types are now re-exported from the official SDK:
Tool→sdkmcp.ToolCallToolRequest→sdkmcp.CallToolRequestCallToolResult→sdkmcp.CallToolResult- Content types (
TextContent,ImageContent, etc.) Prompt,Resource,Server,ServerSession
Server Interface
The McpServer interface has been simplified:
type McpServer interface {
Start()
Stop()
Server() *sdkmcp.Server // Returns underlying SDK server
}
Important: The AddTool, AddPrompt, and AddResource methods have been removed. Use the SDK directly:
// Old (no longer supported)
server.AddTool(tool, handler)
// New (use SDK directly)
sdkmcp.AddTool(server.Server(), tool, handler)
Configuration
Updated configuration structure:
- Removed:
ProtocolVersion,BaseUrl(SDK manages these) - Added:
UseStreamable(choose between SSE and Streamable HTTP transport)
mcp:
name: my-server
version: 1.0.0
useStreamable: false # false = SSE (2024-11-05), true = Streamable HTTP (2025-03-26)
sseEndpoint: /sse
messageEndpoint: /message
sseTimeout: 24h
messageTimeout: 30s
cors:
- http://localhost:3000
Tool Registration
The SDK uses Go generics for type-safe tool registration:
import sdkmcp "github.com/modelcontextprotocol/go-sdk/mcp"
type MyArgs struct {
Value string `json:"value" jsonschema:"description=Input value"`
}
tool := &mcp.Tool{
Name: "my_tool",
Description: "Description",
}
handler := func(ctx context.Context, req *mcp.CallToolRequest, args MyArgs) (*mcp.CallToolResult, any, error) {
return &mcp.CallToolResult{
Content: []mcp.Content{
&mcp.TextContent{Text: "Result"},
},
}, nil, nil
}
// Register with explicit type parameters
sdkmcp.AddTool(server.Server(), tool, handler)
The SDK automatically generates JSON schemas from struct tags.
Transport Support
Two transports are supported:
-
SSE (Server-Sent Events): 2024-11-05 MCP spec
- Default (
UseStreamable: false) - Endpoint:
/sse(configurable) - Bidirectional: client sends messages to
/message
- Default (
-
Streamable HTTP: 2025-03-26 MCP spec
- Opt-in (
UseStreamable: true) - Endpoint:
/sse(configurable) - Newer protocol with improved streaming
- Opt-in (
Example Migration
Before:
server := mcp.NewMcpServer(c)
tool := &mcp.Tool{Name: "greet", Description: "Greet"}
handler := func(ctx context.Context, req *mcp.CallToolRequest, args GreetArgs) (*mcp.CallToolResult, any, error) {
return &mcp.CallToolResult{
Content: []mcp.Content{&mcp.TextContent{Text: "Hello"}},
}, nil, nil
}
if err := server.AddTool(tool, handler); err != nil {
log.Fatal(err)
}
After:
import sdkmcp "github.com/modelcontextprotocol/go-sdk/mcp"
server := mcp.NewMcpServer(c)
tool := &mcp.Tool{Name: "greet", Description: "Greet"}
handler := func(ctx context.Context, req *mcp.CallToolRequest, args GreetArgs) (*mcp.CallToolResult, any, error) {
return &mcp.CallToolResult{
Content: []mcp.Content{&mcp.TextContent{Text: "Hello"}},
}, nil, nil
}
// Use SDK directly - no error return
sdkmcp.AddTool(server.Server(), tool, handler)
Benefits
- Official SDK: Uses the official Model Context Protocol SDK
- Type Safety: Go generics provide compile-time type checking
- Auto Schema: JSON schemas generated automatically from struct tags
- Dual Transport: Supports both SSE and Streamable HTTP transports
- Maintained: SDK is actively maintained by the MCP team
Breaking Changes
server.AddTool()removed → usesdkmcp.AddTool(server.Server(), ...)server.AddPrompt()removed (SDK v1.2.0 limitation)server.AddResource()removed (SDK v1.2.0 limitation)- Config fields
ProtocolVersionandBaseUrlremoved - All types now come from SDK (re-exported for convenience)
Migration Checklist
- Update imports: add
sdkmcp "github.com/modelcontextprotocol/go-sdk/mcp" - Replace
server.AddTool()withsdkmcp.AddTool(server.Server(), ...) - Remove error handling for tool registration (SDK doesn't return errors)
- Update config: remove
ProtocolVersionandBaseUrl, addUseStreamable - Test with both SSE and Streamable transports
- Update documentation/examples