n8n-mcp
- Type
- MCP server
- Scanned
- Oct 29, 2026
- Version
- f7a454661701
- Files read
- 970
This MCP server gives AI assistants access to n8n node documentation, workflow validation tools, and live management of workflows, credentials, and executions on a connected n8n instance. The biggest risks are that it grants the AI full control to modify, run, or delete live workflows and credentials on your n8n server, and it sends sanitized workflow structures, search queries, and usage telemetry to an external server by default.
What it can reach
- Network
- Connects to the configured n8n instance API, webhooks, and MCP endpoints, fetches templates and version info from api.n8n.io, GitHub, and npm, and sends usage and workflow telemetry to telemetry.n8n-mcp.com by default.
- Files
- Reads and writes the local SQLite database (data/nodes.db), telemetry configuration (~/.n8n-mcp/telemetry.json), temporary batch files, bundled skill documentation, and optional token or Docker config files.
- Secrets
- Reads n8n API keys, MCP access tokens, Cloudflare Access tokens, HTTP auth tokens, and OpenAI API keys from environment variables or request headers, and can create, update, list, or delete credentials on the connected n8n instance.
- Shell commands
- Runs git clone and git pull commands during documentation rebuilds and can spawn stdio child processes through its MCP client utility.
- System
- Reads OS hostname, platform, architecture, home directory path, and Linux /proc system files to generate a persistent installation ID for telemetry.
Findings
-
MediumMismatched tenant headers on an existing session fall back to the stored tenant's credentials
src/http-server-single-session.ts:977
In multi-tenant HTTP mode with the default 'instance' session strategy, when a non-initialize request supplies an existing Mcp-Session-Id, handleRequest initializes requestContext to this.sessionContexts[sessionId] and only refreshes it if the incoming instanceContext matches both the stored instanceId and n8nApiUrl. If a request arrives with a different tenant's x-n8n-url, x-n8n-key, or x-instance-id headers alongside an existing session ID, the mismatch is not rejected and the request executes using the session owner's stored n8n credentials.
Fix: When ENABLE_MULTI_TENANT is enabled and sessionStrategy is 'instance', reject any request whose instanceContext does not match the stored session's instanceId and n8nApiUrl (or lacks tenant headers) with HTTP 403.
-
MediumTelemetry is enabled by default and sends workflow structures and mutations externally
src/mcp/handlers-n8n-manager.ts:703
Unless N8N_MCP_TELEMETRY_DISABLED=true is set in the environment, the server enables telemetry by default and transmits tool usage, search queries, error details, created/validated workflow definitions, and partial/full workflow mutation payloads (including before/after workflow snapshots and user intent) to an external telemetry service.
Fix: Make telemetry opt-in by default (disabled unless explicitly enabled by the user) and avoid transmitting workflow definitions or mutation snapshots.
-
MediumTelemetry is enabled by default and uploads sanitized workflows, queries, and user intents
src/telemetry/config-manager.ts:198
On first run, telemetry is enabled by default unless an opt-out environment variable (such as N8N_MCP_TELEMETRY_DISABLED=true) is set. When enabled, TelemetryEventTracker and MutationTracker send tool usage, search queries, user intent strings, diff operations, and sanitized workflow definitions (including node parameters such as Code node scripts and AI prompts) to https://telemetry.n8n-mcp.com. Although WorkflowSanitizer strips known secret patterns, URLs, and email addresses, proprietary business logic, prompts, and internal field names in workflows can still leave the user's machine without explicit opt-in.
Fix: Change the default telemetry configuration to opt-in (enabled: false by default) or limit default telemetry to minimal aggregate counters without uploading workflow structures, node parameters, or user intent text.
-
MediumTelemetry is enabled by default and uploads sanitized workflow structures and intents
Telemetry is enabled by default across local, npx, and Docker installations. Beyond basic usage counters, it transmits the free-text intent argument and sanitized workflow structures (including node names, connections, and any node parameters that survive pattern-based redaction) to telemetry.n8n-mcp.com to build datasets and train machine learning models that may be licensed to third parties. Because redaction is pattern-based, proprietary workflow logic or custom secret formats in node parameters could leave the user's machine without explicit opt-in.
Fix: Set N8N_MCP_TELEMETRY_DISABLED=true in your MCP client environment configuration or run
npx n8n-mcp telemetry disable. -
MediumWorkflow creation, execution, and credential management tools enabled by default
When N8N_API_URL and N8N_API_KEY are provided, all n8n management tools are enabled by default, allowing the agent to create, update, delete, and trigger workflows (including JavaScript/Python Code nodes) and manage credentials or data tables. If the agent processes untrusted content containing a prompt injection, an attacker could execute arbitrary workflow code on the n8n server or delete workflows.
Fix: Set DISABLED_TOOLS and DISABLED_TOOL_OPERATIONS in the environment (as shown in the Read-Only Deployment section of README.md) and use a least-privilege n8n API key.
-
MediumTelemetry is enabled by default and sends sanitized workflow data off-machine
Anonymous usage telemetry is enabled by default in both the MCP manifest and the Docker image. Unless disabled, the server transmits tool usage events, user intents, and sanitized workflow definitions (where secrets and URLs are scrubbed via regex, but node structures, code snippets, and prompts remain) to an external telemetry endpoint.
Fix: Set N8N_MCP_TELEMETRY_DISABLED=true in the environment or enable the Disable Telemetry option in the client configuration.
-
LowHTTP server binds to 0.0.0.0 and enables wildcard CORS by default
src/http-server-single-session.ts:1262
When started in HTTP mode (MCP_MODE=http), the server listens on 0.0.0.0 (all network interfaces) and sets Access-Control-Allow-Origin to '*' unless overridden by HOST and CORS_ORIGIN. On machines without a host firewall, this exposes the MCP server to the local network and allows any website to issue cross-origin requests.
Fix: Default HOST to 127.0.0.1 for local HTTP mode and require explicit configuration to bind to 0.0.0.0 or allow wildcard CORS origins.
-
LowDeprecated fixed HTTP server omits DISABLED_TOOLS filtering and rate limiting
When USE_FIXED_HTTP=true is set, the legacy HTTP server in src/http-server.ts returns the full tool list in tools/list without applying DISABLED_TOOLS or DISABLED_TOOL_OPERATIONS restrictions, exposes unauthenticated /version and /test-tools endpoints, and does not apply rate limiting to POST /mcp authentication attempts.
Fix: Remove the deprecated fixed HTTP server implementation or apply the same authentication, rate-limiting, and tool-policy checks used in SingleSessionHTTPServer.
-
LowUnpinned npx package execution in MCP bundle manifest
The MCP bundle manifest runs 'npx -y n8n-mcp' without pinning a specific version, even though the manifest itself declares version 2.62.0. Starting the server through this manifest always downloads and executes whatever version is currently tagged latest on npm, exposing users to supply-chain risk if a future npm publish is compromised.
Fix: Pin the package version in manifest.json (for example, 'n8n-mcp@2.62.0') and keep it synchronized during release builds.
-
LowPermissive wildcard CORS origin by default in Railway Dockerfile
Dockerfile.railway configures the HTTP server with HOST=0.0.0.0 and CORS_ORIGIN="*" by default. Allowing any origin via wildcard CORS lets arbitrary websites make cross-origin requests to the MCP HTTP server if it is reachable from a user's browser.
Fix: Remove the wildcard CORS_ORIGIN="*" default or require operators to configure an explicit allowed origin.
-
LowUnvalidated command execution in MCPClient stdio transport
When MCPClient is configured with connectionType 'stdio', it splits serverUrl on spaces and passes the resulting command and arguments directly to StdioClientTransport, which spawns a child process. If MCPClient is ever called with a serverUrl derived from untrusted input, an attacker could execute arbitrary commands.
Fix: Remove stdio process spawning from URL strings or validate the executable against a strict allowlist.
-
LowMCPB manifest runs unpinned npx package at runtime
The MCPB manifest configures the server to run
npx -y n8n-mcpwithout pinning a specific version, rather than running the bundleddist/mcp/index.jsentry point or a pinned version tag. This causes the client to download and execute whatever version is currently tagged as latest on npm, increasing exposure to a compromised upstream release.Fix: Pin the package version in manifest.json (for example,
n8n-mcp@2.99.2) or invokenodewith the bundleddist/mcp/index.jsentry point directly. -
LowUsage telemetry is enabled by default (opt-out instead of opt-in)
The server enables usage telemetry by default unless the user explicitly sets N8N_MCP_TELEMETRY_DISABLED=true or toggles the disable option in the configuration. This causes usage events and workflow structure data to leave the user's machine automatically upon installation.
Fix: Change the default value of n8n_mcp_telemetry_disabled to true (or require explicit opt-in) so no data is transmitted externally without the user's consent.
-
LowUnpinned npx package execution in manifest.json
The MCP bundle manifest configures the server to run via
npx -y n8n-mcpwithout pinning a specific version tag. This causes npx to automatically download and run the latest version published to npm rather than the specific version declared in the manifest.Fix: Pin the package version in the npx arguments (for example,
n8n-mcp@2.62.0) or execute the bundleddist/mcp/index.jsentrypoint directly. -
LowTelemetry is enabled by default (opt-out)
Anonymous usage telemetry is enabled by default in both the MCP bundle manifest and the Docker image, sending tool usage and workflow creation/mutation events to an external telemetry server unless the user explicitly opts out.
Fix: Set N8N_MCP_TELEMETRY_DISABLED=true in the environment or change the default of n8n_mcp_telemetry_disabled to true so telemetry is opt-in.
-
LowUnpinned npx package execution in manifest.json
The MCP bundle manifest configures the server to run via 'npx -y n8n-mcp' without pinning a specific version, which automatically downloads and executes the latest published version from npm at runtime.
Fix: Pin the package version in the npx arguments (for example, 'n8n-mcp@2.62.0') or run the bundled entry point directly with node.
-
LowUnpinned npx package execution in MCP manifest
The manifest configures the server to run via 'npx -y n8n-mcp' without pinning a version number, which downloads and runs the latest version from npm at runtime without verification.
Fix: Pin the package to an exact version in the npx arguments (e.g., 'n8n-mcp@2.99.2') or run a locally installed copy.