@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.
- package/CLAUDE.md +3 -2
- package/README.md +12 -8
- package/changelog/0.9.x/0.9.8.md +24 -0
- package/changelog/0.9.x/0.9.9.md +20 -0
- package/dist/testing/fuzz.d.ts +6 -1
- package/dist/testing/fuzz.d.ts.map +1 -1
- package/dist/testing/fuzz.js +93 -49
- package/dist/testing/fuzz.js.map +1 -1
- package/package.json +7 -6
- package/scripts/check-framework-antipatterns.ts +8 -4
- package/skills/add-app-tool/SKILL.md +6 -4
- package/skills/add-export/SKILL.md +10 -8
- package/skills/add-prompt/SKILL.md +15 -8
- package/skills/add-provider/SKILL.md +29 -12
- package/skills/add-resource/SKILL.md +20 -11
- package/skills/add-service/SKILL.md +15 -17
- package/skills/add-test/SKILL.md +50 -9
- package/skills/add-tool/SKILL.md +13 -6
- package/skills/api-auth/SKILL.md +3 -2
- package/skills/api-canvas/SKILL.md +43 -6
- package/skills/api-config/SKILL.md +6 -0
- package/skills/api-context/SKILL.md +9 -3
- package/skills/api-errors/SKILL.md +5 -5
- package/skills/api-linter/SKILL.md +32 -9
- package/skills/api-services/SKILL.md +1 -1
- package/skills/api-services/references/graph.md +1 -1
- package/skills/api-services/references/speech.md +1 -1
- package/skills/api-telemetry/SKILL.md +5 -5
- package/skills/api-testing/SKILL.md +9 -1
- package/skills/api-utils/SKILL.md +1 -1
- package/skills/api-workers/SKILL.md +12 -5
- package/skills/design-mcp-server/SKILL.md +20 -8
- package/skills/field-test/SKILL.md +9 -7
- package/skills/git-wrapup/SKILL.md +218 -0
- package/skills/maintenance/SKILL.md +8 -6
- package/skills/migrate-mcp-ts-template/SKILL.md +11 -7
- package/skills/multi-server-orchestration/SKILL.md +17 -5
- package/skills/multi-server-orchestration/references/greenfield-buildout.md +6 -3
- package/skills/multi-server-orchestration/references/maintenance-pass.md +11 -3
- package/skills/multi-server-orchestration/references/release-and-publish-pass.md +14 -25
- package/skills/multi-server-orchestration/references/wrapup-pass.md +13 -41
- package/skills/polish-docs-meta/SKILL.md +3 -1
- package/skills/polish-docs-meta/references/package-meta.md +1 -1
- package/skills/release-and-publish/SKILL.md +10 -9
- package/skills/report-issue-framework/SKILL.md +5 -3
- package/skills/report-issue-local/SKILL.md +10 -5
- package/skills/setup/SKILL.md +13 -8
- package/skills/tool-defs-analysis/SKILL.md +6 -3
- package/templates/CLAUDE.md +1 -0
- package/dist/logs/combined.log +0 -7
- package/dist/logs/error.log +0 -5
- package/dist/logs/interactions.log +0 -0
- 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
|
|
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
|
-
|
|
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
|
|
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
|
-
>
|
|
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
|
-
>
|
|
100
|
-
>
|
|
101
|
-
>
|
|
102
|
-
>
|
|
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
|
-
>
|
|
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`
|
|
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
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
-
>
|
|
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
|
-
>
|
|
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
|
-
> -
|
|
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
|
-
>
|
|
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
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
-
- [ ]
|
|
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
|
-
- [ ]
|
|
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
|
package/skills/setup/SKILL.md
CHANGED
|
@@ -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`,
|
|
21
|
-
- **All other agents** (Codex, Cursor, Windsurf, etc.) — keep `AGENTS.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`.**
|
|
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
|
-
|
|
129
|
+
Complete these one-time setup tasks:
|
|
130
130
|
|
|
131
|
-
1. **
|
|
132
|
-
2. **
|
|
133
|
-
3. **
|
|
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 —
|
|
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:
|
|
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`
|
|
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
|
|
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
|
package/templates/CLAUDE.md
CHANGED
|
@@ -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
|
|
package/dist/logs/combined.log
DELETED
|
@@ -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."}
|
package/dist/logs/error.log
DELETED
|
@@ -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
|