Go開発を加速!AI時代をリードするMCP Go SDKによる状態保持チャットボットの構築


Go開発を加速!AI時代をリードするMCP Go SDKによる状態保持チャットボットの構築

modelcontextprotocol/go-sdk

2025-11-07

この Model Context Protocol (MCP) の Go SDKは、大規模な言語モデル(LLM)のようなAIモデルと、お兄ちゃんの作っているアプリケーションとの間で、「コンテキスト」 (文脈や履歴) をやり取りするための、標準的な方法 を提供してくれるライブラリなの!

このSDKを使うと、お兄ちゃんのアプリケーションがもっと賢く、ユーザーにとって使いやすくなるんだよ!

コンテキスト管理の標準化
複数のLLMやサービスを使うことになっても、会話の履歴や設定情報(コンテキスト)の持ち方や渡し方が統一されるから、コードがすっきりして、メンテナンスが楽になるよ!

状態の保持
ユーザーとの会話の流れ(「さっき話したアレ」とか「これまでの注文履歴」とか)をLLMに正確に伝えることができるから、LLMが文脈を理解した回答を返せるようになるの。

例
「さっきのレシピの材料を教えて」という質問に対して、「さっきのレシピ」が何かをSDKがしっかり伝えてくれる!

スケーラビリティと柔軟性
プロトコルに基づいているから、将来的に別のLLMに切り替えることになっても、SDKのおかげで必要な修正が少なくて済む可能性が高いよ!

お兄ちゃんがよく使う go get で簡単に導入できるよ!

ターミナルでこのコマンドを実行してね。

go get github.com/modelcontextprotocol/go-sdk

これで、お兄ちゃんのプロジェクトでSDKの機能が使えるようになるよ!

じゃあ、実際にどうやってコンテキストを作るのか、簡単な例を見てみよう!

このサンプルコードでは、ユーザーとの会話の履歴を保持するための基本的なコンテキストを作成しているよ。

package main

import (
	"fmt"
	"github.com/modelcontextprotocol/go-sdk/pkg/context" // contextパッケージをインポート
)

func main() {
	//  新しいコンテキストを初期化するよ
	ctx, err := context.NewContext(
		context.WithSourceID("user-12345"),        // ユーザーを一意に識別するIDを設定
		context.WithProtocolVersion("1.0"),       // 使用するプロトコルのバージョン
		context.WithCustomHeader("app-name", "MyChatBot"), // アプリケーション固有の情報を追加
	)

	if err != nil {
		fmt.Printf("コンテキストの作成でエラー: %v\n", err)
		return
	}

	//  LLMへの最初のメッセージ(コンテキストの履歴に追加されるよ)
	ctx.AddMessage(
		context.NewMessage("user", "今日の天気は何?"), // ユーザーからのメッセージ
	)

	//  LLMからの応答(これも履歴に追加!)
	ctx.AddMessage(
		context.NewMessage("assistant", "今日は晴れですよ!"), // アシスタント(LLM)からの返答
	)

	//  次のメッセージの準備
	ctx.AddMessage(
		context.NewMessage("user", "じゃあ、明日は?"),
	)
    
    //  作成したコンテキストをJSON形式で見てみよう(LLMに渡すイメージ)
	jsonContext, _ := ctx.ToJSON()
	fmt.Println("--- 作成されたコンテキスト (JSON) ---")
	fmt.Println(string(jsonContext))
	fmt.Println("----------------------------------")

	//  履歴のメッセージ数をチェック!
	fmt.Printf("メッセージの総数: %d\n", ctx.GetMessageCount())
}

context.NewContext() でコンテキストオブジェクトを作るよ。

context.WithSourceID() で誰の会話かを特定しているね。

ctx.AddMessage() で、ユーザー (user) と アシスタント (assistant) のやり取りを順番に追加しているよ。この履歴が次の質問への「文脈」になるんだ。

このコンテキストをLLMに渡せば、「じゃあ、明日は?」という短い質問でも、LLMは「今日の天気について話しているから、明日の天気を聞いているんだな」と理解できるわけ!すごいよね!


modelcontextprotocol/go-sdk