GoMCP
GoMCP
Der schnelle, idiomatische Weg, um MCP-Server in Go zu erstellen.
🚀 Schnelle Links
MCP-Protokoll: https://modelcontextprotocol.io
Related MCP server: Filesystem MCP Server
🎯 Was ist GoMCP?
GoMCP ist ein Framework zum Erstellen von Model Context Protocol (MCP)-Servern — nicht nur ein SDK. Betrachten Sie es als "Gin für MCP".
MCP ist das offene Protokoll, das es KI-Anwendungen (Claude Desktop, Cursor, Kiro, VS Code Copilot) ermöglicht, externe Tools aufzurufen, Datenquellen zu lesen und Prompt-Vorlagen zu verwenden. GoMCP macht das Erstellen dieser Server trivial.
Warum GoMCP?
mcp-go (mark3labs) | Offizielles Go SDK | GoMCP | |
Ebene | SDK | SDK | Framework |
Schema-Generierung | Manuell |
| |
Middleware | Einfache Hooks | Keine | Vollständige Kette (Logger, Auth, RateLimit, OTel…) |
Tool-Gruppen | Nein | Nein | |
Gin-Routen importieren | Nein | Nein | ✅ Eine Zeile |
OpenAPI/Swagger importieren | Nein | Nein | ✅ Eine Zeile |
gRPC-Services importieren | Nein | Nein | ✅ |
Integrierte Auth | Nein | Nein | Bearer, API Key, Basic + RBAC |
Inspector UI | Nein | Nein | ✅ |
Test-Utilities | Einfach | Nein | mcptest Paket |
🛠️ Tech-Stack
Systemanforderungen
Anforderung | Version |
Go | ≥ 1.25 |
MCP-Protokoll | 2024-11-05 (abwärtskompatibel mit 2025-11-25) |
Kernabhängigkeiten
Technologie | Beschreibung |
Go Standardbibliothek | Kern-Framework — keine externen Abhängigkeiten |
Gin | Nur Adapter — importieren Sie bestehende Gin-Routen |
gRPC | Nur Adapter — importieren Sie gRPC-Services |
OpenTelemetry | Optional — verteiltes Tracing |
YAML v3 | Nur Provider — Hot-Reload von Tool-Definitionen |
🌟 Kernfunktionen
🔧 Tool-Entwicklung
Automatische Schema-Generierung via Struct-Tags — definieren Sie Parameter mit Go-Structs und
mcp-Tags, JSON-Schema wird automatisch generiertTypisierte Handler —
func(*Context, Input) (Output, error)— kein manuelles Parsen von ParameternParameter-Validierung — required, min/max, enum, pattern — wird vor Ausführung Ihres Handlers geprüft
Komponenten-Versionierung — registrieren Sie mehrere Versionen, Clients rufen
name@versionaufAsynchrone Aufgaben — lang laufende Tools geben eine Task-ID zurück, inklusive Polling und Abbruch
🔌 Adapter (Kern-Differenzierungsmerkmal)
Gin-Adapter — importieren Sie bestehende Gin-Routen als MCP-Tools mit einer Zeile
OpenAPI-Adapter — generieren Sie Tools aus Swagger/OpenAPI 3.x Dokumentationen
gRPC-Adapter — importieren Sie gRPC-Servicemethoden als MCP-Tools
🔐 Sicherheit
BearerAuth — JWT-Token-Validierung
APIKeyAuth — API-Key-Validierung via Header
BasicAuth — HTTP Basic Authentication
RequireRole / RequirePermission — RBAC-Autorisierung für Tool-Gruppen
🧩 Framework-Funktionen
Middleware-Kette — Logger, Recovery, RequestID, Timeout, RateLimit, OpenTelemetry
Tool-Gruppen — organisieren Sie Tools mit Präfixen und Middleware auf Gruppenebene
Resource & Prompt — vollständige MCP-Unterstützung inklusive URI-Templates und parametrisierten Prompts
Auto-Vervollständigung — schlagen Sie Werte für Prompt-/Resource-Argumente vor
🚀 Produktionsbereit
Mehrere Transports — stdio (Claude Desktop, Cursor, Kiro) und Streamable HTTP mit SSE
MCP Inspector — integrierte Web-Debug-UI zum Durchsuchen und Testen von Tools
Hot-Reload — laden Sie Tool-Definitionen aus YAML-Dateien mit Dateiüberwachung
mcptest Paket — In-Memory-Client für Unit-Tests mit Snapshot-Unterstützung
🏗️ Architektur
┌──────────────────────────────────────────────────────────────┐
│ User Code │
│ s.Tool() / s.ToolFunc() / s.Resource() / s.Prompt() │
├──────────────────────────────────────────────────────────────┤
│ Framework Core │
│ Router → Middleware Chain → Validation → Handler → Result │
├────────────┬─────────────┬───────────────┬───────────────────┤
│ Schema │ Validator │ Adapters │ Observability │
│ Generator │ Engine │ Gin/OpenAPI/ │ OTel / Logger │
│ (mcp tags) │ (auto) │ gRPC │ / Inspector │
├────────────┴─────────────┴───────────────┴───────────────────┤
│ Protocol Layer │
│ JSON-RPC 2.0 / MCP / Capability Negotiation │
├──────────────────────────────────────────────────────────────┤
│ Transport Layer │
│ stdio / Streamable HTTP + SSE │
└──────────────────────────────────────────────────────────────┘Projektstruktur
gomcp/
├── server.go # Server core, tool/resource/prompt registration
├── context.go # Request context with typed accessors
├── group.go # Tool groups with prefix naming
├── middleware.go # Middleware interface and chain execution
├── middleware_builtin.go # Logger, Recovery, RequestID, Timeout, RateLimit
├── middleware_auth.go # BearerAuth, APIKeyAuth, BasicAuth, RBAC
├── middleware_otel.go # OpenTelemetry tracing
├── schema/ # struct tag → JSON Schema generator + validator
├── transport/ # stdio + Streamable HTTP
├── adapter/ # Gin, OpenAPI, gRPC adapters
├── mcptest/ # Testing utilities
├── task.go # Async task support
├── completion.go # Auto-completions
├── inspector.go # Web debug UI
├── provider.go # Hot-reload from YAML
└── examples/ # Working examples📦 Installation
go get github.com/zhangpanda/gomcp⚡ Schnellstart
5 Zeilen bis zum funktionierenden MCP-Server
package main
import (
"fmt"
"github.com/zhangpanda/gomcp"
)
type SearchInput struct {
Query string `json:"query" mcp:"required,desc=Search keyword"`
Limit int `json:"limit" mcp:"default=10,min=1,max=100"`
}
type SearchResult struct {
Items []string `json:"items"`
Total int `json:"total"`
}
func main() {
s := gomcp.New("my-server", "1.0.0")
s.ToolFunc("search", "Search documents by keyword", func(ctx *gomcp.Context, in SearchInput) (SearchResult, error) {
items := []string{fmt.Sprintf("Result for %q", in.Query)}
return SearchResult{Items: items, Total: len(items)}, nil
})
s.Stdio()
}Das SearchInput-Struct generiert automatisch dieses JSON-Schema:
{
"type": "object",
"properties": {
"query": { "type": "string", "description": "Search keyword" },
"limit": { "type": "integer", "default": 10, "minimum": 1, "maximum": 100 }
},
"required": ["query"]
}Ungültige Parameter werden abgelehnt, bevor Ihr Handler ausgeführt wird:
validation failed: query: required; limit: must be <= 100📖 Nutzungsanleitung
Struct-Tag Referenz
Tag | Typ | Beschreibung | Beispiel |
| Flag | Feld muss bereitgestellt werden |
|
| String | Menschlich lesbare Beschreibung |
|
| Beliebig | Standardwert |
|
| Zahl | Minimalwert (inklusiv) |
|
| Zahl | Maximalwert (inklusiv) |
|
| String | Pipe-separierte erlaubte Werte |
|
| String | Regex-Validierung |
|
Kombination: mcp:"required,desc=Benutzer-E-Mail,pattern=^[^@]+@[^@]+$"
Unterstützte Typen: string, int, float64, bool, []T, verschachtelte Structs.
Tools
Einfacher Handler:
s.Tool("hello", "Say hello", func(ctx *gomcp.Context) (*gomcp.CallToolResult, error) {
return ctx.Text("Hello, " + ctx.String("name")), nil
})Typisierter Handler (empfohlen):
type Input struct {
Name string `json:"name" mcp:"required,desc=User name"`
Email string `json:"email" mcp:"required,pattern=^[^@]+@[^@]+$"`
}
s.ToolFunc("create_user", "Create user", func(ctx *gomcp.Context, in Input) (User, error) {
return db.CreateUser(in.Name, in.Email)
})Ressourcen
// Static
s.Resource("config://app", "App config", func(ctx *gomcp.Context) (any, error) {
return map[string]any{"version": "1.0"}, nil
})
// Dynamic URI template
s.ResourceTemplate("db://{table}/{id}", "DB record", func(ctx *gomcp.Context) (any, error) {
return db.Find(ctx.String("table"), ctx.String("id")), nil
})Prompts
s.Prompt("code_review", "Code review",
[]gomcp.PromptArgument{gomcp.PromptArg("language", "Language", true)},
func(ctx *gomcp.Context) ([]gomcp.PromptMessage, error) {
return []gomcp.PromptMessage{
gomcp.UserMsg(fmt.Sprintf("Review this %s code for bugs.", ctx.String("language"))),
}, nil
},
)Middleware
s.Use(gomcp.Logger()) // Log tool name + duration
s.Use(gomcp.Recovery()) // Recover from panics
s.Use(gomcp.RequestID()) // Unique request ID
s.Use(gomcp.Timeout(10 * time.Second)) // Deadline enforcement
s.Use(gomcp.RateLimit(100)) // 100 calls/minute
s.Use(gomcp.OpenTelemetry()) // Distributed tracing
s.Use(gomcp.BearerAuth(tokenValidator)) // JWT auth
s.Use(gomcp.APIKeyAuth("X-API-Key", keyValidator)) // API key authBenutzerdefinierte Middleware:
func AuditLog() gomcp.Middleware {
return func(ctx *gomcp.Context, next func() error) error {
start := time.Now()
err := next()
log.Printf("tool=%s duration=%s err=%v", ctx.String("_tool_name"), time.Since(start), err)
return err
}
}Tool-Gruppen
user := s.Group("user", authMiddleware)
user.Tool("get", "Get user", getUser) // → user.get
user.Tool("update", "Update user", updateUser) // → user.update
admin := user.Group("admin", gomcp.RequireRole("admin"))
admin.Tool("delete", "Delete user", deleteUser) // → user.admin.deleteAdapter
Gin — eine Zeile zum Importieren Ihrer bestehenden API:
adapter.ImportGin(s, ginRouter, adapter.ImportOptions{
IncludePaths: []string{"/api/v1/"},
})
// GET /api/v1/users/:id → Tool get_api_v1_users_by_id (id = required param)OpenAPI — Generierung aus Swagger-Dokumentationen:
adapter.ImportOpenAPI(s, "./swagger.yaml", adapter.OpenAPIOptions{
TagFilter: []string{"pets"},
ServerURL: "https://api.example.com",
})gRPC:
adapter.ImportGRPC(s, grpcConn, adapter.GRPCOptions{
Services: []string{"user.UserService"},
})Komponenten-Versionierung
s.ToolFunc("search", "v1", searchV1, gomcp.Version("1.0"))
s.ToolFunc("search", "v2 with embeddings", searchV2, gomcp.Version("2.0"))
// "search" → latest, "search@1.0" → exact versionAsynchrone Aufgaben
s.AsyncTool("report", "Generate report", func(ctx *gomcp.Context) (*gomcp.CallToolResult, error) {
// long-running work
return ctx.Text("done"), nil
})
// Client gets taskId immediately, polls tasks/get, can tasks/cancelHot-Reload
s.LoadDir("./tools/", gomcp.DirOptions{Watch: true})MCP Inspector
s.Dev(":9090") // http://localhost:9090 — browse and test all toolsTesten
func TestSearch(t *testing.T) {
c := mcptest.NewClient(t, setupServer())
c.Initialize()
result := c.CallTool("search", map[string]any{"query": "golang"})
result.AssertNoError(t)
result.AssertContains(t, "golang")
mcptest.MatchSnapshot(t, "search_result", result)
}Transports
s.Stdio() // Claude Desktop, Cursor, Kiro
s.HTTP(":8080") // Remote deployment with SSE
s.Handler() // Embed in existing HTTP serverVerwendung mit KI-Clients
{
"mcpServers": {
"my-server": {
"command": "/path/to/your/binary"
}
}
}Funktioniert mit Claude Desktop, Cursor, Kiro, Windsurf, VS Code Copilot und jedem MCP-kompatiblen Client.
📋 Roadmap
[x] Kern: Tool, Resource, Prompt mit vollständiger MCP-Protokollunterstützung
[x] Automatische Schema-Generierung via Struct-Tags + Parameter-Validierung
[x] Middleware-Kette (Logger, Recovery, RateLimit, Timeout, RequestID)
[x] Auth-Middleware (Bearer / API Key / Basic) + RBAC-Autorisierung
[x] Tool-Gruppen mit Präfix-Benennung und verschachtelten Gruppen
[x] stdio + Streamable HTTP Transports mit SSE-Benachrichtigungen
[x] Gin-Adapter — Importieren bestehender Gin-Routen als MCP-Tools
[x] OpenAPI-Adapter — Generierung von Tools aus Swagger/OpenAPI-Dokumentationen
[x] gRPC-Adapter — Importieren von gRPC-Services als MCP-Tools
[x] OpenTelemetry-Integration
[x] mcptest Paket mit Snapshot-Tests
[x] Komponenten-Versionierung + Deprecation
[x] Asynchrone Aufgaben mit Polling und Abbruch
[x] MCP Inspector Web-Debug-UI
[x] Hot-Reload-Provider aus YAML
[x] Auto-Vervollständigung für Prompt-/Resource-Argumente
[ ] MCP-Client-Unterstützung (Server-zu-Server-Aufrufe)
🤝 Feedback & Support
Fehlerberichte: GitHub Issues
Feature-Anfragen: GitHub Issues
Diskussionen: GitHub Discussions
💡 Empfohlene Lektüre: How To Ask Questions The Smart Way
⚖️ Copyright & Lizenz
Copyright © 2026 GoMCP Contributors
Lizenziert unter der Apache License 2.0.
Wichtige Hinweise
Dieses Projekt ist Open Source und kostenlos für den persönlichen sowie kommerziellen Gebrauch unter der Apache 2.0 Lizenz.
Sie müssen den Copyright-Hinweis, den Lizenztext und alle Attributionshinweise in allen Kopien oder wesentlichen Teilen der Software beibehalten.
Die Apache 2.0 Lizenz beinhaltet eine ausdrückliche Gewährung von Patentrechten von den Mitwirkenden an die Nutzer.
Beiträge zu diesem Projekt werden unter derselben Apache 2.0 Lizenz lizenziert.
Das unbefugte Entfernen von Copyright-Hinweisen kann rechtliche Schritte nach sich ziehen.
Patenthinweis
Bestimmte Funktionen dieses Frameworks (Struct-Tag-Schema-Generierung, automatischer HTTP-zu-MCP-Adapter, automatischer OpenAPI-zu-MCP-Adapter) sind Gegenstand anhängiger Patentanmeldungen. Die Apache 2.0 Lizenz gewährt Ihnen eine unbefristete, weltweite, lizenzgebührenfreie Patentlizenz zur Nutzung dieser Funktionen als Teil dieser Software.
⭐ Star History
Wenn Sie GoMCP nützlich finden, geben Sie dem Projekt bitte einen Stern! Es hilft anderen, das Projekt zu entdecken.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/zhangpanda/gomcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server