@cyanheads/mcp-ts-core 0.13.2 → 0.13.4

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 (117) hide show
  1. package/AGENTS.md +12 -10
  2. package/CLAUDE.md +12 -10
  3. package/README.md +2 -2
  4. package/changelog/0.13.x/0.13.3.md +44 -0
  5. package/changelog/0.13.x/0.13.4.md +65 -0
  6. package/changelog/template.md +7 -7
  7. package/dist/config/appRoot.d.ts.map +1 -1
  8. package/dist/config/appRoot.js +48 -16
  9. package/dist/config/appRoot.js.map +1 -1
  10. package/dist/core/app.d.ts +20 -0
  11. package/dist/core/app.d.ts.map +1 -1
  12. package/dist/core/app.js +1 -0
  13. package/dist/core/app.js.map +1 -1
  14. package/dist/core/index.d.ts +1 -0
  15. package/dist/core/index.d.ts.map +1 -1
  16. package/dist/core/index.js.map +1 -1
  17. package/dist/linter/rules/schema-rules.d.ts +19 -0
  18. package/dist/linter/rules/schema-rules.d.ts.map +1 -1
  19. package/dist/linter/rules/schema-rules.js +36 -0
  20. package/dist/linter/rules/schema-rules.js.map +1 -1
  21. package/dist/linter/rules/tool-rules.d.ts +17 -0
  22. package/dist/linter/rules/tool-rules.d.ts.map +1 -1
  23. package/dist/linter/rules/tool-rules.js +97 -1
  24. package/dist/linter/rules/tool-rules.js.map +1 -1
  25. package/dist/mcp-server/handlerContext.d.ts +6 -0
  26. package/dist/mcp-server/handlerContext.d.ts.map +1 -1
  27. package/dist/mcp-server/handlerContext.js.map +1 -1
  28. package/dist/mcp-server/resources/utils/resourceHandlerFactory.d.ts.map +1 -1
  29. package/dist/mcp-server/resources/utils/resourceHandlerFactory.js +17 -9
  30. package/dist/mcp-server/resources/utils/resourceHandlerFactory.js.map +1 -1
  31. package/dist/mcp-server/tools/utils/inputPrevalidation.d.ts +114 -0
  32. package/dist/mcp-server/tools/utils/inputPrevalidation.d.ts.map +1 -0
  33. package/dist/mcp-server/tools/utils/inputPrevalidation.js +428 -0
  34. package/dist/mcp-server/tools/utils/inputPrevalidation.js.map +1 -0
  35. package/dist/mcp-server/tools/utils/strictenRecord.d.ts +42 -0
  36. package/dist/mcp-server/tools/utils/strictenRecord.d.ts.map +1 -0
  37. package/dist/mcp-server/tools/utils/strictenRecord.js +48 -0
  38. package/dist/mcp-server/tools/utils/strictenRecord.js.map +1 -0
  39. package/dist/mcp-server/tools/utils/toolDefinition.d.ts +27 -0
  40. package/dist/mcp-server/tools/utils/toolDefinition.d.ts.map +1 -1
  41. package/dist/mcp-server/tools/utils/toolDefinition.js +35 -6
  42. package/dist/mcp-server/tools/utils/toolDefinition.js.map +1 -1
  43. package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts +28 -4
  44. package/dist/mcp-server/tools/utils/toolHandlerFactory.d.ts.map +1 -1
  45. package/dist/mcp-server/tools/utils/toolHandlerFactory.js +245 -23
  46. package/dist/mcp-server/tools/utils/toolHandlerFactory.js.map +1 -1
  47. package/dist/services/canvas/core/sqlGate.d.ts +14 -1
  48. package/dist/services/canvas/core/sqlGate.d.ts.map +1 -1
  49. package/dist/services/canvas/core/sqlGate.js +69 -7
  50. package/dist/services/canvas/core/sqlGate.js.map +1 -1
  51. package/dist/services/canvas/index.d.ts +1 -1
  52. package/dist/services/canvas/index.d.ts.map +1 -1
  53. package/dist/services/canvas/index.js +1 -1
  54. package/dist/services/canvas/index.js.map +1 -1
  55. package/dist/services/canvas/providers/duckdb/DuckdbProvider.d.ts +20 -0
  56. package/dist/services/canvas/providers/duckdb/DuckdbProvider.d.ts.map +1 -1
  57. package/dist/services/canvas/providers/duckdb/DuckdbProvider.js +75 -25
  58. package/dist/services/canvas/providers/duckdb/DuckdbProvider.js.map +1 -1
  59. package/dist/services/canvas/types.d.ts +6 -1
  60. package/dist/services/canvas/types.d.ts.map +1 -1
  61. package/dist/types-global/errors.d.ts.map +1 -1
  62. package/dist/types-global/errors.js +4 -3
  63. package/dist/types-global/errors.js.map +1 -1
  64. package/dist/utils/index.d.ts +3 -2
  65. package/dist/utils/index.d.ts.map +1 -1
  66. package/dist/utils/index.js +3 -2
  67. package/dist/utils/index.js.map +1 -1
  68. package/dist/utils/internal/error-handler/errorHandler.d.ts +33 -0
  69. package/dist/utils/internal/error-handler/errorHandler.d.ts.map +1 -1
  70. package/dist/utils/internal/error-handler/errorHandler.js +45 -3
  71. package/dist/utils/internal/error-handler/errorHandler.js.map +1 -1
  72. package/dist/utils/network/httpError.d.ts +13 -2
  73. package/dist/utils/network/httpError.d.ts.map +1 -1
  74. package/dist/utils/network/httpError.js +4 -2
  75. package/dist/utils/network/httpError.js.map +1 -1
  76. package/dist/utils/network/pacer.d.ts +117 -0
  77. package/dist/utils/network/pacer.d.ts.map +1 -0
  78. package/dist/utils/network/pacer.js +304 -0
  79. package/dist/utils/network/pacer.js.map +1 -0
  80. package/dist/utils/network/retry.d.ts +119 -3
  81. package/dist/utils/network/retry.d.ts.map +1 -1
  82. package/dist/utils/network/retry.js +176 -35
  83. package/dist/utils/network/retry.js.map +1 -1
  84. package/dist/utils/security/rateLimiter.d.ts +19 -1
  85. package/dist/utils/security/rateLimiter.d.ts.map +1 -1
  86. package/dist/utils/security/rateLimiter.js +49 -1
  87. package/dist/utils/security/rateLimiter.js.map +1 -1
  88. package/dist/utils/telemetry/attributes.d.ts +19 -0
  89. package/dist/utils/telemetry/attributes.d.ts.map +1 -1
  90. package/dist/utils/telemetry/attributes.js +30 -0
  91. package/dist/utils/telemetry/attributes.js.map +1 -1
  92. package/framework-skills/add-tool/SKILL.md +43 -2
  93. package/framework-skills/api-canvas/SKILL.md +8 -4
  94. package/framework-skills/api-config/SKILL.md +4 -4
  95. package/framework-skills/api-errors/SKILL.md +19 -10
  96. package/framework-skills/api-linter/SKILL.md +48 -3
  97. package/framework-skills/api-telemetry/SKILL.md +26 -2
  98. package/framework-skills/api-utils/SKILL.md +7 -3
  99. package/framework-skills/api-utils/references/security.md +2 -2
  100. package/framework-skills/design-mcp-server/SKILL.md +17 -2
  101. package/framework-skills/field-test/SKILL.md +3 -1
  102. package/framework-skills/git-wrapup/SKILL.md +90 -68
  103. package/framework-skills/orchestrations/SKILL.md +3 -3
  104. package/framework-skills/release-and-publish/SKILL.md +10 -10
  105. package/framework-skills/release-pr-review/SKILL.md +19 -26
  106. package/framework-skills/report-issue-framework/SKILL.md +6 -35
  107. package/framework-skills/report-issue-local/SKILL.md +6 -36
  108. package/framework-skills/tool-defs-analysis/SKILL.md +4 -4
  109. package/package.json +7 -7
  110. package/templates/.github/ISSUE_TEMPLATE/bug_report.yml +2 -2
  111. package/templates/.github/ISSUE_TEMPLATE/feature_request.yml +2 -2
  112. package/templates/.github/workflows/codeql.yml +39 -0
  113. package/templates/AGENTS.md +3 -1
  114. package/templates/CLAUDE.md +3 -1
  115. package/templates/changelog/template.md +7 -7
  116. package/templates/package.json +2 -2
  117. package/templates/src/index.ts +4 -3
