# Gemini Connected Apps：数据工具怎么接

> Gemini Connected Apps 预览已开放。拿真实数据 MCP 对照 Google 的 12 条要求实测：鉴权卡在哪、工具怎么写、调用多少钱。

- Canonical page: https://everyinfra.com/blog/gemini-connected-apps-platform-data-tools
- Published: 2026-11-12T01:07:00+08:00 · Fact-checked: 2026-11-11T01:30:00+08:00

这篇文章写给做数据工具的开发者：你手上已经有一个远程 MCP 服务器，能把社交平台和电商的数据交给 AI，现在想知道 Google 在 2026 年 10 月 28 日开放预览的 Connected Apps Platform 能不能、该不该接。先说清楚测了什么、没测什么。Google 一侧的 Connected Console 注册、开发者模式里建自定义应用、审核和发布，我们都没有执行：Connected Console 目前只对美国开发者开放预览，申请要填表排队，本文里凡是 Google 一侧的步骤和配置，都标成「配置示例」，内容照 developers.google.com 和 support.google.com 的原文写。EveryInfra 一侧的每个数都来自 2026 年 11 月 11 日 00:17 到 00:35（新加坡时间）对 `https://api.everyinfra.com/mcp` 的真实调用：握手、列工具、8 次数据调用、几次故意出错的请求，以及按 Google 文档的发现顺序去探 OAuth 元数据。EveryInfra 没有在 Gemini 或 Google 搜索里上架，也没有提交审核，本文不代表 Google 对任何一方的认可。

结论先放前面。把 Google 文档里能逐条核对的 12 条要求拿来对照，EveryInfra 的通用入口 `/mcp` 符合 6 条，带 OAuth 的 `/mcp/all` 符合 5 条，另有 3 条部分符合。挡路的不是传输协议，也不是版本号，而是两件更根本的事：Gemini 的连接方式里没有地方填 API key 请求头，只能走 OAuth；Google 的上架政策不允许「一个工具分发到很多能力」的通用写法，而这恰恰是大多数数据 MCP 的写法。第三件事是返回体积：11 月 11 日一次 `youtube/search` 原样返回 20 条视频，正文 39,732 字节；只留回答问题要用的 6 个字段，是 5,062 字节，只剩 12.7%。返回越大，模型读它花的钱越多，正文按 token 估算了这笔账。

> **本文要点**
>
> - Connected Apps Platform 在 2026-10-28 开放预览，开发者用一个远程 MCP 服务器同时接入 Gemini 应用和 Google 搜索的 AI 模式；预览只对美国开发者开放，上架要过 Google 审核。
> - Gemini 只认 OAuth，不认请求头里的 API key。Google 的 OAuth 指南写 Gemini 应用必须有独立的 `registration_endpoint`；我们探到的 EveryInfra OAuth 元数据有 PKCE S256 和 CIMD，但没有这个字段，按指南会停在第 4 步。
> - 对照 Google 文档的 12 条要求：`/mcp` 和 `/mcp/youtube` 各符合 6 条，`/mcp/all` 符合 5 条、部分符合 3 条；最难改的是政策禁止通用分发工具，以及查数工具被标成 `destructiveHint=true` 会触发确认弹窗。
> - 8 次真实数据调用（2026-11-11，新加坡时间 00:18 到 00:35）耗时 4.3 到 55.7 秒，7 次各扣 $0.000556（当天目录价），空结果那次没扣费，合计 $0.003892。
> - 返回体积能压很多：`youtube/search` 20 条原样 39,732 字节，只留 6 个字段是 5,062 字节（12.7%）；`reddit/search` 14 条从 25,212 字节降到 4,274 字节（17.0%）。按 token 估算，模型读原样返回的输入费高于这次数据费。

