Gemini CLI と Go を使用して MCP サーバーを構築する方法

1. はじめに

この Codelab では、Model Context Protocol(MCP)サーバーを構築してデプロイし、Gemini CLI の機能を拡張する方法を学びます。皆さんには godoctor を構築していただきます。これは Go 開発用のカスタムツールを利用できる Go ベースのサーバーで、Gemini CLI を汎用コーディング アシスタントから Go 開発専用のエキスパートへと変換できます。

この Codelab では、「プロンプト ドリブン」のアプローチを使用します。皆さんはテクニカル リーダーとして、AI アシスタント(Gemini CLI)にプロンプトで指示をしていきます。ここでの目標は、プロジェクトの要件を効果的なプロンプトに変換し、実装の詳細を AI に処理させる方法を学ぶことです。

このプロジェクトの中核となるのは、Model Context Protocol(MCP)です。MCP は Gemini などの大規模言語モデル(LLM)が外部のツールおよびサービスと通信する方法を標準化した、オープンソース プロトコルです。AI が組み込みの知識を超えて現実世界の情報にアクセスし、アクションを実行できるようにする、橋渡しとしての機能を果たします。MCP サーバーを構築することにより、Gemini CLI による検出と使用が可能なカスタム プラグインを作成し、Gemini CLI が新しいスキルを効果的に学べるようにします。

学習内容

  • Gemini CLI をインストールして構成する方法
  • ソフトウェア開発で AI アシスタントに指示を伝える効果的なプロンプトを作成する方法
  • AI アシスタントにコンテキストとガイドラインを提供する
  • Gemini CLI の機能を強化するために MCP サーバーを作成して構成する方法
  • Go アプリケーションをコンテナ化して Google Cloud Run にデプロイする方法

必要なもの

このワークショップはすべて Google Cloud Shell 内で実行できます。Google Cloud Shell には、必要なすべての依存関係(gcloud CLI、Go、Docker、Gemini CLI)がプリインストールされています。

別の方法として、ご自身のマシンで作業する場合は、次のものが必要です。

  • Node.js 20 以降
  • Google Cloud SDK(gcloud CLI)がインストールされ、初期化されている
  • システムにインストールされている Go 1.24 以降
  • システムにインストールされている Docker

主なテクノロジー

使用するテクノロジーについて詳しくは、以下をご覧ください。

  • Gemini CLI: 拡張する AI 搭載のコマンドライン インターフェース
  • Model Context Protocol(MCP): Gemini CLI がカスタムツールと通信できるようにするオープンソース プロトコル
  • Go SDK for MCP: MCP サーバーの実装に使用する Go ライブラリ

Codelab を成功させるためのヒント

AI アシスタントの活用は、ソフトウェアの開発における新しい手法です。スムーズかつ効果的に活用するためのヒントをいくつかご紹介します。

  1. 必要な場合は迷わず Esc キーを押す。AI は同意できないようなアクションまたはコードを提案することがあります。その場合は Esc キーを使用して提案されたアクションをキャンセルし、正しい方向に導く新たなプロンプトを入力してください。舵を握るのは皆さんであって、AI ではありません。
  2. ツールの使用を促す。AI が行き詰っている、または情報を捏造していると思われる場合は、利用できるツールを使用するよう促します。「Google 検索を使ってこの内容を検証できる?」や「read_file ツールを使って現在のコードを理解したうえで変更を加えて」などのプロンプトは非常に効果的です。
  3. 手動での変更は避ける。AI にすべての作業を任せるようにしましょう。これこそ習得しようとしている中核的なスキルです。手動で変更しなければならない場合には、変更後に AI に変更した旨を伝えます。「README.md ファイルを手動で更新したので、それをもう一度確認して、知識を更新して」などのプロンプトを使うことによって、AI とプロジェクトが常に同期された状態を維持できます。
  4. 一度オフにしてからオンにしてみる。まれに AI がユーザーの指示に反して強引に特定のパスを進めようとすることがあります。これはコンテキストの劣化(「コンテキストの腐敗」とも呼ばれます)が原因である可能性があります。この場合、Gemini CLI コマンド「/compress」を使用してコンテキストのノイズを軽減するか、極端なケースでは「/clear」コマンドを使用してセッション履歴全体を消去します。

2. 環境設定

次のいずれかのオプションを選択します。この

