@cyanheads/mcp-ts-core 0.8.18 → 0.8.20

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 (46) hide show
  1. package/CLAUDE.md +50 -47
  2. package/README.md +35 -37
  3. package/changelog/0.8.x/0.8.19.md +33 -0
  4. package/changelog/0.8.x/0.8.20.md +26 -0
  5. package/changelog/template.md +71 -44
  6. package/dist/cli/init.js +12 -5
  7. package/dist/cli/init.js.map +1 -1
  8. package/dist/config/index.d.ts +3 -0
  9. package/dist/config/index.d.ts.map +1 -1
  10. package/dist/config/index.js +11 -0
  11. package/dist/config/index.js.map +1 -1
  12. package/dist/logs/combined.log +7 -12
  13. package/dist/logs/error.log +5 -8
  14. package/dist/mcp-server/transports/auth/authFactory.d.ts.map +1 -1
  15. package/dist/mcp-server/transports/auth/authFactory.js +4 -1
  16. package/dist/mcp-server/transports/auth/authFactory.js.map +1 -1
  17. package/dist/mcp-server/transports/auth/lib/authUtils.d.ts +3 -0
  18. package/dist/mcp-server/transports/auth/lib/authUtils.d.ts.map +1 -1
  19. package/dist/mcp-server/transports/auth/lib/authUtils.js +7 -0
  20. package/dist/mcp-server/transports/auth/lib/authUtils.js.map +1 -1
  21. package/dist/mcp-server/transports/auth/lib/checkScopes.d.ts +4 -0
  22. package/dist/mcp-server/transports/auth/lib/checkScopes.d.ts.map +1 -1
  23. package/dist/mcp-server/transports/auth/lib/checkScopes.js +7 -0
  24. package/dist/mcp-server/transports/auth/lib/checkScopes.js.map +1 -1
  25. package/dist/mcp-server/transports/auth/lib/claimParser.d.ts +5 -1
  26. package/dist/mcp-server/transports/auth/lib/claimParser.d.ts.map +1 -1
  27. package/dist/mcp-server/transports/auth/lib/claimParser.js +24 -8
  28. package/dist/mcp-server/transports/auth/lib/claimParser.js.map +1 -1
  29. package/package.json +14 -12
  30. package/scripts/build-changelog.ts +27 -18
  31. package/skills/api-auth/SKILL.md +37 -3
  32. package/skills/api-config/SKILL.md +2 -1
  33. package/skills/api-telemetry/SKILL.md +222 -0
  34. package/skills/api-utils/SKILL.md +3 -1
  35. package/skills/maintenance/SKILL.md +16 -6
  36. package/skills/polish-docs-meta/references/package-meta.md +1 -1
  37. package/skills/report-issue-framework/SKILL.md +5 -3
  38. package/skills/report-issue-local/SKILL.md +5 -3
  39. package/skills/security-pass/SKILL.md +3 -2
  40. package/skills/setup/SKILL.md +10 -9
  41. package/skills/tool-defs-analysis/SKILL.md +2 -2
  42. package/templates/AGENTS.md +20 -10
  43. package/templates/CLAUDE.md +20 -10
  44. package/templates/Dockerfile +2 -2
  45. package/templates/changelog/template.md +71 -44
  46. package/templates/package.json +2 -2
@@ -27,7 +27,7 @@ These are set by `init` and generally don't need changes. Verify they're present
27
27
  | `main` | `"dist/index.js"` | Entry point after build |
28
28
  | `types` | `"dist/index.d.ts"` | TypeScript declarations |
29
29
  | `files` | `["dist/"]` | What npm publishes |
30
- | `engines` | `{ "node": ">=22.0.0" }` | Add `"bun": ">=1.2.0"` alongside Node |
30
+ | `engines` | `{ "node": ">=24.0.0" }` | Add `"bun": ">=1.3.0"` alongside Node |
31
31
  | `packageManager` | _(often missing)_ | `"bun@1.3.2"` (or current Bun version). Signals the intended package manager. |
32
32
  | `scripts` | _(various)_ | Build, dev, test scripts |
33
33
  | `dependencies` | `@cyanheads/mcp-ts-core` | Core framework |
@@ -4,7 +4,7 @@ description: >
4
4
  File a bug or feature request against @cyanheads/mcp-ts-core when you hit a framework issue. Use when a builder, utility, context method, or config behaves contrary to the documented API — not for server-specific application bugs.
5
5
  metadata:
6
6
  author: cyanheads
7
- version: "1.5"
7
+ version: "1.6"
8
8
  audience: external
9
9
  type: workflow
10
10
  ---
@@ -35,16 +35,18 @@ gh issue list -R cyanheads/mcp-ts-core --search "your error message or keyword"
35
35
 
36
36
  ## Writing Well-Structured Issues
37
37
 
