@cyanheads/workflows-mcp-server 0.3.1 → 0.3.2

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 CHANGED
@@ -1,11 +1,11 @@
1
1
  # Agent Protocol
2
2
 
3
3
  **Server:** @cyanheads/workflows-mcp-server
4
- **Version:** 0.3.1
5
- **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.12.5`
6
- **Engines:** Bun ≥1.3.0, Node ≥24.0.0
4
+ **Version:** 0.3.2
5
+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.0`
6
+ **Engines:** Bun ≥1.4.0, Node ≥24.0.0
7
7
  **MCP SDK:** `@modelcontextprotocol/server` ^2.0.0
8
- **Zod:** ^4.5.4
8
+ **Zod:** ^4.6.1
9
9
 
10
10
  > **Read the framework docs first:** `node_modules/@cyanheads/mcp-ts-core/CLAUDE.md` contains the full API reference — builders, Context, error codes, exports, patterns. This file covers server-specific conventions only.
11
11
 
@@ -37,6 +37,7 @@ Tailor suggestions to what's actually missing or stale — don't recite the full
37
37
  - **Use `ctx.state`** for tenant-scoped storage. Never access persistence directly.
38
38
  - **Need caller input?** Return `ctx.requestInput(...)`; the handler is re-entered with answers in `ctx.inputs`. Never await input mid-handler.
39
39
  - **Secrets in env vars only** — never hardcoded.
40
+ - **Cut noise.** Add only what earns its place: no speculative generality, no guards for states the framework already prevents (Zod-validated params, classified errors), no abstraction until a third caller proves it, no option nothing sets.
40
41
  - **Close the loop on issues.** When implementing work tracked by a GitHub issue, comment on the issue with what landed and close it. Do both — a comment without a close leaves stale issues open; a close without a comment leaves no record of what shipped. The comment is for future readers — state the concrete changes, not the conversation that produced them.
41
42
 
42
43
  ---
@@ -176,7 +177,7 @@ throw new Error('Invalid query format'); // → ValidationError
176
177
 
177
178
  // McpError — when no factory exists for the code