自分のマシンで Codelab を実行するか、この Codelab をすべてクラウドで実行する場合は、Cloud Shell を起動します。

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列です。いつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud コンソールでは一意の文字列が自動生成されます。通常は、この内容を意識する必要はありません。ほとんどの Codelab では、プロジェクト ID(通常は PROJECT_ID と識別されます)を参照する必要があります。生成された ID が好みではない場合は、ランダムに別の ID を生成できます。または、ご自身で試して、利用可能かどうかを確認することもできます。このステップ以降は変更できず、プロジェクトを通して同じ ID になります。
  • なお、3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud コンソールで課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルの終了後に請求が発生しないようにリソースをシャットダウンするには、作成したリソースを削除するか、プロジェクトを削除します。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Cloud Shell を起動する

Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。

Google Cloud Console で、右上のツールバーにある Cloud Shell アイコンをクリックします。

Cloud Shell をアクティブにする

プロビジョニングと環境への接続にはそれほど時間はかかりません。完了すると、次のように表示されます。

環境が接続されていることを示す Google Cloud Shell ターミナルのスクリーンショット

この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働します。そのため、ネットワークのパフォーマンスと認証機能が大幅に向上しています。この Codelab での作業はすべて、ブラウザ内から実行できます。インストールは不要です。

3. Gemini CLI のスタートガイド

このセクションでは、Gemini CLI について説明します。環境にインストールして構成する方法についても説明します。

Gemini CLI とは

Gemini CLI は AI 搭載のコマンドライン インターフェースで、さまざまな開発タスクで役に立ちます。プロジェクトのコンテキストの理解、質問への回答、コードの生成に加え、外部ツールを使用して機能を拡張できます。

インストール

npm を使用して Gemini CLI をグローバルにインストールします。

npm install -g @google/gemini-cli

次のコマンドを実行して、CLI がインストールされていることを確認できます。

gemini --version

構成

Gemini CLI の動作は、構成ファイルと環境変数によって制御されます。動作に影響を与える重要なファイルとして、次の 2 つがあります。

  • GEMINI.md: このファイルは AI にガイドラインとコンテキストを提供します。CLI はこのファイルを読み取って、プロジェクトのコーディング標準と規則を把握します。
  • .gemini/settings.json: このファイルは外部ツールへの接続方法など、CLI の構成を制御します。このファイルは、このラボで構築する MCP サーバーを使用するように CLI を構成するために後で使用します。

まず環境を設定し、次に GEMINI.md ファイルを作成します。settings.json ファイルは、後のステップで構成します。

  1. プロジェクト ディレクトリを作成して初期化します。
mkdir godoctor && cd godoctor
go mod init godoctor
  1. Google Cloud アプリケーションのデフォルト認証情報を使用して認証します。

この Codelab で使用する GCP プロジェクトにアクセスできるアカウントにログインする必要があります。

gcloud auth application-default login

4. コンテキスト ファイル(GEMINI.md)

コンテキスト ファイル(デフォルト名 GEMINI.md を使用)は、Gemini モデルに指示コンテキストを提供するために使用されます。これらのファイルを使用すると、プロジェクト固有の指示を与えたり、ペルソナを定義したり、コーディング スタイルガイドを提供したりして、AI の回答をより正確にし、ニーズに合わせてカスタマイズできます。

AI アシスタントが質の高い自然な Go コードを生成できるように、Go デベロッパー向けの一般的なベスト プラクティスをいくつか記載した GEMINI.md を作成します。

目標: このプロジェクト中に AI アシスタントのルールセットとして機能する GEMINI.md ファイルを作成します。

IDE を開いて、次の内容を含む GEMINI.md ファイルを作成します。Cloud Shell を使用している場合は、次のコマンドを使用してエディタを開くことができます。

cloudshell edit .

タスク: godoctor ディレクトリのルートに GEMINI.md という名前のファイルを作成し、次の内容を貼り付けます。

# Go Development Guidelines
All code contributed to this project must adhere to the following principles.

## 1. Formatting
All Go code **must** be formatted with `gofmt` before being submitted.

## 2. Naming Conventions
- **Packages:** Use short, concise, all-lowercase names.
- **Variables, Functions, and Methods:** Use `camelCase` for unexported identifiers and `PascalCase` for exported identifiers.
- **Interfaces:** Name interfaces for what they do (e.g., `io.Reader`), not with a prefix like `I`.

