Releases: lidless-labs/n8nctrl
Release list
n8nctrl v0.14.2
Full Changelog: v0.14.1...v0.14.2
n8n-ops-mcp v0.14.1
What's Changed
- fix: strip MCP schema marker and refresh dependencies by @solomonneas in #1
- docs: OSS adoption upgrade by @solomonneas in #2
- chore: align package.json URLs with the lidless-labs org by @solomonneas in #3
- docs: switch README badges to shieldcn by @solomonneas in #4
- ci: skip CI on docs-only changes by @solomonneas in #5
- docs: align README with the fleet spine by @solomonneas in #6
New Contributors
- @solomonneas made their first contribution in #1
Full Changelog: v0.14.0...v0.14.1
v0.14.0
v0.13.0
v0.12.0: n8n_list_schedules
Answers the most common cron ops question — "what's running at 3am?" — that n8n's UI doesn't surface anywhere obvious.
Added
- `n8n_list_schedules` — read-only scanner that walks every workflow for `n8n-nodes-base.scheduleTrigger` and legacy `n8n-nodes-base.cron` nodes and decodes each interval rule into a human-readable string. Supported rule fields: `seconds` / `minutes` / `hours` / `days` / `weeks` (with multi-day `triggerAtDay`) / `months` plus raw `cronExpression`. Multi-interval rules emit one row per interval. Each row includes workflow context, node name/type, the human description, the rule field, optional `cronExpression`, and the original `raw` rule for further inspection. Optional `workflowId` (single-workflow scan), `activeOnly` (default true — inactive schedules don't fire), `limit` (default 100, max 250).
Examples of decoded schedules
- `every 2 hours at :30`
- `daily at 03:00`
- `weekly on Monday, Wednesday, Friday at 09:15`
- `monthly on day 1 at 06:00`
- `cron: 0 */6 * * *`
Notes
- Pairs naturally with `n8n_audit_browser_bridge_usage` (which schedules drive my browser-bridge calls?) and `n8n_diff_workflow` (did the cron rule change since the snapshot?).
- 11 new tests; full suite 172/172 green.
v0.11.0: pin/unpin node data tools
Edit-mode tools for managing pinned node data during workflow development. Pairs with n8n_scaffold_browser_bridge_node — scaffold a call, run it once, pin the output, iterate downstream nodes without re-spawning the browser.
Added
n8n_pin_node_data— pin sample data on a single node so downstream nodes use it during development/testing without re-running the upstream node. Inputs:id,nodeName(validated to exist in the workflow),data(1-50 items; raw objects auto-wrap into{json: <object>}, fully-shaped{json, binary?}items pass through), optionalmerge: trueto append (combined still ≤50),confirm: true. PUT body includes nodes/connections/settings/staticData from current state so those fields are not blanked. Response includesunpinHintsince pinned data is easy to forget about.n8n_unpin_node_data— clear pinned data on one node (nodeNamesupplied) or the whole workflow (nodeNameomitted). Idempotent: clearing a node that wasn't pinned returnsok: true, noop: trueand never touches the API. Confirm-gated.
Notes
- Both go through PUT
/workflows/:id(n8n's Public API doesn't have a dedicated pinData endpoint). They useclient.saveWorkflowbut bypass the snapshot+validation ofn8n_save_workflowsince pin/unpin only mutatepinDataand the change is reversible via the sibling tool. - 16 new tests; full suite 161/161 green.
v0.10.0: n8n_diff_workflow
Closes the snapshot/restore loop opened in 0.7/0.8 — you could save and restore but had no way to see what changed.
Added
n8n_diff_workflow— read-only semantic diff between a workflow's current state and a snapshot. Inputs:idplus exactly one ofsnapshotPath(absolute file path;~resolved) orsnapshot(inline object). Snapshot accepts both shapes: flat (n8n_save_workflow/n8n_delete_workflowbackup) and nested (n8n_get_workflow(includeDefinition=true)). Returns counters insummary(added/removed/modified, plus nameChanged/connectionsChanged/settingsChanged) and adiffpayload with per-nodefieldsChangedpaths walking one level intoparameters(e.g.parameters.command,parameters.url).
Notes
- Two-pass node matching: id-first, name-fallback for any unmatched nodes. Handles legacy/hand-edited snapshots without forcing a "1 added + 1 removed" false signal when one side is missing ids.
- Cosmetic noise suppression:
positionandwebhookIdchanges are suppressed by default; toggle withignoreCosmetic: false. - Bounded output: per-node detail capped at
maxModifiedDetails(default 50, max 500) with explicitnodesModifiedTruncatedflag;summarycounters are uncapped. - Pairs with
n8n_save_workflow(which writes the snapshot) andn8n_audit_browser_bridge_usage(which surfaces calls — diff tells you whether they've drifted).
15 new tests, full suite 145/145 green.
v0.9.0: browser-bridge audit + scaffold tools
First n8n-ops-mcp pieces designed to compose with browser-bridge end-to-end.
Added
n8n_audit_browser_bridge_usage— read-only scanner that walks every workflow and surfaces nodes calling thebrowser-bridgeCLI (Execute Command, Code, SSH, legacy Function). Returns one finding per(workflowId, nodeName, platform, action)plus a per-platform action summary. Optional filters:platform,action,activeOnly,includeArchived. Paginates via cursor up tomaxWorkflows(default 250, max 1000) with bounded-concurrencygetWorkflowfan-out (default 3, max 8). Per-workflow fetch failures land infetchErrorsinstead of failing the whole audit. Detection regex requires.js/.cjs/.mjsextension to avoid false positives from path mentions likecd /opt/browser-bridge.n8n_scaffold_browser_bridge_node— pure local generator (no n8n API call) that emits a ready-to-paste n8n node callingbrowser-bridge <platform> <action>. Two modes:code-node(default;spawnSyncwith stdin JSON, surfacesexitCode+stderr) andexecute-command(quoted<<'JSON'heredoc). Mirrors the patterns in browser-bridge'sdocs/n8n-usage.md. Validatesplatformandactionas kebab slugs to keep them safe to interpolate into shell commands. Warns whenexecute-commandmode is paired with non-emptyinput(heredoc bakes input in; no per-item wiring).
Why
The audit + scaffold pair answer two real questions that were previously a manual grep job: "where am I calling Linktree sync from?" and "how do I add a CoderLegion scan-comments step without copy-pasting the spawn shape from docs every time?"
Both tools are read-only / local-only — registered before the enableEdit gate. Full suite green at 130/130.
v0.8.1 - harness-agnostic docs, CHANGELOG
Docs-only release. No behavior changes.
Changed
- README reframed as MCP-first (any MCP-compatible client) while preserving the "built for OpenClaw" origin story and first-class plugin path.
- Client setup section reordered: Claude Desktop, Claude Code, Codex CLI, Cursor/Windsurf, Hermes Agent, then OpenClaw (the first-class plugin path).
- Refreshed
package.jsonandopenclaw.plugin.jsondescriptions to cover the full workflow + execution lifecycle added in 0.7/0.8 (create, save, archive, delete, cancel, retry). - Added
CHANGELOG.mdbackfilled from git log (0.1.0 through 0.8.1), Keep-a-Changelog format.
Full diff: https://github.com/solomonneas/n8n-ops-mcp/compare/v0.8.0...v0.8.1
v0.8.0 - n8n_create_workflow (closes workflow lifecycle)
Added
n8n_create_workflow-POST /workflows. Accepts the full output ofn8n_get_workflow(withincludeDefinition=true) directly. Strips read-only fields (id,active,createdAt,updatedAt,isArchived,versionId,triggerCount,tags,shared,meta,pinData) before POSTing. Runsn8n_validate_workflowon the proposed state as a pre-check; errors block, warnings pass through (skipValidation: trueto bypass). No confirm gate - creation is non-destructive. The new workflow is created INACTIVE; calln8n_activateafterwards if you want triggers running.
Why
Closes the workflow lifecycle. Restore after n8n_delete_workflow is now one-call: read the backup file into `definition` and pass it to n8n_create_workflow. The restored workflow gets a new id.
Also enables cloning: n8n_get_workflow(includeDefinition=true) -> edit name in-place -> n8n_create_workflow.
Full diff: https://github.com/solomonneas/n8n-ops-mcp/compare/v0.7.0...v0.8.0