@@ -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.11"
7
+ version: "1.12"
8
8
  audience: external
9
9
  type: workflow
10
10
  ---
@@ -42,18 +42,16 @@ gh api 'repos/cyanheads/mcp-ts-core/issues/<number>/timeline' --paginate \
42
42
 
43
43
  ## Writing Well-Structured Issues
44
44
 
45
- 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).
45
+ Good issues are terse and fact-dense. **Budget: a bug reads in ~150 words, a feature in ~250, code and logs excluded.** Every section past the form's required fields must earn its place — a section you could delete without changing the fix is noise. One or two sentences per bullet; if a bullet runs long, split it or cut it.
46
46
 
47
+ - **Cut what dilutes the signal.** Mechanism walkthroughs (link the PR or doc instead), ceremonial framings ("This issue covers…"), conversation references ("as discussed", "per offline"), restated context the reader already has, and kitchen-sink Additional context blocks. If a paragraph isn't pulling weight, drop it.
47
48
  - **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.
48
49
  - **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.
49
50
  - **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.
50
51
  - **Add a `Related: #N` line** near the top when the issue grows from prior context (discussions, other issues, PRs). Makes provenance clickable.
51
52
  - **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.
52
- - **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.
53
53
  - **Prefer Markdown tables for comparisons.** When showing options, tiers, strategies, or tradeoffs — tables are the highest-density format for scanning N rows × M attributes.
