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

1. はじめに

9344c1d1a9f221b7.png

最終更新日: 2026 年 6 月 22 日

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

この ADK Python(*) ワークショップへようこそ。Gemini CLI のおかげで、必要なものはすべて揃っています。

この 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 コンソール にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

295004821bab6a87.png37d264871000675d.png96d86d3d5655cdbe.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 コンソール で、右上のツールバーにある Cloud Shell アイコンをクリックします。

Cloud Shell をアクティブにする

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

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

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

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

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

1. Python と uv

python と uv(Python のパッケージ マネージャー)。これは 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 をご覧ください。

# Note: This requires having npm or npx installed.
npm install -g @google/gemini-cli
  1. Mac では、公式ドキュメントに従って brew を使用できます。
  2. Windows の場合は、chocolatey を使用するか、https://nodejs.org/en/download から実行可能ファイルをダウンロードします。

ステップ 4(後述)では、npx もインストールする必要があります。npm と npx はどちらも、Gemini CLI の一部として自然に提供されるはずです。そうでない場合は、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/adk-gemini-cli-workshop
cd adk-gemini-cli-workshop/

# 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 init
uv sync

# 4. Call Gemini CLI
gemini  # This runs Gemini CLI under the adk-gemini-cli-workshop/ folder.
# Login with your GMail account.

uv sync は厳密には必要ありませんが、失敗した場合は、Python または uv のインストールを修正する必要があります。これにより、adk とその他の便利なスクリプトが ./.venv/bin/ フォルダにインストールされます。

設定をテストするには、make test-step1 を実行して、403 PERMISSION DENIED. が表示されないことを確認します。

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

コードはすべて 📂 steps/ に含まれています。そこからコードをコピーしてかまいません。

この Codelab は、優れた ADK コードの記述方法を学ぶためのものではなく、指示に基づいて優れたコードが自動的に記述されるように環境を設定するためのものです。

  1. ソフトウェアのインストール
  2. 構成 / 動作させること、
  3. 好循環のフィードバック ループを構築する

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

4. ステップ 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、2、3、4 を適切にテストする適切なプロンプトは、次のようになります(スマートな「リトマス プロンプト」)。

こんにちは。明日の夜、パリの中心部で 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. 「リトマス プロンプト」に沿って、テキストまたはマイクで質問します。

旅行代理店の結果が表示された ADK ウェブ UI

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

黄色のロボット - 日付とホテルの候補が表示されたステップ 1 の結果

考えられる解決策は次のとおりです。日付が部分的にハルシネーションになっています。5 つの予約リンクのうち 3 つが機能していることに注目してください。悪くないね。

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

agent.py での now() ツールの実装を示す Cloud Shell エディタ

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

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

  root_agent = Agent(
        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/

6. ステップ 3: 気持ちを切り替えましょう: google_search

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_search と now を併用)については、steps/step03b_search_and_tool/agent.py のコードを確認し、make run-step3b で実行します。これは完全に任意です。

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

ADK ロゴ

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

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

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

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

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

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

次に、Gemini CLI を使用して追加機能を実装します。

9. 🏅 マイルストーン 2: Gemini CLI を介して ADK でバイブ コーディングを行う

ここからが、このワークショップの面白い部分です。

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

💡 アイデア

  1. 🟢 [初級] 複数の言語を話せますか?go、java、TypeScript のいずれかをお選びください。既存のコードのリファクタリングは非常に簡単です。適切な 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 でこれが許可されていない場合は、Google 検索でやり取りが行われることがあります。注: Gemini CLI を使用できます。
  7. 🟡 [中] AirbnbReviewAgent を実装します。これは、クチコミを調べて、検索結果の 1 つまたは複数のホテルについて、長所と短所を色分けされた箇条書きで要約します。すでに 2 つのコンポーネント(Google 検索と MCP Airbnb)があり、これらをメイン エージェントに接続し、通信するためのプロトコルを考案する必要があります。
  8. 🟡 [中] A2A と統合する。A2A エージェントにしましょう。ここでも、Gemini CLI に助けを求めます。
  9. 🔴 [複雑] フライトやその他の MCP 機能と統合して、多面的な多機能旅行代理店を作成できます。
  10. 🔴 [複雑] ADK ウェブを 🍌 NanoBanana MCP と統合します。これは上記よりも難しく、https://github.com/palladius/ai-friendly-agents/issues/11 にいくつかのヒントがあります。この作業には、Gemini CLI と Gemini3 のやり取りに 3 時間、rag/ のドキュメントとコードの読み取りに 2 人で 3 時間かかりました。

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

  1. 公式の ADK チュートリアルでアイデアを確認する。
  2. Gemini CLI に、rag/ のドキュメントを参照してアイデアを見つけるよう Gemini に相談します。プロンプトの例: 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」の前提条件

機能のバイブコーディングを行うには、ADK Python ADK 全体をダウンロードすることをおすすめします(注: これは、Java や Go など、お好みの言語に簡単に適応できます)。

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

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

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

理由: Gemini がこれらのファイルを読み取れるようにしつつ、git-ignored で安全に保護したいと考えています。技術的には、context.fileFiltering.respectGitIgnore を false に設定してすべての .gitignore ファイルを再表示することもできますが、これを行うと node_modules/ や __pycache__/ の不要なファイルが多数開かれるため、フォルダを明示的に含めることをおすすめします。

10. 次のステップ

好奇心: このワークショップは、Gemini CLI の助けを借りて構築されました。興味がある場合は、このフォルダの GEMINI.md と WORKSHOP_PLAN.md を参照して、どのように行ったかを確認できます。

学んだ教訓

ADK と Gemini CLI を組み合わせる方法を学びました

追加資料

6d05afb6b8b235d8.png