@cyanheads/mcp-ts-core 0.9.7 → 0.9.9

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.
Files changed (53) hide show
  1. package/CLAUDE.md +3 -2
  2. package/README.md +12 -8
  3. package/changelog/0.9.x/0.9.8.md +24 -0
  4. package/changelog/0.9.x/0.9.9.md +20 -0
  5. package/dist/testing/fuzz.d.ts +6 -1
  6. package/dist/testing/fuzz.d.ts.map +1 -1
  7. package/dist/testing/fuzz.js +93 -49
  8. package/dist/testing/fuzz.js.map +1 -1
  9. package/package.json +7 -6
  10. package/scripts/check-framework-antipatterns.ts +8 -4
  11. package/skills/add-app-tool/SKILL.md +6 -4
  12. package/skills/add-export/SKILL.md +10 -8
  13. package/skills/add-prompt/SKILL.md +15 -8
  14. package/skills/add-provider/SKILL.md +29 -12
  15. package/skills/add-resource/SKILL.md +20 -11
  16. package/skills/add-service/SKILL.md +15 -17
  17. package/skills/add-test/SKILL.md +50 -9
  18. package/skills/add-tool/SKILL.md +13 -6
  19. package/skills/api-auth/SKILL.md +3 -2
  20. package/skills/api-canvas/SKILL.md +43 -6
  21. package/skills/api-config/SKILL.md +6 -0
  22. package/skills/api-context/SKILL.md +9 -3
  23. package/skills/api-errors/SKILL.md +5 -5
  24. package/skills/api-linter/SKILL.md +32 -9
  25. package/skills/api-services/SKILL.md +1 -1
  26. package/skills/api-services/references/graph.md +1 -1
  27. package/skills/api-services/references/speech.md +1 -1
  28. package/skills/api-telemetry/SKILL.md +5 -5
  29. package/skills/api-testing/SKILL.md +9 -1
  30. package/skills/api-utils/SKILL.md +1 -1
  31. package/skills/api-workers/SKILL.md +12 -5
  32. package/skills/design-mcp-server/SKILL.md +20 -8
  33. package/skills/field-test/SKILL.md +9 -7
  34. package/skills/git-wrapup/SKILL.md +218 -0
  35. package/skills/maintenance/SKILL.md +8 -6
  36. package/skills/migrate-mcp-ts-template/SKILL.md +11 -7
  37. package/skills/multi-server-orchestration/SKILL.md +17 -5
  38. package/skills/multi-server-orchestration/references/greenfield-buildout.md +6 -3
  39. package/skills/multi-server-orchestration/references/maintenance-pass.md +11 -3
  40. package/skills/multi-server-orchestration/references/release-and-publish-pass.md +14 -25
  41. package/skills/multi-server-orchestration/references/wrapup-pass.md +13 -41
  42. package/skills/polish-docs-meta/SKILL.md +3 -1
  43. package/skills/polish-docs-meta/references/package-meta.md +1 -1
  44. package/skills/release-and-publish/SKILL.md +10 -9
  45. package/skills/report-issue-framework/SKILL.md +5 -3
  46. package/skills/report-issue-local/SKILL.md +10 -5
  47. package/skills/setup/SKILL.md +13 -8
  48. package/skills/tool-defs-analysis/SKILL.md +6 -3
  49. package/templates/CLAUDE.md +1 -0
  50. package/dist/logs/combined.log +0 -7
  51. package/dist/logs/error.log +0 -5
  52. package/dist/logs/interactions.log +0 -0
  53. package/scripts/split-changelog.ts +0 -133
@@ -70,7 +70,7 @@ One sub-agent per target. Quick verification gate before any version bump or wra
70
70
 
71
71
  > Run `bun run devcheck`. Then run `bun run test:all` if it exists in `package.json` scripts, otherwise `bun run test`. Both must pass green. Halt and report the failing step's verbatim output if anything fails — do not attempt fixes from inside this phase. If neither `test:all` nor `test` exists in `package.json` scripts, note it and continue — devcheck-only is acceptable (though uncommon for a project shipping a release).
72
72
 
73
- Any red target halts the orchestration. The user fixes locally and re-invokes from Phase 2.
73
+ Any red target halts the orchestration for that target. The user fixes locally and re-invokes Phase 2 for the failing target(s) only — other targets that passed don't need to re-run.
74
74
 
75
75
  ### Phase 3: README review fanout
76
76
 
@@ -80,7 +80,7 @@ One sub-agent per target reads the full README plus key adjacent docs, identifie
80
80
 
81
81
  > Read `README.md` from front to back. Identify content stale relative to the current code: tool/resource counts, version badges, feature lists, configuration tables, version mentions in install snippets. Fold updates in naturally — don't rewrite sections that are already accurate. Do NOT commit. Leave changes in the working tree for the next phase.
82
82
  >
83
- > If `polish-docs-meta` skill is available and the change spans more than just the README (e.g., new env vars, new tools), invoke that skill instead — it handles README plus `server.json`, `package.json`, agent protocol, and `.env.example` in one pass.
83
+ > If `polish-docs-meta` skill is available (`skills/polish-docs-meta/SKILL.md`) and the change spans more than just the README (e.g., new env vars, new tools), invoke that skill instead — it handles README plus `server.json`, `package.json`, agent protocol, and `.env.example` in one pass.
84
84
  >
85
85
  > If the README is already accurate, report "no changes needed" and exit cleanly.
86
86
 
@@ -88,32 +88,20 @@ For a small patch bump, this phase is often a no-op. That's fine.
88
88
 
89
89
  ### Phase 4: Wrap-up fanout (Bash git only)
90
90
 
91
- Run only after user authorizes commits.
91
+ Runs on the authorization captured in Pre-flight Step 5 — no separate authorization needed for wrap-up.
92
92
 
93
- One sub-agent per target. The agent executes the wrapup steps via Bash git — the same workflow `git_wrapup_instructions` walks through, but per-target absolute paths instead of session state.
93
+ One sub-agent per target. The agent reads and executes the standalone `git-wrapup` skill (`skills/git-wrapup/SKILL.md`) — the skill contains the complete protocol for version bump, changelog, verification, commit, and annotated tag.
94
94
 
95
95
  **Task body:**
96
96
 
