关于 go-tokenless
用于将 GitHub Actions 中的 npm 发布从长期令牌迁移到 OIDC 可信发布的命令行工具,也可供编码 Agent 使用。它会预览并修改必要的工作流和 `package.json` 内容,并在需要人工判断时停止。
主要功能
- 01预览迁移计划与差异
- 02修改发布工作流和 package.json
- 03检测需人工处理的发布配置
- 04支持多种发布工具和工作流
- 05提供 MCP 工具与 Agent Skill
适用场景
- 01将 npm 发布切换为 OIDC 可信发布
- 02检查发布流程中的长期令牌
- 03为私有包安装配置只读令牌
- 04在 CI 中阻止令牌重新进入发布流程
MCP 相关
提供只读的 `plan_trusted_publishing` 和会写入仓库文件的 `apply_trusted_publishing` 工具;不执行 Git 或网络写入。
配置
本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。
工具
2收录的工具列表 · 更新于 2 周前
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| path | string | 是 | 仓库根目录的绝对路径。 |
| repo | string | 否 | GitHub 所有者/仓库(如果 git 远程仓库不是 "origin")。 |
| npmArgs | string | 否 | 附加到生成的 npm 命令末尾的额外参数。 |
| offline | boolean | 否 | 跳过 npm registry 查询。 |
| readToken | string | 否 | 提供给安装步骤的只读 npm 令牌的密钥名称(例如 NPM_READ_TOKEN),适用于私有组织软件包。发布步骤不使用令牌。 |
| npmVersion | string | 否 | 插入的升级步骤所用的 npm 版本范围。默认值为 ^12;其他版本可能会导致发布失败。 |
详细介绍
go-tokenless
删除你的 NPM_TOKEN。 只需一条命令,即可将 GitHub Actions 中的 npm 发布切换为可信发布(OIDC)。无需在任何地方存储长期有效的令牌,每次发布都会获得来源证明徽章。
npm 正在逐步淘汰令牌发布:自 2027 年 1 月 起,令牌将无法单独用于发布(npm 文档)。
目录
快速开始
在发布到 npm 的仓库根目录中运行:
npx go-tokenless # 1. preview: lists every change and shows a diff, writes nothing
npx go-tokenless apply # 2. edit the workflow and package.json files
然后按照它显示的后续步骤操作:提交更改、在 npm 上将包关联到工作流,并删除旧密钥。需要 Node 22.14+。
变更内容
只修改需要变更的行:保留工作流中的注释、引号和布局;在 package.json 中只编辑 repository 字段。写入前,go-tokenless 会重新读取两个版本,如果发现除了迁移之外还有其他变更,就会拒绝操作。
| 发布工作流中的问题 | go-tokenless 的处理方式 |
|---|---|
发布作业(或工作流)中使用 NODE_AUTH_TOKEN / NPM_TOKEN | 将其移除,这样就可以删除密钥。npm 优先使用 OIDC,但会回退到已配置的令牌;这会导致旧令牌继续生效 |
| 作业无法请求 OIDC 令牌 | 添加 permissions: id-token: write,同时保留已有权限 |
| npm 版本低于 11.5.1(Node 22 及以下版本) | 添加 npm install -g npm@^12,或将 Node < 22 升级到 24 |
actions/setup-node 未设置 registry-url | 添加 registry-url: https://registry.npmjs.org |
JS-DevTools/npm-publish 低于 v4 | 更新到 v4,该版本不再需要令牌 |
脚本将 _authToken 写入 .npmrc | 移除这些行 |
package.json 中缺少 repository,或格式不正确 | 设置为 git+https://github.com/<owner>/<repo>.git(monorepo 中还会设置 directory) |
需要人工决策时,工具会以退出代码 1 停止且不写入任何内容:
- 外部用户可触发发布: 工作流由
pull_request_target、issue_comment、workflow_run等类似触发器启动,且其中包含发布作业。授予该作业 OIDC 权限会让 fork 能够发布。 - 自托管运行器,npm 不接受其用于可信发布。
repository指向其他仓库。- YAML 锚点。 修改可能会影响其他作业。
- 隐藏的发布命令: 传入了 npm 令牌,但找不到发布命令。
试运行(npm publish --dry-run)不会被视为发布。发布到 GitHub Packages 的步骤以及 GITHUB_TOKEN 值都会保持不变。
输出示例
$ npx go-tokenless
go-tokenless: Ready to go tokenless. (acme/widgets)
Changes:
.github/workflows/release.yml
- publish: remove `NODE_AUTH_TOKEN` from job env
- publish: grant `id-token: write`
- publish: raise setup-node from Node 20 to 24 (trusted publishing needs Node 22.14+)
package.json
- widgets: add repository.url git+https://github.com/acme/widgets.git
Next:
1. Run `npx go-tokenless apply` (or apply the diff above) and commit the changes on a branch.
2. Add a trusted publisher for each package. With npm 11.15+ logged in with 2FA, run:
npm trust github widgets --repo acme/widgets --file release.yml --allow-publish --yes
3. Merge, then let the release workflow publish once. Check the new version shows a provenance badge.
4. Delete the old publish token secret (`gh secret delete NPM_TOKEN`) and revoke the token on npmjs.com.
支持的发布配置
| 配置 | 说明 |
|---|---|
npm publish(包括 workspaces) | |
pnpm publish / -r publish | pnpm 10 会交由 npm 处理;pnpm 11 需要 11.1.3+ |
Yarn Berry yarn npm publish | Yarn 4.10.3+;从 .yarnrc.yml 中移除 npmAuthToken |
changesets(changesets/action) | 可直接使用;如果首次无令牌发布无法通过身份验证,请升级到 v2 |
| semantic-release | 需要 @semantic-release/npm 13.1.0+(semantic-release 25+) |
release-please + npm publish | |
| Lerna / Nx release | Lerna 9+ |
| JS-DevTools/npm-publish | 已更新到 v4 |
| release-it | 还需设置 npm.skipChecks: true |
可复用工作流(workflow_call) | npm 会检查调用方工作流的文件名;每个调用方都会显示一条信任命令 |
| 在脚本中发布 | 会跟踪 package.json 脚本、./scripts/*.sh、make <target> 和本地复合操作(uses: ./.github/actions/...),包括 working-directory |
Yarn 1 yarn publish、bun publish | 会标记为问题:这些工具目前还不能使用可信发布,因此请改用 npm publish |
私有包
如果安装时需要从 npm 组织获取私有包,请为安装步骤提供一个只读令牌。发布步骤仍不使用令牌:
npx go-tokenless apply --read-token NPM_READ_TOKEN
- run: npm ci
+ env:
+ NODE_AUTH_TOKEN: ${{ secrets.NPM_READ_TOKEN }}
- run: npm publish
发布工作流中的每个安装步骤都会使用该令牌,包括单独的构建和测试作业。在 npmjs.com 上创建一个可精细配置、对你的包具有只读权限的令牌,并使用 gh secret set NPM_READ_TOKEN 保存。
在 CI 中保持无令牌
将此 Action 添加到 CI。如果令牌重新出现在发布工作流中,它会使作业失败;作业摘要会列出确切的修复项:
# .github/workflows/ci.yml
jobs:
tokenless:
runs-on: ubuntu-latest
permissions:
contents: read
steps:
- uses: actions/checkout@v5
- uses: continuous-actions/go-tokenless@v1
# with:
# mode: report # annotate only, never fail
# read-token: NPM_READ_TOKEN # if installs use a read-only token
它会以只读方式运行 go-tokenless --json,且不需要令牌。其 status 输出为 already-tokenless、ready、blocked 或 no-publish-workflow。
与 AI Agent 搭配使用
go-tokenless 专为编码 Agent 运行而构建:支持 --json 输出、清晰的退出代码、MCP 服务和 Agent Skill。向你的 Agent 提出请求:“将我们的 npm 发布迁移到可信发布。”
| 客户端 | 设置 |
|---|---|
| Claude 目录(claude.ai、Cowork、Claude Code) | 已提交至 Anthropic 的插件目录,正在等待审核。上架后:打开目录,搜索 go-tokenless 并选择 Add。随后它会同步到 Claude Code,名称为 go-tokenless@synced。在此之前,请使用下方的市场命令 |
| Claude Code(插件:Skill + MCP) | /plugin marketplace add continuous-actions/go-tokenless then /plugin install go-tokenless@continuous-actions |
| Claude Code(仅 MCP) | claude mcp add go-tokenless -- npx -y go-tokenless mcp |
| Gemini CLI | gemini extensions install https://github.com/continuous-actions/go-tokenless |
| Cursor、VS Code 等 | 添加下方的 MCP 配置 |
| 任何支持 Skill 的 Agent | npx skills add continuous-actions/go-tokenless |
{ "mcpServers": { "go-tokenless": { "command": "npx", "args": ["-y", "go-tokenless", "mcp"] } } }
MCP 工具:plan_trusted_publishing(只读)和 apply_trusted_publishing(写入文件;不会写入 git 或网络)。它已列入 MCP Registry,名称为 io.github.continuous-actions/go-tokenless。另请参阅 llms.txt 和 Agent Skill。
选项
npx go-tokenless [plan | apply | mcp] [options]
| 选项 | 说明 |
|---|---|
--json | 将完整计划打印为 JSON(status、changes、diff、findings、trust、nextSteps) |
--diff | 在文本输出中包含差异(plan 始终包含差异) |
--repo <owner/repo> | GitHub 仓库;当 origin 不是 GitHub 时使用 |
--cwd <dir> | 仓库根目录(默认:当前目录) |
--offline | 跳过对每个软件包是否已存在的 npm Registry 检查 |
--read-token <SECRET> | 向安装步骤提供来自此机密的只读令牌(私有软件包) |
--npm-version <range> | 插入的升级步骤所使用的 npm 版本。默认值为 ^12,固定在一个主版本范围内,避免发布版本变化带来影响。使用其他版本会显示警告;低于 11.5.1 则会被拒绝 |
--npm-args "<args>" | 为生成的每条 npm 命令添加额外参数(升级步骤和 npm trust) |
退出代码:0 正常 · 1 阻止(需要人工修复) · 2 用法错误 · 3 意外错误。
访问内容
- **文件:**会读取你指定的仓库中的
.github/workflows/*.yml、package.json文件及相关脚本。apply和apply_trusted_publishingMCP 工具只会写入该仓库内的工作流和package.json文件,绝不会跟随链接跳出仓库。 - **网络:**仅向
https://registry.npmjs.org/<package>发送只读GET请求,以检查每个软件包是否已存在(使用--offline或将 MCP 的offline设为true可关闭此检查)。不会获取或发送任何其他内容,也没有遥测。 - **绝不会:**运行仓库代码、读取机密或环境令牌、运行任何会造成更改的 git 命令,或代你联系 npm 或 GitHub。
- **运行方式:**Claude Code 插件和 Gemini 扩展会通过
npx -y go-tokenless@<pinned version> mcp启动 MCP 服务。
只有你能完成的操作
go-tokenless 绝不会接触你的 npm 账户、机密或 git 历史记录。执行 apply 后:
- **将每个软件包关联到工作流:**运行打印出的
npm trust github …命令(npm 11.15+,需要进行 2FA 验证),或前往 npmjs.com → 软件包 → Settings → Trusted publishing。 - 新软件包必须先手动发布一次;npm 只能关联已存在的软件包。计划会标记这些软件包。
- 删除旧机密,并在首次无令牌发布后撤销该令牌。
故障排查
每种错误都有单独的页面介绍其原因和修复方法:ENEEDAUTH、PUT 返回 404、E422 repository.url、仍在使用令牌以及绕过 2FA 的通知。
| 错误 | 常见原因 |
|---|---|
npm error code ENEEDAUTH | 没有 id-token: write、npm 版本低于 11.5.1,或者工作流文件名与受信发布者的设置完全不匹配(区分大小写,且需使用 .yml) |
npm error 404 Not Found - PUT https://registry.npmjs.org/... | 同上、environment 不匹配,或者尚未设置受信发布者 |
npm error code E422 … repository.url | package.json 中的 repository 与 GitHub 仓库不匹配。apply 会修正格式 |
| 发布时仍在使用令牌 | 某处仍设置了 NODE_AUTH_TOKEN、NPM_TOKEN、.npmrc 中的 _authToken 或 .yarnrc.yml 中的 npmAuthToken。再次运行 npx go-tokenless 查找 |
参与贡献
欢迎提交问题和拉取请求。运行 corepack enable && yarn install && yarn check(类型检查、构建和端到端测试)。请参阅 AGENTS.md 了解代码的组织方式,并参阅 SECURITY.md 报告漏洞。
许可证
MIT © continuous-actions
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。