ADK と Gemini CLI を使用してシンプルな旅行代理店を構築する

1. はじめに

9344c1d1a9f221b7.png

最終更新日: 2026 年 2 月 2 日

ADK を使用してシンプルな旅行代理店を構築する

Gemini CLI のおかげで、この ADK Python(*) ワークショップは、すぐに使用できます。

この Codelab は、次の 2 つの 🏅 マイルストーンに分かれています。

  1. 一般的なシンプルな学習パス: セットアップ + 即時的な満足感。
  2. Gemini CLI のサポートを受けながらクエストを選択して解決するパーソナライズされたパス

この Codelab の後半部分は、ハッカソンに最適です(最もクリエイティブなソリューションには賞品が贈られます)。

マイルストーン 1: ADK と Gemini CLI を使用した最初のエージェント

このマイルストーンの目標は、ADK を使用してシンプルな旅行代理店を段階的に構築することです。

そのため、まず Gemini CLI を設定して ADK でのコーディングを支援します。これにより、ローカルシェルで最新バージョンの Python ADK を選択し、コードとドキュメントを解釈して、目標を達成するための最新かつ最適なコードを提供できるようになります。

これは、小さなシンプルな増分で完全に動作するアプリを実現する手動ガイド付きの部分です。通常、この処理には 1 時間ほどかかります(インストール時間を含む)。

マイルストーン 2: エージェントを拡張する

その後、アプリを好みに合わせて拡張するための 12 個のオプション(難易度はさまざま)が提供されます。これにより、さまざまな側面(UI、運用、複雑なエージェントのやり取りなど)を検討できます。

作成するアプリの概要

この Codelab では、ADK と Gemini CLI を使用して旅行代理店アプリを作成します。作成するアプリの機能は次のとおりです。

  • Airbnb MCP を介して Airbnb API に接続します。
  • 最新情報(天気、日付など)をオンラインで検索する
  • カスタムツールを実行します。
  • NanoBanana を使用してアパートや部屋の画像を作成します。

Gemini CLI は、コードの作成/レビュー、ADK リポジトリのローカル ミラーでの最新ドキュメントの検索(Python またはお好みの言語)など、すべての手順をガイドします。

学習内容

  • ADK を使用してアプリを作成する方法
  • Gemini CLI を使用してローカル ドキュメントに基づいてアプリをコーディングする方法
  • 次のように、MCP サーバーとやり取りしてリアルタイムの外部データソースに接続する方法:

必要なもの

  • パッケージ(npm install .. など)をインストールできるコンピュータ
  • Python、TypeScript、Go、Java のいずれかでの基本的なコーディング能力。
  • IDE(Antigravity、vscode、IntelliJ、vim)の使用を強くおすすめします。

ADK と Gemini CLI を組み合わせる理由

ADK(エージェント ビルダー SDK)をローカル エージェント コード ヘルパー(Gemini CLI など)と組み合わせて使用する必要があるのはなぜですか?どちらのツールも非常に強力ですが、両者の連携は簡単ではありません。多くの人が両者を組み合わせて使用しようとしましたが、失敗しています(主に「ループ内のループ」の問題が原因です)。この Codelab では、共存を実現するためのヒントをいくつか紹介します。

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 での作業はすべて、ブラウザ内から実行できます。インストールは不要です。

前提条件(インストール)

このチュートリアルでは、次のものをインストールする必要があります。

1. Python と uv

pythonuvPython のパッケージ マネージャー)。これは ADK に必要です。uv がインストールされていることを確認します。

$ curl -LsSf https://astral.sh/uv/install.sh | sh

uv を使用する理由任意の Python マネージャーを使用できますが、uv を使用すると、Python の ENV/PATH 設定がユーザーと Gemini CLI で同じになるため、シェル エクスペリエンスは Gemini CLI とほぼ同じになります。たとえば、virtualenv を使用すると、Gemini CLI は「source .env/venv/bin/activate && my-original-command」などの処理を強制的に実行して、環境を模倣します。

2. Gemini CLI