38
- Good issues are scannable, concrete, and self-contained. These patterns apply to both bugs and features — the guidance targets any prose block (Description, Additional context, feature proposals).
38
+ Good issues are scannable, concrete, and self-contained — terse and fact-dense. Default to one or two sentences per bullet; if a bullet runs long, split it or cut it. These patterns apply to both bugs and features — the guidance targets any prose block (Description, Additional context, feature proposals).
39
39
 
40
40
  - **Lead with specifics.** Name the tool, function, module, or symptom. "Currently `createApp()` throws `ConfigurationError` when `MCP_HTTP_PORT` is set to `0`" beats "There's a problem with the config." A reader should know what's broken or missing before the end of the first sentence.
41
41
  - **Embed library/service links on first mention.** `[Hono](https://hono.dev/)`, `[linkedom](https://github.com/WebReflection/linkedom)`. Link to the canonical repo or homepage so readers can verify the dependency and reach docs in one click.
42
42
  - **Use `owner/repo#N` for cross-repo issue references.** GitHub auto-renders them as linked references (e.g. `cyanheads/pubmed-mcp-server#34`). Bare `#N` only works for same-repo issues.
43
43
  - **Add a `Related: #N` line** near the top when the issue grows from prior context (discussions, other issues, PRs). Makes provenance clickable.
44
+ - **Cite cross-references once per body.** Link an issue/PR in `Related:`, the description, or Additional context — not all three. The reader sees them all; redundant linking dilutes signal.
44
45
  - **Lead design sections with a philosophy sentence.** Bold a short principle before the tradeoff details — e.g. "Philosophy: **fail fast on config errors, degrade gracefully on runtime errors.**" Establishes the lens for the rest of the section.
45
46
  - **Prefer Markdown tables for comparisons.** When showing options, tiers, strategies, or tradeoffs — tables are the highest-density format for scanning N rows × M attributes.
46
47
  - **Separate `### Scope` from `### Out of scope`.** The latter is as important as the former — it pre-empts scope-creep debates in comments and signals you've thought about the boundaries.
47
48
  - **Use `Depends on: owner/repo#N`** to declare ordering explicitly when implementation is blocked on another issue landing first.
49
+ - **Cut what dilutes the signal.** Mechanism walkthroughs (link the PR or doc instead), ceremonial framings ("This issue covers…"), conversation references ("as discussed", "per offline"), and kitchen-sink Additional context blocks. If a paragraph isn't pulling weight, drop it.
48
50
  - **Skip collaborator-framing sign-offs.** Lines like "Happy to open a PR", "let me know if you'd like", "willing to contribute", "if that's the preferred flow" read as noise. A PR link beats an offer; if you're the maintainer filing against your own repo, the offer is redundant. End the body at the last substantive point.
49
51
 
50
52
  ## Redact Before Posting
@@ -81,7 +83,7 @@ Bun
81
83
 
82
84
  ### Runtime version
83
85
 
84
- Bun 1.2.x
86
+ Bun 1.3.x
85
87
 
86
88
  ### Transport
87
89
 
@@ -4,7 +4,7 @@ description: >
4
4
  File a bug or feature request against this MCP server's own repo. Use for server-specific issues — tool logic, service integrations, config problems, or domain bugs that aren't caused by the framework.
5
5
  metadata:
6
6
  author: cyanheads
7
- version: "1.4"
7
+ version: "1.5"
8
8
  audience: external
9
9
  type: workflow
10
10
  ---
@@ -44,16 +44,18 @@ gh issue list --search "your error message or keyword"
44
44
 
45
45
  ## Writing Well-Structured Issues
46
46
 
47
- Good issues are scannable, concrete, and self-contained. These patterns apply to both bugs and features — the guidance targets any prose block (Description, Additional context, feature proposals).
47
+ Good issues are scannable, concrete, and self-contained — terse and fact-dense. Default to one or two sentences per bullet; if a bullet runs long, split it or cut it. These patterns apply to both bugs and features — the guidance targets any prose block (Description, Additional context, feature proposals).
48
48
 
49
49
  - **Lead with specifics.** Name the tool, service, resource, or symptom. "Currently `search_docs` returns an empty array for queries containing `&`" beats "Search is broken." A reader should know what's wrong before the end of the first sentence.
50
50
  - **Embed library/service links on first mention.** `[Hono](https://hono.dev/)`, `[Supabase](https://supabase.com/)`. Link to the canonical repo or homepage so readers can verify the dependency and reach docs in one click.
51
51
  - **Use `owner/repo#N` for cross-repo issue references.** GitHub auto-renders them as linked references (e.g. `cyanheads/mcp-ts-core#46`). Bare `#N` only works for same-repo issues — useful when the bug depends on or relates to a framework issue.
52
52
  - **Add a `Related: #N` line** near the top when the issue grows from prior context (discussions, other issues, PRs). Makes provenance clickable.