## 3. Error Handling
- Errors are values. Do not discard them.
- Handle errors explicitly using the `if err != nil` pattern.
- Provide context to errors using `fmt.Errorf("context: %w", err)`.

## 4. Simplicity and Clarity
- "Clear is better than clever." Write code that is easy to understand.
- Avoid unnecessary complexity and abstractions.
- Prefer returning concrete types, not interfaces.

## 5. Documentation
- All exported identifiers (`PascalCase`) **must** have a doc comment.
- Comments should explain the *why*, not the *what*.

## 6. Project structure
- cmd/ contains source code for target binaries (e.g. server, client)
- internal/ contains source code for packages not meant to be exported (e.g. internal/tools/hello)
- bin/ contains the compiled binaries
- At the root place README.md, go.mod and go.sum

これで開発環境のセットアップが完了しました。

5. 最初のビルド: ドキュメント サーバー

最初の目標は、godoctor サーバーの初期バージョンを作成することです。このバージョンは、Go ドキュメントを検索する機能を持った read_docs という単一のツールを提供する最小限のアプリケーションです。

目標: go doc コマンドを公開するプロダクション レディな MCP サーバーを作成して、LLM が Go ドキュメントをクエリできるようにします。

シェルで Gemini CLI コマンドを実行します。

gemini

CLI を初めて実行するときに、認証モードとテーマの選択を求められます。

Cloud Shell でこの Codelab を実行している場合は、[Use Cloud Shell user credentials] オプションを選択します。そうでない場合は、Google でログインを使用して個人の Google アカウントでログインし、Gemini CLI の充実した無料枠を利用できます。認証選択画面は次のようになります。

ea1ed66807150f3f.png

選択内容を変更する必要がある場合は、「/auth」と入力して Enter キーを押すと、このメニューを再度開くことができます。

次に、テーマを選択するよう求められます。

6289bdfb3b519fa7.png

/auth と同様に、/theme コマンドを使って後からテーマを変更することもできます。

認証方法と好みのテーマを選択すると、コマンド プロンプトが開きます。ここにコマンドを入力します。たとえば、次のように入力します。

Write a hello world application in Go

CLI は独自の推論(Gemini Flash や Gemini Pro などの Gemini モデルを使用)とツールを組み合わせてタスクを実行します。ファイル システムや、API、データベースなどの外部サービスと通信する必要がある場合、CLI はツールを使用します。あらかじめ用意されている「内部ツール」には、read_filewrite_fileweb_fetchgoogle_search などがあります。構築する MCP サーバーも、CLI が使用できるツールになります。

ツールを初めて実行するときは、ユーザーに権限を求めます。1 回だけのアクセス許可(1 回のみ許可)、今後のセッションに対する包括的な許可(常に許可)、リクエストの拒否から選択できます。ファイル編集操作の場合は、必要に応じて調整できるように、外部エディタを使用してファイルを編集するオプションもあります。たとえば、上記のプロンプトの出力は次のようになります。

2cfd761183e4b770.png

プロンプトのほか、スラッシュ コマンドも使用できます。「/」を入力すると、CLI が自動的に予測入力オプションを表示します。続けてコマンド全体を入力することも、オプションから 1 つ選択することもできます。上記の /auth コマンドと /theme コマンドは、そのようなコマンドの例です。

26c3f3f7b8bceb3f.png

インターフェースに慣れたら、このセクションの主なタスクである、CLI に MCP サーバーの作成を依頼します。

Hello World MCP サーバーの作成

モデルによる一貫性のある構築を実現する最良の方法の一つは、複雑なタスクを段階的なステップに分解することです。モデルが単独で複雑なタスクを理解できるケースもありますが、適切にセットアップされていなければ、正しい実装を特定するのに長い時間がかかります。

より一貫したアプローチとして、まず「Hello World」の MCP サーバーの構築を指示し、その後目的とする機能(Go ドキュメントの読み取り)を実装します。

プロンプトの例を以下に示します。

Create a Model Context Protocol (MCP) server that exposes a "hello_world" tool. This tool, when called, should return the message "Hello, MCP world!"

For the MCP implementation, you should use the official Go SDK for MCP (github.com/modelcontextprotocol/go-sdk/mcp) and use the stdio transport.

