# N8n Subworkflows

Build reusable, composable n8n sub-workflows.

- Repository: https://github.com/czlonkowski/n8n-mcp (23187 stars)
- Category: Design
- License: MIT
- Last updated: 2026-10-27
- Runs scripts: no, instructions only

## Install

Claude Code: `npx skills add czlonkowski/n8n-mcp --skill n8n-subworkflows -g -a claude-code -y`
Codex: `npx skills add czlonkowski/n8n-mcp --skill n8n-subworkflows -g -a codex -y`
Cursor: `npx skills add czlonkowski/n8n-mcp --skill n8n-subworkflows -g -a cursor -y`
Gemini CLI: `npx skills add czlonkowski/n8n-mcp --skill n8n-subworkflows -g -a gemini-cli -y`

## Description

Build reusable, composable n8n sub-workflows. Use when extracting shared logic, building anything multi-step or reused across workflows, or any workflow over ~10 nodes, and whenever the user mentions sub-workflows, Execute Workflow, reuse, shared/common logic, modular workflows, "Define Below" inputs, waitForSubWorkflow, mode each vs all, or exposing a workflow as an agent tool. Covers typed sub-workflow inputs, all-vs-each execution, verb-first naming for discovery, stateless vs stateful design, and splitting by input shape.

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

# n8n Sub-workflows

A sub-workflow is a reusable function. An **Execute Workflow Trigger** declares typed inputs, the body does the work, and the last node returns the output. A caller invokes it through an **Execute Workflow** node like any other step.

That framing buys you the things functions buy you everywhere: encapsulation, reuse, testability, replaceability. It's the primary reuse mechanism in n8n, and it's badly underused. Without it, the same logic gets copy-pasted across workflows, then a bug gets fixed in two places, the third copy gets missed, and your "identical" copies quietly drift apart.

This skill is about when to reach for a sub-workflow, how to define its input/output contract so callers (and agents) can actually use it, how to call it correctly (`all` vs `each`, blocking vs fire-and-forget), and how to name it so it gets found instead of rebuilt.

---

## The two non-negotiables

Everything else is judgement. These two are not.

### 1. Search before you build

Before you write logic for a generic problem, check whether a sub-workflow already does it. The community MCP can't filter workflows by tag, so the **name is the discovery surface**:

```
n8n_list_workflows()                          # scan the library
n8n_get_workflow({ id: "<candidate>" })       # read its inputs/outputs + body
```

If something fits, use it and tell the user ("I found `Subworkflow: Parse RFC2822 date`, using that"). If nothing fits, build it *with a discoverable name* so the next search finds it. The discovery convention (verb-first prefixes) lives in **NAMING_AND_DISCOVERY.md**.

### 2. The Execute Workflow Trigger uses "Define Below" with typed fields, not passthrough

The rest: https://github.com/czlonkowski/n8n-mcp/blob/HEAD/data/skills/n8n-subworkflows/SKILL.md
