AppFunctions の概要

AppFunctions は、Android MCP の統合を簡素化する Jetpack ライブラリが付属した Android プラットフォーム API です。これにより、アプリはオンデバイス MCP サーバーのように動作し、Google Gemini などのエージェントやアシスタントとともに、プロアクティブな機能で使用されるツールとして機能する関数を提供できます。2026 年 5 月現在、AppFunctions と Gemini の統合は、Trusted Tester による限定公開プレビュー版です。AppFunctions とデベロッパー ツールを使用するためのアプリの準備を今すぐ開始できます。

これらの AppFunction を定義することで、アプリは Android OS に組み込まれたレジストリにサービス、データ、アクションを提供できるようになり、ユーザーはエージェントやシステムレベルの操作を通じてタスクを完了できるようになります。

AppFunctions は、Model Context Protocol(MCP)内のツールのモバイル版として機能します。MCP は従来、エージェントがサーバーサイド ツールに接続する方法を標準化していましたが、AppFunctions は Android アプリに同じメカニズムを提供します。これにより、アプリの機能をオーケストレーション可能な「ツール」として公開し、承認されたアプリ(呼び出し元)がユーザーの意図を達成するために検出して実行できるようにします。呼び出し元は、AppFunction を検出して実行するために EXECUTE_APP_FUNCTIONS 権限を持っている必要があります。呼び出し元には、エージェント、アプリ、Gemini などの AI アシスタントが含まれます。

AppFunctions は、Android 16 以降を搭載したデバイスで利用できます。

サンプル ユースケース

AppFunctions は、タスクを自動化し、ユーザー インタラクションを効率化するための強力なメカニズムを提供します。アプリの機能を公開することで、ユーザーは自然言語を使用して複雑な目標を達成できるようになります。多くの場合、UI を使用した段階的な手動ナビゲーションは不要になります。

次のシナリオは、AppFunctions を使用してさまざまなアプリのカテゴリでエクスペリエンスを促進する方法を示しています。

  • タスク管理と生産性

    • ユーザーのリクエスト: 「今日、午後 5 時に職場で荷物を受け取るようリマインドして」
    • AppFunction アクション: 呼び出し元は、関連するタスク管理アプリを特定し、タスクを作成する関数を呼び出します。この関数は、ユーザーのプロンプトに基づいてタイトル、時間、場所のフィールドを自動的に入力します。

    /**
     * Create a new task or reminder with a title, due time, and location.
     *
     * @param title The descriptive title of the task (e.g., "Pick up my package").
     * @param dueDateTime The specific date and time when the task should be completed.
     * @param location The physical location associated with the task (e.g., "Work").
     * @return The created Task
     */
    @AppFunctionDeclaration(isDescribedByKDoc = true)
    suspend fun createTask(
        title: String,
        dueDateTime: LocalDateTime? = null,
        location: String? = null,
    ): Task = TODO()

  • メディアとエンターテイメント

    • ユーザー リクエスト: 「今年のトップ ジャズ アルバムを含む新しいプレイリストを作成して」。
    • AppFunction アクション: 呼び出し元が音楽アプリ内でプレイリスト作成関数を実行し、「2026 年のトップ ジャズ アルバム」などのコンテキストをクエリとして渡して、プレイリストをすぐに生成します。

    /**
     * Create a new music playlist based on a natural language query.
     *
     * @param query The description used to generate the playlist (e.g., "top jazz albums from 2026").
     * @return The final created playlist based on songs.
     */
    @AppFunctionDeclaration(isDescribedByKDoc = true)
    suspend fun createPlaylistFromQuery(
        query: String,
    ): Playlist = TODO()

  • クロスアプリ ワークフロー

    • ユーザー リクエスト: 「Lisa のメールから麺のレシピを見つけて、材料をショッピング リストに追加して」。
    • AppFunction アクション: このリクエストでは、複数のアプリの関数が使用されます。まず、呼び出し元はメールアプリの検索機能を使用してコンテンツを取得します。次に、関連する材料を抽出し、ショッピング リスト アプリの関数を呼び出して、ユーザーのリストにデータを入力します。

    /**
     * Search for emails matching a query or sender name to retrieve content like recipes.
     *
     * @param query The search term or contact name (e.g., "Lisa noodle recipe").
     * @return A list of matching email summaries containing the requested information.
     */
    @AppFunctionDeclaration(isDescribedByKDoc = true)
    suspend fun searchEmails(
        query: String,
    ): List<EmailSummary> = TODO()
    
    /**
     * Add a list of items or ingredients to the user's active shopping list.
     *
     * @param items The names of the ingredients or products to add to the list.
     * @return The final shopping list with new items added
     */
    @AppFunctionDeclaration(isDescribedByKDoc = true)
    suspend fun addItemsToShoppingList(
        items: List<String>,
    ): ShoppingList = TODO()

  • カレンダーとスケジュール設定

    • ユーザー リクエスト: 「来週の月曜日の午後 6 時に、お母さんの誕生日パーティーをカレンダーに追加して」。
    • AppFunction アクション: 承認されたエージェント アプリがカレンダー アプリの「予定を作成」関数を呼び出し、「次の月曜日」や「午後 6 時」などの関連するコンテキストを解析して、ユーザーが手動でカレンダーを開くことなくエントリを作成します。

    /**
     * Schedule a new event on the user's primary calendar.
     *
     * @param title The name of the calendar event (e.g., "Mom's birthday party").
     * @param startDateTime The specific date and time the event is scheduled to begin.
     * @return The created Event object.
     */
    @AppFunctionDeclaration(isDescribedByKDoc = true)
    suspend fun createCalendarEvent(
        title: String,
        startDateTime: LocalDateTime,
    ): Event = TODO()