53
+ - **Cite cross-references once per body.** Link an issue/PR in `Related:`, the description, or Additional context — not all three. The reader sees them all; redundant linking dilutes signal.
53
54
  - **Lead design sections with a philosophy sentence.** Bold a short principle before the tradeoff details — e.g. "Philosophy: **return best-effort data, don't fail the tool call on parsing edge cases.**" Establishes the lens for the rest of the section.
54
55
  - **Prefer Markdown tables for comparisons.** When showing options, data sources, strategies, or tradeoffs — tables are the highest-density format for scanning N rows × M attributes.
55
56
  - **Separate `### Scope` from `### Out of scope`.** The latter is as important as the former — it pre-empts scope-creep debates in comments and signals you've thought about the boundaries.
56
57
  - **Use `Depends on: owner/repo#N`** to declare ordering explicitly when implementation is blocked on an upstream framework change or another issue landing first.
58
+ - **Cut what dilutes the signal.** Mechanism walkthroughs (link the PR or doc instead), ceremonial framings ("This issue covers…"), conversation references ("as discussed", "per offline"), and kitchen-sink Additional context blocks. If a paragraph isn't pulling weight, drop it.
57
59
  - **Skip collaborator-framing sign-offs.** Lines like "Happy to open a PR", "let me know if you'd like", "willing to contribute", "if that's the preferred flow" read as noise. A PR link beats an offer; if you're the maintainer filing against your own repo, the offer is redundant. End the body at the last substantive point.
58
60
 
59
61
  ## Redact Before Posting
@@ -94,7 +96,7 @@ Bun
94
96
 
95
97
  ### Runtime version
96
98
 
97
- Bun 1.2.x
99
+ Bun 1.3.x
98
100
 
99
101
  ### Transport
100
102
 
@@ -4,7 +4,7 @@ description: >
4
4
  Review an MCP server for common security gaps: LLM-facing surfaces as injection vector (tools, resources, prompts, descriptions), scope blast radius, destructive ops without consent, upstream auth shape, input sinks (URL / path / roots / shell / sampling / schema strictness / ReDoS), tenant isolation, leakage through errors and telemetry, unbounded resources, and HTTP-mode deployment surface. Use before a release, after a batch of handler changes, or when the user asks for a security review, audit, or hardening pass. Produces grouped findings and a numbered options list.
5
5
  metadata:
6
6
  author: cyanheads
7
- version: "1.3"
7
+ version: "1.4"
8
8
  audience: external
9
9
  type: audit
10
10
  ---
@@ -104,8 +104,9 @@ grep -rn "auth: \[" src/mcp-server/tools/definitions/
104
104
  - Tools with `['admin']`, `['*']`, or `[]`?
105
105
  - A single scope covering two capabilities that should be separated (read vs write)?
106
106
  - Read-only tools never require write scopes?
107
+ - `MCP_AUTH_DISABLE_SCOPE_CHECKS=true` set in production? When on, both `withRequiredScopes` and `checkScopes` early-return — every authenticated user gets every tool, and runtime tenant patterns like `team:${input.teamId}:write` no longer guard. Acceptable only when paired with a real server-side ACL (path filter, allowlist, upstream API enforcement).
107
108
 
108
- **Smell:** every tool shares the same scope string.
109
+ **Smell:** every tool shares the same scope string. Or: `MCP_AUTH_DISABLE_SCOPE_CHECKS=true` set without a documented compensating ACL — confirm the deployment relies on a meaningful access control layer below the framework before approving.
109
110
 
110
111
  #### Axis 3 — Destructive ops without elicit
111
112
 
@@ -4,14 +4,14 @@ description: >
4
4
  Post-init orientation for an MCP server built on @cyanheads/mcp-ts-core. Use after running `@cyanheads/mcp-ts-core init` to understand the project structure, conventions, and skill sync model. Also use when onboarding to an existing project for the first time.
5
5
  metadata:
6
6
  author: cyanheads
7
- version: "1.6"
7
+ version: "1.7"
8
8
  audience: external
9
9
  type: workflow
10
10
  ---
11
11
 
12
12
  ## Context
13
13
 
14
- This skill assumes `npx @cyanheads/mcp-ts-core init [name]` has already run. The CLI created the project's `CLAUDE.md` and `AGENTS.md` for different agents, copied external skills to `skills/`, and scaffolded the directory structure with echo definitions as starting points. This skill covers what was created and what to do next.
14
+ This skill assumes `bunx @cyanheads/mcp-ts-core init [name]` has already run. The CLI created the project's `CLAUDE.md` and `AGENTS.md` for different agents, copied external skills to `skills/`, and scaffolded the directory structure with echo definitions as starting points. This skill covers what was created and what to do next.
15
15
 
16
16
  ## Agent Protocol File
17
17
 
@@ -22,7 +22,7 @@ The init CLI generates both `CLAUDE.md` and `AGENTS.md` with the same purpose. K
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
 
