go-mcp-server-generator について
Model Context Protocol(MCP)サーバーのGoプロジェクトを生成するスキルです。型付きツール、エラー処理、文書、テスト、設定、ログ、グレースフルシャットダウンを備えたモジュール構成を定めています。
主な機能
- 01Goモジュールとサーバー構成の作成
- 02公式Go MCP SDKの利用
- 03型付きツールと入力検証
- 04テストとREADMEの用意
- 05設定とグレースフルシャットダウンへの対応
活用シーン
- 01新しいGo MCPサーバーのひな型作成
- 02サーバープロジェクトへの型付きツールの追加
- 03テストと文書を含むサーバー基盤の作成
MCP 対応
公式Go SDKを使ったGo MCPサーバープロジェクトを生成します。標準のトランスポートはstdioで、他の方式も文書化します。
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ github/ awesome-copilot --skill go-mcp-server-generatorインストール後、Claude Code で/go-mcp-server-generatorを入力して読み込まれたか確認します。
詳細
Go MCP サーバープロジェクトジェネレーター
本番環境で使用できる完全な Model Context Protocol (MCP) サーバープロジェクトを Go で生成します。
プロジェクトの要件
以下を備えた Go MCP サーバーを作成します。
- プロジェクト構造: 適切な Go モジュールのレイアウト
- 依存関係: 公式 MCP SDK と必要なパッケージ
- サーバーセットアップ: トランスポートを構成した MCP サーバー
- ツール: 型付きの入力/出力を備えた、少なくとも 2〜3 個の有用なツール
- エラー処理: 適切なエラー処理とコンテキストの使用
- ドキュメント: セットアップと使用方法を記載した README
- テスト: 基本的なテスト構造
テンプレート構造
myserver/
├── go.mod
├── go.sum
├── main.go
├── tools/
│ ├── tool1.go
│ └── tool2.go
├── resources/
│ └── resource1.go
├── config/
│ └── config.go
├── README.md
└── main_test.go
go.mod テンプレート
module github.com/yourusername/{{PROJECT_NAME}}
go 1.23
require (
github.com/modelcontextprotocol/go-sdk v1.0.0
)
main.go テンプレート
package main
import (
"context"
"log"
"os"
"os/signal"
"syscall"
"github.com/modelcontextprotocol/go-sdk/mcp"
"github.com/yourusername/{{PROJECT_NAME}}/config"
"github.com/yourusername/{{PROJECT_NAME}}/tools"
)
func main() {
cfg := config.Load()
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
// Handle graceful shutdown
sigCh := make(chan os.Signal, 1)
signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM)
go func() {
<-sigCh
log.Println("Shutting down...")
cancel()
}()
// Create server
server := mcp.NewServer(
&mcp.Implementation{
Name: cfg.ServerName,
Version: cfg.Version,
},
&mcp.Options{
Capabilities: &mcp.ServerCapabilities{
Tools: &mcp.ToolsCapability{},
Resources: &mcp.ResourcesCapability{},
Prompts: &mcp.PromptsCapability{},
},
},
)
// Register tools
tools.RegisterTools(server)
// Run server
transport := &mcp.StdioTransport{}
if err := server.Run(ctx, transport); err != nil {
log.Fatalf("Server error: %v", err)
}
}
tools/tool1.go テンプレート
package tools
import (
"context"
"fmt"
"github.com/modelcontextprotocol/go-sdk/mcp"
)
type Tool1Input struct {
Param1 string `json:"param1" jsonschema:"required,description=First parameter"`
Param2 int `json:"param2,omitempty" jsonschema:"description=Optional second parameter"`
}
type Tool1Output struct {
Result string `json:"result" jsonschema:"description=The result of the operation"`
Status string `json:"status" jsonschema:"description=Operation status"`
}
func Tool1Handler(ctx context.Context, req *mcp.CallToolRequest, input Tool1Input) (
*mcp.CallToolResult,
Tool1Output,
error,
) {
// Validate input
if input.Param1 == "" {
return nil, Tool1Output{}, fmt.Errorf("param1 is required")
}
// Check context
if ctx.Err() != nil {
return nil, Tool1Output{}, ctx.Err()
}
// Perform operation
result := fmt.Sprintf("Processed: %s", input.Param1)
return nil, Tool1Output{
Result: result,
Status: "success",
}, nil
}
func RegisterTool1(server *mcp.Server) {
mcp.AddTool(server,
&mcp.Tool{
Name: "tool1",
Description: "Description of what tool1 does",
},
Tool1Handler,
)
}
tools/registry.go テンプレート
package tools
import "github.com/modelcontextprotocol/go-sdk/mcp"
func RegisterTools(server *mcp.Server) {
RegisterTool1(server)
RegisterTool2(server)
// Register additional tools here
}
config/config.go テンプレート
package config
import "os"
type Config struct {
ServerName string
Version string
LogLevel string
}
func Load() *Config {
return &Config{
ServerName: getEnv("SERVER_NAME", "{{PROJECT_NAME}}"),
Version: getEnv("VERSION", "v1.0.0"),
LogLevel: getEnv("LOG_LEVEL", "info"),
}
}
func getEnv(key, defaultValue string) string {
if value := os.Getenv(key); value != "" {
return value
}
return defaultValue
}
main_test.go テンプレート
package main
import (
"context"
"testing"
"github.com/yourusername/{{PROJECT_NAME}}/tools"
)
func TestTool1Handler(t *testing.T) {
ctx := context.Background()
input := tools.Tool1Input{
Param1: "test",
Param2: 42,
}
result, output, err := tools.Tool1Handler(ctx, nil, input)
if err != nil {
t.Fatalf("Tool1Handler failed: %v", err)
}
if output.Status != "success" {
t.Errorf("Expected status 'success', got '%s'", output.Status)
}
if result != nil {
t.Error("Expected result to be nil")
}
}
README.md テンプレート
# {{PROJECT_NAME}}
A Model Context Protocol (MCP) server built with Go.
## Description
{{PROJECT_DESCRIPTION}}
## Installation
\`\`\`bash
go mod download
go build -o {{PROJECT_NAME}}
\`\`\`
## Usage
Run the server with stdio transport:
\`\`\`bash
./{{PROJECT_NAME}}
\`\`\`
## Configuration
Configure via environment variables:
- `SERVER_NAME`: Server name (default: "{{PROJECT_NAME}}")
- `VERSION`: Server version (default: "v1.0.0")
- `LOG_LEVEL`: Logging level (default: "info")
## Available Tools
### tool1
{{TOOL1_DESCRIPTION}}
**Input:**
- `param1` (string, required): First parameter
- `param2` (int, optional): Second parameter
**Output:**
- `result` (string): Operation result
- `status` (string): Status of the operation
## Development
Run tests:
\`\`\`bash
go test ./...
\`\`\`
Build:
\`\`\`bash
go build -o {{PROJECT_NAME}}
\`\`\`
## License
MIT
生成手順
Go MCP サーバーを生成する際は、以下の手順に従います。
- モジュールの初期化: 適切なモジュールパスを指定して
go.modを作成します - 構造: テンプレートのディレクトリ構造に従います
- 型安全性: すべての入力/出力に JSON スキーマタグを付けた構造体を使用します
- エラー処理: 入力を検証し、コンテキストを確認し、エラーをラップします
- ドキュメント: 明確な説明と例を追加します
- テスト: 各ツールに少なくとも 1 つのテストを含めます
- 設定: 設定には環境変数を使用します
- ログ: 構造化ログ (log/slog) を使用します
- グレースフルシャットダウン: シグナルを適切に処理します
- トランスポート: デフォルトでは stdio を使用し、代替手段を文書化します
ベストプラクティス
- ツールは焦点を絞り、単一の目的に保つ
- 型と関数には説明的な名前を使用する
- 構造体タグに JSON スキーマのドキュメントを含める
- 常にコンテキストのキャンセルを尊重する
- 説明的なエラーを返す
- main.go は最小限に保ち、ロジックはパッケージに置く
- ツールハンドラーのテストを書く
- すべてのエクスポートされた関数を文書化する
コメント
Markdown 対応