@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 +21 -19
- package/CLAUDE.md +21 -19
- package/README.md +4 -3
- package/changelog/0.3.x/0.3.2.md +49 -0
- package/changelog/template.md +7 -24
- package/package.json +11 -10
- package/server.json +3 -3
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.
|
|
5
|
-
**Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.
|
|
6
|
-
**Engines:** Bun ≥1.
|
|
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.
|
|
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.
|
|
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
|
|
251
|
-
| `release-
|
|
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:
|
|
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`
|
|
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` =
|
|
362
|
-
- [ ] `.codex-plugin/mcp.json` updated — server
|
|
363
|
-
- [ ] `.claude-plugin/plugin.json` populated —
|
|
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.
|
|
5
|
-
**Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.
|
|
6
|
-
**Engines:** Bun ≥1.
|
|
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.
|
|
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.
|
|
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
|
|
251
|
-
| `release-
|
|
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:
|
|
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`
|
|
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` =
|
|
362
|
-
- [ ] `.codex-plugin/mcp.json` updated — server
|
|
363
|
-
- [ ] `.claude-plugin/plugin.json` populated —
|
|
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
|
-
[](./CHANGELOG.md) [](./LICENSE) [](https://github.com/users/cyanheads/packages/container/package/workflows-mcp-server) [](https://modelcontextprotocol.io/) [](https://www.npmjs.com/package/@cyanheads/workflows-mcp-server) [](https://www.typescriptlang.org/) [](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.
|
|
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
|
|
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.
|
package/changelog/template.md
CHANGED
|
@@ -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`.
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
93
|
+
"zod": "^4.6.1"
|
|
93
94
|
},
|
|
94
95
|
"devDependencies": {
|
|
95
|
-
"@biomejs/biome": "2.5.
|
|
96
|
+
"@biomejs/biome": "2.5.13",
|
|
96
97
|
"@socketsecurity/bun-security-scanner": "^1.1.2",
|
|
97
|
-
"@types/node": "26.
|
|
98
|
+
"@types/node": "26.5.1",
|
|
98
99
|
"@types/semver": "^7.8.0",
|
|
99
|
-
"@vitest/coverage-istanbul": "
|
|
100
|
+
"@vitest/coverage-istanbul": "5.0.0",
|
|
100
101
|
"depcheck": "^1.4.7",
|
|
101
102
|
"fast-check": "^4.9.0",
|
|
102
|
-
"ignore": "^7.0.
|
|
103
|
-
"tsc-alias": "^1.9.
|
|
103
|
+
"ignore": "^7.0.9",
|
|
104
|
+
"tsc-alias": "^1.9.4",
|
|
104
105
|
"typescript": "^7.0.2",
|
|
105
|
-
"vitest": "^
|
|
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.
|
|
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.
|
|
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.
|
|
60
|
+
"version": "0.3.2",
|
|
61
61
|
"packageArguments": [
|
|
62
62
|
{ "type": "positional", "value": "run" },
|
|
63
63
|
{ "type": "positional", "value": "start:http" }
|