TODO:
- Download the dependency: `go get github.com/modelcontextprotocol/go-sdk/mcp`
- Inspect the documentation of the SDK: `go doc github.com/modelcontextprotocol/go-sdk/mcp`
- Build a `server` command that supports stdio transport only
- Build a `client` command that connects to the server over command transport to test the server

Acceptance Criteria:
- `./bin/client --list-tools` returns the list of server tools including "hello_world"
- `./bin/client --call-tool` "hello_world" returns the output "Hello, MCP world!"

上記のプロンプトは、主に次の 3 つのセグメントで構成されています。

  1. 構築したいもの、制約(任意の SDK ではなく公式の SDK を使用する、http ではなく stdio トランスポートを使用するなど)を含む問題の仕様
  2. 実行するタスク(TODO)の内訳
  3. タスクの承認基準。テスト手順として機能し、エージェントが完了したタイミングを把握できるようにする

この 3 つのコンポーネントを含めることにより、モデルは一貫して求める結果を出力できるようになります。

read_docs ツールの実装

稼働している実装ができたら、実際の「read_docs」ツールの実装に進みます。

Add a new tool to our MCP server called "read_docs" that invokes the "go doc" shell command. The tool will take a mandatory "package" argument and an optional "symbol" argument.

TODO:
- create a package `./internal/tools/docs`
- register the tool with the MCP server
- update the client to support the "read_docs" tool by providing arguments to the tool call

Acceptance Criteria:
- `./bin/client --tools-list` show both hello_world and read_docs
- `./bin/client --tool-call read_docs fmt` returns the documentation for the `fmt` package
- `./bin/client --tool-call read_docs fmt.Println` returns the documentation for the `fmt.Println` function
- `./bin/client --tool-call read_docs github.com/modelcontextprotocol/go-sdk/mcp` returns documentation for the `mcp` package

注: このプロンプトを使用することも、独自のプロンプトを作成することもできます。

役立つヒント

