GoMCP
GoMCP
GoでMCPサーバーを構築するための、高速で慣用的な方法。
🚀 クイックリンク
MCP Protocol: https://modelcontextprotocol.io
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 | フレームワーク |
スキーマ生成 | 手動 |
| |
ミドルウェア | 基本的なフック | なし | フルチェーン (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📖 使用ガイド
構造体タグリファレンス
タグ | 型 | 説明 | 例 | |
| フラグ | フィールドが必須 |
| |
| 文字列 | 人間が読める説明 |
| |
| 任意 | デフォルト値 |
| |
| 数値 | 最小値 (含む) |
| |
| 数値 | 最大値 (含む) |
| |
| 文字列 | パイプ区切りの許可値 | `mcp:"enum=asc | desc"` |
| 文字列 | 正規表現バリデーション |
|
組み合わせ例: 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 serverAIクライアントでの使用
{
"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クライアントサポート (サーバー間呼び出し)
🤝 フィードバック & サポート
バグ報告: GitHub Issues
機能リクエスト: GitHub Issues
ディスカッション: GitHub Discussions
⚖️ 著作権 & ライセンス
Copyright © 2026 GoMCP Contributors
Apache License 2.0 の下でライセンスされています。
重要な注意点
本プロジェクトは、Apache 2.0ライセンスの下で、個人利用および商用利用ともにオープンソースかつ無料です。
ソフトウェアのすべてのコピーまたは重要な部分において、著作権表示、ライセンス条文、および帰属表示を保持する必要があります。
Apache 2.0ライセンスには、貢献者からユーザーへの明示的な特許権の付与が含まれています。
本プロジェクトへの貢献は、同じApache 2.0ライセンスの下でライセンスされます。
著作権表示の無断削除は、法的措置の対象となる可能性があります。
特許に関する通知
本フレームワークの特定の機能(構造体タグによるスキーマ生成、HTTP-to-MCP自動アダプター、OpenAPI-to-MCP自動アダプター)は、特許出願の対象となっています。Apache 2.0ライセンスは、本ソフトウェアの一部としてこれらの機能を使用するための、永続的、世界的、ロイヤリティフリーの特許ライセンスを付与します。
⭐ Star History
GoMCPが役に立つと思ったら、ぜひスターを付けてください!他の人がプロジェクトを見つける助けになります。
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