mcpField
G
go-mcp-server-generator

go-mcp-server-generator

github.com/github開発40.5k9.2k 回インストール今日更新
リポジトリ

go-mcp-server-generator について

Model Context Protocol(MCP)サーバーのGoプロジェクトを生成するスキルです。型付きツール、エラー処理、文書、テスト、設定、ログ、グレースフルシャットダウンを備えたモジュール構成を定めています。

主な機能

  1. 01Goモジュールとサーバー構成の作成
  2. 02公式Go MCP SDKの利用
  3. 03型付きツールと入力検証
  4. 04テストとREADMEの用意
  5. 05設定とグレースフルシャットダウンへの対応

活用シーン

  1. 01新しいGo MCPサーバーのひな型作成
  2. 02サーバープロジェクトへの型付きツールの追加
  3. 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 サーバーを作成します。

  1. プロジェクト構造: 適切な Go モジュールのレイアウト
  2. 依存関係: 公式 MCP SDK と必要なパッケージ
  3. サーバーセットアップ: トランスポートを構成した MCP サーバー
  4. ツール: 型付きの入力/出力を備えた、少なくとも 2〜3 個の有用なツール
  5. エラー処理: 適切なエラー処理とコンテキストの使用
  6. ドキュメント: セットアップと使用方法を記載した README
  7. テスト: 基本的なテスト構造

テンプレート構造

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 サーバーを生成する際は、以下の手順に従います。

  1. モジュールの初期化: 適切なモジュールパスを指定して go.mod を作成します
  2. 構造: テンプレートのディレクトリ構造に従います
  3. 型安全性: すべての入力/出力に JSON スキーマタグを付けた構造体を使用します
  4. エラー処理: 入力を検証し、コンテキストを確認し、エラーをラップします
  5. ドキュメント: 明確な説明と例を追加します
  6. テスト: 各ツールに少なくとも 1 つのテストを含めます
  7. 設定: 設定には環境変数を使用します
  8. ログ: 構造化ログ (log/slog) を使用します
  9. グレースフルシャットダウン: シグナルを適切に処理します
  10. トランスポート: デフォルトでは stdio を使用し、代替手段を文書化します

ベストプラクティス

  • ツールは焦点を絞り、単一の目的に保つ
  • 型と関数には説明的な名前を使用する
  • 構造体タグに JSON スキーマのドキュメントを含める
  • 常にコンテキストのキャンセルを尊重する
  • 説明的なエラーを返す
  • main.go は最小限に保ち、ロジックはパッケージに置く
  • ツールハンドラーのテストを書く
  • すべてのエクスポートされた関数を文書化する

コメント