25
- For the full framework API, read `node_modules/@cyanheads/mcp-ts-core/CLAUDE.md` once per session. It contains the exports catalog, tool/resource/prompt contracts, error codes, context API, and common import patterns.
25
+ For the full framework docs, read `node_modules/@cyanheads/mcp-ts-core/CLAUDE.md` once per session. It contains the exports catalog, tool/resource/prompt contracts, error codes, context API, and common import patterns.
26
26
 
27
27
  ## Project Structure
28
28
 
@@ -96,7 +96,7 @@ After init:
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
97
  3. **Definitions register directly in `src/index.ts`.** No barrel files, just import and add to the `tools` / `resources` / `prompts` arrays.
98
98
 
99
- See the `add-tool`, `add-app-tool`, `add-resource`, `add-prompt`, and `add-test` skills for the scaffolding patterns when you start adding real definitions.
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
 
101
101
  ## Conventions
102
102
 
@@ -130,11 +130,11 @@ After `bun install`, complete these one-time setup tasks:
130
130
 
131
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
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 agent protocol placeholders** — if the `init` CLI was run without a `[name]` argument, `{{PACKAGE_NAME}}` may remain as a literal in `CLAUDE.md`/`AGENTS.md` and `package.json`. Replace it with the actual server name.
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.
134
134
 
135
135
  ## Changelog Convention
136
136
 
137
- `changelog/template.md` ships as a **format reference** — never edit, rename, or move it. For each release, author a per-version file at `changelog/<major.minor>.x/<version>.md` (e.g. `changelog/0.1.x/0.1.0.md`) with YAML frontmatter (`summary:` + optional `breaking:`) and grouped sections (Added / Changed / Fixed / Removed). Then regenerate the rollup with `bun run changelog:build` — `CHANGELOG.md` is an auto-generated navigation index, never hand-edited. See the `release-and-publish` skill for the full release flow.
137
+ `changelog/template.md` ships as a **format reference** — never edit, rename, or move it. For each release, author a per-version file at `changelog/<major.minor>.x/<version>.md` (e.g. `changelog/0.1.x/0.1.0.md`) with YAML frontmatter (`summary:` + optional `breaking:` / `security:`) and grouped sections (Added / Changed / Fixed / Removed). Then regenerate the rollup with `bun run changelog:build` — `CHANGELOG.md` is an auto-generated navigation index, never hand-edited. See the `release-and-publish` skill for the full release flow.
138
138
 
139
139
  ## Next Steps
140
140
 
@@ -146,15 +146,16 @@ The included skills form a rough progression — not a rigid sequence, but the t
146
146
  4. **`field-test`** — exercise the built surface with real and adversarial inputs; produces a report of issues and pain points
147
147
  5. **`security-pass`** — audit handlers for MCP-specific security gaps: output injection, scope blast radius, input sinks, tenant isolation
148
148
  6. **`polish-docs-meta`** — finalize README, metadata, and agent protocol before shipping
149
- 7. **`maintenance`** — after `bun update --latest`, investigate upstream changelogs and re-sync skills
149
+ 7. **`release-and-publish`** — post-wrapup ship workflow: verification gate, push commits and tags, publish to npm/MCP Registry/GHCR
150
+ 8. **`maintenance`** — after `bun update --latest`, investigate upstream changelogs and re-sync skills
150
151
 
151
152
  Skip or reorder as the project calls for it. The agent protocol's "What's Next?" section is the authoritative map once the first session is over.
152
153
 
153
154
  ## Checklist
154
155
 
155
156
  - [ ] Agent protocol file selected — keep one authoritative file (`CLAUDE.md` or `AGENTS.md`)
156
- - [ ] `{{PACKAGE_NAME}}` placeholders replaced in agent protocol file (if not auto-substituted by init)
157
- - [ ] Core framework CLAUDE.md read (`node_modules/@cyanheads/mcp-ts-core/CLAUDE.md`)
157
+ - [ ] Substituted server name verified in `package.json`, agent protocol file, and `server.json`
158
+ - [ ] Framework docs read (`node_modules/@cyanheads/mcp-ts-core/CLAUDE.md`)
158
159
  - [ ] Unused echo definitions cleaned up (and unregistered from `src/index.ts`)
159
160
  - [ ] Skills copied to agent directory (`cp -R skills/* .claude/skills/` or equivalent)
160
161
  - [ ] Project structure understood (definitions directories, entry point)
@@ -4,7 +4,7 @@ description: >
4
4
  Read-only audit of MCP definition language across an existing surface — tools, resources, prompts. Walks every definition file and checks 10 categories the LLM reads to decide whether and how to call: voice & tense, internal leaks, audience leaks, defaults, recovery hints, output descriptions, cross-references, sparsity, examples, structure. Produces grouped findings with file:line citations and a numbered options list. Use during polish, after a refactor, or before a release. Complements `field-test` (behavior testing) and `security-pass` (security audit).
