@cyanheads/mcp-ts-core 0.12.9 → 0.13.1
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/AGENTS.md +22 -11
- package/CLAUDE.md +22 -11
- package/README.md +1 -1
- package/biome.json +1 -1
- package/changelog/0.13.x/0.13.0.md +48 -0
- package/changelog/0.13.x/0.13.1.md +56 -0
- package/changelog/template.md +7 -24
- package/{tsconfig.base.json → config/tsconfig.base.json} +2 -2
- package/dist/cli/init.js +2 -2
- package/dist/cli/init.js.map +1 -1
- package/dist/config/envValue.d.ts +18 -0
- package/dist/config/envValue.d.ts.map +1 -0
- package/dist/config/envValue.js +35 -0
- package/dist/config/envValue.js.map +1 -0
- package/dist/config/index.d.ts +8 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +13 -7
- package/dist/config/index.js.map +1 -1
- package/dist/config/parseEnvConfig.d.ts +7 -0
- package/dist/config/parseEnvConfig.d.ts.map +1 -1
- package/dist/config/parseEnvConfig.js +9 -1
- package/dist/config/parseEnvConfig.js.map +1 -1
- package/dist/core/app.d.ts +82 -2
- package/dist/core/app.d.ts.map +1 -1
- package/dist/core/app.js +129 -6
- package/dist/core/app.js.map +1 -1
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js.map +1 -1
- package/dist/core/worker.d.ts +6 -1
- package/dist/core/worker.d.ts.map +1 -1
- package/dist/core/worker.js.map +1 -1
- package/dist/linter/rules/resource-rules.js +9 -2
- package/dist/linter/rules/resource-rules.js.map +1 -1
- package/dist/linter/rules/tool-rules.js +4 -1
- package/dist/linter/rules/tool-rules.js.map +1 -1
- package/dist/linter/validate.js +2 -2
- package/dist/linter/validate.js.map +1 -1
- package/dist/mcp-server/types.d.ts +10 -3
- package/dist/mcp-server/types.d.ts.map +1 -1
- package/dist/mcp-server/types.js +4 -3
- package/dist/mcp-server/types.js.map +1 -1
- package/dist/services/canvas/core/sqlGate.d.ts.map +1 -1
- package/dist/services/canvas/core/sqlGate.js +27 -2
- package/dist/services/canvas/core/sqlGate.js.map +1 -1
- package/dist/utils/pagination/pagination.d.ts.map +1 -1
- package/dist/utils/pagination/pagination.js +4 -1
- package/dist/utils/pagination/pagination.js.map +1 -1
- package/dist/utils/parsing/frontmatterParser.d.ts +8 -7
- package/dist/utils/parsing/frontmatterParser.d.ts.map +1 -1
- package/dist/utils/parsing/frontmatterParser.js +91 -16
- package/dist/utils/parsing/frontmatterParser.js.map +1 -1
- package/framework-skills/README.md +40 -0
- package/{skills → framework-skills}/add-app-tool/SKILL.md +2 -2
- package/{skills → framework-skills}/add-resource/SKILL.md +2 -2
- package/{skills → framework-skills}/add-service/SKILL.md +2 -2
- package/{skills → framework-skills}/add-test/SKILL.md +2 -2
- package/{skills → framework-skills}/add-tool/SKILL.md +5 -5
- package/{skills → framework-skills}/api-config/SKILL.md +21 -3
- package/{skills → framework-skills}/api-context/SKILL.md +5 -3
- package/{skills → framework-skills}/api-linter/SKILL.md +4 -4
- package/{skills → framework-skills}/api-telemetry/SKILL.md +13 -10
- package/{skills → framework-skills}/code-simplifier/SKILL.md +12 -6
- package/{skills → framework-skills}/design-mcp-server/SKILL.md +2 -2
- package/{skills → framework-skills}/maintenance/SKILL.md +30 -21
- package/{skills → framework-skills}/orchestrations/SKILL.md +2 -2
- package/{skills → framework-skills}/orchestrations/workflows/field-test-fix.md +8 -8
- package/{skills → framework-skills}/orchestrations/workflows/fix-wrapup-release.md +5 -5
- package/{skills → framework-skills}/orchestrations/workflows/greenfield-build.md +11 -11
- package/{skills → framework-skills}/orchestrations/workflows/maintenance-release.md +12 -12
- package/{skills → framework-skills}/polish-docs-meta/SKILL.md +18 -10
- package/{skills → framework-skills}/polish-docs-meta/references/agent-protocol.md +1 -1
- package/{skills → framework-skills}/polish-docs-meta/references/readme.md +93 -73
- package/{skills → framework-skills}/release-and-publish/SKILL.md +12 -3
- package/{skills → framework-skills}/release-pr-review/SKILL.md +2 -2
- package/{skills → framework-skills}/report-issue-framework/SKILL.md +26 -25
- package/{skills → framework-skills}/report-issue-local/SKILL.md +28 -24
- package/{skills → framework-skills}/setup/SKILL.md +10 -8
- package/package.json +13 -13
- package/scripts/build.ts +2 -2
- package/scripts/check-framework-antipatterns.ts +1 -1
- package/scripts/check-skill-versions.ts +16 -9
- package/scripts/check-skills-sync.ts +64 -13
- package/scripts/clean-mcpb.ts +3 -3
- package/scripts/devcheck.ts +18 -15
- package/scripts/lint-packaging.ts +158 -24
- package/scripts/list-skills.ts +2 -2
- package/templates/.claude-plugin/plugin.json +5 -1
- package/templates/.env.example +5 -2
- package/templates/.github/CONTRIBUTING.md +4 -5
- package/templates/.github/ISSUE_TEMPLATE/bug_report.yml +5 -4
- package/templates/.github/ISSUE_TEMPLATE/config.yml +6 -1
- package/templates/.github/ISSUE_TEMPLATE/feature_request.yml +1 -2
- package/templates/AGENTS.md +31 -14
- package/templates/CLAUDE.md +31 -14
- package/templates/_.mcpbignore +1 -1
- package/templates/changelog/template.md +7 -24
- package/templates/package.json +3 -2
- package/templates/src/index.ts +10 -0
- package/templates/src/mcp-server/resources/definitions/echo-app-ui.app-resource.ts +1 -1
- package/skills/README.md +0 -38
- /package/{skills → framework-skills}/add-export/SKILL.md +0 -0
- /package/{skills → framework-skills}/add-prompt/SKILL.md +0 -0
- /package/{skills → framework-skills}/add-provider/SKILL.md +0 -0
- /package/{skills → framework-skills}/api-auth/SKILL.md +0 -0
- /package/{skills → framework-skills}/api-canvas/SKILL.md +0 -0
- /package/{skills → framework-skills}/api-errors/SKILL.md +0 -0
- /package/{skills → framework-skills}/api-mirror/SKILL.md +0 -0
- /package/{skills → framework-skills}/api-services/SKILL.md +0 -0
- /package/{skills → framework-skills}/api-services/references/graph.md +0 -0
- /package/{skills → framework-skills}/api-services/references/llm.md +0 -0
- /package/{skills → framework-skills}/api-services/references/speech.md +0 -0
- /package/{skills → framework-skills}/api-testing/SKILL.md +0 -0
- /package/{skills → framework-skills}/api-utils/SKILL.md +0 -0
- /package/{skills → framework-skills}/api-utils/references/formatting.md +0 -0
- /package/{skills → framework-skills}/api-utils/references/parsing.md +0 -0
- /package/{skills → framework-skills}/api-utils/references/security.md +0 -0
- /package/{skills → framework-skills}/api-workers/SKILL.md +0 -0
- /package/{skills → framework-skills}/field-test/SKILL.md +0 -0
- /package/{skills → framework-skills}/git-wrapup/SKILL.md +0 -0
- /package/{skills → framework-skills}/polish-docs-meta/references/package-meta.md +0 -0
- /package/{skills → framework-skills}/polish-docs-meta/references/server-json.md +0 -0
- /package/{skills → framework-skills}/security-pass/SKILL.md +0 -0
- /package/{skills → framework-skills}/techniques/SKILL.md +0 -0
- /package/{skills → framework-skills}/techniques/references/outline-on-overflow.md +0 -0
- /package/{skills → framework-skills}/tool-defs-analysis/SKILL.md +0 -0
|
@@ -2,6 +2,20 @@
|
|
|
2
2
|
|
|
3
3
|
Structure and content guide for creating or updating a README for an MCP server built on `@cyanheads/mcp-ts-core`. If a README already exists, use this as a reference to audit and improve it — don't blindly rewrite sections that are already accurate.
|
|
4
4
|
|
|
5
|
+
The reference implementation is the `pubmed-mcp-server` README — https://github.com/cyanheads/pubmed-mcp-server/blob/main/README.md. Read it in full before writing, mirror its structure, reuse its non-server-specific content, and treat it as authoritative wherever this file lags behind it.
|
|
6
|
+
|
|
7
|
+
## Concision
|
|
8
|
+
|
|
9
|
+
A README is read once by a human deciding whether and how to use the server. It is not the changelog, not the schema, and not a proof that a feature works. Apply these on every pass, including re-runs over a README that is already accurate — accuracy is the floor, not the finish.
|
|
10
|
+
|
|
11
|
+
**Keep, always:** canonical identifiers (tool, resource, prompt, field, env var, and enum names, exactly as the code spells them); per-call caps and limits; input alternatives and which are required; the fields a caller branches on (discriminators, typed reasons, status values); feature flags and the env var that controls each; anything a caller must know before the first call. Brevity never earns semantic loss — if cutting a clause drops a fact from this list, the clause stays.
|
|
12
|
+
|
|
13
|
+
**Cut:** narration of how a guarantee is implemented ("so a value stays under the header it belongs to"); restated `.describe()` semantics — the schema carries them at call time; edge-case walkthroughs; the distinction between two similar values when the names already carry it; release-note accretion (a bullet that exists because a version added it, not because a reader needs it); marketing adjectives; a heading's intro sentence that repeats its Overview row.
|
|
14
|
+
|
|
15
|
+
**The test, per bullet:** would a reader lose a fact they need before their first call? If not, cut or merge. If a bullet needs more than two sentences, it is describing mechanism — keep the contract, drop the mechanism.
|
|
16
|
+
|
|
17
|
+
**Validate what stays.** Condensing is where wrong facts creep in — a merged bullet can silently combine two tools' limits or promote a default to a rule. Every identifier, cap, enum value, and default that survives the pass is checked against the definition file before the run ends. Never condense from memory of what the tool does; condense from the schema.
|
|
18
|
+
|
|
5
19
|
## Structure
|
|
6
20
|
|
|
7
21
|
Use this section order. Omit sections that don't apply (e.g., skip Docker/Workers if the server doesn't deploy there).
|
|
@@ -13,14 +27,15 @@ Install badges ← one centered row — Claude Desktop,
|
|
|
13
27
|
Framework badge ← solo spotlight row — `Built on @cyanheads/mcp-ts-core` (cyan-300 #67E8F9)
|
|
14
28
|
[Public hosted callout if present] ← centered HTML block, directly under the Framework badge
|
|
15
29
|
---
|
|
16
|
-
##
|
|
17
|
-
##
|
|
18
|
-
## Features ← framework
|
|
30
|
+
## Overview ← short description paragraph → `### Tools` / `### Resources` / `### Prompts` two-column tables
|
|
31
|
+
## Capability reference ← one `###` entry per primitive, heading tagged `<sub>tool|resource|prompt</sub>`, contract-shaped bullets
|
|
32
|
+
## Features ← one-sentence framework line + domain-specific bullets + agent-friendly output bullets
|
|
19
33
|
## Getting started ← hosted (if any), bunx/npx/docker configs, HTTP one-liner, prerequisites, install
|
|
20
34
|
## Configuration ← env var table + `.env.example` pointer
|
|
21
35
|
## Running the server ← dev, production, Workers/Docker
|
|
22
36
|
## Project structure ← directory/purpose table
|
|
23
37
|
## Development guide ← link to CLAUDE.md/AGENTS.md, key rules
|
|
38
|
+
## Contributing ← issues only
|
|
24
39
|
## License ← one line
|
|
25
40
|
```
|
|
26
41
|
|
|
@@ -108,106 +123,94 @@ If a public hosted instance is available, **promote it to a top-level callout**
|
|
|
108
123
|
|
|
109
124
|
Keep the full connection-config JSON block inside a `### Public Hosted Instance` subsection under Getting Started (covered below). This callout is just the visibility pointer.
|
|
110
125
|
|
|
111
|
-
|
|
126
|
+
No hosted instance → omit the callout, the Getting Started subsection, and any hosted mention in the Overview. Never state the absence ("no public hosted instance"); self-hosting is the default a reader already assumes.
|
|
112
127
|
|
|
113
|
-
|
|
128
|
+
### Overview
|
|
114
129
|
|
|
115
|
-
|
|
130
|
+
The first section after the header rule. Two parts: a short description paragraph, then one two-column table per primitive type. This is what a visitor reads to decide whether the server is for them, so it must scan in one screen.
|
|
116
131
|
|
|
117
|
-
|
|
118
|
-
- "Nine tools for working with PubMed and NCBI data:"
|
|
119
|
-
- "Five tools covering project lifecycle — discovery, task CRUD, and team analytics."
|
|
132
|
+
**Description paragraph:** two or three sentences — what the server sits on top of (the upstream APIs), what a user can do with it (the headline workflows, action verbs), and how it runs (transports, plus the hosted endpoint when one exists). Not a count.
|
|
120
133
|
|
|
121
|
-
|
|
134
|
+
The opening sentence names the subject, not the container. The reader is already on an MCP server's repo page — the `<h1>`, the badge row, and the framework line all say so — so an opener that restates it ("An MCP server over…", "An MCP calculator…", "An MCP server that…") spends the most-read sentence on nothing. Lead with the domain or the upstream as a noun phrase, article optional: "Calculator powered by math.js.", "Seismic data from USGS ComCat and the EMSC SeismicPortal.", "The Acme v2 API — projects, tasks, and team activity.", "Read, write, and search Obsidian vault notes over the Local REST API plugin." The words "MCP server" appear at most once in the paragraph, and never as its first noun.
|
|
122
135
|
|
|
123
|
-
**
|
|
136
|
+
**Primitive tables:** a `### Tools` table, then `### Resources` and `### Prompts` tables when the server has any. Omit a heading whose table would be empty, but keep a one-row table rather than folding it into another. Two columns, Name/Description, one-line descriptions — the detail lives in the Capability reference.
|
|
124
137
|
|
|
125
138
|
```markdown
|
|
126
|
-
##
|
|
139
|
+
## Overview
|
|
127
140
|
|
|
128
|
-
|
|
141
|
+
Project management over the Acme v2 API. Search projects, manage tasks, and track team activity from any MCP client. Runs as a stdio process, a local Streamable HTTP server, or the public hosted endpoint above.
|
|
129
142
|
|
|
130
|
-
|
|
131
|
-
|:----------|:------------|
|
|
132
|
-
| `acme_search_projects` | Search projects by name, status, or team. |
|
|
133
|
-
| `acme_create_task` | Create a new task in a project. |
|
|
134
|
-
| `acme_get_task` | Fetch one or more tasks by ID, with full or summary data. |
|
|
135
|
-
```
|
|
143
|
+
### Tools
|
|
136
144
|
|
|
137
|
-
|
|
145
|
+
| Tool | Description |
|
|
146
|
+
|:---|:---|
|
|
147
|
+
| `acme_search_projects` | Search projects by name, status, or team, with pagination and field selection |
|
|
148
|
+
| `acme_get_task` | Fetch one or more tasks by ID, with full or summary data |
|
|
138
149
|
|
|
139
|
-
|
|
150
|
+
### Resources
|
|
140
151
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
152
|
+
| Resource | Description |
|
|
153
|
+
|:---|:---|
|
|
154
|
+
| `acme://projects/{projectId}` | Project details by ID |
|
|
144
155
|
|
|
145
|
-
|
|
146
|
-
### `acme_search_projects`
|
|
156
|
+
### Prompts
|
|
147
157
|
|
|
148
|
-
|
|
158
|
+
| Prompt | Description |
|
|
159
|
+
|:---|:---|
|
|
160
|
+
| `project_summary` | Summarize a project's status and open tasks |
|
|
161
|
+
```
|
|
149
162
|
|
|
150
|
-
|
|
151
|
-
- Geographic proximity filtering by coordinates and distance
|
|
152
|
-
- Pagination (up to 100 per page) and sorting
|
|
153
|
-
- Field selection to limit response size
|
|
163
|
+
Derive every row from the actual definitions — real names and descriptions from the Zod schemas.
|
|
154
164
|
|
|
155
|
-
|
|
165
|
+
If resource data is also reachable through tools, say so in one line under the Resources table; many MCP clients are tool-only and never surface resources. If a prompt has a design doc, link it in one line under the Prompts table.
|
|
156
166
|
|
|
157
|
-
|
|
167
|
+
### Capability reference
|
|
158
168
|
|
|
159
|
-
|
|
169
|
+
One `###` entry per primitive — every tool, resource, and prompt, in the same order as the Overview tables — with the heading tagged by type in a `<sub>` so a reader scanning headings can tell them apart without a section break. Entries are separated by `---` rules. No intro sentence under the heading — the Overview row already said what it does — go straight to bullets.
|
|
160
170
|
|
|
161
|
-
|
|
171
|
+
**Bullet density is contract shape, not changelog narration.** Three to six bullets covering: accepted inputs and per-call caps; the output's discriminating fields; the failure shape (typed reasons, per-item status); the knobs (filters, budgets, feature flags). Behavior a caller discovers from the schema at call time — field-by-field semantics, edge-case handling, the mechanism behind a guarantee — belongs in the definition's `.describe()` text, not here. An entry running past six bullets has started transcribing release notes.
|
|
162
172
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
- Partial success reporting when some tasks in a batch fail
|
|
166
|
-
```
|
|
173
|
+
```markdown
|
|
174
|
+
## Capability reference
|
|
167
175
|
|
|
168
|
-
|
|
176
|
+
### `acme_search_projects` <sub>tool</sub>
|
|
169
177
|
|
|
170
|
-
|
|
178
|
+
- Free-text query plus typed `status` / `phase` filters; up to 100 per page, offset pagination
|
|
179
|
+
- Optional `fields` selection to trim the response
|
|
180
|
+
- Results carry `source` and `fetchedAt` so callers can reason about freshness
|
|
171
181
|
|
|
172
|
-
|
|
182
|
+
---
|
|
173
183
|
|
|
174
|
-
|
|
175
|
-
## Resources and prompts
|
|
184
|
+
### `acme_get_task` <sub>tool</sub>
|
|
176
185
|
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
| Resource | `acme://projects/{projectId}` | Project details by ID |
|
|
180
|
-
| Resource | `acme://tasks/{taskId}` | Task details by ID |
|
|
181
|
-
| Prompt | `project_summary` | Summarize a project's status and open tasks |
|
|
182
|
-
```
|
|
186
|
+
- Up to 5 task IDs per call; `detail: "full"` adds subtasks, comments, attachments, and history
|
|
187
|
+
- Per-item `status` rows — a partial batch returns the resolved tasks alongside typed errors for the rest
|
|
183
188
|
|
|
184
|
-
|
|
189
|
+
---
|
|
185
190
|
|
|
186
|
-
|
|
191
|
+
### `acme://projects/{projectId}` <sub>resource</sub>
|
|
187
192
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
```
|
|
193
|
+
- Project record as `application/json` — name, status, owners, open task count
|
|
194
|
+
- `projectId` comes from `acme_search_projects`
|
|
191
195
|
|
|
192
|
-
|
|
196
|
+
---
|
|
193
197
|
|
|
194
|
-
|
|
198
|
+
### `project_summary` <sub>prompt</sub>
|
|
199
|
+
|
|
200
|
+
- Arguments: `projectId` required; `includeClosed` (`"true"` / `"false"`) optional
|
|
201
|
+
- Returns two messages — an assistant framing message and a user message carrying the summary request
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
Link an examples file from an entry when one exists: `[View detailed examples](./examples/acme_search_projects.md)`.
|
|
195
205
|
|
|
196
206
|
### Features
|
|
197
207
|
|
|
198
|
-
|
|
208
|
+
The framework line below, verbatim — it names what a user gets from the framework (transports, auth, storage, observability), so it replaces any framework-feature bullets; contributor facts about code organization belong in the Development guide. Then two labeled bullet groups, both always present: `<Upstream>-specific:` (3–5 bullets on the server's own integration), then `Agent-friendly output:`.
|
|
199
209
|
|
|
200
210
|
```markdown
|
|
201
211
|
## Features
|
|
202
212
|
|
|
203
|
-
Built on [`@cyanheads/mcp-ts-core`](https://
|
|
204
|
-
|
|
205
|
-
- Declarative tool, resource, and prompt definitions — single file per primitive, framework handles registration and validation
|
|
206
|
-
- Unified error handling — handlers throw, framework catches, classifies, and formats
|
|
207
|
-
- Pluggable auth: `none`, `jwt`, `oauth`
|
|
208
|
-
- Swappable storage backends: `in-memory`, `filesystem`, `Supabase`, `Cloudflare KV/R2/D1`
|
|
209
|
-
- Structured logging with optional OpenTelemetry tracing
|
|
210
|
-
- STDIO and Streamable HTTP transports
|
|
213
|
+
Built on [`@cyanheads/mcp-ts-core`](https://github.com/cyanheads/mcp-ts-core): stdio and Streamable HTTP transports, pluggable auth (`none` / `jwt` / `oauth`), swappable storage (`in-memory`, `filesystem`, `Supabase`, `Cloudflare KV/R2/D1`), structured logging with optional OpenTelemetry tracing.
|
|
211
214
|
|
|
212
215
|
Acme-specific:
|
|
213
216
|
|
|
@@ -222,7 +225,7 @@ Agent-friendly output:
|
|
|
222
225
|
- Discriminated output contracts — typed status and source fields let callers branch on data, not string parsing
|
|
223
226
|
```
|
|
224
227
|
|
|
225
|
-
The **Agent-friendly output** subsection documents output-design choices that make the server work well as an AI-agent backend.
|
|
228
|
+
The **Agent-friendly output** subsection documents output-design choices that make the server work well as an AI-agent backend. Always include it, with 2–4 bullets in the "Pattern — concrete detail" form, each naming fields or behavior verified in the server's source — not aspirational framework capabilities. Drop a pattern the server doesn't have (no batch tools → no partial-failure bullet) rather than claiming it. Examples of what fits:
|
|
226
229
|
|
|
227
230
|
- Provenance: source labels (`viaSource`, `source`), license/access-level fields, effective-query echo, best-effort warnings on lossy tiers
|
|
228
231
|
- Partial failure: per-item status in batch operations, structured error rows alongside successes, recovery hints ("Next Step" text)
|
|
@@ -435,10 +438,10 @@ The Dockerfile defaults to HTTP transport, stateless session mode, and logs to `
|
|
|
435
438
|
|
|
436
439
|
### Cloudflare Workers
|
|
437
440
|
|
|
438
|
-
1. **
|
|
441
|
+
1. **Run locally under wrangler:**
|
|
439
442
|
|
|
440
443
|
\`\`\`sh
|
|
441
|
-
bun run
|
|
444
|
+
bun run deploy:dev
|
|
442
445
|
\`\`\`
|
|
443
446
|
|
|
444
447
|
2. **Deploy:**
|
|
@@ -448,7 +451,7 @@ bun run deploy:prod
|
|
|
448
451
|
\`\`\`
|
|
449
452
|
```
|
|
450
453
|
|
|
451
|
-
Include the Docker
|
|
454
|
+
Include the Docker subsection only if the server ships a Dockerfile, and the Workers subsection only if it ships a `src/worker.ts` entry. The Docker trailing paragraph (log directory, OTEL build arg) is important — it documents Dockerfile behavior that isn't obvious from the build command.
|
|
452
455
|
|
|
453
456
|
### Project Structure
|
|
454
457
|
|
|
@@ -483,6 +486,21 @@ See [`CLAUDE.md`/`AGENTS.md`](./CLAUDE.md) for development guidelines and archit
|
|
|
483
486
|
- Wrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
|
|
484
487
|
```
|
|
485
488
|
|
|
489
|
+
### Contributing
|
|
490
|
+
|
|
491
|
+
Issues only. Never write "pull requests are welcome" or any PR invitation — contributions arrive as issues, and `.github/CONTRIBUTING.md` says the same.
|
|
492
|
+
|
|
493
|
+
```markdown
|
|
494
|
+
## Contributing
|
|
495
|
+
|
|
496
|
+
Issues are welcome. Run checks and tests before submitting:
|
|
497
|
+
|
|
498
|
+
\`\`\`sh
|
|
499
|
+
bun run devcheck
|
|
500
|
+
bun run test
|
|
501
|
+
\`\`\`
|
|
502
|
+
```
|
|
503
|
+
|
|
486
504
|
### License
|
|
487
505
|
|
|
488
506
|
One line referencing the LICENSE file.
|
|
@@ -495,11 +513,13 @@ Apache-2.0 — see [LICENSE](LICENSE) for details.
|
|
|
495
513
|
|
|
496
514
|
## Principles
|
|
497
515
|
|
|
516
|
+
- **Gold standard first.** The `pubmed-mcp-server` README is the reference implementation; where it and this file disagree, the README wins.
|
|
498
517
|
- **Accuracy over aspiration.** Only document what exists. Don't describe planned features as if they're implemented.
|
|
499
|
-
- **
|
|
518
|
+
- **Surface first.** The primitives are the most important content. The Overview leads with them.
|
|
500
519
|
- **Tables over prose** for structured data (tools, config, directories). Scannable and diff-friendly.
|
|
501
|
-
- **
|
|
502
|
-
- **
|
|
520
|
+
- **Overview + reference.** Overview tables for scanning; a Capability reference entry for every primitive, none skipped, with contract-shaped bullets rather than release-note narration.
|
|
521
|
+
- **Concise on every pass.** Re-runs tighten as well as correct; see § *Concision* for what survives a cut and what doesn't, and validate everything that survives.
|
|
522
|
+
- **One two-column table per primitive type.** Tools, resources, and prompts each get a small heading and a Name/Description table, even when a table has one row. No `Type` column — most servers are tool-heavy and many have no resources or prompts.
|
|
503
523
|
- **Promote hosted instances.** If there's a public URL, put it in a top-level callout under the badges — not buried in Getting Started.
|
|
504
524
|
- **Three install configs.** `bunx`, `npx`, `docker run` in that order. Each as a complete MCP-client JSON block.
|
|
505
525
|
- **Real names from code.** Tool names, env vars, and URIs must match the source exactly. Copy from the definitions, don't paraphrase.
|
|
@@ -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, fast-forwards `main` when the release rode a release PR, creates the annotated tag on the commit `main` now points at, pushes commits and tags, then publishes to each applicable destination. Assumes git wrapup (version bumps, changelog, commit stack — and in release PR mode, the pushed branch and open PR) is already complete — this skill is the post-wrapup merge + tag + 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.17"
|
|
8
8
|
audience: external
|
|
9
9
|
type: workflow
|
|
10
10
|
---
|
|
@@ -111,12 +111,15 @@ If `--ff-only` refuses, `main` moved underneath the release branch. Halt and rep
|
|
|
111
111
|
The tag goes on HEAD. In release PR mode that is `main`'s tip after step 3 — the commit the PR's `headRefOid` names — so the tag is created on the branch it stays reachable from.
|
|
112
112
|
|
|
113
113
|
```bash
|
|
114
|
-
|
|
114
|
+
cat > /tmp/tag-v<version>.md <<'TAG'
|
|
115
|
+
<tag message>
|
|
116
|
+
TAG
|
|
117
|
+
git tag -a v<version> --cleanup=whitespace -F /tmp/tag-v<version>.md
|
|
115
118
|
```
|
|
116
119
|
|
|
117
120
|
If `v<version>` already exists and points at HEAD, a prior run created it — proceed. If it exists and points anywhere else, **halt and report the conflict** with the version string, the existing tag SHA, and HEAD. Never delete or move a tag without explicit authorization.
|
|
118
121
|
|
|
119
|
-
|
|
122
|
+
Write the message to a file through a quoted-delimiter heredoc and pass it with `-F`, never inline with `-m`: the body carries backticks, which a double-quoted string runs as command substitution and silently deletes, and apostrophes, which end a single-quoted string. The tag message renders as the GitHub Release body via `--notes-from-tag`. It must be structured markdown, not a flat string.
|
|
120
123
|
|
|
121
124
|
**Release PR mode: the tag body is the PR body's `## Changes` bullets plus its final changelog link, verbatim** — `gh pr view <N> --json body -q .body` (`<N>` from step 1 — on `main` there is no branch for `gh` to infer it from), take the theme line as the subject, the bullets under `## Changes`, and the last line; drop `## Gates` and the headers. That digest was authored at wrapup and reviewed on the PR; re-authoring it here would publish unreviewed words. The one addition: append ` · release PR #<N>` to that final line, so the GitHub Release points at its audit trail (GitHub autolinks the bare `#<N>`). Without a PR, author it from the changelog entry at `changelog/<major.minor>.x/<version>.md` — every claim in the tag must appear in that file, and the file's `summary:` line is the tag's theme.
|
|
122
125
|
|
|
@@ -193,10 +196,16 @@ Halt on publish error other than "version already exists" (which means this step
|
|
|
193
196
|
|
|
194
197
|
Only if `server.json` exists at the repo root (otherwise skip). Note: `server.json` (MCP Registry metadata) and `manifest.json` (MCPB bundle manifest, step 8) are independent — a project may have either, both, or neither.
|
|
195
198
|
|
|
199
|
+
The registry checks that the npm version exists before it registers, and npm's read endpoint can lag `bun publish` by several minutes. Wait for the version to be served before publishing; a publisher error saying the npm version was not found is this lag, not a terminal failure:
|
|
200
|
+
|
|
196
201
|
```bash
|
|
202
|
+
curl -sf --retry 30 --retry-delay 30 --retry-all-errors -o /dev/null \
|
|
203
|
+
"https://registry.npmjs.org/<package-name>/<version>"
|
|
197
204
|
bun run publish-mcp
|
|
198
205
|
```
|
|
199
206
|
|
|
207
|
+
Step 8 depends only on the pushed tag, so it may run while this wait is in progress.
|
|
208
|
+
|
|
200
209
|
If `publish-mcp` isn't defined in `package.json`, add it permanently (one-time setup, macOS):
|
|
201
210
|
|
|
202
211
|
```json
|
|
@@ -4,7 +4,7 @@ description: >
|
|
|
4
4
|
Review pass on an open release PR (`release/<version>` → `main`) — the step between `git-wrapup` and `release-and-publish` when a project releases in gated release PR mode. Reads the PR's commit range through the `code-simplifier` lens plus a correctness review, verifies whatever an automated reviewer left on the PR, lands fixes as fixup commits autosquashed back into the stack, force-with-lease pushes the release branch, keeps the PR body in sync with what ships, and leaves one summary comment. The only agent role that both edits and commits — and it never tags, merges, touches `main`, or publishes.
|
|
5
5
|
metadata:
|
|
6
6
|
author: cyanheads
|
|
7
|
-
version: "1.
|
|
7
|
+
version: "1.1"
|
|
8
8
|
audience: external
|
|
9
9
|
type: workflow
|
|
10
10
|
---
|
|
@@ -35,7 +35,7 @@ git log --oneline main..HEAD # the stack: work co
|
|
|
35
35
|
git diff main...HEAD --stat
|
|
36
36
|
```
|
|
37
37
|
|
|
38
|
-
Read `skills/code-simplifier/SKILL.md` in full. Read the changelog entry for this version (`changelog/<major.minor>.x/<version>.md`) — it is the claim the diff has to back.
|
|
38
|
+
Read `framework-skills/code-simplifier/SKILL.md` in full. Read the changelog entry for this version (`changelog/<major.minor>.x/<version>.md`) — it is the claim the diff has to back.
|
|
39
39
|
|
|
40
40
|
### 2. Establish the review range
|
|
41
41
|
|
|
@@ -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.
|
|
7
|
+
version: "1.11"
|
|
8
8
|
audience: external
|
|
9
9
|
type: workflow
|
|
10
10
|
---
|
|
@@ -38,7 +38,7 @@ gh api 'repos/cyanheads/mcp-ts-core/issues/<number>/timeline' --paginate \
|
|
|
38
38
|
--jq '.[] | select(.event=="cross-referenced") | .source.issue | "\(.repository.full_name)#\(.number) — \(.title)"'
|
|
39
39
|
```
|
|
40
40
|
|
|
41
|
-
5. **For documentation- or contract-shaped requests, audit all three doc layers first** — proposals to add reference docs, public-API conventions, attribute/event catalogs, or stability commitments often duplicate surface that already exists. Check `src/` for behavior, `docs/` for human-facing reference, and `skills/` for agent-facing reference. Skill files marked `audience: external` are the framework's public contract — treat them as authoritative when evaluating whether a documentation gap exists. Also verify the constants or types you'd reference aren't already exported from `@cyanheads/mcp-ts-core` or one of its subpaths.
|
|
41
|
+
5. **For documentation- or contract-shaped requests, audit all three doc layers first** — proposals to add reference docs, public-API conventions, attribute/event catalogs, or stability commitments often duplicate surface that already exists. Check `src/` for behavior, `docs/` for human-facing reference, and `framework-skills/` for agent-facing reference. Skill files marked `audience: external` are the framework's public contract — treat them as authoritative when evaluating whether a documentation gap exists. Also verify the constants or types you'd reference aren't already exported from `@cyanheads/mcp-ts-core` or one of its subpaths.
|
|
42
42
|
|
|
43
43
|
## Writing Well-Structured Issues
|
|
44
44
|
|
|
@@ -181,6 +181,7 @@ Every issue needs exactly one primary label. Stack secondary labels on top when
|
|
|
181
181
|
| `performance` | Memory, CPU, latency, or resource usage |
|
|
182
182
|
| `security` | Vulnerability, CVE, or hardening work |
|
|
183
183
|
| `breaking-change` | Fix/feature will break public API; requires a major bump |
|
|
184
|
+
| `blocked-by-sdk` | Fix requires changes in `@modelcontextprotocol/sdk` |
|
|
184
185
|
| `surplus-token-idea` | Worth exploring when token budget allows |
|
|
185
186
|
|
|
186
187
|
Combine labels: `--label "bug" --label "regression"`.
|
|
@@ -213,7 +214,7 @@ gh issue create -R cyanheads/mcp-ts-core --template "Feature Request" --web
|
|
|
213
214
|
|
|
214
215
|
### CLI (non-interactive)
|
|
215
216
|
|
|
216
|
-
|
|
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.
|
|
217
218
|
|
|
218
219
|
````bash
|
|
219
220
|
gh issue create -R cyanheads/mcp-ts-core \
|
|
@@ -221,16 +222,16 @@ gh issue create -R cyanheads/mcp-ts-core \
|
|
|
221
222
|
--label "enhancement" \
|
|
222
223
|
--assignee "@me" \
|
|
223
224
|
--body "$(cat <<'ISSUE'
|
|
224
|
-
|
|
225
|
+
### Use case
|
|
225
226
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
## Proposal
|
|
227
|
+
One or two sentences: who hits this gap in the framework and why it matters. Name the specific builder, utility, context method, or config field. Kept short on purpose — a field that invites a paragraph gets padded with background and skipped by the next reader.
|
|
229
228
|
|
|
230
|
-
|
|
229
|
+
Related: #N
|
|
231
230
|
|
|
232
231
|
### Proposed API
|
|
233
232
|
|
|
233
|
+
What you want the framework to do, then the API as a consumer would call it. Link external libraries on first mention: [lib name](https://github.com/owner/repo).
|
|
234
|
+
|
|
234
235
|
```ts
|
|
235
236
|
import { withRetry } from '@cyanheads/mcp-ts-core/utils';
|
|
236
237
|
|
|
@@ -240,18 +241,9 @@ const result = await withRetry(() => fetchExternal(url), {
|
|
|
240
241
|
});
|
|
241
242
|
```
|
|
242
243
|
|
|
243
|
-
###
|
|
244
|
-
|
|
245
|
-
Ordered steps — e.g. `trigger → resolve → fetch → degrade`. Useful when the change spans multiple phases or fallbacks.
|
|
246
|
-
|
|
247
|
-
### Design / Tradeoffs (optional)
|
|
248
|
-
|
|
249
|
-
Philosophy: **one-line principle in bold.**
|
|
244
|
+
### Alternatives considered
|
|
250
245
|
|
|
251
|
-
|
|
252
|
-
|:---|:---|:---|
|
|
253
|
-
| A | ... | ... |
|
|
254
|
-
| B | ... | ... |
|
|
246
|
+
What you tried or evaluated instead, and why it didn't fit.
|
|
255
247
|
|
|
256
248
|
### Scope
|
|
257
249
|
|
|
@@ -264,13 +256,22 @@ Philosophy: **one-line principle in bold.**
|
|
|
264
256
|
- What we're deliberately not doing
|
|
265
257
|
- Adjacent work that belongs in a separate issue
|
|
266
258
|
|
|
267
|
-
###
|
|
259
|
+
### Flow (optional)
|
|
268
260
|
|
|
269
|
-
|
|
261
|
+
Ordered steps — e.g. `trigger → resolve → fetch → degrade`. Useful when the change spans multiple phases or fallbacks.
|
|
270
262
|
|
|
271
|
-
###
|
|
263
|
+
### Design / Tradeoffs (optional)
|
|
272
264
|
|
|
273
|
-
|
|
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
|
|
274
275
|
ISSUE
|
|
275
276
|
)"
|
|
276
277
|
````
|
|
@@ -293,8 +294,8 @@ gh issue list -R cyanheads/mcp-ts-core --author @me
|
|
|
293
294
|
- [ ] Confirmed bug is in `@cyanheads/mcp-ts-core`, not server code
|
|
294
295
|
- [ ] Running latest (or documented) framework version
|
|
295
296
|
- [ ] Searched existing issues — no duplicate found
|
|
296
|
-
- [ ] If documentation or contract enhancement: confirmed `src/`, `docs/`, `skills/`, and public exports don't already cover the surface
|
|
297
|
+
- [ ] If documentation or contract enhancement: confirmed `src/`, `docs/`, `framework-skills/`, and public exports don't already cover the surface
|
|
297
298
|
- [ ] All secrets, credentials, and tokens redacted
|
|
298
299
|
- [ ] Primary label assigned (`bug` / `enhancement` / `documentation`)
|
|
299
300
|
- [ ] If bug: version, runtime, repro code, actual vs expected behavior included
|
|
300
|
-
- [ ] If feature:
|
|
301
|
+
- [ ] If feature: `Use case` and `Proposed API` present (the form's required fields), `Alternatives considered` third; Out of scope defined
|
|
@@ -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.
|
|
7
|
+
version: "1.9"
|
|
8
8
|
audience: external
|
|
9
9
|
type: workflow
|
|
10
10
|
---
|
|
@@ -165,8 +165,12 @@ Every issue needs exactly one primary label. Stack secondary labels on top when
|
|
|
165
165
|
| `performance` | Memory, CPU, latency, or resource usage |
|
|
166
166
|
| `security` | Vulnerability, CVE, or hardening work |
|
|
167
167
|
| `breaking-change` | Change will break public API; requires a major bump |
|
|
168
|
+
| `blocked-by-framework` | Fix requires a released change in `@cyanheads/mcp-ts-core`; pairs with a `Depends on: cyanheads/mcp-ts-core#N` line in the body |
|
|
169
|
+
| `blocked-by-sdk` | Fix requires changes in `@modelcontextprotocol/sdk` |
|
|
168
170
|
| `surplus-token-idea` | Worth exploring when token budget allows |
|
|
169
171
|
|
|
172
|
+
`blocked-by-framework` comes off when this server adopts the release that ships the fix. An issue blocked on the SDK *through* the framework takes `blocked-by-framework`, not `blocked-by-sdk` — the server's own unblock is still a framework release.
|
|
173
|
+
|
|
170
174
|
Combine labels: `--label "bug" --label "regression"`.
|
|
171
175
|
|
|
172
176
|
Secondary labels are not GitHub defaults — if `gh issue create --label "regression"` fails with `label not found`, create it once:
|
|
@@ -176,6 +180,8 @@ gh label create regression --color e99695 --description "Worked before, broken a
|
|
|
176
180
|
gh label create performance --color 5319e7 --description "Memory, CPU, latency, or resource usage"
|
|
177
181
|
gh label create security --color b60205 --description "Vulnerability, CVE, or hardening work"
|
|
178
182
|
gh label create breaking-change --color d93f0b --description "Change will break public API; requires a major bump"
|
|
183
|
+
gh label create blocked-by-framework --color fbca04 --description "Fix requires a released change in @cyanheads/mcp-ts-core"
|
|
184
|
+
gh label create blocked-by-sdk --color c5def5 --description "Fix requires changes in @modelcontextprotocol/sdk"
|
|
179
185
|
gh label create surplus-token-idea --color FF10F0 --description "Worth exploring when token budget allows"
|
|
180
186
|
```
|
|
181
187
|
|
|
@@ -207,7 +213,7 @@ gh issue create --template "Feature Request" --web
|
|
|
207
213
|
|
|
208
214
|
### CLI (non-interactive)
|
|
209
215
|
|
|
210
|
-
|
|
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.
|
|
211
217
|
|
|
212
218
|
````bash
|
|
213
219
|
gh issue create \
|
|
@@ -215,34 +221,23 @@ gh issue create \
|
|
|
215
221
|
--label "enhancement" \
|
|
216
222
|
--assignee "@me" \
|
|
217
223
|
--body "$(cat <<'ISSUE'
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
Related: #N
|
|
224
|
+
### Use case
|
|
221
225
|
|
|
222
|
-
|
|
226
|
+
One or two sentences: who hits this gap and why it matters. Name the specific tool, service, resource, or domain area. Kept short on purpose — a field that invites a paragraph gets padded with background and skipped by the next reader.
|
|
223
227
|
|
|
224
|
-
|
|
228
|
+
Related: #N
|
|
225
229
|
|
|
226
230
|
### Proposed behavior
|
|
227
231
|
|
|
228
|
-
|
|
232
|
+
What you want the server to do, then the new behavior or surface. For tool/resource changes, show example input/output or the new schema fields. Link external libraries or services on first mention: [lib name](https://github.com/owner/repo).
|
|
229
233
|
|
|
230
234
|
```ts
|
|
231
235
|
// Example: new input field or output shape
|
|
232
236
|
```
|
|
233
237
|
|
|
234
|
-
###
|
|
235
|
-
|
|
236
|
-
Ordered steps — e.g. `request → lookup → fallback → respond`. Useful when the change spans multiple phases or fallbacks.
|
|
237
|
-
|
|
238
|
-
### Design / Tradeoffs (optional)
|
|
239
|
-
|
|
240
|
-
Philosophy: **one-line principle in bold.**
|
|
238
|
+
### Alternatives considered
|
|
241
239
|
|
|
242
|
-
|
|
243
|
-
|:---|:---|:---|
|
|
244
|
-
| A | ... | ... |
|
|
245
|
-
| B | ... | ... |
|
|
240
|
+
What you tried or evaluated instead, and why it didn't fit.
|
|
246
241
|
|
|
247
242
|
### Scope
|
|
248
243
|
|
|
@@ -255,14 +250,23 @@ Philosophy: **one-line principle in bold.**
|
|
|
255
250
|
- What we're deliberately not doing
|
|
256
251
|
- Adjacent work that belongs in a separate issue
|
|
257
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
|
+
|
|
258
266
|
### Dependencies (optional)
|
|
259
267
|
|
|
260
268
|
- Depends on: cyanheads/mcp-ts-core#N (upstream framework change)
|
|
261
269
|
- Depends on: owner/repo#N (other server work)
|
|
262
|
-
|
|
263
|
-
### Alternatives considered
|
|
264
|
-
|
|
265
|
-
What you tried or evaluated instead, and why it didn't fit.
|
|
266
270
|
ISSUE
|
|
267
271
|
)"
|
|
268
272
|
````
|
|
@@ -306,4 +310,4 @@ gh issue close <number> --reason completed --comment "Fixed in <commit or PR>"
|
|
|
306
310
|
- [ ] Title follows `type(scope): description` format
|
|
307
311
|
- [ ] Primary label assigned (`bug` / `enhancement` / `documentation`)
|
|
308
312
|
- [ ] If bug: version, runtime, repro steps, actual vs expected behavior included
|
|
309
|
-
- [ ] If feature:
|
|
313
|
+
- [ ] If feature: `Use case` and `Proposed behavior` present (the form's required fields), `Alternatives considered` third; Out of scope defined
|