n8n MCP 404 in Claude Code? The endpoint is /sse on a v1 trigger
TL;DR To use your n8n workflows as tools inside Claude Code, add an MCP Server Trigger node, connect a tool node to it over the ai_tool connection, and activate the workflow. Then point Claude Code at the SSE endpoint: on n8n 2.29 with a v1 MCP Server Trigger the URL is http://host:5678/mcp/{path}/sse, not /mcp/{path} (that 404s). Register it with claude mcp add --transport sse. Separate concern: n8n-as-a-server (this post) is the opposite of czlonkowski/n8n-mcp, which lets Claude build workflows for you.
Search n8n mcp claude and you get two opposite things mixed together, and then the one you probably want fails at a single URL.
The two things: n8n as an MCP server (your n8n workflows become tools Claude Code can call) versus czlonkowski/n8n-mcp, a community MCP server that lets Claude build n8n workflows for you. Same search terms, reversed direction. This post is the first one: exposing a workflow you already have as a tool for Claude Code.
And here’s the part that cost me the most time. Once the workflow is built and active, you point Claude Code at the MCP endpoint. Every instinct says the URL is http://localhost:5678/mcp/{your-path}. It isn’t. On the current n8n with a version-1 MCP Server Trigger node, the real endpoint is /mcp/{your-path}/sse, with a matching /messages for the POST side. Hit the bare path and n8n returns a 404 that reads like your workflow is broken. It’s fine. The URL is wrong.
I ran the whole thing locally and this is the working setup, plus the two other spots people get stuck.
Tested environment
- n8n: 2.29.10 (self-hosted, Docker)
- Docker daemon: Colima 0.10.3 (no Docker Desktop) -> Docker server 29.5.2
- Claude Code: 2.1.208
- OS: macOS
- Date: July 2026
- MCP Server Trigger: typeVersion 1 (SSE transport)
Two directions, so pick the right one first
Both show up under the same keywords, and they do opposite jobs. Deciding which you want is the first fork, because everything after it differs.
- n8n as the MCP server (this post). You add an MCP Server Trigger node to a workflow. That workflow becomes an MCP server. Claude Code connects as a client and can run the tools you wired up. Your automation is the tool; Claude calls it.
czlonkowski/n8n-mcp(a different project). A standalone MCP server you add to Claude Code. It talks to n8n’s REST API so Claude can author workflows in plain language. Here n8n is the thing being built, not the tool.
If your goal is “let Claude trigger my existing n8n workflow,” you want the first one. If your goal is “let Claude write n8n workflows for me,” you want the second. Most tutorials I found don’t say which they’re doing. The rest of this post is the first.
Build the workflow
The MCP Server Trigger does nothing on its own. It needs at least one tool node connected to it, and that tool is what Claude can call.
Two nodes:
@n8n/n8n-nodes-langchain.mcpTriggerwith apath(I usedclaude-hello).@n8n/n8n-nodes-langchain.toolCode, a small code tool namedget_greeting.
The connection between them is the one non-obvious part. It is not a normal main connection. The tool connects into the trigger over the ai_tool connection type. In the workflow JSON:
"connections": {
"Greeting Tool": {
"ai_tool": [[{ "node": "MCP Server Trigger", "type": "ai_tool", "index": 0 }]]
}
}
Create it through the API (POST /api/v1/workflows with the X-N8N-API-KEY header) or build it in the UI. One gate before the API works at all: a fresh n8n returns userManagement.showSetupOnFirstLoad: true, and you can’t mint an API key until you create the owner account in the browser. That step isn’t skippable from a script.
Then activate it (POST /api/v1/workflows/{id}/activate). Activation is what registers the MCP webhook.
The URL trap
This is where I lost the most time, so it gets its own section.
After activating, I pointed a client at http://localhost:5678/mcp/claude-hello and got:
{"code":404,"message":"This webhook is not registered for GET requests. Did you mean to make a DELETE request?"}
That message sends you the wrong way. It sounds like a method problem. It’s a path problem, and the reason is version-specific.
The MCP Server Trigger node has a version, and the transport changes with it. A v1 trigger implements the older Server-Sent Events transport, which exposes two suffixed endpoints:
GET /mcp/{path}/sse— opens the SSE stream.POST /mcp/{path}/messages— where the JSON-RPC calls go.
A v2 trigger uses streamable HTTP and drops the suffix, answering at /mcp/{path} directly. So the bare path only works on v2. On v1 it 404s, and the error text won’t tell you why.
The node source makes the rule explicit. It appends the sse / messages suffix only when the version is below 2:
// McpTrigger.node.js — path built from the node version
parseFloat($nodeVersion) < 2 ? '/sse' : ''
If you copied a URL from a tutorial written for the other version, that one line is why yours 404s.
Hit the right path and the handshake starts immediately:
event: endpoint
data: /mcp/claude-hello/messages?sessionId=827ce381-...
That’s n8n handing you the session’s POST URL. The server is working; the bare-path 404 was the only thing wrong. If you see this endpoint event, the MCP server is healthy — the remaining step is just pointing Claude Code at the same /sse URL.
Confirm the tool is actually exposed
Before wiring Claude Code in, I checked the MCP round-trip by hand: open the SSE stream, then POST initialize and tools/list to the /messages URL. n8n answered:
{"serverInfo":{"name":"n8n-mcp-server","version":"0.1.0"},"capabilities":{"tools":{}}}
{"tools":[{"name":"get_greeting","description":"Returns a friendly greeting with the current server time", "...": "..."}]}
get_greeting shows up with its description and input schema. That’s the proof the workflow is a real MCP server, not just an HTTP endpoint that happens to respond.
Connecting it is one question; what it can reach once connected is a separate one. If you’re wiring n8n into Claude Code, you’re handing the agent a tool that can run whatever that workflow does. That reach — read vs write, allow vs deny — is its own decision, and I covered it in Claude Code MCP permissions.
Connect Claude Code
Claude Code speaks MCP over SSE, so registration is one command:
claude mcp add --transport sse n8n-local http://localhost:5678/mcp/claude-hello/sse
This writes a local-scope entry to .claude.json for the current project. Check it:
claude mcp get n8n-local
# Status: ✔ Connected
Connected. Claude Code sees the server and the get_greeting tool is exposed. I haven’t yet driven a full tools/call execution through it (see below), so I’m claiming the connection and the tool listing, not the round-trip run. To undo it: claude mcp remove n8n-local -s local.
What I haven’t tested yet
I scoped this to one direction and one transport. Three things I want to measure before claiming anything about them:
- The other direction (
czlonkowski/n8n-mcp, Claude authoring workflows). I’ve only described it, not run it. - typeVersion 2 (streamable HTTP, no
/ssesuffix). I confirmed the version split in the node source but tested only v1. The official node docs cover both SSE and streamable HTTP transports if you’re on v2. tools/call. I verified the tool is listed; I haven’t driven a full call-and-response through it yet.
The fix in one table
| Symptom | Cause | Fix |
|---|---|---|
404 This webhook is not registered for GET requests | Using the bare /mcp/{path} (a v2 endpoint) on a v1 MCP Server Trigger | GET /mcp/{path}/sse to open the stream, POST /mcp/{path}/messages for calls |
| Client connects but no tools appear | No tool node wired into the trigger, or the wrong connection type | Connect the tool over the ai_tool connection, not main |
claude mcp add succeeds but shows disconnected | Workflow not activated, so the webhook isn’t registered | Activate the workflow (POST /api/v1/workflows/{id}/activate) |
If you only take one thing from this: when the MCP endpoint 404s and the message talks about GET vs DELETE, don’t change the method. On a v1 MCP Server Trigger, /mcp/{path} is the wrong endpoint — use /mcp/{path}/sse instead (and drop the suffix on v2). The URL is the bug, not the method.
Drafted and tested with AI assistance, then reviewed before publishing. The setup above was run on the versions listed, not summarized from docs.