智能应用

借助 Connected Apps Platform,将应用扩展到 Gemini 和 Google 搜索

扬声器

  • Kateryna Semenova

    资深开发者关系工程师

  • Mai Lowe

    组合产品经理

关于

演讲简介

借助全新的 Connected Apps Platform,您可以将应用的服务直接集成到 Gemini、Google 搜索中的 AI 模式以及 Android 智能系统中。本课程提供了实用的入门指南。我们将通过代码示例和实际案例研究,带您了解整个开发生命周期:构建、测试和发布您的首个关联应用,让用户在 AI 赋能的工作流程中轻松使用。

学完本课程后,您将能够:

  • 将您的服务与 Connected Apps Platform 集成。
  • 在不同的 AI 平台上测试您的集成。
  • 将应用的功能发布到用户的 AI 工作流中。

摘要

  • Connected Apps Platform 提供了一个单一入口点,让您可以使用声明式架构在 Gemini 和 Google 搜索中发布应用功能。该计划将分阶段开放,首先面向美国开发者推出预览版。
  • 集成通过远程服务器或通过 AppFunctions Jetpack 库在本地设备端服务器上使用 Model Context Protocol (MCP) 标准。远程服务器还可以返回在 iframe 中呈现的自定义界面。
  • 确认机制会根据风险程度进行调整,以保护用户信任。开发者可以将工具标记为只读或使用 destructiveHint,以便 Gemini 在执行修改或删除数据的操作时请求明确确认。
  • 借助 Gemini 开发者模式,您可以检查针对公共端点的工具调用和延迟。目前,美国开发者已可使用该功能。
  • Google 一站式管理中心会为获批的开发者处理正式版发布事宜。您可以配置端点、管理所选平台上的测试人员,以及提交应用以供审核。

资源

Gemini Notebook

主题

  • gemini
  • 搜索
  • connected-apps
  • mcp
  • appfunctions
  • android

转写文稿

简介

  • 大家好!

  • 我是 Mai,是 Gemini 关联应用平台的产品主管。

  • 稍后,我们的 DevRel 工程师 Kate 也会为大家带来精彩分享。

  • 她要上来了。

  • 今天,我们非常高兴能与大家探讨如何将应用扩展到 Google 最受欢迎的一些智能体产品中,包括 Gemini 和 Google 搜索。

  • 我们将向您介绍关联的应用如何为用户提供帮助和神奇体验,以及背后的原因。

  • 更棒的是,我们还会向您展示如何构建一个这样的应用。

  • 下面我们来深入探讨

  • 我知道,我们很多人都看到了应用生态系统中正在发生一些真正重大的变化。

  • 用户使用设备、搜索答案和完成任务的方式不仅在不断演变,

  • 它已经发生了根本性的转变。

  • 人们不再打开浏览器并四处点击。

  • 而是直接与 Gemini 等助理对话。

  • 他们会向 Gemini 提出复杂的问题,在 Google 搜索中以多模态方式搜索答案。

  • 他们希望 Android 设备不仅能理解他们说的话,还能知道他们想做什么。

  • 思考一下您在任何一天都可以执行的一些工作流。

  • 假设您让 Gemini 帮您构思一些方案,以便在特定时间与朋友在特定地点度过一个愉快的周末。

  • 现在的模型可以在几秒钟内处理该计划。

  • 太棒了。

  • 井然有序。

  • 然后呢?

  • 结束。

  • 用户遇到了障碍,只能停留在那里,只有一个计划,没有任何确认。

  • 模型知道该怎么做,但没有手来执行。

  • 因此,你必须将与 Gemini 对话中的信息复制并粘贴到其他应用中。

  • 有时,如果您使用的是移动设备,操作会变得非常繁琐。

  • 然后,您必须记住所有内容,并在之后输入。

  • 这种认知上的跳跃和阻碍会完全破坏魔法。

  • 这对大家来说意味着什么?

  • 这意味着,您有高意向的用户需求,但这些需求被困在聊天气泡中,无法转化为应用内丰富且富有吸引力的用户互动。

  • 这就是为什么关联的应用具有颠覆性,因为它们能帮助我们精准触达用户。

  • 目前,他们会花大量时间与 Gemini 等助理对话。

  • 当用户表达出采取行动的真实意图时,这就是他们历程中至关重要的时刻。

  • 他们不是在被动浏览。

  • 他们有明确的目标,想要立即完成。

  • 通过实现应用与这些生成模型的集成,Gemini 等助理不仅能回答问题,还能完成各种任务。

  • 当用户要求提供按优先级排序的待办事项清单、想要为即将开始的行程租车,或者想要购买刚找到的食谱所需的食材时,您的应用不会以静态链接的形式出现在页面底部。

  • 您可以帮助实现这一神奇体验,并当场执行该操作。

  • 我想特别强调一点,因为我知道每位开发者和产品负责人都在思考这个问题:关联的应用并不是要将您的应用抽象化。

  • 您的品牌、您的业务逻辑、您的身份验证关系以及您的自定义界面体验,这些都属于您。

  • 关联的应用是指将您的服务集成到智能体 API 接口中,以便 Google 的智能体产品能够顺畅地将高意向用户直接引导至您的产品。