5
5
  metadata:
6
6
  author: cyanheads
7
- version: "1.0"
7
+ version: "1.1"
8
8
  audience: external
9
9
  type: audit
10
10
  ---
@@ -105,7 +105,7 @@ Prior art: #74. Field-test catches this in its leak audit; this skill is the mor
105
105
 
106
106
  **Check:** the hint directs the *agent* to its next action, not the developer to debugging. "Call `pubmed_search` with a narrower query" beats "Verify the configuration is correct" or "Internal error".
107
107
 
108
- **Smell:** "Check the logs", "See documentation", "Contact admin", "Try again later" (with no condition), generic non-actionable text, hints that name internal classes, files, or env vars.
108
+ **Smell:** "Check the logs", "See documentation", "Contact admin", "Try again later" (with no condition), generic non-actionable text, hints that name internal classes or files.
109
109
 
110
110
  #### 6. Output descriptions
111
111
 
@@ -1,8 +1,11 @@
1
- # Agent Protocol
1
+ # Developer Protocol
2
2
 
3
3
  **Server:** {{PACKAGE_NAME}}
4
4
  **Version:** 0.1.0
5
- **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core)
5
+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^{{FRAMEWORK_VERSION}}`
6
+ **Engines:** Bun ≥1.3.0, Node ≥24.0.0
7
+ **MCP SDK:** `@modelcontextprotocol/sdk` {{MCP_SDK_VERSION}}
8
+ **Zod:** {{ZOD_VERSION}}
6
9
 
7
10
  > **Read the framework docs first:** `node_modules/@cyanheads/mcp-ts-core/CLAUDE.md` contains the full API reference — builders, Context, error codes, exports, patterns. This file covers server-specific conventions only.
8
11
 
@@ -10,17 +13,20 @@
10
13
 
11
14
  ## First Session
12
15
 
16
+ This project was just scaffolded with `bunx @cyanheads/mcp-ts-core init`. The framework, skills, and example definitions are in place — the domain isn't. The user's first messages will set direction; wait for them before proceeding.
17
+
13
18
  > **Remove this section** from CLAUDE.md / AGENTS.md after completing these steps. The skills and conventions below remain — this block is one-time onboarding only.
14
19
 
15
- 1. **Read the framework API** — `node_modules/@cyanheads/mcp-ts-core/CLAUDE.md`
16
- 2. **Run the `setup` skill** — read `skills/setup/SKILL.md` and follow its checklist (project orientation, agent protocol file selection, echo definition cleanup, skill sync)
17
- 3. **Design the server** — read `skills/design-mcp-server/SKILL.md` and work through it with the user to map the domain into tools, resources, and services before scaffolding
20
+ 1. **Get your bearings.** Take stock of your current environment think through the project tree, the skills in `skills/`, and the tools/MCP servers you have available. Light tool use is fine if something isn't already in context; you're building a mental map for later, not committing to anything yet.
21
+ 2. **Read the framework docs** — `node_modules/@cyanheads/mcp-ts-core/CLAUDE.md` (builders, Context, errors, exports, conventions)
22
+ 3. **Run the `setup` skill** — read `skills/setup/SKILL.md` and follow its checklist (project orientation, agent protocol file selection, echo definition cleanup, skill sync)
23
+ 4. **Design the server** — read `skills/design-mcp-server/SKILL.md` and work through it with the user to map the domain into tools, resources, and services before scaffolding
18
24
 
19
25
  ---
20
26
 
21
27
  ## What's Next?
22
28
 
23
- When the user asks what to do next, what's left, or needs direction, suggest relevant options based on the current project state:
29
+ When the user asks what to do next, what's left, or needs direction, you can suggest relevant options based on the current project state. Some common next steps:
24
30
 
25
31
  1. **Re-run the `setup` skill** — ensures CLAUDE.md, skills, structure, and metadata are populated and up to date with the current codebase
26
32
  2. **Run the `design-mcp-server` skill** — if the tool/resource surface hasn't been mapped yet, work through domain design
@@ -271,7 +277,8 @@ Available skills:
271
277
  | `api-errors` | McpError, JsonRpcErrorCode, error patterns |
272
278
  | `api-services` | LLM, Speech, Graph services |
273
279
  | `api-testing` | createMockContext, test patterns |
274
- | `api-utils` | Formatting, parsing, security, pagination, scheduling |
280
+ | `api-utils` | Formatting, parsing, security, pagination, scheduling, telemetry helpers |
281
+ | `api-telemetry` | OTel catalog: spans, metrics, completion logs, env config, cardinality rules |
275
282
  | `api-workers` | Cloudflare Workers runtime |
276
283
 
277
284
  When you complete a skill's checklist, check the boxes and add a completion timestamp at the end (e.g., `Completed: 2026-03-11`).
@@ -306,15 +313,18 @@ Each per-version file opens with YAML frontmatter:
306
313
 
307
314
  ```markdown