gemini CLI のインストール手順については、https://github.com/google-gemini/gemini-cli をご覧ください。

注: これには npm または npx がインストールされている必要があります。

npm install -g @google/gemini-cli

  1. Mac では、公式ドキュメントに沿って brew を使用できます。
  2. Windows では、chocolatey を使用するか、https://nodejs.org/en/download から実行可能ファイルをダウンロードできます。

ステップ 4(後述)では、npx もインストールする必要があります。npmnpx はどちらも Gemini CLI の一部として自然に提供されます。そうでない場合は、Gemini CLI にサポートを依頼してください。

必要に応じて、より高度で自己文書化された Makefile である just をインストールすることもできます。また、Gemini CLI にインストールを依頼することもできます。

efade99623113f1.png

認証。

Vertex AI が有効になっている Google Cloud プロジェクト、または Google AI Studio API キーが必要です。

オプション A(ワークショップにおすすめ): API キーをエクスポートします。

export GOOGLE_API_KEY="your-api-key"

オプション B(Vertex AI): gcloud で認証します。

export GOOGLE_CLOUD_PROJECT="YOUR_PROJECT_ID"
export GOOGLE_CLOUD_LOCATION="YOUR_PROJECT_LOCATION"
export GOOGLE_GENAI_USE_VERTEXAI=true
gcloud auth application-default login

作業環境を設定する

mysolution/ の下に独自のソリューションを作成するので、必要なフォルダと 2 つのファイルを作成しましょう。

ここで IDE(Visual Studio Code、IntelliJ、RubyMine など)を開き、フォルダを開きます。

# 1. Find an empty directory, and download this repo.
git clone https://github.com/palladius/ai-friendly-agents/
cd ai-friendly-agents/adk/workshops/simple-travel-agent/

# 2. Create your solution empty skeleton
mkdir -p mysolution/
touch mysolution/__init__.py mysolution/agent.py

# 3. This installs ADK and MCP via `uv` by reading pyproject.toml
uv sync

# 4. Call Gemini CLI
gemini  # This runs Gemini CLI under the simple-travel-agent/ folder.
# Login with your GMail account.

uv sync は厳密には必須ではありませんが、失敗した場合は、Python または uv のインストールを修正する必要があることがわかります。

利用可能なソリューション

コードはすべて 📂 steps/ に含まれています。コードは自由にコピーできます。

この Codelab は、優れた ADK コードの作成方法を学ぶものではなく、優れたコードを指示どおりに自動的に作成するための環境をセットアップするためのものです。

  1. ソフトウェアのインストール
  2. 構成 / 動作させること、
  3. 正当なフィードバック ループを入力する

これが、ここで本当に学んでいただきたいことです。$ just web-4steps を使用して、すべてのテストを同時に実行することもできます。

3. ステップ 1: 基本エージェント

abfef47ab2ff0c98.png

まず、会話ができる基本的なエージェントを作成しましょう。

次の内容を追加して、mysolution/__init__.py というファイルを編集します。

from .agent import root_agent

これで完了です。これにより、ADK はコードが agent.py にあることを認識できます。

次の内容を追加して、mysolution/agent.py というファイルを編集します。

from google.adk.agents import Agent

root_agent = Agent(
    name="travel_basic",
    model="gemini-2.5-flash",
    instruction="You are a helpful travel assistant." +
    "You can help with general travel advice based on your knowledge.",
)

エージェントをテストする

これはすべてのステップに当てはまります。ADK では、CLI とウェブの 2 つの方法でエージェントをテストできます。

  • CLI は迅速な自動テストに最適
  • ウェブは、何が起こっているかを視覚的に確認し、マイク(!)を使用してトラブルシューティングを行うのに最適です。

ヒント: この演習では、単体テスト以外のタスクを完了するために、ウェブを使用します。本当に素晴らしいです。CLI は自動テスト専用にします。

ステップ 1 ~ 4 を適切にテストする優れたプロンプトは次のようになります(スマートな「リトマス プロンプト」)。