MCP はまだ新しいコンセプトであり、Go SDK for MCP は新しいライブラリであるため、このステップで Gemini が適切な実装を独自に特定できるまで時間がかかる可能性があります。モデルが適切なソリューションを見つけられるように、次のことを試してください。

  1. モデルがどのステップでもドキュメントの読み取りをスキップした場合は、ESC キーを押して、ドキュメントの読み取りを促します。Go に慣れていない場合は、「go doc」とパッケージ名「go doc github.com/modelcontextprotocol/go-sdk/mcp」を実行すると、適切なドキュメントが返されます。
  2. 最上位モジュール「github.com/modelcontextprotocol/go-sdk」にはドキュメントがありません(Go コードがないため)。モデルに完全なパスを検索するように指示する必要があります。
  3. 逆に、モデルが存在しないパッケージをハルシネーションした場合(例: 「go doc github.com/modelcontextprotocol/go-sdk/mcp/server」と入力して、最上位のパッケージに移動します。

6. Gemini CLI の MCP サーバーとして godoctor を構成する

AI アシスタントがクライアントとサーバーの両方のコードを生成したら、いくつかの手動テストを実行するよう指示します。次に例を示します。

retrieve the documentation for the package net/http

また、外部依存関係(標準ライブラリに含まれていないもの)でもテストを行ってください。

retrieve the documentation for the github.com/modelcontextprotocol/go-sdk/mcp package

結果に問題がなければ、このプロジェクトの使用方法と開発方法の手順を示した README.md を作成するよう指示します。

Now write a detailed README.md file explaining both from a user and a developer perspective how to use and to build this project.

次に、サーバーを構成して、開発の次の段階で Gemini CLI がサーバーを使用できるようにします。

  1. GEMINI.md を更新して、ドキュメントの読み取り方法として read_docs の使用を最優先するよう CLI に指示します。
update the GEMINI.md file to include instructions to always use the read_docs tool to retrieve documentation about Go packages or symbols. This should be done whenever seeing an import for the first time in a session or after a new dependency is installed to the project (e.g. via `go get`)
  1. MCP サーバーを構成するには、Gemini CLI を再起動する必要があります。まず、再起動後に中断したところから再開できるように、チャット セッションを保存しましょう。
/chat save godoctor-workshop
  1. Ctrl+D キーを 2 回押すか、/quit コマンドを入力して CLI を終了します。
  2. 前の手順で、エージェントがサーバー バイナリをコンパイルしているはずですが、ソースコードを変更しても影響を受けないように、別の名前でサーバーを再度コンパイルします。
mkdir -p bin && go build -o ./bin/godoctor ./cmd/server
  1. ローカルツール用の Gemini CLI を構成します。プロジェクトのルートに .gemini/settings.json ファイルを作成し、mcpServers セクションを追加して、コンパイルされたサーバーの実行方法を Gemini CLI に指示します。
mkdir -p .gemini && touch .gemini/settings.json
  1. 次に、cloudshell エディタまたは任意の IDE を使用して、次のコンテンツを新しいファイルに追加します。
{
  "mcpServers": {
    "godoctor": {
      "command": "./bin/godoctor"
    }
  }
}
  1. gemini コマンドで Gemini CLI を起動する
  2. /mcp コマンドを入力すると、ツールが読み込まれていることを確認できます。/mcp desc を使用して、ツールの完全な説明を表示することもできます。

13a5a979b9d5408d.png

  1. 「パッケージ net/http のドキュメントを表示して」などのプロンプトで Gemini CLI にツールの使用を指示して、統合をテストします。

次のように表示されます。

fdaa342e76dc5b52.png

ツールが正しく機能している場合は、ツール呼び出しで取得されたドキュメントが表示されます。

defa9d11314522d4.png

これで MCP ツールが完成しました。しかし、これで終わりではありません。このサーバーをもう少し便利にすることができます。

7. AI を活用したコードレビュー担当者の追加

Gemini API を使用するコードレビュー担当者という、より高度な AI 搭載機能を追加しましょう。

/chat resume godoctor-workshop. コマンドを使用して、以前のチャット セッションを復元できるようになりました。これにより、read_docs の開発を完了した時点までのセッション コンテキストが読み込まれるため、モデルは新しいツールを構築するために必要な知識を持つことになります。

このツールは Vertex AI にアクセスする必要があるため、まず API を有効にする必要があります。空のプロンプトに感嘆符(!)を入力すると、Gemini CLI を終了せずにシェルコマンドを実行できます。これにより、Gemini CLI がシェルモードに切り替わります。

シェルモードで次のコマンドを実行して、Vertex AI API を有効にします。

gcloud services enable aiplatform.googleapis.com

コマンドが完了したら、Esc キーを押してプロンプト モードに戻ることができます。

目標: 既存のプロジェクトに code_review という名前の新しいツールを追加します。このツールは、Gemini API を使用して Go コードを分析し、フィードバックを提供します。

プロンプトの例:

Add a new tool to my project called code_review. This tool should use the Gemini API on Vertex AI (with model id gemini-2.5-pro) to analyze Go code and provide a list of improvements according to the best practices accepted by the Go community.

The tool should take the Go code content and an optional hint as input. The hint will be used to provide additional guidance for the AI reviewer, like "focus on security" or "help me simplify this code".

The tool output should be text in Markdown format.

TODO:
- add the genai SDK dependency with `go get import google.golang.org/genai`
- create the tool code in ./internal/tools/code/review.go
- create a code review prompt to be used by the tool
- use go-genai with Vertex AI authentication to call gemini-2.5-pro
- register the tool with the server
- add a flag to the server to set the Google Cloud Project ID: --project
- add a flag to the server to set the Google Cloud Location: --location
- add support to the review tool in the client CLI

NOT TO DO:
- DO NOT use the package github.com/google/generative-ai-go/genai as it is DEPRECATED
- DO NOT use the package cloud.google.com/go/vertexai/genai as it has been superseded by google.golang.org/genai

Acceptance Criteria:
- `./bin/client --tools-list` show all tools including `code_review`
- `./bin/client --tool-call code_review internal/tools/code/review.go` returns the code review for the "review.go" file

役立つヒント

  1. モデルが処理を開始すると、genai パッケージのドキュメントを閲覧するために read_docs ツールを呼び出すリクエストが自動的に表示されることがあります。そうでない場合は、いつでも Esc キーでプロセスを中断し、read_docs ツールが利用可能になったことを通知できます。
  2. 間違った GenAI SDK を使用しようとしていることがわかった場合(プロンプトに「許可されていない」リストが明示的に記載されている場合でも)、正しい SDK に戻します。

コード レビューアのテスト

  1. /chat save godoctor-workshop でチャット セッションを保存し、Ctrl+D キーを 2 回押して CLI を終了します。
  2. 新しいツール定義を使用してサーバーを再コンパイルします。
go build -o ./bin/godoctor ./cmd/server
  1. IDE を使用して、Vertex AI の環境構成を含むように .gemini/settings.json ファイルを更新します。
{
  "mcpServers": {
    "godoctor": {
      "command": "./bin/godoctor",
      "env": {
        "GOOGLE_CLOUD_USE_VERTEXAI": "true",
        "GOOGLE_CLOUD_PROJECT": "<your-project-id>",
        "GOOGLE_CLOUD_LOCATION": "<your-preferred-region>"
      }
    }
  }
}
  1. Gemini CLI を再度起動します。/chat resume godoctor-workshop を使用してチャット セッションを復元する
  2. /mcp コマンドを入力して、ツールが有効になっていることを確認します。次のように表示されます。

f78b39f95edf358a.png

  1. 次に、ツールのソースファイルの 1 つを確認して、code_review ツールをテストします。
Use the code_review tool to review cmd/server/main.go
    You should see something like this:

d946dcc99f5e37b9.png

コードレビュー ツールが動作するようになったので、モデルに改善案の適用を提案して、完全な「自己改善」ワークフローを実現できます。

これで、code-review ツールが動作することを確認できました。次のセクションでは、クラウドへのデプロイについて説明します。/chat save godoctor-workshop で現在のセッションを保存し、CLI を終了します。

8. クラウド用にサーバーを準備する

これまで開発してきた MCP サーバーはローカルマシンでのみ実行されます。自分専用のツールを開発している場合はそれで問題ありませんが、エンタープライズ環境では、数百人さらには数千人もの開発者が幅広く使用できるツールをデプロイしなければならない場合があります。

MCP サーバーをスケーリングするには、標準 I/O しか使えないサーバーから HTTP を使用できるサーバーに変換したうえで、さまざまな開発者がアクセスできる場所にサーバーをデプロイする必要があります。これを行うため、MCP 仕様で定義されているトランスポート モードを Streamable HTTP として、Cloud Run をデプロイ ターゲットとして使用します。

目標: godoctor サーバーをリファクタリングして、Streamable HTTP トランスポートを使用します。

プロンプトの例:

The godoctor server is currently using the stdio transport. I want to prepare it to be deployed to Cloud Run, so we need to add support to use the Streamable HTTP transport.

TODO:
- Update server to enable Streamable HTTP via the -http flag.
- An optional -listen flag can be specified to set the port to listen
- If no -http flag is specified, the server defaults to stdio transport and -listen is ignored
- Update client to use Streamable HTTP via the -addr flag
- If no flag is specified, the client defaults to command transport
- Create a shell script test_server.sh to support testing

NOT TO DO:
- DO NOT use the HTTP+SSE protocol as it has been deprecated by the MCP specification

Acceptance Criteria
- Create a shell script that:
  - Runs the server in the background;
  - Runs the client connecting over HTTP and call list tools
  - Kills the background process
- The shell script should run without failures

役立つヒント

  1. モデルは非推奨の HTTP+SSE を代わりに使用しようとする場合があります。モデルがこのパスを進んでいる場合は、Streamable HTTP を使用するよう誘導してください。
  2. 現在のバージョンの Gemini CLI(0.26.0)は、バックグラウンドでのプロセスの実行をサポートしていません(run_shell_command で起動されたプロセスは、ツール呼び出しが返されると終了します)。そのため、Gemini にスクリプトを使用してテストプロセスを自動化するよう依頼しています。この機能は計画されており、まもなく追加される予定です。これにより、テストプロセスを簡素化できます。

省略可: HTTP を使用して MCP サーバーをテストする

HTTP 経由でサーバーを使用するように Gemini CLI を構成する場合は:

  1. セッションを保存して CLI を終了する
  2. .gemini/settings.json ファイルを編集し、ローカルで実行中のサーバーを指すように構成を変更します。
"mcpServers": {
  "godoctor": {
    "httpUrl": "http://localhost:8080"
  }
}
  1. 2 番目のターミナルで、HTTP 対応サーバーをローカルで実行します。
go build -o ./bin/godoctor ./cmd/server && ./bin/godoctor -listen=:8080
  1. Gemini CLI を再起動し、接続をテストするプロンプト(例: 「godoctor ツールを使用して fmt.Println のドキュメントを取得します。」
  2. テストが完了したら、Ctrl+C キーを押してサーバーを停止します。

9. Docker を使用してアプリケーションをコンテナ化する

これでサーバーが正しいトランスポート プロトコルを使用するようになりました。続いてデプロイ用にコンテナ化していきます。

目標: godoctor サーバーをプロダクション レディなポータブル コンテナ イメージにパッケージ化する Dockerfile を作成します。

プロンプトの例:

Please create a multi-stage Dockerfile that compiles the Go binary and copies it into a minimal golang image like golang:1.25.6-alpine. The image should support the following environment variables:
- GOOGLE_CLOUD_USE_VERTEXAI
- GOOGLE_CLOUD_PROJECT
- GOOGLE_CLOUD_LOCATION

Acceptance Criteria:
- The image builds successfully
- Create a script test_docker.sh to launch the docker image in background and test the connectivity with the client:
    - Call list_tools on the client pointing to the server running on Docker
    - Call read_docs for fmt.Println
    - Stop the server
- The script should run without failures

省略可: Docker イメージを手動でテストする

Dockerfile を作成したら、イメージをビルドして実行し、正しく動作することを確認します。

  1. コンテナを構築します。
docker build -t godoctor:latest .
  1. コンテナをローカルで実行します。
docker run -p 8080:8080 -e PORT=8080 godoctor:latest
  1. 実行中のコンテナをテストする: 別のターミナルで Gemini CLI を起動し、ドキュメントの取得をリクエストします。
  2. テストが完了したら、Ctrl+C キーを押してサーバーを停止します。

10. Cloud Run へのデプロイ

次に、コンテナをクラウドにデプロイします。

目標: コンテナ化された godoctor サーバーを Google Cloud Run にデプロイします。

プロンプトの例:

Now please deploy this image to Cloud Run and return me an URL I can use to call the MCP tool. Configure Cloud Run to use the following environment variables:
- GOOGLE_CLOUD_USE_VERTEXAI: true,
- GOOGLE_CLOUD_PROJECT: <your-project-id>
- GOOGLE_CLOUD_LOCATION: <your-preferred-region>

TODO:
- Run `docker build -t gcr.io/daniela-genai-sandbox/godoctor .`
- Run `gcloud run deploy godoctor --image` with the image created above

Acceptance Criteria:
- Call list-tools with the client pointing to the CloudRun endpoint

デプロイが完了したら、Gemini CLI を構成して、今デプロイしたツールを使用するようにします。

.gemini/settings.json ファイルを更新して、MCP ツールをデプロイしたサービスを指す構成に変更するか、Gemini CLI に変更を依頼します。

now update the .gemini/settings.json file to use this URL for the godoctor server

最終的な mcpServers セクションは次のようになります(プレースホルダは実際の Cloud Run アプリの URL に置き換えてください)。

"mcpServers": {
  "godoctor": {
    "httpUrl": "https://<your-cloud-run-id>.us-central1.run.app"
  }
}

Cloud Run のデプロイをテストする

これで、最後のエンドツーエンドのテスト準備が整いました。

Gemini CLI をもう一度再起動します(コンテキストを保存する場合は /chat save/chat resume を使用します)。これで CLI からリモート MCP サーバーを呼び出せるようになります。パッケージのドキュメントをリクエストしてみましょう。

コードレビュー ツールをテストすることもできます。

Use the godoctor tool to review the cmd/godoctor/main.go file

クリーンアップ

テストが完了したら、環境をクリーンアップします。Gemini に、プロジェクトを削除するか、Cloud Run デプロイのみを削除するよう指示できます。プロンプトの例:

I'm done with my tests on the CloudRun server, please delete this deployment for me and revert my .gemini/settings.json to use the local version.

11. 完了

AI アシスタントに指示を出して、高度な AI 搭載ツールの構築、コンテナ化、デプロイを行いました。さらに重要な点として、最新のソフトウェア開発に不可欠なスキルである、要件を効果的なプロンプトに変換する力を実践的に練習しました。カスタム MCP ツールで Gemini CLI を拡張し、よりパワフルで専門的な Go 開発アシスタントへと変換しました。

リファレンス ドキュメント