97
- > Run the version-bump wrapup via Bash `git` (no `git-mcp-server` tools see the orchestration skill's Hard Rule 1).
97
+ > Read and follow the `git-wrapup` skill check `skills/git-wrapup/SKILL.md` first; fall back to `.claude/skills/git-wrapup/SKILL.md` if not found. Apply a `[patch/minor/major]` version bump.
98
98
  >
99
- > 1. **Inspect state:** `git status`, `git log --oneline -5`, `git diff --stat` on the working tree.
100
- > 2. **Determine the new version:** start from the current `package.json` `version`, apply the bump intent (`[patch/minor/major or explicit string]`). For a patch, e.g., `0.1.1 → 0.1.2`.
101
- > 3. **Author the changelog:** create `changelog/<major.minor>.x/<version>.md` per the directory-based convention. YAML frontmatter (`summary:` required, ≤350 chars, no markdown; `breaking:` and `security:` optional, default false). Grouped sections: Added / Changed / Fixed / Removed. Use the format reference at `changelog/template.md` — never edit, rename, or move that file.
102
- > 4. **Regenerate:** `bun run changelog:build` (rebuilds `CHANGELOG.md` rollup) and `bun run tree` (regenerates `docs/tree.md`).
103
- > 5. **Bump every version-bearing file:** `package.json` `version`, `server.json` `version` at the top level AND every `packages[].version` entry, any README badge that references the version. Use `grep -rn "<current-version>"` to find any you missed; resolve case by case.
104
- > 6. **Stage and commit.** Conventional Commits subject. Per the global protocol: version bumps ride with the change that warrants them — for a focused patch this is one commit. Subject style: `feat: <version> — <one-line theme>` or `chore(release): v<version> — <theme>`. Plain `-m` only, no heredoc, no `Co-authored-by` or `Generated with` trailers.
105
- > 7. **Annotated tag** `v<version>` (`-a`, NOT lightweight): terse message with release theme, notable changes, and dep arrows in `pkg ^old → ^new` form if applicable. Not a CHANGELOG copy.
99
+ > Additional constraints for orchestrated runs:
100
+ > - **Bash `git` only.** Do not use `git-mcp-server` (`mcp__git-mcp-server__*`) tools session state leaks across parallel agents in the same orchestrator session.
101
+ > - **Do NOT push.** Phase 5 handles the push as part of `release-and-publish`.
102
+ > - If `v<version>` already exists as a tag, **halt and surface the conflict** to the orchestrator. Do NOT `git tag -d` without authorization.
106
103
  >
107
- > **Do NOT push.** Phase 5 handles the push as part of `release-and-publish`'s verification gate flow.
108
- >
109
- > **Verify state at the end:**
110
- > ```bash
111
- > git log --oneline -1
112
- > git show v<version> --stat | head -20
113
- > git status # should be clean
114
- > ```
115
- >
116
- > Constraints: Bash git only. NEVER `git stash`. NEVER `reset --hard` / `restore .` / `clean -f` / `checkout -- .`. No marketing adjectives ("comprehensive", "robust", "enhanced", "seamless", "improved") in commit or tag messages. Be concise and accurate.
104
+ > Output for the orchestrator: commit SHA, tag name, tag annotation subject.
117
105
 
118
106
  After this fanout, each target has a clean working tree with the wrap-up commit + annotated tag locally; nothing has been pushed.
119
107
 
@@ -132,7 +120,7 @@ Each target invokes the `release-and-publish` skill end-to-end. Execution mode d
132
120
 
133
121
  > Read `skills/release-and-publish/SKILL.md` (or `.claude/skills/release-and-publish/SKILL.md`). Run it end-to-end:
134
122
  >
135
- > 1. Sanity-check wrapup outputs (working tree clean, HEAD tagged `v<version>` from Phase 4)
123
+ > 1. Sanity-check wrapup outputs (working tree clean, HEAD tagged `v<version>` from Phase 4). If either check fails, halt and report to the orchestrator — do not re-run Phase 4 from inside Phase 5
136
124
  > 2. Verification gate: `bun run devcheck`, `bun run rebuild`, `bun run test:all` (or `test`)
137
125
  > 3. Push commits and tags to origin via Bash git
138
126
  > 4. `bun publish --access public` (npm — uses the configured bypass token)
@@ -143,7 +131,7 @@ Each target invokes the `release-and-publish` skill end-to-end. Execution mode d
143
131
  >
144
132
  > Honor the skill's retry/halt protocol — transient network errors retry up to 2× with backoff; idempotent-success signals ("version already exists", "cannot publish duplicate version") are treated as success and proceed. Bash git for all git ops. Never skip the verification gate.
145
133
 
146
- **Serial mode:** the orchestrator runs `release-and-publish` against each target sequentially in its own session, handling OTP prompts interactively as they appear.
134
+ **Serial mode:** the orchestrator spawns one sub-agent at a time per target — each runs `release-and-publish` end-to-end, completing before the next target starts. This prevents OTP prompt interleaving.
147
135
 
148
136
  After Phase 5, collect per-target status: which destinations succeeded, which (if any) halted with partial state. The user re-invokes Phase 5 for any failed targets only — completed destinations hit the idempotent-success signal and skip naturally.
149
137
 
@@ -178,7 +166,7 @@ Skip Phase 6 for any target whose Phase 5 didn't complete — there's nothing to
178
166
  | 9 | Sub-agent uses `git-mcp-server` instead of Bash git in Phase 4 or 5 | Hard Rule 1 restated explicitly in every fanout prompt that touches git |
179
167
  | 10 | Failed publish leaves a tag pushed but no npm package — looks shipped, isn't | Collect per-destination status per target in Phase 5 roll-up; surface partial-state targets explicitly to the user before Phase 6 |
180
168
  | 11 | `gh release create --notes-from-tag` fails with `--repo` flag | `gh` CLI limitation. Always `cd` into the target repo dir for `gh release` commands instead of using `--repo` |
181
- | 12 | Post-version doc changes (install badges, description fixes) land after the version commit — tag points at stale content | Move the tag forward: delete remote release, delete remote+local tag, recreate tag at new HEAD with same annotation, re-push, recreate release with `.mcpb`. This is authorized within the pipeline for same-day follow-ups |
169
+ | 12 | Post-version doc changes (install badges, description fixes) land after the version commit — tag points at stale content | Move the tag forward: delete remote release, delete remote+local tag, recreate tag at new HEAD with same annotation, re-push, recreate release with `.mcpb`. This requires explicit user confirmation before executing ask at runtime |
182
170
  | 13 | `mcpb pack` fails because `manifest.json` `user_config` entries are missing `title`/`type` fields | Verify `manifest.json` `user_config` entries during Phase 3 or a pre-Phase-5 check; the `polish-docs-meta` skill's cross-file consistency section covers this |
183
171
 
184
172
  ## Checklist
@@ -189,6 +177,7 @@ Skip Phase 6 for any target whose Phase 5 didn't complete — there's nothing to
189
177
  - [ ] Phase 3: README review fanout — updates folded, no commits
190
178
  - [ ] Phase 4: wrap-up fanout (Bash git only) — version bumped, changelog authored, rollup regenerated, commit + annotated tag per target — **NOT pushed**
191
179
  - [ ] Working tree clean per target; `git show v<version>` succeeds per target
180
+ - [ ] Version-bearing files consistent across `package.json`, `server.json`, README badge, and `Dockerfile` OCI labels per target — no doc changes pending after the tag
192
181
  - [ ] Phase 5: release publish — completed per target via `release-and-publish` (parallel or serial based on 2FA mode); per-target status captured
193
182
  - [ ] All targets: deployed artifact URLs reported (npm / MCP Registry / GHCR as applicable)
194
183
  - [ ] **If GH issue map captured:** Phase 6: issue closure fanout — relevant issues commented and closed per target whose Phase 5 succeeded
@@ -62,6 +62,8 @@ Phase 3 is optional — skip when the change is small enough that the README/doc
62
62
 
63
63
  ## Phase details
64
64
 
65
+ > **Orient block:** the standard preamble instructing sub-agents to read `~/.claude/CLAUDE.md`, workspace `CLAUDE.md`, project `CLAUDE.md`, and run `bun run list-skills` — defined in `../SKILL.md`. Every sub-agent prompt starts with this block before the task body.
66
+
65
67
  ### Phase 2: Verification fanout
66
68
 
67
69
  One sub-agent per target. Quick verification gate before any version bump or wrap-up.
@@ -80,60 +82,27 @@ One sub-agent per target reads the README plus adjacent docs, identifies stale c
80
82
 
81
83
  > Read `README.md` from front to back. Identify content stale relative to the current code: tool/resource counts, version badges, feature lists, configuration tables, version mentions in install snippets. Fold updates in naturally — don't rewrite sections that are already accurate. Do NOT commit. Leave changes in the working tree for the next phase.
82
84
  >
83
- > If `polish-docs-meta` skill is available and the change spans more than just the README (e.g., new env vars, new tools), invoke that skill instead — it handles README plus `server.json`, `package.json`, agent protocol, and `.env.example` in one pass.
85
+ > If `polish-docs-meta` skill is available (`skills/polish-docs-meta/SKILL.md`) and the change spans more than just the README (e.g., new env vars, new tools), invoke that skill instead — it handles README plus `server.json`, `package.json`, agent protocol, and `.env.example` in one pass.
84
86
  >
85
87
  > If the README is already accurate, report "no changes needed" and exit cleanly.
86
88
 
87
- For a small patch, this phase is often a no-op. That's fine skip it entirely if pre-flight confirmed no user-facing change.
89
+ For a small patch, this phase is often a no-op. Skip Phase 3 when the diff introduces no new tools, resources, env vars, or behavior changes visible to the user.
88
90
 
89
91
  ### Phase 4: Wrap-up fanout (Bash git only)
90
92
 
91
- Run only after user authorizes commits.
93
+ Runs on the authorization captured in Pre-flight Step 4 — no separate authorization needed for wrap-up.
92
94
 
93
- One sub-agent per target. The agent executes the seven acceptance criteria via Bash `git` no `git-mcp-server` (per the parent SKILL.md's Hard Rule 1, the MCP server's session state leaks across parallel agents).
95
+ One sub-agent per target. The agent reads and executes the standalone `git-wrapup` skill (`skills/git-wrapup/SKILL.md`) the skill contains the complete protocol for version bump, changelog, verification, commit, and annotated tag.
94
96
 
95
97
  **Task body:**
96
98
 
97
- > Execute the wrap-up protocol against this target. Acceptance criteria strict on goals, generic on mechanism but for `@cyanheads/mcp-ts-core` consumers, mechanism is concrete:
98
- >
99
- > 1. **Diff reviewed.** `git status`, `git log v<latest-tag>..HEAD --oneline`, `git diff --stat`. Understand what's about to ship.
100
- > 2. **Version bump.** Start from current `package.json` `version`; apply the bump intent (`[patch/minor/major or explicit string]`). Bump every place version is declared:
101
- > - `package.json` `version`
102
- > - `server.json` `version` at the top level AND every `packages[].version` entry
103
- > - `manifest.json` (if present) `version`. Also verify `name` doesn't include the npm scope prefix — it should be the bare package name (e.g. `bls-mcp-server`, not `@cyanheads/bls-mcp-server`)
104
- > - README version badge and any hero pinning
105
- > - Dockerfile OCI labels (if pinned to version)
106
- > - Any agent-instruction file (`CLAUDE.md`, `AGENTS.md`) that pins the version
107
- >
108
- > Run `grep -rn "<current-version>" .` to catch stragglers; resolve case by case (some hits are historical changelog entries — leave those).
109
- > 3. **Changelog authored.** Create `changelog/<major.minor>.x/<version>.md` per the directory-based convention. YAML frontmatter (`summary:` required, ≤350 chars, no markdown; `breaking:` and `security:` optional, default false). Section order (Keep a Changelog): Added / Changed / Deprecated / Removed / Fixed / Security. Include only sections with entries. Use `changelog/template.md` as the format reference — never edit, rename, or move it.
110
- > 4. **Regenerate derived artifacts.** `bun run changelog:build` (rebuilds `CHANGELOG.md` rollup from per-version files); `bun run tree` (regenerates `docs/tree.md` if the file structure changed).
111
- > 5. **Verification gate.** `bun run devcheck` must pass against the tree being committed. `bun run test:all` if it exists, otherwise `bun run test`. Both green. Halt if not green — do NOT bypass.
112
- > 6. **Atomic Conventional Commits.** Version bumps ride with the change that warrants them. For a focused patch, this is ONE commit covering the work + the version bump + changelog + regenerated artifacts. Subject form: `feat: <version> — <one-line theme>` or `chore(release): v<version> — <theme>`. Plain `-m` only — no heredoc, no `Co-authored-by`, no `Generated with` trailers. No marketing adjectives.
113
- > 7. **Annotated tag** `v<version>` (`-a`, NOT lightweight). The tag body renders as the GitHub Release page via `--notes-from-tag` — it must be structured markdown, never a flat comma-separated string. Format:
114
- > - **Subject line:** release theme — omit version number (GitHub prepends `v<VERSION>:`)
115
- > - **Prose intro:** 1-2 sentences — what this release does, why it matters
116
- > - **Sections:** Keep a Changelog names (Dependency bumps / Added / Changed / Fixed / Removed) — only sections with entries, each with bulleted items
117
- > - **Dep arrows:** `pkg ^old → ^new` form, one per line
118
- > - **Footer:** test count + devcheck status
119
- > - **Backlinks:** link framework issues where relevant (`cyanheads/mcp-ts-core#50`)
120
- > - Not a CHANGELOG copy — terse, scannable. No marketing adjectives. Length is earned.
99
+ > Read and follow the `git-wrapup` skill check `skills/git-wrapup/SKILL.md` first; fall back to `.claude/skills/git-wrapup/SKILL.md` if not found. Apply a `[patch/minor/major]` version bump.
121
100
  >
122
- > Constraints:
101
+ > Additional constraints for orchestrated runs:
123
102
  > - **Bash `git` only.** Do not use `git-mcp-server` (`mcp__git-mcp-server__*`) tools — session state leaks across parallel agents in the same orchestrator session.
124
- > - **Do NOT push.** Wrap-up is local only. Push is a separate authorized step (`release-and-publish-pass.md` Phase 5, or the standalone `release-and-publish` skill).
125
- > - NEVER `git stash`. NEVER `git reset --hard`, `git restore .`, `git clean -f`, or `git checkout -- .` — these violate the global protocol.
126
- > - No marketing adjectives ("comprehensive", "robust", "enhanced", "seamless", "improved") in commit or tag messages. State the change.
127
- > - If `v<version>` already exists as a tag, **halt and surface the conflict**. Do NOT `git tag -d` without orchestrator authorization.
103
+ > - If `v<version>` already exists as a tag, **halt and surface the conflict** to the orchestrator. Do NOT `git tag -d` without authorization.
128
104
  >
129
- > **Verify state at the end:**
130
- > ```bash
131
- > git log --oneline -1
132
- > git show v<version> --stat | head -20
133
- > git status # should be clean
134
- > ```
135
- >
136
- > Output for the orchestrator: commit SHA, tag name, tag annotation subject. The orchestrator parses these for Phase 5.
105
+ > Output for the orchestrator: commit SHA, tag name, tag annotation subject.
137
106
 
138
107
  ### Phase 5: Roll-up (orchestrator)
139
108
 
@@ -146,6 +115,8 @@ for d in <target paths>; do
146
115
  done
147
116
  ```
148
117
 
118
+ Spot-check commit and tag quality: `git log --format='%s%n%b' -1` for marketing adjectives in commit messages, `git show v<version>` for tag annotation structure.
119
+
149
120
  Then produces a consolidated report:
150
121
 
151
122
  1. **Per-target headline** — target → new version → tag annotation subject → commit SHA
@@ -176,3 +147,4 @@ Then produces a consolidated report:
176
147
  - [ ] Tags exist locally; nothing pushed to remotes
177
148
  - [ ] Phase 5: orchestrator verification — `git log --oneline -1`, `git tag --points-at HEAD`, `git status --short` per target
178
149
  - [ ] Consolidated report presented to user with per-target headlines, outliers, next steps
150
+ - [ ] Orchestrator has NOT advanced to push, publish, or any remote operation — wrap-up is complete
@@ -72,7 +72,9 @@ Compare `.env.example` against the server config Zod schema. Add any missing ser
72
72
 
73
73
  Check for empty or placeholder metadata fields. Read `references/package-meta.md` for which fields matter and why. Fill in anything still missing — skip fields that are already correct.
74
74
 
75
- Key fields: `description`, `repository`, `author`, `homepage`, `bugs`, `keywords`.
75
+ Key fields: `name`, `description`, `repository`, `author`, `homepage`, `bugs`, `keywords`.
76
+
77
+ **`name` must communicate the server's domain at a glance.** See `references/package-meta.md` for the naming convention — ambiguous abbreviations and acronym-only names fail the scannability test for humans and agents alike.
76
78
 
77
79
  **`description` is the canonical source.** Every other surface (README header, `server.json`, Dockerfile OCI label, GitHub repo description) derives from it. Write it here first, then propagate.
78
80
 
@@ -6,7 +6,7 @@ Fields that may still be empty or generic from scaffolding. Check each one and f
6
6
 
7
7
  | Field | Default / Scaffolded | What It Should Be |
8
8
  |:------|:---------------------|:------------------|
9
- | `name` | `{{PACKAGE_NAME}}` (substituted by init) | Verify it's correct. Use scoped name if publishing (`@org/my-server`). |
9
+ | `name` | `{{PACKAGE_NAME}}` (substituted by init) | Verify it communicates the server's domain at a glance. A human or agent scanning a list should know what this server does from the name alone. Prefer full names over ambiguous abbreviations (`libofcongress` not `loc`, `federal-reserve` not `fred`). Non-obvious acronyms get a descriptive suffix (`eia-energy`, `bls-labor`). Use scoped name if publishing (`@org/my-server`). |
10
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 **action-first** sentence — lead with the actions/workflows, end with `via MCP. STDIO or Streamable HTTP.` (or the transports that apply). Example: `"Search projects, manage tasks, track teams via MCP. STDIO or Streamable HTTP."` Avoid `"MCP server for/that …"` framings. Appears on npm and in `npm search`; the README header tagline and `server.json` `description` derive from this (server.json drops the `via MCP …` suffix). |
@@ -4,7 +4,7 @@ description: >
4
4
  Ship a release end-to-end across every registry the project targets (npm, MCP Registry, GitHub Releases for `.mcpb` bundles, 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. Retries transient network failures on publish steps; halts with a partial-state report when retries are exhausted or the failure is terminal.
5
5
  metadata:
6
6
  author: cyanheads
7
- version: "2.5"
7
+ version: "2.6"
8
8
  audience: external
9
9
  type: workflow
10
10
  ---
@@ -73,7 +73,7 @@ If working tree is dirty or HEAD isn't on `v<version>`, halt.
73
73
 
74
74
  ### 2. Run the verification gate
75
75
 
76
- All three must succeed. Use `test:all` if the script exists in `package.json`, otherwise fall back to `test`:
76
+ All three must succeed. Check `package.json` `scripts` for `test:all`; if absent, fall back to `test`:
77
77
 
78
78
  ```bash
79
79
  bun run devcheck
@@ -85,7 +85,7 @@ Any non-zero exit → halt with the failing command's output.
85
85
 
86
86
  ### 3. Push to origin
87
87
 
88
- Use your git tools to push commits and tags to origin. If the remote rejects either push, halt.
88
+ Use your git tools to push the branch commits first, then push tags to origin. If the remote rejects either push, halt.
89
89
 
90
90
  ### 4. Publish to npm
91
91
 
@@ -106,13 +106,13 @@ Halt on publish error other than "version already exists" (which means this step
106
106
 
107
107
  ### 5. Publish to MCP Registry
108
108
 
109
- Only if `server.json` exists at the repo root (otherwise skip).
109
+ Only if `server.json` exists at the repo root (otherwise skip). Note: `server.json` (MCP Registry metadata) and `manifest.json` (MCPB bundle manifest, step 6) are independent — a project may have either, both, or neither.
110
110
 
111
111
  ```bash
112
112
  bun run publish-mcp
113
113
  ```
114
114
 
115
- If `publish-mcp` isn't defined in `package.json`, add it (macOS):
115
+ If `publish-mcp` isn't defined in `package.json`, add it permanently (one-time setup, macOS):
116
116
 
117
117
  ```json
118
118
  "publish-mcp": "mcp-publisher login github -token \"$(security find-generic-password -a \"$USER\" -s mcp-publisher-github-pat -w)\" && mcp-publisher publish"
@@ -171,14 +171,14 @@ docker buildx build --platform linux/amd64,linux/arm64 \
171
171
  --push .
172
172
  ```
173
173
 
174
- If the project uses a non-GHCR registry or a custom image name, respect the project's convention. Halt on build or push failure.
174
+ If the project uses a non-GHCR registry or a custom image name, respect the project's convention. If push fails with a 401/403, prompt the user to authenticate (`echo $GITHUB_TOKEN | docker login ghcr.io -u <OWNER> --password-stdin`) and retry. Halt on build failure or non-auth push failure.
175
175
 
176
176
  ### 8. Report the deployed artifacts
177
177
 
178
178
  Print clickable URLs for every destination that succeeded:
179
179
 
180
180
  - npm: `https://www.npmjs.com/package/<package.json#name>/v/<version>`
181
- - MCP Registry: `https://registry.modelcontextprotocol.io/v0/servers?search=<package.json#mcpName>`
181
+ - MCP Registry: `https://registry.modelcontextprotocol.io/v0.1/servers/<mcpName>/versions/<version>` — `mcpName` is the `name` field from `server.json` (URL-encode the `/` as `%2F`)
182
182
  - GitHub Release: `https://github.com/<OWNER>/<REPO>/releases/tag/v<VERSION>` (with `.mcpb` asset attached)
183
183
  - GHCR: `ghcr.io/<OWNER>/<REPO>:<VERSION>`
184
184
 
@@ -189,7 +189,7 @@ Skip any destination that was skipped in its step.
189
189
  Confirm each published artifact is actually live — don't rely on a successful push exit code alone. For each destination that succeeded:
190
190
 
191
191
  - **npm**: `npm view <package.json#name>@<version> version` — must return the version string
192
- - **MCP Registry**: `curl -s "https://registry.modelcontextprotocol.io/v0/servers?search=<mcpName>"` — response must include `<version>` for the `io.github.cyanheads/<repo>` entry
192
+ - **MCP Registry**: `curl -s "https://registry.modelcontextprotocol.io/v0.1/servers/<mcpName>/versions/<version>"` — must return HTTP 200 with `server.version` matching `<version>` (`mcpName` is the `name` field from `server.json`; URL-encode `/` as `%2F`). The search endpoint (`/v0.1/servers?search=`) paginates and may not include the latest version for packages with many releases — always use the direct version lookup.
193
193
  - **GitHub Release**: `gh release view v<VERSION> -R <OWNER>/<REPO> --json assets --jq '.assets[].name'` — must list the `.mcpb` file
194
194
  - **GHCR**: fetch an anonymous bearer token, then `curl -s -o /dev/null -w "%{http_code}" -H "Authorization: Bearer $TOKEN" "https://ghcr.io/v2/<OWNER>/<REPO>/manifests/<VERSION>"` — must return HTTP 200
195
195
 
@@ -197,7 +197,7 @@ If any check fails, halt and report which destination is unreachable. A successf
197
197
 
198
198
  ## Checklist
199
199
 
200
- - [ ] Working tree clean; HEAD tagged `v<version>`
200
+ - [ ] Working tree clean; HEAD tagged `v<version>`; current branch name noted for push
201
201
  - [ ] `bun run devcheck` passes
202
202
  - [ ] `bun run rebuild` succeeds
203
203
  - [ ] `bun run test:all` (or `test`) passes
@@ -208,4 +208,5 @@ If any check fails, halt and report which destination is unreachable. A successf
208
208
  - [ ] `bun run bundle` + `gh release create --verify-tag --notes-from-tag` succeeds (if `manifest.json` present)
209
209
  - [ ] Docker buildx multi-arch push succeeds (if `Dockerfile` present)
210
210
  - [ ] All published artifacts verified reachable (npm, MCP Registry, GH Release asset, GHCR manifest)
211
+ - [ ] On re-invocation: idempotent-success signals recognized for already-published destinations
211
212
  - [ ] Deployed artifact URLs reported to the user
@@ -180,12 +180,12 @@ Combine labels: `--label "bug" --label "regression"`.
180
180
 
181
181
  ### Attaching logs or stack traces
182
182
 
183
- For long output, write to a file and attach:
183
+ For long output, write to a file and attach. Note: `--body-file` replaces the entire body — it does not supplement a `--body` flag. For structured bugs with logs, either embed the log content in the `Additional context` section of a normal `--body`, or file the issue first and add the log as a comment:
184
184
 
185
185
  ```bash
186
186
  bun run rebuild && bun run start:stdio 2>&1 | head -100 > /tmp/mcp-error.log
187
187
 
188
- # As part of a new issue
188
+ # As part of a new issue (the log becomes the entire body — no template fields)
189
189
  gh issue create -R cyanheads/mcp-ts-core \
190
190
  --title "bug(transport): stdio crashes on large payload" \
191
191
  --label "bug" \
@@ -287,4 +287,6 @@ gh issue list -R cyanheads/mcp-ts-core --author @me
287
287
  - [ ] Running latest (or documented) framework version
288
288
  - [ ] Searched existing issues — no duplicate found
289
289
  - [ ] All secrets, credentials, and tokens redacted
290
- - [ ] Issue filed with: version, runtime, repro code, actual vs expected behavior
290
+ - [ ] Primary label assigned (`bug` / `enhancement` / `documentation`)
291
+ - [ ] If bug: version, runtime, repro code, actual vs expected behavior included
292
+ - [ ] If feature: Proposal and Scope sections present; Out of scope defined
@@ -32,7 +32,7 @@ For general `gh` CLI workflows outside issue filing (PRs, workflows, API access)
32
32
  gh repo view --json nameWithOwner -q '.nameWithOwner'
33
33
  ```
34
34
 
35
- 2. **Search existing issues**:
35
+ 2. **Search existing issues** — if a close match exists (same symptom, different tool; same tool, different symptom; closed issue that might cover the new case), add a comment on that issue instead of filing a new one — unless the symptom or scope is distinct enough to warrant separate tracking:
36
36
 
37
37
  ```bash
38
38
  gh issue list --search "your error message or keyword"
@@ -176,17 +176,19 @@ gh label create surplus-token-idea --color FF10F0 --description "Worth exploring
176
176
 
177
177
  ### Attaching logs or large output
178
178
 
179
+ Note: `--body-file` replaces the entire body — it does not supplement a `--body` flag. For structured bugs with logs, either embed the log content in the `Additional context` section of a normal `--body`, or file the issue first and add the log as a comment:
180
+
179
181
  ```bash
180
182
  bun run rebuild && bun run start:stdio 2>&1 | head -200 > /tmp/server-error.log
181
183
 
182
- # As part of a new issue
184
+ # As part of a new issue (the log becomes the entire body — no template fields)
183
185
  gh issue create \
184
186
  --title "bug(ingest): crashes on large payload" \
185
187
  --label "bug" \
186
188
  --assignee "@me" \
187
189
  --body-file /tmp/server-error.log
188
190
 
189
- # Or as a comment on an existing issue
191
+ # Or as a comment on an existing issue (preferred — keeps the structured body intact)
190
192
  gh issue comment <number> --body-file /tmp/server-error.log
191
193
  ```
192
194
 
@@ -294,6 +296,9 @@ gh issue close <number> --reason completed --comment "Fixed in <commit or PR>"
294
296
  ## Checklist
295
297
 
296
298
  - [ ] Confirmed bug is in server code, not the framework
297
- - [ ] Searched existing issues — no duplicate found
299
+ - [ ] Searched existing issues — no duplicate found; close matches commented instead of duplicated
298
300
  - [ ] All secrets, credentials, and tokens redacted
299
- - [ ] Issue filed with: version, runtime, repro steps, actual vs expected behavior
301
+ - [ ] Title follows `type(scope): description` format
302
+ - [ ] Primary label assigned (`bug` / `enhancement` / `documentation`)
303
+ - [ ] If bug: version, runtime, repro steps, actual vs expected behavior included
304
+ - [ ] If feature: Proposal and Scope sections present; Out of scope defined
@@ -17,8 +17,8 @@ This skill assumes `bunx @cyanheads/mcp-ts-core init [name]` has already run. Th
17
17
 
18
18
  The init CLI generates both `CLAUDE.md` and `AGENTS.md` with the same purpose. Keep one authoritative file for the agent you actually use:
19
19
 
20
- - **Claude Code** — keep `CLAUDE.md`, discard `AGENTS.md`
21
- - **All other agents** (Codex, Cursor, Windsurf, etc.) — keep `AGENTS.md`, discard `CLAUDE.md`
20
+ - **Claude Code** — keep `CLAUDE.md`, delete `AGENTS.md`
21
+ - **All other agents** (Codex, Cursor, Windsurf, etc.) — keep `AGENTS.md`, delete `CLAUDE.md`
22
22
 
23
23
  Both files serve the same purpose: project-specific agent instructions. Prefer committing one authoritative copy rather than trying to keep both in sync by hand.
24
24
 
@@ -94,7 +94,7 @@ After init:
94
94
 
95
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
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.
97
+ 3. **Definitions register directly in `src/index.ts`.** The init scaffold uses direct imports — no barrel files yet. As the definition count grows, the `add-tool`/`add-resource`/`add-prompt` skills introduce `definitions/index.ts` barrels per the framework convention.
98
98
 
99
99
  See the `add-tool`, `add-app-tool`, `add-resource`, `add-prompt`, `add-service`, and `add-test` skills for the scaffolding patterns when you start adding real definitions.
100
100
 
@@ -126,11 +126,13 @@ This step is the **bootstrap** — it creates the agent directory. From then on,
126
126
 
127
127
  ## Project Scaffolding
128
128
 
129
- After `bun install`, complete these one-time setup tasks:
129
+ Complete these one-time setup tasks:
130
130
 
131
- 1. **Update dependencies to latest** — `bun update --latest`. The scaffolded `package.json` pins minimum versions from when the framework was published; updating ensures you start with the latest compatible releases.
132
- 2. **Initialize git** — use your git tools: init the repo, stage all files, and commit with message `chore: scaffold from @cyanheads/mcp-ts-core`
133
- 3. **Verify the substituted server name** — when `init` runs without a `[name]` argument, the package name defaults to the cwd directory name. If that's not what you want as the published server name, update `package.json`, `CLAUDE.md`/`AGENTS.md`, and `server.json` to your actual server name.
131
+ 1. **Install dependencies** — `bun install`
132
+ 2. **Update dependencies to latest** — `bun update --latest`. The scaffolded `package.json` pins minimum versions from when the framework was published; updating ensures you start with the latest compatible releases.
133
+ 3. **Initialize git** — use your git tools: init the repo, stage all files, and commit with message `chore: scaffold from @cyanheads/mcp-ts-core`
134
+ 4. **Verify the substituted server name** — when `init` runs without a `[name]` argument, the package name defaults to the cwd directory name. If that's not what you want as the published server name, update `package.json`, `CLAUDE.md`/`AGENTS.md`, and `server.json` to your actual server name.
135
+ 5. **Verify the scaffold builds clean** — `bun run devcheck`. Fix any issues before starting real work.
134
136
 
135
137
  ## Changelog Convention
136
138
 
@@ -153,7 +155,10 @@ Skip or reorder as the project calls for it. The agent protocol's "What's Next?"
153
155
 
154
156
  ## Checklist
155
157
 
156
- - [ ] Agent protocol file selected — keep one authoritative file (`CLAUDE.md` or `AGENTS.md`)
158
+ - [ ] Agent protocol file selected — one authoritative file kept (`CLAUDE.md` or `AGENTS.md`), the other deleted
159
+ - [ ] `bun install` run
160
+ - [ ] Dependencies updated (`bun update --latest`)
161
+ - [ ] Git repo initialized and initial commit made (`chore: scaffold from @cyanheads/mcp-ts-core`)
157
162
  - [ ] Substituted server name verified in `package.json`, agent protocol file, and `server.json`
158
163
  - [ ] Framework docs read (`node_modules/@cyanheads/mcp-ts-core/CLAUDE.md`)
159
164
  - [ ] Unused echo definitions cleaned up (and unregistered from `src/index.ts`)
@@ -22,7 +22,7 @@ This skill is the **review-time pass** for that drift. Read each definition the
22
22
  | `security-pass` | Injection, scopes, input sinks |
23
23
  | `tool-defs-analysis` (this) | LLM-facing language across the existing surface |
24
24
 
25
- `field-test` already audits descriptions for implementation leaks, meta-coaching, and consumer-aware phrasing during its catalog step — that's a fast shallow pass alongside live tool calls. This skill is the deeper review: 10 categories, every field, every recovery hint, every default value, with file:line citations.
25
+ `field-test` already audits descriptions for implementation leaks, meta-coaching, and consumer-aware phrasing during its catalog step — that's a fast shallow pass alongside live tool calls. This skill is the deeper review: 12 categories, every field, every recovery hint, every default value, with file:line citations.
26
26
 
27
27
  **Read-only.** This skill produces a report; the maintainer applies fixes. While running it, do not run git, do not stage or commit, do not update the changelog, do not run `devcheck`, do not invoke wrapup or release workflows. Fixes flow through the normal authoring path (edit the definition, then re-run this skill if you want to verify).
28
28
 
@@ -161,7 +161,7 @@ Prior art: #33.
161
161
 
162
162
  #### 11. Mutator observability
163
163
 
164
- **Look in:** tool definitions without `annotations.readOnlyHint: true` (writes/updates/deletes/appends/patches).
164
+ **Look in:** mutator tools — any tool that writes, updates, deletes, appends, or patches (i.e., definitions without `annotations.readOnlyHint: true`).
165
165
 
166
166
  **Check:** `output` carries a state-change discriminator (`created`, `updated`, `mutated`, `unchanged`) or before/after observable state the agent can use to confirm intent-effect match. The server reports what it observed; the agent decides whether it matches what it meant.
167
167
 
@@ -218,8 +218,11 @@ End with:
218
218
  ## Checklist
219
219
 
220
220
  - [ ] Scope confirmed (whole server / module / specific files)
221
+ - [ ] Severity floor applied — nits suppressed if user requested
221
222
  - [ ] Inventory built — every `*.tool.ts`, `*.app-tool.ts`, `*.resource.ts`, `*.app-resource.ts`, `*.prompt.ts` listed
222
- - [ ] Each file walked through all 10 categories (per-file, not 10 separate passes)
223
+ - [ ] Each file walked through all 12 categories (per-file, not 12 separate passes)
223
224
  - [ ] **Read-only:** no git, no commits, no changelog edits, no `devcheck`, no wrapup invoked during the audit
224
225
  - [ ] Findings carry file:line citation, excerpt, issue, fix
225
226
  - [ ] Report: summary → grouped-by-category findings → numbered options
227
+ - [ ] Options section produced — numbered, one-per-file, severity tagged, cherry-pickable
228
+ - [ ] If no findings: summary states "no findings"; Findings and Options sections omitted
@@ -50,6 +50,7 @@ Tailor suggestions to what's actually missing or stale — don't recite the full
50
50
  - **Use `ctx.state`** for tenant-scoped storage. Never access persistence directly.
51
51
  - **Check `ctx.elicit` / `ctx.sample`** for presence before calling.
52
52
  - **Secrets in env vars only** — never hardcoded.
53
+ - **Close the loop on issues.** When implementing work tracked by a GitHub issue, comment on the issue with what landed before moving on. The comment is for future readers — state the concrete changes, not the conversation that produced them.
53
54
 
54
55
  ---
55
56
 
@@ -1,7 +0,0 @@
1
- {"level":40,"time":1779554652742,"env":"testing","version":"0.9.7","pid":56972,"transport":"http","requestId":"5DGIW-LONS7","timestamp":"2026-05-23T16:44:12.741Z","operation":"TransportManager.start","component":"HttpTransportSetup","msg":"MCP_ALLOWED_ORIGINS is not set — CORS is wildcard for CLI clients; browser Origin headers are restricted to loopback. Set MCP_ALLOWED_ORIGINS for production deployments accepting remote browser origins."}
2
- {"level":40,"time":1779554654681,"env":"testing","version":"0.9.7","pid":56972,"transport":"http","requestId":"5DGIW-LONS7","timestamp":"2026-05-23T16:44:12.741Z","operation":"TransportManager.start","component":"HttpTransportSetup","sessionId":"not-a-real-session-1779554654681","msg":"Session validation failed - invalid or hijacked session"}
3
- {"level":50,"time":1779554658688,"env":"testing","version":"0.0.0-test","pid":57052,"requestId":"KD5VX-QNDSK","timestamp":"2026-05-23T16:44:18.688Z","operation":"HandleToolRequest","critical":false,"errorCode":-32005,"originalErrorType":"McpError","finalErrorType":"McpError","sessionId":"eca1f32c9116477ca19cd419874e3d2189fa58a29e6868d4454379f09d08c761","toolName":"scoped_echo","tenantId":"authz-tenant","auth":{"sub":"authz-user","scopes":["tool:other:read"],"clientId":"authz-client","tenantId":"authz-tenant","token":"[REDACTED]"},"errorData":{"sessionId":"eca1f32c9116477ca19cd419874e3d2189fa58a29e6868d4454379f09d08c761","toolName":"scoped_echo","requestId":"KD5VX-QNDSK","timestamp":"2026-05-23T16:44:18.688Z","tenantId":"authz-tenant","operation":"HandleToolRequest","auth":{"sub":"authz-user","scopes":["tool:other:read"],"clientId":"authz-client","tenantId":"authz-tenant","token":"[REDACTED]"},"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:68:15)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/tools/utils/toolHandlerFactory.js:146: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:170:23)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/tools/utils/toolHandlerFactory.js:184:26)\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."}
4
- {"level":50,"time":1779554658696,"env":"testing","version":"0.0.0-test","pid":57052,"requestId":"0T35D-7ME6T","timestamp":"2026-05-23T16:44:18.696Z","operation":"HandleToolRequest","critical":false,"errorCode":-32005,"originalErrorType":"McpError","finalErrorType":"McpError","sessionId":"5c8698220b504698a993704832e28f177cbcea7ed9d4ee20b1755f87ff2be9d8","toolName":"scoped_echo","tenantId":"authz-tenant","auth":{"sub":"authz-user","scopes":["openid","email","profile","offline_access"],"clientId":"authz-client","tenantId":"authz-tenant","token":"[REDACTED]"},"errorData":{"sessionId":"5c8698220b504698a993704832e28f177cbcea7ed9d4ee20b1755f87ff2be9d8","toolName":"scoped_echo","requestId":"0T35D-7ME6T","timestamp":"2026-05-23T16:44:18.696Z","tenantId":"authz-tenant","operation":"HandleToolRequest","auth":{"sub":"authz-user","scopes":["openid","email","profile","offline_access"],"clientId":"authz-client","tenantId":"authz-tenant","token":"[REDACTED]"},"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:68:15)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/tools/utils/toolHandlerFactory.js:146: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:170:23)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/tools/utils/toolHandlerFactory.js:184:26)\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."}
5
- {"level":50,"time":1779554659793,"env":"testing","version":"0.9.7","pid":57092,"requestId":"710FM-RJENE","timestamp":"2026-05-23T16:44:19.792Z","operation":"httpErrorHandler","critical":false,"errorCode":-32006,"originalErrorType":"McpError","finalErrorType":"McpError","path":"/mcp","method":"POST","errorData":{"path":"/mcp","method":"POST","requestId":"710FM-RJENE","timestamp":"2026-05-23T16:44:19.792Z","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:232: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:79: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:170: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."}
6
- {"level":50,"time":1779554659808,"env":"testing","version":"0.9.7","pid":57092,"requestId":"9GLH9-PHGBC","timestamp":"2026-05-23T16:44:19.808Z","operation":"httpErrorHandler","critical":false,"errorCode":-32006,"originalErrorType":"McpError","finalErrorType":"McpError","path":"/mcp","method":"POST","errorData":{"path":"/mcp","method":"POST","requestId":"9GLH9-PHGBC","timestamp":"2026-05-23T16:44:19.808Z","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:72: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:170: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."}
7
- {"level":50,"time":1779554659811,"env":"testing","version":"0.9.7","pid":57092,"requestId":"T10IM-N5OHM","timestamp":"2026-05-23T16:44:19.811Z","operation":"httpErrorHandler","critical":false,"errorCode":-32006,"originalErrorType":"McpError","finalErrorType":"McpError","path":"/mcp","method":"GET","errorData":{"path":"/mcp","method":"GET","requestId":"T10IM-N5OHM","timestamp":"2026-05-23T16:44:19.811Z","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:232: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:79: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:170: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."}
@@ -1,5 +0,0 @@
1
- {"level":50,"time":1779554658688,"env":"testing","version":"0.0.0-test","pid":57052,"requestId":"KD5VX-QNDSK","timestamp":"2026-05-23T16:44:18.688Z","operation":"HandleToolRequest","critical":false,"errorCode":-32005,"originalErrorType":"McpError","finalErrorType":"McpError","sessionId":"eca1f32c9116477ca19cd419874e3d2189fa58a29e6868d4454379f09d08c761","toolName":"scoped_echo","tenantId":"authz-tenant","auth":{"sub":"authz-user","scopes":["tool:other:read"],"clientId":"authz-client","tenantId":"authz-tenant","token":"[REDACTED]"},"errorData":{"sessionId":"eca1f32c9116477ca19cd419874e3d2189fa58a29e6868d4454379f09d08c761","toolName":"scoped_echo","requestId":"KD5VX-QNDSK","timestamp":"2026-05-23T16:44:18.688Z","tenantId":"authz-tenant","operation":"HandleToolRequest","auth":{"sub":"authz-user","scopes":["tool:other:read"],"clientId":"authz-client","tenantId":"authz-tenant","token":"[REDACTED]"},"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:68:15)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/tools/utils/toolHandlerFactory.js:146: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:170:23)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/tools/utils/toolHandlerFactory.js:184:26)\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":1779554658696,"env":"testing","version":"0.0.0-test","pid":57052,"requestId":"0T35D-7ME6T","timestamp":"2026-05-23T16:44:18.696Z","operation":"HandleToolRequest","critical":false,"errorCode":-32005,"originalErrorType":"McpError","finalErrorType":"McpError","sessionId":"5c8698220b504698a993704832e28f177cbcea7ed9d4ee20b1755f87ff2be9d8","toolName":"scoped_echo","tenantId":"authz-tenant","auth":{"sub":"authz-user","scopes":["openid","email","profile","offline_access"],"clientId":"authz-client","tenantId":"authz-tenant","token":"[REDACTED]"},"errorData":{"sessionId":"5c8698220b504698a993704832e28f177cbcea7ed9d4ee20b1755f87ff2be9d8","toolName":"scoped_echo","requestId":"0T35D-7ME6T","timestamp":"2026-05-23T16:44:18.696Z","tenantId":"authz-tenant","operation":"HandleToolRequest","auth":{"sub":"authz-user","scopes":["openid","email","profile","offline_access"],"clientId":"authz-client","tenantId":"authz-tenant","token":"[REDACTED]"},"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:68:15)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/tools/utils/toolHandlerFactory.js:146: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:170:23)\n at <anonymous> (/Users/casey/Developer/github/mcp-ts-core/dist/mcp-server/tools/utils/toolHandlerFactory.js:184:26)\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."}
3
- {"level":50,"time":1779554659793,"env":"testing","version":"0.9.7","pid":57092,"requestId":"710FM-RJENE","timestamp":"2026-05-23T16:44:19.792Z","operation":"httpErrorHandler","critical":false,"errorCode":-32006,"originalErrorType":"McpError","finalErrorType":"McpError","path":"/mcp","method":"POST","errorData":{"path":"/mcp","method":"POST","requestId":"710FM-RJENE","timestamp":"2026-05-23T16:44:19.792Z","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:232: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:79: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:170: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."}
4
- {"level":50,"time":1779554659808,"env":"testing","version":"0.9.7","pid":57092,"requestId":"9GLH9-PHGBC","timestamp":"2026-05-23T16:44:19.808Z","operation":"httpErrorHandler","critical":false,"errorCode":-32006,"originalErrorType":"McpError","finalErrorType":"McpError","path":"/mcp","method":"POST","errorData":{"path":"/mcp","method":"POST","requestId":"9GLH9-PHGBC","timestamp":"2026-05-23T16:44:19.808Z","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:72: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:170: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."}
5
- {"level":50,"time":1779554659811,"env":"testing","version":"0.9.7","pid":57092,"requestId":"T10IM-N5OHM","timestamp":"2026-05-23T16:44:19.811Z","operation":"httpErrorHandler","critical":false,"errorCode":-32006,"originalErrorType":"McpError","finalErrorType":"McpError","path":"/mcp","method":"GET","errorData":{"path":"/mcp","method":"GET","requestId":"T10IM-N5OHM","timestamp":"2026-05-23T16:44:19.811Z","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:232: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:79: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:170: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