# <!– litmus prompt –> 明日の夜、パリの中心部で 1 泊できるホテルを予約したいのですが。リヨン駅の近くが理想です。予算: 1 泊あたり 200 ユーロ未満。

  1. 明日の YYYYMMDD と曜日を教えて。
  2. 明日予約できるホテルを 3 つ以上教えてください。価格、住所、評価(XX/YY 形式、例: 「4.7/5」 - Google ホテル、Booking、Airbnb から)、レビュー数。表形式で教えてください。理想的には、ホテル名がホテルの URL にリンクされている必要があります(URL 列を追加する必要はありません)。リンクが有効であることを確認します(リンクが機能し、ページがホテルの情報にリンクされていること)。

これは時間とホテルをテストするスマート プロンプトです。ステップ 1、2、3 では異なる形で失敗し、ステップ 4 でのみ完全に成功するはずです。もちろん、任意のプロンプトを使用できます。

bash(CLI)から実行します。

# 1. If ADK was installed:
adk run mysolution/
# ... but if you get: -bash: adk: command not found"
# 2. Call ADK cli script through UV to avoid python install nightmares.
uv run adk run mysolution/

上記の「リトマス プロンプト」で試してみてください。

特定の日付を認識できない可能性が高くなります。日付を認識するように教える必要があります。

ウェブの場合は、次の操作を行います。

  1. uv run adk web . : このフォルダ内のすべてのエージェントを実行します。「mysolution/」サブフォルダを指すようにします。
  2. 右上の mysolution/ を選択します(横の画像を参照)。
  3. 「リトマス プロンプト」のような質問をテキストまたはマイクで入力します。

TODO(ricc): <ここに画像を挿入>

CLI バージョンに応じて、上位フォルダから adk web を呼び出す必要があります。

こちらは、日付の半幻覚を含む解決策の例です。5 つの予約リンクのうち 3 つが機能しています。悪くない。

4. ステップ 2: now() ツールを追加する

エージェントは「今日」が何であるかわかりません。ツールを提供しましょう。

TODO(画像): ricc がステップ 2 の画像をここに配置します。

次の関数を root_agent 定義の直前の agent.py に追加します。

from datetime import datetime

def now() -> dict:
    """Returns the current date and time."""
    my_datetime = ... # Ask Gemini CLI to help you!
    return {
        "status": "success",
        "current_time": my_datetime
    }

ツールを含めるようにエージェント定義を更新します。

  # file XXX.py

  travel_agent = LlmAgent(
        name="..",
        model="..",
        instruction="..",
        tools=[now] # <== This is the only line you want to add.
    )

もう一度実行して、同じ質問をします。日付は認識され、ホテルについては曖昧な回答が返されるようになりました。

次のようなコマンドでテストすることもできます。

# Let's pretend we're in Milan. This should call the tool
# and respond correctly (possibly with some TZ math issues)

echo "What time is it in Milan?" | uv run adk run mysolution/

5. ステップ 3: ギアを切り替えましょう: google_search

カスタムツールの作成方法を理解したところで、ADK が提供する強力な組み込みツールの 1 つである google_search の使用方法を見ていきましょう。これにより、エージェントはウェブからリアルタイムの情報を取得できます。

3cd72c019b8b225f.png

タスクは、ステップ 2 のエージェントを変更することです。now ツールを使用する代わりに、ADK ライブラリから google_search ツールをインポートして使用します。

# Full Code: `steps/step03_search/agent.py`
# Remember to REMOVE the now() tool here. See above why.
from google.adk.agents import Agent
from google.adk.tools import google_search

root_agent = Agent(
    name="travel_agent",
    model="gemini-2.5-flash",
    tools=[google_search],
    instruction="""You are a travel agent.
Your job is to help the user plan a trip.
You have access to a search engine.
If you don't know the answer, you can use the search engine.
When you are done, reply with "DONE".""",
)

実行方法

ステップ 1 と同じです。

エキスパートのみ。より高度な統合(google_searchnow を一緒に使用)の場合は、steps/step03b_search_and_tool/agent.py のコードを確認し、just run-step3b で実行します。これは完全に任意です。