AppFunctions の仕組み

次の図は、アプリが AppFunctions をエージェントと共有し、その後実行される一般的なフローを示しています。エージェントは、ユーザー リクエストを処理する際に、サーバーサイドのリモート MCP ツールとローカルの AppFunction の両方を考慮する可能性があります。ローカル AppFunction を使用する詳細なフローは次のとおりです。

  • AppFunction 宣言: Android アプリは、AppFunctions を使用して「メモを作成」や「メッセージを送信」などの機能を利用できるように構築されています。
  • スキーマの生成: AppFunctions Jetpack ライブラリは、アプリで宣言されたすべての AppFunction を一覧表示する XML スキーマ ファイルを生成します。Android OS は、このファイルを使用して、利用可能な AppFunction のインデックスを作成します。
  • メタデータの取得: エージェントは、クエリを実行して AppFunction メタデータを取得できます。関数固有の KDoc に加えて、デベロッパーはアプリ メタデータでアプリレベルの運用パターンと制約を定義して、複数のツールにわたるエージェントのオーケストレーションをガイドできます。
  • AppFunction の選択と実行: ユーザー プロンプトに基づいて、エージェントは適切なパラメータを使用して適切な AppFunction を選択して実行します。
アプリの公開からエージェントの実行までの一般的な AppFunctions フロー。
図 1: AppFunctions が公開され、その後エージェントによって実行される一般的なフロー。

AppFunctions Jetpack ライブラリを使用すると、アプリの機能を簡単に公開できます。アノテーション プロセッサを使用すると、エージェントで使用できるようにする関数にアノテーションを付けることができます。呼び出し元は、AppFunctionManager を使用して、これらのインデックスに登録された関数を検出して呼び出すことができます。

関数を呼び出す前に、呼び出し元は AppFunctionManager のインスタンスの取得を試みて、デバイスが AppFunctions 機能をサポートしていることを確認する必要があります。サポートされると、呼び出し元は isAppFunctionEnabled(packageName,functionId) を使用して、ターゲット アプリ内で特定の機能が有効になっているかどうかを確認できます。他のパッケージの関数のステータスをクエリするには、android.permission.EXECUTE_APP_FUNCTIONS 権限が必要です。

アプリで AppFunction 機能がサポートされているかどうかを確認する必要はありません。これは Jetpack ライブラリ内で自動的に処理されます。たとえば、AppFunctionManager は、機能がサポートされているかどうかを確認できます。

メモの作成、編集、一覧表示機能を備えたメモアプリの AppFunctions の例を次に示します。

@RequiresApi(36)
@AndroidEntryPoint
@AppFunctionServiceEntryPoint(
    serviceName = "TaskAppFunctionService",
    appFunctionXmlFileName = "task_app_function_service",
)
abstract class BaseTaskAppFunctionService : AppFunctionService() {
    @Inject internal lateinit var taskRepository: TaskRepository

