mcp-golang について
mcp-golang は Model Context Protocol の非公式な Go 実装で、少ないコードで MCP サーバーとクライアントを作成できます。ツールの引数を Go の構造体として定義すると、スキーマ生成、デシリアライズ、エラー処理をライブラリが担います。
主な機能
- 01Go 構造体によるツール引数定義
- 02スキーマの自動生成とデシリアライズ
- 03stdio と HTTP の組み込みトランスポート
- 04カスタムトランスポートの対応
- 05ツール、プロンプト、リソースの対応
- 06ツール、プロンプト、リソースを呼び出すクライアント機能
活用シーン
- 01Go で MCP ツールサーバーを作成する
- 02MCP サーバーを呼び出す Go クライアントを構築する
- 03Claude Desktop 向けにローカルの Go サーバーを動かす
MCP 対応
Go による MCP の実装です。サーバーとしてはツール、プロンプト、リソースを MCP クライアントに公開し、クライアントとしては MCP サーバーの機能を一覧取得・呼び出しします。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
このサーバーのパッケージやリモートエンドポイントはまだ取得できていません。プロジェクトの README の手順に従ってください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
mcp-golang
mcp-golangは、Goで実装されたModel Context Protocolの非公式実装です。
数行のコードで、Goを使ってMCPサーバーとクライアントを作成できます。
ドキュメントはhttps://mcpgolang.comをご覧ください。
主な特徴
- 🛡️型安全性 - ツールの引数をGoのネイティブな構造体として定義すれば、あとはmcp-golangが処理します。スキーマの自動生成、デシリアライズ、エラー処理などに対応しています。
- 🚛 カスタムトランスポート - 組み込みのトランスポート(すべての機能に対応するstdio、ステートレス通信向けのHTTP)を使うか、独自のものを作成できます。
- ⚡ ボイラープレートの削減 - mcp-golangは、ツール、プロンプト、リソース以外のすべてのMCPエンドポイントを生成します。
- 🧩 モジュール式 - ライブラリはトランスポート、プロトコル、サーバー/クライアントの3つのコンポーネントに分かれています。すべてを使うことも、必要なものだけを使うこともできます。
- 🔄 双方向通信 - stdioトランスポートを通じて、サーバーとクライアントの両方の実装を完全にサポートします。
使用例
go get github.com/metoro-io/mcp-golangでインストールします。
サーバーの例
package main
import (
"fmt"
"github.com/metoro-io/mcp-golang"
"github.com/metoro-io/mcp-golang/transport/stdio"
)
// Tool arguments are just structs, annotated with jsonschema tags
// More at https://mcpgolang.com/tools#schema-generation
type Content struct {
Title string `json:"title" jsonschema:"required,description=The title to submit"`
Description *string `json:"description" jsonschema:"description=The description to submit"`
}
type MyFunctionsArguments struct {
Submitter string `json:"submitter" jsonschema:"required,description=The name of the thing calling this tool (openai, google, claude, etc)"`
Content Content `json:"content" jsonschema:"required,description=The content of the message"`
}
func main() {
done := make(chan struct{})
server := mcp_golang.NewServer(stdio.NewStdioServerTransport())
err := server.RegisterTool("hello", "Say hello to a person", func(arguments MyFunctionsArguments) (*mcp_golang.ToolResponse, error) {
return mcp_golang.NewToolResponse(mcp_golang.NewTextContent(fmt.Sprintf("Hello, %server!", arguments.Submitter))), nil
})
if err != nil {
panic(err)
}
err = server.RegisterPrompt("promt_test", "This is a test prompt", func(arguments Content) (*mcp_golang.PromptResponse, error) {
return mcp_golang.NewPromptResponse("description", mcp_golang.NewPromptMessage(mcp_golang.NewTextContent(fmt.Sprintf("Hello, %server!", arguments.Title)), mcp_golang.RoleUser)), nil
})
if err != nil {
panic(err)
}
err = server.RegisterResource("test://resource", "resource_test", "This is a test resource", "application/json", func() (*mcp_golang.ResourceResponse, error) {
return mcp_golang.NewResourceResponse(mcp_golang.NewTextEmbeddedResource("test://resource", "This is a test resource", "application/json")), nil
})
err = server.Serve()
if err != nil {
panic(err)
}
<-done
}
HTTPサーバーの例
標準のHTTPトランスポートまたはGinフレームワークを使って、HTTPベースのサーバーを作成することもできます。
// Standard HTTP
transport := http.NewHTTPTransport("/mcp")
transport.WithAddr(":8080")
server := mcp_golang.NewServer(transport)
// Or with Gin framework
transport := http.NewGinTransport()
router := gin.Default()
router.POST("/mcp", transport.Handler())
server := mcp_golang.NewServer(transport)
注:HTTPトランスポートはステートレスであり、通知などの双方向機能には対応していません。これらの機能が必要な場合は、stdioトランスポートを使用してください。
クライアントの例
より詳しい例については、examples/clientディレクトリをご覧ください。
package main
import (
"context"
"log"
mcp "github.com/metoro-io/mcp-golang"
"github.com/metoro-io/mcp-golang/transport/stdio"
)
// Define type-safe arguments
type CalculateArgs struct {
Operation string `json:"operation"`
A int `json:"a"`
B int `json:"b"`
}
func main() {
cmd := exec.Command("go", "run", "./server/main.go")
stdin, err := cmd.StdinPipe()
if err != nil {
log.Fatalf("Failed to get stdin pipe: %v", err)
}
stdout, err := cmd.StdoutPipe()
if err != nil {
log.Fatalf("Failed to get stdout pipe: %v", err)
}
if err := cmd.Start(); err != nil {
log.Fatalf("Failed to start server: %v", err)
}
defer cmd.Process.Kill()
// Create and initialize client
transport := stdio.NewStdioServerTransportWithIO(stdout, stdin)
client := mcp.NewClient(transport)
if _, err := client.Initialize(context.Background()); err != nil {
log.Fatalf("Failed to initialize: %v", err)
}
// Call a tool with typed arguments
args := CalculateArgs{
Operation: "add",
A: 10,
B: 5,
}
response, err := client.CallTool(context.Background(), "calculate", args)
if err != nil {
log.Fatalf("Failed to call tool: %v", err)
}
if response != nil && len(response.Content) > 0 {
log.Printf("Result: %s", response.Content[0].TextContent.Text)
}
}
Claude Desktopでの使用
~/Library/Application Support/Claude/claude_desktop_config.jsonに、次の内容のファイルを作成してください。
{
"mcpServers": {
"golang-mcp-server": {
"command": "<your path to golang MCP server go executable>",
"args": [],
"env": {}
}
}
}
貢献
貢献を歓迎します!貢献ガイドラインをご確認ください。
Discord
提案や、APIや使い方についての質問はありますか?Discordサーバーでお尋ねください。 メンテナーが喜んでサポートします。
使用例
このライブラリを使った、より詳細な例を以下に紹介します。
Metoro - Metoroで監視されているKubernetes環境にクエリを実行し、操作します。
独自のプロジェクトを追加するPRをお送りください!
サーバー機能の実装状況
ツール
- ツール呼び出し
- 引数としてGoのネイティブ構造体を使用
- ツール一覧エンドポイントのプログラムによる生成
- 変更通知
- ページネーション
プロンプト
- プロンプト呼び出し
- プロンプト一覧エンドポイントのプログラムによる生成
- 変更通知
- ページネーション
リソース
- リソース呼び出し
- リソース一覧エンドポイントのプログラムによる生成
- 変更通知
- ページネーション
トランスポート
- Stdio - 双方向通信を含む、すべての機能を完全にサポート
- HTTP - シンプルなリクエスト/レスポンスのシナリオ向けのステートレスなトランスポート(通知はサポートしていません)
- Gin - Gin フレームワークと統合された HTTP トランスポート(ステートレス、通知はサポートしていません)
- SSE
- カスタムトランスポートのサポート
- カスタム認証をサポートする HTTPS - 開発中です。現在は仕様の一部ではありませんが、実験的なサポートを追加する予定です。
クライアント
- ツールの呼び出し
- プロンプトの呼び出し
- リソースの呼び出し
- ツールの一覧表示
- プロンプトの一覧表示
- リソースの一覧表示
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。