@a1-x-tech/mcp-google-auth (英语)
可重用 Google OAuth 登录 mcp-google-* MCP服务器行. 一个
软件包给予每个服务器 Yandex 线的聊天登录——适应
谷歌的规则:a 打开回放收听器 127.0.0.1 + 常设专家委员会(S256) 改为
死亡的OOB流,一个 用户拥有的桌面 OAuth 客户端 (个人使用)
豁免——无核查、无小武器问题协调行动)和a set_client 路径
client_secret 从不通过聊天.
这是一个 图书馆,而不是服务器: 它在您身上注册了六个 MCP 工具
McpServer 手拿回来 TokenProvider 您的 API 客户端每个请求都呼叫 .
使用量
import { registerGoogleAuth, unconfiguredPrefix } from "@a1-x-tech/mcp-google-auth";
const options = {
serverName: "calendar", // → ~/.config/mcp-google-calendar/credentials.json
envPrefix: "GOOGLE_CALENDAR", // → GOOGLE_CALENDAR_REFRESH_TOKEN, …
scopes: ["https://www.googleapis.com/auth/calendar.events"],
// verifyIdentity?: async (accessToken) => ({ email }), // default: OIDC userinfo
// defaultClient?: { clientId, clientSecret? }, // built-in A1 client slot
// finishWaitMs?: 20_000, // finish_login wait for the callback
// fail?: (err) => CallToolResult, // your error renderer (telemetry tag); default `Error: <message>`
};
const provider = registerGoogleAuth(server, options);
// In your API client, per request:
const token = await provider.getAccessToken();
// On a 401 from the API — one re-mint + replay:
const fresh = await provider.getAccessToken(true);
// Before a tool that needs a specific scope (partial grants are stored, not rejected):
provider.assertScopes(["https://www.googleapis.com/auth/calendar.events"]);
// At startup, when provider.hasToken() is false, prepend to the initialize instructions:
const instructions = unconfiguredPrefix(options) + REGULAR_BRIEFING;
该部分总是添加 openid + 键 userinfo.email 对(非敏感)
scopes - 就是这样 finish_login 连API的账户都命名
一个身份电话.
注册工具
| 工具 | 提示 | 目的 |
|---|---|---|
auth_status | 只读 | 连接状态, 令牌源, 过期, 授予/ 丢失范围, 路径 。 没有网络, 输出中没有符号 . |
setup_instructions | 只读 | GCP向导核对表(项目-API-同意屏幕-) 发布应用 – 桌面客户端 – 下载 JSON. 客户端已经存在时缩短 . |
set_client | 写入 | 读取已下载 client_secret_*.json 以 路径类型 installed在共享中存储 client.json (0600) (中文(简体) ). 秘密从来不进入聊天. |
start_login | 写入, 故意不只读 | 薄荷 PKCE + state,绑定一个一发收听器 127.0.0.1 (随机端口或 <PREFIX>_OAUTH_PORT),返回时 authorizeUrl + 键 nextStep。不打开浏览器。 只读的提示会让快速注射静静地启动OAuth流. |
finish_login | 写入 | 等待浏览器回调最多 20 s , 等待本地代码交换, 解剖保存符号, 验证身份( 服务器回调或用户信息), 报告 accountEmail, (中文(简体) ), grantedScopes, (中文(简体) ), missingScopes, (中文(简体) ), previousAccountEmail 账户变动. |
logout | 破坏性 | 已撤销 oauth2.googleapis.com/revoke,删除文件、报表 envTokenStillSet。 。 。 . |
证书来源
OAuth 客户端 (由全行分摊),优先权顺序:
<PREFIX>_CLIENT_ID编号 :<PREFIX>_CLIENT_SECRET(env 覆盖,例如 CI)~/.config/mcp-google-auth/client.json——编著set_clientoptions.defaultClient——已核实的A1客户端的内置槽
代码交换先运行 无 client_secret; 如果 Google 回答
"客户 机密缺失",它用这个秘密重复 当一个人在档案中,
否则失败 set_client 建议.
键 (每个服务器),优先排序 :
<PREFIX>_REFRESH_TOKEN(+客户端)——以内存计价,从不写入磁盘;<PREFIX>_ACCESS_TOKEN作为静态测试的替代品~/.config/mcp-google-<serverName>/credentials.json——编著finish_login, (中文(简体) ), 每次通话都要重读 (会中登录不需要重启)
路径荣誉 $XDG_CONFIG_HOME; 在Windows上,基础是 %APPDATA% (概况)
ACLs 取代 0600/0700模式, 重命名反病毒重试 EPERM) (中文(简体) ). 写作
是原子 (temp 文件 + 重命名);一个已损坏的文件读取为"没有连接".
刷新: 60 s 回旋余地, 同时刷新去复, 旋转
refresh_token 立即坚持下去.
安全变化剂(每个都由测试所支撑)
- 没有工具输出或错误
access_token编号 :refresh_token编号 :client_secret编号 :id_token(测试笔录上的sentinel grep). - PKCE核查员从不离开程序;
state精确比较 听者绑定127.0.0.1仅是一发,待登录者死亡 十分钟后 成功的一页是静止的——没有反射,没有外部的 资源. - 缺少证书
AuthRequiredError在此之前 任何获取 信件名称start_login, env变量). - OAuth 失败映射到可采取行动的建议( E)
redirect_uri_mismatch, (中文(简体) ),access_denied, (中文(简体) ),accessNotConfigured, (中文(简体) ),invalid_scope, (中文(简体) ),invalid_grant, (中文(简体) ),invalid_client, (中文(简体) ),admin_policy_enforced) (中文(简体) ). - 部分同意赠款被储存和报告,从未被拒绝;账户 更改取消旧的刷新符牌和上一个名称 账户.
发展
npm install
npm run typecheck # types for src + tests
npm test # node:test, no external network (loopback only)
npm run build # emit dist/
@modelcontextprotocol/sdk 是一个 同伴依赖 ——主机服务器拥有
sDK 实例; 只 zod 作为运行时间的依赖.
许可证
麻省理工学院