Connected Apps Platform

  • 因此,今天,就在此时此刻,我非常激动地正式宣布推出我们的 Connected Apps Platform。

  • 过去,要想在各种 Google 产品中触达用户,需要针对每种产品进行不同的集成。

  • 如果您想要一个 Android 应用有关的操作或快捷方式,则必须构建一个。

  • 搜索集成,另一个。

  • 但我们希望尽可能为您提供轻松、优质的体验。

  • 因此,我们对新手入门流程进行了标准化,为您提供一个统一的入口点,让您能够跨多个 Google 智能体产品发布应用。

  • 现在,您只需使用标准声明式架构构建一次应用功能,即可在 Gemini 和 Google 搜索这两款关键产品中同时启用该功能。

  • 更多产品即将推出,敬请期待。

  • 下面,我们来谈谈这种覆盖面以及它对您的意义。

  • 您不应该仅仅为了在 Android、Gemini 和 Google 搜索中触达 Google 用户,就必须构建多个自定义插件、管理四个不同的开发者控制台,以及维护各种经过身份验证的握手。

  • 借助我们的统一平台,您只需构建和注册一次工具定义。

  • 您只需选择所需的 Google 产品,然后点击新版 Google 一站式管理中心内的启动按钮即可。

  • 发布后,任何人在使用 Gemini 或 Google 搜索时都可以发现你的功能。

  • 无论用户是在笔记本电脑上向 Gemini 输入内容、在网页版 Google 搜索中提出一系列查询,还是在 Android 设备上使用 Google 助理功能,他们都可以在最需要的时候、在他们所在的位置选择使用您的应用。

  • 因此,我们将分阶段开放我们的平台,首先是预览版。

  • 我向大家保证,整个团队正在全力以赴,争取尽快让尽可能多的用户用上所有功能。

  • 在此预览阶段,我们仅向美国开发者开放该平台。

  • 您可以通过表单注册来获取访问权限,该表单可在我们的开发者指南 (developers.google.com/connected-apps) 中找到。如果您是 Play 开发者,也可以在 Google Play 管理中心的首页上找到该表单。

  • 那么,下一个问题是,构建一个这样的模型到底有多难?

  • 如果您有 REST API 或 Android intent,那么您已经有了一个很好的起点。

  • 我们基于开发者熟悉的概念进行构建。

  • 我们的平台通过基于服务器的 MCP 和 Android 原生 MCP 与 Model Context Protocol(MCP 标准)集成。

  • 为了让您获得更出色的体验,我们今天在 Gemini 中推出了一项全新功能,名为“开发者模式”,美国的所有用户现在都可以使用。

  • 这样,您就可以在 Gemini 中试用您的应用,并获得有关错误状态、延迟时间和模型回答的实时反馈。

  • 很快,您将能够生成自己的评估集,获得质量指标评分卡和基准。

  • 一定会非常精彩。

  • 无论您对该平台拥有何种访问权限,都可以随时在开发者模式下试用您的应用。

  • 我相信您一定迫不及待地想了解更多细节,Kate 很快就会上台,在几分钟内为您详细介绍。

