{"id":49994951,"url":"https://github.com/everyapi-ai/everyapi-ai","last_synced_at":"2026-05-29T01:01:54.726Z","repository":{"id":358446979,"uuid":"1241428050","full_name":"everyapi-ai/everyapi-ai","owner":"everyapi-ai","description":"EveryAPI CLI: Claude Code / Codex / Gemini CLI integration + MCP server (go-installable mirror, releases hosted here)","archived":false,"fork":false,"pushed_at":"2026-05-22T10:01:11.000Z","size":558,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-22T11:31:15.129Z","etag":null,"topics":["ai-gateway","claude-code","cli","golang","llm","mcp","relaya"],"latest_commit_sha":null,"homepage":"https://everyapi.ai","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/everyapi-ai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-17T11:30:30.000Z","updated_at":"2026-05-22T10:01:15.000Z","dependencies_parsed_at":"2026-05-22T04:01:02.752Z","dependency_job_id":null,"html_url":"https://github.com/everyapi-ai/everyapi-ai","commit_stats":null,"previous_names":["relaya-ai/relaya-ai","everyapi-ai/everyapi-ai"],"tags_count":32,"template":false,"template_full_name":null,"purl":"pkg:github/everyapi-ai/everyapi-ai","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/everyapi-ai%2Feveryapi-ai","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/everyapi-ai%2Feveryapi-ai/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/everyapi-ai%2Feveryapi-ai/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/everyapi-ai%2Feveryapi-ai/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/everyapi-ai","download_url":"https://codeload.github.com/everyapi-ai/everyapi-ai/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/everyapi-ai%2Feveryapi-ai/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33632271,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-28T02:00:06.440Z","response_time":99,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai-gateway","claude-code","cli","golang","llm","mcp","relaya"],"created_at":"2026-05-19T07:13:05.580Z","updated_at":"2026-05-29T01:01:54.717Z","avatar_url":"https://github.com/everyapi-ai.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# `everyapi` CLI\n\n[EveryAPI](https://everyapi.ai) AI API 网关的 buyer onboarding CLI。让任何 Claude Code / Codex / Gemini CLI **一分钟内**接到网关。\n\n状态：**v1 已收口** —— buyer onboarding、seller 命令（plain-key + OAuth 三家）、sanitizer proxy、QR sign-in 主路径、防钓鱼分层均已落地。仍未实现的只有 OS 级 code signing 与 platform keychain backend（见文末「这个二进制还不包含什么」）。\n\n## 安装\n\n当前要么 clone + 自行 build，要么等 `v*` tag 后从 GitHub Release 拉二进制。\n\n```bash\ngit clone https://github.com/everyapi-ai/everyapi-ai\ncd everyapi-ai\ngo build -o everyapi .\n```\n\n或者直接走 Go install：\n\n```bash\ngo install github.com/everyapi-ai/everyapi-ai@latest\n# 二进制落在 $(go env GOPATH)/bin/everyapi\n```\n\n或者 Homebrew tap（待 v* tag 推出）：\n\n```bash\n# 首次安装\nbrew tap everyapi-ai/tap         # 一次性挂上 tap\nbrew install everyapi\n\n# 之后升级 — 注意必须先 `brew update`\nbrew update                    # 刷新 tap formula 拿到最新版本号\nbrew upgrade everyapi\n```\n\n\u003e ⚠️ **必须先 `brew update`**：单跑 `brew upgrade everyapi` 用的是本地缓存的 formula，会显示「already installed」即使 release 已经有新版。`brew update` 拉 tap repo 最新 formula 再 upgrade 才能跨版本。\n\u003e\n\u003e Homebrew 短语法 `brew install everyapi-ai/tap/everyapi` 同样能用——它内部会替你 tap，但显式 `tap` 一次能让后续 `brew upgrade` / `brew uninstall` 不必每次都写完整 path。\n\n### 从 GitHub Release 拉二进制 — 务必校验\n\nV1 还没做 OS 级 code signing（macOS notarization / Windows Authenticode），但**每次 release 都附带 `SHA256SUMS` 文件**，下载后请校验对得上：\n\n```bash\n# Linux / macOS\ncurl -LO https://github.com/everyapi-ai/everyapi-ai/releases/download/v0.1.0/everyapi_linux_amd64.tar.gz\ncurl -LO https://github.com/everyapi-ai/everyapi-ai/releases/download/v0.1.0/SHA256SUMS\nsha256sum -c SHA256SUMS --ignore-missing\n# everyapi_linux_amd64.tar.gz: OK\n\n# Windows PowerShell\n$expected = (Get-Content SHA256SUMS | Select-String \"everyapi_windows_amd64.zip\").ToString().Split()[0]\n$actual = (Get-FileHash everyapi_windows_amd64.zip -Algorithm SHA256).Hash.ToLower()\nif ($expected -ne $actual) { throw \"checksum mismatch\" } else { \"OK\" }\n```\n\n如果 `SHA256SUMS: FAILED`，**不要解压、不要运行**，到 Issue tracker 报告 + 检查你的下载源是否被劫持。\n\n## 命令\n\n| 命令 | 作用 |\n|---|---|\n| `everyapi login` | 当前设备登录 EveryAPI |\n| `everyapi logout` | 清除本设备凭证 |\n| `everyapi status` | 查看余额、使用量、配额 |\n| `everyapi topup` | 打开充值页（带反钓鱼暗号 phrase 验证） |\n| `everyapi use \u003ctool\u003e` | 配好 env 并 exec 进第三方 CLI（指向 EveryAPI） |\n| `everyapi seller \u003csub\u003e` | Marketplace 卖家端命令（list / withdraw / add-key / setup） |\n| `everyapi mcp` | 作为 MCP server 跑（stdin/stdout JSON-RPC） |\n| `everyapi update` | 检查是否有新版本，打印对应安装方式的升级命令 |\n| `everyapi version` | 显示构建版本 |\n| `everyapi help` | 帮助 |\n\n### `everyapi use \u003ctool\u003e` — exec 进第三方 CLI（指向 EveryAPI 网关）\n\n装这个 CLI 的主要理由。它把目标第三方工具的环境变量按惯例配置好，然后 exec 进去——你既有的 Claude Code / OpenAI Codex CLI / Gemini CLI **不用改任何配置**就指向了 EveryAPI 网关。\n\n```bash\neveryapi use claude         # Claude Code → EveryAPI\neveryapi use codex          # OpenAI Codex CLI → EveryAPI\neveryapi use gemini         # Gemini CLI → EveryAPI\neveryapi use                # 无参 → 交互式选择已安装的工具\n```\n\n每个工具的 env 惯例各不相同，CLI 帮你记住：\n\n| 工具 | 设置的环境变量 |\n|---|---|\n| claude | `ANTHROPIC_BASE_URL`、`ANTHROPIC_AUTH_TOKEN` |\n| codex | `OPENAI_BASE_URL`、`OPENAI_API_KEY` |\n| gemini | `GEMINI_API_KEY`、`GOOGLE_GEMINI_BASE_URL` |\n\n不必再去查每个工具读哪个变量名、要不要拼 `/v1` 后缀、走哪种 auth header。\n\n\u003e ⚠️ **Subprocess env 安全提示**：上面这些环境变量包含你的 relay API key。第三方 CLI 的 debug / verbose 模式可能会把 env 写进日志——`everyapi use` 之前确认你打开的 debug flag 不会泄漏 `*_TOKEN` / `*_API_KEY`；分享 debug 日志前先 `sed -i 's/sk-everyapi-[A-Za-z0-9]*/REDACTED/g'`。\n\n### `everyapi login` — Device Authorization Grant + QR 登录\n\n走 Device Authorization Grant（RFC 8628 形态）+ docs §7-5 Layer 1 「设备到设备 QR 登录」：\n\n1. CLI 创建一个 session，**渲染终端 QR + 打印短码 + URL**\n2. 用手机扫码（或在已登录 EveryAPI 的浏览器里打开 URL）——QR 里的 URL 已带 `?code=USR-789` 参数，dashboard 自动填好 code，user 只用点 Approve\n3. CLI 拿到 access token，落地到 `~/.config/everyapi/credentials.json`（mode 0600）\n\n```bash\neveryapi login                                    # 生产，默认渲染 QR + 自动开浏览器\neveryapi login --api-base http://localhost:8787   # 本地开发 / 自托管\neveryapi login --no-browser                       # 不自动开浏览器（用 QR 扫）\neveryapi login --no-qr                            # 不渲染 QR（非 UTF-8 终端 / piping）\n```\n\nQR 终端渲染样例（Unicode 半块字符；约 18-20 行高）：\n\n```\n█▀▀▀▀▀█  ▀▀ ▄  █▀▀▀▀▀█\n█ ███ █  ▀▄█▀  █ ███ █\n█ ▀▀▀ █ ▄ ▀ █▀ █ ▀▀▀ █\n▀▀▀▀▀▀▀ █▄█▄█▄ ▀▀▀▀▀▀▀\n... (实际 QR 编码 verification_uri?code=USR-789)\n```\n\n为什么这是更强的反钓鱼路径：\n\n- User **不需要在新设备输密码** → 钓鱼站没机会骗 credential\n- User **不需要弹浏览器到陌生页面** → web 跳转钓鱼面消失\n- 即使 CLI 是恶意 fork 生成假 QR，扫码后的确认页是真 everyapi.ai 上的 dashboard（user 已登录设备触发），user 看到不认识的代码不会 approve\n\ndocs §7-5 其余 layers（cert pinning / 暗号字符串 / PKCE OAuth）已各自独立 PR 落地（cert pinning 为 report-only，enforce 按产品决策不做）。\n\n### `everyapi seller \u003csub\u003e` — marketplace 卖家端子命令\n\n把 dashboard 的 channel mount / 提现操作搬到 terminal，方便 scripted onboarding。挂渠道前 `seller setup` 会先查 eligibility（账号激活 / 邮箱验证 / 账号年龄 / 消费记录 / channel 上限），失败的 gate 在**输入 key 之前**就先列出来，避免用户填一通才发现提交侧 422。\n\n```bash\neveryapi seller list                          # 列出已挂载的 channel\neveryapi seller withdraw                      # 把全部 pending seller 收入转入主余额\neveryapi seller withdraw --quota 1000         # 部分转账（DB 单位）\neveryapi seller add-key   --type claude --name 'my-pro' \\\n                        --key 'sk-ant-...' --models 'claude-3-opus,claude-3-sonnet'\neveryapi seller add-oauth codex --name 'my-chatgpt' --models 'gpt-4'\n                                            # 一键 OAuth：CLI 启动 device flow，user 在浏览器\n                                            # 输入 user_code，token 自动落 channel\neveryapi seller add-oauth claude --name 'my-claude' --models 'claude-3-opus,claude-3-sonnet'\n                                            # paste flow：CLI 打开 Anthropic 授权页，user 把\n                                            # callback 显示的 code#state 粘回 terminal\neveryapi seller add-oauth gemini --name 'my-gemini' --models 'gemini-1.5-pro'\n                                            # 真一键 loopback：CLI 起 random-port listener，\n                                            # Google 把 code 直接送回 CLI 无需粘贴\neveryapi seller setup                         # 交互式 wizard：先查 eligibility，再引导 add-key\n```\n\n#### `add-key` — 多 key 备份池\n\n`--key` 可以重复，把 N 把等价凭证挂在同一个 channel 上作为 backup pool（B2，PRODUCT §4.5）；当主 key 401/403 时后端自动 failover 到下一把。`--key-remark` 同样可重复，按位置跟 `--key` 对齐（第 i 个 `--key-remark` 是第 i 个 `--key` 的标签，便于以后 dashboard 上识别）。OAuth blob 不能进 backup pool —— 仍只能作为单 key channel。\n\n```\neveryapi seller add-key   --type claude --name 'claude-pool' \\\n                        --models 'claude-3-opus' \\\n                        --key 'sk-ant-primary' --key-remark 'primary' \\\n                        --key 'sk-ant-backup'  --key-remark 'team backup'\n```\n\n`add-key` 的 `--type` 接受 alias（`openai` / `claude` / `gemini` / `codex` / `vertex` / `aws` / `xai` / `deepseek`）或数字 id。挂载受 marketplace eligibility 限制（账号激活、邮箱已验证、消费记录、channel 数上限），CLI 在 `add-key` / `add-oauth` / `setup` 三条入口都会先查 eligibility 失败时把 checklist 列出来。\n\n#### `add-oauth codex` — 一键 OAuth（device flow）\n\n`everyapi seller add-oauth codex --name 'my-chatgpt' --models 'gpt-4'` 走 Codex / ChatGPT 的 RFC 8628-ish device authorization flow——seller**全程不接触 token 字符串**：\n\n1. CLI 调 `/api/seller/codex/device/start`，拿到一个短 `user_code` 和 `verification_uri`\n2. CLI 默认自动 open browser 到 `https://auth.openai.com/codex/device`（`--no-browser` 跳过）；user 在浏览器输入 `user_code` 完成授权\n3. CLI 轮询 `/api/seller/codex/device/poll`，授权完成后后端自动建 channel、把 OAuth token 落到 channel `key` 字段\n4. 输出 channel id + 已绑定的 ChatGPT 邮箱\n\n授权 cookie 由进程内 `http.CookieJar` 管，不写盘——device flow state 短命且进程绑定，跟威胁模型对齐。\n\n#### `add-oauth claude` — paste-and-submit OAuth\n\n`everyapi seller add-oauth claude --name … --models …`。Anthropic OAuth provider 在他们那头把 `redirect_uri` 写死成 `https://console.anthropic.com/oauth/code/callback`，CLI 没法用 localhost listener 自动接 callback。流程：\n\n1. CLI 调 `/api/seller/claude/oauth/start`，后端建 PKCE 对 + state，返 Anthropic 的 authorize URL\n2. CLI 默认 open browser（`--no-browser` 跳过）；user 登 Anthropic、批准\n3. Anthropic 把 user 重定向到他们 callback 页，显示一串 `\u003ccode\u003e#\u003cstate\u003e`\n4. **user 复制这串粘回 CLI**\n5. CLI 调 `/api/seller/claude/oauth/complete`，后端 exchange code+verifier 拿 token，mint channel\n\n比 device flow 多 1 步粘贴操作，但仍比手工找 `~/.claude/auth.json` 简单太多。session cookie 在 start 时由 backend 下发，complete 必须命中同一 session——CLI 的 `http.CookieJar` 进程内管，per-invocation 隔离。\n\n#### `add-oauth gemini` — 真一键 loopback OAuth\n\n`everyapi seller add-oauth gemini --name … --models … [--no-browser] [--timeout 5m]`。Google 的 gemini-cli installed-app OAuth client 接受 `http://127.0.0.1:\u003cport\u003e/callback` 作为 redirect_uri，**CLI 自己起 listener 接 callback**，user 在浏览器登录后无需任何粘贴。流程：\n\n1. CLI 在随机 ephemeral port (`127.0.0.1:0`) 起一个一次性 HTTP listener，路径固定 `/callback`\n2. CLI 调 `/api/seller/gemini/oauth/start` 带 `redirect_uri = http://127.0.0.1:\u003cport\u003e/callback`；backend 严格校验 redirect 是 loopback / port ≥ 1024 / scheme=http / path=/callback / 无 query/fragment/userinfo（防 SSRF + 防 redirect 劫持）\n3. CLI 默认 open browser；user 在 Google 登录 + 同意\n4. Google 把 `?code=…\u0026state=…` 重定向到 CLI 的 listener\n5. CLI 验证 state 匹配（防 stale flow / 伪造），调 `/api/seller/gemini/oauth/complete`\n6. Backend exchange code + 同一 redirect_uri 拿 token，mint channel\n\n跟其他两个 provider 的对比：\n\n| Provider | 体验 | 原因 |\n|---|---|---|\n| `codex` | user 输 6 位 user_code 到浏览器，CLI 自动 poll | OpenAI device flow，无 redirect_uri |\n| `claude` | user 在浏览器登 + 复制 `code#state` 粘回 CLI | Anthropic 把 redirect_uri 写死成自家 callback URL |\n| `gemini` | user 在浏览器登 + 关掉 tab 即完成 | Google 接受 loopback redirect |\n\n`--timeout` 控制最长等待时间（默认 5 分钟）。超时退出 + 干净关闭 listener。\n\n### `everyapi topup` — 带反钓鱼暗号的充值跳转\n\n`everyapi topup` 打开 dashboard 充值页，跳转前走一层 docs §7-5 Layer 3 验证：\n\n1. CLI 调 backend `POST /api/cli/jump-session`，拿一个 session id + 4-emoji 暗号串（例如 `🌊 🦊 🍕 🚀`）\n2. CLI 把 URL + 暗号都打到 terminal，提示 user \"等下页面顶部要显示同样暗号\"\n3. User 按 Enter，CLI 用系统浏览器打开 URL（含 `?jump_session=\u003cid\u003e`）\n4. Dashboard 加载时调 backend `GET /api/cli/jump-session/:id/phrase`，拿到同一个暗号串，在 page header **prominent 显示**\n5. User 视觉对比：暗号一致 → 真 EveryAPI；不一致或没显示 → 关掉 tab，可能被钓鱼\n\n为什么这能挡钓鱼：暗号在 backend 的内存里 keyed by random 32-hex session id；钓鱼站没 auth path 拿不到，攻击者构造的假 `wallet/topup?jump_session=\u003cid\u003e` 也读不到暗号。短 TTL (10 min) + single-use（dashboard 拿一次后 session 删除）进一步限制 reuse 风险。\n\n```bash\neveryapi topup                    # 默认开浏览器\neveryapi topup --no-browser       # 只打 URL，手动复制\n```\n\n### `everyapi status` — 当前余额 / 使用量 / 配额\n\n```\n$ everyapi status\n\n  alice (alice@example.com)\n  quota:     $12.34 remaining   $5.67 used\n  requests:  1,234\n  topup:     https://app.everyapi.ai/wallet\n```\n\n### `everyapi update` — 自动跑对应安装方式的升级命令\n\n查 GitHub mirror 最新 release，跟当前版本比对，**自动跑对应安装方式的升级命令**——一条命令搞定，不用复制粘贴。\n\n检测逻辑（基于 `os.Executable()` resolve symlink 后的真实路径）：\n\n| 路径包含 | 检测为 | 自动执行 |\n|---|---|---|\n| `/Cellar/` | Homebrew | `brew update \u0026\u0026 brew upgrade everyapi`（两步分开跑） |\n| `$GOBIN` 或 `$GOPATH/bin` 或 `$HOME/go/bin` | `go install` | `go install github.com/everyapi-ai/everyapi-ai@latest` |\n| 其它（curl / 手工放进 PATH） | unknown | 打印手动命令 + 提醒走 SHA256 + cosign 验证（无法安全自动替换二进制） |\n\n```bash\n$ everyapi update\n\nUpdate available: v0.1.0 → v0.2.0\nInstall method:   Homebrew\n\n$ brew update\n==\u003e Updated Homebrew from ...\n\n$ brew upgrade everyapi\n==\u003e Upgrading everyapi-ai/tap/everyapi\n  v0.1.0 -\u003e v0.2.0\n...\n\nDone. Run `everyapi version` to confirm.\n```\n\n为什么不直接换二进制？三个原因：（1）brew / go 自己的校验链（SHA / module checksum）比我们自己在 CLI 内重做的更扎实；（2）自替换 running executable 在 Windows 平台基本是地雷区；（3）保留 README 推荐的 SHA256 + cosign 双层校验流程作为 unknown 路径下的明确 fallback。\n\nFlag：\n- `--check` —— 静默对比，已最新 exit 0 / 过时 exit 1。给 CI / cron 用：\n  ```bash\n  everyapi update --check || echo \"needs upgrade\"\n  ```\n- `--dry-run` —— 打印将要跑的命令但不实际执行，做 inspection 用\n\n## 配置文件\n\n凭证落在 `~/.config/everyapi/credentials.json`（若设置了 `$XDG_CONFIG_HOME` 则走 `$XDG_CONFIG_HOME/everyapi/`），文件模式 `0600`。由 `everyapi login` 写、其它命令读。\n\n\u003e ⚠️ **Token 以明文存储**。文件 mode `0600` + `$HOME` 私有路径与 `gh auth` / `aws configure` 等业界 CLI 同模式，但**对家用电脑被偷 / 恶意软件场景**，任何能读这个文件的进程都可以以你的身份调用 EveryAPI API（包括 MCP 工具，见下文 §钱路 friction step）。建议：\n\u003e - 不在共享 / 公共机器上 `everyapi login`\n\u003e - macOS 用户：考虑在 FileVault 启用前先 `everyapi logout`\n\u003e - Linux 用户：开启 home-dir 加密（`ecryptfs` / LUKS）\n\u003e - 怀疑泄漏 → `everyapi logout` 立即清除本机凭证，并到 EveryAPI dashboard rotate API key\n\u003e\n\u003e Platform keychain backend（macOS Keychain / Windows DPAPI / Linux Secret Service）规划中，未上。\n\n字段：\n\n- `api_base` —— EveryAPI 网关 URL。默认 `https://api.everyapi.ai`。自托管用户 / 本地开发可在 `login` 时用 `--api-base` 覆盖。\n- `access_token` —— 所有需鉴权的 API 调用使用的 bearer。\n- `relay_key` —— relay API key（`sk-everyapi-…`），用于 `everyapi use` 的子进程 env。从 `/api/token/*` 拉来、缓存于此。\n- `user_id` / `username` —— 缓存，使 `status` 在首次 API 往返前就能渲染身份行。\n\n## 开发\n\n在 CLI 源码目录（含本 README、`go.mod`、`Makefile` 的目录）下执行：\n\n```bash\ngo test ./...\ngo run . status            # 对生产\ngo run . login --api-base http://localhost:8787   # 对本地后端\n```\n\n本地全平台交叉编译（跟 CI 用同一份配方）：\n\n```bash\nmake cli-release           # 产物在 dist/（5 平台 × 1 二进制 = 5 个文件）\n```\n\n## MCP server (`everyapi mcp` 子命令)\n\n`everyapi` 二进制**内建** [Model Context Protocol](https://modelcontextprotocol.io) server——以子命令形式启动（`everyapi mcp` 读 stdin 写 stdout），AI agent（Claude Code / Cursor / Codex CLI 等任意 MCP client）可直接 invoke 它，**用户不必打开终端**。\n\n\u003e ⚠️ **MCP server 鉴权模型 + 暴露面**\n\u003e\n\u003e - **不开端口**：`everyapi mcp` 纯 stdio JSON-RPC，由 host CLI fork。**不监听任何 socket / TCP port**——网络层不暴露面。\n\u003e - **直接读 `~/.config/everyapi/credentials.json`**：MCP server 没有自己的鉴权流，credentials 文件能读 = 可以以你的身份调用所有暴露的 tool。任何能以你的 user 权限跑进程的 MCP host 都拥有完全访问。\n\u003e - **钱路 `everyapi_seller_withdraw` 有 friction step**：调用方必须传 `confirm: \"yes\"`，确保 AI agent 把转账动作在 UI 上 surface 给人类，避免 silent drain。其它 read-only 工具（status / topup / seller_list）无此要求。\n\u003e\n\u003e 不信任的 MCP host 不要装。\n\n### 安装\n\n跟 CLI 同一个 binary，装好 CLI 就能用：\n\n```bash\nmake cli                                              # 本地编译，产物 ./bin/everyapi\n# 或直接 go install:\ngo install github.com/everyapi-ai/everyapi-ai@latest\n```\n\n### 接入 Claude Code\n\n`~/.claude/settings.json` 加：\n\n```json\n{\n  \"mcpServers\": {\n    \"everyapi\": {\n      \"command\": \"/abs/path/to/everyapi\",\n      \"args\": [\"mcp\"]\n    }\n  }\n}\n```\n\n接入 Cursor、Codex CLI 等其它 MCP client 类似——`command` 指向 `everyapi` binary、`args: [\"mcp\"]`。\n\n### 鉴权前提\n\n必须先在终端跑过一次 `everyapi login`——MCP server 是后台进程，没有终端交互能力，没法自己跑 device-code 流。它直接读 `~/.config/everyapi/credentials.json`；缺则每个 tool 都返回 `isError: true` 的 \"not logged in\" 引导用户去 login。\n\n### v1 暴露的 tools（8 个）\n\n| Tool | 入参 | 作用 |\n|---|---|---|\n| `everyapi_status` | 无 | 当前余额 / 已用 / 请求数 |\n| `everyapi_topup` | 无 | 返回 web 充值 URL |\n| `everyapi_seller_list` | 无 | 列出 marketplace seller channels |\n| `everyapi_seller_withdraw` | `{confirm: \"yes\", quota?: int}` | 把 seller_quota 转入主余额；**`confirm: \"yes\"` 必填**（钱路 friction） |\n| `everyapi_seller_add_oauth_codex_start` | `{name, models}` | 起 Codex / ChatGPT 设备授权流，返 `user_code` + `verification_uri` + `flow_id` |\n| `everyapi_seller_add_oauth_codex_poll` | `{flow_id}` | 查 Codex 授权状态。`pending`/`slow_down` 继续轮询；`authorized` 拿到 channel id；`expired`/`denied` 终止 |\n| `everyapi_seller_add_oauth_claude_start` | `{name, models}` | 起 Anthropic OAuth 授权流，返 `authorize_url`。User 浏览器登完会拿到 `\u003ccode\u003e#\u003cstate\u003e` 字符串 |\n| `everyapi_seller_add_oauth_claude_complete` | `{input}` | 把上一步 user 粘的 `\u003ccode\u003e#\u003cstate\u003e` 串提交完成，mint channel |\n\n**OAuth tool 使用模式**（AI agent 在对话里这么走）：\n\n```\nUser: 帮我加一个 ChatGPT Plus 卖家 channel，名字叫 my-chatgpt，models 是 gpt-4\nAI    → everyapi_seller_add_oauth_codex_start({name: \"my-chatgpt\", models: \"gpt-4\"})\n       ← \"去 chatgpt.com/codex 输入 USR-789，然后告诉我做完了\"\nUser: 浏览器输完了\nAI    → everyapi_seller_add_oauth_codex_poll({flow_id: \"...\"})\n       ← \"status=pending，再等几秒\"\n[继续轮询直到 authorized]\n       ← \"status=authorized — channel #314 mounted\"\n\nUser: 加 Claude Pro 那个，my-claude / claude-3-opus\nAI    → everyapi_seller_add_oauth_claude_start({...})\n       ← \"去 [URL] 完成授权后，把 code#state 串给我\"\nUser: code-abc123#state-xyz\nAI    → everyapi_seller_add_oauth_claude_complete({input: \"code-abc123#state-xyz\"})\n       ← \"Channel #315 mounted\"\n```\n\nGemini OAuth（loopback flow）**不在 MCP 提供** —— loopback listener 跨 tool 调用生命周期不匹配。Gemini 仍走 CLI `everyapi seller add-oauth gemini`。\n\n### 手动 smoke\n\n```bash\nmake cli\n./bin/everyapi mcp \u003c\u003c'EOF'\n{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\"}\n{\"jsonrpc\":\"2.0\",\"id\":2,\"method\":\"tools/list\"}\n{\"jsonrpc\":\"2.0\",\"id\":3,\"method\":\"tools/call\",\"params\":{\"name\":\"everyapi_status\",\"arguments\":{}}}\nEOF\n```\n\n应该看到 3 行 JSON 响应：initialize 结果、4 个 tool 的列表、status 文本（或 not-logged-in 的 isError）。\n\n## 这个二进制还**不**包含什么\n\n当前**仍未实现**的（按重要性排序，后续 release 增量补，不破坏已有 v1 surface）：\n\n- ⚠️ OS 级 code signing（macOS notarization / Windows Authenticode）——目前靠 sigstore cosign keyless + SHA256SUMS 双层校验，详见上文「从 GitHub Release 拉二进制 — 务必校验」\n- ❌ Platform keychain backend——token 仍明文存盘（mode 0600）\n\n原列于此、**现已落地**的（勿再当未实现）：\n\n- ✅ Local sanitizer proxy —— 命令是 `everyapi proxy {start,stop,status,configure}`（不是 `everyapi start`/`everyapi configure`），引擎 + 6 内置 detector + 自定义 regex + 集成进 `everyapi use`\n- ✅ Seller OAuth onboarding 三家 provider（codex device / claude paste / gemini loopback）\n- ✅ QR sign-in 主路径 —— `login` 走 device-code **+ QR 主路径**，`--no-qr` 兜底\n- ✅ 防钓鱼分层 —— 暗号字符串（`everyapi topup`）、PKCE/state strict-check、cert pinning 均已落地；cert pinning 为 **report-only**（匹配静默 / mismatch 告警 / 永不拒连），enforce 按产品决策定格\"只告警不做\"\n\n## 报告漏洞\n\n请见 [`SECURITY.md`](./SECURITY.md)。\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feveryapi-ai%2Feveryapi-ai","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feveryapi-ai%2Feveryapi-ai","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feveryapi-ai%2Feveryapi-ai/lists"}