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 サーバーを介してモデルと対話するフロントエンド構築にも利用されます。