主题
Go SDK 
Model Context Protocol (MCP) 的 Go SDK 提供了构建 MCP 服务器和客户端的完整工具集。
安装 
bash
go get github.com/modelcontextprotocol/go-sdk快速开始 
创建 MCP 服务器 
go
package main
import (
    "context"
    "log"
    
    "github.com/modelcontextprotocol/go-sdk/mcp"
    "github.com/modelcontextprotocol/go-sdk/server"
)
func main() {
    // 创建服务器
    srv := server.New(server.Options{
        Name:    "my-go-server",
        Version: "1.0.0",
    })
    
    // 注册工具
    srv.RegisterTool("echo", &EchoTool{})
    
    // 启动服务器
    if err := srv.Serve(context.Background()); err != nil {
        log.Fatal(err)
    }
}
type EchoTool struct{}
func (t *EchoTool) Call(ctx context.Context, args map[string]interface{}) (interface{}, error) {
    message, ok := args["message"].(string)
    if !ok {
        return nil, fmt.Errorf("message parameter is required")
    }
    
    return map[string]string{
        "echo": message,
    }, nil
}
func (t *EchoTool) Schema() mcp.ToolSchema {
    return mcp.ToolSchema{
        Name:        "echo",
        Description: "回显输入的消息",
        InputSchema: mcp.Schema{
            Type: "object",
            Properties: map[string]mcp.Schema{
                "message": {
                    Type:        "string",
                    Description: "要回显的消息",
                },
            },
            Required: []string{"message"},
        },
    }
}创建 MCP 客户端 
go
package main
import (
    "context"
    "log"
    
    "github.com/modelcontextprotocol/go-sdk/client"
    "github.com/modelcontextprotocol/go-sdk/transport"
)
func main() {
    // 创建传输层
    transport := transport.NewStdio()
    
    // 创建客户端
    client := client.New(client.Options{
        Transport: transport,
    })
    
    // 连接到服务器
    if err := client.Connect(context.Background()); err != nil {
        log.Fatal(err)
    }
    defer client.Close()
    
    // 列出可用工具
    tools, err := client.ListTools(context.Background())
    if err != nil {
        log.Fatal(err)
    }
    
    log.Printf("可用工具: %+v", tools)
    
    // 调用工具
    result, err := client.CallTool(context.Background(), "echo", map[string]interface{}{
        "message": "Hello from Go!",
    })
    if err != nil {
        log.Fatal(err)
    }
    
    log.Printf("工具调用结果: %+v", result)
}核心功能 
服务器功能 
- 工具注册: 注册自定义工具供客户端调用
- 资源管理: 提供文件、数据库等资源访问
- 提示模板: 定义可重用的提示模板
- 传输协议: 支持 stdio、WebSocket 等传输方式
客户端功能 
- 服务器连接: 连接到本地或远程 MCP 服务器
- 工具调用: 调用服务器提供的工具
- 资源访问: 读取服务器资源
- 会话管理: 管理与服务器的会话状态
传输协议 
Stdio 传输 
go
transport := transport.NewStdio()WebSocket 传输 
go
transport := transport.NewWebSocket("ws://localhost:8080/mcp")HTTP SSE 传输 
go
transport := transport.NewSSE("http://localhost:8080/mcp")最佳实践 
错误处理 
go
func (t *MyTool) Call(ctx context.Context, args map[string]interface{}) (interface{}, error) {
    // 验证参数
    if err := t.validateArgs(args); err != nil {
        return nil, fmt.Errorf("参数验证失败: %w", err)
    }
    
    // 执行业务逻辑
    result, err := t.execute(ctx, args)
    if err != nil {
        return nil, fmt.Errorf("执行失败: %w", err)
    }
    
    return result, nil
}上下文管理 
go
func (s *MyServer) handleRequest(ctx context.Context, req *mcp.Request) {
    // 设置超时
    ctx, cancel := context.WithTimeout(ctx, 30*time.Second)
    defer cancel()
    
    // 处理请求
    // ...
}并发安全 
go
type SafeServer struct {
    mu    sync.RWMutex
    tools map[string]Tool
}
func (s *SafeServer) RegisterTool(name string, tool Tool) {
    s.mu.Lock()
    defer s.mu.Unlock()
    s.tools[name] = tool
}配置选项 
服务器配置 
go
srv := server.New(server.Options{
    Name:        "my-server",
    Version:     "1.0.0",
    Description: "我的 MCP 服务器",
    MaxConnections: 100,
    ReadTimeout:    30 * time.Second,
    WriteTimeout:   30 * time.Second,
})客户端配置 
go
client := client.New(client.Options{
    Transport:      transport,
    ConnectTimeout: 10 * time.Second,
    RequestTimeout: 30 * time.Second,
    RetryAttempts:  3,
})测试 
单元测试 
go
func TestEchoTool(t *testing.T) {
    tool := &EchoTool{}
    
    result, err := tool.Call(context.Background(), map[string]interface{}{
        "message": "test",
    })
    
    assert.NoError(t, err)
    assert.Equal(t, map[string]string{"echo": "test"}, result)
}集成测试 
go
func TestServerClient(t *testing.T) {
    // 启动测试服务器
    srv := server.New(server.Options{Name: "test-server"})
    srv.RegisterTool("echo", &EchoTool{})
    
    go srv.Serve(context.Background())
    defer srv.Close()
    
    // 创建客户端并测试
    client := client.New(client.Options{
        Transport: transport.NewStdio(),
    })
    
    err := client.Connect(context.Background())
    assert.NoError(t, err)
    defer client.Close()
    
    result, err := client.CallTool(context.Background(), "echo", map[string]interface{}{
        "message": "test",
    })
    assert.NoError(t, err)
    assert.NotNil(t, result)
}部署 
Docker 部署 
dockerfile
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o mcp-server ./cmd/server
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /app/mcp-server .
CMD ["./mcp-server"]系统服务 
ini
[Unit]
Description=MCP Go Server
After=network.target
[Service]
Type=simple
User=mcp
ExecStart=/usr/local/bin/mcp-server
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target