信任、隐私保护和用户控制

  • 首先,我需要和大家聊聊一个越来越重要的话题:用户信任。

  • 每当我们谈到智能体代表某人采取行动时,第一个问题往往是:“我们如何让用户保持控制权?”

  • 下面,我们通过几个简单的概念来了解一下。

  • 首先,我们的确认机制会根据风险级别进行调整。

  • 我们不会在每次工具调用前都显示弹出式窗口。

  • 查找信息、查看菜单、跟踪订单,这些操作都应该顺畅无阻。

  • 但如果操作会产生实际后果,例如修改共享内容、完成预订或删除用户无法轻易找回的内容,模型就会在执行操作前明确询问用户是否同意。

  • 其次,敏感数据会显示,而不是隐藏。

  • 因此,我们的产品会检查哪些个人信息可能会与您的应用分享。

  • 如果检测到敏感信息,我们会向用户确切显示正在分享的内容,以便用户在当下决定是否继续使用您的应用。

  • 第三,我们在询问时会具体说明。

  • 我们不会发出模糊的“您确定吗?”提示,而是会明确指出是哪个应用以及实际发送或更改的内容。

  • 这样,确认对话框就能帮助用户真正做出决定,而不仅仅是他们随意点击的内容。

  • 而且,由于没有人希望在旅程中频繁收到确认提示,用户将能够更好地控制系统询问的频率。

  • 例如,在 Gemini 应用中,用户可以针对每个应用甚至每项操作选择是否始终允许执行该操作。

  • 对您而言,这意味着您需要如实标记您的工具。

  • 标记哪些是只读数据、哪些是更改数据、哪些是删除数据。

  • 这些信号有助于我们的产品决定何时让用户参与进来。

  • 稍后,Kate 将向您展示具体的操作方法。

合作伙伴体验和生产路径

  • 好了,让我们回到刚才讨论的周末行程,即规划部分。

  • 还记得当时有多难、多零散吗?

  • 你为一群朋友制定了很棒的计划,但随后遇到了障碍,你不得不复制粘贴内容,在应用之间来回切换。

  • Viator 和 Ticketmaster 是我们早期合作的两个优秀伙伴,他们看到了在用户所在位置满足其需求的真正机遇。

  • 他们决定与我们合作,打破这道壁垒,让这些高意向用户能够直接从 Gemini 内部进入他们的应用。

  • 得益于这些合作伙伴打造的关联应用,整个旅程变得更加顺畅、无缝。

  • 我们来看一下。

  • 用户关联了这些应用,并让 Gemini 在 Viator 上查找适合 4 人参加的日间美食之旅,以及在 Ticketmaster 上查找一些音乐会门票。

  • Gemini 能够识别该功能,并直接调用 Viator 和 Ticketmaster 工具,同时自动填充正确的团队人数、日期和偏好设置。

  • 无需离开对话,两个应用都能实时获取可用性信息,并在聊天界面中为用户呈现丰富的互动体验。

  • Viator 和 Ticketmaster 等合作伙伴让用户在发现需求时就能立即采取行动,探索美食之旅的停靠点、挑选演唱会座位,从发现到行动无缝衔接,避免了用户陷入死胡同和在多个标签页之间来回切换的困扰。

  • 所以,静态应用启动器的时代即将过去,取而代之的是智能、主动、代理化的体验。

  • 您的用户已经在使用 Google 搜索和 Gemini 寻求帮助。

  • 我们可以携手帮助他们超越简单的问答,提供真正强大且神奇的体验。

  • 我的分享到此结束。

  • 现在,我将把时间交给 Kate,她将详细介绍如何构建关联的应用。

  • 请上台。

  • 大家好!

  • 我是 Kate,一名开发技术推广工程师,负责帮助像您这样的开发者与 Connected Apps Platform 集成。

  • 因此,我将引导您完成关联应用的测试、构建和部署。

  • 正如 Mai 之前提到的,与 Connected Apps Platform 集成主要有两种方法:一种是通过远程 MCP 服务器,使用 MCP 协议;另一种是通过 Android MCP,使用 AppFunctions 库在设备上构建远程 MCP 服务器。

  • 如果您想在 Android、iOS 和 Web 等平台上进行集成,我们建议您使用远程 MCP 服务器。

  • 此外,还有一些开发者向我们反馈,当应用数据仅在设备上可用时,他们有时更倾向于在本地执行。

  • 对于此用例,我们建议使用 AppFunctions Jetpack 库来使用 Android MCP。

  • 此外,请观看 Dan 和 Sarah 的专题演讲,深入了解如何通过 AppFunctions 和 Android MCP 与 Connected Apps Platform 集成。

远程 MCP 服务器集成和演示

  • 现在,我们来了解一下如何构建远程 MCP 服务器。

  • 为了向您展示实际运作方式,我们构建了官方 AndroidDevSummit 关联应用。

  • 下面我来演示一下它的运作方式。

  • 我们切换回现场演示。

  • 想象一下,您可以这样问:“AndroidDevSummit,请详细介绍一下 XR 专题演讲。”

  • 现在,Gemini 会连接到我们为此关联应用构建的 MCP 服务器。

  • 它会找到要调用的合适工具,并使用其数据来构建用户友好的回答。

  • 因此,它会在这里找到第 1 天和第 2 天与 XR 相关的会议信息,最后使用 Android 机器人呈现 AndroidDevSummit 的自定义品牌微件。

  • 因此,你可以直接在 Gemini 中与此微件互动。

  • 您可以查看日程,例如,您可以切换地点,也可以按日期过滤。

  • 您还可以按不同主题进行过滤,例如,如果您想搜索 XR 相关会议,还可以查看详细信息和演讲者。

  • 所以,太棒了!

  • Gemini 内部的一切,您的自定义品牌体验,用户无需切换,用户无需在其他应用中查找其他信息,一切都在一个地方,无需交互,无需任何切换或离开应用本身。

  • 现在,我们切换回幻灯片。