    /**
     * Creates a task based on [createTaskParams].
     *
     * @param createTaskParams The parameter to describe how to create the task.
     */
    @AppFunctionDeclaration(isDescribedByKDoc = true)
    suspend fun createTask(
        createTaskParams: CreateTaskParams,
    ): Task = withContext(Dispatchers.IO) {
        // Developers can use predefined exceptions to let the agent know
        // why it failed.
        if (createTaskParams.title == null && createTaskParams.content == null) {
            throw AppFunctionInvalidArgumentException("Title or content should be non-null")
        }

        val id = taskRepository.createTask(
            createTaskParams.title,
            createTaskParams.content
        )

        return@withContext taskRepository
            .getTask(id)
            ?.toTask()
            ?: throw AppFunctionElementNotFoundException("Task not found for ID = $id")
    }

    // Maps internal TaskEntity
    private fun TaskEntity.toTask() = Task(id = id, title = title, content = description)
}

/** The parameter to create the task. */
@AppFunctionSerializable(isDescribedByKDoc = true)
data class CreateTaskParams(
    /** The title of the task. */
    val title: String?,
    /** The content of the task. */
    val content: String?,
)

/** The user-created task. */
@AppFunctionSerializable(isDescribedByKDoc = true)
data class Task(
    /** The ID of the task. */
    val id: String,
    /** The title of the task. */
    val title: String,
    /** The content of the task. */
    val content: String,
)

サンプル、スキル、テストツール

AppFunctions のスキルアップに役立つ以下のリソースをご用意しています。

  • AppFunctions のサンプルを調べて、デバイスですべてがどのように動作するかを確認します。
  • AppFunctions エージェント スキルを使用すると、次の 4 つのステップのライフサイクル全体で開発を加速できます。
    • 検出: コードベースを分析して、AI オーケストレーションに価値の高い機能を特定して推奨します。
    • 実装と構成: Kotlin 実装を生成し、システム メタデータとビルド依存関係を構成します。
    • KDoc の改良: AI エージェントと Android MCP 向けに関数とプロパティのドキュメントを最適化します。
    • テストとデバッグ: ローカル評価とデバイス上のデバッグ用の ADB コマンドを提供します。
  • コマンドラインでのテストと検証には、adb shell cmd app_function ... などの ADB コマンドを使用します。これは、関数の登録をテストし、メタデータの説明を検査して、デバイス上で関数を実行するための、直接的で軽量な方法です。

よくある質問(FAQ)

次のセクションでは、AppFunctions に関するよくある質問を紹介します。

私はアプリ デベロッパーです。AppFunctions は今すぐ実装できますか?

はい。前のセクションで説明したガイダンスに沿って、アプリ内で AppFunctions を実装してテストできます。

AppFunctions と MCP の違いは何ですか?

どちらも AI エージェントがツールをオーケストレートできるようにしますが、アーキテクチャ、レイテンシ、必要なデベロッパーの労力に大きな違いがあります。AppFunction は、Android 専用の組み込み OS レベルのフックで、ローカルで実行されます。一方、標準の MCP サーバーは、クラウド実行とネットワークの往復に依存する、プラットフォームに依存しないソリューションです。

つまり、AppFunctions を使用して開発すると、既存のアプリの状態をデバイス上で直接使用でき、Android アプリの外部でサービスを維持する必要がなくなります。

アプリに AppFunctions を実装しました。システム エージェントがアクセスできないのはなぜですか?

AppFunctions は試験運用版の機能です。この試験運用フェーズでは、全体的なエクスペリエンスの品質を慎重に評価するため、パイプライン全体にアクセスできるのは、限られた数のアプリとシステム エージェントのみです。

AppFunctions の一般提供に向けてアプリを準備するにはどうすればよいですか?

アプリのどの機能をエージェント自動化に公開するかを検討します。アプリに AppFunctions を実装できます。実装するには、このページの前半のセクションの手順に沿って、アプリのパッケージ名で adb shell cmd app_function list-app-functions --package を呼び出して、デバイスに登録されていることを確認します。

エンドツーエンドのエージェント型デベロッパー エクスペリエンスの早期アクセスを利用できますか?

Google は、Android で AppFunctions を本番環境にリリースするために必要なエンドツーエンドのデベロッパー エクスペリエンスをテストする、一部のアプリをオンボーディングするための早期アクセス プログラム(EAP)を実施しています。AppFunctions の統合にご興味がある場合は、こちらの EAP 登録フォームからご登録ください。関心登録を行っても、完全な統合へのアクセス権が自動的に付与されるわけではありません。アプリが EAP に選ばれた場合、または AppFunctions が一般公開された場合は、メールでお知らせします。

AppFunctions に関するフィードバックを提供するにはどうすればよいですか?

API に関するフィードバックを送信するには、問題を報告し、早期アクセス プログラム フォームで関心を登録してください。