Repository navigation
fix(release): Pin npm 11 and support a GitHub App token for the version PR (#95) - #96
Merged
Merged
Conversation
…on PR (#95) npm 12 returns `npm info --json` as an array. `@changesets/cli` then finds no published versions and tries to publish the current version again, and npm rejects it. Pin `npm@^11.5.1` in the release and force release workflows. npm 11.5.1 is the minimum for trusted publishing. Add an optional `actions/create-github-app-token` step. It runs only when the repository variable `RELEASE_APP_ID` exists. Its token opens the version PR, does the git pushes, and pushes the release tags after a publish. Without the variable, the job uses GITHUB_TOKEN as before. Refs #74
…have (#95) The published `bin/cli.mjs` runs over stdio only and ignores `--http`. Point HTTP clients to the hosted server at https://www.taskade.com/mcp.
…es (#95) `bin/cli.mjs` bundles `@modelcontextprotocol/sdk`, `node-fetch` and `zod`, and imports only Node built-in modules. `mcp-proxy` is used only by the local HTTP dev script. An install of the package now adds 1 package instead of 120.
🦋 Changeset detectedLatest commit: 407894e The changes in this PR will be included in the next version bump. This PR includes changesets to release 1 package
Not sure what this means? Click here to learn what changesets are. Click here if you're a maintainer who wants to add another changeset to this PR |
There was a problem hiding this comment.
🟢 Approval recommended
No blocking issues were identified in the scoped workflow, packaging, or documentation changes.
No open issues 🎉
What changed in this PR
Improves release automation for the MCP packages and reduces the server package’s installation footprint.
Changes:
- Pins npm to version 11 in both release workflows.
- Adds optional GitHub App authentication for version PRs and release-tag pushes.
- Moves bundled dependencies to development dependencies and clarifies stdio-only local usage.
| File | Description |
|---|---|
| README.md | Directs HTTP clients to the hosted server. |
| packages/server/README.md | Clarifies local stdio-only support. |
| packages/server/package.json | Removes runtime dependency installation requirements. |
| .github/workflows/release.yml | Pins npm and adds optional App authentication and tag pushes. |
| .github/workflows/force-release.yml | Pins npm for manual releases. |
| .changeset/bundle-only-deps.md | Records the server packaging patch release. |
Review effort: Balanced
The tag that starts this workflow comes from the new Push release tags step in release.yml. That step runs only with the release App token.
Member
Author
|
@deanzaka for review. Impact
Release flowQA steps
|
Merged
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
The
Releaseworkflow fails on every push tomain, so no release reaches npm or the MCP Registry without a manual publish. This PR fixes the two causes, removes a README section for a mode that the package does not have, and makes the npm install of@taskade/mcp-serversmaller.changeset publish. The workflow installsnpm@latest, which is now npm 12. npm 12 returnsnpm info --jsonas an array.@changesets/cli2.29.4 readspkgInfo.versionsfrom that output (getUnpublishedPackages). For an array the value isundefined, so the list of published versions is empty. The CLI then tries to publish the current version again, and npm stops it withYou cannot publish over the previously published versions: 0.1.2.GitHub Actions is not permitted to create or approve pull requests.I checked the npm claim locally with the same command that
changeset publishruns:.versionsnpx npm@11.21.1 info @taskade/mcp-server --json["0.0.1","0.0.3","0.1.0","0.1.1","0.1.2"]npx npm@12.2.1 info @taskade/mcp-server --jsonundefinedChanges
.github/workflows/release.ymlnpm@^11.5.1in place ofnpm@latest. npm 11.5.1 is the minimum for trusted publishing (OIDC), so publishing stays tokenless.actions/create-github-app-token@v3step. It runs only when the repository variableRELEASE_APP_IDexists. It reads the private key from the secretRELEASE_APP_PRIVATE_KEYand asks only forcontents: writeandpull-requests: write.changesets/actiongetssteps.app-token.outputs.token || secrets.GITHUB_TOKEN.actions/checkoutgetssteps.app-token.outputs.token || github.token, so the git pushes also use the App token.github.tokenis the checkout default.Push release tagsstep afterPublish.changeset publishcreates a tag for each new version but does not push it. The step runs only with the App token, because a tag pushed with GITHUB_TOKEN does not startpublish-mcp-registry.yml..github/workflows/publish-mcp-registry.yml: correct the trigger comment. The tag comes from the newPush release tagsstep, which runs only with the App token..github/workflows/force-release.yml: the same npm pin. This manual workflow runschangeset publishtoo, so npm 12 breaks it in the same way.README.mdandpackages/server/README.md: remove the--httpsection. The publishedbin/cli.mjsruns over stdio only and ignores the flag. HTTP clients go to the hosted server athttps://www.taskade.com/mcp, which the README already leads with.packages/server/package.json: move@modelcontextprotocol/sdk,mcp-proxy,node-fetchandzodtodevDependencies. The esbuild bundle contains the first three, andmcp-proxyis used only by the local HTTP dev script (start:server).yarn.lockdoes not change..changeset/bundle-only-deps.md: a patch changeset for@taskade/mcp-server.The codegen package is not in this PR.
Behavior without the App (the current repository state)
mainchangeset publishtries to publish again and failschangeset publishskips the published version and the job passesOwner steps to enable the App
taskadeorganization. Clear the Active box under Webhook. Give it the repository permissions Contents: Read and write and Pull requests: Read and write. Metadata: Read-only is automatic.taskade/mcponly..pem).taskade/mcp> Settings > Secrets and variables > Actions, add the variableRELEASE_APP_IDwith the App ID.RELEASE_APP_PRIVATE_KEYwith the full contents of the.pemfile.Releaserun opens achore: releasePR, and that CI runs on that PR.chore: releasePR. Make sure that the nextReleaserun publishes the new version to npm and thatPublish to MCP Registrystarts from the new tag.If you add the variable, you must also add the secret. Without the secret, the token step fails and the release job stops.
Risk and rollback
RELEASE_APP_IDvariable, the token step is skipped and every token expression falls back to the same token as today. The only change on that path is the npm 11 pin.npm@^11.5.1resolves to the latest npm 11 (11.21.1 today), which supports Node^20.17.0 || >=22.9.0.actions/create-github-app-token@v3also acceptsclient-id, which is the newer input name. This PR usesapp-idbecauseactionlint1.7.12 knows onlyapp-idfor v3.RELEASE_APP_IDvariable.Tests
actionlint1.7.12 on all 4 workflows: 0 findings.yarn install --frozen-lockfile --force: passes,yarn.lockunchanged.yarn build, thengit status: no tracked file changes (the CI clean-tree check).yarn lint: passes.yarn test: 4 files, 19 tests passed.importin the builtbin/cli.mjsis a Node built-in (node:*,module), with no dynamicimport(). The onlyrequire()calls arebuffer,node:process,node:stream/webandworker_threads.npm packof this branch, thennpm install --prefix <empty dir> ./taskade-mcp-server-0.1.2.tgzadds 1 package (632 KB). The same install of the published 0.1.2 tarball adds 120 packages (34 MB). A stdioinitializeplustools/listagainst the installedbin/cli.mjsreturnsserverInfo.name = taskadeand 62 tools.--httpcheck: the published 0.1.2bin/cli.mjshas noprocess.argvread and no HTTP server code. Run with--http, it answersinitializeover stdio.Refs #74
Closes #95