The community has a lot of free templates and workflow packs floating around. Most are well-meaning. A lot are old, oversimplified, undocumented, or quietly risky: webhook triggers wired straight into Gmail, hardcoded API keys in HTTP nodes, AI Agents calling outbound action nodes with no human in the loop.
I kept importing things, opening every node by hand, and asking “wait, what does this one actually do?” So I built a workflow that does the first pass for me.
It is importable n8n JSON. You paste another workflow’s JSON into a Set node, run the manual trigger, and a Code node walks the structure and returns a verdict.
What it checks
Possible hardcoded secrets in node parameters:
-
sk- keys
-
GitHub tokens (ghp_)
-
Slack xox tokens
-
Google AIza keys
-
Bearer token literals
-
api_key / access_token / secret assignments
-
JWT-looking strings
Node types worth a second look:
-
Automatic triggers: Webhook, Schedule, Cron
-
Email / Gmail
-
Slack / Telegram / Discord
-
Social posting nodes
-
Stripe / PayPal / accounting
-
Write-capable data nodes: Airtable, Notion, Postgres, MySQL, Supabase
-
HTTP Request nodes, especially with inline auth or token-looking strings
-
Code nodes using fetch, axios, eval, or other dynamic execution patterns
Structural smells:
-
No Error Trigger / no error workflow set
-
Large workflows with zero Sticky Notes
-
AI / LLM / Agent nodes wired into risky outbound action nodes with no obvious approval or review node in between
What it returns
{ "risk_score": 100, "verdict": "do_not_activate_yet", "finding_count": 8, "categories": [ "possible_secret", "automatic_trigger", "risky_action_node", "http_auth_inline", "missing_error_handling", "ai_to_outbound_without_approval" ], "findings": ["..."], "suggested_fixes": ["..."], "rule": "Import slowly. Audit first. Activate last." }
Output then routes into three branches: high risk report, manual review report, safe to inspect report. So you can wire each verdict to whatever you want: a Slack ping, a saved Markdown report, or just stare at it in the UI.
That JSON above is a real result from a sample risky workflow I fed it. Score 100, verdict do_not_activate_yet, eight findings across six categories. Took one click.
What it is not
This is not a complete security scanner. It is pattern matching on JSON. It will miss things. Obfuscated secrets, weird custom nodes, logic risks that only show up at runtime: all out of scope.
It is a first-pass audit before you activate a workflow you didn’t write. Not a replacement for actually reading the workflow.
It is deterministic right now. The Code node is the useful core. The optional next step is adding an AI Agent as a second pass to catch the things regex can’t, but I wanted the boring deterministic version to exist first because an AI second opinion on top of nothing is just vibes.
Get it
Full writeup with the rule list and how I use it:
Where I could use feedback
Tell me what node patterns or risk checks I missed. Specifically:
-
Node types you’ve seen abused that aren’t on the list
-
Secret formats beyond the ones above
-
Structural smells you check for by hand when you import someone else’s workflow
-
Anything you’ve been burned by
The rule I’m trying to live by: import slowly, audit first, activate last. Happy to add checks people actually want.