agy-web-search-mcp
README.md
# agy-web-search MCP
独立的 Streamable HTTP MCP:把 agy 的 Google 登录做成可部署的 `/mcp` 端点。Agent 里的名称是 `agy`,工具是 `search_web`(网页搜索)和 `generate_image`(生成图片)。本地、Cloudflare Workers、Vercel Edge 共用同一套 handler。
先部署,再打开网站用 Google 登录拿 session。服务端不必事先写入 `AGY_REFRESH_TOKEN`。
## 一键部署
[](https://deploy.workers.cloudflare.com/?url=https://github.com/zhangsanfeng1094/agy-web-search-mcp)
[](https://vercel.com/new/clone?repository-url=https://github.com/zhangsanfeng1094/agy-web-search-mcp&project-name=agy-web-search-mcp&repository-name=agy-web-search-mcp&env=MCP_AUTH_TOKEN&envDescription=Optional%20Bearer%20token%20that%20protects%20/mcp)
内置了 agy 桌面端 OAuth 客户端,部署完直接打开网站 **Sign in with Google**。不必再填 `AGY_OAUTH_CLIENT_ID` / `AGY_OAUTH_CLIENT_SECRET`。
可选:设一个 `MCP_AUTH_TOKEN`,保护公开的 `/mcp`。Cloudflare 更合适:搜索经常超过 Vercel Hobby 的 10s 超时。
## Cloudflare Workers
```bash
npx wrangler login
npx wrangler secret put MCP_AUTH_TOKEN # 可选:自己生成一个 Bearer,保护 /mcp
npx wrangler deploy
```
打开 `https://agy-web-search-mcp.<subdomain>.workers.dev/`,点 **Sign in with Google**。
agy 用的是桌面端 OAuth 客户端,只能回调 `http://localhost:51121/oauth-callback`。授权后那个页面会打不开,把地址栏完整 URL 贴回网站。登录成功后 session 写在这个浏览器的 `localStorage`,首页会显示已登录,并给出带 `X-Agy-Refresh-Token` 的 Grok 配置。
上线 MCP:`https://agy-web-search-mcp.<subdomain>.workers.dev/mcp`
首页监控在 Cloudflare 上记到 Durable Object,Grok 调 `/mcp` 之后刷新网站能看到成功/失败/耗时。本地 `bun run dev` 仍是进程内存。
## Vercel
```bash
npx vercel env add MCP_AUTH_TOKEN # 可选
npx vercel --prod
```
Hobby 默认 10s 超时,搜索偶尔会不够;Cloudflare 更合适。
## 本地
```bash
bun run dev
```
打开 `http://127.0.0.1:8787/` 登录。本机回调由服务自己接住。如果本机已经 `agy` 登录过,也会自动读 `~/.gemini/antigravity-cli/antigravity-oauth-token`。
侧边栏 **工具测试** 可以直接调 `search_web` / `generate_image`(和 Agent 一样 `POST /mcp`),不必先配 MCP 客户端。生图支持上传本地参考图,浏览器会读成 base64。调用会出现在监控里。
## Grok
登录成功后首页点 **一键复制**,把 prompt 贴给 Agent,让它写入 MCP 配置。token 来自这个浏览器的 `localStorage`。远程一般是:
```toml
[mcp_servers.agy]
url = "https://agy-web-search-mcp.<subdomain>.workers.dev/mcp"
headers = { Authorization = "Bearer ${AGY_MCP_TOKEN}", "X-Agy-Refresh-Token" = "${AGY_REFRESH_TOKEN}" }
```
`AGY_MCP_TOKEN` 就是 `MCP_AUTH_TOKEN`。页面 storage 只给网页自己用;Grok 调 `/mcp` 时必须带 header。也可以事后 `wrangler secret put AGY_REFRESH_TOKEN`,这样 Grok 就不用带 `X-Agy-Refresh-Token`。
本地:
```toml
[mcp_servers.agy]
url = "http://127.0.0.1:8787/mcp"
```
## 可选:从本机 agy 文件导入
```bash
bun run import-agy
```
从 token 文件抽出 `refresh_token`,写入 `.dev.vars`(已 gitignore)。
## 环境变量
| 变量 | 作用 |
| --- | --- |
| `AGY_OAUTH_CLIENT_ID` | 可选。覆盖内置的 agy 桌面端 OAuth client id |
| `AGY_OAUTH_CLIENT_SECRET` | 可选。覆盖内置的 agy 桌面端 OAuth client secret |
| `AGY_OAUTH_REDIRECT_URI` | 可选。自己的 Web 客户端回调,例如 `https://xxx.workers.dev/oauth/callback`,部署后即可自动回跳 |
| `AGY_REFRESH_TOKEN` | 可选。服务端保存的 Google refresh token |
| `MCP_AUTH_TOKEN` | 保护 `/mcp` 的 Bearer |
| `AGY_SEARCH_PROJECT` | 默认 `default-cli-project` |
| `AGY_SEARCH_MODEL` | 默认 `gemini-3.6-flash-high` |
| `AGY_IMAGE_MODEL` | 可选。覆盖 `fetchAvailableModels` 里的生图模型,默认 `gemini-3.1-flash-image` |
| `AGY_OAUTH_TOKEN_PATH` | 本地 token 文件覆盖路径 |
This server cannot be deployed
Maintenance
ActivitySlowing
ResponsivenessNo issues