308
315
  ---
309
- summary: One-line headline, ≤250 chars # required — powers the rollup index
310
- breaking: false # optional — true flags breaking changes
316
+ summary: "One-line headline, ≤250 chars" # required — powers the rollup index
317
+ breaking: false # optional — true flags breaking changes
318
+ security: false # optional — true flags security fixes
311
319
  ---
312
320
 
313
321
  # 0.1.0 — YYYY-MM-DD
314
322
  ...
315
323
  ```
316
324
 
317
- `breaking: true` renders a `· ⚠️ Breaking` badge in the rollup — use it when consumers must update code on upgrade (signature changes, removed APIs, config renames).
325
+ `breaking: true` renders a `· ⚠️ Breaking` badge — use it when consumers must update code on upgrade (signature changes, removed APIs, config renames). `security: true` renders a `· 🛡️ Security` badge and pairs with a `## Security` body section. When both are set, badges render `· ⚠️ Breaking · 🛡️ Security`.
326
+
327
+ **Section order** (Keep a Changelog): Added, Changed, Deprecated, Removed, Fixed, Security. Include only sections with entries — don't ship empty headers.
318
328
 
319
329
  ---
320
330
 
@@ -1,8 +1,11 @@
1
- # Agent Protocol
1
+ # Developer Protocol
2
2
 
3
3
  **Server:** {{PACKAGE_NAME}}
4
4
  **Version:** 0.1.0
5
- **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core)
5
+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^{{FRAMEWORK_VERSION}}`
6
+ **Engines:** Bun ≥1.3.0, Node ≥24.0.0
7
+ **MCP SDK:** `@modelcontextprotocol/sdk` {{MCP_SDK_VERSION}}
8
+ **Zod:** {{ZOD_VERSION}}
6
9
 
7
10
  > **Read the framework docs first:** `node_modules/@cyanheads/mcp-ts-core/CLAUDE.md` contains the full API reference — builders, Context, error codes, exports, patterns. This file covers server-specific conventions only.
8
11
 
@@ -10,17 +13,20 @@
10
13
 
11
14
  ## First Session
12
15
 
16
+ This project was just scaffolded with `bunx @cyanheads/mcp-ts-core init`. The framework, skills, and example definitions are in place — the domain isn't. The user's first messages will set direction; wait for them before proceeding.
17
+
13
18
  > **Remove this section** from CLAUDE.md / AGENTS.md after completing these steps. The skills and conventions below remain — this block is one-time onboarding only.
14
19
 
15
- 1. **Read the framework API** — `node_modules/@cyanheads/mcp-ts-core/CLAUDE.md`
16
- 2. **Run the `setup` skill** — read `skills/setup/SKILL.md` and follow its checklist (project orientation, agent protocol file selection, echo definition cleanup, skill sync)
17
- 3. **Design the server** — read `skills/design-mcp-server/SKILL.md` and work through it with the user to map the domain into tools, resources, and services before scaffolding
20
+ 1. **Get your bearings.** Take stock of your current environment think through the project tree, the skills in `skills/`, and the tools/MCP servers you have available. Light tool use is fine if something isn't already in context; you're building a mental map for later, not committing to anything yet.
21
+ 2. **Read the framework docs** — `node_modules/@cyanheads/mcp-ts-core/CLAUDE.md` (builders, Context, errors, exports, conventions)
22
+ 3. **Run the `setup` skill** — read `skills/setup/SKILL.md` and follow its checklist (project orientation, agent protocol file selection, echo definition cleanup, skill sync)
23
+ 4. **Design the server** — read `skills/design-mcp-server/SKILL.md` and work through it with the user to map the domain into tools, resources, and services before scaffolding
18
24
 
19
25
  ---
20
26
 
21
27
  ## What's Next?
22
28
 
23
- When the user asks what to do next, what's left, or needs direction, suggest relevant options based on the current project state:
29
+ When the user asks what to do next, what's left, or needs direction, you can suggest relevant options based on the current project state. Some common next steps:
24
30
 
25
31
  1. **Re-run the `setup` skill** — ensures CLAUDE.md, skills, structure, and metadata are populated and up to date with the current codebase
26
32
  2. **Run the `design-mcp-server` skill** — if the tool/resource surface hasn't been mapped yet, work through domain design
@@ -271,7 +277,8 @@ Available skills:
271
277
  | `api-errors` | McpError, JsonRpcErrorCode, error patterns |
272
278
  | `api-services` | LLM, Speech, Graph services |
273
279
  | `api-testing` | createMockContext, test patterns |
274
- | `api-utils` | Formatting, parsing, security, pagination, scheduling |
280
+ | `api-utils` | Formatting, parsing, security, pagination, scheduling, telemetry helpers |
281
+ | `api-telemetry` | OTel catalog: spans, metrics, completion logs, env config, cardinality rules |
275
282
  | `api-workers` | Cloudflare Workers runtime |
276
283
 
277
284
  When you complete a skill's checklist, check the boxes and add a completion timestamp at the end (e.g., `Completed: 2026-03-11`).
@@ -306,15 +313,18 @@ Each per-version file opens with YAML frontmatter:
306
313
 
307
314
  ```markdown
