Skip to main content
Glama

GoMCP

Go Version License Release gomcp MCP server

GoでMCPサーバーを構築するための、高速で慣用的な方法。

中文文档


🚀 クイックリンク


Related MCP server: Filesystem MCP Server

🎯 GoMCPとは?

GoMCPは、単なるSDKではなく、Model Context Protocol (MCP) サーバーを構築するためのフレームワークです。**「MCPのためのGin」**と考えてください。

MCPは、AIアプリケーション(Claude Desktop、Cursor、Kiro、VS Code Copilotなど)が外部ツールを呼び出し、データソースを読み取り、プロンプトテンプレートを使用できるようにするためのオープンプロトコルです。GoMCPを使えば、それらのサーバー構築が非常に簡単になります。

なぜGoMCPなのか?

mcp-go (mark3labs)

公式Go SDK

GoMCP

レベル

SDK

SDK

フレームワーク

スキーマ生成

手動

jsonschema タグ

ミドルウェア

基本的なフック

なし

フルチェーン (Logger, Auth, RateLimit, OTel…)

ツールグループ

なし

なし

Ginルートのインポート

なし

なし

✅ 1行で可能

OpenAPI/Swaggerのインポート

なし

なし

✅ 1行で可能

gRPCサービスのインポート

なし

なし

組み込み認証

なし

なし

Bearer, API Key, Basic + RBAC

インスペクターUI

なし

なし

テストユーティリティ

基本的

なし

mcptest パッケージ


🛠️ 技術スタック

環境要件

要件

バージョン

Go

≥ 1.25

MCP Protocol

2024-11-05 (2025-11-25と後方互換性あり)

コア依存関係

技術

説明

Go標準ライブラリ

コアフレームワーク — 外部依存関係ゼロ

Gin

アダプターのみ — 既存のGinルートをインポート

gRPC

アダプターのみ — gRPCサービスをインポート

OpenTelemetry

オプション — 分散トレーシング

YAML v3

プロバイダーのみ — ツール定義のホットリロード


🌟 主な機能

🔧 ツール開発

  • 構造体タグによる自動スキーマ生成 — Goの構造体と mcp タグでパラメーターを定義し、JSON Schemaを自動生成

  • 型付きハンドラーfunc(*Context, Input) (Output, error) — 手動でのパラメーター解析は不要

  • パラメーターバリデーション — 必須、最小/最大、列挙型、パターン — ハンドラー実行前にチェック

  • コンポーネントのバージョン管理 — 複数のバージョンを登録し、クライアントは name@version で呼び出し可能

  • 非同期タスク — 長時間実行されるツールはタスクIDを返し、ポーリングやキャンセルが可能

🔌 アダプター (コアとなる差別化要因)

  • Ginアダプター — 既存のGinルートを1行でMCPツールとしてインポート

  • OpenAPIアダプター — Swagger/OpenAPI 3.xドキュメントからツールを生成

  • gRPCアダプター — gRPCサービスメソッドをMCPツールとしてインポート

🔐 セキュリティ

  • BearerAuth — JWTトークン検証

  • APIKeyAuth — ヘッダーによるAPIキー検証

  • BasicAuth — HTTP基本認証

  • RequireRole / RequirePermission — ツールグループに対するRBAC認可

🧩 フレームワーク機能

  • ミドルウェアチェーン — Logger, Recovery, RequestID, Timeout, RateLimit, OpenTelemetry

  • ツールグループ — プレフィックスとグループ単位のミドルウェアでツールを整理

  • リソース & プロンプト — URIテンプレートやパラメーター付きプロンプトを含むMCPを完全サポート

  • 自動補完 — プロンプト/リソース引数の値を提案

🚀 本番環境対応

  • マルチトランスポート — stdio (Claude Desktop, Cursor, Kiro) および SSE対応のストリーミングHTTP

  • MCP Inspector — ツールの閲覧とテストのための組み込みWebデバッグUI

  • ホットリロード — ファイル監視によるYAMLファイルからのツール定義読み込み

  • mcptestパッケージ — スナップショット対応のユニットテスト用インメモリクライアント


🏗️ アーキテクチャ

┌──────────────────────────────────────────────────────────────┐
│                        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                 │
└──────────────────────────────────────────────────────────────┘

プロジェクト構造

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

📦 インストール

go get github.com/zhangpanda/gomcp

⚡ クイックスタート

5行で動作するMCPサーバー

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()
}

SearchInput 構造体は、以下のJSON Schemaを自動生成します:

{
  "type": "object",
  "properties": {
    "query": { "type": "string", "description": "Search keyword" },
    "limit": { "type": "integer", "default": 10, "minimum": 1, "maximum": 100 }
  },
  "required": ["query"]
}

