Skip to main content
Glama

GoMCP

Go Version License Release gomcp MCP server

Der schnelle, idiomatische Weg, um MCP-Server in Go zu erstellen.

中文文档



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

jsonschema Tag

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 generiert

  • Typisierte Handlerfunc(*Context, Input) (Output, error) — kein manuelles Parsen von Parametern

  • Parameter-Validierung — required, min/max, enum, pattern — wird vor Ausführung Ihres Handlers geprüft

  • Komponenten-Versionierung — registrieren Sie mehrere Versionen, Clients rufen name@version auf

  • Asynchrone 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

required

Flag

Feld muss bereitgestellt werden

mcp:"required"

desc

String

Menschlich lesbare Beschreibung

mcp:"desc=Suchbegriff"

default

Beliebig

Standardwert

mcp:"default=10"

min

Zahl

Minimalwert (inklusiv)

mcp:"min=0"

max

Zahl

Maximalwert (inklusiv)

mcp:"max=100"

enum

String

Pipe-separierte erlaubte Werte

mcp:"enum=asc|desc"

pattern

String

Regex-Validierung

mcp:"pattern=^[a-z]+$"

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 auth

Benutzerdefinierte 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.delete

Adapter

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 version

Asynchrone 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/cancel

Hot-Reload

s.LoadDir("./tools/", gomcp.DirOptions{Watch: true})

MCP Inspector

s.Dev(":9090") // http://localhost:9090 — browse and test all tools

Testen

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 server

Verwendung 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

💡 Empfohlene Lektüre: How To Ask Questions The Smart Way


Copyright © 2026 GoMCP Contributors

Lizenziert unter der Apache License 2.0.

Wichtige Hinweise

  1. Dieses Projekt ist Open Source und kostenlos für den persönlichen sowie kommerziellen Gebrauch unter der Apache 2.0 Lizenz.

  2. Sie müssen den Copyright-Hinweis, den Lizenztext und alle Attributionshinweise in allen Kopien oder wesentlichen Teilen der Software beibehalten.

  3. Die Apache 2.0 Lizenz beinhaltet eine ausdrückliche Gewährung von Patentrechten von den Mitwirkenden an die Nutzer.

  4. Beiträge zu diesem Projekt werden unter derselben Apache 2.0 Lizenz lizenziert.

  5. 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.

Install Server
A
security – no known vulnerabilities
A
license - permissive license
A
quality - A tier

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