178
179
  import { McpError, JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
179
- throw new McpError(JsonRpcErrorCode.DatabaseError, 'Connection failed', { pool: 'primary' });
180
+ throw new McpError(JsonRpcErrorCode.InitializationFailed, 'Connection failed', { pool: 'primary' });
180
181
  ```
181
182
 
182
183
  See framework CLAUDE.md and the `api-errors` skill for the full auto-classification table, all available factories, and the contract reference.
@@ -200,6 +201,7 @@ src/
200
201
  workflow-get.tool.ts # workflow_get — retrieve full workflow + global instructions
201
202
  workflow-create.tool.ts # workflow_create — write permanent workflow YAML
202
203
  workflow-create-temp.tool.ts # workflow_create_temp — write temporary workflow
204
+ workflow-delete.tool.ts # workflow_delete — remove permanent workflow
203
205
  index.ts # Barrel export
204
206
  workflows-yaml/ # Workflow library root (configurable via WORKFLOWS_DIR)
205
207
  categories/ # Permanent workflows organized by category
@@ -223,9 +225,9 @@ workflows-yaml/ # Workflow library root (configurable vi
223
225
 
224
226
  ## Skills
225
227
 
226
- Skills are modular instructions in `skills/` at the project root. Read them directly when a task matches — e.g., `skills/add-tool/SKILL.md` when adding a tool. `bun run list-skills` prints the full registry.
228
+ Skills are modular instructions in `framework-skills/` at the project root. Read them directly when a task matches — e.g., `framework-skills/add-tool/SKILL.md` when adding a tool. `bun run list-skills` prints the full registry. Keep development skills out of root `skills/`, which plugin hosts load for installing agents.
227
229
 
228
- **Agent skill directory:** Copy skills into the directory your agent discovers (Claude Code: `.claude/skills/`, others: equivalent). Skills then load as context without referencing `skills/` paths. After framework updates, run the `maintenance` skill — Phase B re-syncs the agent directory.
230
+ **Agent skill directory:** Copy skills into the directory your agent discovers (Claude Code: `.claude/skills/`, others: equivalent). Skills then load as context without referencing `framework-skills/` paths. After framework updates, run the `maintenance` skill — Phase B re-syncs the agent directory.
229
231
 
230
232
  Available skills:
231
233
 
@@ -239,16 +241,15 @@ Available skills:
239
241
  | `add-prompt` | Scaffold a new prompt definition |
240
242
  | `add-service` | Scaffold a new service integration |
241
243
  | `add-test` | Scaffold test file for a tool, resource, or service |
242
- | `add-export` | Add or evolve a public framework export without leaking internal module paths |
243
- | `add-provider` | Add a provider integration with config, lifecycle, errors, and tests |
244
244
  | `field-test` | Exercise tools/resources/prompts with real inputs, verify behavior, report issues |
245
245
  | `tool-defs-analysis` | Read-only audit of MCP definition language across the surface — voice, leaks, defaults, recovery hints, output descriptions |
246
246
  | `security-pass` | Audit server for MCP-flavored security gaps: output injection, scope blast radius, input sinks, tenant isolation |
247
247
  | `code-simplifier` | Post-session cleanup against `git diff` — modernize syntax, consolidate duplication, align with the codebase |
248
248
  | `techniques` | Catalog of response/data-shaping techniques — overflow handling, payload shaping, retrieval patterns |
249
249
  | `polish-docs-meta` | Finalize docs, README, metadata, and agent protocol for shipping |
250
- | `git-wrapup` | Land working-tree changes as a versioned commit + annotated tag — version bump, changelog, verify, tag. Local only. |
251
- | `release-and-publish` | Push + npm + MCP Registry + GH Release + Docker. Picks up from `git-wrapup` |
250
+ | `git-wrapup` | Land working-tree changes as a commit stack — version bump, changelog, verify, commit by concern. Opens a release PR only when the project declares release PR mode |
251
+ | `release-pr-review` | Review an open release PR, autosquash fixes into the stack, and keep the PR body in sync. Release PR mode only |
252
+ | `release-and-publish` | Tag + push + npm + MCP Registry + GH Release + Docker. Picks up from `git-wrapup` |
252
253
  | `maintenance` | Investigate changelogs, adopt upstream changes, sync skills to agent dirs |
253
254
  | `orchestrations` | Chain task skills into a gated multi-phase pipeline when sub-agents are available |
254
255
  | `report-issue-framework` | File a bug or feature request against `@cyanheads/mcp-ts-core` via `gh` CLI |
@@ -278,7 +279,8 @@ When you complete a skill's checklist, check the boxes and add a completion time
278
279
  | `bun run rebuild` | Clean + build |
279
280
  | `bun run clean` | Remove build artifacts |
280
281
  | `bun run devcheck` | Lint + format + typecheck + security + changelog sync |
281
- | `bun run audit:refresh` | Delete `bun.lock`, reinstall, re-audit. Use when `devcheck` flags a transitive advisory — stale lockfile can mask already-patched deps. If advisory survives, it's real. |
282
+ | `bun run audit:fix` | Upgrade vulnerable packages to the lowest safe version within existing ranges; `--dry-run` previews |
283
+ | `bun run audit:refresh` | Delete `bun.lock` and reinstall. Last resort after `audit:fix`, `bun update <name>`, and `bun dedupe`; re-resolves every ranged dependency |
282
284
  | `bun run lint:mcp` | Run the MCP definition linter standalone (rule catalog: `api-linter` skill) |
283
285
  | `bun run lint:packaging` | Packaging surface checks — `server.json`/`manifest.json` env-var parity (run by devcheck) |
284
286
  | `bun run list-skills` | Print the skill registry |
@@ -297,11 +299,11 @@ When you complete a skill's checklist, check the boxes and add a completion time
297
299
 
298
300
  ## Bundling
299
301
 
300
- `bun run bundle` produces a `.mcpb` extension bundle for one-click install in Claude Desktop. The pack step is followed by `scripts/clean-mcpb.ts`, which prunes dev dependencies (`mcpb clean`) and strips two classes of `node_modules/**` content that root-anchored `.mcpbignore` patterns cannot reach: dependency-shipped agent docs (`skills/`, `.claude/`, `.agents/`, `SKILL.md`) and platform-specific native bindings, which would otherwise lock the bundle to the platform it was packed on. MCPB is stdio-only — HTTP and Cloudflare Workers deployments are unaffected. Consumers who don't need it can delete `manifest.json` and `.mcpbignore`; `lint:packaging` skips cleanly.
302
+ `bun run bundle` produces a `.mcpb` extension bundle for one-click install in Claude Desktop. The pack step is followed by `scripts/clean-mcpb.ts`, which prunes dev dependencies (`mcpb clean`) and strips two classes of `node_modules/**` content that root-anchored `.mcpbignore` patterns cannot reach: dependency-shipped agent docs (`framework-skills/`, `skills/`, `.claude/`, `.agents/`, `SKILL.md`) and platform-specific native bindings, which would otherwise lock the bundle to the platform it was packed on. MCPB is stdio-only — HTTP and Cloudflare Workers deployments are unaffected. Consumers who don't need it can delete `manifest.json` and `.mcpbignore`; `lint:packaging` skips cleanly.
301
303
 
302
- **Adding an env var requires both files:** `server.json` (registry discovery, `environmentVariables[]`) and `manifest.json` (bundle install UX, `mcp_config.env` + `user_config`). `lint:packaging` (run by `devcheck`) verifies the env var names match.
304
+ **Adding an env var requires both files:** `server.json` (registry discovery, `environmentVariables[]`) and `manifest.json` (bundle install UX, `mcp_config.env` + `user_config`). Wire each option through `${user_config.<key>}` and give optional strings `default: ""`. `lint:packaging` checks wiring and env-name parity.
303
305
 
304
- **README install badges** (Claude Desktop `.mcpb`, Cursor, VS Code) and the `base64` / `encodeURIComponent` config-generation commands are ship-time concerns — run the `polish-docs-meta` skill, which carries the badge format, layout, and generation snippets in `skills/polish-docs-meta/references/readme.md`.
306
+ **README install badges** (Claude Desktop `.mcpb`, Cursor, VS Code) and the `base64` / `encodeURIComponent` config-generation commands are ship-time concerns — run the `polish-docs-meta` skill, which carries the badge format, layout, and generation snippets in `framework-skills/polish-docs-meta/references/readme.md`.
305
307
 
306
308
  ---
307
309
 
@@ -326,7 +328,7 @@ security: false # optional — true ONLY for a source
326
328
 
327
329
  `agent-notes` is an optional free-form field for maintenance agents processing the release downstream. Content here won't appear in the rendered CHANGELOG — it's consumed by agents running the `maintenance` skill. Use it for adoption instructions that don't fit the human-facing sections: new files to create, fields to populate, one-time migration steps. Omit entirely when there's nothing to say.
328
330
 
329
- **Section order** (Keep a Changelog): Added, Changed, Deprecated, Removed, Fixed, Security. Include only sections with entries — don't ship empty headers.
331
+ **Section order** (Keep a Changelog): Added, Changed, Deprecated, Removed, Fixed, Security, then Dependencies. Include only sections with entries — don't ship empty headers.
330
332
 
331
333
  **Tag annotations** render as GitHub Release bodies via `--notes-from-tag`. They must be structured markdown — never a flat comma-separated string. Subject omits the version number (GitHub prepends it). See `changelog/template.md` for the full format reference.
332
334
 
@@ -358,7 +360,7 @@ import { getMyService } from '@/services/my-domain/my-service.js';
358
360
  - [ ] If wrapping external API: tests include at least one sparse payload case with omitted upstream fields
359
361
  - [ ] Registered in `createApp()` arrays (directly or via barrel exports)
360
362
  - [ ] Tests use `createMockContext()` from `@cyanheads/mcp-ts-core/testing`
361
- - [ ] `.codex-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; `interface.displayName` = package name; `interface.shortDescription` from `package.json` description
362
- - [ ] `.codex-plugin/mcp.json` updated — server name key matches `package.json` name; env vars added for any required API keys
363
- - [ ] `.claude-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; inline `mcpServers` entry with server name key, env vars for any required API keys
363
+ - [ ] `.codex-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; `interface.displayName` = unscoped repo name; `interface.shortDescription` from `package.json` description
364
+ - [ ] `.codex-plugin/mcp.json` updated — server key is the unscoped repo name; user-supplied variables appear in `env_vars` so Codex forwards the host environment
365
+ - [ ] `.claude-plugin/plugin.json` populated — metadata from `package.json`; inline `mcpServers` keyed by the unscoped repo name. User-supplied variables are declared in `userConfig` and referenced through `${user_config.<option>}`, mirroring `manifest.json`. Optional strings have `default: ""`
364
366
  - [ ] `bun run devcheck` passes
package/CLAUDE.md CHANGED
@@ -1,11 +1,11 @@
1
1
  # Agent Protocol
2
2
 
3
3
  **Server:** @cyanheads/workflows-mcp-server
4
- **Version:** 0.3.1
5
- **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.12.5`
6
- **Engines:** Bun ≥1.3.0, Node ≥24.0.0
4
+ **Version:** 0.3.2
5
+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.0`
6
+ **Engines:** Bun ≥1.4.0, Node ≥24.0.0
7
7
  **MCP SDK:** `@modelcontextprotocol/server` ^2.0.0
8
- **Zod:** ^4.5.4
8
+ **Zod:** ^4.6.1
9
9
 
10
10
  > **Read the framework docs first:** `node_modules/@cyanheads/mcp-ts-core/CLAUDE.md` contains the full API reference — builders, Context, error codes, exports, patterns. This file covers server-specific conventions only.
11
11
 
@@ -37,6 +37,7 @@ Tailor suggestions to what's actually missing or stale — don't recite the full
37
37
  - **Use `ctx.state`** for tenant-scoped storage. Never access persistence directly.
38
38
  - **Need caller input?** Return `ctx.requestInput(...)`; the handler is re-entered with answers in `ctx.inputs`. Never await input mid-handler.
39
39
  - **Secrets in env vars only** — never hardcoded.
40
+ - **Cut noise.** Add only what earns its place: no speculative generality, no guards for states the framework already prevents (Zod-validated params, classified errors), no abstraction until a third caller proves it, no option nothing sets.
40
41
  - **Close the loop on issues.** When implementing work tracked by a GitHub issue, comment on the issue with what landed and close it. Do both — a comment without a close leaves stale issues open; a close without a comment leaves no record of what shipped. The comment is for future readers — state the concrete changes, not the conversation that produced them.
41
42
 
42
43
  ---
@@ -176,7 +177,7 @@ throw new Error('Invalid query format'); // → ValidationError
176
177
 
177
178
  // McpError — when no factory exists for the code
178
179
  import { McpError, JsonRpcErrorCode } from '@cyanheads/mcp-ts-core/errors';
179
- throw new McpError(JsonRpcErrorCode.DatabaseError, 'Connection failed', { pool: 'primary' });
180
+ throw new McpError(JsonRpcErrorCode.InitializationFailed, 'Connection failed', { pool: 'primary' });
180
181
  ```
181
182
 
182
183
  See framework CLAUDE.md and the `api-errors` skill for the full auto-classification table, all available factories, and the contract reference.
@@ -200,6 +201,7 @@ src/
200
201
  workflow-get.tool.ts # workflow_get — retrieve full workflow + global instructions
201
202
  workflow-create.tool.ts # workflow_create — write permanent workflow YAML
202
203
  workflow-create-temp.tool.ts # workflow_create_temp — write temporary workflow
204
+ workflow-delete.tool.ts # workflow_delete — remove permanent workflow
203
205
  index.ts # Barrel export
204
206
  workflows-yaml/ # Workflow library root (configurable via WORKFLOWS_DIR)
205
207
  categories/ # Permanent workflows organized by category
@@ -223,9 +225,9 @@ workflows-yaml/ # Workflow library root (configurable vi
223
225
 
224
226
  ## Skills
225
227
 
226
- Skills are modular instructions in `skills/` at the project root. Read them directly when a task matches — e.g., `skills/add-tool/SKILL.md` when adding a tool. `bun run list-skills` prints the full registry.
228
+ Skills are modular instructions in `framework-skills/` at the project root. Read them directly when a task matches — e.g., `framework-skills/add-tool/SKILL.md` when adding a tool. `bun run list-skills` prints the full registry. Keep development skills out of root `skills/`, which plugin hosts load for installing agents.
227
229
 
228
- **Agent skill directory:** Copy skills into the directory your agent discovers (Claude Code: `.claude/skills/`, others: equivalent). Skills then load as context without referencing `skills/` paths. After framework updates, run the `maintenance` skill — Phase B re-syncs the agent directory.
230
+ **Agent skill directory:** Copy skills into the directory your agent discovers (Claude Code: `.claude/skills/`, others: equivalent). Skills then load as context without referencing `framework-skills/` paths. After framework updates, run the `maintenance` skill — Phase B re-syncs the agent directory.
229
231
 
230
232
  Available skills:
231
233
 
@@ -239,16 +241,15 @@ Available skills:
239
241
  | `add-prompt` | Scaffold a new prompt definition |
240
242
  | `add-service` | Scaffold a new service integration |
241
243
  | `add-test` | Scaffold test file for a tool, resource, or service |
242
- | `add-export` | Add or evolve a public framework export without leaking internal module paths |
243
- | `add-provider` | Add a provider integration with config, lifecycle, errors, and tests |
244
244
  | `field-test` | Exercise tools/resources/prompts with real inputs, verify behavior, report issues |
245
245
  | `tool-defs-analysis` | Read-only audit of MCP definition language across the surface — voice, leaks, defaults, recovery hints, output descriptions |
246
246
  | `security-pass` | Audit server for MCP-flavored security gaps: output injection, scope blast radius, input sinks, tenant isolation |
247
247
  | `code-simplifier` | Post-session cleanup against `git diff` — modernize syntax, consolidate duplication, align with the codebase |
248
248
  | `techniques` | Catalog of response/data-shaping techniques — overflow handling, payload shaping, retrieval patterns |
249
249
  | `polish-docs-meta` | Finalize docs, README, metadata, and agent protocol for shipping |
250
- | `git-wrapup` | Land working-tree changes as a versioned commit + annotated tag — version bump, changelog, verify, tag. Local only. |
251
- | `release-and-publish` | Push + npm + MCP Registry + GH Release + Docker. Picks up from `git-wrapup` |
250
+ | `git-wrapup` | Land working-tree changes as a commit stack — version bump, changelog, verify, commit by concern. Opens a release PR only when the project declares release PR mode |
251
+ | `release-pr-review` | Review an open release PR, autosquash fixes into the stack, and keep the PR body in sync. Release PR mode only |
252
+ | `release-and-publish` | Tag + push + npm + MCP Registry + GH Release + Docker. Picks up from `git-wrapup` |
252
253
  | `maintenance` | Investigate changelogs, adopt upstream changes, sync skills to agent dirs |
253
254
  | `orchestrations` | Chain task skills into a gated multi-phase pipeline when sub-agents are available |
254
255
  | `report-issue-framework` | File a bug or feature request against `@cyanheads/mcp-ts-core` via `gh` CLI |
@@ -278,7 +279,8 @@ When you complete a skill's checklist, check the boxes and add a completion time
278
279
  | `bun run rebuild` | Clean + build |
279
280
  | `bun run clean` | Remove build artifacts |
280
281
  | `bun run devcheck` | Lint + format + typecheck + security + changelog sync |
281
- | `bun run audit:refresh` | Delete `bun.lock`, reinstall, re-audit. Use when `devcheck` flags a transitive advisory — stale lockfile can mask already-patched deps. If advisory survives, it's real. |
282
+ | `bun run audit:fix` | Upgrade vulnerable packages to the lowest safe version within existing ranges; `--dry-run` previews |
283
+ | `bun run audit:refresh` | Delete `bun.lock` and reinstall. Last resort after `audit:fix`, `bun update <name>`, and `bun dedupe`; re-resolves every ranged dependency |
282
284
  | `bun run lint:mcp` | Run the MCP definition linter standalone (rule catalog: `api-linter` skill) |
283
285
  | `bun run lint:packaging` | Packaging surface checks — `server.json`/`manifest.json` env-var parity (run by devcheck) |
284
286
  | `bun run list-skills` | Print the skill registry |
@@ -297,11 +299,11 @@ When you complete a skill's checklist, check the boxes and add a completion time
297
299
 
298
300
  ## Bundling
299
301
 
300
- `bun run bundle` produces a `.mcpb` extension bundle for one-click install in Claude Desktop. The pack step is followed by `scripts/clean-mcpb.ts`, which prunes dev dependencies (`mcpb clean`) and strips two classes of `node_modules/**` content that root-anchored `.mcpbignore` patterns cannot reach: dependency-shipped agent docs (`skills/`, `.claude/`, `.agents/`, `SKILL.md`) and platform-specific native bindings, which would otherwise lock the bundle to the platform it was packed on. MCPB is stdio-only — HTTP and Cloudflare Workers deployments are unaffected. Consumers who don't need it can delete `manifest.json` and `.mcpbignore`; `lint:packaging` skips cleanly.
302
+ `bun run bundle` produces a `.mcpb` extension bundle for one-click install in Claude Desktop. The pack step is followed by `scripts/clean-mcpb.ts`, which prunes dev dependencies (`mcpb clean`) and strips two classes of `node_modules/**` content that root-anchored `.mcpbignore` patterns cannot reach: dependency-shipped agent docs (`framework-skills/`, `skills/`, `.claude/`, `.agents/`, `SKILL.md`) and platform-specific native bindings, which would otherwise lock the bundle to the platform it was packed on. MCPB is stdio-only — HTTP and Cloudflare Workers deployments are unaffected. Consumers who don't need it can delete `manifest.json` and `.mcpbignore`; `lint:packaging` skips cleanly.
301
303
 
302
- **Adding an env var requires both files:** `server.json` (registry discovery, `environmentVariables[]`) and `manifest.json` (bundle install UX, `mcp_config.env` + `user_config`). `lint:packaging` (run by `devcheck`) verifies the env var names match.
304
+ **Adding an env var requires both files:** `server.json` (registry discovery, `environmentVariables[]`) and `manifest.json` (bundle install UX, `mcp_config.env` + `user_config`). Wire each option through `${user_config.<key>}` and give optional strings `default: ""`. `lint:packaging` checks wiring and env-name parity.
303
305
 
304
- **README install badges** (Claude Desktop `.mcpb`, Cursor, VS Code) and the `base64` / `encodeURIComponent` config-generation commands are ship-time concerns — run the `polish-docs-meta` skill, which carries the badge format, layout, and generation snippets in `skills/polish-docs-meta/references/readme.md`.
306
+ **README install badges** (Claude Desktop `.mcpb`, Cursor, VS Code) and the `base64` / `encodeURIComponent` config-generation commands are ship-time concerns — run the `polish-docs-meta` skill, which carries the badge format, layout, and generation snippets in `framework-skills/polish-docs-meta/references/readme.md`.
305
307
 
306
308
  ---
307
309
 
@@ -326,7 +328,7 @@ security: false # optional — true ONLY for a source
326
328
 
327
329
  `agent-notes` is an optional free-form field for maintenance agents processing the release downstream. Content here won't appear in the rendered CHANGELOG — it's consumed by agents running the `maintenance` skill. Use it for adoption instructions that don't fit the human-facing sections: new files to create, fields to populate, one-time migration steps. Omit entirely when there's nothing to say.
328
330
 
329
- **Section order** (Keep a Changelog): Added, Changed, Deprecated, Removed, Fixed, Security. Include only sections with entries — don't ship empty headers.
331
+ **Section order** (Keep a Changelog): Added, Changed, Deprecated, Removed, Fixed, Security, then Dependencies. Include only sections with entries — don't ship empty headers.
330
332
 
331
333
  **Tag annotations** render as GitHub Release bodies via `--notes-from-tag`. They must be structured markdown — never a flat comma-separated string. Subject omits the version number (GitHub prepends it). See `changelog/template.md` for the full format reference.
332
334
 
@@ -358,7 +360,7 @@ import { getMyService } from '@/services/my-domain/my-service.js';
358
360
  - [ ] If wrapping external API: tests include at least one sparse payload case with omitted upstream fields
359
361
  - [ ] Registered in `createApp()` arrays (directly or via barrel exports)
360
362
  - [ ] Tests use `createMockContext()` from `@cyanheads/mcp-ts-core/testing`
361
- - [ ] `.codex-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; `interface.displayName` = package name; `interface.shortDescription` from `package.json` description
362
- - [ ] `.codex-plugin/mcp.json` updated — server name key matches `package.json` name; env vars added for any required API keys
363
- - [ ] `.claude-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; inline `mcpServers` entry with server name key, env vars for any required API keys
363
+ - [ ] `.codex-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; `interface.displayName` = unscoped repo name; `interface.shortDescription` from `package.json` description
364
+ - [ ] `.codex-plugin/mcp.json` updated — server key is the unscoped repo name; user-supplied variables appear in `env_vars` so Codex forwards the host environment
365
+ - [ ] `.claude-plugin/plugin.json` populated — metadata from `package.json`; inline `mcpServers` keyed by the unscoped repo name. User-supplied variables are declared in `userConfig` and referenced through `${user_config.<option>}`, mirroring `manifest.json`. Optional strings have `default: ""`
364
366
  - [ ] `bun run devcheck` passes
package/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
 
8
8
  <div align="center">
9
9
 
10
- [![Version](https://img.shields.io/badge/Version-0.3.1-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/workflows-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-v2-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/workflows-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/workflows-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^7.0.2-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.4.0-blueviolet.svg?style=flat-square)](https://bun.sh/)
10
+ [![Version](https://img.shields.io/badge/Version-0.3.2-blue.svg?style=flat-square)](./CHANGELOG.md) [![License](https://img.shields.io/badge/License-Apache%202.0-orange.svg?style=flat-square)](./LICENSE) [![Docker](https://img.shields.io/badge/Docker-ghcr.io-2496ED?style=flat-square&logo=docker&logoColor=white)](https://github.com/users/cyanheads/packages/container/package/workflows-mcp-server) [![MCP SDK](https://img.shields.io/badge/MCP%20SDK-v2-green.svg?style=flat-square)](https://modelcontextprotocol.io/) [![npm](https://img.shields.io/npm/v/@cyanheads/workflows-mcp-server?style=flat-square&logo=npm&logoColor=white)](https://www.npmjs.com/package/@cyanheads/workflows-mcp-server) [![TypeScript](https://img.shields.io/badge/TypeScript-^7.0.2-3178C6.svg?style=flat-square)](https://www.typescriptlang.org/) [![Bun](https://img.shields.io/badge/Bun-v1.4.0-blueviolet.svg?style=flat-square)](https://bun.sh/)
11
11
 
12
12
  </div>
13
13
 
@@ -191,7 +191,7 @@ The repository ships a `workflows-yaml/` directory with example workflows organi
191
191
 
192
192
  ### Prerequisites
193
193
 
194
- - [Bun v1.3.0](https://bun.sh/) or higher (or Node.js v24+).
194
+ - [Bun v1.4.0](https://bun.sh/) or higher (or Node.js v24+).
195
195
  - A local directory containing YAML workflow files (or use the bundled `workflows-yaml/` seed).
196
196
 
197
197
  ### Installation
@@ -232,6 +232,7 @@ cp .env.example .env
232
232
  | `WATCHER_DEBOUNCE_MS` | Milliseconds to debounce filesystem change events before rebuilding the index. | `500` |
233
233
  | `MCP_TRANSPORT_TYPE` | Transport: `stdio` or `http`. | `stdio` |
234
234
  | `MCP_HTTP_PORT` | Port for HTTP server. | `3010` |
235
+ | `MCP_SESSION_MODE` | HTTP sessions: `auto`, `stateful`, or `stateless`. This server needs no caller-input round trips. | `stateless` in Docker and `.env.example`; framework `auto` resolves to `stateful` |
235
236
  | `MCP_AUTH_MODE` | Auth mode: `none`, `jwt`, or `oauth`. | `none` |
236
237
  | `MCP_LOG_LEVEL` | Log level (RFC 5424). | `info` |
237
238
  | `OTEL_ENABLED` | Enable [OpenTelemetry instrumentation](https://github.com/cyanheads/mcp-ts-core/tree/main/docs/telemetry) (spans, metrics, completion logs). | `false` |
@@ -305,7 +306,7 @@ See [`CLAUDE.md`](./CLAUDE.md) for development guidelines and architectural rule
305
306
 
306
307
  ## Contributing
307
308
 
308
- Issues and pull requests are welcome. Run checks and tests before submitting:
309
+ Issues are welcome. Run checks and tests before submitting:
309
310
 
310
311
  ```sh
311
312
  bun run devcheck
@@ -0,0 +1,49 @@
1
+ ---
2
+ summary: "The development skill tree moves out of the plugin-loaded skills/ path, and MCPB and plugin installers now collect the workflow directory, instructions path, debounce, and log level. Adopts mcp-ts-core 0.13.0; the Bun engines floor rises to 1.4.0."
3
+ breaking: false
4
+ security: false
5
+ ---
6
+
7
+ # 0.3.2 — 2026-09-13
8
+
9
+ ## Added
10
+
11
+ - **Installers collect this server's options** — `manifest.json` `user_config` and `.claude-plugin/plugin.json` `userConfig` declare `WORKFLOWS_DIR`, `GLOBAL_INSTRUCTIONS_PATH`, `WATCHER_DEBOUNCE_MS`, and `MCP_LOG_LEVEL`, each wired into the server environment as `${user_config.<key>}`; `.codex-plugin/mcp.json` names the same four in `env_vars` so Codex forwards host values. A blank answer arrives empty and takes the schema default.
12
+ - **`bun run audit:fix`** (mcp-ts-core 0.13.0) — upgrades vulnerable packages to the lowest safe version within the existing ranges.
13
+
14
+ ## Changed
15
+
16
+ - **The development skill tree moved from `skills/` to `framework-skills/`** (mcp-ts-core 0.13.0) — plugin hosts auto-load a root `skills/`, so installing this server's plugin no longer hands its 33 development skills to the agent.
17
+ - **Bun engines floor `>=1.3.0` → `>=1.4.0`** (mcp-ts-core 0.12.9), required by the framework's mirror driver fix. The README prerequisite follows.
18
+ - **A blank or whole-value `${…}` environment value reads as unset** (mcp-ts-core 0.13.0) — `WORKFLOWS_DIR`, `GLOBAL_INSTRUCTIONS_PATH`, and `WATCHER_DEBOUNCE_MS` take their schema defaults rather than the unsubstituted placeholder text an installer can leave behind.
19
+ - **Schema-invalid tool arguments return the structured `InvalidParams` (-32602) envelope** (mcp-ts-core 0.12.7), before the handler runs.
20
+ - **`lint:packaging` checks MCPB `user_config` wiring and plugin-manifest version parity** (mcp-ts-core 0.13.0, 0.12.7) — an undeclared `${user_config.<key>}` reference, a declared-but-unreferenced option, an optional string without `"default": ""`, or a plugin `version` out of step with `package.json` now fails `devcheck`.
21
+ - **`docs/design.md` reconciled with as-built** — `workflow_delete`, the `workflow_list` `query` filter, the current `WorkflowSchema`, and the per-tool error contracts replace the pre-build sketch.
22
+ - **Issue forms accept blank issues and link the private advisory form** (mcp-ts-core 0.13.0), and both plugin manifests carry full author metadata.
23
+
24
+ ## Removed
25
+
26
+ - **Framework configuration no longer recognizes `MCP_RESPONSE_VERBOSITY` or the `OAUTH_PROXY_*` block** (mcp-ts-core 0.12.8). Neither appeared in this server's `.env.example`; drop them from any deployment that set them.
27
+
28
+ ## Fixed
29
+
30
+ - **A trailing slash on `MCP_PUBLIC_URL` no longer doubles** in landing-page links or the `/.well-known/mcp.json` server card (mcp-ts-core 0.12.8).
31
+ - **A cancelled request's SSE stream closes immediately** instead of holding open to keep-alive or session expiry (mcp-ts-core 0.12.9).
32
+ - **The landing page's curl snippet sends a handshake `initialize` accepts** (mcp-ts-core 0.12.9).
33
+
34
+ ## Dependencies
35
+
36
+ Runtime:
37
+
38
+ - `@cyanheads/mcp-ts-core` `^0.12.5` → `^0.13.0`
39
+ - `zod` `^4.5.4` → `^4.6.1`
40
+
41
+ Development:
42
+
43
+ - `@biomejs/biome` `2.5.11` → `2.5.13`
44
+ - `@types/node` `26.4.0` → `26.5.1`
45
+ - `ignore` `^7.0.8` → `^7.0.9`
46
+ - `tsc-alias` `^1.9.3` → `^1.9.4`
47
+ - `vitest` `^4.1.11` → `^5.0.0`, `@vitest/coverage-istanbul` `4.1.11` → `5.0.0`
48
+
49
+ `bun audit` reports no vulnerabilities across 295 packages.
@@ -117,30 +117,13 @@ security: false
117
117
  in that unrelated item's metadata.
118
118
 
119
119
  TAG ANNOTATIONS — the annotated tag body renders as the GitHub Release body
120
- via `gh release create --notes-from-tag`. The tag is a derivative of this
121
- changelog entry a condensed, scannable version, not a copy. Format:
122
-
123
- <theme omit version number, GitHub prepends it>
124
- blank line
125
- <1-2 sentence context: what this release does>
126
- blank line
127
- Dependency bumps: ← section header
128
- ← blank line
129
- - `@cyanheads/mcp-ts-core` ^0.9.1 → ^0.9.6 ← bullet
130
- ← blank line
131
- Changed: ← only sections with entries
132
- ← blank line
133
- - `format()` output includes `query` in text mode
134
- ← blank line
135
- Added:
136
- ← blank line
137
- - `manifest.json` scaffolded for MCPB bundle support
138
- - Install badges (Claude Desktop, Cursor, VS Code)
139
- ← blank line
140
- <N> tests pass; `bun run devcheck` clean. ← footer
141
-
142
- Never a flat comma-separated string. Always structured markdown with
143
- sections. The tag must scan well as a rendered GitHub Release page.
120
+ via `gh release create --notes-from-tag`. It is a condensed digest of this
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.
144
127
  -->
145
128
 
146
129
  ## Added
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cyanheads/workflows-mcp-server",
3
- "version": "0.3.1",
3
+ "version": "0.3.2",
4
4
  "mcpName": "io.github.cyanheads/workflows-mcp-server",
5
5
  "description": "Store, query, and create YAML workflow playbooks for LLM agents via MCP. STDIO or Streamable HTTP.",
6
6
  "type": "module",
@@ -24,6 +24,7 @@
24
24
  "rebuild": "bun run scripts/clean.ts && bun run scripts/build.ts",
25
25
  "clean": "bun run scripts/clean.ts",
26
26
  "devcheck": "bun run scripts/devcheck.ts",
27
+ "audit:fix": "bun audit fix",
27
28
  "audit:refresh": "rm -f bun.lock && bun install && bun audit",
28
29
  "tree": "bun run scripts/tree.ts",
29
30
  "list-skills": "bun run scripts/list-skills.ts",
@@ -78,30 +79,30 @@
78
79
  "license": "Apache-2.0",
79
80
  "packageManager": "bun@1.4.0",
80
81
  "engines": {
81
- "bun": ">=1.3.0",
82
+ "bun": ">=1.4.0",
82
83
  "node": ">=24.0.0"
83
84
  },
84
85
  "publishConfig": {
85
86
  "access": "public"
86
87
  },
87
88
  "dependencies": {
88
- "@cyanheads/mcp-ts-core": "^0.12.5",
89
+ "@cyanheads/mcp-ts-core": "^0.13.0",
89
90
  "pino-pretty": "^13.1.3",
90
91
  "semver": "^7.8.5",
91
92
  "yaml": "^2.9.0",
92
- "zod": "^4.5.4"
93
+ "zod": "^4.6.1"
93
94
  },
94
95
  "devDependencies": {
95
- "@biomejs/biome": "2.5.11",
96
+ "@biomejs/biome": "2.5.13",
96
97
  "@socketsecurity/bun-security-scanner": "^1.1.2",
97
- "@types/node": "26.4.0",
98
+ "@types/node": "26.5.1",
98
99
  "@types/semver": "^7.8.0",
99
- "@vitest/coverage-istanbul": "4.1.11",
100
+ "@vitest/coverage-istanbul": "5.0.0",
100
101
  "depcheck": "^1.4.7",
101
102
  "fast-check": "^4.9.0",
102
- "ignore": "^7.0.8",
103
- "tsc-alias": "^1.9.3",
103
+ "ignore": "^7.0.9",
104
+ "tsc-alias": "^1.9.4",
104
105
  "typescript": "^7.0.2",
105
- "vitest": "^4.1.11"
106
+ "vitest": "^5.0.0"
106
107
  }
107
108
  }
package/server.json CHANGED
@@ -6,14 +6,14 @@
6
6
  "url": "https://github.com/cyanheads/workflows-mcp-server",
7
7
  "source": "github"
8
8
  },
9
- "version": "0.3.1",
9
+ "version": "0.3.2",
10
10
  "packages": [
11
11
  {
12
12
  "registryType": "npm",
13
13
  "registryBaseUrl": "https://registry.npmjs.org",
14
14
  "identifier": "@cyanheads/workflows-mcp-server",
15
15
  "runtimeHint": "bun",
16
- "version": "0.3.1",
16
+ "version": "0.3.2",
17
17
  "packageArguments": [
18
18
  { "type": "positional", "value": "run" },
19
19
  { "type": "positional", "value": "start:stdio" }
@@ -57,7 +57,7 @@
57
57
  "registryBaseUrl": "https://registry.npmjs.org",
58
58
  "identifier": "@cyanheads/workflows-mcp-server",
59
59
  "runtimeHint": "bun",
60
- "version": "0.3.1",
60
+ "version": "0.3.2",
61
61
  "packageArguments": [
62
62
  { "type": "positional", "value": "run" },
63
63
  { "type": "positional", "value": "start:http" }