@cyanheads/mcp-ts-core 0.12.8 → 0.13.0
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 +12 -11
- package/CLAUDE.md +12 -11
- package/README.md +2 -2
- package/biome.json +1 -1
- package/changelog/0.12.x/0.12.9.md +36 -0
- package/changelog/0.13.x/0.13.0.md +48 -0
- package/changelog/template.md +7 -24
- 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.map +1 -1
- package/dist/config/index.js +5 -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/linter/validate.js +2 -2
- package/dist/linter/validate.js.map +1 -1
- package/dist/mcp-server/transports/http/httpTransport.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/httpTransport.js +70 -2
- package/dist/mcp-server/transports/http/httpTransport.js.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/connect.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/landing-page/sections/connect.js +9 -2
- package/dist/mcp-server/transports/http/landing-page/sections/connect.js.map +1 -1
- package/dist/mcp-server/transports/http/sessionStore.d.ts +10 -2
- package/dist/mcp-server/transports/http/sessionStore.d.ts.map +1 -1
- package/dist/mcp-server/transports/http/sessionStore.js.map +1 -1
- package/dist/services/mirror/sqlite/handle.d.ts.map +1 -1
- package/dist/services/mirror/sqlite/handle.js +14 -12
- package/dist/services/mirror/sqlite/handle.js.map +1 -1
- package/dist/services/mirror/sqlite/sqliteMirrorStore.js +8 -9
- package/dist/services/mirror/sqlite/sqliteMirrorStore.js.map +1 -1
- package/dist/services/mirror/types.d.ts +5 -1
- package/dist/services/mirror/types.d.ts.map +1 -1
- package/dist/utils/internal/performance.d.ts +1 -1
- package/dist/utils/internal/performance.js +2 -2
- package/dist/utils/network/fetchWithTimeout.js +1 -1
- package/dist/utils/network/retry.js +1 -1
- package/dist/utils/security/idGenerator.d.ts +3 -1
- package/dist/utils/security/idGenerator.d.ts.map +1 -1
- package/dist/utils/security/idGenerator.js +12 -1
- package/dist/utils/security/idGenerator.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 +7 -7
- package/{skills → framework-skills}/api-config/SKILL.md +3 -1
- package/{skills → framework-skills}/api-context/SKILL.md +3 -3
- package/{skills → framework-skills}/api-errors/SKILL.md +2 -1
- package/{skills → framework-skills}/api-linter/SKILL.md +4 -4
- package/{skills → framework-skills}/api-mirror/SKILL.md +3 -1
- package/{skills → framework-skills}/design-mcp-server/SKILL.md +59 -101
- package/{skills → framework-skills}/field-test/SKILL.md +10 -5
- package/{skills → framework-skills}/git-wrapup/SKILL.md +5 -3
- 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/package-meta.md +1 -1
- package/{skills → framework-skills}/polish-docs-meta/references/readme.md +88 -72
- package/{skills → framework-skills}/release-and-publish/SKILL.md +4 -1
- package/{skills → framework-skills}/release-pr-review/SKILL.md +2 -2
- package/{skills → framework-skills}/report-issue-framework/SKILL.md +25 -25
- package/{skills → framework-skills}/report-issue-local/SKILL.md +22 -24
- package/{skills → framework-skills}/security-pass/SKILL.md +2 -2
- package/{skills → framework-skills}/setup/SKILL.md +10 -8
- package/package.json +13 -13
- 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 +37 -27
- 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 +1 -1
- 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 +16 -15
- package/templates/CLAUDE.md +16 -15
- package/templates/_.mcpbignore +1 -1
- package/templates/changelog/template.md +7 -24
- package/templates/package.json +4 -3
- 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-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-telemetry/SKILL.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}/code-simplifier/SKILL.md +0 -0
- /package/{skills → framework-skills}/polish-docs-meta/references/server-json.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
|
|
|
@@ -40,7 +55,7 @@ Centered HTML. The `<h1>` is the server name — use the scoped package name if
|
|
|
40
55
|
|
|
41
56
|
<div align="center">
|
|
42
57
|
|
|
43
|
-
[](./CHANGELOG.md) [](./LICENSE) [](https://github.com/users/cyanheads/packages/container/package/my-mcp-server) [](https://modelcontextprotocol.io/) [](https://www.npmjs.com/package/@cyanheads/my-mcp-server) [](https://www.typescriptlang.org/) [](./CHANGELOG.md) [](./LICENSE) [](https://github.com/users/cyanheads/packages/container/package/my-mcp-server) [](https://modelcontextprotocol.io/) [](https://www.npmjs.com/package/@cyanheads/my-mcp-server) [](https://www.typescriptlang.org/) [](https://bun.sh/)
|
|
44
59
|
|
|
45
60
|
</div>
|
|
46
61
|
|
|
@@ -108,106 +123,90 @@ 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
|
+
### Overview
|
|
112
127
|
|
|
113
|
-
|
|
128
|
+
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.
|
|
114
129
|
|
|
115
|
-
**
|
|
130
|
+
**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, the hosted endpoint if any). Not a count, and not "an MCP server that…" framing.
|
|
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
|
+
**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.
|
|
120
133
|
|
|
121
|
-
|
|
134
|
+
```markdown
|
|
135
|
+
## Overview
|
|
122
136
|
|
|
123
|
-
|
|
137
|
+
An MCP server 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.
|
|
124
138
|
|
|
125
|
-
|
|
126
|
-
## Tools
|
|
139
|
+
### Tools
|
|
127
140
|
|
|
128
|
-
|
|
141
|
+
| Tool | Description |
|
|
142
|
+
|:---|:---|
|
|
143
|
+
| `acme_search_projects` | Search projects by name, status, or team, with pagination and field selection |
|
|
144
|
+
| `acme_get_task` | Fetch one or more tasks by ID, with full or summary data |
|
|
129
145
|
|
|
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
|
-
```
|
|
146
|
+
### Resources
|
|
136
147
|
|
|
137
|
-
|
|
148
|
+
| Resource | Description |
|
|
149
|
+
|:---|:---|
|
|
150
|
+
| `acme://projects/{projectId}` | Project details by ID |
|
|
138
151
|
|
|
139
|
-
|
|
152
|
+
### Prompts
|
|
140
153
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
154
|
+
| Prompt | Description |
|
|
155
|
+
|:---|:---|
|
|
156
|
+
| `project_summary` | Summarize a project's status and open tasks |
|
|
157
|
+
```
|
|
144
158
|
|
|
145
|
-
|
|
146
|
-
### `acme_search_projects`
|
|
159
|
+
Derive every row from the actual definitions — real names and descriptions from the Zod schemas.
|
|
147
160
|
|
|
148
|
-
|
|
161
|
+
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.
|
|
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
|
+
### Capability reference
|
|
154
164
|
|
|
155
|
-
|
|
165
|
+
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.
|
|
156
166
|
|
|
157
|
-
|
|
167
|
+
**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.
|
|
158
168
|
|
|
159
|
-
|
|
169
|
+
```markdown
|
|
170
|
+
## Capability reference
|
|
160
171
|
|
|
161
|
-
|
|
172
|
+
### `acme_search_projects` <sub>tool</sub>
|
|
162
173
|
|
|
163
|
-
-
|
|
164
|
-
-
|
|
165
|
-
-
|
|
166
|
-
```
|
|
174
|
+
- Free-text query plus typed `status` / `phase` filters; up to 100 per page, offset pagination
|
|
175
|
+
- Optional `fields` selection to trim the response
|
|
176
|
+
- Results carry `source` and `fetchedAt` so callers can reason about freshness
|
|
167
177
|
|
|
168
|
-
|
|
178
|
+
---
|
|
169
179
|
|
|
170
|
-
###
|
|
180
|
+
### `acme_get_task` <sub>tool</sub>
|
|
171
181
|
|
|
172
|
-
|
|
182
|
+
- Up to 5 task IDs per call; `detail: "full"` adds subtasks, comments, attachments, and history
|
|
183
|
+
- Per-item `status` rows — a partial batch returns the resolved tasks alongside typed errors for the rest
|
|
173
184
|
|
|
174
|
-
|
|
175
|
-
## Resources and prompts
|
|
185
|
+
---
|
|
176
186
|
|
|
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
|
-
```
|
|
187
|
+
### `acme://projects/{projectId}` <sub>resource</sub>
|
|
183
188
|
|
|
184
|
-
|
|
189
|
+
- Project record as `application/json` — name, status, owners, open task count
|
|
190
|
+
- `projectId` comes from `acme_search_projects`
|
|
185
191
|
|
|
186
|
-
|
|
192
|
+
---
|
|
187
193
|
|
|
188
|
-
|
|
189
|
-
All resource data is also reachable via tools. Large collections (`projects`, `tasks`) are not exposed as resources — use the `list` operation on the corresponding tool instead.
|
|
190
|
-
```
|
|
194
|
+
### `project_summary` <sub>prompt</sub>
|
|
191
195
|
|
|
192
|
-
|
|
196
|
+
- Arguments: `projectId` required; `includeClosed` (`"true"` / `"false"`) optional
|
|
197
|
+
- Returns two messages — an assistant framing message and a user message carrying the summary request
|
|
198
|
+
```
|
|
193
199
|
|
|
194
|
-
|
|
200
|
+
Link an examples file from an entry when one exists: `[View detailed examples](./examples/acme_search_projects.md)`.
|
|
195
201
|
|
|
196
202
|
### Features
|
|
197
203
|
|
|
198
|
-
|
|
204
|
+
A one-sentence framework line naming what a user gets from the framework (transports, auth, storage, observability — not how the code is organized; contributor facts belong in the Development guide), then two bullet groups: domain-specific capabilities, then agent-friendly output design.
|
|
199
205
|
|
|
200
206
|
```markdown
|
|
201
207
|
## Features
|
|
202
208
|
|
|
203
|
-
Built on [`@cyanheads/mcp-ts-core`](https://www.npmjs.com/package/@cyanheads/mcp-ts-core):
|
|
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
|
|
209
|
+
Built on [`@cyanheads/mcp-ts-core`](https://www.npmjs.com/package/@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
210
|
|
|
212
211
|
Acme-specific:
|
|
213
212
|
|
|
@@ -333,7 +332,7 @@ A public instance is available at `https://my-server.example.com/mcp` — no ins
|
|
|
333
332
|
```markdown
|
|
334
333
|
### Prerequisites
|
|
335
334
|
|
|
336
|
-
- [Bun v1.
|
|
335
|
+
- [Bun v1.4.0](https://bun.sh/) or higher (or Node.js v24+).
|
|
337
336
|
- An Acme API key — see [`docs/api-key.md`](./docs/api-key.md) for how to generate one.
|
|
338
337
|
```
|
|
339
338
|
|
|
@@ -483,6 +482,21 @@ See [`CLAUDE.md`/`AGENTS.md`](./CLAUDE.md) for development guidelines and archit
|
|
|
483
482
|
- Wrap external API calls: validate raw → normalize to domain type → return output schema; never fabricate missing fields
|
|
484
483
|
```
|
|
485
484
|
|
|
485
|
+
### Contributing
|
|
486
|
+
|
|
487
|
+
Issues only. Never write "pull requests are welcome" or any PR invitation — contributions arrive as issues, and `.github/CONTRIBUTING.md` says the same.
|
|
488
|
+
|
|
489
|
+
```markdown
|
|
490
|
+
## Contributing
|
|
491
|
+
|
|
492
|
+
Issues are welcome. Run checks and tests before submitting:
|
|
493
|
+
|
|
494
|
+
\`\`\`sh
|
|
495
|
+
bun run devcheck
|
|
496
|
+
bun run test
|
|
497
|
+
\`\`\`
|
|
498
|
+
```
|
|
499
|
+
|
|
486
500
|
### License
|
|
487
501
|
|
|
488
502
|
One line referencing the LICENSE file.
|
|
@@ -495,11 +509,13 @@ Apache-2.0 — see [LICENSE](LICENSE) for details.
|
|
|
495
509
|
|
|
496
510
|
## Principles
|
|
497
511
|
|
|
512
|
+
- **Gold standard first.** The `pubmed-mcp-server` README is the reference implementation; where it and this file disagree, the README wins.
|
|
498
513
|
- **Accuracy over aspiration.** Only document what exists. Don't describe planned features as if they're implemented.
|
|
499
|
-
- **
|
|
514
|
+
- **Surface first.** The primitives are the most important content. The Overview leads with them.
|
|
500
515
|
- **Tables over prose** for structured data (tools, config, directories). Scannable and diff-friendly.
|
|
501
|
-
- **
|
|
502
|
-
- **
|
|
516
|
+
- **Overview + reference.** Overview tables for scanning; a Capability reference entry for every primitive, none skipped, with contract-shaped bullets rather than release-note narration.
|
|
517
|
+
- **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.
|
|
518
|
+
- **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
519
|
- **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
520
|
- **Three install configs.** `bunx`, `npx`, `docker run` in that order. Each as a complete MCP-client JSON block.
|
|
505
521
|
- **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.16"
|
|
8
8
|
audience: external
|
|
9
9
|
type: workflow
|
|
10
10
|
---
|
|
@@ -138,6 +138,7 @@ Format — a **headline digest**, never a section-by-section changelog mirror:
|
|
|
138
138
|
(` · release PR #<N>` only in release PR mode; without a PR the line ends at the changelog link.)
|
|
139
139
|
|
|
140
140
|
**Rules:**
|
|
141
|
+
- **Subject line is ONE short theme, at most ~60 characters, no semicolons, no clauses** — it becomes the GitHub Release title after `v<VERSION>: `. The digest lives in the bullets; a subject that summarizes each change is wrong even when every word is accurate. In release PR mode the PR body's opening paragraph is NOT the subject — write the theme fresh (the release commit's subject after the version and dash is usually it)
|
|
141
142
|
- Subject line omits the version number (GitHub prepends `v<VERSION>:` to the release title)
|
|
142
143
|
- **Flat bullets only — never Keep-a-Changelog section headers.** `Added:`/`Changed:`/`Fixed:`/`Dependency bumps:` belong in the changelog file; a tag that mirrors the changelog's structure is wrong even when every line is accurate
|
|
143
144
|
- **Complete at headline granularity** — every changelog-worthy change stays visible: notable changes get their own bullet, minor/internal items (build config, repo hygiene, metadata) share ONE grouped compact bullet. Nothing silently dropped, nothing expanded — the changelog carries the depth, the tag carries the existence
|
|
@@ -171,6 +172,8 @@ Push `main` first, then the tag. If the remote rejects either push, halt.
|
|
|
171
172
|
|
|
172
173
|
### 6. Publish to npm
|
|
173
174
|
|
|
175
|
+
Before publishing, inspect `bun publish --dry-run`. A resumed run may leave `dist/*.mcpb` in a package whose `files` allowlist includes `dist/`, adding the desktop bundle and its dependencies to npm. If listed, move the bundle outside the package directory, publish npm, then restore the bundle for the GitHub Release.
|
|
176
|
+
|
|
174
177
|
```bash
|
|
175
178
|
bun publish --access public
|
|
176
179
|
```
|
|
@@ -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.10"
|
|
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
|
|
|
@@ -213,7 +213,7 @@ gh issue create -R cyanheads/mcp-ts-core --template "Feature Request" --web
|
|
|
213
213
|
|
|
214
214
|
### CLI (non-interactive)
|
|
215
215
|
|
|
216
|
-
|
|
216
|
+
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
217
|
|
|
218
218
|
````bash
|
|
219
219
|
gh issue create -R cyanheads/mcp-ts-core \
|
|
@@ -221,16 +221,16 @@ gh issue create -R cyanheads/mcp-ts-core \
|
|
|
221
221
|
--label "enhancement" \
|
|
222
222
|
--assignee "@me" \
|
|
223
223
|
--body "$(cat <<'ISSUE'
|
|
224
|
-
|
|
224
|
+
### Use case
|
|
225
225
|
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
## Proposal
|
|
226
|
+
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
227
|
|
|
230
|
-
|
|
228
|
+
Related: #N
|
|
231
229
|
|
|
232
230
|
### Proposed API
|
|
233
231
|
|
|
232
|
+
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).
|
|
233
|
+
|
|
234
234
|
```ts
|
|
235
235
|
import { withRetry } from '@cyanheads/mcp-ts-core/utils';
|
|
236
236
|
|
|
@@ -240,18 +240,9 @@ const result = await withRetry(() => fetchExternal(url), {
|
|
|
240
240
|
});
|
|
241
241
|
```
|
|
242
242
|
|
|
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.**
|
|
243
|
+
### Alternatives considered
|
|
250
244
|
|
|
251
|
-
|
|
252
|
-
|:---|:---|:---|
|
|
253
|
-
| A | ... | ... |
|
|
254
|
-
| B | ... | ... |
|
|
245
|
+
What you tried or evaluated instead, and why it didn't fit.
|
|
255
246
|
|
|
256
247
|
### Scope
|
|
257
248
|
|
|
@@ -264,13 +255,22 @@ Philosophy: **one-line principle in bold.**
|
|
|
264
255
|
- What we're deliberately not doing
|
|
265
256
|
- Adjacent work that belongs in a separate issue
|
|
266
257
|
|
|
267
|
-
###
|
|
258
|
+
### Flow (optional)
|
|
268
259
|
|
|
269
|
-
|
|
260
|
+
Ordered steps — e.g. `trigger → resolve → fetch → degrade`. Useful when the change spans multiple phases or fallbacks.
|
|
270
261
|
|
|
271
|
-
###
|
|
262
|
+
### Design / Tradeoffs (optional)
|
|
272
263
|
|
|
273
|
-
|
|
264
|
+
Philosophy: **one-line principle in bold.**
|
|
265
|
+
|
|
266
|
+
| Option | Strengths | Weaknesses |
|
|
267
|
+
|:---|:---|:---|
|
|
268
|
+
| A | ... | ... |
|
|
269
|
+
| B | ... | ... |
|
|
270
|
+
|
|
271
|
+
### Dependencies (optional)
|
|
272
|
+
|
|
273
|
+
- Depends on: owner/repo#N
|
|
274
274
|
ISSUE
|
|
275
275
|
)"
|
|
276
276
|
````
|
|
@@ -293,8 +293,8 @@ gh issue list -R cyanheads/mcp-ts-core --author @me
|
|
|
293
293
|
- [ ] Confirmed bug is in `@cyanheads/mcp-ts-core`, not server code
|
|
294
294
|
- [ ] Running latest (or documented) framework version
|
|
295
295
|
- [ ] 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
|
|
296
|
+
- [ ] If documentation or contract enhancement: confirmed `src/`, `docs/`, `framework-skills/`, and public exports don't already cover the surface
|
|
297
297
|
- [ ] All secrets, credentials, and tokens redacted
|
|
298
298
|
- [ ] Primary label assigned (`bug` / `enhancement` / `documentation`)
|
|
299
299
|
- [ ] If bug: version, runtime, repro code, actual vs expected behavior included
|
|
300
|
-
- [ ] If feature:
|
|
300
|
+
- [ ] 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.8"
|
|
8
8
|
audience: external
|
|
9
9
|
type: workflow
|
|
10
10
|
---
|
|
@@ -207,7 +207,7 @@ gh issue create --template "Feature Request" --web
|
|
|
207
207
|
|
|
208
208
|
### CLI (non-interactive)
|
|
209
209
|
|
|
210
|
-
|
|
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. Everything after `Alternatives considered` is supplemental; omit what you don't need — simple requests don't require Flow / Design / Dependencies blocks.
|
|
211
211
|
|
|
212
212
|
````bash
|
|
213
213
|
gh issue create \
|
|
@@ -215,34 +215,23 @@ gh issue create \
|
|
|
215
215
|
--label "enhancement" \
|
|
216
216
|
--assignee "@me" \
|
|
217
217
|
--body "$(cat <<'ISSUE'
|
|
218
|
-
|
|
218
|
+
### Use case
|
|
219
219
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
## Proposal
|
|
220
|
+
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
221
|
|
|
224
|
-
|
|
222
|
+
Related: #N
|
|
225
223
|
|
|
226
224
|
### Proposed behavior
|
|
227
225
|
|
|
228
|
-
|
|
226
|
+
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
227
|
|
|
230
228
|
```ts
|
|
231
229
|
// Example: new input field or output shape
|
|
232
230
|
```
|
|
233
231
|
|
|
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.**
|
|
232
|
+
### Alternatives considered
|
|
241
233
|
|
|
242
|
-
|
|
243
|
-
|:---|:---|:---|
|
|
244
|
-
| A | ... | ... |
|
|
245
|
-
| B | ... | ... |
|
|
234
|
+
What you tried or evaluated instead, and why it didn't fit.
|
|
246
235
|
|
|
247
236
|
### Scope
|
|
248
237
|
|
|
@@ -255,14 +244,23 @@ Philosophy: **one-line principle in bold.**
|
|
|
255
244
|
- What we're deliberately not doing
|
|
256
245
|
- Adjacent work that belongs in a separate issue
|
|
257
246
|
|
|
247
|
+
### Flow (optional)
|
|
248
|
+
|
|
249
|
+
Ordered steps — e.g. `request → lookup → fallback → respond`. Useful when the change spans multiple phases or fallbacks.
|
|
250
|
+
|
|
251
|
+
### Design / Tradeoffs (optional)
|
|
252
|
+
|
|
253
|
+
Philosophy: **one-line principle in bold.**
|
|
254
|
+
|
|
255
|
+
| Option | Strengths | Weaknesses |
|
|
256
|
+
|:---|:---|:---|
|
|
257
|
+
| A | ... | ... |
|
|
258
|
+
| B | ... | ... |
|
|
259
|
+
|
|
258
260
|
### Dependencies (optional)
|
|
259
261
|
|
|
260
262
|
- Depends on: cyanheads/mcp-ts-core#N (upstream framework change)
|
|
261
263
|
- 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
264
|
ISSUE
|
|
267
265
|
)"
|
|
268
266
|
````
|
|
@@ -306,4 +304,4 @@ gh issue close <number> --reason completed --comment "Fixed in <commit or PR>"
|
|
|
306
304
|
- [ ] Title follows `type(scope): description` format
|
|
307
305
|
- [ ] Primary label assigned (`bug` / `enhancement` / `documentation`)
|
|
308
306
|
- [ ] If bug: version, runtime, repro steps, actual vs expected behavior included
|
|
309
|
-
- [ ] If feature:
|
|
307
|
+
- [ ] If feature: `Use case` and `Proposed behavior` present (the form's required fields), `Alternatives considered` third; Out of scope defined
|
|
@@ -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 / 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.
|
|
7
|
+
version: "1.8"
|
|
8
8
|
audience: external
|
|
9
9
|
type: audit
|
|
10
10
|
---
|
|
@@ -257,7 +257,7 @@ grep -rn "JSON.parse\b" src/
|
|
|
257
257
|
|
|
258
258
|
DataCanvas is opt-in and deliberately trades isolation for cross-agent token-shareable working sets — designed for public-data tabular servers (BrAPI, OpenAlex, etc.) where session-pinning isn't desired. The trade only holds when the deployment matches that assumption. Skip this axis entirely when canvas is disabled (`CANVAS_PROVIDER_TYPE=none`, the default).
|
|
259
259
|
|
|
260
|
-
**Look in:** `src/config/server-config.ts`, every tool reading
|
|
260
|
+
**Look in:** `src/config/server-config.ts`, the `setCanvas(core.canvas)` wiring in `setup()` and every tool reading the canvas accessor, deployment config (wrangler / Dockerfile / proxy).
|
|
261
261
|
|
|
262
262
|
**Check:**
|
|
263
263
|
|
|
@@ -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.
|
|
7
|
+
version: "1.11"
|
|
8
8
|
audience: external
|
|
9
9
|
type: workflow
|
|
10
10
|
---
|
|
11
11
|
|
|
12
12
|
## Context
|
|
13
13
|
|
|
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.
|
|
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 `framework-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
|
|
|
@@ -41,7 +41,7 @@ Dockerfile # Starter multi-stage image
|
|
|
41
41
|
server.json # MCP Registry publishing metadata
|
|
42
42
|
changelog/template.md # Format reference for per-version changelog files
|
|
43
43
|
scripts/ # build, clean, devcheck, lint-mcp, list-skills, build-changelog, tree, check-docs-sync
|
|
44
|
-
skills/
|
|
44
|
+
framework-skills/ # External skills copied from the package (source of truth)
|
|
45
45
|
src/
|
|
46
46
|
index.ts # createApp() entry point
|
|
47
47
|
mcp-server/
|
|
@@ -108,14 +108,14 @@ See the `add-tool`, `add-app-tool`, `add-resource`, `add-prompt`, `add-service`,
|
|
|
108
108
|
|
|
109
109
|
## Skill Sync
|
|
110
110
|
|
|
111
|
-
Copy all project skills into your agent's skill directory so they're available as context. `skills/` is the source of truth.
|
|
111
|
+
Copy all project skills into your agent's skill directory so they're available as context. `framework-skills/` is the source of truth. It is deliberately not `skills/`: Claude Code and Codex auto-load a plugin's root `skills/`, and these are development skills, not skills for the agents that install the server — leave `skills/` for those.
|
|
112
112
|
|
|
113
|
-
**Don't edit `skills/*/SKILL.md` or `skills/*/references/*`.** These are external skill files synced from `@cyanheads/mcp-ts-core` — the `maintenance` skill overwrites them on package updates, so local edits get lost. Project-specific agent context belongs in `CLAUDE.md` / `AGENTS.md`.
|
|
113
|
+
**Don't edit `framework-skills/*/SKILL.md` or `framework-skills/*/references/*`.** These are external skill files synced from `@cyanheads/mcp-ts-core` — the `maintenance` skill overwrites them on package updates, so local edits get lost. Project-specific agent context belongs in `CLAUDE.md` / `AGENTS.md`.
|
|
114
114
|
|
|
115
115
|
**For Claude Code:**
|
|
116
116
|
|
|
117
117
|
```bash
|
|
118
|
-
mkdir -p .claude/skills && cp -R skills/* .claude/skills/
|
|
118
|
+
mkdir -p .claude/skills && cp -R framework-skills/* .claude/skills/
|
|
119
119
|
```
|
|
120
120
|
|
|
121
121
|
**For other agents** (Codex, Cursor, Windsurf, etc.) — copy to the equivalent directory (e.g., `.codex/skills/`, `.cursor/skills/`).
|
|
@@ -138,7 +138,9 @@ Complete these one-time setup tasks:
|
|
|
138
138
|
| `.claude-plugin/plugin.json` | `description` | `lint:packaging` |
|
|
139
139
|
| `.codex-plugin/plugin.json` | `description`, `interface.shortDescription`, `interface.longDescription` | `lint:packaging` |
|
|
140
140
|
|
|
141
|
-
Fill the rest of the same blocks while you are in them — `package.json` `description` and `repository.url`, both plugin manifests' `author` / `homepage` / `repository`, the Codex manifest's `interface.developerName` / `category` / `websiteURL`, and `manifest.json` `description` / `author.name`. Nothing gates them, and every install surface reads them.
|
|
141
|
+
Fill the rest of the same blocks while you are in them — `package.json` `description` and `repository.url`, both plugin manifests' `author` / `homepage` / `repository` / `keywords`, the Codex manifest's `interface.developerName` / `category` / `websiteURL`, and `manifest.json` `description` / `author.name`. Nothing gates them, and every install surface reads them.
|
|
142
|
+
|
|
143
|
+
When the server takes a user-supplied value (an API key, a contact email, an instance URL), wire it into the plugin manifests the way each client delivers it — never as `"KEY": ""` in `env`, which `lint:packaging` rejects because the empty value replaces the user's exported key and is read as unset. In `.claude-plugin/plugin.json`, declare the option under `userConfig` (`type`, `title`, `description`; `sensitive: true` for keys and tokens; `required: true` or `default: ""`) and set `"KEY": "${user_config.<option>}"` in `env`. In `.codex-plugin/mcp.json`, list the variable name in `env_vars`. Mirror the `user_config` block you write in `manifest.json`.
|
|
142
144
|
|
|
143
145
|
A server that will never be published or installed as a plugin can drop the plugin-manifest gate instead — set `"packaging": { "pluginManifests": false }` in `devcheck.config.json`.
|
|
144
146
|
6. **Verify the scaffold builds clean** — `bun run devcheck`. Fix any issues before starting real work.
|
|
@@ -172,7 +174,7 @@ Skip or reorder as the project calls for it. The agent protocol's "What's Next?"
|
|
|
172
174
|
- [ ] Publishing identity populated (`server.json`, `package.json`, plugin manifests, `manifest.json`) — or the plugin-manifest gate opted out
|
|
173
175
|
- [ ] Framework docs read (`node_modules/@cyanheads/mcp-ts-core/CLAUDE.md` or `AGENTS.md`)
|
|
174
176
|
- [ ] Unused echo definitions cleaned up (and unregistered from `src/index.ts`)
|
|
175
|
-
- [ ] Skills copied to agent directory (`cp -R skills/* .claude/skills/` or equivalent)
|
|
177
|
+
- [ ] Skills copied to agent directory (`cp -R framework-skills/* .claude/skills/` or equivalent)
|
|
176
178
|
- [ ] Project structure understood (definitions directories, entry point)
|
|
177
179
|
- [ ] `bun run devcheck` passes
|
|
178
180
|
- [ ] Next: if new server, move on to `design-mcp-server` to plan the tool surface
|