Large n8n workflows become unmaintainable without documentation, but nobody documents them manually. This tutorial uses Claude Code with search MCP to parse n8n JSON exports, look up node documentation online, and generate human-readable workflow docs automatically. Each doc lookup costs $0.005.
Prerequisites
- Claude Code installed
- Scavio MCP configured in .mcp.json
- n8n workflow JSON export
- Node.js 18+ or Python 3.8+
Walkthrough
Step 1: Export and parse n8n workflow JSON
Export a workflow from n8n and parse its node structure.
import json, os, requests
API_KEY = os.environ['SCAVIO_API_KEY']
SH = {'x-api-key': API_KEY, 'Content-Type': 'application/json'}
# Load exported n8n workflow
with open('workflow.json', 'r') as f:
workflow = json.load(f)
nodes = workflow.get('nodes', [])
connections = workflow.get('connections', {})
print(f'Workflow: {workflow.get("name", "Untitled")}')
print(f'Nodes: {len(nodes)}')
print(f'Connections: {sum(len(v) for v in connections.values())}')
print(f'\nNode types:')
for node in nodes:
ntype = node.get('type', 'unknown')
name = node.get('name', 'unnamed')
print(f' [{ntype}] {name}')Step 2: Look up node documentation via search
Search for documentation of each unique node type to enrich the docs.
def lookup_node_docs(node_type):
"""Search for n8n node documentation."""
query = f'n8n {node_type} node documentation site:docs.n8n.io'
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': query, 'country_code': 'us', 'num_results': 3}).json()
results = data.get('organic_results', [])
if results:
return {'url': results[0].get('link', ''), 'description': results[0].get('snippet', '')[:150]}
return {'url': '', 'description': 'No docs found'}
# Look up unique node types
node_types = list(set(n.get('type', '') for n in nodes))
node_docs = {}
for ntype in node_types:
node_docs[ntype] = lookup_node_docs(ntype)
print(f'{ntype}: {node_docs[ntype]["description"][:60]}...')
print(f'\nLookup cost: ${len(node_types) * 0.005:.3f}')Step 3: Generate workflow documentation
Combine parsed structure and node docs into a readable document.
def generate_docs(workflow, node_docs):
nodes = workflow.get('nodes', [])
connections = workflow.get('connections', {})
doc = []
doc.append(f'# {workflow.get("name", "Untitled Workflow")}')
doc.append(f'\nGenerated: 2026-05-20')
doc.append(f'Nodes: {len(nodes)} | Connections: {sum(len(v) for v in connections.values())}')
doc.append(f'\n## Node Overview')
for i, node in enumerate(nodes, 1):
ntype = node.get('type', 'unknown')
name = node.get('name', 'unnamed')
docs = node_docs.get(ntype, {})
doc.append(f'\n### {i}. {name}')
doc.append(f'- Type: {ntype}')
doc.append(f'- Purpose: {docs.get("description", "N/A")}')
if docs.get('url'):
doc.append(f'- Docs: {docs["url"]}')
params = node.get('parameters', {})
if params:
doc.append(f'- Parameters: {json.dumps(params)[:100]}')
doc.append(f'\n## Data Flow')
for source, targets in connections.items():
for target_group in targets.get('main', [[]]):
for target in target_group:
doc.append(f' {source} -> {target.get("node", "?")}')
output = '\n'.join(doc)
print(output[:500])
return output
docs = generate_docs(workflow, node_docs)
with open('workflow_docs.md', 'w') as f:
f.write(docs)
print(f'\nDocs written to workflow_docs.md ({len(docs)} chars)')Python Example
import os, requests, json
SH = {'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'}
def doc_node(node_type):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': f'n8n {node_type} docs site:docs.n8n.io', 'country_code': 'us'}).json()
r = data.get('organic_results', [{}])[0]
return f'{r.get("title", "N/A")}: {r.get("snippet", "")[:80]}'
for ntype in ['n8n-nodes-base.httpRequest', 'n8n-nodes-base.if']:
print(f'{ntype}: {doc_node(ntype)}')
print('Cost: $0.010')JavaScript Example
const SH = { 'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json' };
async function docNode(nodeType) {
const data = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: SH,
body: JSON.stringify({ query: `n8n ${nodeType} docs site:docs.n8n.io`, country_code: 'us' })
}).then(r => r.json());
const r = (data.organic_results || [])[0] || {};
return `${r.title || 'N/A'}: ${(r.snippet || '').slice(0, 80)}`;
}
console.log(await docNode('n8n-nodes-base.httpRequest'));Expected Output
Workflow: Lead Enrichment Pipeline
Nodes: 8
Connections: 7
Node types:
[n8n-nodes-base.httpRequest] Fetch Company Data
[n8n-nodes-base.if] Check Email Valid
[n8n-nodes-base.set] Format Output
n8n-nodes-base.httpRequest: Make HTTP requests to any API or web...
n8n-nodes-base.if: Route items based on comparison operatio...
Lookup cost: $0.040
Docs written to workflow_docs.md (2340 chars)