![示意插图：画面分成左右两条路。左边一段宽台阶通向一个有门卫亭和栏杆的广场，广场入口挂着一块空白的审核牌；右边一条青绿色的小路直接通向一张工作台，台上放着一台笔记本电脑和一摞数据卡片。两条路从同一块起点平台出发，平台上放着一个代表 MCP 服务器的方盒子。只有右边的小路是青绿色。](https://everyinfra.com/articles/gemini-connected-apps-platform-data-tools/img-explain.webp)

同一个 MCP 服务器，去 Gemini 应用和搜索要过审核这道门；只给自己的 agent 用，走 Gemini API 或 Gemini CLI 就能直接接。

## Gemini Connected Apps Platform 是什么：10 月 28 日的预览

2026 年 10 月 28 日，Google 在开发者博客上宣布 Connected Apps Platform，定位是让开发者「做一次，接到 Gemini 应用和搜索两个地方」（[Google 博客，2026-10-28](https://blog.google/innovation-and-ai/technology/developers-tools/connected-apps-one-place)）。在这之前，Gemini 里的第三方连接应用要和 Google 一对一合作才能做出来；按 9to5Google 当天的报道，Gemini 应用里这类应用当时已经超过 50 个，包括 Adobe、Dropbox、Instacart、OpenTable、Ticketmaster，Calm 会在几周内加入（[9to5Google，2026-10-28](https://9to5google.com/2026/10/28/gemini-google-connected-apps-platform)）。新平台把这个过程改成自助：开发者准备一个云端托管的 MCP 服务器，或者在 Android 应用里用 AppFunctions 做本机 MCP，然后在新的 Google Connected Console 里注册、测试、提交审核，并且可以自己选上线到搜索、Gemini 应用还是两边都上。

产品主页把两条接入路径写得很清楚：远程 MCP 服务器用于把工具和经过授权的数据接到 Google 的产品里，还可以用 MCP Apps 做交互界面；Android MCP 是客户端路径，用 Jetpack AppFunctions 库让应用把功能交给 Gemini 这样的助手，在手机本地执行（[Connected Apps Platform 主页](https://developers.google.com/connected-apps)）。Android 文档补了一个限制：AppFunctions 需要 Android 16 以上，和 Gemini 的集成截至 2026 年 5 月还是给受信测试者的私有预览（[AppFunctions 概览](https://developer.android.com/ai/appfunctions)）。做数据工具的团队通常没有自己的 Android 应用，本文只讨论远程 MCP 这条路。

「谁能用」是第一个要核对的点。在 10 月 29 日发布的开发者讲解视频里，Google 的工程师在第 6 分钟说明预览只对美国开发者开放，接着又说开发者模式现在对美国所有用户可用（[Android Developers 频道视频，2026-10-29](https://www.youtube.com/watch?v=-4G-4w9FKDw)）。用户这边也一样窄：Gemini 帮助中心写明，自己连自定义 MCP 应用要年满 18 岁、在美国、用个人 Google 账号（不能是工作或学校账号）、打开「保留活动记录」，界面只有英文，而且只能在网页版里建立连接（[Gemini 帮助：自定义应用](https://support.google.com/gemini/answer/17209137?hl=en)）。搜索一侧的帮助页也说，搜索 AI 模式里的连接应用目前只在美国、只用英文（[Google 搜索帮助：连接应用](https://support.google.com/websearch/answer/17265703)）。如果你的用户主要不在美国，这一段已经决定了短期内的收益上限。

![流程动画，分上下两条泳道，演示 Gemini 连接一个远程 MCP 服务器的步骤：第 1 步 POST initialize，第 2 步收到 401 和 WWW-Authenticate，第 3 步读受保护资源元数据，第 4 步注册客户端，第 5 步用户登录授权，第 6 步带令牌调用工具。上面一条是 EveryInfra 的 /mcp/all，前三步是青绿色的通过标记，第 4 步因为元数据里没有 registration_endpoint 停下；下面一条是 /mcp，第 1 步就停住，因为它只认请求头里的 API key，而 Gemini 没有填请求头的地方。](https://everyinfra.com/articles/gemini-connected-apps-platform-data-tools/fig-01-connect-flow.zh.light.svg)

## 最近 60 天的变化：从连接应用到开发者平台

Connected Apps Platform 不是一夜冒出来的。把最近两个月 Google 自己公布的变化排一下，可以看出它是一步步从「Google 挑合作方」走到「开发者自己申请」的。

| 日期 | 变化 | 对数据工具开发者意味着什么 | 出处 |
| --- | --- | --- | --- |
| 2026-09-23 | 新一批连接应用进入 Gemini：Airtable、Linear、monday.com、Adobe、Webflow、Experian、Peloton 等 | 第三方应用在 Gemini 里用 @ 提及的用法已经成形，但名单还是 Google 选的 | [Google 博客](https://blog.google/innovation-and-ai/products/gemini-app/new-connected-apps-gemini) |
| 2026-10-13 | Gemini 改版，加入「Customize」页面集中管理连接应用，可连的应用超过 40 个，大多只在美国英文环境 | 用户开始有一个固定位置找应用，入口变清楚了 | [Gemini 发布说明](https://gemini.google/release-notes/) |
| 2026-10-27 至 10-30 | developers.google.com 上线 MCP 开发者指南、服务器优化、OAuth、开发者模式、Connected Console 的整套文档 | 要求第一次写成文字，可以逐条对照自己的服务器 | [MCP 开发者指南](https://developers.google.com/connected-apps/mcp)、[前置条件，2026-10-30 更新](https://developers.google.com/connected-apps/gpc/prerequisites) |
| 2026-10-28 | Connected Apps Platform 开放预览，一个 MCP 服务器同时接 Gemini 和搜索 | 自助注册，但要过审核，只对美国开发者 | [Google 博客](https://blog.google/innovation-and-ai/technology/developers-tools/connected-apps-one-place) |
| 2026-10-29 | Google 开发者讲解视频：从 FastMCP 写服务器、部署到 Cloud Run、开发者模式测试到 Console 提交 | 整个流程第一次被完整演示，也说清了只对美国开放 | [视频](https://www.youtube.com/watch?v=-4G-4w9FKDw) |
| 2026-11-02 | Connected Apps 政策更新，「集成完整性」一节禁止动态发现工具和通用分发工具 | 大多数数据 MCP 的「一个工具调所有能力」写法不合规 | [Connected Apps 政策](https://developers.google.com/connected-apps/connected-apps-policy) |
| 2026-11-10 | Gemini API 发布 Gemini 4 Carbon 正式版，11 月 30 日前输入每百万 token $2、输出 $10 | 在 Gemini API 里自己接 MCP 的路线，模型选择和价格又多了一档 | [Gemini API 发布说明](https://ai.google.dev/gemini-api/docs/changelog) |

## Gemini Connected Apps Platform API：三条接法各管什么

「把数据工具接进 Gemini」其实有三条完全不同的路，适用的人、鉴权方式和审核要求都不一样。很多讨论把它们混在一起，结果在开发者模式里折腾半天，才发现自己要的其实是 Gemini API。

第一条是 Connected Apps Platform 本身：你的应用出现在 Gemini 应用和搜索 AI 模式的应用列表里，所有符合条件的用户都能用 @ 提到它。要走 Connected Console 注册、通过审核才能发布，鉴权只能是不鉴权、机器对机器的 OAuth 客户端凭据，或者用户授权的 OAuth 授权码流程（[Console 操作步骤，2026-10-28 更新](https://developers.google.com/connected-apps/gpc/perform-the-steps)）。第二条是开发者模式里的自定义应用：在 `gemini.google.com/devmode` 里填一个 MCP 服务器网址就能连，只有你自己的账号能用，不需要审核，但同样只能选 OAuth 或者不鉴权（[开发者模式使用说明，2026-10-28 更新](https://developers.google.com/connected-apps/mcp/dev-mode/usage)）。第三条是 Gemini API 的 Interactions 接口：在请求的 `tools` 里写一个 `mcp_server`，可以带任意 HTTP 请求头，用 `allowed_tools` 限定能调哪些工具，只支持 Streamable HTTP（[Gemini API 函数调用文档](https://ai.google.dev/gemini-api/docs/function-calling)）。Gemini CLI 的 `settings.json` 也属于这一类，`httpUrl` 加 `headers` 就能带 API key（[Gemini CLI MCP 配置](https://geminicli.com/docs/tools/mcp-server/)）。

| 接法 | 谁能用 | 能带 API key 请求头吗 | 要审核吗 | 地区和账号限制 | 适合谁 |
| --- | --- | --- | --- | --- | --- |
| Connected Apps Platform 上架 | 所有符合条件的 Gemini 和搜索用户 | 不能，只有不鉴权或 OAuth | 要，Console 第 9 步提交 | 预览只对美国开发者；用户侧美国、英文 | 有自己用户账号体系、想被普通用户发现的服务 |
| 开发者模式自定义应用 | 只有建应用的那个账号 | 不能，只有不鉴权或 OAuth | 不要 | 18 岁以上、美国、个人账号、网页版建立连接 | 上架前自测；个人自用 |
| Gemini API 的 `mcp_server` | 你自己的程序和 agent | 能，`headers` 任意填 | 不要 | 按 Gemini API 的可用地区 | 做数据分析、监测、报表的团队 |
| Gemini CLI | 你自己的终端 | 能，`headers` 任意填 | 不要 | 按 Gemini CLI 的可用范围 | 开发者日常查数、写脚本 |
| Gemini Enterprise | 企业里的员工 | 不能直接填，要经 ADK 和 Agent Gateway 转 | 企业管理员批准 | 按企业版合同 | 公司统一管理工具 |

如果你看的是企业版，我们之前写过一篇 [Gemini Enterprise 接 MCP 做品牌口碑监测](/blog/gemini-enterprise-agent-platform-mcp-brand-sentiment)，那里的结论是企业版的 MCP 连接同样只认 OAuth 或不鉴权，要带 API key 得在中间放一层 ADK agent。如果你想要的是「让 Gemini 定期整理一份热帖摘要」，那是 Gemini skills 的用法，见 [Gemini skills 取代 Gems：每周热帖摘要实测](/blog/gemini-skills-weekly-hot-posts-digest)。如果你要的是一份带引用的长报告，Deep Research API 也能挂 MCP，见 [Gemini Deep Research API 接 MCP 拿社交数据](/blog/gemini-deep-research-api-mcp-social-data)。本文只回答一个问题：Connected Apps Platform 和开发者模式这两条面向 Gemini 应用的路，数据工具要准备什么、会卡在哪。

## 申请条件和审核：Connected Console 的九步

Connected Console 的操作文档把上架拆成 9 步，每一步要准备的东西不一样。我们没有 Console 账号，下面的表是照文档原文整理的「配置示例」，没有实际走过。

| 步骤 | 做什么 | 要准备的东西 | 对数据工具的难点 |
| --- | --- | --- | --- |
| 1 | 建应用、选类别 | 类别选定后不能改 | 「数据查询」不是现成类别，要从现有类别里挑最接近的 |
| 2 | 填应用信息 | 名称、30 词以内的一句话描述、512×512 图标（不超过 1 MB）、至少 3 项能力、至少 3 条示例提问 | 示例提问至少 2 条要以 @应用名开头，至少 1 条自然提到应用名 |
| 3 | 填 MCP 服务器地址、验证域名 | 公网 HTTPS 地址；在 `/.well-known/google-connected-apps` 放验证文件，必须直接回 200、不能跳转 | 验证文件要放在 MCP 服务器所在的域名上 |
| 4 | 选鉴权方式 | 不鉴权；或机器对机器（Client ID 加可选 Secret）；或用户授权（预先登记、CIMD 或 DCR） | 没有 API key 请求头这个选项 |
| 5 | 准备测试账号 | 审核员用的种子账号，关掉两步验证 | 数据服务通常要给审核员预充值 |
| 6 | 同步工具快照 | 发布的版本会冻结；文档建议每个版本用一个新地址 | 工具描述改一个字也要重新同步 |
| 7 | 设可用范围 | 国家、语言、产品；每个工具单独开关；位置等上下文信号；用户确认 | 写操作和扣费工具要设确认 |
| 8 | 加测试者 | 测试者必须是 @gmail.com 账号，生效要等最多 10 分钟 | 团队成员要有个人 Gmail |
| 9 | 提交审核 | 审核通过后状态变成可发布 | 审核时间文档没写 |

![Google 开发者文档截图：标题 Perform the steps in Google Connected Console 下的第 4 步鉴权一节，列出三种选项 No authentication、Machine-to-machine (OAuth Client Credentials) 需要 Client ID 和可选 Client Secret、User-delegated (Authorization Code) 经 Google Account Linking，下面写着推荐用 CIMD 或 DCR、Google 会先查 CIMD 再查 DCR。用户授权这一段用青绿色框标出，页面底部 Last updated 2026-10-28 UTC。](https://everyinfra.com/articles/gemini-connected-apps-platform-data-tools/img-doc-console-auth.webp)

Console 第 4 步只有三种鉴权选项，没有填 API key 请求头的地方（截图取自 2026-11-11 读取的页面，只保留了这一节）。 [Google Connected Apps 文档：Perform the steps in Google Connected Console](https://developers.google.com/connected-apps/gpc/perform-the-steps)

前置条件页还有几条容易漏掉的硬要求（[前置条件，2026-10-30 更新](https://developers.google.com/connected-apps/gpc/prerequisites)）。一是每个连接应用只能有一个全球统一的 MCP 地址，不支持按数据中心分开的网址，按国家分的域名只能在只面向那个国家上线时用。二是如果你的服务器按来源 IP 做了限制，要放行 Google 列出的 7 个网段，并建议定期从 Google 公布的 [用户触发型 agent IP 列表](https://developers.google.com/static/crawling/ipranges/user-triggered-agents.json) 刷新。三是 Console 的服务条款要由组织的所有者或管理员先接受，其他成员才能继续。四是要有公开的服务条款和隐私政策网址。MCP 请求流程页还写了一条：Google 发出的每个 JSON-RPC 请求都带 `User-Agent: Google`（[MCP 请求流程，2026-10-27 更新](https://developers.google.com/connected-apps/mcp/mcp-flow)），如果你的网关按 UA 拦爬虫，要先确认不会把它挡掉。

我们在 00:17（新加坡时间）用 `User-Agent: Google` 探了一遍 EveryInfra 的几个地址：`/mcp` 的握手和列工具都正常回 200，`GET /mcp` 回 405 并在 `Allow` 头里写明只收 POST，这正是 Google 服务器优化文档说「可以接受」的行为（[服务器优化，2026-10-27 更新](https://developers.google.com/connected-apps/mcp/server-optimization)）；`/.well-known/google-connected-apps` 回 404，因为我们没有申请，也就没有验证文件。下面是一条可以照抄的自查命令，属于配置示例，把域名换成你自己的：

```bash
# 配置示例：上架前自查（把 api.example.com 换成你的 MCP 域名）
curl -s -o /dev/null -w "%{http_code} %{redirect_url}\n" \
  https://api.example.com/.well-known/google-connected-apps      # 要求：200，且没有跳转
curl -s -o /dev/null -w "%{http_code}\n" -X GET https://api.example.com/mcp   # 405 可以接受
curl -s https://api.example.com/mcp -A "Google" \
  -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"self-check","version":"0"}}}'
```

## 鉴权：Gemini 能用哪几种方式进你的服务器

鉴权是数据工具接 Gemini 最先撞上的墙。EveryInfra 的 `/mcp` 和大多数数据服务一样，只认请求头里的 API key：客户在控制台建一把 key，填进 Claude Desktop、Cursor 或自己程序的配置里，每次请求带上。可是 Google 给的三种鉴权方式里没有这一种。开发者模式的使用说明也是一样，认证一栏只有「动态客户端注册」和「手动客户端注册」两种 OAuth 选项（[开发者模式使用说明](https://developers.google.com/connected-apps/mcp/dev-mode/usage)）。所以对一个只认 API key 的数据 MCP，Gemini 应用这条路在第一步就走不通，这和服务器写得好不好无关。

那换成 OAuth 呢？EveryInfra 另有一组入口：`/mcp/all` 和按平台分的 `/mcp/youtube` 等，可以用 OAuth 登录。我们在同一分钟里按 MCP 授权规范的发现顺序走了一遍，看 Gemini 理论上会看到什么（[MCP 授权规范 2025-11-25](https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization)）。不带凭据请求 `/mcp/all`，00:17:48（新加坡时间）回 401，`WWW-Authenticate` 头里带着受保护资源元数据的地址和需要的权限范围，这符合 RFC 9728 第 5.1 节（[RFC 9728](https://www.rfc-editor.org/rfc/rfc9728)）：

```text
HTTP/1.1 401 Unauthorized
www-authenticate: Bearer resource_metadata="https://api.everyinfra.com/.well-known/oauth-protected-resource/mcp/all",
  scope="data:call search:call captcha:call ai:call account:read offline_access"

GET https://api.everyinfra.com/.well-known/oauth-protected-resource/mcp/all   -> 200，authorization_servers: https://auth.everyinfra.com/oidc
GET https://auth.everyinfra.com/oidc/.well-known/oauth-authorization-server     -> 200
  code_challenge_methods_supported: ["S256"]          # PKCE，符合
  client_id_metadata_document_supported: true        # CIMD，符合
  registration_endpoint: （没有这个字段）
```

前三步都过了：401 带资源元数据地址、资源元数据回 200、授权服务器元数据（[RFC 8414](https://www.rfc-editor.org/rfc/rfc8414)）回 200，PKCE 用 S256（[RFC 7636](https://www.rfc-editor.org/rfc/rfc7636)）。卡在第四步「注册客户端」。Google 的 OAuth 实现指南把必需字段列成 `authorization_endpoint`、`token_endpoint`、`response_types_supported`（含 code）和 `registration_endpoint`，并且专门说了一句：即使服务器支持 Client ID 元数据文档（CIMD），Gemini 应用目前仍然要求一个独立的注册端点（[OAuth 实现指南，2026-09-14 更新](https://developers.google.com/connected-apps/mcp/oauth)）。注册端点就是 RFC 7591 的动态客户端注册（[RFC 7591](https://www.rfc-editor.org/rfc/rfc7591)）。EveryInfra 的授权服务器支持 CIMD（[CIMD 草案](https://datatracker.ietf.org/doc/draft-ietf-oauth-client-id-metadata-document/)），但没有开放动态注册，按这份指南，Gemini 应用会在这里停下。

这里有一个 Google 两份文档说法不一致的地方，值得写出来。更新日期更晚的 Console 操作步骤（2026-10-28）说，用户授权模式下推荐 CIMD 或 DCR，Google 会先查 CIMD、再查 DCR（[Console 操作步骤](https://developers.google.com/connected-apps/gpc/perform-the-steps)）。而 9 月 14 日更新的 OAuth 指南说 Gemini 应用必须有注册端点。社区的实际经验偏向后者：10 月 19 日 r/mcp 一个讨论 Gemini 自定义连接器的帖子里，有人说 Gemini 还不支持 CIMD，只能手动填 Client ID（[r/mcp 讨论](https://www.reddit.com/r/mcp/comments/1xaba94/custom_connectors_gemini/)）。我们的判断是：正式上架走 Console 时 CIMD 可能可用，开发者模式自测时按 OAuth 指南准备注册端点更稳。两条都没法在美国以外实测，要等美国的开发者验证。

就算元数据全齐了，还有一道门：登录本身对谁开放。EveryInfra 的 OAuth 登录目前只对几家已登记的 AI 客户端开放（按 CIMD 地址认），Google 的回调地址不在名单里。Google 的 OAuth 指南列出了 Gemini 用的回调地址形式，是 `oauth-redirect.googleusercontent.com` 下的几个路径，另有沙盒和测试用的变体，并要求账号关联保持长期有效、不要轮换刷新令牌（[OAuth 实现指南](https://developers.google.com/connected-apps/mcp/oauth)、[Google 账号关联](https://developers.google.com/identity/account-linking/oauth-linking)）。所以对一个数据服务来说，「支持 OAuth」要做的事是一串：开动态注册或者确认 CIMD 被接受、把 Google 的回调地址加进允许名单、给机器调用和用户调用分开发令牌、刷新令牌不轮换。这不是一个周末能做完的活。

社区里卡在这一步的人不少。Google AI 开发者论坛 10 月 2 日一个帖子说，自定义应用的 OAuth 走到回调就停了，Gemini 从来没有去调令牌端点，同一个服务器在 Claude 和 ChatGPT 里都正常（[Google AI 开发者论坛](https://discuss.ai.google.dev/t/gemini-app-spark-custom-apps-mcp-oauth-never-exchanges-the-code-cannot-complete-request-on-oauth-redirect-googleusercontent-com/186405)）。10 月 22 日 r/GeminiAI 有人问自定义连接器的回调地址到底填什么（[r/GeminiAI](https://www.reddit.com/r/GeminiAI/comments/1xcbzub/gemini_app_adding_custom_connectors/)）。另一个 r/GeminiAI 的帖子里，有人反映服务器用 `2026-07-28` 协议版本握手时，Gemini 报「这个网址看起来不是有效的 MCP 服务器」（[r/GeminiAI](https://www.reddit.com/r/GeminiAI/comments/1wwe3u1/gemini_now_supports_general_mcp_servers/)）。最后这条和 Google 的文档对得上：服务器优化页写明支持的 MCP 版本到 2025-11-25 为止（[服务器优化](https://developers.google.com/connected-apps/mcp/server-optimization)）。我们在 00:27（新加坡时间）主动要 `2026-07-28` 版本，EveryInfra 回的是 `2025-11-25`，这种「客户端要新版本、服务器回自己支持的版本」的协商是 MCP 规范允许的（[MCP 规范 2026-07-28](https://modelcontextprotocol.io/specification/2026-07-28)），所以版本这一条不挡路。

我们按标题把 11 月 11 日 `reddit/search` 拿到的 14 条帖子人工归了一下类，8 条在讲把 MCP 接进 Gemini，话题集中在自定义连接器的 OAuth 走不通、Gemini 网页版和 Antigravity 怎么接、同一个服务器怎么同时给 Claude、ChatGPT 和 Gemini 用。10 月 17 日 r/modelcontextprotocol 一位做股票数据 MCP 的开发者写了经验：给 Claude 和 ChatGPT 用 OAuth 加动态客户端注册，给其他客户端用 Bearer 请求头，接 Gemini 时走的是 Gemini CLI 的扩展安装，而不是 Gemini 应用（[r/modelcontextprotocol](https://www.reddit.com/r/modelcontextprotocol/comments/1x8lxcq/how_i_got_one_stock_market_data_mcp_server_into/)）。

## 工具描述：对照 Google 的 12 条要求

过了鉴权，审核员和 Gemini 模型看到的就是你的工具清单。Google 在质量页、服务器优化页和政策页里对工具写了很多具体要求，我们挑出能直接拿服务器返回核对的 12 条，对照 EveryInfra 三个入口的真实 `tools/list` 和 `initialize` 返回，逐条判定。判定是作者一个人做的，判据和证据文件都写在数据文件里：2 表示符合，1 表示部分符合，0 表示不符合。

![热力表，12 行是 Google 文档里的要求，3 列是 EveryInfra 的 /mcp、/mcp/youtube、/mcp/all。符合的格子是青绿色，部分符合是浅色，不符合是灰色。传输协议、握手版本、server instructions、工具都有 annotations、结果是 TextContent 里的 JSON 这五行三列都符合；只读工具不标 destructive、不用通用分发工具、固定取值写 enum、限速用 JSON-RPC 错误码这四行三列都不符合；时间字段格式三列都是部分符合；工具数 /mcp/all 部分符合；鉴权方式 /mcp/all 部分符合、另两列不符合。标题写着 /mcp 符合 6 条，/mcp/all 符合 5 条。](https://everyinfra.com/articles/gemini-connected-apps-platform-data-tools/fig-02-requirements-heat.zh.light.svg)

| Google 的要求 | 出处 | `/mcp` | `/mcp/youtube` | `/mcp/all` | 证据 |
| --- | --- | --- | --- | --- | --- |
| Streamable HTTP，一个网址收 POST | 服务器优化 | 符合 | 符合 | 符合 | 三个入口 POST 都回 200，GET 回 405 |
| 握手版本不高于 2025-11-25 | 服务器优化 | 符合 | 符合 | 符合 | 都回 `2025-11-25` |
| `initialize` 带 server instructions | 排错页 | 符合 | 符合 | 符合 | 3,993 / 2,092 / 3,973 个字符 |
| 每个工具都写 annotations | 服务器优化 | 符合 | 符合 | 符合 | 12/12、3/3 |
| 只读查数工具不标 destructive | 服务器优化、讲解视频 | 不符合 | 不符合 | 不符合 | `everyinfra_call_api` 标 `destructiveHint=true` |
| 不用通用分发和动态发现工具 | 政策「集成完整性」 | 不符合 | 不符合 | 不符合 | 一个工具按 platform 和 action 分发 |
| 固定取值的参数写 enum | 服务器优化 | 不符合 | 不符合 | 不符合 | platform、action 是自由字符串 |
| 工具数不到「几十个」 | 服务器优化 | 符合 | 符合 | 部分符合 | 12 / 3 / 24 个 |
| 结果是 TextContent 里的 JSON | 服务器优化 | 符合 | 符合 | 符合 | 成功结果都在 `content[0].text` |
| 限速等终止错误用 JSON-RPC 错误码 | 服务器优化 | 不符合 | 不符合 | 不符合 | 限速回 200 加 `isError` |
| 时间字段写明格式 | 服务器优化 | 部分符合 | 部分符合 | 部分符合 | 搜索是 ISO 时间，评论是「11 days ago」 |
| 鉴权方式在 Google 的选项里 | Console 第 4 步 | 不符合 | 不符合 | 部分符合 | 见上一节 |

做得对的几条先说。Google 的排错页把「initialize 里没有 instructions」列为会出警告的问题（[排错页，2026-10-27 更新](https://developers.google.com/connected-apps/gpc/troubleshooting)），服务器优化页建议用 instructions 告诉模型什么时候用哪个工具、怎么组合。EveryInfra 的 `/mcp` 在握手时给了 3,993 个字符的说明，包括「需求不清时先问平台、关键词、数量、时效和预算，先小量跑一次再放大」这类引导，按 4 个字符约 1 个 token 估算约 998 个 token（[Gemini API token 说明](https://ai.google.dev/gemini-api/docs/tokens)）。结果放在 TextContent 的 JSON 里，也正是 Google 现在要的格式：服务器优化页明说 `structuredContent` 暂不支持，要把 JSON 序列化进文本内容。

不符合的几条里，有两条是写法问题，改起来不难。一是 enum：`everyinfra_call_api` 的 `platform` 和 `action` 是自由字符串，Google 建议固定取值都写成 enum，让模型少猜。EveryInfra 的做法是猜错了再纠正：00:24（新加坡时间）我们故意把 `search` 拼成 `serch`，返回是 `isError`，错误码 `unknown_capability`，带「你是不是想要 search」和可用动作列表，并写明没有扣费。这对模型自我修正很友好，但多了一轮往返。按平台分的入口 `/mcp/youtube` 只有一个平台，`action` 只有 8 个取值，完全可以写成 enum。二是时间格式：`youtube/search` 返回 ISO 时间，`youtube/comments` 返回「11 days ago」这种相对时间，模型要换算才能比较，Google 建议在字段说明里写清格式。

另外两条是设计问题，改动要大得多，下一节单独讲。

## 政策：通用分发工具和确认弹窗

Connected Apps 政策 11 月 2 日的版本里有一节「集成完整性」，大意是：上架的应用不能暴露动态发现函数（比如 `list_tools`、`get_schema`），也不能暴露通用的运行时分发器（比如 `execute_command`、`invoke_dynamic_tool`）；工具定义要在注册时就固定下来，审核看到什么，上线就是什么（[Connected Apps 政策，2026-11-02 更新](https://developers.google.com/connected-apps/connected-apps-policy)）。同一份政策还要求数据最少化，不能索要对话历史。

![Google 开发者文档截图：Connected Apps 政策页的 Integration integrity 一节，列出几条要求，其中 Dynamic tool schemas 一条用青绿色框标出，内容是不能暴露 list_tools、get_schema 这类动态发现函数，也不能暴露 execute_command、invoke_dynamic_tool 这类通用运行时分发器。页面底部 Last updated 2026-11-02 UTC。](https://everyinfra.com/articles/gemini-connected-apps-platform-data-tools/img-doc-policy-integrity.webp)

政策页「集成完整性」一节：通用分发和动态发现工具都不允许（截图取自 2026-11-11 读取的页面，只保留了这一节）。 [Google Connected Apps 文档：Connected apps policy](https://developers.google.com/connected-apps/connected-apps-policy)

这条对数据 MCP 的影响很直接。EveryInfra 有 106 个平台、573 项能力（00:17 新加坡时间读取的目录，其中 538 项可用），如果每项能力做一个工具，工具清单会有几百个，Google 服务器优化页明说「几十个工具」就会被标出来；所以 EveryInfra 和大多数多平台数据服务一样，用一个 `everyinfra_call_api` 按 platform 加 action 分发，再用一个免费的 `everyinfra_list_capabilities` 让模型先查能力。下面是 00:17 拿到的 `tools/list` 里这个工具的定义（节选）：

```text
{
  "name": "everyinfra_call_api",
  "title": "Call a data capability",
  "annotations": { "readOnlyHint": false, "openWorldHint": true, "destructiveHint": true },
  "description": "Call any EveryInfra data capability and get structured JSON. ... Check platform/action, required params and max_limit or page_size with everyinfra_list_capabilities first. ...",
  "inputSchema": {
    "type": "object",
    "required": ["platform", "action"],
    "properties": {
      "platform": { "type": "string", "description": "e.g. xiaohongshu / twitter / tiktok / web" },
      "action":   { "type": "string", "description": "e.g. search / profile / user_posts / post" },
      "params":   { "type": "object" },
      "mode":     { "type": "string", "enum": ["sync", "async"], "default": "sync" }
    }
  }
}
```

在 Claude、ChatGPT 和 Cursor 里，这种写法工作得很好：模型先查目录，再按目录里的参数调用。但按 Google 的政策，它同时踩了「通用分发」和「动态发现」两条。要上架，就得把工具拆成固定的、按任务命名的几个，比如 `search_youtube_videos`、`search_reddit_posts`、`get_reddit_comments`，每个工具的参数写死、取值写 enum。Google 服务器优化页给的命名建议也是「动词_名词」、一个工具做一件事、参数扁平。按平台分的入口 `/mcp/youtube` 是往这个方向走的一步：它只有 3 个工具，清单只有 4,020 字节，但里面仍然是 `call_api` 加 `list_capabilities` 的组合，没有拆成按任务命名。

第二个设计问题是确认弹窗。Google 的服务器优化页写明，同时标了 `destructiveHint` 和 `openWorldHint` 的工具会触发用户确认；没写 `readOnlyHint` 的工具一律当成有破坏性。讲解视频第 7 分 52 秒说得更直白：确认的强度跟风险走，不会每次调工具都弹窗，查东西这种操作应该没有阻力（[讲解视频](https://www.youtube.com/watch?v=-4G-4w9FKDw)）。Gemini 帮助中心也说，写操作 Gemini 会要求用户手动确认（[Gemini 帮助：自定义应用](https://support.google.com/gemini/answer/17209137?hl=en)）。EveryInfra 的 12 个工具里有 7 个只读（列能力、查任务、查账户、查工单、取充值链接、列验证码类型、列请求记录），但真正查数据的 `everyinfra_call_api` 标的是 `destructiveHint=true`。原因是它会从钱包里扣钱，按 MCP 规范，改变外部状态就该这样标（[MCP 规范：工具](https://modelcontextprotocol.io/specification/2025-11-25/server/tools)）。结果是：在 Gemini 里，每查一次数据都可能弹一次确认。

这是一个真实的两难。标成只读，用户体验顺，但对一个按次扣费的工具不诚实；标成会改变状态，诚实，但每次弹窗。Google 视频里的原话是要「诚实地标」。我们的建议是把扣钱这件事从工具语义里拿出来：用户在 OAuth 授权时就同意一个每月预算，查数工具在预算内按只读标，超预算时返回错误而不是继续扣，这样标只读就是诚实的。这需要服务端有按授权会话的预算控制，EveryInfra 目前没有。

## 一次真实往返：tools/list 和 tools/call 返回了什么

下面是 Gemini 理论上会发给 MCP 服务器的那类请求，我们用 EveryInfra 的 API key 在本机发出，请求头里同样带 `User-Agent: Google`。第一次数据调用在 00:18:30（新加坡时间），查 YouTube 上关于 Gemini Connected Apps 的视频：

```bash
curl -s https://api.everyinfra.com/mcp -A "Google" \
  -H "Authorization: Bearer $EVERYINFRA_API_KEY" \
  -H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -d '{"jsonrpc":"2.0","id":10,"method":"tools/call","params":{"name":"everyinfra_call_api",
       "arguments":{"platform":"youtube","action":"search","params":{"keyword":"Gemini Connected Apps Platform","sort":"relevance","limit":20}}}}'
# 返回（节选）：HTTP 200，8.36 秒，41,840 字节
# {"jsonrpc":"2.0","id":10,"result":{"content":[{"type":"text","text":"{\"platform\":\"youtube\",\"action\":\"search\",
#   \"results\":[{...}, {...}, {\"title\":\"Extend your app to Gemini and Search with the Connected Apps Platform\",
#   \"posted_at\":\"2026-10-29T19:55:04+00:00\",\"view_count\":1265, ...}, ... 共 20 条],
#   \"billing\":{\"charged\":true,\"charged_usd\":0.000556, ...}}"}]}}
```

![代码卡片截图：上半部分是发往 https://api.everyinfra.com/mcp 的 tools/call 请求，工具名 everyinfra_call_api，参数 platform youtube、action search、keyword Gemini Connected Apps Platform、limit 20，标注 2026-11-11 00:18:30 新加坡时间、HTTP 200、8.36 秒、41,840 字节；中间是 JSON-RPC 外壳，结果在 content[0\].text 里；下半部分是解析后的几条视频标题、发布时间和播放量（个人创作者名已隐去），以及 billing 里 charged_usd 0.000556，用青绿框标出。](https://everyinfra.com/articles/gemini-connected-apps-platform-data-tools/img-mcp-response.webp)

一次真实的 MCP 工具调用：结果是 TextContent 里的 JSON，扣费信息也在同一段文本里（个人创作者名和账户余额已隐去）。 [EveryInfra MCP 接口 2026-11-11 原始返回](https://api.everyinfra.com/mcp)

返回的结构正好是 Google 要的：结果是 `content[0].text` 里的一段 JSON，没有 `structuredContent`。每条视频带 22 个字段，包括标题、链接、频道、发布时间、播放量、时长、缩略图和描述片段，和 [YouTube 视频搜索接口页](/youtube-api/search) 列的返回字段一一对应。全部 8 次数据调用列在下面，都发往同一个地址，除了一次字幕走 REST 接口做对照：

| 时间（新加坡时间） | 经 | 能力 | 结果 | 耗时 | 扣费 |
| --- | --- | --- | --- | --- | --- |
| 00:18:30 | MCP | `youtube/search` | 20 条视频 | 8.36 秒 | $0.000556 |
| 00:18:52 | MCP | `reddit/search` | 14 条帖子 | 5.14 秒 | $0.000556 |
| 00:19:08 | MCP | `reddit/comments`（r/mcp 帖） | 5 条评论 | 11.60 秒 | $0.000556 |
| 00:19:20 | MCP | `reddit/comments`（r/GoogleGemini 帖） | 4 条评论 | 9.68 秒 | $0.000556 |
| 00:19:30 | MCP | `reddit/comments`（没有评论的帖子） | 0 条 | 55.66 秒 | $0 |
| 00:22:38 | REST | `youtube/transcript`（讲解视频） | 454 段字幕 | 6.09 秒 | $0.000556 |
| 00:24:28 | MCP | `youtube/comments`（讲解视频） | 2 条评论 | 13.66 秒 | $0.000556 |
| 00:35:03 | MCP | `reddit/search` 按最新排序 | 1 条帖子 | 4.30 秒 | $0.000556 |

![横向条形图，2026 年 11 月 11 日 8 次数据调用的耗时（秒）：youtube/search 8.4；reddit/search 5.1；reddit/comments 第一次 11.6、第二次 9.7、第三次 55.7；youtube/transcript 6.1；youtube/comments 13.7；reddit/search 第二次 4.3。第三次 reddit/comments 那根是青绿色，副标题说明它是一条没有评论的帖子，等了 55.7 秒、0 条、没有扣费，其余 7 次各扣 $0.000556。](https://everyinfra.com/articles/gemini-connected-apps-platform-data-tools/fig-05-latency-bar.zh.light.svg)

耗时中位数 9.0 秒。最慢的一次值得注意：一条没有评论的 Reddit 帖子，等了 55.7 秒才返回 0 条，没有扣费。对 Gemini 来说这意味着两件事。一是 MCP 客户端的超时要够长，Gemini CLI 默认 10 分钟没问题（[Gemini CLI MCP 配置](https://geminicli.com/docs/tools/mcp-server/)），但 Gemini 应用的超时文档没有写，我们没法测。二是空结果不扣费这条规则，让模型「多试一个帖子」的代价只是时间。按次计费的数据工具，关键词和排序方式要先小量试。

出错时的返回也要看，因为 Google 对错误有自己的要求。00:21:27（新加坡时间）我们撞上了这把 key 每分钟 10 次的限速：同一秒里，REST 接口回 HTTP 429，MCP 接口回 HTTP 200 加 `isError: true`，错误码 `rate_limited`，`retry_after` 33 秒，写明没有扣费。00:24:42 不带 key 调工具，同样是 HTTP 200 加 `isError`，错误码 `unauthorized`。MCP 规范允许把工具执行错误放进结果里让模型看到并自我修正；但 Google 的服务器优化页对「终止性」错误另有要求：限速、要重新授权这类模型自己修不好的错误，应该用 JSON-RPC 错误码返回，限速用 -32300（USER_RATE_LIMITED）。EveryInfra 现在的做法对 Claude 和 Cursor 很友好，模型会照 `retry_after` 等一会儿再试；在 Gemini 里，按文档它会被当成一次普通的工具失败。

## 返回体积：模型读的比数据贵

这一节是本文最出乎意料的发现。按次计费的数据工具，开发者通常只盯着数据费；但在 Gemini 这类场景里，返回的 JSON 会整个塞进模型的上下文，模型读它也要钱。

![分组条形图，2026 年 11 月 11 日两次真实搜索返回的字节数：youtube/search 20 条视频原样返回 39,732 字节，只留 6 个字段 5,062 字节；reddit/search 14 条帖子原样 25,212 字节，只留 6 个字段 4,274 字节。只留 6 个字段的条是青绿色，标题说明 youtube/search 降到原来的 12.7%。](https://everyinfra.com/articles/gemini-connected-apps-platform-data-tools/fig-03-payload-bar.zh.light.svg)

`youtube/search` 那次返回的文本有 39,732 字节，其中 20 条结果占 38,825 字节，每条 22 个字段。真正回答「最近有哪些讲 Connected Apps 的视频」需要的只有 6 个：标题、链接、频道、发布时间、播放量、评论数。只留这 6 个字段，体积降到 5,062 字节，是原来的 12.7%。`reddit/search` 那次 14 条帖子 25,212 字节，留标题、链接、社区、时间、点赞和评论数，降到 4,274 字节，是 17.0%。Google 服务器优化页对这个问题也有明确建议：先在服务器端汇总，不要把原始数据整个倒给模型。

![横向条形图，按 2026 年 11 月 11 日单价估算的每次调用费用（美元）：youtube/search 数据费 0.000556；模型读完整返回约 0.00745；模型只读 6 个字段约 0.00095；reddit/search 数据费 0.000556；模型读完整返回约 0.004727；模型只读 6 个字段约 0.000801。数据费的条是青绿色，副标题说明按 4 个字符约 1 个 token、Gemini 3.8 Flash 输入每百万 token $0.75 估算。](https://everyinfra.com/articles/gemini-connected-apps-platform-data-tools/fig-04-cost-bar.zh.light.svg)

换成钱更直观。按 Gemini API 文档「一个 token 约 4 个字符」的估算（[token 说明](https://ai.google.dev/gemini-api/docs/tokens)），`youtube/search` 原样返回约 9,933 个 token；按 Gemini 3.8 Flash 付费档 2026 年 12 月 31 日前每百万输入 token $0.75 的价格（[Gemini API 定价](https://ai.google.dev/gemini-api/docs/pricing)），模型读一遍约 $0.00745，是这次数据费 $0.000556 的 13.4 倍。只留 6 个字段后约 1,266 个 token、$0.00095，是数据费的 1.7 倍。`reddit/search` 从 8.5 倍降到 1.4 倍。这几个倍数都是对 11 月 11 日那次实际扣费算的；11 月 12 日重读目录，`youtube/search` 已调成每次 $0.000778、`reddit/search` 调成 $0.000792，按新价算，`youtube/search` 是 9.6 倍降到 1.2 倍，`reddit/search` 是 6.0 倍降到 1.0 倍。注意这只是模型读一遍工具结果的输入费，没算提示词、对话历史和输出；2027 年 1 月 1 日起 Gemini 3.8 Flash 输入价涨到每百万 $1.50，倍数还要翻一番。

| 能力 | 结果条数 | 原样字节 | 原样估算 token | 模型输入费（估算） | 只留 6 字段 token | 只留 6 字段输入费 | 数据费 |
| --- | --- | --- | --- | --- | --- | --- | --- |
| `youtube/search` | 20 | 39,732 | 9,933 | $0.00745（13.4 倍） | 1,266 | $0.00095（1.7 倍） | $0.000556 |
| `reddit/search` | 14 | 25,212 | 6,303 | $0.004727（8.5 倍） | 1,068 | $0.000801（1.4 倍） | $0.000556 |

在 Gemini 应用里，模型费用是 Google 付的，用户不直接看到；但 Google 服务器优化页把「返回太大」列为影响质量的问题，返回越大，模型越容易在长上下文里丢细节、答得越慢，审核和排序都可能吃亏。在 Gemini API 里自己接 MCP，这笔钱就是你自己付。所以无论走哪条路，数据工具都该给一个「只要这几个字段」的参数，或者干脆提供按任务裁好的工具。

## 工具清单本身也占上下文

模型在调用任何工具之前，先要读完整个工具清单。这部分每轮对话都要付。

![横向条形图，2026 年 11 月 11 日三个入口 tools/list 返回的字节数：/mcp/youtube 3 个工具 4,020 字节；/mcp 12 个工具 16,250 字节；/mcp/all 用 key 连时 24 个工具 32,921 字节。/mcp/youtube 那根是青绿色，副标题说明按 4 个字符约 1 个 token 估算分别约 1,005、4,063、8,230 个 token。](https://everyinfra.com/articles/gemini-connected-apps-platform-data-tools/fig-06-tools-size-bar.zh.light.svg)

00:17 和 00:27（新加坡时间）三次 `tools/list` 的结果：通用入口 `/mcp` 12 个工具、16,250 字节，约 4,063 个 token；按平台分的 `/mcp/youtube` 3 个工具、4,020 字节，约 1,005 个 token；`/mcp/all` 用 key 连时 24 个工具、32,921 字节，约 8,230 个 token。最长的单个工具定义是建工单的 2,958 字节，其次是搜索的 2,640 字节。对一个只想让 Gemini 查 YouTube 的用户来说，连 `/mcp/youtube` 比连 `/mcp` 每轮少读约 3,000 个 token。Gemini API 的 `allowed_tools` 和 Gemini CLI 的 `includeTools` 能在客户端过滤工具，但工具清单通常还是会先完整读一次；在服务器端按场景拆入口，效果更确定。这和上一节的结论是同一个方向：给 Gemini 的工具，越窄越好。

## 数据工具现在能做的：用 Gemini API 和 Gemini CLI 接

如果你的目标是让自己的团队或客户的 agent 在 Gemini 模型上用你的数据，而不是让普通用户在 Gemini 应用里发现你，那今天就能接，不需要审核，也不受美国限制。下面两段都是配置示例，按 Google 文档的字段写，我们没有用 Gemini API key 实际跑过。

Gemini API 的 Interactions 接口支持远程 MCP。文档写明只支持 Streamable HTTP，服务器名不能带短横线，`headers` 会随每个请求发给 MCP 服务器，`allowed_tools` 限定能调哪些工具（[Gemini API 函数调用文档](https://ai.google.dev/gemini-api/docs/function-calling)）。把只读的列能力工具和查数工具放进白名单，其他工具（建工单、取充值链接等）不让模型碰：

```text
# 配置示例：Gemini API Interactions 接 EveryInfra 远程 MCP（未实际运行）
import os
from google import genai

client = genai.Client()
interaction = client.interactions.create(
    model="gemini-3.8-flash",
    input="Find this week's Reddit posts about Gemini custom MCP apps and list the main problems people report.",
    tools=[{
        "type": "mcp_server",
        "name": "everyinfra_youtube_reddit",          # 文档要求不用短横线
        "url": "https://api.everyinfra.com/mcp",
        "headers": {"Authorization": "Bearer " + os.environ["EVERYINFRA_API_KEY"]},
        "allowed_tools": ["everyinfra_list_capabilities", "everyinfra_call_api", "everyinfra_get_job"],
    }],
)
```

Gemini CLI 在 `settings.json` 的 `mcpServers` 里配置，`httpUrl` 走 Streamable HTTP，`headers` 可以带请求头，`includeTools` 是工具白名单，`timeout` 默认 600,000 毫秒，`trust` 设成 true 会跳过所有确认，所以对会扣费的工具建议保持 false（[Gemini CLI MCP 配置](https://geminicli.com/docs/tools/mcp-server/)）。同一份文档提醒不要把密钥硬写进配置文件；下面用占位符表示，实际使用时按文档的环境变量写法替换：

```text
{
  "mcpServers": {
    "everyinfraYoutube": {
      "httpUrl": "https://api.everyinfra.com/mcp/youtube",
      "headers": { "Authorization": "Bearer <你的 EveryInfra API key>" },
      "includeTools": ["everyinfra_list_capabilities", "everyinfra_call_api"],
      "timeout": 120000,
      "trust": false
    }
  }
}
```

这两条路有两个共同的好处。一是 API key 能直接用，不需要为 Google 单独做 OAuth。二是工具白名单在你手里，可以只放查数工具，确认弹窗也由你的程序决定。代价是：没有 Gemini 应用里的分发，普通用户不会在 @ 列表里看到你。数据工具的使用者大多是开发者、分析师和自己搭 agent 的团队，对他们来说这条路已经够用。这里各平台的参数和返回字段可以在 [YouTube 数据接口](/youtube-api) 和 [Reddit 数据接口](/reddit-api) 两页查到，评论和字幕见 [Reddit 评论接口页](/reddit-api/comments)、[YouTube 评论接口页](/youtube-api/comments) 和 [YouTube 字幕接口页](/youtube-api/transcript)。

## 想上架 Connected Apps 要先改什么

如果你的服务本来就有用户账号，用户在你这里有自己的数据（订单、项目、收藏、监测任务），上架 Connected Apps 是值得的。Google 的质量页把「用户登录后体验更好」列为好应用的第一个特征，同时说明连接应用不是数据源的替代品，也不是给「通用的、无需登录就能拿到的信息」用的（[质量页，2026-10-28 更新](https://developers.google.com/connected-apps/mcp/quality)）。这一句对公开数据工具影响很大：如果你的工具只是「搜 YouTube 上的公开视频」，审核员很可能会问用户为什么要登录你的应用来做这件事。反过来，如果工具做的是「看我自己设的品牌监测任务这周抓到了什么」「把我收藏的竞品帖子按情绪分组」，就是用户自己的数据，正好对口。

政策和平台条款也要提前对照。Connected Apps 政策不允许转包或重新包装不属于你的第三方 API；各平台自己的条款，比如 YouTube API 服务的开发者政策（[YouTube 开发者政策](https://developers.google.com/youtube/terms/developer-policies)）和 Reddit 的数据 API 条款（[Reddit 数据 API 条款](https://redditinc.com/policies/data-api-terms)），对数据怎么展示、怎么存储都有自己的要求。上架前要能讲清楚你的工具在原始数据之上做了什么：汇总、去重、打分、长期存储、按用户的任务组织。只有这部分是你自己的。

按本文前面的对照，一个数据 MCP 要上架，最少要改这几件事：开 OAuth 的动态客户端注册，并把 Google 的回调地址加进允许名单；把通用分发工具拆成按任务命名、参数写死的几个工具，取值写 enum；查数工具按只读标，扣费由授权时的预算控制；限速和要重新授权改用 JSON-RPC 错误码；返回只给模型需要的字段；时间统一成 ISO 格式；在 `/.well-known/google-connected-apps` 放验证文件。Google 的界面指南还要求 MCP Apps 的界面符合 WCAG AA 对比度、最小字号 13pt（[界面指南，2026-10-28 更新](https://developers.google.com/connected-apps/mcp/guidelines)），如果你打算做交互卡片，也要提前按这个做。开发阶段可以先用 MCP Inspector 本地调试（[MCP Inspector](https://github.com/modelcontextprotocol/inspector)），再按讲解视频的做法部署到 Cloud Run 这类公网 HTTPS 服务上测（[Cloud Run 部署文档](https://cloud.google.com/run/docs/deploying)）。

这几件事里，工具拆分最容易低估，拿 `/mcp/youtube` 举个例子。它现在有 3 个工具：免费的 `everyinfra_list_capabilities`、只读的 `everyinfra_get_job`，以及真正查数的 `everyinfra_call_api`，后者的 `platform` 永远是 youtube，`action` 和 `params` 都是自由填写。按 Google 的写法，应该把常用的几项能力各自做成一个工具：`search_youtube_videos` 只收关键词、排序和条数，排序写成 enum；`get_youtube_comments` 只收视频链接和条数；`get_youtube_transcript` 只收视频链接。每个工具的说明里写清楚返回哪些字段、时间是什么格式、什么情况会回空结果。这样做之后，`list_capabilities` 这个「先查目录」的工具就可以不放进上架版本，模型也不用先读一遍目录再决定怎么调。代价是能力一多，工具数很快会逼近 Google 说的「几十个」，所以上架版本只能挑最常用的几项，其余能力留在 Claude、Cursor 这些客户端用的通用入口里。

错误码的改法相对简单。现在限速时，MCP 接口回 HTTP 200，结果里 `isError: true`，正文写着错误码、要等多少秒、没有扣费；Google 要的是把这类模型自己修不好的错误放到 JSON-RPC 的 `error` 对象里，`code` 写 -32300，等待时间和是否扣费可以放进 `error.data`。参数写错、能力名拼错这类模型能自己改的错误，继续放在结果里返回更好，因为模型能读到「你是不是想要 search」这类提示，下一次就调对了。两类错误分开处理，对 Claude、Cursor 和 Gemini 都不会变差。

预算控制是改动最大的一项，也最值得先想清楚。用户在 OAuth 授权页上就看到「这个应用每月最多花多少」，同意后授权会话带着这个上限；查数工具每次调用前先核剩余额度，够就照常查、照常扣，不够就直接返回终止性错误，并在错误说明里告诉用户去哪里调高上限。这样查数工具在额度内的行为就是「读数据、不改别的东西」，按只读标才说得过去，Gemini 也就不会每次都弹确认。

Google 的垂直场景页列了一批它想要的应用类型，比如音乐、内容创作、生鲜（配合通用电商协议）、房产等，每一类都写了期望的用户旅程（[垂直场景，2026-10-28 更新](https://developers.google.com/connected-apps/mcp/vertical-journeys)）。数据分析和社媒监测不在现有列表里。这不等于不能上，但意味着类别要从现有的里面选，审核员对「这类应用该做什么」没有现成的参照。

## 每月花多少钱：一个小例子

假设一个团队用 Gemini API 加 EveryInfra 远程 MCP，每天让 agent 做一份「Gemini 开发者动态」：搜一次 YouTube、搜一次 Reddit、读 3 个热帖的评论、读 1 个视频的评论，每天 6 次数据调用。按 2026 年 11 月 12 日重读的目录价格，`youtube/search` 每次 $0.000778，`reddit/search` 和 `reddit/comments` 每次 $0.000792，`youtube/comments` 每次 $0.000556，一个月 30 天 180 次，数据费约 $0.1351（11 月 11 日实测时这 4 种能力都是每次 $0.000556，同样用量是 $0.1001）。价格以 [定价页](/pricing) 为准。

| 项目 | 每天 | 每月（30 天） | 说明 |
| --- | --- | --- | --- |
| EveryInfra 数据费 | $0.000778 + 4 × $0.000792 + $0.000556 | 约 $0.1351 | `youtube/search`、`reddit/search`、`reddit/comments` 3 次、`youtube/comments` |
| 模型读两次搜索的原样返回（估算） | $0.00745 + $0.004727 | 约 $0.3653 | Gemini 3.8 Flash 输入价，只算工具结果 |
| 模型读两次搜索的 6 字段返回（估算） | $0.00095 + $0.000801 | 约 $0.0525 | 同上 |
| 工具清单（`/mcp`，估算） | 约 4,063 token × 每轮 | 按轮数算 | 换成 `/mcp/youtube` 每轮约 1,005 token |

这张表说明的是比例，不是总账：只看两次搜索，模型读原样返回一个月约 $0.3653，是全月数据费的 2.7 倍；裁成 6 个字段后约 $0.0525，比数据费还低。空结果不扣费这一条在实际运行中也有用：本文 8 次调用里有 1 次是空结果，没有扣费。11 月 11 日实测这 8 次数据调用合计扣费 $0.003892。

## 做不了或要注意的地方

第一，Gemini 应用里的超时、确认弹窗的具体样子、审核要多久，文档都没写。讲解视频说确认会按风险调整，但没有给出判断规则。第二，Google 的回调地址、IP 网段、支持的 MCP 版本都可能在预览期变化，上架前要按页面底部的更新日期重新核对。第三，token 数是按 4 个字符约 1 个 token 估的，实际分词会有出入，模型费用只看比例。第四，本文 EveryInfra 一侧的耗时和返回体积都是 11 月 11 日那一轮真调的结果，价格按 11 月 12 日重读的目录写；接入前按接口页和目录重新核对一遍。

## 常见问题

### Gemini Connected Apps Platform 要钱吗？

Google 的博客、产品主页和 Console 文档都没有提到注册或上架费用，也没有说按调用收费（[产品主页](https://developers.google.com/connected-apps)）。你自己的服务器、托管和数据成本照常由你承担。如果改走 Gemini API 自己接 MCP，模型调用按 [Gemini API 定价](https://ai.google.dev/gemini-api/docs/pricing) 付费。

### 不在美国能用 Connected Apps Platform 吗？

目前不能。讲解视频说预览只对美国开发者开放；用户侧的自定义应用要求在美国，搜索 AI 模式里的连接应用也只在美国英文环境（[Gemini 帮助](https://support.google.com/gemini/answer/17209137?hl=en)、[搜索帮助](https://support.google.com/websearch/answer/17265703)）。不在美国的团队可以先走 Gemini API 或 Gemini CLI。

### 有没有 Gemini Connected Apps Platform API？

没有单独的一套 API。Connected Apps Platform 的接口就是 MCP：你提供一个远程 MCP 服务器，Gemini 和搜索作为 MCP 客户端来调你（[MCP 开发者指南](https://developers.google.com/connected-apps/mcp)）。注册、测试、提交在 Connected Console 网页里做，文档没有提到管理用的 API。想在程序里用 Gemini 调 MCP，是 Gemini API 的 `mcp_server` 工具，属于另一条路。

### 我的 MCP 服务器在 Claude 里能用，为什么 Gemini 连不上？

最常见的三个原因：协议版本高于 2025-11-25；OAuth 元数据缺 `registration_endpoint`，或者没有把 Google 的回调地址加进允许名单；服务器只认 API key 请求头。可以先对照 Google 的排错页，它列了 405、缺少受保护资源元数据、缺授权服务器元数据、注册失败等常见报错（[排错页](https://developers.google.com/connected-apps/gpc/troubleshooting)）。

### 只认 API key 的服务器，能先放进开发者模式里试吗？

不能直接试。开发者模式的认证一栏只有不鉴权和两种 OAuth 注册方式，没有地方填请求头（[开发者模式使用说明](https://developers.google.com/connected-apps/mcp/dev-mode/usage)）。如果只是想看 Gemini 怎么读你的工具清单、会不会弹确认，可以单独起一个不鉴权的测试地址，里面只放不扣费、不碰用户数据的工具，比如列能力和查文档；测完就关掉，不要让这个地址长期在公网上。真正要扣费的查数工具，还是要等 OAuth 和预算控制做好以后，再放进开发者模式里测。开发者模式只有建应用的那个账号能用，而且账号要满足美国、18 岁以上、个人账号这些条件，不在美国的团队目前只能在 Gemini API 和 Gemini CLI 里先把工具本身调顺。

## 上手：先在自己的程序里跑通

1. 在 EveryInfra 控制台建一把 API key，按 [快速开始](/docs#quickstart) 用 curl 发一次 `tools/list` 和一次 `tools/call`，确认返回里有 `billing`。各客户端的远程 MCP 配置见 [MCP 服务器页](/mcp-server)。
1. 选一个窄的入口，比如只用 YouTube 就连 `/mcp/youtube`，工具清单从约 4,063 个 token 降到约 1,005 个。
1. 在 Gemini API 的 `mcp_server` 或 Gemini CLI 的 `mcpServers` 里配置，用 `allowed_tools` 或 `includeTools` 只放查数工具。
1. 先用一个关键词、小的 `limit` 跑一次，看返回大小，在提示词里要求模型只读需要的字段。
1. 如果你有自己的用户账号体系、打算上架 Connected Apps，按上文「要先改什么」一节逐条改，再在开发者模式里自测。

YouTube 和 Reddit 的搜索参数见 [YouTube 视频搜索接口页](/youtube-api/search) 和 [Reddit 帖子搜索接口页](/reddit-api/search)。在其他云平台上做同样的事，可以对照 [Bedrock AgentCore Gateway 接 MCP 的返回格式与账单](/blog/bedrock-agentcore-gateway-mcp-social-data) 和 [用 Airbyte MCP 搭社交数据 agent](/blog/airbyte-mcp-social-data-agent)。

## 参考资料

Google 一侧的页面都在 2026 年 11 月 11 日（新加坡时间）读取；括号里是页面自己写的发布或更新日期，没有写的不标。EveryInfra 一侧的数字来自同一天的真调原始返回。

1. Google 博客：Connected Apps Platform: bring your apps to Gemini and Search（2026-10-28） <https://blog.google/innovation-and-ai/technology/developers-tools/connected-apps-one-place>
1. Google for Developers：Connected Apps Platform 产品主页 <https://developers.google.com/connected-apps>
1. Google for Developers：Connected Apps Platform MCP server developer guide（2026-10-27 更新） <https://developers.google.com/connected-apps/mcp>
1. Google for Developers：MCP request flow（2026-10-27 更新） <https://developers.google.com/connected-apps/mcp/mcp-flow>
1. Google for Developers：Quality guidelines for connected apps（2026-10-28 更新） <https://developers.google.com/connected-apps/mcp/quality>
1. Google for Developers：MCP server optimization（2026-10-27 更新） <https://developers.google.com/connected-apps/mcp/server-optimization>
1. Google for Developers：MCP Apps UI guidelines（2026-10-28 更新） <https://developers.google.com/connected-apps/mcp/guidelines>
1. Google for Developers：Vertical user journeys（2026-10-28 更新） <https://developers.google.com/connected-apps/mcp/vertical-journeys>
1. Google for Developers：OAuth 2.1 implementation guide（2026-09-14 更新） <https://developers.google.com/connected-apps/mcp/oauth>
1. Google for Developers：Developer Mode（2026-10-28 更新） <https://developers.google.com/connected-apps/mcp/dev-mode>
1. Google for Developers：Use Developer Mode（2026-10-28 更新） <https://developers.google.com/connected-apps/mcp/dev-mode/usage>
1. Google for Developers：Google Connected Console 概览 <https://developers.google.com/connected-apps/gpc>
1. Google for Developers：Prerequisites for using connected apps（2026-10-30 更新） <https://developers.google.com/connected-apps/gpc/prerequisites>
1. Google for Developers：Perform the steps in Google Connected Console（2026-10-28 更新） <https://developers.google.com/connected-apps/gpc/perform-the-steps>
1. Google for Developers：Troubleshooting（2026-10-27 更新） <https://developers.google.com/connected-apps/gpc/troubleshooting>
1. Google for Developers：Connected apps policy（2026-11-02 更新） <https://developers.google.com/connected-apps/connected-apps-policy>
1. Gemini 帮助中心：Connect custom apps to Gemini <https://support.google.com/gemini/answer/17209137?hl=en>
1. Gemini 帮助中心：Use & manage Connected Apps in Gemini <https://support.google.com/gemini/answer/13695044?hl=en>
1. Gemini 帮助中心：Check the availability & requirements of Connected Apps <https://support.google.com/gemini/table/17434654>
1. Google 搜索帮助：Use & manage Connected Apps in Search <https://support.google.com/websearch/answer/17265703>
1. Gemini 应用发布说明（2026.10.13 条目） <https://gemini.google/release-notes/>
1. Google 博客：New connected apps roll out to Gemini（2026-09-23） <https://blog.google/innovation-and-ai/products/gemini-app/new-connected-apps-gemini>
1. Android Developers 频道：Extend your app to Gemini and Search with the Connected Apps Platform（2026-10-29） <https://www.youtube.com/watch?v=-4G-4w9FKDw>
1. 9to5Google：Google adding more Connected Apps to Gemini and Search（2026-10-28） <https://9to5google.com/2026/10/28/gemini-google-connected-apps-platform>
1. Model Context Protocol：Specification 2025-11-25 <https://modelcontextprotocol.io/specification/2025-11-25>
1. Model Context Protocol：Authorization（2025-11-25） <https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization>
1. Model Context Protocol：Tools（2025-11-25） <https://modelcontextprotocol.io/specification/2025-11-25/server/tools>
1. Model Context Protocol：Specification 2026-07-28 <https://modelcontextprotocol.io/specification/2026-07-28>
1. IETF RFC 9728：OAuth 2.0 Protected Resource Metadata <https://www.rfc-editor.org/rfc/rfc9728>
1. IETF RFC 8414：OAuth 2.0 Authorization Server Metadata <https://www.rfc-editor.org/rfc/rfc8414>
1. IETF RFC 7591：OAuth 2.0 Dynamic Client Registration Protocol <https://www.rfc-editor.org/rfc/rfc7591>
1. IETF RFC 7636：Proof Key for Code Exchange <https://www.rfc-editor.org/rfc/rfc7636>
1. IETF 草案：OAuth Client ID Metadata Document <https://datatracker.ietf.org/doc/draft-ietf-oauth-client-id-metadata-document/>
1. GitHub：modelcontextprotocol/inspector <https://github.com/modelcontextprotocol/inspector>
1. Gemini API 文档：Function calling（Remote MCP 一节） <https://ai.google.dev/gemini-api/docs/function-calling>
1. Gemini API 发布说明（2026-11-10 条目） <https://ai.google.dev/gemini-api/docs/changelog>
1. Gemini API 定价 <https://ai.google.dev/gemini-api/docs/pricing>
1. Gemini API 文档：Understand and count tokens <https://ai.google.dev/gemini-api/docs/tokens>
1. Gemini CLI 文档：MCP servers with the Gemini CLI <https://geminicli.com/docs/tools/mcp-server/>
1. Android Developers：Overview of AppFunctions <https://developer.android.com/ai/appfunctions>
1. Google Identity：OAuth-based Account Linking <https://developers.google.com/identity/account-linking/oauth-linking>
1. Google Cloud 文档：Deploying to Cloud Run <https://cloud.google.com/run/docs/deploying>
1. Google：User-triggered agents IP ranges（JSON） <https://developers.google.com/static/crawling/ipranges/user-triggered-agents.json>
1. YouTube API Services：Developer Policies <https://developers.google.com/youtube/terms/developer-policies>
1. Reddit：Data API Terms <https://redditinc.com/policies/data-api-terms>
1. Google AI 开发者论坛：Gemini app custom apps MCP OAuth never exchanges the code（2026-10-02） <https://discuss.ai.google.dev/t/gemini-app-spark-custom-apps-mcp-oauth-never-exchanges-the-code-cannot-complete-request-on-oauth-redirect-googleusercontent-com/186405>
1. Reddit r/mcp：custom connectors - gemini（2026-10-19） <https://www.reddit.com/r/mcp/comments/1xaba94/custom_connectors_gemini/>
1. Reddit r/GeminiAI：Gemini now supports general MCP servers <https://www.reddit.com/r/GeminiAI/comments/1wwe3u1/gemini_now_supports_general_mcp_servers/>
1. Reddit r/GeminiAI：Gemini App adding custom Connectors（2026-10-22） <https://www.reddit.com/r/GeminiAI/comments/1xcbzub/gemini_app_adding_custom_connectors/>
1. Reddit r/modelcontextprotocol：How I got one stock market data MCP server into Claude, ChatGPT, Cursor, Codex and Gemini CLI（2026-10-17） <https://www.reddit.com/r/modelcontextprotocol/comments/1x8lxcq/how_i_got_one_stock_market_data_mcp_server_into/>
1. Reddit r/GoogleGemini：MCP with Gemini（2026-10-28） <https://www.reddit.com/r/GoogleGemini/comments/1xhword/mcp_with_gemini/>
1. EveryInfra：远程 MCP 接口（2026-11-11 真调） <https://api.everyinfra.com/mcp>
1. EveryInfra：/mcp/all 受保护资源元数据（2026-11-11 读取） <https://api.everyinfra.com/.well-known/oauth-protected-resource/mcp/all>
1. EveryInfra：授权服务器元数据（2026-11-11 读取） <https://auth.everyinfra.com/oidc/.well-known/oauth-authorization-server>
1. EveryInfra：数据能力目录（2026-11-11、2026-11-12 读取） <https://api.everyinfra.com/api/v1/social/catalog>
