使用说明
谷歌广告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 .
烟雾检查
- 元数据:
curl -s http://localhost:8080/.well-known/oauth-protected-resource | jq - 未经授权的MCP:
curl -i http://localhost:8080/mcp→ 预期401和WWW-Authenticate和resource_metadata - 授权 (真正的职员持票人令牌):通过您的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/--承载身份验证、日志记录、上下文中的用户idinternal/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工具