Go 言語による Model Context Protocol サーバー実装ガイド

Model Context Protocol (MCP) は、大規模言語モデル(LLM)アプリケーションと外部データソースやツールとの連携を標準化するプロトコルです。Go 言語向けの実装ライブラリを利用することで、高性能な MCP サーバーを比較的少ないコードで構築できます。

セットアップ手順

開発を始める前に、Go 言語の実行環境が整っていることを確認してください。準備ができたら、以下のコマンドを実行して必要なライブラリを取得します。

go get github.com/mark3labs/mcp-go

サーバー構築の基礎

ここでは、標準入出力(stdio)を通じて通信を行うシンプルな MCP サーバーの作成手順を示します。main.go ファイルを作成し、以下の構成でサーバーを起動します。

package main

import (
	"context"
	"errors"
	"fmt"
	"github.com/mark3labs/mcp-go/mcp"
	"github.com/mark3labs/mcp-go/server"
)

func main() {
	// サーバーインスタンスの初期化
	mcpServer := server.NewMCPServer("IntegrationServer", "0.1.0")

	// ツール定義
	greetingTool := mcp.NewTool("user_greeting",
		mcp.WithDescription("Generates a greeting message for a specific user"),
		mcp.WithString("user", mcp.Required(), mcp.Description("Target user name")),
	)

	// ハンドラの登録
	mcpServer.AddTool(greetingTool, greetHandler)

	//  サーバー起動
	if err := server.ServeStdio(mcpServer); err != nil {
		fmt.Printf("Error occurred: %v\n", err)
	}
}

func greetHandler(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
	userName, exists := req.Params.Arguments["user"].(string)
	if !exists || userName == "" {
		return nil, errors.New("valid user name is required")
	}
	return mcp.NewToolResultText(fmt.Sprintf("Welcome, %s!", userName)), nil
}

このコードを実行すると、サーバーは stdin/stdout を介してリクエストを待ち受ける状態になります。

応用事例と設計パターン

MCP Go を利用する主なユースケースとしては、計算ロジックの提供、データベースへの問い合わせ、外部 API のラッピングなどが挙げられます。また、静的なファイル内容や動的なレコードをリソースとして公開することも可能です。

例えば、四則演算を行うツールを実装する場合は、以下のように定義できます。

mathTool := mcp.NewTool("math_operation",
	mcp.WithDescription("Executes basic arithmetic calculations"),
	mcp.WithString("method", mcp.Required(), mcp.Description("Type of operation: add, sub, mul, div")),
	mcp.WithNumber("leftValue", mcp.Required(), mcp.Description("Left side operand")),
	mcp.WithNumber("rightValue", mcp.Required(), mcp.Description("Right side operand")),
)

mcpServer.AddTool(mathTool, mathHandler)

func mathHandler(ctx context.Context, req mcp.CallToolRequest) (*mcp.CallToolResult, error) {
	// 実際の計算ロジック実装
	return nil, nil
}

エコシステムとの連携

このプロトコル実装は、様々なコンポーネントと組み合わせることが可能です。LLM アプリケーション側から呼び出されるバックエンドとして機能するほか、認証やログ記録を行うミドルウェア層を挟むこともできます。さらに、ユーザーインターフェースを通じて MCP サーバーを介してモデルと対話するフロントエンド構築にも利用されます。

タグ: golang MCP llm-integration server-side tool-integration

8月23日 16:28 投稿