n8nctl vs other n8n CLIs¶
Several command-line clients exist for n8n, built by different people for
different jobs. This page maps the landscape honestly and shows where each tool
fits — including where the others are a better choice than n8nctl.
As of June 2026: n8nctl 0.3.0, @n8n/cli 0.8.0, ubie-oss/n8n-cli 2.2.1,
yigitkonur/n8n-cli 1.9.3, edenreich/n8n-cli 0.7.1. They all talk to the same
n8n public API, so the CRUD surface converges over time; the real differences are
in focus, runtime, and the layers each tool adds on top.
The cast¶
@n8n/cli(binaryn8n-cli) — the official, first-party CLI from the n8n team. Node.js/oclif, distributed on npm, currently beta ("for experimenting, local development, and personal projects"). The reference client for the public API; tracks new endpoints first.n8nctl(this project) — an independent, single-binary Go client focused on multi-instance operation, workflows-as-code, and driving n8n from AI agents.ubie-oss/n8n-cli— an independent Bun binary focused on workflow authoring quality: deep linting, node-schema inspection, formatting, data-flow tracing, and a server-side lint-enforcement proxy.yigitkonur/n8n-cli— an independent Node CLI focused on workflow intelligence. It bundles n8n's own packages (n8n-nodes-base,n8n-workflow) and a SQLite node catalog to validate and auto-repair workflows offline, explore the node library, detect cross-version breaking changes, and deploy from the n8n template gallery.edenreich/n8n-cli— an independent Go binary focused on one job: GitOps sync of workflows from a directory to an instance.
These tools are not all trying to be the same thing. The useful question is not "which is best" but "which lane is yours."
At a glance¶
| n8nctl | @n8n/cli | ubie-oss | yigitkonur | edenreich | |
|---|---|---|---|---|---|
| Vendor | 3rd-party | first-party | 3rd-party | 3rd-party | 3rd-party |
| Runtime | Go static binary | Node + npm | Bun binary | Node + npm | Go binary |
| Primary lane | ops + GitOps + agent mgmt | first-party general | authoring quality | workflow intelligence | GitOps sync |
| CRUD breadth | full + data-tables + packages + nodes + templates |
full + data-tables + packages | full + data-tables | full + nodes + templates |
workflows only |
| Multi-instance | profiles + keyring | single, plaintext | single, env | multi-profile, plaintext | single, .env |
| Apply from files | apply (prune, cross-instance) |
— | apply (+ git-changes) |
import / export | sync (+ prune) |
| Validation | node-schema lint (type + params + values) + autofix + breaking-changes + proxy gate |
— | node-schema lint + proxy gate |
offline validate + autofix + breaking-changes | — |
| Templates / node catalog | templates + nodes catalog |
— | node-schema dump |
templates + node catalog (FTS5) | — |
| Agent tooling | mcp + agent guard |
— | — | — | — |
| backup / restore / sync / search | all four | — | — | export/import + version history | sync |
| Secrets | OS keyring | plaintext | plaintext | plaintext | plaintext |
| Distribution | brew / scoop / deb-rpm-apk + cosign + SBOM | npm | source / cross-compile | npm | curl / go install |
Where each tool fits¶
First-party API client — @n8n/cli¶
Built and maintained by the n8n team alongside the API, so it tracks new endpoints
and changes immediately and is the tool the n8n docs point to. It has thoughtful
scripting defaults — it auto-selects JSON when stdout is piped and
auto-paginates lists by default — and npx @n8n/cli is zero-friction inside a
Node project. It is single-instance (one {url, apiKey} in a plaintext config,
no keyring), issues a single fetch with no retry or rate limiting, and is
labelled not-for-production. Use it if you want the first-party tool, work
with one instance, already live in Node, or need brand-new endpoints on day one.
Workflow authoring & quality — ubie-oss/n8n-cli¶
The deepest authoring tool, and ahead of n8nctl on workflow quality. Its
lint ships rules including node-params, which validates node parameter
values against the schema, backed by a node-schema command that dumps the
real node-type schemas. (n8nctl now validates node types and parameter names
against an embedded catalog too, but ubie checks parameter values and types more
deeply.) fmt tidies node layout, trace analyses data-flow cardinality,
and proxy is a distinctive idea ubie pioneered: an HTTP proxy in front of the
n8n API that enforces lint server-side, so any push that fails lint — from a
human or an AI agent — is rejected with a 422, making quality structural rather
than a convention. (n8nctl has since adopted the same pattern in n8nctl proxy;
ubie's remains deeper — more rules, schema-aware validation, and duplicate-name
rejection.) It is single-instance (env vars, no keyring) and has no MCP or
agent-management layer. Use it if your priority is keeping a team's workflow
definitions clean, schema-valid, and consistently formatted.
Workflow intelligence — yigitkonur/n8n-cli¶
The most workflow-aware tool of the five, and the deepest on correctness. It
bundles n8n's real packages (n8n-nodes-base, n8n-workflow) and a SQLite,
FTS5-indexed catalog of every node, which unlocks things no other CLI here does:
offline workflows validate (check a workflow against the actual node
definitions with no running instance), workflows autofix (auto-repair
expression prefixes, missing webhook paths, Switch v3 conditions, and node-type
typos, applied confidence-filtered), a nodes explorer (list, search,
show, and breaking-changes --from <v> --to <v> for cross-version
compatibility), templates search/get with workflows deploy-template, plus
surgical partial edits, local version history with rollback, diff, trigger,
bulk, and health. n8nctl now does node-type and parameter-name validation
against an embedded catalog, but this tool goes further — schema-accurate value
validation and automatic repair.
It is single-purpose in the other direction: no MCP, no agent guard, no GitOps
reconcile with prune, no cross-instance sync, no OS keyring (credentials sit in a
plaintext .n8nrc.json), and it needs a Node runtime (npm-only, no signed
binary). Use it if your priority is validating, repairing, and authoring
correct workflows against real node schemas — it is the strongest tool here for
that.
GitOps sync — edenreich/n8n-cli¶
Does one job cleanly. workflows sync --directory --prune --dry-run reconciles a
folder of workflow JSON into an instance; refresh pulls the other way; plus
activate/deactivate. It is workflow-only (no executions, credentials, tags,
projects, …), single-instance, and reads the key from a plaintext .env. Use
it if all you need is "push this folder of workflows to this instance in CI" with
the least surface to learn.
Multi-instance operations, GitOps & agent management — n8nctl¶
This project's lane. It is the only one of the four that combines:
- Multi-instance profiles + OS keyring. Named profiles, one per instance,
switched with
--profile/N8NCTL_PROFILE/config use; keys in the macOS Keychain / Linux Secret Service / Windows Credential Manager. The others target a single instance with the key in a plaintext file or env var. - Production resilience. Exponential backoff with jitter, idempotency-aware retries (never retries POST/PATCH), adaptive rate limiting, and 429 handling.
- Workflows as code.
workflows apply --dirreconciles a directory into an instance (create / update / skip-unchanged /--prune, with a--dry-runplan);workflows lint(schema-grounded rules as a CI gate),diff, andconvert(JSON↔YAML with long code fields externalised to sibling files). Both ubie and edenreich do declarative apply too;n8nctl's differentiator is that, combined with profiles, the same directory promotes across instances. - Manage instances from an AI agent.
n8nctl mcpruns the CLI as a Model Context Protocol server (73 annotated tools, reusing keyring auth and the active profile) andn8nctl agent guardgenerates host rules that hard-block destructive operations. See the layer note. - Lint enforcement at the boundary.
n8nctl proxy(adopting ubie's idea) fronts the instance and rejects any workflow create/update that fails lint with a 422, so bad definitions can't land regardless of who pushes them. - Fleet operations:
backup/restore(git-friendly snapshots),workflows search(find by node type / credential / webhook path), cross-instancesync. - Richer output (table / json / yaml / csv,
--columns,--jqvia full gojq,-o id),--dry-runthat prints a redactedcurl, and a signed, multi-channel distribution (Homebrew/Scoop/deb/rpm/apk + cosign + SBOM).
Use it if you operate several instances, want no Node and a signed single binary, value keyring security and production resilience, keep workflows as code across environments, drive n8n from an AI agent, or want backup / promote / search across a fleet.
Where the others are genuinely better than n8nctl¶
@n8n/cli— first-party and tracks new endpoints first; auto-JSON-on-pipe and auto-pagination are nicer scripting defaults; npm-native for Node projects.ubie-oss/n8n-cli— schema-aware linting (node-params+node-schema),fmt, andtracemake it strong for authoring quality.n8nctladopted ubie's server-side lint-enforcementproxyidea (n8nctl proxy, now with duplicate-name rejection); ubie still shipsfmtandtrace, whichn8nctldoes not.yigitkonur/n8n-cli— a deep validation engine: node-type and parameter checks, autofix, cross-version breaking-change detection, a searchable node catalog, and template deployment.n8nctlnow matches each of these (workflows autofix,workflows breaking-changes,nodes,templates); the two are closely comparable on workflow intelligence.n8nctldoes node-schema-aware linting validated against an embedded catalog of n8n's real node definitions:unknown-node-typeandunknown-parameter, plusinvalid-parameter-value(option values resolved through each node'sdisplayOptions). Combined withautofix,breaking-changes,nodes, andtemplates, the workflow-intelligence gap thatubieandyigitkonuronce held is largely closed; ubie's remaining edge isfmt/trace.edenreich/n8n-cli— if you want only GitOps sync and nothing else, it is smaller and has less to learn.
A note on MCP and agents¶
n8nctl's MCP server operates at a different layer from n8n's own MCP support, and
is complementary to it. n8n the platform is already MCP-native at the workflow
layer — the MCP Server Trigger node turns a workflow into an MCP server
(agents call your workflows as tools) and the MCP Client Tool node lets a
workflow consume external MCP tools. That is the data plane: automations exposed
as tools. n8nctl mcp is the control plane: it exposes the n8n management
API (list / create / activate / delete workflows, manage credentials, projects,
executions, across instances) so an agent can operate and administer a fleet.
None of the other CLIs expose their management surface over MCP.
Performance¶
A single API call is network-bound: per-request time is dominated by the instance's latency, not the CLI. The CLI's own processing is in the microseconds:
| Operation (50-record page, no network) | n8nctl |
|---|---|
| Decode a list page | ~50 µs |
| Render a table | ~150 µs |
| Render JSON | ~80 µs |
Apply a --jq filter (full gojq) |
~90 µs |
The one place a CLI's own cost is visible is process startup, paid on every
invocation. The numbers below are measured (hyperfine, warm, 40 runs of
--help on an Apple-silicon Mac); the two Go binaries start ~20–40× faster than
anything running a JavaScript runtime:
| CLI | Runtime | Startup (warm) | Footprint |
|---|---|---|---|
| n8nctl | Go static | 5.5 ms | one 15 MB binary, no runtime |
| edenreich | Go static | 4.6 ms | one 11 MB binary, no runtime |
| @n8n/cli | Node | 108 ms | 5.7 MB node_modules + a Node runtime |
| yigitkonur | Node | 136 ms | 514 MB node_modules + a Node runtime |
| ubie | Bun compiled | 197 ms | one 59 MB binary (Bun runtime embedded) |
Two findings stand out. A Bun-compiled binary is not a fast-start binary: ubie
is the slowest of the five, because the single file still boots the embedded Bun
runtime and its bundled modules on every call. And yigitkonur depends on
isolated-vm (a native V8 module, for sandboxed expression evaluation) which
fails to compile on current Node and pulls a 514 MB node_modules — a
portability cost a static Go binary does not have.
For a single command none of this matters next to a network round-trip. It adds
up when the CLI is invoked many times — a loop over 200 ids, an xargs
pipeline, or a CI job — where ~150 ms each becomes ~30 s of overhead versus ~1 s
for a fast-starting binary.
Measured on Apple Silicon with hyperfine --warmup 3 --runs 40; Node startup has
high variance. Reproduce with go test -bench=. ./internal/... and
hyperfine -N 'n8nctl version' 'n8n-cli --version'.
Which should you use?¶
@n8n/cli— the official tool; single instance, Node-native, newest endpoints.ubie-oss/n8n-cli— authoring quality: schema-aware lint, formatting, and server-side lint enforcement.yigitkonur/n8n-cli— workflow correctness: offline validation, autofix, node catalog, breaking-change detection, and template deployment.edenreich/n8n-cli— minimal GitOps sync, nothing else.n8nctl— multiple instances, no Node + a signed binary, keyring security, production resilience, workflows-as-code across environments, fleet backup/promote/search, and agent management (MCP + guard).
Many teams will reasonably use more than one — for example, yigitkonur or ubie
to validate and author workflows, and n8nctl to operate the fleet, promote
across instances, manage it from an agent, and back it up.