308
315
  ---
309
- summary: One-line headline, ≤250 chars # required — powers the rollup index
310
- breaking: false # optional — true flags breaking changes
316
+ summary: "One-line headline, ≤250 chars" # required — powers the rollup index
317
+ breaking: false # optional — true flags breaking changes
318
+ security: false # optional — true flags security fixes
311
319
  ---
312
320
 
313
321
  # 0.1.0 — YYYY-MM-DD
314
322
  ...
315
323
  ```
316
324
 
317
- `breaking: true` renders a `· ⚠️ Breaking` badge in the rollup — use it when consumers must update code on upgrade (signature changes, removed APIs, config renames).
325
+ `breaking: true` renders a `· ⚠️ Breaking` badge — use it when consumers must update code on upgrade (signature changes, removed APIs, config renames). `security: true` renders a `· 🛡️ Security` badge and pairs with a `## Security` body section. When both are set, badges render `· ⚠️ Breaking · 🛡️ Security`.
326
+
327
+ **Section order** (Keep a Changelog): Added, Changed, Deprecated, Removed, Fixed, Security. Include only sections with entries — don't ship empty headers.
318
328
 
319
329
  ---
320
330
 
@@ -4,7 +4,7 @@
4
4
  # This stage installs all dependencies (including dev), builds the TypeScript
5
5
  # source code into JavaScript, and prepares the production assets.
6
6
  # ==============================================================================
7
- FROM oven/bun:1 AS build
7
+ FROM oven/bun:1.3 AS build
8
8
 
9
9
  WORKDIR /usr/src/app
10
10
 
@@ -28,7 +28,7 @@ RUN bun run build
28
28
  # application. It uses a slim base image and only includes production
29
29
  # dependencies and build artifacts.
30
30
  # ==============================================================================
31
- FROM oven/bun:1-slim AS production
31
+ FROM oven/bun:1.3-slim AS production
32
32
 
33
33
  WORKDIR /usr/src/app
34
34
 
@@ -1,56 +1,71 @@
1
1
  ---
2
- # FORMAT REFERENCE — this file is never edited, never moved, never renamed.
3
- #
4
- # At release time, author a new per-version file at:
5
- # changelog/<major.minor>.x/<version>.md (e.g. changelog/0.6.x/0.6.6.md)
6
- # using this file's frontmatter and section layout as the starting point.
7
- # Set that new file's H1 to `# <version> — YYYY-MM-DD` with a concrete date.
8
-
9
- # Required. One-line headline describing the release. Max 250 chars. No markdown.
10
- # This line is what the CHANGELOG.md rollup shows write it like a GitHub Release title.
11
- # Keep the double quotes around the value — unquoted YAML treats `:` (colon-space)
12
- # inside the string as a key separator, which fails GitHub's strict YAML parser.
2
+ # FORMAT REFERENCE — do not edit. Copy this file to
3
+ # `changelog/<major.minor>.x/<version>.md` (e.g. `changelog/0.8.x/0.8.6.md`)
4
+ # to author a new release. Set that file's H1 to `# <version> — YYYY-MM-DD`
5
+ # with a concrete date.
6
+
7
+ # Required. One-line GitHub Release-style headline. ~250 character soft cap.
8
+ # Default short and scannable. Don't pad, don't stitch unrelated changes with
9
+ # semicolons pick the headline. Quotes required: unquoted YAML treats `: `
10
+ # inside the value as a key separator and fails GitHub's strict parser.
13
11
  summary: ""
14
12
 
15
- # Set to `true` only if this release has breaking changes (API removals, signature
16
- # changes, config renames, anything that requires consumer code changes on update).
17
- # Flagged as ⚠️ Breaking in the rollup.
13
+ # Set `true` when consumers must change code to upgrade: API removals,
14
+ # signature changes, config renames, behavior changes that break existing
15
+ # usage. Flagged as `Breaking` in the rollup.
18
16
  breaking: false
17
+
18
+ # Set `true` if this release contains any security fix. Pairs with the
19
+ # `## Security` section below. Flagged as `Security` in the rollup so
20
+ # users can triage upgrade urgency at a glance.
21
+ security: false
19
22
  ---
20
23
 
21
24
  # <version> — YYYY-MM-DD
22
25
 
23
26
  <!--