MCP 服务器开发和自定义界面

  • 接下来,我们来探索如何构建这款互联应用。

  • 因此,使用 FastMCP 库启动 MCP 服务器非常简单,但有四个非常重要的最佳实践需要遵循。

  • 首先,您需要提供明确的服务器指令。

    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 一站式管理中心(我稍后会向您展示)也会明确验证这些指令是否存在。

  • 其次,添加工具注释,以确保安全性和控制力。

    @mcp.tool(
        title="List Sessions",
    
        annotations=ToolAnnotations(
            readOnlyHint=True,
            destructiveHint=False,
        ),
    
        meta={ … },
    )
    def list_sessions( … )
    …
  • 对于 ADS 服务器,我们有以下两个注解。

  • 让模型知道您的工具何时是只读的或何时会修改数据,这一点非常重要。

  • 因此,如果您有任何用于修改或删除用户信息的操作,请务必使用此 destructiveHint 将其标记为可执行修改或删除操作。

  • 这样,Connected Apps Platform 就会知道它需要向用户显示一条确认消息,询问用户是否同意完成此操作。

  • 您还可以在 Google 一站式管理中心内配置工具,我稍后会向您展示。

  • 第三,强类型架构和语义文档字符串。

    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').
        """
        …
  • 将参数文档字符串视为提示的一部分。

  • 在此 list_sessions 工具中,我们明确记录了预期值,例如工具和性能,或 MTV 与伦敦的位置。

  • 影响工具调用准确性的最大因素是清晰且具有描述性的架构。

  • 最后一个是界面资源元数据绑定。

    @mcp.tool(
        …
        meta={
            "ui": {
                "resourceUri": "ui://ads-mcp/summit-app",
            },
            …
        },
    )
    def list_sessions(…)
    …
  • 查看 meta 中的界面定义。

  • 此元数据是桥梁,可指示 Gemini 将工具输出直接绑定到我们的自定义界面资源。

  • 这就引出了界面渲染。

    @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 应用界面从 MCP 服务器呈现丰富的界面。

  • 如果您希望灵活打造彰显品牌特色的自定义界面(例如我们的 Android 开发者峰会),可以公开 MCP 界面资源。

  • Gemini 可以在安全的沙盒化 iframe 中呈现。

测试和验证工作流

  • 接下来,我将引导您在本地机器上测试和部署关联的应用,并将其直接发布到生产环境。

  • 没错

  • 接下来,我们来看看如何在本地进行开发和测试。

  • 在开发期间,您可以使用第一个命令轻松地在本地启动服务器。

    ./venv/bin/python server.py
    npx @modelcontextprotocol/inspector
  • 然后,您可以使用 MCP Inspector 调试服务器、查看可用工具,并与界面进行交互。

  • 这只是 MCP Inspector 在 Android 开发者峰会上的一个示例。

  • 这样,您就可以看到工具和界面,并在本地进行测试。

  • 其次,您需要将 MCP 服务器部署到某个远程端点,以便在 Gemini 开发者模式下访问并验证它。

  • 您可以将 MCP 端点托管在任何基础设施或任何云服务提供商上。

  • 但如果您更喜欢 Google Cloud,则可以非常简单地通过 Google Cloud CLI 使用它。

  • 只需使用这个简单的命令进行部署,您的应用就可以远程访问了。

    gcloud run deploy ads-mcp-server
  • 下一步是在 Gemini 开发者模式中验证您的公共端点。

  • 现在,让我们切换回实时演示,我将向您展示如何在实践中使用开发者模式。

  • 因此,只需前往“设置”并点击“开发者模式”,即可轻松找到开发者模式。

  • 然后,您需要选择要测试的关联应用。

  • 例如,您只需在此处提供 MCP 服务器网址,即可创建一个新服务器。

  • 我已经创建了一个用于测试的 MCP,名为 ADS MCP,并配置了我的测试端点。

  • 我只是想测试一下它与 Gemini 的端到端集成效果。

  • 我们来问点问题。

  • “ADS MCP,告诉我更多关于这次活动的信息。”

  • 现在,Gemini 会调用我们的 MCP 服务器,您还可以在开发者模式下查看正在调用的工具。

  • 例如,对于这个特定的提示“Tell me more about the event”(详细介绍一下该活动),系统调用了 get_summit_info。

  • 您还可以看到成功的响应。

  • 您还可以看到延迟时间。

  • 您还可以查看所有请求和响应详情。

  • 例如,对于我们的响应,我们有很多信息。

  • 您还可以稍微放大一下,看看如何调试您可能需要的信息,并探索一切是否准确。

  • 您还可以复制该链接,以便与团队成员分享,非常方便。

  • 您还可以导出整个事件日志,并根据需要进行分享。

  • 我还喜欢的一点是,您还可以探索其他可用工具,因此在开发者模式下,您可以看到获取峰会信息、列出会议和其他工具。

  • 您还可以更改环境,以模拟不同的用户使用场景。

  • 例如,您可以更改白天时间或语言等偏好设置,还可以设置身份验证。

  • 以上就是开发者模式。

  • 没错,从今天起,您就可以开始构建 MCP 服务器,并使用开发者模式进行测试。

  • 现在,所有人都可以使用。

  • 现在,我们切换回幻灯片。

  • 好的。

  • 假设您已经使用开发者模式进行了测试,一切看起来都很棒,接下来该怎么做?

  • 您需要注册才能访问我们的平台,并且需要先填写此意向调查表。

  • 您也可以在我们的文档和 Google 一站式管理中心内找到这些信息。

为投入生产环境做好准备和资源

  • 提交内容获得批准后,您将获得 Google 一站式管理中心的访问权限,并可在其中为应用发布正式版做好准备。

  • 在管理中心内,只需几个步骤即可准备好您的应用。

  • 首先,您需要在其中创建一个新的关联应用,并提供一个名称。

  • 然后,您只需选择功能和类别。

  • 例如,在本示例中,我们选择了“效率”,然后点击“创建”。

  • 接下来,在应用详细信息下,您需要提供公开数据,例如显示名称、图标,以及面向用户的说明、应用功能、限制、示例提示和其他数据。

  • 然后,在配置 MCP 服务器时,您需要提供端点。

  • 您需要验证此网域归您所有,还可以配置同步工具的凭据。

  • 请注意,Google 控制台会为您的 MCP 架构创建快照,因此,每当您更改架构时,都需要返回并重新部署。

  • 之后,您只需配置应用的分发范围即可。

  • 您可以选择应用应在哪些地区提供、支持哪些语言、在哪些平台上架,以及其他个别工具配置。

  • 然后,您只需点击“推送更改”,并提交以供 Gemini 阶段审核。

  • 然后,您还可以在“管理测试人员”下添加测试账号。

  • 并立即使用此测试账号在网页、移动设备或您之前选择的任何平台(例如 Gemini 或 Google 搜索)上进行实时测试,然后提交以进行最终预览。

  • 应用准备就绪后,您只需点击提交按钮,即可面向全球用户或所选地区的用户发布正式版。

  • 就是这么简单!

  • 无论您是通过远程 MCP 服务器还是通过 Android MCP 公开应用功能,我们都非常期待看到您使用 Connected Apps Platform 构建出色的应用。

  • 我们很乐意为您提供支持,帮助您打造出色的集成。

  • 只需按照本文档和我们的示例操作即可,您可以使用此条形码获取这些示例。

  • 非常感谢各位今天的参与!

  • 祝大家编码顺利!

代码

代码段

“MCP 服务器开发和自定义界面”中 14:56 处的 Python 代码段
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 服务器开发和自定义界面”中 15:22 处的 Python 代码段
@mcp.tool(
    title="List Sessions",

    annotations=ToolAnnotations(
        readOnlyHint=True,
        destructiveHint=False,
    ),

    meta={ … },
)
def list_sessions( … )
…
“MCP 服务器开发和自定义界面”中 16:08 处的 Python 代码段
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 服务器开发和自定义界面”中 16:32 处的 Python 代码段
@mcp.tool(
    …
    meta={
        "ui": {
            "resourceUri": "ui://ads-mcp/summit-app",
        },
        …
    },
)
def list_sessions(…)
…
“MCP 服务器开发和自定义界面”中 16:49 处的 Python 代码段
@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",
        )
    ])
“测试和验证工作流”中 17:29 处的 Shell 代码段
./venv/bin/python server.py
npx @modelcontextprotocol/inspector
“测试和验证工作流”中 18:16 处的 Shell 代码段
gcloud run deploy ads-mcp-server