6. ステップ 4: より高度なツール: MCP

TODO(ricc): 画像 4 を追加

カスタムツールと組み込みツールの両方を見てきたので、次は Model Context Protocol(MCP)を使用した Model-as-a-Tool パターンという、より強力なものに進みましょう。

このステップでは、MCP の強力な機能に焦点を当てるため、以前のツール(google_search)を再度置き換えます。シンプルな now ツールを再度導入し、airbnb_mcp ツールと並行して実行します。これは、エージェントが複数の互換性のあるツール(この場合は FunctionToolMCPToolset)を使用して複雑なタスクを実行する方法を示しています。

# Full Code: steps/step04_mcp/agent.py
# ... Imports as before
from google.adk.tools.mcp_tool.mcp_toolset import MCPToolset
from google.adk.tools.mcp_tool.mcp_session_manager import StdioConnectionParams
from mcp import StdioServerParameters

def now() -> dict:
    # ... as before

# Configure the Airbnb MCP Toolset
airbnb_mcp = MCPToolset(
    connection_params=StdioConnectionParams(
        server_params=StdioServerParameters(
            command='npx',
            args=["-y", "@openbnb/mcp-server-airbnb", "--ignore-robots-txt"],
        ),
    )
)

root_agent = Agent(
    name="travel_mcp",
    model="gemini-2.5-flash",
    instruction="You are a helpful travel assistant. You can find accommodation using Airbnb, and have access to the current time.",
    tools=[now, airbnb_mcp],
)

実行方法

この手順では、システムに npx がインストールされている必要があります。残りの部分は上記と同じです。

