mcpField
G
go-tokenless

go-tokenless

本地服务
github.com/Continuous-Actions安全23 周前更新

关于 go-tokenless

用于将 GitHub Actions 中的 npm 发布从长期令牌迁移到 OIDC 可信发布的命令行工具,也可供编码 Agent 使用。它会预览并修改必要的工作流和 `package.json` 内容,并在需要人工判断时停止。

主要功能

  1. 01预览迁移计划与差异
  2. 02修改发布工作流和 package.json
  3. 03检测需人工处理的发布配置
  4. 04支持多种发布工具和工作流
  5. 05提供 MCP 工具与 Agent Skill

适用场景

  1. 01将 npm 发布切换为 OIDC 可信发布
  2. 02检查发布流程中的长期令牌
  3. 03为私有包安装配置只读令牌
  4. 04在 CI 中阻止令牌重新进入发布流程

MCP 相关

提供只读的 `plan_trusted_publishing` 和会写入仓库文件的 `apply_trusted_publishing` 工具;不执行 Git 或网络写入。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"continuous-actions-go-tokenless": {
"command": "npx",
"args": [
"-y",
"go-tokenless"
]
}
}
}
启动命令npx -y go-tokenless

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npmgo-tokenless1.1.0

工具

2

收录的工具列表 · 更新于 2 周前

参数类型必填说明
pathstring是仓库根目录的绝对路径。
repostring否GitHub 所有者/仓库(如果 git 远程仓库不是 "origin")。
npmArgsstring否附加到生成的 npm 命令末尾的额外参数。
offlineboolean否跳过 npm registry 查询。
readTokenstring否提供给安装步骤的只读 npm 令牌的密钥名称(例如 NPM_READ_TOKEN),适用于私有组织软件包。发布步骤不使用令牌。
npmVersionstring否插入的升级步骤所用的 npm 版本范围。默认值为 ^12;其他版本可能会导致发布失败。

详细介绍

go-tokenless:从发布工作流中移除 NODE_AUTH_TOKEN,并添加 id-token: write

go-tokenless

CI npm MCP Registry OpenSSF Scorecard License: MIT

删除你的 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 publishpnpm 10 会交由 npm 处理;pnpm 11 需要 11.1.3+
Yarn Berry yarn npm publishYarn 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 releaseLerna 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 CLIgemini extensions install https://github.com/continuous-actions/go-tokenless
Cursor、VS Code 等添加下方的 MCP 配置
任何支持 Skill 的 Agentnpx 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_publishing MCP 工具只会写入该仓库内的工作流和 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 后:

  1. **将每个软件包关联到工作流:**运行打印出的 npm trust github … 命令(npm 11.15+,需要进行 2FA 验证),或前往 npmjs.com → 软件包 → Settings → Trusted publishing。
  2. 新软件包必须先手动发布一次;npm 只能关联已存在的软件包。计划会标记这些软件包。
  3. 删除旧机密,并在首次无令牌发布后撤销该令牌。

故障排查

每种错误都有单独的页面介绍其原因和修复方法: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.urlpackage.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

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。