@cyanheads/mcp-ts-core 0.6.9 → 0.6.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +3 -3
- package/README.md +2 -2
- package/changelog/0.6.x/0.6.10.md +21 -0
- package/dist/logs/combined.log +4 -0
- package/dist/logs/error.log +4 -0
- package/dist/logs/interactions.log +0 -0
- package/package.json +5 -5
- package/skills/polish-docs-meta/references/package-meta.md +1 -1
- package/skills/release-and-publish/SKILL.md +150 -0
- package/skills/setup/SKILL.md +64 -14
- package/skills/release/SKILL.md +0 -142
package/CLAUDE.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Agent Protocol
|
|
2
2
|
|
|
3
|
-
**Package:** `@cyanheads/mcp-ts-core` · **Version:** 0.6.
|
|
3
|
+
**Package:** `@cyanheads/mcp-ts-core` · **Version:** 0.6.10
|
|
4
4
|
**npm:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) · **Docker:** [ghcr.io/cyanheads/mcp-ts-core](https://ghcr.io/cyanheads/mcp-ts-core)
|
|
5
5
|
|
|
6
6
|
> **Developer note:** Never assume. Read related files and docs before making changes. Read full file content for context. Never edit a file before reading it.
|
|
@@ -468,7 +468,7 @@ Detailed method signatures, options, and examples live in skill files. Read the
|
|
|
468
468
|
| `polish-docs-meta` | `skills/polish-docs-meta/SKILL.md` | Finalize docs, README, metadata, and agent protocol for shipping |
|
|
469
469
|
| `report-issue-framework` | `skills/report-issue-framework/SKILL.md` | File a bug or feature request against `@cyanheads/mcp-ts-core` via `gh` CLI |
|
|
470
470
|
| `report-issue-local` | `skills/report-issue-local/SKILL.md` | File a bug or feature request against this server's own repo via `gh` CLI |
|
|
471
|
-
| `release` | `skills/release/SKILL.md` |
|
|
471
|
+
| `release-and-publish` | `skills/release-and-publish/SKILL.md` | Post-wrapup ship workflow: verification gate, push, publish to npm/MCP Registry/GHCR |
|
|
472
472
|
| `maintenance` | `skills/maintenance/SKILL.md` | Dependency updates, housekeeping tasks |
|
|
473
473
|
| `migrate-mcp-ts-template` | `skills/migrate-mcp-ts-template/SKILL.md` | Migrate legacy template fork to package dependency |
|
|
474
474
|
|
|
@@ -563,7 +563,7 @@ Pre-release versions (`0.6.0-beta.1`, `0.6.0-rc.1`, etc.) are consolidated as `#
|
|
|
563
563
|
|
|
564
564
|
## Publishing
|
|
565
565
|
|
|
566
|
-
Run the `release` skill
|
|
566
|
+
Run the `release-and-publish` skill — it runs the verification gate (`devcheck`, `rebuild`, `test:all`), pushes commits and tags, and publishes to every applicable destination. The full reference:
|
|
567
567
|
|
|
568
568
|
```bash
|
|
569
569
|
bun publish --access public
|
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
|
|
6
6
|
<div align="center">
|
|
7
7
|
|
|
8
|
-
[](./CHANGELOG.md) [](https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/docs/specification/2025-11-25/changelog.mdx) [](https://modelcontextprotocol.io/) [](./LICENSE)
|
|
9
9
|
|
|
10
10
|
[](https://www.typescriptlang.org/) [](https://bun.sh/)
|
|
11
11
|
|
|
@@ -43,7 +43,7 @@ bun install
|
|
|
43
43
|
|
|
44
44
|
You get a scaffolded project with `CLAUDE.md`, Agent Skills, and a `src/` tree ready for your tools. Infrastructure — transports, auth, storage, telemetry, lifecycle, linting — lives in `node_modules`. What's left is domain: which APIs to wrap, which workflows to expose.
|
|
45
45
|
|
|
46
|
-
Start your coding agent (Claude Code, Codex, Cursor), describe the system you want to expose, and it drives the build. The included skills cover the full cycle: `setup`, `design-mcp-server`, scaffolding, testing, release
|
|
46
|
+
Start your coding agent (Claude Code, Codex, Cursor), describe the system you want to expose, and it drives the build. The included skills cover the full cycle: `setup`, `design-mcp-server`, scaffolding, testing, `release-and-publish`.
|
|
47
47
|
|
|
48
48
|
### What you get
|
|
49
49
|
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
---
|
|
2
|
+
summary: Rename release skill to release-and-publish with an end-to-end ship workflow, expand setup skill scaffolding docs, and bump @cloudflare/workers-types, @supabase/supabase-js, and vite
|
|
3
|
+
breaking: false
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# 0.6.10 — 2026-04-23
|
|
7
|
+
|
|
8
|
+
Rework the release workflow into a post-wrapup publisher and expand the setup skill to match what `init` actually scaffolds. No library API changes.
|
|
9
|
+
|
|
10
|
+
## Changed
|
|
11
|
+
|
|
12
|
+
- **`release` skill renamed to `release-and-publish`** and rewritten as a post-wrapup shipping workflow (version bumps, changelog, commits, and tagging are assumed done by the git wrapup protocol). The skill now runs the verification gate (`devcheck`, `rebuild`, `test:all`), pushes commits and tags, then publishes to npm, the MCP Registry, and GHCR — halting on the first non-zero exit and reporting partial state so the user can resume manually. Audience flipped from `internal` to `external`; version bumped to `2.0`.
|
|
13
|
+
- **`setup` skill expanded** — project tree listing now reflects everything `init` actually creates (configs, Dockerfile, `.vscode/`, `server.json`, starter tests, app-tool + app-resource pair). Added a "Changelog Convention" section and a "Next Steps" progression through `design-mcp-server` → scaffolding skills → `add-test` → `field-test` → `polish-docs-meta` → `maintenance`. Version bumped to `1.5`.
|
|
14
|
+
- **`publish-mcp` script** now logs into the MCP Publisher with a Keychain-stored GitHub PAT before publishing: `mcp-publisher login github -token "$(security find-generic-password -a "$USER" -s mcp-publisher-github-pat -w)" && mcp-publisher publish`. Matches the flow documented in the `release-and-publish` skill.
|
|
15
|
+
- **Agent protocol references updated** — `CLAUDE.md`, `AGENTS.md`, `README.md`, and `skills/polish-docs-meta/references/package-meta.md` now point at `release-and-publish` instead of the old `release` skill.
|
|
16
|
+
|
|
17
|
+
## Dependencies
|
|
18
|
+
|
|
19
|
+
- `@cloudflare/workers-types` `^4.20260422.1` → `^4.20260423.1`
|
|
20
|
+
- `@supabase/supabase-js` `^2.104.0` → `^2.104.1`
|
|
21
|
+
- `vite` `8.0.9` → `8.0.10`
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
{"level":50,"time":1776955661645,"env":"testing","version":"0.0.0-test","pid":87698,"requestId":"H425Q-YZMFD","timestamp":"2026-04-23T14:47:41.643Z","operation":"HandleToolRequest","input":{"message":"blocked"},"critical":false,"errorCode":-32005,"originalErrorType":"McpError","finalErrorType":"McpError","sessionId":"6d54688d1f715b37c579af1c10830fb526330c8eb39f929290a28bb4cebbc41e","toolName":"scoped_echo","tenantId":"authz-tenant","auth":{"sub":"authz-user","scopes":["tool:other:read"],"clientId":"authz-client","tenantId":"authz-tenant"},"errorData":{"sessionId":"6d54688d1f715b37c579af1c10830fb526330c8eb39f929290a28bb4cebbc41e","toolName":"scoped_echo","input":{"message":"blocked"},"requestId":"H425Q-YZMFD","timestamp":"2026-04-23T14:47:41.643Z","tenantId":"authz-tenant","operation":"HandleToolRequest","auth":{"sub":"authz-user","scopes":["tool:other:read"],"clientId":"authz-client","tenantId":"authz-tenant"},"originalErrorName":"McpError","originalMessage":"Insufficient permissions.","originalStack":"McpError: Insufficient permissions.\n at forbidden (/Users/casey/Developer/github/mcp-ts-core/dist/types-global/errors.js:84:58)\n at withRequiredScopes (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/auth/lib/authUtils.js:61:15)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/tools/utils/toolHandlerFactory.js:68:17)\n at executeToolHandler (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:231:34)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:126:43)\n at processTicksAndRejections (native:7:39)"},"stack":"McpError: Insufficient permissions.\n at handleError (/Users/casey/Developer/github/mcp-ts-core/dist/utils/internal/error-handler/errorHandler.js:168:23)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/tools/utils/toolHandlerFactory.js:101:42)\n at executeToolHandler (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:231:34)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:126:43)\n at processTicksAndRejections (native:7:39)","msg":"Error in tool:scoped_echo: Insufficient permissions."}
|
|
2
|
+
{"level":50,"time":1776955662508,"env":"testing","version":"0.6.10","pid":87732,"requestId":"RD7TQ-YRWS5","timestamp":"2026-04-23T14:47:42.507Z","operation":"httpErrorHandler","critical":false,"errorCode":-32006,"originalErrorType":"McpError","finalErrorType":"McpError","path":"/mcp","method":"POST","errorData":{"path":"/mcp","method":"POST","requestId":"RD7TQ-YRWS5","timestamp":"2026-04-23T14:47:42.507Z","operation":"httpErrorHandler","originalErrorName":"McpError","originalMessage":"Missing or invalid Authorization header. Bearer scheme required.","originalStack":"McpError: Missing or invalid Authorization header. Bearer scheme required.\n at unauthorized (/Users/casey/Developer/github/mcp-ts-core/dist/types-global/errors.js:86:61)\n at authMiddleware (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/auth/authMiddleware.js:64:19)\n at dispatch (/Users/casey/Developer/github/mcp-ts-core/node_modules/hono/dist/compose.js:22:23)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/http/httpTransport.js:119:22)\n at dispatch (/Users/casey/Developer/github/mcp-ts-core/node_modules/hono/dist/compose.js:22:23)\n at cors2 (/Users/casey/Developer/github/mcp-ts-core/node_modules/hono/dist/middleware/cors/index.js:82:11)\n at processTicksAndRejections (native:7:39)"},"stack":"McpError: Missing or invalid Authorization header. Bearer scheme required.\n at handleError (/Users/casey/Developer/github/mcp-ts-core/dist/utils/internal/error-handler/errorHandler.js:168:23)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/http/httpErrorHandler.js:59:39)\n at dispatch (/Users/casey/Developer/github/mcp-ts-core/node_modules/hono/dist/compose.js:26:25)\n at processTicksAndRejections (native:7:39)","msg":"Error in httpTransport: Missing or invalid Authorization header. Bearer scheme required."}
|
|
3
|
+
{"level":50,"time":1776955662525,"env":"testing","version":"0.6.10","pid":87732,"requestId":"UHB72-SFY34","timestamp":"2026-04-23T14:47:42.524Z","operation":"httpErrorHandler","critical":false,"errorCode":-32006,"originalErrorType":"McpError","finalErrorType":"McpError","path":"/mcp","method":"POST","errorData":{"path":"/mcp","method":"POST","requestId":"UHB72-SFY34","timestamp":"2026-04-23T14:47:42.524Z","operation":"httpErrorHandler","originalErrorName":"McpError","originalMessage":"Token has expired.","originalStack":"McpError: Token has expired.\n at unauthorized (/Users/casey/Developer/github/mcp-ts-core/dist/types-global/errors.js:86:61)\n at handleJoseVerifyError (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/auth/lib/claimParser.js:56:11)\n at verify (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/auth/strategies/jwtStrategy.js:91:13)\n at processTicksAndRejections (native:7:39)"},"stack":"McpError: Token has expired.\n at handleError (/Users/casey/Developer/github/mcp-ts-core/dist/utils/internal/error-handler/errorHandler.js:168:23)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/http/httpErrorHandler.js:59:39)\n at dispatch (/Users/casey/Developer/github/mcp-ts-core/node_modules/hono/dist/compose.js:26:25)\n at processTicksAndRejections (native:7:39)","msg":"Error in httpTransport: Token has expired."}
|
|
4
|
+
{"level":50,"time":1776955662529,"env":"testing","version":"0.6.10","pid":87732,"requestId":"TCIU4-1PP9W","timestamp":"2026-04-23T14:47:42.529Z","operation":"httpErrorHandler","critical":false,"errorCode":-32006,"originalErrorType":"McpError","finalErrorType":"McpError","path":"/mcp","method":"GET","errorData":{"path":"/mcp","method":"GET","requestId":"TCIU4-1PP9W","timestamp":"2026-04-23T14:47:42.529Z","operation":"httpErrorHandler","originalErrorName":"McpError","originalMessage":"Missing or invalid Authorization header. Bearer scheme required.","originalStack":"McpError: Missing or invalid Authorization header. Bearer scheme required.\n at unauthorized (/Users/casey/Developer/github/mcp-ts-core/dist/types-global/errors.js:86:61)\n at authMiddleware (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/auth/authMiddleware.js:64:19)\n at dispatch (/Users/casey/Developer/github/mcp-ts-core/node_modules/hono/dist/compose.js:22:23)\n at dispatch (/Users/casey/Developer/github/mcp-ts-core/node_modules/hono/dist/compose.js:22:23)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/http/httpTransport.js:119:22)\n at dispatch (/Users/casey/Developer/github/mcp-ts-core/node_modules/hono/dist/compose.js:22:23)\n at cors2 (/Users/casey/Developer/github/mcp-ts-core/node_modules/hono/dist/middleware/cors/index.js:82:11)\n at processTicksAndRejections (native:7:39)"},"stack":"McpError: Missing or invalid Authorization header. Bearer scheme required.\n at handleError (/Users/casey/Developer/github/mcp-ts-core/dist/utils/internal/error-handler/errorHandler.js:168:23)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/http/httpErrorHandler.js:59:39)\n at dispatch (/Users/casey/Developer/github/mcp-ts-core/node_modules/hono/dist/compose.js:26:25)\n at processTicksAndRejections (native:7:39)","msg":"Error in httpTransport: Missing or invalid Authorization header. Bearer scheme required."}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
{"level":50,"time":1776955661645,"env":"testing","version":"0.0.0-test","pid":87698,"requestId":"H425Q-YZMFD","timestamp":"2026-04-23T14:47:41.643Z","operation":"HandleToolRequest","input":{"message":"blocked"},"critical":false,"errorCode":-32005,"originalErrorType":"McpError","finalErrorType":"McpError","sessionId":"6d54688d1f715b37c579af1c10830fb526330c8eb39f929290a28bb4cebbc41e","toolName":"scoped_echo","tenantId":"authz-tenant","auth":{"sub":"authz-user","scopes":["tool:other:read"],"clientId":"authz-client","tenantId":"authz-tenant"},"errorData":{"sessionId":"6d54688d1f715b37c579af1c10830fb526330c8eb39f929290a28bb4cebbc41e","toolName":"scoped_echo","input":{"message":"blocked"},"requestId":"H425Q-YZMFD","timestamp":"2026-04-23T14:47:41.643Z","tenantId":"authz-tenant","operation":"HandleToolRequest","auth":{"sub":"authz-user","scopes":["tool:other:read"],"clientId":"authz-client","tenantId":"authz-tenant"},"originalErrorName":"McpError","originalMessage":"Insufficient permissions.","originalStack":"McpError: Insufficient permissions.\n at forbidden (/Users/casey/Developer/github/mcp-ts-core/dist/types-global/errors.js:84:58)\n at withRequiredScopes (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/auth/lib/authUtils.js:61:15)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/tools/utils/toolHandlerFactory.js:68:17)\n at executeToolHandler (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:231:34)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:126:43)\n at processTicksAndRejections (native:7:39)"},"stack":"McpError: Insufficient permissions.\n at handleError (/Users/casey/Developer/github/mcp-ts-core/dist/utils/internal/error-handler/errorHandler.js:168:23)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/tools/utils/toolHandlerFactory.js:101:42)\n at executeToolHandler (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:231:34)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/node_modules/@modelcontextprotocol/sdk/dist/esm/server/mcp.js:126:43)\n at processTicksAndRejections (native:7:39)","msg":"Error in tool:scoped_echo: Insufficient permissions."}
|
|
2
|
+
{"level":50,"time":1776955662508,"env":"testing","version":"0.6.10","pid":87732,"requestId":"RD7TQ-YRWS5","timestamp":"2026-04-23T14:47:42.507Z","operation":"httpErrorHandler","critical":false,"errorCode":-32006,"originalErrorType":"McpError","finalErrorType":"McpError","path":"/mcp","method":"POST","errorData":{"path":"/mcp","method":"POST","requestId":"RD7TQ-YRWS5","timestamp":"2026-04-23T14:47:42.507Z","operation":"httpErrorHandler","originalErrorName":"McpError","originalMessage":"Missing or invalid Authorization header. Bearer scheme required.","originalStack":"McpError: Missing or invalid Authorization header. Bearer scheme required.\n at unauthorized (/Users/casey/Developer/github/mcp-ts-core/dist/types-global/errors.js:86:61)\n at authMiddleware (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/auth/authMiddleware.js:64:19)\n at dispatch (/Users/casey/Developer/github/mcp-ts-core/node_modules/hono/dist/compose.js:22:23)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/http/httpTransport.js:119:22)\n at dispatch (/Users/casey/Developer/github/mcp-ts-core/node_modules/hono/dist/compose.js:22:23)\n at cors2 (/Users/casey/Developer/github/mcp-ts-core/node_modules/hono/dist/middleware/cors/index.js:82:11)\n at processTicksAndRejections (native:7:39)"},"stack":"McpError: Missing or invalid Authorization header. Bearer scheme required.\n at handleError (/Users/casey/Developer/github/mcp-ts-core/dist/utils/internal/error-handler/errorHandler.js:168:23)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/http/httpErrorHandler.js:59:39)\n at dispatch (/Users/casey/Developer/github/mcp-ts-core/node_modules/hono/dist/compose.js:26:25)\n at processTicksAndRejections (native:7:39)","msg":"Error in httpTransport: Missing or invalid Authorization header. Bearer scheme required."}
|
|
3
|
+
{"level":50,"time":1776955662525,"env":"testing","version":"0.6.10","pid":87732,"requestId":"UHB72-SFY34","timestamp":"2026-04-23T14:47:42.524Z","operation":"httpErrorHandler","critical":false,"errorCode":-32006,"originalErrorType":"McpError","finalErrorType":"McpError","path":"/mcp","method":"POST","errorData":{"path":"/mcp","method":"POST","requestId":"UHB72-SFY34","timestamp":"2026-04-23T14:47:42.524Z","operation":"httpErrorHandler","originalErrorName":"McpError","originalMessage":"Token has expired.","originalStack":"McpError: Token has expired.\n at unauthorized (/Users/casey/Developer/github/mcp-ts-core/dist/types-global/errors.js:86:61)\n at handleJoseVerifyError (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/auth/lib/claimParser.js:56:11)\n at verify (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/auth/strategies/jwtStrategy.js:91:13)\n at processTicksAndRejections (native:7:39)"},"stack":"McpError: Token has expired.\n at handleError (/Users/casey/Developer/github/mcp-ts-core/dist/utils/internal/error-handler/errorHandler.js:168:23)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/http/httpErrorHandler.js:59:39)\n at dispatch (/Users/casey/Developer/github/mcp-ts-core/node_modules/hono/dist/compose.js:26:25)\n at processTicksAndRejections (native:7:39)","msg":"Error in httpTransport: Token has expired."}
|
|
4
|
+
{"level":50,"time":1776955662529,"env":"testing","version":"0.6.10","pid":87732,"requestId":"TCIU4-1PP9W","timestamp":"2026-04-23T14:47:42.529Z","operation":"httpErrorHandler","critical":false,"errorCode":-32006,"originalErrorType":"McpError","finalErrorType":"McpError","path":"/mcp","method":"GET","errorData":{"path":"/mcp","method":"GET","requestId":"TCIU4-1PP9W","timestamp":"2026-04-23T14:47:42.529Z","operation":"httpErrorHandler","originalErrorName":"McpError","originalMessage":"Missing or invalid Authorization header. Bearer scheme required.","originalStack":"McpError: Missing or invalid Authorization header. Bearer scheme required.\n at unauthorized (/Users/casey/Developer/github/mcp-ts-core/dist/types-global/errors.js:86:61)\n at authMiddleware (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/auth/authMiddleware.js:64:19)\n at dispatch (/Users/casey/Developer/github/mcp-ts-core/node_modules/hono/dist/compose.js:22:23)\n at dispatch (/Users/casey/Developer/github/mcp-ts-core/node_modules/hono/dist/compose.js:22:23)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/http/httpTransport.js:119:22)\n at dispatch (/Users/casey/Developer/github/mcp-ts-core/node_modules/hono/dist/compose.js:22:23)\n at cors2 (/Users/casey/Developer/github/mcp-ts-core/node_modules/hono/dist/middleware/cors/index.js:82:11)\n at processTicksAndRejections (native:7:39)"},"stack":"McpError: Missing or invalid Authorization header. Bearer scheme required.\n at handleError (/Users/casey/Developer/github/mcp-ts-core/dist/utils/internal/error-handler/errorHandler.js:168:23)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/transports/http/httpErrorHandler.js:59:39)\n at dispatch (/Users/casey/Developer/github/mcp-ts-core/node_modules/hono/dist/compose.js:26:25)\n at processTicksAndRejections (native:7:39)","msg":"Error in httpTransport: Missing or invalid Authorization header. Bearer scheme required."}
|
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cyanheads/mcp-ts-core",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.10",
|
|
4
4
|
"mcpName": "io.github.cyanheads/mcp-ts-core",
|
|
5
5
|
"description": "Agent-native TypeScript framework for building MCP servers. Declarative definitions with auth, multi-backend storage, OpenTelemetry, and first-class support for Bun/Node/Cloudflare Workers.",
|
|
6
6
|
"main": "dist/core/index.js",
|
|
@@ -146,7 +146,7 @@
|
|
|
146
146
|
"audit:fix": "bun audit --fix",
|
|
147
147
|
"changelog:build": "bun run scripts/build-changelog.ts",
|
|
148
148
|
"changelog:check": "bun run scripts/build-changelog.ts --check",
|
|
149
|
-
"publish-mcp": "
|
|
149
|
+
"publish-mcp": "mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish"
|
|
150
150
|
},
|
|
151
151
|
"resolutions": {
|
|
152
152
|
"brace-expansion": "1.1.14",
|
|
@@ -160,7 +160,7 @@
|
|
|
160
160
|
},
|
|
161
161
|
"devDependencies": {
|
|
162
162
|
"@biomejs/biome": "2.4.12",
|
|
163
|
-
"@cloudflare/workers-types": "^4.
|
|
163
|
+
"@cloudflare/workers-types": "^4.20260423.1",
|
|
164
164
|
"@hono/otel": "^1.1.1",
|
|
165
165
|
"@opentelemetry/instrumentation-http": "^0.215.0",
|
|
166
166
|
"@opentelemetry/exporter-metrics-otlp-http": "^0.215.0",
|
|
@@ -171,7 +171,7 @@
|
|
|
171
171
|
"@opentelemetry/sdk-node": "^0.215.0",
|
|
172
172
|
"@opentelemetry/sdk-trace-node": "^2.7.0",
|
|
173
173
|
"@opentelemetry/semantic-conventions": "^1.40.0",
|
|
174
|
-
"@supabase/supabase-js": "^2.104.
|
|
174
|
+
"@supabase/supabase-js": "^2.104.1",
|
|
175
175
|
"@types/bun": "^1.3.13",
|
|
176
176
|
"@types/js-yaml": "^4.0.9",
|
|
177
177
|
"@types/node": "^25.6.0",
|
|
@@ -202,7 +202,7 @@
|
|
|
202
202
|
"typescript": "^6.0.3",
|
|
203
203
|
"unpdf": "^1.6.0",
|
|
204
204
|
"validator": "^13.15.35",
|
|
205
|
-
"vite": "8.0.
|
|
205
|
+
"vite": "8.0.10",
|
|
206
206
|
"vitest": "^4.1.5"
|
|
207
207
|
},
|
|
208
208
|
"keywords": [
|
|
@@ -7,7 +7,7 @@ Fields that may still be empty or generic from scaffolding. Check each one and f
|
|
|
7
7
|
| Field | Default / Scaffolded | What It Should Be |
|
|
8
8
|
|:------|:---------------------|:------------------|
|
|
9
9
|
| `name` | `{{PACKAGE_NAME}}` (substituted by init) | Verify it's correct. Use scoped name if publishing (`@org/my-server`). |
|
|
10
|
-
| `version` | `0.1.0` | Keep for initial development. Bump via the `release` skill. |
|
|
10
|
+
| `version` | `0.1.0` | Keep for initial development. Bump via the `release-and-publish` skill. |
|
|
11
11
|
| `mcpName` | _(often missing)_ | Reverse-domain identifier: `"io.github.{owner}/{repo}"`. Used in `server.json` `name` field and Dockerfile OCI labels. |
|
|
12
12
|
| `description` | `""` (empty) | One sentence: what the server does and what it wraps. Appears on npm and in `npm search`. |
|
|
13
13
|
| `repository` | _(often missing)_ | `{ "type": "git", "url": "git+https://github.com/org/repo.git" }` |
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: release-and-publish
|
|
3
|
+
description: >
|
|
4
|
+
Ship a release end-to-end across every registry the project targets (npm, MCP Registry, GHCR). Runs the final verification gate, pushes commits and tags, then publishes to each applicable destination. Assumes git wrapup (version bumps, changelog, commit, annotated tag) is already complete — this skill is the post-wrapup publish workflow. Halts and alerts the user on the first failure.
|
|
5
|
+
metadata:
|
|
6
|
+
author: cyanheads
|
|
7
|
+
version: "2.0"
|
|
8
|
+
audience: external
|
|
9
|
+
type: workflow
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## Preconditions
|
|
13
|
+
|
|
14
|
+
This skill runs **after** git wrapup. By the time it's invoked:
|
|
15
|
+
|
|
16
|
+
- `package.json` version is bumped
|
|
17
|
+
- `changelog/<major.minor>.x/<version>.md` is authored
|
|
18
|
+
- `CHANGELOG.md` is regenerated
|
|
19
|
+
- README and every version-bearing file is in sync
|
|
20
|
+
- Release commit (`chore: release v<version>`) exists
|
|
21
|
+
- Annotated tag (`v<version>`) exists locally
|
|
22
|
+
- Working tree is clean
|
|
23
|
+
|
|
24
|
+
If any are missing, halt and tell the user to finish wrapup first. Do not attempt to redo wrapup work from inside this skill.
|
|
25
|
+
|
|
26
|
+
## Failure Protocol
|
|
27
|
+
|
|
28
|
+
**Stop on the first non-zero exit.** No retries, no remediation from inside the skill. Report to the user:
|
|
29
|
+
|
|
30
|
+
1. Which step failed
|
|
31
|
+
2. The exact error output
|
|
32
|
+
3. Which destinations already received the release (npm published? tag pushed? etc.) so they know the partial state
|
|
33
|
+
|
|
34
|
+
The user fixes locally and re-invokes, or runs the remaining steps manually. Publishes hard-fail with "version already exists" if replayed — that's the signal the step already succeeded.
|
|
35
|
+
|
|
36
|
+
## Steps
|
|
37
|
+
|
|
38
|
+
### 1. Sanity-check wrapup outputs
|
|
39
|
+
|
|
40
|
+
Read `package.json` → capture `version`. Then verify:
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
git status --porcelain # must be empty — clean working tree
|
|
44
|
+
git describe --exact-match --tags HEAD 2>&1 # must equal v<version>
|
|
45
|
+
git rev-parse --abbrev-ref HEAD # note the branch name for step 3
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
If working tree is dirty or HEAD isn't on `v<version>`, halt.
|
|
49
|
+
|
|
50
|
+
### 2. Run the verification gate
|
|
51
|
+
|
|
52
|
+
All three must succeed. Use `test:all` if the script exists in `package.json`, otherwise fall back to `test`:
|
|
53
|
+
|
|
54
|
+
```bash
|
|
55
|
+
bun run devcheck
|
|
56
|
+
bun run rebuild
|
|
57
|
+
bun run test:all # or `bun run test` if no test:all
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
Any non-zero exit → halt with the failing command's output.
|
|
61
|
+
|
|
62
|
+
### 3. Push to origin
|
|
63
|
+
|
|
64
|
+
```bash
|
|
65
|
+
git push
|
|
66
|
+
git push --tags
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
If the remote rejects either push, halt.
|
|
70
|
+
|
|
71
|
+
### 4. Publish to npm
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
bun publish --access public
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
`bun publish` uses whatever npm auth the user has configured in `~/.npmrc`. If 2FA is enabled on the npm account, the command will prompt for an OTP or open a browser — that's expected; the user completes it interactively.
|
|
78
|
+
|
|
79
|
+
**Friction reducers (optional, configure once):**
|
|
80
|
+
|
|
81
|
+
| Option | How |
|
|
82
|
+
|:--|:--|
|
|
83
|
+
| **npm granular access token** with "Bypass 2FA for publish" | Generate at npmjs.com → replace `_authToken` in `~/.npmrc` → no OTP prompt at all |
|
|
84
|
+
| **1Password CLI TOTP injection** (requires `brew install --cask 1password-cli` + signed-in `op`) | `bun publish --access public --otp="$(op item get 'npm' --otp)"` |
|
|
85
|
+
|
|
86
|
+
Halt on publish error other than "version already exists" (which means this step already ran).
|
|
87
|
+
|
|
88
|
+
### 5. Publish to MCP Registry
|
|
89
|
+
|
|
90
|
+
Only if `server.json` exists at the repo root (otherwise skip).
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
bun run publish-mcp
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
If `publish-mcp` isn't defined in `package.json`, add it (macOS):
|
|
97
|
+
|
|
98
|
+
```json
|
|
99
|
+
"publish-mcp": "mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish"
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
Prereq: a GitHub PAT with `read:org` + `read:user` scopes stored in Keychain under the service name `mcp-publisher-github-pat`:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
security add-generic-password -a "$USER" -s mcp-publisher-github-pat -w
|
|
106
|
+
# paste PAT at the silent prompt
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Halt on any publisher error other than "cannot publish duplicate version".
|
|
110
|
+
|
|
111
|
+
### 6. Publish Docker image
|
|
112
|
+
|
|
113
|
+
Only if `Dockerfile` exists at the repo root (otherwise skip).
|
|
114
|
+
|
|
115
|
+
Derive:
|
|
116
|
+
|
|
117
|
+
- `OWNER/REPO` from `git remote get-url origin` (strip `.git`, handle both `https://github.com/<owner>/<repo>` and `git@github.com:<owner>/<repo>` forms)
|
|
118
|
+
- `VERSION` from `package.json` (step 1)
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
docker buildx build --platform linux/amd64,linux/arm64 \
|
|
122
|
+
-t ghcr.io/<OWNER>/<REPO>:<VERSION> \
|
|
123
|
+
-t ghcr.io/<OWNER>/<REPO>:latest \
|
|
124
|
+
--push .
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
If the project uses a non-GHCR registry or a custom image name, respect the project's convention. Halt on build or push failure.
|
|
128
|
+
|
|
129
|
+
### 7. Report the deployed artifacts
|
|
130
|
+
|
|
131
|
+
Print clickable URLs for every destination that succeeded:
|
|
132
|
+
|
|
133
|
+
- npm: `https://www.npmjs.com/package/<package.json#name>/v/<version>`
|
|
134
|
+
- MCP Registry: `https://registry.modelcontextprotocol.io/v0/servers?search=<package.json#mcpName>`
|
|
135
|
+
- GHCR: `ghcr.io/<OWNER>/<REPO>:<VERSION>`
|
|
136
|
+
|
|
137
|
+
Skip any destination that was skipped in its step.
|
|
138
|
+
|
|
139
|
+
## Checklist
|
|
140
|
+
|
|
141
|
+
- [ ] Working tree clean; HEAD tagged `v<version>`
|
|
142
|
+
- [ ] `bun run devcheck` passes
|
|
143
|
+
- [ ] `bun run rebuild` succeeds
|
|
144
|
+
- [ ] `bun run test:all` (or `test`) passes
|
|
145
|
+
- [ ] `git push` succeeds
|
|
146
|
+
- [ ] `git push --tags` succeeds
|
|
147
|
+
- [ ] `bun publish --access public` succeeds
|
|
148
|
+
- [ ] `bun run publish-mcp` succeeds (if `server.json` present)
|
|
149
|
+
- [ ] Docker buildx multi-arch push succeeds (if `Dockerfile` present)
|
|
150
|
+
- [ ] Deployed artifact URLs reported to the user
|
package/skills/setup/SKILL.md
CHANGED
|
@@ -4,7 +4,7 @@ description: >
|
|
|
4
4
|
Post-init orientation for an MCP server built on @cyanheads/mcp-ts-core. Use after running `@cyanheads/mcp-ts-core init` to understand the project structure, conventions, and skill sync model. Also use when onboarding to an existing project for the first time.
|
|
5
5
|
metadata:
|
|
6
6
|
author: cyanheads
|
|
7
|
-
version: "1.
|
|
7
|
+
version: "1.5"
|
|
8
8
|
audience: external
|
|
9
9
|
type: workflow
|
|
10
10
|
---
|
|
@@ -29,19 +29,39 @@ For the full framework API, read `node_modules/@cyanheads/mcp-ts-core/CLAUDE.md`
|
|
|
29
29
|
What `init` actually creates:
|
|
30
30
|
|
|
31
31
|
```text
|
|
32
|
-
CLAUDE.md # Agent protocol
|
|
33
|
-
AGENTS.md #
|
|
34
|
-
.
|
|
35
|
-
|
|
32
|
+
CLAUDE.md # Agent protocol — Claude Code
|
|
33
|
+
AGENTS.md # Agent protocol — other agents (Codex, Cursor, etc.)
|
|
34
|
+
package.json # Starter deps + scripts (placeholders substituted on init)
|
|
35
|
+
tsconfig.json # TypeScript config
|
|
36
|
+
tsconfig.build.json # Build-only TS config
|
|
37
|
+
vitest.config.ts # Test runner config
|
|
38
|
+
biome.json # Lint + format config
|
|
39
|
+
devcheck.config.json # Which devcheck steps to run
|
|
40
|
+
Dockerfile # Starter multi-stage image
|
|
41
|
+
.dockerignore
|
|
42
|
+
.env.example # Copy to .env and fill in
|
|
43
|
+
.gitignore
|
|
44
|
+
.github/ISSUE_TEMPLATE/ # Bug / feature-request issue forms
|
|
45
|
+
.vscode/ # Recommended extensions + editor settings
|
|
46
|
+
server.json # MCP Registry publishing metadata
|
|
47
|
+
changelog/template.md # Format reference for per-version changelog files
|
|
48
|
+
scripts/ # build, clean, devcheck, lint-mcp, build-changelog, tree, check-docs-sync
|
|
49
|
+
skills/ # External skills copied from the package (source of truth)
|
|
36
50
|
src/
|
|
37
51
|
index.ts # createApp() entry point
|
|
38
52
|
mcp-server/
|
|
39
53
|
tools/definitions/
|
|
40
|
-
echo.tool.ts #
|
|
54
|
+
echo.tool.ts # Standard tool starter
|
|
55
|
+
echo-app.app-tool.ts # UI-enabled app tool starter (pairs with echo-app-ui resource)
|
|
41
56
|
resources/definitions/
|
|
42
|
-
echo.resource.ts #
|
|
57
|
+
echo.resource.ts # Standard resource starter
|
|
58
|
+
echo-app-ui.app-resource.ts # UI resource paired with echo-app app tool
|
|
43
59
|
prompts/definitions/
|
|
44
|
-
echo.prompt.ts #
|
|
60
|
+
echo.prompt.ts # Prompt starter
|
|
61
|
+
tests/
|
|
62
|
+
tools/echo.tool.test.ts # Starter tests (one per echo definition)
|
|
63
|
+
resources/echo.resource.test.ts
|
|
64
|
+
prompts/echo.prompt.test.ts
|
|
45
65
|
```
|
|
46
66
|
|
|
47
67
|
Add these as needed:
|
|
@@ -59,11 +79,24 @@ src/
|
|
|
59
79
|
|
|
60
80
|
## Scaffolded Echo Definitions
|
|
61
81
|
|
|
62
|
-
The init creates echo definitions
|
|
82
|
+
The init creates five echo definitions plus matching starter tests:
|
|
63
83
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
84
|
+
| File | Demonstrates |
|
|
85
|
+
|:--|:--|
|
|
86
|
+
| `echo.tool.ts` | Standard MCP tool: input/output Zod schemas, `handler`, `format` |
|
|
87
|
+
| `echo-app.app-tool.ts` | MCP App tool — same as a tool, but emits a UI (`ui_app://` link) for clients that render MCP Apps |
|
|
88
|
+
| `echo.resource.ts` | Standard MCP resource with a parameterised URI template |
|
|
89
|
+
| `echo-app-ui.app-resource.ts` | UI resource served to MCP App clients; paired with `echo-app.app-tool.ts` |
|
|
90
|
+
| `echo.prompt.ts` | Prompt template (pure message generator) |
|
|
91
|
+
| `tests/**/echo.*.test.ts` | Starter tests using `createMockContext` — edit alongside the definitions |
|
|
92
|
+
|
|
93
|
+
After init:
|
|
94
|
+
|
|
95
|
+
1. **Clean up what you don't need.** If your server has no prompts, delete the echo prompt and its registration in `src/index.ts`. Same for resources, or the app-tool pair if you're not targeting UI-capable clients.
|
|
96
|
+
2. **Rename and replace what you keep.** The echo definitions and their tests show the pattern — swap them out for your real tools/resources/prompts.
|
|
97
|
+
3. **Definitions register directly in `src/index.ts`.** No barrel files, just import and add to the `tools` / `resources` / `prompts` arrays.
|
|
98
|
+
|
|
99
|
+
See the `add-tool`, `add-app-tool`, `add-resource`, `add-prompt`, and `add-test` skills for the scaffolding patterns when you start adding real definitions.
|
|
67
100
|
|
|
68
101
|
## Conventions
|
|
69
102
|
|
|
@@ -71,7 +104,7 @@ The init creates echo definitions for tools, resources, and prompts. They're fun
|
|
|
71
104
|
|:-----------|:-----|
|
|
72
105
|
| File names | kebab-case |
|
|
73
106
|
| Tool/resource/prompt names | snake_case, prefixed with server name (e.g. `tasks_fetch_list`) |
|
|
74
|
-
| File suffixes | `.tool.ts`, `.resource.ts`, `.prompt.ts` |
|
|
107
|
+
| File suffixes | `.tool.ts`, `.resource.ts`, `.prompt.ts`, `.app-tool.ts` (UI-enabled), `.app-resource.ts` (paired UI resource) |
|
|
75
108
|
| Imports (framework) | `@cyanheads/mcp-ts-core` and subpaths |
|
|
76
109
|
| Imports (server code) | `@/` path alias for `src/` |
|
|
77
110
|
|
|
@@ -97,6 +130,23 @@ After `bun install`, complete these one-time setup tasks:
|
|
|
97
130
|
2. **Initialize git** — `git init && git add -A && git commit -m "chore: scaffold from @cyanheads/mcp-ts-core"`
|
|
98
131
|
3. **Verify agent protocol placeholders** — if the `init` CLI was run without a `[name]` argument, `{{PACKAGE_NAME}}` may remain as a literal in `CLAUDE.md`/`AGENTS.md` and `package.json`. Replace it with the actual server name.
|
|
99
132
|
|
|
133
|
+
## Changelog Convention
|
|
134
|
+
|
|
135
|
+
`changelog/template.md` ships as a **format reference** — never edit, rename, or move it. For each release, author a per-version file at `changelog/<major.minor>.x/<version>.md` (e.g. `changelog/0.1.x/0.1.0.md`) with YAML frontmatter (`summary:` + optional `breaking:`) and grouped sections (Added / Changed / Fixed / Removed). Then regenerate the rollup with `bun run changelog:build` — `CHANGELOG.md` is an auto-generated navigation index, never hand-edited. See the `release-and-publish` skill for the full release flow.
|
|
136
|
+
|
|
137
|
+
## Next Steps
|
|
138
|
+
|
|
139
|
+
The included skills form a rough progression — not a rigid sequence, but the typical flow through a new server:
|
|
140
|
+
|
|
141
|
+
1. **`design-mcp-server`** — map the domain into tools, resources, and services before writing any definitions
|
|
142
|
+
2. **`add-tool`** / **`add-app-tool`** / **`add-resource`** / **`add-prompt`** / **`add-service`** — scaffold each piece as you go
|
|
143
|
+
3. **`add-test`** — pair tests with each definition (or retrofit later)
|
|
144
|
+
4. **`field-test`** — exercise the built surface with real and adversarial inputs; produces a report of issues and pain points
|
|
145
|
+
5. **`polish-docs-meta`** — finalize README, metadata, and agent protocol before shipping
|
|
146
|
+
6. **`maintenance`** — after `bun update --latest`, investigate upstream changelogs and re-sync skills
|
|
147
|
+
|
|
148
|
+
Skip or reorder as the project calls for it. The agent protocol's "What's Next?" section is the authoritative map once the first session is over.
|
|
149
|
+
|
|
100
150
|
## Checklist
|
|
101
151
|
|
|
102
152
|
- [ ] Agent protocol file selected — keep one authoritative file (`CLAUDE.md` or `AGENTS.md`)
|
|
@@ -106,4 +156,4 @@ After `bun install`, complete these one-time setup tasks:
|
|
|
106
156
|
- [ ] Skills copied to agent directory (`cp -R skills/* .claude/skills/` or equivalent)
|
|
107
157
|
- [ ] Project structure understood (definitions directories, entry point)
|
|
108
158
|
- [ ] `bun run devcheck` passes
|
|
109
|
-
- [ ]
|
|
159
|
+
- [ ] Next: if new server, move on to `design-mcp-server` to plan the tool surface
|
package/skills/release/SKILL.md
DELETED
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: release
|
|
3
|
-
description: >
|
|
4
|
-
Verify release readiness and publish. The git wrapup protocol handles version bumps, changelog, README, commits, and tagging during the coding session. This skill verifies nothing was missed, runs final checks, and presents the irreversible publish commands.
|
|
5
|
-
metadata:
|
|
6
|
-
author: cyanheads
|
|
7
|
-
version: "1.5"
|
|
8
|
-
audience: internal
|
|
9
|
-
type: workflow
|
|
10
|
-
---
|
|
11
|
-
|
|
12
|
-
## Context
|
|
13
|
-
|
|
14
|
-
By the time this skill runs, the git wrapup protocol should have already handled: changelog entry, version bumps, README updates, atomic commits, and an annotated tag. This skill is the **final verification gate** before irreversible publish commands. Its job is to catch anything the wrapup missed or got wrong — not to redo the work.
|
|
15
|
-
|
|
16
|
-
## Steps
|
|
17
|
-
|
|
18
|
-
### 1. Confirm the Target Version
|
|
19
|
-
|
|
20
|
-
Read `package.json` to get the version. This is the source of truth. If the user hasn't decided on the bump level yet (patch/minor/major), ask now — but usually this was already set during wrapup.
|
|
21
|
-
|
|
22
|
-
### 2. Verify Version Consistency
|
|
23
|
-
|
|
24
|
-
The wrapup protocol bumps versions, but sometimes a file gets missed. **Search for the old version string** across the repo and verify the new version appears in all required locations:
|
|
25
|
-
|
|
26
|
-
| File | What to Verify |
|
|
27
|
-
|:-----|:---------------|
|
|
28
|
-
| `package.json` | `version` field |
|
|
29
|
-
| `server.json` | Root `version` + `version` in each `packages[]` entry (3 total) |
|
|
30
|
-
| `CLAUDE.md` | Version in the header (`**Version:** X.Y.Z`) |
|
|
31
|
-
| `README.md` | Version badge (`Version-X.Y.Z-blue`) and any other version references |
|
|
32
|
-
| `templates/CLAUDE.md` | `**Version:** X.Y.Z` in the header |
|
|
33
|
-
| `templates/AGENTS.md` | Same — these files are identical |
|
|
34
|
-
|
|
35
|
-
Fix any mismatches. A grep for the **old** version is the fastest way to find stragglers.
|
|
36
|
-
|
|
37
|
-
### 3. Finalize the Per-Version Changelog File
|
|
38
|
-
|
|
39
|
-
The changelog is directory-based, grouped by minor series using the `.x` semver-wildcard convention: per-version files live at `changelog/<major.minor>.x/<version>.md` (e.g. `changelog/0.5.x/0.5.4.md`), and `CHANGELOG.md` is an auto-generated rollup (`bun run changelog:build`). `changelog/template.md` is a **pristine format reference** — never edited, never moved, never renamed. At release time, you're authoring (or finalizing) the per-version file for the version being shipped.
|
|
40
|
-
|
|
41
|
-
Create or finalize `changelog/<series>/<version>.md`:
|
|
42
|
-
|
|
43
|
-
1. Determine the series: `0.5.5` → `0.5.x/`. Create the directory if it doesn't exist: `mkdir -p changelog/<series>`
|
|
44
|
-
2. If the file doesn't exist yet, scaffold it by copying the structure of `changelog/template.md` into the new path. Do **not** `git mv` or otherwise rename `template.md` itself — it stays where it is.
|
|
45
|
-
3. Set the H1: `# <version> — <date>` (em-dash, ISO date)
|
|
46
|
-
4. **Fill in the frontmatter** at the top of the file:
|
|
47
|
-
- `summary:` — one-line headline, ≤250 chars, no markdown. Write it like a GitHub Release title. Required.
|
|
48
|
-
- `breaking:` — set to `true` if this release requires consumer code changes (API removal, signature change, config rename). Defaults to `false`. Renders `· ⚠️ Breaking` in the rollup when true.
|
|
49
|
-
5. Verify content:
|
|
50
|
-
- Sections grouped correctly (Added / Changed / Fixed / Removed)
|
|
51
|
-
- Accurately reflects what shipped — cross-reference with `git log` since the last tag
|
|
52
|
-
- If this release absorbed pre-release versions (e.g., `0.6.0-beta.1`), consolidate their entries as `##`/`###` sub-headers inside this file (they share this version's frontmatter — no separate files)
|
|
53
|
-
- **Issue/PR references use full URLs**, not bare `#NN`. GitHub's auto-link only renders inside its own UI; these files are read from `node_modules` too, where bare `#NN` is dead text. Use `[#38](https://github.com/<owner>/<repo>/issues/38)` (or `/pull/NN` for PRs). Only link numbers verified via `gh issue view NN` / `gh pr view NN` — never speculate on future numbers, since GitHub will happily resolve `#42` to whatever unrelated item already owns 42 and pull its title into timeline previews.
|
|
54
|
-
6. Regenerate the rollup: `bun run changelog:build` — warnings about missing summaries are expected during the legacy-file backfill period but should not include this release
|
|
55
|
-
|
|
56
|
-
Never hand-edit `CHANGELOG.md` — it's a build artifact. Devcheck's `Changelog Sync` step will fail if it drifts. Never edit `changelog/template.md` — it's the format reference, not a worksheet.
|
|
57
|
-
|
|
58
|
-
### 4. Verify README.md
|
|
59
|
-
|
|
60
|
-
Beyond the version badge, confirm:
|
|
61
|
-
|
|
62
|
-
- Feature counts (tool count, resource count, etc.) match reality if the surface area changed
|
|
63
|
-
- Descriptions and capability lists reflect new features
|
|
64
|
-
- MCP SDK version badge is current if the dependency was bumped
|
|
65
|
-
- Code examples still match current APIs
|
|
66
|
-
|
|
67
|
-
### 5. Verify Skill Versions
|
|
68
|
-
|
|
69
|
-
For any skills whose `SKILL.md` was modified in this release cycle, confirm `metadata.version` in their YAML frontmatter was bumped. This is how the `maintenance` skill detects updates — if the version didn't bump, consumers won't get the new content on `bun update`.
|
|
70
|
-
|
|
71
|
-
### 6. Verify `docs/tree.md`
|
|
72
|
-
|
|
73
|
-
If the file structure changed, regenerate and confirm it's current:
|
|
74
|
-
|
|
75
|
-
```bash
|
|
76
|
-
bun run tree
|
|
77
|
-
```
|
|
78
|
-
|
|
79
|
-
Skip if no structural changes occurred.
|
|
80
|
-
|
|
81
|
-
### 7. Run Final Checks
|
|
82
|
-
|
|
83
|
-
All must pass:
|
|
84
|
-
|
|
85
|
-
```bash
|
|
86
|
-
bun run devcheck
|
|
87
|
-
bun run test
|
|
88
|
-
bun run build
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
### 8. Verify Commit and Tag
|
|
92
|
-
|
|
93
|
-
Confirm a clean release commit and annotated tag exist:
|
|
94
|
-
|
|
95
|
-
- Commit message: `chore: release v{{VERSION}}`
|
|
96
|
-
- Annotated tag: `v{{VERSION}}` with a concise summary of key changes
|
|
97
|
-
|
|
98
|
-
If the wrapup created the commit and tag already, verify they're correct. If not, create them now.
|
|
99
|
-
|
|
100
|
-
Tag message examples:
|
|
101
|
-
|
|
102
|
-
```text
|
|
103
|
-
v0.2.0: Cloudflare Workers support, task tools, Graph service
|
|
104
|
-
v0.1.7: OTel instrumentation refactor, lighter semconv
|
|
105
|
-
v0.1.6: Error factory functions, auto-classification patterns
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
### 9. Stop and Present Publish Commands
|
|
109
|
-
|
|
110
|
-
The following commands are irreversible. Present them to the user for manual execution:
|
|
111
|
-
|
|
112
|
-
```bash
|
|
113
|
-
# Push commit and tag
|
|
114
|
-
git push && git push --tags
|
|
115
|
-
|
|
116
|
-
# Publish to npm
|
|
117
|
-
bun publish --access public
|
|
118
|
-
|
|
119
|
-
# Build and push Docker image
|
|
120
|
-
docker buildx build --platform linux/amd64,linux/arm64 \
|
|
121
|
-
-t ghcr.io/cyanheads/mcp-ts-core:{{VERSION}} \
|
|
122
|
-
-t ghcr.io/cyanheads/mcp-ts-core:latest \
|
|
123
|
-
--push .
|
|
124
|
-
|
|
125
|
-
# Publish MCP listing (if applicable)
|
|
126
|
-
mcp-publisher publish
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
## Pre-Publish Checklist
|
|
130
|
-
|
|
131
|
-
- [ ] Version consistent across all files (package.json, server.json ×3, CLAUDE.md, README.md, templates)
|
|
132
|
-
- [ ] No stale old-version references found in repo
|
|
133
|
-
- [ ] `changelog/<major.minor>.x/<version>.md` created/finalized with concrete version, date, and frontmatter; `CHANGELOG.md` regenerated via `bun run changelog:build`; `changelog/template.md` untouched
|
|
134
|
-
- [ ] README.md current — feature counts, badges, descriptions, examples
|
|
135
|
-
- [ ] Modified skill versions bumped in YAML frontmatter
|
|
136
|
-
- [ ] `docs/tree.md` current (if structure changed)
|
|
137
|
-
- [ ] `bun run devcheck` passes
|
|
138
|
-
- [ ] `bun run test` passes
|
|
139
|
-
- [ ] `bun run build` succeeds
|
|
140
|
-
- [ ] Clean release commit exists
|
|
141
|
-
- [ ] Annotated git tag exists with summary message
|
|
142
|
-
- [ ] User presented with publish commands (push, npm, Docker, mcp-publisher)
|