無効なパラメーターは、ハンドラーが実行される前に拒否されます:

validation failed: query: required; limit: must be <= 100

📖 使用ガイド

構造体タグリファレンス

タグ

説明

required

フラグ

フィールドが必須

mcp:"required"

desc

文字列

人間が読める説明

mcp:"desc=検索キーワード"

default

任意

デフォルト値

mcp:"default=10"

min

数値

最小値 (含む)

mcp:"min=0"

max

数値

最大値 (含む)

mcp:"max=100"

enum

文字列

パイプ区切りの許可値

`mcp:"enum=asc

desc"`

pattern

文字列

正規表現バリデーション

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

組み合わせ例: mcp:"required,desc=ユーザーメールアドレス,pattern=^[^@]+@[^@]+$"

サポートされている型: string, int, float64, bool, []T, ネストされた構造体。

ツール

シンプルなハンドラー:

s.Tool("hello", "Say hello", func(ctx *gomcp.Context) (*gomcp.CallToolResult, error) {
    return ctx.Text("Hello, " + ctx.String("name")), nil
})

型付きハンドラー (推奨):

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)
})

リソース

// 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
})

プロンプト

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
    },
)

ミドルウェア

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

カスタムミドルウェア:

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
    }
}

ツールグループ

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

アダプター

Gin — 既存のAPIを1行でインポート:

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 — Swaggerドキュメントから生成:

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"},
})

コンポーネントのバージョン管理

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

非同期タスク

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

ホットリロード

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

MCP Inspector

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

テスト

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)
}

トランスポート

s.Stdio()          // Claude Desktop, Cursor, Kiro
s.HTTP(":8080")    // Remote deployment with SSE
s.Handler()        // Embed in existing HTTP server

AIクライアントでの使用

{
  "mcpServers": {
    "my-server": {
      "command": "/path/to/your/binary"
    }
  }
}

Claude Desktop、Cursor、Kiro、Windsurf、VS Code Copilot、およびMCP互換クライアントで動作します。


📋 ロードマップ

  • [x] コア: ツール、リソース、プロンプトのMCPプロトコル完全サポート

  • [x] 構造体タグによる自動スキーマ生成 + パラメーターバリデーション

  • [x] ミドルウェアチェーン (Logger, Recovery, RateLimit, Timeout, RequestID)

  • [x] 認証ミドルウェア (Bearer / API Key / Basic) + RBAC認可

  • [x] プレフィックス命名とネストされたグループを持つツールグループ

  • [x] stdio + SSE通知付きストリーミングHTTPトランスポート

  • [x] Ginアダプター — 既存のGinルートをMCPツールとしてインポート

  • [x] OpenAPIアダプター — Swagger/OpenAPIドキュメントからツールを生成

  • [x] gRPCアダプター — gRPCサービスをMCPツールとしてインポート

  • [x] OpenTelemetry統合

  • [x] スナップショットテスト対応のmcptestパッケージ

  • [x] コンポーネントのバージョン管理 + 非推奨化

  • [x] ポーリングとキャンセル機能付きの非同期タスク

  • [x] MCP Inspector WebデバッグUI

  • [x] YAMLからのホットリロードプロバイダー

  • [x] プロンプト/リソース引数の自動補完

  • [ ] MCPクライアントサポート (サーバー間呼び出し)


🤝 フィードバック & サポート

💡 推奨読書: How To Ask Questions The Smart Way


⚖️ 著作権 & ライセンス

Copyright © 2026 GoMCP Contributors

Apache License 2.0 の下でライセンスされています。

重要な注意点

  1. 本プロジェクトは、Apache 2.0ライセンスの下で、個人利用および商用利用ともにオープンソースかつ無料です。

  2. ソフトウェアのすべてのコピーまたは重要な部分において、著作権表示、ライセンス条文、および帰属表示を保持する必要があります

  3. Apache 2.0ライセンスには、貢献者からユーザーへの明示的な特許権の付与が含まれています。

  4. 本プロジェクトへの貢献は、同じApache 2.0ライセンスの下でライセンスされます。

  5. 著作権表示の無断削除は、法的措置の対象となる可能性があります。

特許に関する通知

本フレームワークの特定の機能(構造体タグによるスキーマ生成、HTTP-to-MCP自動アダプター、OpenAPI-to-MCP自動アダプター)は、特許出願の対象となっています。Apache 2.0ライセンスは、本ソフトウェアの一部としてこれらの機能を使用するための、永続的、世界的、ロイヤリティフリーの特許ライセンスを付与します。


⭐ Star History

GoMCPが役に立つと思ったら、ぜひスターを付けてください!他の人がプロジェクトを見つける助けになります。

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