54
- - **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.
55
54
  - **Use `Depends on: owner/repo#N`** to declare ordering explicitly when implementation is blocked on another issue landing first.
56
- - **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
55
  - **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
56
 
59
57
  ## Redact Before Posting
@@ -72,7 +70,7 @@ gh issue create -R cyanheads/mcp-ts-core --template "Bug Report" --web
72
70
 
73
71
  ### CLI (non-interactive)
74
72
 
75
- Structure the `--body` to match the template's form fields:
73
+ Structure the `--body` to match the template's form fields. Description is two or three sentences; the reproduction is the minimal code and the observed output, nothing else. Add `### Additional context` only when it changes the fix (a workaround, a related issue, the one log line that matters) — omitted by default.
76
74
 
77
75
  ````bash
78
76
  gh issue create -R cyanheads/mcp-ts-core \
@@ -131,10 +129,6 @@ Error: Output validation failed: ...
131
129
  ### Expected behavior
132
130
 
133
131
  Omitting an optional output field should pass validation.
134
-
135
- ### Additional context
136
-
137
- Any workarounds, related issues, or observations.
138
132
  ISSUE
139
133
  )"
140
134
  ````
@@ -214,7 +208,7 @@ gh issue create -R cyanheads/mcp-ts-core --template "Feature Request" --web
214
208
 
215
209
  ### CLI (non-interactive)
216
210
 
217
- The first three headings are the Feature Request form's own fields, in its order — `Use case` and `Proposed API` are required by the form, so a body without them does not satisfy it. Everything after `Alternatives considered` is supplemental; omit what you don't need — simple requests don't require Flow / Design / Dependencies blocks.
211
+ The first three headings are the Feature Request form's own fields, in its order — `Use case` and `Proposed API` are required by the form, so a body without them does not satisfy it. `Out of scope` is one or two lines. Nothing else by default: a `Scope`, `Flow`, `Design / Tradeoffs`, or `Depends on` block is added only when the reader cannot act without it, and each stays to a few lines.
218
212
 
219
213
  ````bash
220
214
  gh issue create -R cyanheads/mcp-ts-core \