注意事項/ エラー

  1. robots.txt 制限エラーが発生した場合は、robots ディレクティブを無視して MCP にパッチを適用できます。詳しくは、ドキュメント(https://github.com/openbnb-org/mcp-server-airbnb)をご覧ください。
  2. timeout エラーが発生した場合(Airbnb がレスポンスを取得するには 5 秒が短すぎる場合)は、タイムアウトを 30 秒などに増やす方法について ADK のドキュメントをご覧ください。または、Gemini CLI を使用して実行します。3dec25m の Cloud Shell でタイムアウト エラーが発生しました。タイムアウト エラーを修正しましたが、args=["-y", "@openbnb/mcp-server-airbnb@0.1.2", "--ignore-robots-txt"] で以前のバージョンに強制的に戻すまでエラーが発生し続けました。

7. 🏅 マイルストーン 1 を達成しました!

🏅 おめでとうございます。🏅 これであなたも ADK のエキスパートです。ワークショップの最初の部分が完了しました。カスタムツール、組み込みツール、高度な MCP ツールを使用して、AI エージェントの構築とテストに成功しました。これで、Google Agent Development Kit を使用して独自の優れたエージェントを構築する準備が整いました。

これで、時刻を把握し、ウェブを検索できる機能的な旅行代理店が完成しました。可能性は無限大です。

ここで、「Gemini CLI」を使用して機能を追加します。

8. 🏅 マイルストーン 2: Gemini CLI を介して ADK をバイブ コーディングする

ここからがワークショップの面白いところです。

  1. コードを安全な場所に git commit していることを確認します。元のコードをフォークするか、ブランチを作成します。Gemini CLI は、この作業をサポートするのに優れています。
  2. 実装する 💡 アイデアを見つけます。以下のアイデアを確認するか、自分でアイデアを見つけるか、Gemini に rag/ のドキュメントを確認して、いくつかのスマートなアイデアを提案してもらいます。
  3. 前提条件に沿って、Gemini が ADK ドキュメントを読み取れるようにします。

💡 アイデア

さまざまな複雑さのアイデアのメニューを次に示します。

  1. 🟢 [簡単] 言語の多言語話者ですか?gojavaTypescript のいずれかをお渡ししますか?既存のコードのリファクタリングは非常に簡単です。適切な ADK をダウンロードし、Gemini CLI に変換を依頼してください。
  2. 🟢 [簡単] 絵文字を追加したり、好みの出力形式を指定したりします(例: ホテルの絵文字、価格、1 ~ 5 つ星の絵文字を 🌕🌕🌕🌗🌑 に基づいて表示する表。半分も表示できます)。
  3. 🟢 [簡単] プロンプトを変更して、探しているものや探していないもの(ペット可、1 階以外、静か、公共交通機関に近いなど)を具体的に伝え、テストします。上記の情報を基に「YOUR_NAME の 1 ~ 10 の評価」などの個人的な評価を追加し、その評価で並べ替えることもできます。
  4. 🟢 [簡単] 部屋にオペレーターはいますか?Cloud Run にデプロイしましょう。または Vertex AI Agent Engine にデプロイします。このエージェントを統合して、新しい Gemini Enterprise から直接呼び出すことができることをご存知ですか?
  5. 🟢 [簡単] `adk run` を 🍌 NanoBanana MCP と統合します。Gemini API キーが必要です。ここでは、画像を作成できますが、視覚化することはできません。難しいバリエーションについては、以下をご覧ください。
  6. 🟡 [中] HotelSearch を実行するサブエージェントを作成し、BudgetAgent または LocationAgent を作成します。これにより、位置情報のニーズ(「LOCATION から X km 以内」など)を尊重しながら、ホテルを絞り込んで反復処理できます。API でこれが許可されていない場合は、GoogleSearch がサポートするやり取りが発生する可能性があります。注: Gemini CLI を使用すると、この作業を効率的に行えます。
  7. 🟡 [中] 検索結果で表示された 1 つまたは複数のホテルについて、クチコミを分析し、肯定的な内容と否定的な内容を色分けされた箇条書きで要約する AirbnbReviewAgent を実装します。すでに 2 つの要素(GoogleSearch と MCP Airbnb)があるため、これをメイン エージェントに接続し、それらが通信するためのプロトコルを考案する必要があります。
  8. 🟡 [中] A2A と統合します。A2A エージェントにしましょう。ここでも Gemini CLI に助けを求めましょう。
  9. 🔴 [複雑] Flights や他の MCP 機能と統合して、多面的な多機能旅行代理店を作成できます。
  10. 🔴 [複雑] ADK ウェブを 🍌 NanoBanana MCP と統合します。これは上記の例よりも難易度が高く、https://github.com/palladius/ai-friendly-agents/issues/11 でヒントを確認できます。この作業には、Gemini CLI と Gemini3 を使用して 3 時間のやり取りを行い、rag/ のドキュメントとコードを読みました。

アイデアをお探しですか?

  1. Maurizio の優れた ADK チュートリアルでアイデアを確認してください。
  2. rag/ のドキュメントを参照してアイデアを見つけるよう Gemini CLI に指示します。プロンプトの例: Is there a feature in here which seems very succulent to you? Give me 3 proposals and let's implement together the one I choose

ADK「RAG」の前提条件

機能を vibe コード化するには、ADK 全体(Python ADK)をダウンロードすることをおすすめします(注: これは、JavaGo など、お好みの言語に簡単に適応させることができます)。

コードは ./rag にあり、./download-adk.sh でダウンロードできます。

rag フォルダが .gitignore ファイルにリストされているため、.gemini/settings.json に次の内容が含まれていることを確認します。

{
 "context": {
   "includeDirectories": ["rag"]
 }
}

Why? Gemini にはこれらのファイルを読み取ってほしいが、git で安全に無視したい。技術的には、context.fileFiltering.respectGitIgnorefalse に設定してすべての .gitignore ファイルを非表示にすることもできますが、node_modules/__pycache__/ のゴミが大量に開かれるため、明示的なフォルダの追加が推奨されます。

9. 次のステップ

好奇心: このワークショップは Gemini CLI を使用して作成されました。興味をお持ちの場合は、このフォルダの GEMINI.mdWORKSHOP_PLAN.md をご覧ください。

学んだ教訓

ADK と Gemini CLI をペア設定する方法を学習しました

追加資料

6d05afb6b8b235d8.png