AppFunctions 개요

AppFunctions는 Android MCP 통합을 간소화하는 Jetpack 라이브러리가 함께 제공되는 Android 플랫폼 API입니다. 이를 통해 앱이 온디바이스 MCP 서버처럼 동작하여 Google Gemini와 같은 에이전트 및 어시스턴트와 함께 사전 대응형 기능에서 사용할 도구 역할을 하는 기능을 제공할 수 있습니다. 2026년 5월 현재 Gemini와의 AppFunctions 통합은 신뢰할 수 있는 테스터와 함께 비공개 프리뷰로 제공됩니다. 지금부터 앱을 준비하여 AppFunctions 및 개발 도구를 사용할 수 있습니다.

이러한 AppFunction을 정의하면 앱이 Android OS에 내장된 레지스트리에 서비스, 데이터, 작업을 제공할 수 있으므로 사용자가 에이전트와 시스템 수준 상호작용을 통해 작업을 완료할 수 있습니다.

AppFunctions는 모델 컨텍스트 프로토콜 (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 context The execution context provided by the system.
    *   @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
    */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun createTask(
        context: AppFunctionContext,
        title: String,
        dueDateTime: LocalDateTime? = null,
        location: String? = null
    ) : Task
    
  • 미디어 및 엔터테인먼트

    • 사용자 요청: "올해의 인기 재즈 앨범으로 새 재생목록을 만들어 줘".
    • AppFunction 작업: 호출자가 음악 앱 내에서 재생목록 생성 함수를 실행하여 '2026년 인기 재즈 앨범'과 같은 컨텍스트를 쿼리로 전달하여 재생목록을 즉시 생성합니다.
    /**
    *   Create a new music playlist based on a natural language query.
    *
    *   @param context The execution context provided by the system.
    *   @param query The description used to generate the playlist (e.g., "top jazz albums from 2026").
    *   @return The final created playlist based on songs.
    */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun createPlaylistFromQuery(
        context: AppFunctionContext,
        query: String
    ): Playlist
    
  • 앱 간 워크플로

    • 사용자 요청: "Lisa의 이메일에서 국수 레시피를 찾아 재료를 내 쇼핑 목록에 추가해 줘".
    • AppFunction 작업: 이 요청은 여러 앱의 함수를 사용합니다. 먼저 호출자가 이메일 앱의 검색 기능을 사용하여 콘텐츠를 가져옵니다. 그런 다음 관련 재료를 추출하고 쇼핑 목록 앱의 기능을 호출하여 사용자의 목록을 채웁니다.
    /**
    *   Search for emails matching a query or sender name to retrieve content like recipes.
    *
    *   @param context The execution context provided by the system.
    *   @param query The search term or contact name (e.g., "Lisa noodle recipe").
    *   @return A list of matching email summaries containing the requested information.
    */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun searchEmails(
        context: AppFunctionContext,
        query: String
    ): List<EmailSummary>
    
    /**
    *   Add a list of items or ingredients to the user's active shopping list.
    *
    *   @param context The execution context provided by the system.
    *   @param items The names of the ingredients or products to add to the list.
    *   @return The final shopping list with new items added
    */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun addItemsToShoppingList(
        context: AppFunctionContext,
        items: List<String>
    ): ShoppingList
    
  • 캘린더 및 일정

    • 사용자 요청: "다음 주 월요일 오후 6시에 엄마 생일 파티를 내 캘린더에 추가해 줘".
    • AppFunction 작업: 승인된 에이전트 앱이 캘린더 앱의 '일정 만들기' 함수를 호출하여 '다음 월요일', '오후 6시'와 같은 관련 컨텍스트를 파싱하여 사용자가 캘린더를 수동으로 열지 않아도 항목을 만듭니다.
    /**
    *   Schedule a new event on the user's primary calendar.
    *
    *   @param context The execution context provided by the system.
    *   @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.
    */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun createCalendarEvent(
        context: AppFunctionContext,
        title: String,
        startDateTime: LocalDateTime
    ): Event
    

AppFunctions 작동 방식

다음 다이어그램은 앱이 AppFunctions를 에이전트와 공유하고 이후에 실행하는 일반적인 흐름을 보여줍니다. 에이전트는 사용자 요청을 처리할 때 서버 측 원격 MCP 도구와 로컬 AppFunctions를 모두 고려할 가능성이 높습니다. 로컬 AppFunctions 사용의 자세한 흐름은 다음과 같습니다.

  • AppFunction 선언: Android 앱은 AppFunctions를 사용하여 '메모 작성' 또는 '메시지 보내기'와 같은 기능을 사용할 수 있도록 빌드됩니다.
  • 스키마 생성: AppFunctions Jetpack 라이브러리는 앱에 선언된 모든 AppFunctions를 나열하는 XML 스키마 파일을 생성합니다. Android OS는 이 파일을 사용하여 사용 가능한 AppFunctions를 색인합니다.
  • 메타데이터 검색: 에이전트는 쿼리를 통해 AppFunction 메타데이터를 검색할 수 있습니다.
  • AppFunction 선택 및 실행: 에이전트는 사용자 프롬프트에 따라 적절한 매개변수를 사용하여 적절한 AppFunction을 선택하고 실행합니다.
앱 노출부터 에이전트 실행까지의 일반적인 AppFunctions 흐름
그림 1: AppFunction이 노출되고 에이전트가 후속 실행하는 일반적인 흐름

AppFunctions Jetpack 라이브러리를 사용하면 앱의 기능을 쉽게 노출할 수 있습니다. 주석 프로세서를 사용하면 에이전트에서 사용할 수 있도록 하려는 함수에 주석을 추가합니다. 그러면 호출자가 AppFunctionManager를 사용하여 이러한 색인 처리된 함수를 검색하고 호출할 수 있습니다.

함수를 호출하기 전에 호출자는 AppFunctionManager 인스턴스를 검색하여 기기가 AppFunctions 기능을 지원하는지 확인해야 합니다. 지원되면 호출자는 isAppFunctionEnabled(packageName,functionId)을 사용하여 타겟 앱 내에서 특정 함수가 사용 설정되어 있는지 확인할 수 있습니다. 다른 패키지의 함수 상태를 쿼리하려면 android.permission.EXECUTE_APP_FUNCTIONSpermission가 필요합니다.

앱에서 AppFunction 기능이 지원되는지 확인할 필요는 없습니다. Jetpack 라이브러리 내에서 자동으로 처리됩니다. 예를 들어 AppFunctionManager는 기능이 지원되는지 확인할 수 있습니다.

다음은 메모를 만들고, 수정하고, 나열하는 기능을 갖춘 메모 작성 앱의 AppFunctions의 예입니다.

/**
 *   A note app's [AppFunction]s.
 */
class NoteFunctions(
    private val noteRepository: NoteRepository
) {
    /**
     *   Lists all available notes.
     *
     *   @param appFunctionContext The context in which the AppFunction is executed.
     */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun listNotes(appFunctionContext: AppFunctionContext): List<Note>? {
        return noteRepository.appNotes.ifEmpty { null }?.toList()
    }

    /**
     *   Adds a new note to the app.
     *
     *   @param appFunctionContext The context in which the AppFunction is executed.
     *   @param title The title of the note.
     *   @param content The note's content.
     */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun createNote(
        appFunctionContext: AppFunctionContext,
        title: String,
        content: String
    ): Note {
        return noteRepository.createNote(title, content)
    }

    /**
     *   Edits a single note.
     *
     *   @param appFunctionContext The context in which the AppFunction is executed.
     *   @param noteId The target note's ID.
     *   @param title The note's title if it should be updated.
     *   @param content The new content if it should be updated.
     */
    @AppFunction(isDescribedByKDoc = true)
    suspend fun editNote(
        appFunctionContext: AppFunctionContext,
        noteId: Int,
        title: String?,
        content: String?,
    ): Note? {
        return noteRepository.updateNote(noteId, title, content)
    }
}

/**
 *   A note.
 */
@AppFunctionSerializable(isDescribedByKDoc = true)
data class Note(
    /** The note's identifier */
    val id: Int,
    /** The note's title */
    val title: String,
    /** The note's content */
    val content: String
)

샘플, 기능, 테스트 에이전트

AppFunctions의 기술을 향상할 수 있도록 다음과 같은 리소스를 제공합니다.

  • AppFunctions 샘플을 살펴보고 기기에서 모든 것이 어떻게 작동하는지 확인하고 알아봅니다.
  • AppFunctions 스킬은 AppFunctions로 구현할 수 있는 앱의 기능을 검색하고 추천합니다. 또한 기존 AppFunction을 구현하고 개선할 수도 있습니다.
  • 엔드 투 엔드 테스트에는 샘플 에이전트 앱을 사용하세요.

자주 묻는 질문(FAQ)

다음 섹션에서는 AppFunctions에 관해 자주 묻는 질문(FAQ)을 다룹니다.

앱 개발자입니다. 오늘 AppFunctions를 구현할 수 있나요?

예, 앞 섹션에 자세히 설명된 안내에 따라 앱 내에서 AppFunctions를 구현하고 테스트할 수 있습니다.

AppFunctions와 MCP의 차이점은 무엇인가요?

두 제품 모두 AI 에이전트가 도구를 오케스트레이션할 수 있지만 아키텍처, 지연 시간, 필요한 개발자 노력에 상당한 차이가 있습니다. AppFunctions는 로컬에서 실행되는 Android 전용 내장 OS 수준 후크입니다. 반면 표준 MCP 서버는 클라우드 실행 및 네트워크 왕복에 의존하는 플랫폼에 구애받지 않는 솔루션입니다.

간단히 말해 AppFunctions로 개발하면 기기에서 기존 앱 상태를 직접 사용할 수 있으며 Android 앱 외부에서 서비스를 유지할 필요가 없습니다.

앱에 AppFunctions를 구현했습니다. 시스템 에이전트가 이에 액세스할 수 없는 이유는 무엇인가요?

AppFunctions는 실험용 기능입니다. 이 실험 단계에서 전반적인 환경의 품질을 신중하게 평가하기 위해 제한된 수의 앱과 시스템 에이전트만 전체 파이프라인에 액세스할 수 있습니다.

AppFunctions의 정식 버전을 위해 앱을 준비하려면 어떻게 해야 하나요?

에이전트 자동화에 노출할 앱 기능을 고려합니다. 앱에서 AppFunctions를 구현할 수 있습니다. 이렇게 하려면 이 페이지의 이전 섹션에 나온 단계를 따르고 adb shell cmd app_function list-app-functions를 호출하여 기기에 등록되었는지 확인하세요.

엔드 투 엔드 에이전트형 개발자 환경을 사전 체험할 수 있나요?

Android에서 AppFunctions를 프로덕션에 출시하는 데 필요한 엔드 투 엔드 개발자 환경을 테스트하기 위해 일부 앱을 온보딩하는 사전 체험 프로그램 (EAP)을 진행하고 있습니다. 이 EAP 등록 양식을 통해 AppFunctions 통합에 관심을 등록할 수 있습니다. 관심을 등록해도 전체 통합에 대한 액세스 권한이 자동으로 부여되지는 않습니다. 앱이 EAP에 선정되면 이메일을 보내드리며, AppFunctions가 공개적으로 제공될 때도 알려 드리겠습니다.

AppFunctions에 대한 의견을 제공하려면 어떻게 해야 하나요?

문제를 신고하고 사전 체험 프로그램 양식에 참여 의사를 등록하여 API에 대한 의견을 제공할 수 있습니다.