@@ -245,33 +239,9 @@ const result = await withRetry(() => fetchExternal(url), {
245
239
 
246
240
  What you tried or evaluated instead, and why it didn't fit.
247
241
 
248
- ### Scope
249
-
250
- - Files or modules touched
251
- - New exports, env vars, or config keys
252
- - Tier (Tier 1 core / Tier 2 standard / Tier 3 optional peer dep)
253
-
254
242
  ### Out of scope
255
243
 
256
- - What we're deliberately not doing
257
244
  - Adjacent work that belongs in a separate issue
258
-
259
- ### Flow (optional)
260
-
261
- Ordered steps — e.g. `trigger → resolve → fetch → degrade`. Useful when the change spans multiple phases or fallbacks.
262
-
263
- ### Design / Tradeoffs (optional)
264
-
265
- Philosophy: **one-line principle in bold.**
266
-
267
- | Option | Strengths | Weaknesses |
268
- |:---|:---|:---|
269
- | A | ... | ... |
270
- | B | ... | ... |
271
-
272
- ### Dependencies (optional)
273
-
274
- - Depends on: owner/repo#N
275
245
  ISSUE
276
246
  )"
277
247
  ````
@@ -299,3 +269,4 @@ gh issue list -R cyanheads/mcp-ts-core --author @me
299
269
  - [ ] Primary label assigned (`bug` / `enhancement` / `documentation`)
300
270
  - [ ] If bug: version, runtime, repro code, actual vs expected behavior included
301
271
  - [ ] If feature: `Use case` and `Proposed API` present (the form's required fields), `Alternatives considered` third; Out of scope defined
272
+ - [ ] Inside the budget — ~150 words for a bug, ~250 for a feature, code and logs excluded — and every section past the form's fields earns its place
@@ -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.9"
7
+ version: "1.10"
8
8
  audience: external
9
9
  type: workflow
10
10
  ---
@@ -49,18 +49,16 @@ gh api 'repos/{owner}/{repo}/issues/<number>/timeline' --paginate \
49
49
 
50
50
  ## Writing Well-Structured Issues
51
51
 
52
- 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).
52
+ Good issues are terse and fact-dense. **Budget: a bug reads in ~150 words, a feature in ~250, code and logs excluded.** Every section past the form's required fields must earn its place — a section you could delete without changing the fix is noise. One or two sentences per bullet; if a bullet runs long, split it or cut it.
53
53
 
54
+ - **Cut what dilutes the signal.** Mechanism walkthroughs (link the PR or doc instead), ceremonial framings ("This issue covers…"), conversation references ("as discussed", "per offline"), restated context the reader already has, and kitchen-sink Additional context blocks. If a paragraph isn't pulling weight, drop it.
54
55
  - **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.
55
56
  - **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.
56
57
  - **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.
57
58
  - **Add a `Related: #N` line** near the top when the issue grows from prior context (discussions, other issues, PRs). Makes provenance clickable.
58
59
  - **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.
59
- - **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.
60
60
  - **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.
61
- - **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.
62
61
  - **Use `Depends on: owner/repo#N`** to declare ordering explicitly when implementation is blocked on an upstream framework change or another issue landing first.
63
- - **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.
64
62
  - **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.
65
63
 
66
64
  ## Redact Before Posting
@@ -79,7 +77,7 @@ gh issue create --template "Bug Report" --web
79
77
 
80
78
  ### CLI (non-interactive)
81
79
 
82
- Structure the `--body` to match the template's form fields:
80
+ Structure the `--body` to match the template's form fields. Description is two or three sentences; the reproduction is the exact input and the observed output, nothing else. Add `### Additional context` only when it changes the fix (a workaround, a related issue, the one log line that matters) — omitted by default.
83
81
 
84
82
  ````bash
85
83
  gh issue create \
@@ -125,10 +123,6 @@ Error or incorrect output here
125
123
  ### Expected behavior
126
124
 
127
125
  What should have happened.
128
-
129
- ### Additional context
130
-
131
- Relevant `ctx.log` output, stack traces, or telemetry spans.
132
126
  ISSUE
133
127
  )"
134
128
  ````
@@ -213,7 +207,7 @@ gh issue create --template "Feature Request" --web
213
207
 
214
208
  ### CLI (non-interactive)
215
209
 
216
- The first three headings are the Feature Request form's own fields, in its order — `Use case` and `Proposed behavior` are required by the form, so a body without them does not satisfy it. Everything after `Alternatives considered` is supplemental; omit what you don't need — simple requests don't require Flow / Design / Dependencies blocks.
210
+ The first three headings are the Feature Request form's own fields, in its order — `Use case` and `Proposed behavior` are required by the form, so a body without them does not satisfy it. `Out of scope` is one or two lines. Nothing else by default: a `Scope`, `Flow`, `Design / Tradeoffs`, or `Depends on` block is added only when the reader cannot act without it, and each stays to a few lines.
217
211
 
218
212
  ````bash
219
213
  gh issue create \
@@ -239,34 +233,9 @@ What you want the server to do, then the new behavior or surface. For tool/resou
239
233
 
240
234
  What you tried or evaluated instead, and why it didn't fit.
241
235
 
242
- ### Scope
243
-
244
- - Files or modules touched
245
- - New env vars, config keys, or service integrations
246
- - New or modified tools / resources / prompts
247
-
248
236
  ### Out of scope
