@thecodesaiyan/tcs-n8n-mcp 1.0.3 → 1.0.6

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/LICENSE CHANGED
@@ -1,21 +1,21 @@
1
- MIT License
2
-
3
- Copyright (c) 2026 Nigel Tatschner
4
-
5
- Permission is hereby granted, free of charge, to any person obtaining a copy
6
- of this software and associated documentation files (the "Software"), to deal
7
- in the Software without restriction, including without limitation the rights
8
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
- copies of the Software, and to permit persons to whom the Software is
10
- furnished to do so, subject to the following conditions:
11
-
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
14
-
15
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
- SOFTWARE.
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Nigel Tatschner
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,20 +1,72 @@
1
+ <div align="center">
2
+
1
3
  # @thecodesaiyan/tcs-n8n-mcp
2
4
 
3
- By [@TheCodeSaiyan](https://github.com/ntatschner)
5
+ **Manage your n8n workflows through AI assistants**
6
+
7
+ [![npm version](https://img.shields.io/npm/v/@thecodesaiyan/tcs-n8n-mcp?color=blue&label=npm)](https://www.npmjs.com/package/@thecodesaiyan/tcs-n8n-mcp)
8
+ [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT)
9
+ [![Node.js](https://img.shields.io/badge/Node.js-%3E%3D18-brightgreen)](https://nodejs.org)
10
+ [![MCP](https://img.shields.io/badge/MCP-Compatible-purple)](https://modelcontextprotocol.io)
11
+ [![CI](https://github.com/ntatschner/tcs-n8n-mcp/actions/workflows/ci.yml/badge.svg)](https://github.com/ntatschner/tcs-n8n-mcp/actions/workflows/ci.yml)
12
+
13
+ An [MCP](https://modelcontextprotocol.io) server that gives AI assistants full control over your [n8n](https://n8n.io) workflow automation platform. List, create, update, execute, and manage workflows, executions, tags, variables, credentials, and users — all through natural language.
14
+
15
+ [Installation](#installation) · [Tools](#available-tools-22) · [Security](#security) · [Development](#development)
16
+
17
+ </div>
18
+
19
+ ---
20
+
21
+ ## Features
22
+
23
+ - **22 tools** covering the full n8n REST API
24
+ - **Works everywhere** — Claude Code, Claude Desktop, VS Code, Cursor, Windsurf, Cline
25
+ - **Secure by default** — ID validation, sanitised errors, masked secrets, request timeouts
26
+ - **Zero config** — just provide your n8n API key and go
27
+ - **Lightweight** — under 30KB, no runtime dependencies beyond the MCP SDK and Zod
28
+
29
+ ---
30
+
31
+ ## Prerequisites
32
+
33
+ - [Node.js](https://nodejs.org) >= 18
34
+ - An [n8n](https://n8n.io) instance (self-hosted or cloud)
35
+ - An n8n API key ([how to create one](https://docs.n8n.io/api/authentication/))
4
36
 
5
- An [MCP](https://modelcontextprotocol.io) (Model Context Protocol) server for managing [n8n](https://n8n.io) workflow automation instances. Provides 22 tools for workflows, executions, tags, variables, credentials, and users.
37
+ ---
6
38
 
7
39
  ## Installation
8
40
 
9
- ### Claude Code
41
+ ### Quick Start
10
42
 
11
- Run the CLI command:
43
+ ```bash
44
+ npx @thecodesaiyan/tcs-n8n-mcp
45
+ ```
46
+
47
+ Set the required environment variables:
48
+
49
+ | Variable | Required | Default | Description |
50
+ |----------|:--------:|---------|-------------|
51
+ | `N8N_API_KEY` | Yes | — | Your n8n API key |
52
+ | `N8N_API_URL` | No | `http://localhost:5678` | Base URL of your n8n instance |
53
+
54
+ ---
55
+
56
+ ### Client Setup
57
+
58
+ <details>
59
+ <summary><strong>Claude Code</strong></summary>
60
+
61
+ #### Option A: CLI command
12
62
 
13
63
  ```bash
14
64
  claude mcp add n8n -- npx -y @thecodesaiyan/tcs-n8n-mcp
15
65
  ```
16
66
 
17
- Or add to `~/.claude.json`:
67
+ #### Option B: Manual config
68
+
69
+ Add to `~/.claude.json`:
18
70
 
19
71
  ```json
20
72
  {
@@ -31,12 +83,18 @@ Or add to `~/.claude.json`:
31
83
  }
32
84
  ```
33
85
 
34
- ### Claude Desktop
86
+ </details>
35
87
 
36
- Add to your config file:
37
- - **Windows**: `%APPDATA%\Claude\claude_desktop_config.json`
38
- - **macOS**: `~/Library/Application Support/Claude/claude_desktop_config.json`
39
- - **Linux**: `~/.config/Claude/claude_desktop_config.json`
88
+ <details>
89
+ <summary><strong>Claude Desktop</strong></summary>
90
+
91
+ Add to your Claude Desktop config file:
92
+
93
+ | OS | Path |
94
+ |----|------|
95
+ | Windows | `%APPDATA%\Claude\claude_desktop_config.json` |
96
+ | macOS | `~/Library/Application Support/Claude/claude_desktop_config.json` |
97
+ | Linux | `~/.config/Claude/claude_desktop_config.json` |
40
98
 
41
99
  ```json
42
100
  {
@@ -53,11 +111,14 @@ Add to your config file:
53
111
  }
54
112
  ```
55
113
 
56
- Restart Claude Desktop after saving.
114
+ > Restart Claude Desktop after saving.
115
+
116
+ </details>
57
117
 
58
- ### VS Code (Copilot)
118
+ <details>
119
+ <summary><strong>VS Code (GitHub Copilot)</strong></summary>
59
120
 
60
- Add to `.vscode/mcp.json` in your project, or open user config via Command Palette > `MCP: Open User Configuration`:
121
+ Add to `.vscode/mcp.json` in your project, or use **Command Palette** > `MCP: Open User Configuration`:
61
122
 
62
123
  ```json
63
124
  {
@@ -74,9 +135,12 @@ Add to `.vscode/mcp.json` in your project, or open user config via Command Palet
74
135
  }
75
136
  ```
76
137
 
77
- ### Cursor
138
+ </details>
78
139
 
79
- Add to `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (project):
140
+ <details>
141
+ <summary><strong>Cursor</strong></summary>
142
+
143
+ Add to `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (project-level):
80
144
 
81
145
  ```json
82
146
  {
@@ -93,11 +157,17 @@ Add to `~/.cursor/mcp.json` (global) or `.cursor/mcp.json` (project):
93
157
  }
94
158
  ```
95
159
 
96
- ### Windsurf
160
+ </details>
161
+
162
+ <details>
163
+ <summary><strong>Windsurf</strong></summary>
164
+
165
+ Add to your Windsurf config file:
97
166
 
98
- Add to your config file:
99
- - **Windows**: `%USERPROFILE%\.codeium\windsurf\mcp_config.json`
100
- - **macOS/Linux**: `~/.codeium/windsurf/mcp_config.json`
167
+ | OS | Path |
168
+ |----|------|
169
+ | Windows | `%USERPROFILE%\.codeium\windsurf\mcp_config.json` |
170
+ | macOS / Linux | `~/.codeium/windsurf/mcp_config.json` |
101
171
 
102
172
  ```json
103
173
  {
@@ -114,9 +184,12 @@ Add to your config file:
114
184
  }
115
185
  ```
116
186
 
117
- ### Cline
187
+ </details>
118
188
 
119
- Open MCP Servers > Configure > Advanced MCP Settings, and add:
189
+ <details>
190
+ <summary><strong>Cline</strong></summary>
191
+
192
+ Open **MCP Servers** > **Configure** > **Advanced MCP Settings** and add:
120
193
 
121
194
  ```json
122
195
  {
@@ -133,77 +206,80 @@ Open MCP Servers > Configure > Advanced MCP Settings, and add:
133
206
  }
134
207
  ```
135
208
 
136
- > **Windows note**: If you encounter spawn errors with npx, use `"command": "cmd"` with `"args": ["/c", "npx", "-y", "@thecodesaiyan/tcs-n8n-mcp"]` instead.
209
+ > **Windows**: If you encounter spawn errors, use `"command": "cmd"` with `"args": ["/c", "npx", "-y", "@thecodesaiyan/tcs-n8n-mcp"]`.
137
210
 
138
- ## Environment Variables
211
+ </details>
139
212
 
140
- | Variable | Required | Default | Description |
141
- |----------|----------|---------|-------------|
142
- | `N8N_API_KEY` | Yes | — | n8n API key ([how to create](https://docs.n8n.io/api/authentication/)) |
143
- | `N8N_API_URL` | No | `http://localhost:5678` | Base URL of your n8n instance |
213
+ ---
144
214
 
145
215
  ## Available Tools (22)
146
216
 
147
217
  ### Workflows (8)
148
218
 
149
219
  | Tool | Description |
150
- |------|-------------|
220
+ |:-----|:------------|
151
221
  | `list_workflows` | List all workflows with pagination |
152
- | `get_workflow` | Get full workflow details by ID |
153
- | `create_workflow` | Create a new workflow |
154
- | `update_workflow` | Update an existing workflow |
155
- | `delete_workflow` | Delete a workflow (irreversible) |
156
- | `activate_workflow` | Activate a workflow's triggers |
157
- | `deactivate_workflow` | Deactivate a workflow |
158
- | `execute_workflow` | Execute a workflow immediately |
222
+ | `get_workflow` | Get full workflow details including nodes, connections, and settings |
223
+ | `create_workflow` | Create a new workflow with optional nodes and connections |
224
+ | `update_workflow` | Update an existing workflow's name, nodes, connections, or settings |
225
+ | `delete_workflow` | Permanently delete a workflow |
226
+ | `activate_workflow` | Activate a workflow so it runs on its configured triggers |
227
+ | `deactivate_workflow` | Deactivate a workflow to stop trigger-based execution |
228
+ | `execute_workflow` | Execute a workflow immediately and return the execution ID |
159
229
 
160
230
  ### Executions (3)
161
231
 
162
232
  | Tool | Description |
163
- |------|-------------|
164
- | `list_executions` | List executions with filters |
165
- | `get_execution` | Get execution details and results |
233
+ |:-----|:------------|
234
+ | `list_executions` | List executions with optional filters for workflow ID and status |
235
+ | `get_execution` | Get full execution details including per-node results and errors |
166
236
  | `delete_execution` | Delete an execution record |
167
237
 
168
238
  ### Tags (4)
169
239
 
170
240
  | Tool | Description |
171
- |------|-------------|
172
- | `list_tags` | List all tags |
241
+ |:-----|:------------|
242
+ | `list_tags` | List all tags used for organising workflows |
173
243
  | `create_tag` | Create a new tag |
174
- | `update_tag` | Rename a tag |
244
+ | `update_tag` | Rename an existing tag |
175
245
  | `delete_tag` | Delete a tag |
176
246
 
177
247
  ### Variables (4)
178
248
 
179
249
  | Tool | Description |
180
- |------|-------------|
181
- | `list_variables` | List all variables (values masked) |
182
- | `create_variable` | Create a new variable |
183
- | `update_variable` | Update a variable |
184
- | `delete_variable` | Delete a variable |
250
+ |:-----|:------------|
251
+ | `list_variables` | List all environment variables (values are masked for security) |
252
+ | `create_variable` | Create a new key-value environment variable |
253
+ | `update_variable` | Update an existing variable's key or value |
254
+ | `delete_variable` | Delete an environment variable |
185
255
 
186
256
  ### Credentials (1)
187
257
 
188
258
  | Tool | Description |
189
- |------|-------------|
190
- | `list_credentials` | List credentials (metadata only) |
259
+ |:-----|:------------|
260
+ | `list_credentials` | List all credentials (metadata only — secrets are never exposed) |
191
261
 
192
262
  ### Users (2)
193
263
 
194
264
  | Tool | Description |
195
- |------|-------------|
196
- | `list_users` | List all users |
197
- | `get_user` | Get user details |
265
+ |:-----|:------------|
266
+ | `list_users` | List all users with their roles and status |
267
+ | `get_user` | Get full details of a user by ID |
268
+
269
+ ---
198
270
 
199
271
  ## Security
200
272
 
201
- - All resource IDs are validated as numeric strings to prevent path traversal
202
- - Error responses are sanitised to avoid leaking n8n instance internals
203
- - Variable values are masked in list output to prevent secret exposure
204
- - All API calls have a 30-second timeout
205
- - API keys are never logged or exposed in tool output
206
- - Credentials tool only returns metadata (secrets are never exposed)
273
+ | Protection | Description |
274
+ |:-----------|:------------|
275
+ | **ID Validation** | All resource IDs are validated as numeric strings to prevent path traversal attacks |
276
+ | **Error Sanitisation** | API error responses only return HTTP status codes, never raw response bodies |
277
+ | **Secret Masking** | Variable values are hidden in list output to prevent accidental secret exposure |
278
+ | **Request Timeout** | All API calls have a 30-second timeout to prevent hanging connections |
279
+ | **No Key Logging** | API keys are never logged, echoed, or included in tool output |
280
+ | **Credential Safety** | The credentials tool only returns metadata — secrets are never exposed |
281
+
282
+ ---
207
283
 
208
284
  ## Development
209
285
 
@@ -211,16 +287,54 @@ Open MCP Servers > Configure > Advanced MCP Settings, and add:
211
287
  git clone https://github.com/ntatschner/tcs-n8n-mcp.git
212
288
  cd tcs-n8n-mcp
213
289
  npm install
214
- npm run build
215
- npm test
216
290
  ```
217
291
 
292
+ ### Commands
293
+
294
+ | Command | Description |
295
+ |:--------|:------------|
296
+ | `npm run build` | Compile TypeScript to `build/` |
297
+ | `npm test` | Run test suite |
298
+ | `npm run test:coverage` | Run tests with coverage report |
299
+ | `npm start` | Start the MCP server |
300
+
218
301
  ### Running locally
219
302
 
220
303
  ```bash
221
304
  N8N_API_KEY=your-key N8N_API_URL=http://localhost:5678 npm start
222
305
  ```
223
306
 
307
+ ### Project Structure
308
+
309
+ ```
310
+ src/
311
+ index.ts Entry point, fetch wrapper, server setup
312
+ types.ts Shared types, interfaces, response helpers
313
+ validation.ts Zod schemas for input validation
314
+ tools/
315
+ workflows.ts Workflow CRUD, activation, execution
316
+ executions.ts Execution listing and management
317
+ tags.ts Tag CRUD operations
318
+ variables.ts Environment variable management
319
+ credentials.ts Credential metadata listing
320
+ users.ts User listing and details
321
+ ```
322
+
323
+ ---
324
+
325
+ ## Contributing
326
+
327
+ Contributions are welcome! Please open an issue or submit a pull request.
328
+
329
+ 1. Fork the repository
330
+ 2. Create your feature branch (`git checkout -b feat/my-feature`)
331
+ 3. Run tests (`npm test`)
332
+ 4. Commit your changes (`git commit -m 'feat: add my feature'`)
333
+ 5. Push to the branch (`git push origin feat/my-feature`)
334
+ 6. Open a Pull Request
335
+
336
+ ---
337
+
224
338
  ## License
225
339
 
226
- MIT
340
+ [MIT](LICENSE) — Made by [@ntatschner](https://github.com/ntatschner)
package/build/index.js CHANGED
@@ -30,7 +30,7 @@ const n8nFetch = (path, options = {}) => {
30
30
  };
31
31
  const server = new McpServer({
32
32
  name: "@thecodesaiyan/tcs-n8n-mcp",
33
- version: "1.0.3",
33
+ version: "1.0.6",
34
34
  });
35
35
  // Register all tool modules
36
36
  registerWorkflowTools(server, n8nFetch);
@@ -42,7 +42,7 @@ registerUserTools(server, n8nFetch);
42
42
  async function main() {
43
43
  const transport = new StdioServerTransport();
44
44
  await server.connect(transport);
45
- console.error("@thecodesaiyan/tcs-n8n-mcp v1.0.3 running on stdio (22 tools)");
45
+ console.error("@thecodesaiyan/tcs-n8n-mcp v1.0.6 running on stdio (22 tools)");
46
46
  }
47
47
  main().catch((error) => {
48
48
  console.error("Fatal error:", error);
@@ -7,9 +7,9 @@ const nodeSchema = z.object({
7
7
  type: z.string(),
8
8
  typeVersion: z.number(),
9
9
  position: z.tuple([z.number(), z.number()]),
10
- parameters: z.record(z.unknown()).optional().default({}),
10
+ parameters: z.record(z.string(), z.unknown()).optional().default({}),
11
11
  onError: z.string().optional().describe("Error handling: 'continueRegularOutput' | 'continueErrorOutput' | 'stopWorkflow'"),
12
- credentials: z.record(z.unknown()).optional().describe("Credential references for this node"),
12
+ credentials: z.record(z.string(), z.unknown()).optional().describe("Credential references for this node"),
13
13
  webhookId: z.string().optional().describe("Webhook ID for trigger nodes"),
14
14
  });
15
15
  export function registerWorkflowTools(server, n8nFetch) {
@@ -50,8 +50,8 @@ export function registerWorkflowTools(server, n8nFetch) {
50
50
  server.tool("create_workflow", "Create a new n8n workflow. Provide a name and optionally nodes/connections. Defaults to a Manual Trigger node if no nodes given.", {
51
51
  name: z.string().describe("Workflow name"),
52
52
  nodes: z.array(nodeSchema).optional().describe("Array of workflow nodes (defaults to Manual Trigger)"),
53
- connections: z.record(z.unknown()).optional().default({}).describe("Node connections mapping"),
54
- settings: z.record(z.unknown()).optional().default({}).describe("Workflow settings"),
53
+ connections: z.record(z.string(), z.unknown()).optional().default({}).describe("Node connections mapping"),
54
+ settings: z.record(z.string(), z.unknown()).optional().default({}).describe("Workflow settings"),
55
55
  }, async ({ name, nodes, connections, settings }) => {
56
56
  const defaultNodes = [
57
57
  {
@@ -77,8 +77,8 @@ export function registerWorkflowTools(server, n8nFetch) {
77
77
  workflowId: n8nId.describe("ID of the workflow to update"),
78
78
  name: z.string().optional().describe("New workflow name"),
79
79
  nodes: z.array(nodeSchema).optional().describe("Updated nodes array"),
80
- connections: z.record(z.unknown()).optional().describe("Updated connections"),
81
- settings: z.record(z.unknown()).optional().describe("Updated settings"),
80
+ connections: z.record(z.string(), z.unknown()).optional().describe("Updated connections"),
81
+ settings: z.record(z.string(), z.unknown()).optional().describe("Updated settings"),
82
82
  }, async ({ workflowId, name, nodes, connections, settings }) => {
83
83
  const getRes = await n8nFetch(`/workflows/${workflowId}`);
84
84
  if (!getRes.ok)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thecodesaiyan/tcs-n8n-mcp",
3
- "version": "1.0.3",
3
+ "version": "1.0.6",
4
4
  "description": "MCP server for n8n workflow automation. Manage workflows, executions, tags, variables, credentials and users via the Model Context Protocol.",
5
5
  "type": "module",
6
6
  "main": "build/index.js",
@@ -46,7 +46,7 @@
46
46
  "homepage": "https://github.com/ntatschner/tcs-n8n-mcp#readme",
47
47
  "dependencies": {
48
48
  "@modelcontextprotocol/sdk": "^1.26.0",
49
- "zod": "^3.23.0"
49
+ "zod": "^4.3.6"
50
50
  },
51
51
  "devDependencies": {
52
52
  "@types/node": "^20.0.0",