グループ プロダクト マネージャー
新しい Connected Apps Platform を使用すると、アプリのサービスを Gemini、検索の AI モード、Android インテリジェンス システムに直接統合できます。このセッションでは、導入に役立つ実践的なガイドをご紹介します。コード例を使用し、実際のケーススタディから学びながら、開発ライフサイクル(最初の接続済みアプリを構築、テスト、公開して、AI 搭載のワークフロー内でユーザーにリーチする)について説明します。
このセッションを修了すると、次のことができるようになります。
destructiveHint でマークします。これにより、アクションがデータを変更または削除するときに、Gemini が明示的な確認を求めるようになります。文字起こし
Google Playビジネス開発チームの ジョン・マグワイアです
私は Gemini Connected Apps Platform のプロダクト リードを務める Mai です。
その後、DevRel エンジニアの Kate からも話があります。
彼女が上がってきます。
そこで本日は、Google の最も人気のあるエージェント型プロダクトである Gemini と Google 検索にアプリを拡張する方法についてお話しします。
接続済みアプリがユーザーにとって便利で画期的な理由と、その仕組みについて説明します。
さらに、その構築に必要なものもご紹介します。
さっそく 本題に入りましょう
アプリのエコシステム全体で、非常に大きな変化が起きていることは、多くの人が目にしていると思います。
ユーザーがデバイスを使用し、答えを検索し、タスクを完了する方法は、単に進化しているだけではありません。
一変しました
人々はもはやブラウザを開いてタップするだけではありません。
Gemini などのアシスタントと直接会話しています。
Gemini に複雑な質問をしたり、Google 検索でマルチモーダルに回答を検索したりしています。
そして、Android デバイスがユーザーの言葉を理解するだけでなく、ユーザーが何をしたいのかを把握することを期待しています。
日常的に行っているワークフローをいくつか考えてみてください。
たとえば、特定の場所で特定の時間に友人と楽しい週末を過ごすためのアイデアを Gemini に尋ねたとします。
今日のモデルは、その計画を数秒で処理できます。
すごくいいところだよ。
整理されている。
そして、どうなるでしょうか。
終了します。
お客様は壁にぶつかり、計画だけで何も確認されていない状態で放置されます。
モデルは、何をすべきかはわかっていますが、それを実行する手段がありません。
そのため、Gemini とのチャットから情報をコピーして、別のアプリに貼り付ける必要があります。
モバイルでは、操作が非常に面倒になることがあります。
その後、すべての情報を覚えておいて、後で入力する必要があります。
この認知の飛躍と摩擦が、魔法を完全に台無しにしてしまいます。
これは、皆さんにとってどのような意味があるでしょうか。
これは、購入意向の強いユーザーの需要がチャットのふきだしに留まっており、アプリに誘導してユーザーのエンゲージメントを高めることができていないことを意味します。
コネクテッド アプリが画期的なのは、ユーザーがどこにいても対応できるからです。
そして現在、Gemini などのアシスタントとの会話に多くの時間を費やしています。
ユーザーが行動を起こす意図を実際に示す瞬間は、ユーザー ジャーニーにおいて非常に価値のある瞬間です。
受動的に閲覧しているわけではありません。
今すぐやりたいことが明確にあります。
アプリとこれらの生成モデルの統合を可能にすることで、Gemini などのアシスタントは質問に答えるだけでなく、タスクを完了できるようになります。
ユーザーが優先順位付きのやることリストを求めている場合、予定されているトラベルのためにレンタカーを借りようとしている場合、見つけたレシピの食材を購入したいと考えている場合、アプリは静的リンクとしてページの下部に表示されるわけではありません。
魔法のような体験を提供し、その場でアクションを実行できます。
ここで、すべてのデベロッパーとプロダクト リーダーが考えているであろうことを明確にしておきたいと思います。接続済みアプリは、アプリを抽象化するものではありません。
ブランド、ビジネス ロジック、認証済みの関係、カスタム UI エクスペリエンスはすべて、お客様のものです。
接続済みアプリは、サービスをエージェント型 API サーフェスに統合することで、Google のエージェント型プロダクトが購入意向の強いユーザーをシームレスにプロダクトに直接誘導できるようにするものです。
そして本日、この場で、Connected Apps Platform のリリースを正式に発表できることを大変嬉しく思います。
これまでは、Google サービス全体でユーザーにリーチするには、サービスごとに異なる統合が必要でした。
Android アプリのアクションやショートカットが必要な場合は、自分で作成する必要がありました。
検索の統合、もう 1 つ。
しかし、Google は、できるだけ簡単で素晴らしいものを提供したいと考えています。
そこで、Google はオンボーディングを標準化し、複数の Google エージェント プロダクトでアプリをリリースするためのエントリ ポイントを 1 つにしました。
標準の宣言型スキーマを使用してアプリの機能を一度構築すれば、Gemini と Google 検索という 2 つの主要なプロダクトで利用できるようになります。
さらに多くのサービスを近日提供予定です。
では、このリーチと、それが広告主様にとってどのような意味を持つのかについて説明します。
Android、Gemini、Google 検索で Google ユーザーにリーチするためだけに、複数のカスタム プラグインを構築し、4 つの異なるデベロッパー コンソールを管理し、さまざまな認証済みハンドシェイクを維持する必要はありません。
Google の統合プラットフォームでは、ツール定義を一度作成して登録するだけで、
必要な Google サービスを選択すると、新しい Google Connected Console に 1 つの起動ボタンが表示されます。
リリースすると、Gemini や Google 検索を使用するすべてのユーザーがあなたの機能を見つけられるようになります。
ユーザーがノートパソコンで Gemini に入力しているとき、ウェブの Google 検索で一連のクエリを検索しているとき、Android でアシスタント機能を使用しているときなど、ユーザーが最も必要としているときに、その場でアプリを使用する選択肢を提供できます。
そこで、Google はプレビューを皮切りに、プラットフォームを段階的に公開していく予定です。
チーム一同、すべての機能をできるだけ早く、できるだけ多くのユーザーに提供できるよう、全力で取り組んでいます。
このプレビュー段階では、米国のデベロッパーのみにプラットフォームを公開しています。
アクセス権をリクエストするには、フォームから登録します。フォームは、developers.google.com/connected-apps のデベロッパー ガイドにあります。Google Play デベロッパーの場合は、Google Play Console のホームページにもあります。
次の質問は、実際にこのようなものを構築するのはどれくらい難しいかということです。
REST API や Android インテントがある場合は、かなり良いスタート地点にいると言えます。
デベロッパーにとってなじみのあるコンセプトをベースにしています。
Google のプラットフォームは、サーバーベースと Android ネイティブの両方の MCP を通じて、Model Context Protocol(MCP)標準と統合されています。
さらに、Gemini をより便利に、より簡単に利用できるように、本日、デベロッパー モードという新機能をリリースしました。この機能は、米国のすべてのユーザーがリアルタイムで利用できます。
これにより、Gemini 内でアプリを操作し、エラー状態、レイテンシ、モデルの回答に関するリアルタイム フィードバックを得ることができます。
また、近日中に独自の評価セットを生成し、品質指標のスコアカードとベンチマークを取得できるようになります。
きっと素晴らしいものになるでしょう。
プラットフォームへのアクセス権に関係なく、デベロッパー モードでアプリをいつでも試すことができます。
詳細が気になるところだと思いますが、この後すぐにケイトが登壇し、数分で詳しく説明します。
そこで、まず、常に重要性が高まっている「ユーザーの信頼」についてお話しする必要があります。
エージェントが誰かの代わりにアクションを実行することについて話すとき、最初の質問は「ユーザーがコントロールを維持するにはどうすればよいか」というものです。
ここでは、いくつかのシンプルなコンセプトでこれを説明します。
まず、確認はリスクに応じてスケールします。
すべてのツール呼び出しの前にポップアップを表示するわけではありません。
何かを検索したり、メニューの在庫を確認したり、注文を追跡したりする作業は、スムーズに行える必要があります。
しかし、共有アイテムの編集、予約の完了、ユーザーが簡単に復元できないアイテムの削除など、アクションに実際の影響がある場合は、モデルはアクションを実行する前にユーザーに明示的な同意を求めるように設計されています。
2 つ目は、機密データが非表示ではなく表示されていることです。
そのため、Google のサービスは、アプリと共有される可能性のある個人情報を確認できるように設計されています。
機密性の高い情報が検出された場合は、共有される情報をユーザーに正確に示し、その時点でアプリの使用を続行するかどうかをユーザーが判断できるようにします。
3 つ目は、具体的に指示することです。
「本当に実行しますか?」という曖昧なメッセージではなく、どのアプリが何を送信または変更しようとしているのかを具体的に示します。
そうすることで、確認メッセージはユーザーがランダムにクリックするだけのものではなく、ユーザーが本当に決定するのに役立つものになります。
また、確認ばかりのジャーニーは誰も望まないため、ユーザーは確認を求められる頻度をより細かく管理できるようになります。
たとえば、Gemini アプリでは、ユーザーはアプリごと、さらにはアクションごとに、アクションを常に許可するかどうかを選択できます。
つまり、ツールを正直にマークしていただく必要があります。
読み取り専用、変更、データ削除をマークします。
これらのシグナルは、ユーザーをいつ呼び込むかを判断するのに役立ちます。
これについては、後ほどケイトが詳しく説明します。
では、先ほどお話しした週末の旅行の計画に戻りましょう。
その作業がどれほど大変で、断片化されていたか覚えていますか?
グループの友だちと素晴らしい計画を立てていたのに、壁にぶつかり、アプリを切り替えながらコピー&ペーストを繰り返さなければならなかった、という経験はありませんか。
Viator と Ticketmaster は、初期の素晴らしいパートナーの 2 社であり、ユーザーのニーズに応えることに大きなチャンスを見出しました。
そこで、Google と提携してその壁を取り払い、購入意向の強いユーザーが Gemini から直接アプリにアクセスできるようにしました。
これらのパートナーが構築した接続アプリのおかげで、ジャーニー全体がはるかにスムーズで摩擦のないものになっています。
それでは、見てみましょう。
ユーザーがアプリを接続し、Viator で日中のフードツアーを、Ticketmaster で 4 人分のコンサート チケットを探すよう Gemini に相談します。
Gemini はこの機能を認識し、適切なグループサイズ、日付、設定がすでに入力された状態で、Viator と Ticketmaster のツールを直接呼び出すことができます。
どちらのアプリも、会話を離れることなく、リアルタイムの空き状況を取得し、チャット内でリッチでインタラクティブなエクスペリエンスをユーザーに提供します。
Viator や Ticketmaster などのパートナーは、ユーザーが検索からアクションにシームレスに移行できるように、フードツアーの立ち寄り先を調べたり、コンサートの座席を選んだり、必要なことをその場でできるようにしています。
静的なアプリ ランチャーの時代は終わり、インテリジェントでプロアクティブなエージェント型のエクスペリエンスに取って代わられようとしています。
ユーザーはすでに Google 検索や Gemini を利用して、サポートを求めています。
私たちは、回答を提供するだけでなく、本当に強力で魔法のようなエクスペリエンスを提供できるよう、協力して取り組んでいきます。
私からは以上です。
ここからはケイトにバトンタッチして、コネクテッド アプリの構築方法を詳しく説明してもらいます。
どうぞ。
Google Playビジネス開発チームの ジョン・マグワイアです
デベロッパー リレーションズ エンジニアの Kate です。デベロッパーの皆様が Connected Apps Platform と統合できるようサポートしています。
そこで、接続済みアプリのテスト、ビルド、デプロイの方法について説明します。
また、先ほど Mai が述べたように、Connected Apps Platform と統合する方法は主に 2 つあります。1 つは MCP プロトコルを使用してリモート MCP サーバーを介する方法、もう 1 つは Android MCP を介する方法です。Android MCP では、AppFunctions ライブラリを使用してデバイス上にリモート MCP サーバーを構築できます。
Android、iOS、ウェブなどのプラットフォーム間で統合する場合は、リモート MCP サーバーを使用することをおすすめします。
また、アプリデータがデバイス上でのみ利用可能な場合は、ローカル実行を希望するというフィードバックも一部のデベロッパーから寄せられています。
このユースケースでは、AppFunctions Jetpack ライブラリを使用して Android MCP を使用することをおすすめします。
また、AppFunctions と Android MCP を介して Connected Apps Platform と統合する方法について、ダンとサラが特集している専用のトークもご覧ください。
次に、リモート MCP サーバーを構築する方法を見ていきましょう。
この仕組みを実際に示すため、公式の AndroidDevSummit 接続アプリを構築しました。
では、その仕組みを説明しましょう。
ライブデモに戻りましょう。
たとえば、「AndroidDevSummit、XR セッションについて詳しく教えて」と尋ねると、
現在、Gemini はこの接続済みアプリ用に構築された MCP サーバーに接続しています。
呼び出すべき適切なツールを見つけ、そのデータを使用して、ユーザーにわかりやすい回答を構築します。
1 日目と 2 日目の XR 関連セッションに関する情報を見つけ、最後に Android ボットを含む AndroidDevSummit のカスタム ブランド ウィジェットをレンダリングします。
このウィジェットは Gemini 内で直接操作できます。
スケジュールを確認できます。たとえば、場所を切り替えたり、日別にフィルタしたりできます。
また、さまざまなトピックでフィルタすることもできます。たとえば、XR 関連のセッションを検索したり、詳細を確認したり、スピーカーを確認したりできます。
やったね!
Gemini 内のすべてが、カスタム ブランドのエクスペリエンスであり、ユーザーは切り替える必要がなく、別のアプリで他の情報を探す必要もありません。すべてが 1 か所にあり、切り替えたり、アプリ自体を離れたりすることなく、操作できます。
では、スライドに戻りましょう。
この接続されたアプリを構築する方法を見ていきましょう。
FastMCP ライブラリを使用すると、MCP サーバーを簡単に起動できますが、従うべき重要なベスト プラクティスが 4 つあります。
まず、明示的なサーバー指示を指定する必要があります。
from mcp.server.fastmcp import FastMCP
mcp = FastMCP(
name="ADS-MCP",
instructions=(
"A Model Context Protocol server providing event "
"overview, schedules, sessions, speakers, and "
"sandbox demos for the Android Developer Summit "
),
)MCP サーバーを初期化する際は、接続済みアプリのドメインと機能を説明する明確な指示を必ず定義してください。
Connected Apps Platform は、これらの指示に基づいて、サーバーに委任するタイミングを判断します。
さらに、後ほどご紹介する Google Connected Console でも、これらの指示が存在することが明示的に検証されます。
2 つ目は、安全性と制御のためにツール アノテーションを追加することです。
@mcp.tool(
title="List Sessions",
annotations=ToolAnnotations(
readOnlyHint=True,
destructiveHint=False,
),
meta={ … },
)
def list_sessions( … )
…ADS サーバーには、次の 2 つのアノテーションがあります。
ツールが読み取り専用であるか、データを変更するかをモデルが認識することは重要です。
そのため、ユーザー情報を編集または削除するツールがある場合は、常にこの destructiveHint を使用して、編集または削除操作が可能であることをマークします。
これにより、Connected Apps Platform は、ユーザーに確認メッセージを表示して、このアクションを完了してもよいかどうかを確認する必要があることを認識します。
また、Connected Google Connected Console でツールを構成することもできます。これについては後ほど説明します。
3 つ目は、厳密に型指定されたスキーマとセマンティックな docstring です。
def list_sessions(
track: Optional[str] = None,
location: Optional[str] = None,
) -> List[Dict[str, Any]]:
"""Lists all sessions, optionally filtered by track
(e.g. 'Tools and performance', 'Apps Foundation',
'AI experiences', 'Android XR') or location
(e.g. 'MTV', 'Mountain View', 'London', 'LON').
"""
…パラメータの docstring をプロンプトの一部として扱います。
この list_sessions ツールでは、ツールやパフォーマンス、場所(マウンテンビューとロンドンなど)などの期待値を明示的に文書化します。
正確なツール呼び出しの最大の要因は、明確で説明的なスキーマです。
最後の 1 つは、UI リソース メタデータ バインディングです。
@mcp.tool(
…
meta={
"ui": {
"resourceUri": "ui://ads-mcp/summit-app",
},
…
},
)
def list_sessions(…)
…meta の UI 定義を見てみましょう。
このメタデータは、ツールの出力をカスタム UI リソースに直接バインドするよう Gemini に指示するブリッジです。
そこで、UI のレンダリングについて説明します。
@mcp.resource(
"ui://ads-mcp/summit-app",
name="summit-app",
mime_type="text/html",
)
def get_summit_ui() -> ResourceResult:
"""Renders the interactive ADS 2026 dashboard."""
return ResourceResult([
ResourceContent(
_build_summit_ui_html(),
mime_type="text/html",
)
])Connected Apps Platform を使用すると、MCP アプリ UI を介して MCP サーバーからリッチなユーザー インターフェースをレンダリングできます。
また、Android Dev Summit のように、ブランドを表現するカスタム インターフェースを柔軟に作成したい場合は、MCP UI リソースを公開できます。
また、Gemini は安全なサンドボックス化された iframe でレンダリングできます。
次に、ローカルマシンから本番環境に直接、接続アプリをテストしてデプロイする手順を説明します。
うん
では、ローカルで開発してテストする方法を見てみましょう。
開発段階では、最初のコマンドを使用してサーバーをローカルで簡単に起動できます。
./venv/bin/python server.py
npx @modelcontextprotocol/inspectorその後、MCP Inspector を使用してサーバーをデバッグし、利用可能なツールを確認したり、UI を操作したりできます。
これは、Android Dev Summit での MCP Inspector の表示例です。
ツールや UI を確認したり、ローカルでテストしたりできます。
次に、MCP サーバーをリモート エンドポイントにデプロイして、アクセスできるようにし、Gemini デベロッパー モードで検証する必要があります。
MCP エンドポイントは、任意のインフラストラクチャまたはクラウド プロバイダでホストできます。
Google Cloud を使用する場合は、Google Cloud CLI で簡単に使用できます。
この簡単なコマンドを使用してデプロイするだけで、アプリをリモートで使用できるようになります。
gcloud run deploy ads-mcp-server次のステップでは、Gemini デベロッパー モードでパブリック エンドポイントを検証します。
では、ライブデモに戻って、開発モードを実際に使用する方法を説明します。
[設定] に移動して [デベロッパー モード] をクリックするだけで、デベロッパー モードを簡単に見つけることができます。
次に、テストする接続済みアプリを選択する必要があります。
たとえば、ここに MCP サーバーの URL を指定するだけで、新しいサーバーを作成できます。
テスト用に、テスト エンドポイントを使用して ADS MCP という名前の MCP をすでに作成しています。
Gemini とエンドツーエンドでどのように連携するかをテストしたいだけです。
では、何か質問してみましょう。
「ADS MCP、イベントについて詳しく教えて。」
現在、Gemini は MCP サーバーを呼び出しています。また、デベロッパー モードで呼び出されているツールを確認することもできます。
たとえば、この特定のプロンプト「イベントについてもっと詳しく教えて」では、get_summit_info が呼び出されました。
また、レスポンスが成功したことも確認できます。
レイテンシを確認できます。
リクエストとレスポンスの詳細をすべて確認することもできます。
たとえば、レスポンスには多くの情報が含まれています。
少し拡大して、必要な情報をデバッグし、すべてが正確であることを確認することもできます。
コピーすることもできるので、チームメイトと共有する場合にとても便利です。
また、必要に応じてイベントログ全体をエクスポートして共有することもできます。
また、利用可能な他のツールを探索できるのも気に入っています。このデベロッパー モードでは、サミット情報の取得、セッションのリスト表示、その他のツールを確認できます。
また、環境を変更して、さまざまなユーザー コンテキストをシミュレートすることもできます。
たとえば、日中の時間帯や言語などの設定を変更したり、認証を設定したりできます。
以上が開発者モードです。
また、MCP サーバーの構築を今すぐ開始し、開発モードでテストすることもできます。
今すぐ誰でも利用できます。
スライドに戻りましょう。
違いますね。
開発モードでテストして、すべて問題ないことが確認できたら、次に何をすればよいでしょうか。
プラットフォームにアクセスするには、アクセス権を登録する必要があります。まず、こちらのお問い合わせフォームにご記入ください。
また、ドキュメントや Google Connected Console でも確認できます。
送信内容が承認されると、Google Connected Console にアクセスできるようになります。ここで、製品版のロールアウトに向けてアプリを準備できます。
コンソール内で、いくつかの手順を行うだけでアプリを準備できます。
まず、そこで新しい接続アプリを作成し、名前を指定する必要があります。
次に、機能とカテゴリを選択します。
たとえば、この例では [生産性] を選択し、[作成] をクリックします。
次に、[アプリの詳細] で、表示名やアイコンなどの公開データを指定する必要があります。また、ユーザー向けの説明、アプリの機能、制限事項、プロンプトの例、その他のデータも指定する必要があります。
そして、MCP サーバーを構成するときに、エンドポイントを指定する必要があります。
このドメインがお客様のものであることを確認する必要があります。また、同期ツールに認証情報を構成することもできます。
Google Console は MCP スキーマのスナップショットを取得するため、スキーマに変更を加えるたびに、戻って再デプロイする必要があります。
その後、アプリの公開設定を構成します。
アプリを利用可能にするリージョン、言語、サーフェス、その他の個別のツール構成を選択できます。
そこから [変更を push] を押して、Gemini のステージ レビューに送信できます。
また、[テスターを管理] でテスト アカウントを追加することもできます。
そして、ウェブ、モバイル、または Gemini や検索など、事前に選択したサーフェスで、このテストアカウントを使用してすぐにライブテストを行い、最終プレビューに送信します。
アプリの準備が整ったら、[送信] ボタンを押すだけで、世界中のユーザーまたは選択した地域のユーザーに製品版を公開できます。
これで完了です
リモート MCP サーバーまたは Android MCP を介してアプリの機能を公開する場合でも、Connected Apps Platform を使用してどのようなアプリを構築できるか、楽しみにしています。
Google は、この素晴らしい統合の構築をサポートいたします。
このドキュメントと、このバーコードを使用して入手できるサンプルに沿って操作してください。
本日はご参加いただき誠にありがとうございました。
ぜひコーディングにお役立てください。
from mcp.server.fastmcp import FastMCP
mcp = FastMCP(
name="ADS-MCP",
instructions=(
"A Model Context Protocol server providing event "
"overview, schedules, sessions, speakers, and "
"sandbox demos for the Android Developer Summit "
),
)@mcp.tool(
title="List Sessions",
annotations=ToolAnnotations(
readOnlyHint=True,
destructiveHint=False,
),
meta={ … },
)
def list_sessions( … )
…def list_sessions(
track: Optional[str] = None,
location: Optional[str] = None,
) -> List[Dict[str, Any]]:
"""Lists all sessions, optionally filtered by track
(e.g. 'Tools and performance', 'Apps Foundation',
'AI experiences', 'Android XR') or location
(e.g. 'MTV', 'Mountain View', 'London', 'LON').
"""
…@mcp.tool(
…
meta={
"ui": {
"resourceUri": "ui://ads-mcp/summit-app",
},
…
},
)
def list_sessions(…)
…@mcp.resource(
"ui://ads-mcp/summit-app",
name="summit-app",
mime_type="text/html",
)
def get_summit_ui() -> ResourceResult:
"""Renders the interactive ADS 2026 dashboard."""
return ResourceResult([
ResourceContent(
_build_summit_ui_html(),
mime_type="text/html",
)
])./venv/bin/python server.py
npx @modelcontextprotocol/inspectorgcloud run deploy ads-mcp-server