Google Ads MCP服务器

Google Ads的模型上下文协议服务器,作为OAuth 2.1资源服务器,验证JWT令牌并代理Google Ads API请求。

  • by juanesmb
  • Go
  • 本地部署
  • 更新于
在 GitHub 查看 juanesmb/google-ads-mcp-server

使用说明

谷歌广告MCP服务器

谷歌广告的模型上下文协议(MCP)服务器。该服务器充当 OAuth 2.1资源服务器:客户端发送 文员JWT (Authorization: Bearer).服务器验证令牌,然后调用您的 mcp广告经理 具有共享秘密的网关,以使用用户存储的OAuth令牌运行Google Ads API请求。

建筑

  • 职员 为MCP客户发布JWT。配置 CLERK_AUDIENCE 到规范的MCP资源URL(与相同的主机/路径 PUBLIC_BASE_URL + MCP_SERVER_PATH).
  • 谷歌广告mcp 验证JWT(JWKS)并公开 RFC 9728 元数据在 /.well-known/oauth-protected-resource (可流式传输HTTP的路径后缀变体)。
  • 网关 (GATEWAY_BASE_URL)持有Google OAuth刷新令牌并代理Google Ads API调用(例如。 googleAds:search, customers:listAccessibleCustomers)使用开发者令牌。MCP从不将Clerk令牌转发给谷歌。

接收对MCP路径的未经身份验证的请求 401 和 WWW-Authenticate: Bearer resource_metadata="...".

所需的环境变量

变量 目的
CLERK_JWKS_URL JWT验证的JWKS URL
CLERK_ISSUER 预期JWT iss
CLERK_AUDIENCE 预期JWT aud (MCP资源标识符)
GATEWAY_BASE_URL mcp广告管理器的基本URL(例如。 https://app.example.com)
GATEWAY_INTERNAL_SECRET 必须与网关匹配 x-gateway-secret 对于内部路线

可选:

变量 目的
PUBLIC_BASE_URL 此MCP的公共来源(用于元数据 resource 和 resource_metadata URL)。如果未设置,则从请求中导出。
AUTHORIZATION_SERVER_URL 元数据的OAuth授权服务器(默认为 CLERK_ISSUER)
MCP_REQUIRED_SCOPE 如果设置,JWT必须包括此范围
MCP_DEBUG_AUTH 设置为 true 详细的身份验证日志(每个请求的详细信息,未经验证的JWT声明在失败时偷看)
GATEWAY_CONNECT_URL / JUMON_CONNECT_URL 未连接Google时显示的URL(默认为 {GATEWAY_BASE_URL}/connections)
MCP_SERVER_HOST, PORT, MCP_SERVER_PATH HTTP绑定和MCP路径(默认值: 0.0.0.0, 8080, /mcp)

旧别名: JUMON_GATEWAY_BASE_URL, JUMON_GATEWAY_INTERNAL_SECRET 用于网关URL和密钥。

云运行

集 PORT 并监听所有接口。当谷歌设置 K_SERVICE (始终在Cloud Run上),此服务器 力量 MCP_SERVER_HOST 到 0.0.0.0 真是大错特错 127.0.0.1 或 localhost bind不能破坏平台健康检查。你 必须 提供与上表中相同的所需变量,尤其是 CLERK_JWKS_URL, CLERK_ISSUER, GATEWAY_BASE_URL,以及 GATEWAY_INTERNAL_SECRET (通常通过 秘密).集 PUBLIC_BASE_URL 到您的服务URL(例如 https://<name>-<hash>-<region>.run.app)因此OAuth元数据是稳定的。JWKS加载在需要JWT验证的第一个请求上,因此启动不会被Clerk的出站获取阻止。

部署最新 main 来自此repo (不仅仅是total_count修复)。以前称为Clerk JWKS的旧版本 ListenAndServe,这可能会阻止容器打开 PORT 在启动期间。

在本地运行

export CLERK_JWKS_URL="https://clerk.example.com/.well-known/jwks.json"
export CLERK_ISSUER="https://clerk.example.com"
export CLERK_AUDIENCE="https://your-mcp-host/mcp"
export GATEWAY_BASE_URL="http://localhost:3000"
export GATEWAY_INTERNAL_SECRET="your-gateway-secret"
export PUBLIC_BASE_URL="http://localhost:8080"

go run .

烟雾检查

  1. 元数据: curl -s http://localhost:8080/.well-known/oauth-protected-resource | jq
  2. 未经授权的MCP: curl -i http://localhost:8080/mcp → 预期 401 和 WWW-Authenticate 和 resource_metadata
  3. 授权 (真正的职员持票人令牌):通过您的MCP客户端调用工具 Authorization: Bearer <token>

MCP工具(帐户列表)

工具 目的
list_ad_accounts 连接的谷歌用户可以访问的客户(ListAccessibleCustomers).不 customer_id.
list_client_accounts_under_manager GAQL customer_client 行下a 经理(MCC) customer_id (遗留层次结构列表)。

存储库布局

  • internal/app/configs/ --服务器、身份验证、网关环境
  • internal/infrastructure/security/ --文员JWT验证
  • internal/infrastructure/middleware/ --承载身份验证、日志记录、上下文中的用户id
  • internal/infrastructure/api/gateway/ --网关HTTP客户端(连接检查、代理、刷新)
  • internal/infrastructure/api/*/ --GAQL+响应映射
  • internal/tools/listaccessiblecustomers/ — list_ad_accounts 工具
  • internal/tools/listadaccounts/ — list_client_accounts_under_manager 工具
  • internal/tools/*/ --其他MCP工具