GoMCP
π Go Version
π License
π Release
π gomcp MCP server
Die schnelle, idiomatische Art, 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 | Ja ( |
Gin-Routen importieren | Nein | Nein | β Eine Zeile |
OpenAPI/Swagger importieren | Nein | Nein | β Eine Zeile |
gRPC-Dienste 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-Dienste |
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 ΓΌber 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-/Ressourcen-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-Protokoll-UnterstΓΌ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-Diensten 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-/Ressourcen-Argumente
π€ Feedback & Support
Fehlerberichte: GitHub Issues
Feature-Anfragen: GitHub Issues
Diskussionen: GitHub Discussions
π‘ Empfohlene LektΓΌre: How To Ask Questions The Smart Way
π Sicherheit
Um SicherheitslΓΌcken zu melden, siehe SECURITY.md.
βοΈ 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.
Patent-Hinweis
Bestimmte Funktionen dieses Frameworks (Struct-Tag Schema-Generierung, HTTP-zu-MCP automatischer Adapter, OpenAPI-zu-MCP automatischer 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.
Maintenance
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