249
237
 
250
- - What we're deliberately not doing
251
238
  - Adjacent work that belongs in a separate issue
252
-
253
- ### Flow (optional)
254
-
255
- Ordered steps — e.g. `request → lookup → fallback → respond`. Useful when the change spans multiple phases or fallbacks.
256
-
257
- ### Design / Tradeoffs (optional)
258
-
259
- Philosophy: **one-line principle in bold.**
260
-
261
- | Option | Strengths | Weaknesses |
262
- |:---|:---|:---|
263
- | A | ... | ... |
264
- | B | ... | ... |
265
-
266
- ### Dependencies (optional)
267
-
268
- - Depends on: cyanheads/mcp-ts-core#N (upstream framework change)
269
- - Depends on: owner/repo#N (other server work)
270
239
  ISSUE
271
240
  )"
272
241
  ````
@@ -311,3 +280,4 @@ gh issue close <number> --reason completed --comment "Fixed in <commit or PR>"
311
280
  - [ ] Primary label assigned (`bug` / `enhancement` / `documentation`)
312
281
  - [ ] If bug: version, runtime, repro steps, actual vs expected behavior included
313
282
  - [ ] If feature: `Use case` and `Proposed behavior` present (the form's required fields), `Alternatives considered` third; Out of scope defined
283
+ - [ ] Inside the budget — ~150 words for a bug, ~250 for a feature, code and logs excluded — and every section past the form's fields earns its place
@@ -4,7 +4,7 @@ description: >
4
4
  Read-only audit of MCP definition language across an existing surface — tools, resources, prompts, server instructions. Walks every definition file and checks 16 categories the LLM reads to decide whether and how to call: voice & tense, internal leaks, audience leaks, defaults, recovery hints, field descriptions, cross-references, sparsity, examples, structure, mutator observability, unit-bearing numeric names, validator-enforced constraints, annotations truthfulness, single-line strings, exclusive modes in the schema — then a cross-surface pass: naming taxonomy, parameter vocabulary, tool overlap, instructions drift, length outliers. 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.5"
7
+ version: "1.6"
8
8
  audience: external
9
9
  type: audit
10
10
  ---
@@ -153,9 +153,9 @@ Field-test catches this in its leak audit; this skill is the more thorough pass.
153
153
 
154
154
  **Look in:** tool / resource / prompt `description`.
155
155
 
156
- **Check:** single cohesive paragraph. No bullet lists, no blank-line-separated sections, no markdown headers inside the description.
156
+ **Check:** single cohesive paragraph, written as one string literal in source. No bullet lists, no blank-line-separated sections, no markdown headers inside the description; no `+`-joined fragments in the file — a description assembled one sentence per line reads as a list of disconnected claims and grows a line at a time until it is several times its siblings' length.
157
157
 
158
- **Smell:** blank lines (`\n\n`) inside a description string, `- bullet` lines, `## Header` lines, "Operations:\n- foo: …" duplicating an enum's `.describe()` text.
158
+ **Smell:** blank lines (`\n\n`) inside a description string, `- bullet` lines, `## Header` lines, "Operations:\n- foo: …" duplicating an enum's `.describe()` text, `'…' +` continuation lines under `description:`.
159
159
 
160
160
  #### 11. Mutator observability
161
161
 
@@ -218,7 +218,7 @@ The per-file walk misses drift that only shows between files. After it, sweep th
218
218
  - **Naming taxonomy** — verb prefixes mean one thing each across the surface (`search_` / `find_` / `get_` / `list_` / `lookup_`); the same verb carrying different semantics on different tools is a finding.
219
219
  - **Parameter vocabulary** — one name per concept everywhere: `query` vs `q`, `limit` vs `maxResults`, `nctId` vs `nct_id` on sibling tools is a finding.
220
220
  - **Tool overlap** — for any pair with adjacent scope, the two descriptions alone must answer "when X vs Y." If an agent can't pick, that's material.
221
- - **Instructions drift** — if the server sets `instructions`: every tool it names exists, workflow guidance reflects the current surface (new tools that belong in it, renamed or removed ones purged), and nothing contradicts a per-tool description.
221
+ - **Instructions drift** — if the server sets `instructions`: every tool it names exists, workflow guidance reflects the current surface (new tools that belong in it, renamed or removed ones purged), and nothing contradicts a per-tool description. Shape is a finding too: two to three cohesive sentences in one string literal (no `+`-joined fragments, no one-line-per-tool inventory — the catalog already carries that), written for the calling agent only. Operator configuration (`*_BASE_URL`, API keys, ports) belongs in the README and `.env.example`, not here — the agent cannot act on it.
222
222
  - **Length outliers** — a description several times longer than its siblings (attention drag), or a one-liner that underspecifies (selection risk).
223
223
 
224
224
  Cross-surface findings use the same finding format, cited at the file:line you'd change (the `instructions` string is a citable location).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyanheads/mcp-ts-core",
3
- "version": "0.13.2",
3
+ "version": "0.13.4",
4
4
  "mcpName": "io.github.cyanheads/mcp-ts-core",
5
5
  "description": "Agent-native TypeScript framework for MCP servers. Includes runtime infrastructure and agent skills for building, testing, and shipping servers.",
6
6
  "files": [
@@ -200,7 +200,7 @@
200
200
  "@biomejs/biome": "2.5.13",
201
201
  "@cloudflare/vitest-pool-workers": "^0.22.0",
202
202
  "@cloudflare/workers-types": "5.20260910.1",
203
- "@duckdb/node-api": "^1.5.5-r.4",
203
+ "@duckdb/node-api": "^1.5.5-r.5",
204
204
  "@hono/otel": "^1.1.2",
205
205
  "@opentelemetry/exporter-metrics-otlp-http": "^0.222.0",
206
206
  "@opentelemetry/exporter-trace-otlp-http": "^0.222.0",
@@ -228,10 +228,10 @@
228
228
  "depcheck": "^1.4.7",
229
229
  "diff": "^9.0.0",
230
230
  "execa": "^10.0.1",
231
- "fast-check": "^4.9.0",
231
+ "fast-check": "^4.10.0",
232
232
  "fast-xml-parser": "^5.11.1",
233
233
  "ignore": "^7.0.9",
234
- "js-yaml": "^5.4.1",
234
+ "js-yaml": "^5.4.2",
235
235
  "linkedom": "^0.18.13",
236
236
  "node-cron": "^4.6.0",
237
237
  "openai": "^7.15.0",
@@ -241,7 +241,7 @@
241
241
  "pino-pretty": "^13.1.3",
242
242
  "repomix": "^1.18.0",
243
243
  "sanitize-html": "^2.17.7",
244
- "tsc-alias": "^1.9.4",
244
+ "tsc-alias": "^1.9.5",
245
245
  "typedoc": "^0.28.20",
246
246
  "typescript": "^7.0.2",
247
247
  "typescript-v6": "npm:typescript@^6.0.3",
@@ -306,10 +306,10 @@
306
306
  "@modelcontextprotocol/server": "^2.0.0",
307
307
  "@opentelemetry/api": "^1.9.1",
308
308
  "dotenv": "^17.4.2",
309
- "hono": "^4.13.7",
309
+ "hono": "^4.13.8",
310
310
  "jose": "^6.2.12",
311
311
  "pino": "^10.3.1",
312
- "zod": "^4.6.2"
312
+ "zod": "^4.6.5"
313
313
  },
314
314
  "peerDependencies": {
315
315
  "@duckdb/node-api": "^1.5.5-r.1",
@@ -76,7 +76,7 @@ body:
76
76
  id: description
77
77
  attributes:
78
78
  label: Description
79
- description: What happened and what you expected instead.
79
+ description: What happened and what you expected instead — two or three sentences.
80
80
  validations:
81
81
  required: true
82
82
 
@@ -112,6 +112,6 @@ body:
112
112
  id: context
113
113
  attributes:
114
114
  label: Additional context
115
- description: Workarounds, related issues, logs, or anything else relevant.
115
+ description: Only what changes the fix — a workaround, a related issue, the one log line that matters.
116
116
  validations:
117
117
  required: false
@@ -17,7 +17,7 @@ body:
17
17
  id: use-case
18
18
  attributes:
19
19
  label: Use case
20
- description: What problem does this solve? Who benefits?
20
+ description: What problem does this solve? Who benefits? Two or three sentences.
21
21
  validations:
22
22
  required: true
23
23
 
@@ -42,6 +42,6 @@ body:
42
42
  id: context
43
43
  attributes:
44
44
  label: Additional context
45
- description: Related issues, prior art, links, or anything else relevant.
45
+ description: Only what the reader needs to act — related issues, prior art, a link.
46
46
  validations:
47
47
  required: false
@@ -0,0 +1,39 @@
1
+ # CodeQL static analysis — the one workflow every server carries.
2
+ # Verification (typecheck, lint, tests) is local; this file exists because CodeQL
3
+ # is GitHub-owned end to end and a workflow file is visible in the repo where a
4
+ # repo-level "default setup" is not. Default setup must be OFF for this to run.
5
+ name: CodeQL
6
+
7
+ on:
8
+ push:
9
+ branches: [main]
10
+ pull_request:
11
+ branches: [main]
12
+ schedule:
13
+ - cron: '30 6 * * 1'
14
+
15
+ permissions:
16
+ contents: read
17
+
18
+ jobs:
19
+ analyze:
20
+ name: Analyze
21
+ runs-on: ubuntu-latest
22
+ timeout-minutes: 15
23
+ permissions:
24
+ security-events: write
25
+ contents: read
26
+ actions: read
27
+
28
+ steps:
29
+ - name: Checkout repository
30
+ uses: actions/checkout@v7
31
+
32
+ - name: Initialize CodeQL
33
+ uses: github/codeql-action/init@v4
34
+ with:
35
+ languages: javascript-typescript, actions
36
+ build-mode: none
37
+
38
+ - name: Perform CodeQL Analysis
39
+ uses: github/codeql-action/analyze@v4
@@ -311,7 +311,7 @@ Available skills:
311
311
  | `code-simplifier` | Post-session cleanup against `git diff` — modernize syntax, consolidate duplication, align with the codebase |
312
312
  | `polish-docs-meta` | Finalize docs, README, metadata, and agent protocol for shipping |
313
313
  | `git-wrapup` | Land working-tree changes as a commit stack — version bump, changelog, verify, commit by concern, release commit on top. No tag, no push to main; opens the release PR when the project declares release PR mode |
314
- | `release-pr-review` | Review pass on an open release PR — simplifier + correctness review, fixup commits autosquashed into the stack, PR body kept in sync. Release PR mode only |
314
+ | `release-pr-review` | Review pass on an open release PR — simplifier + correctness review, fixes as ordinary commits on top of the stack, PR body kept in sync. Release PR mode only |
315
315
  | `release-and-publish` | Fast-forward merge (release PR mode) + tag + push + npm + MCP Registry + GH Release + Docker. Picks up from `git-wrapup` |
316
316
  | `maintenance` | Investigate changelogs, adopt upstream changes, sync skills to agent dirs |
317
317
  | `orchestrations` | Chain task skills into a gated multi-phase pipeline — build-out, QA-fix, update-ship — when you can spawn sub-agents |
@@ -362,6 +362,8 @@ When you complete a skill's checklist, check the boxes and add a completion time
362
362
  | `bun run changelog:check` | Verify `CHANGELOG.md` is in sync (used by devcheck) |
363
363
  | `bun run bundle` | Build, pack, and clean a `.mcpb` for one-click Claude Desktop install |
364
364
 
365
+ **CI is one file.** `.github/workflows/codeql.yml` (scaffolded) is the only GitHub Actions workflow: CodeQL is GitHub-owned end to end, and the file runs only while the repo's CodeQL *default setup* is turned off. Verification — `devcheck`, tests, the release gates — runs locally; don't add a workflow that re-runs it.
366
+
365
367
  ---
366
368
 
367
369
  ## Bundling
@@ -311,7 +311,7 @@ Available skills:
311
311
  | `code-simplifier` | Post-session cleanup against `git diff` — modernize syntax, consolidate duplication, align with the codebase |
312
312
  | `polish-docs-meta` | Finalize docs, README, metadata, and agent protocol for shipping |
313
313
  | `git-wrapup` | Land working-tree changes as a commit stack — version bump, changelog, verify, commit by concern, release commit on top. No tag, no push to main; opens the release PR when the project declares release PR mode |
314
- | `release-pr-review` | Review pass on an open release PR — simplifier + correctness review, fixup commits autosquashed into the stack, PR body kept in sync. Release PR mode only |
314
+ | `release-pr-review` | Review pass on an open release PR — simplifier + correctness review, fixes as ordinary commits on top of the stack, PR body kept in sync. Release PR mode only |
315
315
  | `release-and-publish` | Fast-forward merge (release PR mode) + tag + push + npm + MCP Registry + GH Release + Docker. Picks up from `git-wrapup` |
316
316
  | `maintenance` | Investigate changelogs, adopt upstream changes, sync skills to agent dirs |
317
317
  | `orchestrations` | Chain task skills into a gated multi-phase pipeline — build-out, QA-fix, update-ship — when you can spawn sub-agents |
@@ -362,6 +362,8 @@ When you complete a skill's checklist, check the boxes and add a completion time
362
362
  | `bun run changelog:check` | Verify `CHANGELOG.md` is in sync (used by devcheck) |
363
363
  | `bun run bundle` | Build, pack, and clean a `.mcpb` for one-click Claude Desktop install |
364
364
 
365
+ **CI is one file.** `.github/workflows/codeql.yml` (scaffolded) is the only GitHub Actions workflow: CodeQL is GitHub-owned end to end, and the file runs only while the repo's CodeQL *default setup* is turned off. Verification — `devcheck`, tests, the release gates — runs locally; don't add a workflow that re-runs it.
366
+
365
367
  ---
366
368
 
367
369
  ## Bundling
@@ -6,8 +6,8 @@
6
6
 
7
7
  # Required. One-line GitHub Release-style headline. 350 character cap — a
8
8
  # ceiling, not a target. Default short and scannable. Don't pad, don't stitch
9
- # unrelated changes with commas/semicolons into an inventory — pick the
10
- # headline, like a tag's theme line. Quotes required: unquoted YAML treats
9
+ # unrelated changes with commas/semicolons into an inventory — pick the one
10
+ # headline the release is about. Quotes required: unquoted YAML treats
11
11
  # `: ` inside the value as a key separator and fails GitHub's strict parser.
12
12
  summary: ""
13
13
 
@@ -119,11 +119,11 @@ security: false
119
119
  TAG ANNOTATIONS — the annotated tag body renders as the GitHub Release body
120
120
  via `gh release create --notes-from-tag`. It is a condensed digest of this
121
121
  entry, never a copy, and its format is owned by the `release-and-publish`
122
- skill (step 4, "Create the annotated tag"): the entry's `summary:` as the
123
- theme line without the version, flat headline bullets — no Keep-a-Changelog
124
- section headers, no gates line — at most one deps line, issue backlinks,
125
- and the changelog link last. In release-PR mode the `git-wrapup` skill
126
- authors that digest as the PR body's `## Changes` and the tag copies it.
122
+ skill (step 4, "Create the annotated tag"): a short subject line without the
123
+ version, flat headline bullets — no Keep-a-Changelog section headers, no
124
+ gates line — at most one deps line, issue backlinks, and the changelog link
125
+ last. In release-PR mode the `git-wrapup` skill authors those bullets as the
126
+ PR body's `## Changes` and the tag copies them.
127
127
  -->
128
128
 
129
129
  ## Added
@@ -72,8 +72,8 @@
72
72
  "@vitest/coverage-istanbul": "4.1.11",
73
73
  "depcheck": "^1.4.7",
74
74
  "fast-check": "^4.9.0",
75
- "ignore": "^7.0.7",
76
- "tsc-alias": "^1.9.2",
75
+ "ignore": "^7.0.9",
76
+ "tsc-alias": "^1.9.5",
77
77
  "typescript": "^7.0.2",
78
78
  "vitest": "^4.1.11"
79
79
  }
@@ -17,9 +17,10 @@ await createApp({
17
17
  tools: [echoTool, echoAppTool],
18
18
  resources: [echoResource, echoAppUiResource],
19
19
  prompts: [echoPrompt],
20
- // instructions: 'Server-level orientation forwarded to the model on every initialize.\n' +
21
- // '- Use shortcut `X` for the most common case\n' +
22
- // '- Tools require auth via the `inventory:read` scope',
20
+ // Server-level orientation forwarded to the model on every initialize: two to three
21
+ // cohesive sentences in one string literal, written for the calling agent (which tool
22
+ // opens a workflow, what chains into what). Operator configuration stays in the README.
23
+ // instructions: 'Resolve a name to an id with example_search, then pass that id to example_get for the full record. Results are paged; follow nextOffset until it is absent.',
23
24
 
24
25
  // Session posture in code rather than in a Dockerfile. MCP_SESSION_MODE still
25
26
  // wins when it is set. Add `require: 'stateful'` — `{ default: 'stateful',