24
- FORMAT REFERENCEdo not edit this file. It exists so the per-version file
25
- structure has a single copy-source. Create new release notes at
26
- `changelog/<major.minor>.x/<version>.md` using this layout.
27
-
28
- Optional narrative intro 1-3 sentences framing the release theme. Delete if not needed.
29
-
30
- TONE: terse and fact-dense. 1-2 sentence(s) per bullet where possible —
31
- name the symbol, state what changed, stop. Drop "explains how it works" prose;
32
- that belongs in JSDoc, AGENTS.md, or the relevant skill. Drop ceremonial
33
- framings ("This release introduces…", "fully backwards compatible:" with a
34
- paragraph of justification). Prefer code/symbol names over English
35
- re-explanations. If a bullet runs more than ~2 lines, split it or cut it.
36
-
37
- WHAT TO INCLUDE: every distinct fact a reader needs to adopt or audit the
38
- release new exports, signatures, lint rule IDs, env vars, breaking
39
- changes, version bumps on shipped skills. WHAT TO CUT: mechanism walkthroughs,
40
- duplicate prose between Added and Changed, file-by-file test enumerations,
41
- internal implementation notes. Trust the reader to read the code or the docs.
42
-
43
- Linking issues/PRs: use full URLs so the link works everywhere (GitHub web UI,
44
- npm/node_modules reads, local editors). GitHub's bare `#NN` auto-link only
45
- resolves inside its own UI.
46
-
47
- [#38](https://github.com/cyanheads/mcp-ts-core/issues/38) ← issue
48
- [#42](https://github.com/cyanheads/mcp-ts-core/pull/42) ← PR
49
-
50
- Only link numbers you've verified exist (via `gh issue view NN` or
51
- `gh pr view NN`). Never speculate on a future number `#42` for "my
52
- upcoming PR" will quietly resolve to whatever real item already owns 42,
53
- and GitHub timeline previews will pull in that unrelated item's title.
27
+ AUTHORING GUIDEapplies to the new per-version file you create from this
28
+ template.
29
+
30
+ Audience: someone scanning release notes to decide what affects them. Lead
31
+ each bullet with the symbol or concept name in **bold** so they can skip
32
+ what's irrelevant and zoom in on what's not.
33
+
34
+ Tone: terse, fact-dense, not verbose. Default to one sentence per bullet
35
+ name the symbol, state what changed, stop. Use a second sentence only when
36
+ it carries weight. If a bullet feels long, it is.
37
+
38
+ Cut: mechanism walkthroughs (those belong in JSDoc, AGENTS.md, or the
39
+ relevant skill), ceremonial framings ("This release introduces…",
40
+ backwards-compat paragraphs), file-by-file test enumerations, internal
41
+ implementation notes. Prefer code/symbol names over English re-explanations.
42
+
43
+ Narrative intro: skip by default. Add one short sentence only when the
44
+ release theme genuinely needs framing the bullets can't carry.
45
+
46
+ Sections: Keep a Changelog order Added, Changed, Deprecated, Removed,
47
+ Fixed, Security. Include only sections with entries; delete the rest
48
+ (including the commented-out scaffolding below). Don't ship empty headers.
49
+
50
+ Include: every distinct fact a reader needs to adopt or audit the release —
51
+ new exports, signatures, lint rule IDs, env vars, breaking changes, version
52
+ bumps on shipped skills. Nothing more.
53
+
54
+ Links: link issues, PRs, docs, or skills where they help a reader jump to
55
+ context. Once per item per entry don't re-link the same issue in summary,
56
+ narrative, and bullet. Skip links for inline symbol names; code spans speak
57
+ for themselves.
58
+
59
+ Issue/PR URLs: use full URLs. GitHub's bare `#NN` auto-link only resolves
60
+ inside its own UI, not in npm reads or local editors.
61
+
62
+ [#38](https://github.com/cyanheads/mcp-ts-core/issues/38) ← issue
63
+ [#42](https://github.com/cyanheads/mcp-ts-core/pull/42) ← PR
64
+
65
+ Verify numbers exist before linking (`gh issue view NN`, `gh pr view NN`).
66
+ Never speculate on a future number — `#42` for an upcoming PR silently
67
+ resolves to whatever real item already owns 42, and timeline previews pull
68
+ in that unrelated item's metadata.
54
69
  -->
55
70
 
56
71
  ## Added
@@ -61,6 +76,18 @@ breaking: false
61
76
 
62
77
  -
63
78
 
79
+ <!-- ## Deprecated
80
+
81
+ - -->
82
+
83
+ <!-- ## Removed
84
+
85
+ - -->
86
+
64
87
  ## Fixed
65
88
 
66
89
  -
90
+
91
+ <!-- ## Security
92
+
93
+ - -->
@@ -44,8 +44,8 @@
44
44
  },
45
45
  "license": "Apache-2.0",
46
46
  "engines": {
47
- "bun": ">=1.2.0",
48
- "node": ">=22.0.0"
47
+ "bun": ">=1.3.0",
48
+ "node": ">=24.0.0"
49
49
  },
50
50
  "publishConfig": {
51
51
  "access": "public"