This workflow corresponds to n8n.io template #11975 — we link there as the canonical source.
This workflow follows the Chainllm → Form Trigger recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"meta": {
"templateCredsSetupCompleted": true
},
"nodes": [
{
"id": "bb1f1c8b-b31e-45e3-afd5-7d080517911c",
"name": "Prepare Audit Data",
"type": "n8n-nodes-base.code",
"position": [
208,
-32
],
"parameters": {
"jsCode": "// Prepare audit data for AI agent\nconst auditData = $input.first().json;\n\n// Extract key metrics\nconst instanceReport = auditData['Instance Risk Report'];\nconst credentialsReport = auditData['Credentials Risk Report'];\nconst databaseReport = auditData['Database Risk Report'];\nconst nodesReport = auditData['Nodes Risk Report'];\nconst filesystemReport = auditData['Filesystem Risk Report'];\n\n// Count issues\nconst unusedCredentials = credentialsReport?.sections?.[0]?.location?.length || 0;\nconst inactiveCredentials = credentialsReport?.sections?.[1]?.location?.length || 0;\nconst staleCredentials = credentialsReport?.sections?.[2]?.location?.length || 0;\nconst sqlIssues = databaseReport?.sections?.[0]?.location?.length || 0;\nconst riskyNodes = nodesReport?.sections?.[0]?.location?.length || 0;\nconst communityNodes = nodesReport?.sections?.[1]?.location?.length || 0;\nconst filesystemNodes = filesystemReport?.sections?.[0]?.location?.length || 0;\n\n// Calculate risk level\nconst totalIssues = unusedCredentials + sqlIssues + riskyNodes + filesystemNodes;\nlet riskLevel = 'LOW';\nif (totalIssues > 20) riskLevel = 'HIGH';\nelse if (totalIssues > 10) riskLevel = 'MEDIUM';\n\n// Build structured summary for AI\nconst summary = {\n metrics: {\n unusedCredentials,\n inactiveCredentials,\n staleCredentials,\n sqlInjectionRisks: sqlIssues,\n riskyOfficialNodes: riskyNodes,\n communityNodes,\n filesystemNodes,\n totalIssues,\n riskLevel\n },\n instanceSettings: instanceReport?.sections?.[0]?.settings || {},\n \n // Unused credentials list\n unusedCredentialsList: credentialsReport?.sections?.[0]?.location?.map(c => c.name) || [],\n \n // SQL issues with workflow context\n sqlIssuesList: databaseReport?.sections?.[0]?.location?.map(n => ({\n workflow: n.workflowName,\n node: n.nodeName\n })) || [],\n \n // Group risky nodes by workflow\n riskyNodesByWorkflow: {},\n \n // Community packages\n communityPackages: nodesReport?.sections?.[1]?.location?.map(p => {\n const name = p.packageUrl.split('/package/')[1] || p.nodeType;\n return { name, url: p.packageUrl };\n }) || [],\n \n // Filesystem nodes\n filesystemNodesList: filesystemReport?.sections?.[0]?.location?.map(n => ({\n workflow: n.workflowName,\n node: n.nodeName,\n type: n.nodeType\n })) || []\n};\n\n// Group risky nodes by workflow for better AI analysis\nif (nodesReport?.sections?.[0]?.location) {\n for (const node of nodesReport.sections[0].location) {\n if (!summary.riskyNodesByWorkflow[node.workflowName]) {\n summary.riskyNodesByWorkflow[node.workflowName] = [];\n }\n summary.riskyNodesByWorkflow[node.workflowName].push({\n name: node.nodeName,\n type: node.nodeType.split('.').pop()\n });\n }\n}\n\n// Create the prompt context\nconst auditContext = JSON.stringify(summary, null, 2);\n\nreturn {\n json: {\n auditContext,\n summary,\n generatedAt: new Date().toISOString(),\n reportDate: new Date().toLocaleDateString('en-US', { \n weekday: 'long', \n year: 'numeric', \n month: 'long', \n day: 'numeric'\n })\n }\n};"
},
"typeVersion": 2
},
{
"id": "8f3f349d-e766-4b9e-8453-37358bebc09b",
"name": "AI Report Generator",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
400,
-32
],
"parameters": {
"text": "=You are a senior DevOps security analyst preparing a professional security audit report for an n8n automation instance.\n\n## AUDIT DATA\n```json\n{{ $json.auditContext }}\n```\n\n## REPORT DATE\n{{ $json.reportDate }}\n\n## YOUR TASK\nAnalyze this n8n instance security audit data and write a comprehensive, professional security report. The report should be actionable and prioritized.\n\n## REPORT STRUCTURE\nWrite the report with these sections:\n\n### 1. EXECUTIVE SUMMARY\n- Overall risk assessment (use the riskLevel from data)\n- Key findings in 2-3 sentences\n- Immediate actions required\n\n### 2. METRICS OVERVIEW\nPresent the key metrics in a clear format:\n- Total issues found\n- Breakdown by category\n\n### 3. CRITICAL FINDINGS\nFor HIGH priority items (unused credentials, SQL injection risks):\n- What's the issue\n- Why it matters (security impact)\n- Specific remediation steps\n\n### 4. MEDIUM PRIORITY FINDINGS\nFor community nodes, filesystem access:\n- List the specific packages/nodes\n- Risk assessment for each\n- Recommendations\n\n### 5. INSTANCE CONFIGURATION REVIEW\nAnalyze the instance settings:\n- What's enabled/disabled\n- Security implications\n- Recommended changes\n\n### 6. DETAILED REMEDIATION PLAN\nCreate a prioritized action plan:\n1. Immediate (this week)\n2. Short-term (this month)\n3. Ongoing maintenance\n\n### 7. WORKFLOWS REQUIRING ATTENTION\nList specific workflows that need review, grouped by issue type.\n\n## WRITING STYLE\n- Professional but accessible\n- Use clear headings and bullet points\n- Be specific with names, counts, and workflows\n- Provide actionable recommendations\n- Don't be alarmist, but be clear about risks\n\n## OUTPUT FORMAT\nWrite the report in clean markdown format suitable for a Google Doc. Use proper headings (##, ###), bullet points, and tables where appropriate.",
"promptType": "define",
"hasOutputParser": true
},
"typeVersion": 1.4
},
{
"id": "07a759ad-3217-4272-922e-0a76b6d0fcba",
"name": "Format Report Output",
"type": "n8n-nodes-base.code",
"position": [
720,
-32
],
"parameters": {
"jsCode": "// Format the AI output for Google Doc\nconst aiOutput = $input.first().json.output;\nconst prepData = $('Prepare Audit Data').first().json;\n\n// Build the final report document\nlet reportContent = aiOutput.fullReport;\n\n// Add metadata header\nconst header = `# n8n Security Audit Report\n\n**Generated:** ${prepData.reportDate} \n**Risk Level:** ${aiOutput.riskLevel} \n**Report ID:** AUDIT-${Date.now()}\n\n---\n\n`;\n\nreportContent = header + reportContent;\n\n// Create report title for Google Doc\nconst reportTitle = `n8n Security Audit - ${new Date().toISOString().split('T')[0]} - ${aiOutput.riskLevel} Risk`;\n\nreturn {\n json: {\n // Document metadata\n reportTitle,\n reportContent,\n \n // Full AI output preserved\n aiAnalysis: {\n executiveSummary: aiOutput.executiveSummary,\n riskLevel: aiOutput.riskLevel,\n criticalFindings: aiOutput.criticalFindings,\n immediateActions: aiOutput.immediateActions,\n shortTermActions: aiOutput.shortTermActions || [],\n fullReport: aiOutput.fullReport\n },\n \n // Raw metrics for downstream use\n metrics: prepData.summary.metrics,\n \n // Audit context\n auditData: {\n generatedAt: prepData.generatedAt,\n reportDate: prepData.reportDate,\n instanceSettings: prepData.summary.instanceSettings,\n unusedCredentialsList: prepData.summary.unusedCredentialsList,\n sqlIssuesList: prepData.summary.sqlIssuesList,\n communityPackages: prepData.summary.communityPackages,\n filesystemNodesList: prepData.summary.filesystemNodesList,\n riskyNodesByWorkflow: prepData.summary.riskyNodesByWorkflow\n }\n }\n};"
},
"typeVersion": 2
},
{
"id": "fa6c9515-9e1b-41a4-818b-c42ab74d0545",
"name": "Structured Output Parser",
"type": "@n8n/n8n-nodes-langchain.outputParserStructured",
"position": [
544,
160
],
"parameters": {
"schemaType": "manual",
"inputSchema": "{\n \"type\": \"object\",\n \"properties\": {\n \"executiveSummary\": {\n \"type\": \"string\",\n \"description\": \"The executive summary section of the report\"\n },\n \"riskLevel\": {\n \"type\": \"string\",\n \"enum\": [\"LOW\", \"MEDIUM\", \"HIGH\"],\n \"description\": \"Overall risk level assessment\"\n },\n \"criticalFindings\": {\n \"type\": \"array\",\n \"items\": {\n \"type\": \"object\",\n \"properties\": {\n \"title\": { \"type\": \"string\" },\n \"severity\": { \"type\": \"string\" },\n \"description\": { \"type\": \"string\" },\n \"remediation\": { \"type\": \"string\" }\n }\n },\n \"description\": \"List of critical findings\"\n },\n \"immediateActions\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"description\": \"Actions to take this week\"\n },\n \"shortTermActions\": {\n \"type\": \"array\",\n \"items\": { \"type\": \"string\" },\n \"description\": \"Actions to take this month\"\n },\n \"fullReport\": {\n \"type\": \"string\",\n \"description\": \"The complete formatted report in markdown\"\n }\n },\n \"required\": [\"executiveSummary\", \"riskLevel\", \"criticalFindings\", \"immediateActions\", \"fullReport\"]\n}"
},
"typeVersion": 1.2
},
{
"id": "e98db5b8-2149-4f9b-850f-d096c780819d",
"name": "gemini-2.f-flash",
"type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
"position": [
400,
160
],
"parameters": {
"options": {}
},
"credentials": {
"googlePalmApi": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "cc0494a4-2357-41c1-a531-273ab4e97289",
"name": "On form submission",
"type": "n8n-nodes-base.formTrigger",
"position": [
-176,
-32
],
"parameters": {
"options": {
"buttonLabel": "Generate Security Report"
},
"formTitle": "\ud83d\udd12 n8n Security Audit Report Generator",
"formFields": {
"values": [
{
"fieldLabel": "n8n Instance URL",
"placeholder": "https://your-instance.n8n.cloud",
"requiredField": true
},
{
"fieldLabel": "n8n API Key",
"placeholder": "n8n_api_xxxxxxxxxxxxxxxxxxxx",
"requiredField": true
}
]
},
"formDescription": "This workflow generates a comprehensive AI-powered security audit report for your n8n instance.\n\n**What you'll get:**\n\u2022 Executive summary with risk assessment\n\u2022 Credential security analysis\n\u2022 SQL injection vulnerability scan\n\u2022 Community node risk evaluation\n\u2022 Prioritized remediation plan\n\n**Required:** Your n8n instance URL and API key."
},
"typeVersion": 2.3
},
{
"id": "5dd61136-6ed2-4539-b8e7-8c1e53d2d063",
"name": "Get Audit Data",
"type": "n8n-nodes-base.httpRequest",
"position": [
16,
-32
],
"parameters": {
"url": "={{ $('On form submission').item.json['n8n Instance URL'].replace(/\\/$/, '') }}/api/v1/audit",
"method": "POST",
"options": {},
"jsonBody": "{\n \"additionalOptions\": {\n \"daysAbandonedWorkflow\": 1,\n \"categories\": [\n \"instance\",\n \"credentials\",\n \"database\",\n \"nodes\",\n \"filesystem\"\n ]\n }\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "X-N8N-API-KEY",
"value": "={{ $('On form submission').item.json['n8n API Key'] }}"
}
]
}
},
"typeVersion": 4.3
},
{
"id": "ee97b156-50ff-466d-a477-3152182b7826",
"name": "Code Explanation",
"type": "n8n-nodes-base.stickyNote",
"position": [
144,
-192
],
"parameters": {
"color": 7,
"width": 526,
"height": 320,
"content": "### 2. Data Logic & AI ANALYSIS\nFormats raw JSON into security metrics and uses Google Gemini to perform a deep-dive risk assessment of the instance configuration."
},
"typeVersion": 1
},
{
"id": "7e2fe717-5dd7-432c-8464-5a2f00aeb598",
"name": "Stage 1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-224,
-192
],
"parameters": {
"color": 7,
"width": 364,
"height": 316,
"content": "### 1. INGESTION\nCaptures instance details via an n8n Form and fetches the raw security audit data using the official n8n v1 API."
},
"typeVersion": 1
},
{
"id": "4a63188d-2e26-4178-a125-8ac8623f7165",
"name": "Stage 3",
"type": "n8n-nodes-base.stickyNote",
"position": [
704,
-192
],
"parameters": {
"color": 7,
"width": 350,
"height": 316,
"content": "### 3. PRESENTATION\nFinalizes the report formatting and displays an interactive, high-fidelity dashboard to the user."
},
"typeVersion": 1
},
{
"id": "4b9bf5b1-1a1e-4ecf-bf49-8d926adecb6d",
"name": "Workflow Documentation",
"type": "n8n-nodes-base.stickyNote",
"position": [
-848,
-464
],
"parameters": {
"width": 600,
"height": 928,
"content": "# Generate a security audit report from an n8n instance to a web form\nThis workflow provides a deep-dive security assessment of an n8n instance using the native Audit API and AI analysis.\n\n## Who\u2019s it for\n* This template is for n8n administrators and DevSecOps engineers who need to maintain a high security standard across their automation infrastructure. \n* It is particularly useful for teams managing self-hosted instances with multiple users.\n\n## How it works\n* The workflow triggers via an n8n Form where you provide your instance URL and API key. \n* It calls the official n8n Audit API to scan for five categories of risk: instance settings, credentials, database (SQL injection), nodes, and filesystem access. \n* A Code node parses this data, which is then analyzed by Google Gemini to create a prioritized remediation plan.\n\n## Requirements\n* n8n version v1.0 or higher.\n* A Google Gemini API Key.\n* An n8n API Key with 'Audit' scope permissions.\n\n## How to set up\n1. Create a Google Gemini API credential in n8n.\n2. Ensure your n8n API key has the correct scopes.\n3. Execute the workflow and enter your credentials into the trigger form.\n\n## How to customize the workflow\n* You can easily swap the Google Gemini node for OpenAI or Anthropic. \n* You can also add a 'Send Email' or 'Slack' node at the end to automatically route the report to your security channel instead of just viewing it in the browser.\n"
},
"typeVersion": 1
},
{
"id": "391ae9f1-fe41-482b-991f-f10402feb0ef",
"name": "Display Final Audit Report",
"type": "n8n-nodes-base.form",
"position": [
912,
-32
],
"parameters": {
"options": {},
"operation": "completion",
"completionTitle": "\u2705 n8n Security Audit Complete",
"completionMessage": "=<div style=\"font-family: 'Open Sans', sans-serif; max-width: 700px; margin: 0 auto; padding: 24px; background: #fbfcfe;\">\n\n <div style=\"text-align: center; margin-bottom: 32px; padding-bottom: 24px; border-bottom: 2px solid #dbdfe7;\">\n <h1 style=\"margin: 0; color: #525356; font-size: 24px; font-weight: 600;\">\ud83d\udd12 n8n Security Audit Report</h1>\n <p style=\"color: #7e8186; margin: 12px 0 0 0; font-size: 14px;\">Generated: {{ $json.auditData.reportDate }}</p>\n </div>\n\n <div style=\"background: {{ $json.metrics.riskLevel === 'HIGH' ? '#fef2f2' : $json.metrics.riskLevel === 'MEDIUM' ? '#fffbeb' : '#f0fdf4' }}; border-left: 5px solid {{ $json.metrics.riskLevel === 'HIGH' ? '#ef4444' : $json.metrics.riskLevel === 'MEDIUM' ? '#f59e0b' : '#22c55e' }}; padding: 20px; margin-bottom: 24px; border-radius: 0 8px 8px 0;\">\n <h2 style=\"margin: 0 0 12px 0; color: {{ $json.metrics.riskLevel === 'HIGH' ? '#dc2626' : $json.metrics.riskLevel === 'MEDIUM' ? '#d97706' : '#16a34a' }}; font-size: 18px;\">\u26a1 Risk Level: {{ $json.metrics.riskLevel }}</h2>\n <p style=\"margin: 0; color: #555; font-size: 14px; line-height: 1.7;\">{{ $json.aiAnalysis.executiveSummary }}</p>\n </div>\n\n <div style=\"background: #ffffff; border: 1px solid #dbdfe7; padding: 24px; border-radius: 8px; margin-bottom: 24px; box-shadow: 0px 4px 16px 0px rgba(99, 77, 255, 0.06);\">\n <h3 style=\"margin: 0 0 20px 0; color: #525356; font-size: 16px; font-weight: 600;\">\ud83d\udcca Metrics Overview</h3>\n <div style=\"display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px;\">\n <div style=\"background: #fef2f2; padding: 16px; border-radius: 8px; text-align: center;\">\n <div style=\"font-size: 28px; font-weight: 700; color: #dc2626;\">{{ $json.metrics.totalIssues }}</div>\n <div style=\"font-size: 12px; color: #7e8186; margin-top: 4px;\">Total Issues</div>\n </div>\n <div style=\"background: #fffbeb; padding: 16px; border-radius: 8px; text-align: center;\">\n <div style=\"font-size: 28px; font-weight: 700; color: #d97706;\">{{ $json.metrics.unusedCredentials }}</div>\n <div style=\"font-size: 12px; color: #7e8186; margin-top: 4px;\">Unused Credentials</div>\n </div>\n <div style=\"background: #fef2f2; padding: 16px; border-radius: 8px; text-align: center;\">\n <div style=\"font-size: 28px; font-weight: 700; color: #dc2626;\">{{ $json.metrics.sqlInjectionRisks }}</div>\n <div style=\"font-size: 12px; color: #7e8186; margin-top: 4px;\">SQL Injection Risks</div>\n </div>\n <div style=\"background: #f5f3ff; padding: 16px; border-radius: 8px; text-align: center;\">\n <div style=\"font-size: 28px; font-weight: 700; color: #7c3aed;\">{{ $json.metrics.communityNodes }}</div>\n <div style=\"font-size: 12px; color: #7e8186; margin-top: 4px;\">Community Nodes</div>\n </div>\n <div style=\"background: #faf5ff; padding: 16px; border-radius: 8px; text-align: center;\">\n <div style=\"font-size: 28px; font-weight: 700; color: #9333ea;\">{{ $json.metrics.riskyOfficialNodes }}</div>\n <div style=\"font-size: 12px; color: #7e8186; margin-top: 4px;\">Risky Official Nodes</div>\n </div>\n <div style=\"background: #f0fdf4; padding: 16px; border-radius: 8px; text-align: center;\">\n <div style=\"font-size: 28px; font-weight: 700; color: #16a34a;\">{{ $json.metrics.filesystemNodes }}</div>\n <div style=\"font-size: 12px; color: #7e8186; margin-top: 4px;\">Filesystem Nodes</div>\n </div>\n </div>\n </div>\n\n <div style=\"background: #fef2f2; border: 1px solid #fecaca; padding: 20px; border-radius: 8px; margin-bottom: 24px;\">\n <h3 style=\"margin: 0 0 16px 0; color: #dc2626; font-size: 16px; font-weight: 600;\">\ud83d\udea8 Immediate Actions Required (This Week)</h3>\n <ul style=\"margin: 0; padding-left: 20px; color: #555; font-size: 14px; line-height: 2;\">{{ $json.aiAnalysis.immediateActions.map(action => '<li style=\"margin-bottom: 8px;\">' + action + '</li>').join('') }}</ul>\n </div>\n\n <div style=\"background: #fffbeb; border: 1px solid #fde68a; padding: 20px; border-radius: 8px; margin-bottom: 24px;\">\n <h3 style=\"margin: 0 0 16px 0; color: #d97706; font-size: 16px; font-weight: 600;\">\ud83d\udccb Short-Term Actions (This Month)</h3>\n <ul style=\"margin: 0; padding-left: 20px; color: #555; font-size: 14px; line-height: 2;\">{{ $json.aiAnalysis.shortTermActions.map(action => '<li style=\"margin-bottom: 8px;\">' + action + '</li>').join('') }}</ul>\n </div>\n\n <div style=\"background: #ffffff; border: 1px solid #dbdfe7; padding: 20px; border-radius: 8px; margin-bottom: 24px; box-shadow: 0px 4px 16px 0px rgba(99, 77, 255, 0.06);\">\n <h3 style=\"margin: 0 0 16px 0; color: #525356; font-size: 16px; font-weight: 600;\">\ud83d\udd11 Unused Credentials to Remove ({{ $json.auditData.unusedCredentialsList.length }})</h3>\n <div style=\"display: flex; flex-wrap: wrap; gap: 10px;\">{{ $json.auditData.unusedCredentialsList.map(cred => '<span style=\"background: #fef2f2; color: #dc2626; padding: 8px 14px; border-radius: 6px; font-size: 13px; font-weight: 500; border: 1px solid #fecaca; display: inline-block;\">' + cred + '</span>').join('') }}</div>\n </div>\n\n <div style=\"background: #ffffff; border: 1px solid #dbdfe7; padding: 20px; border-radius: 8px; margin-bottom: 24px; box-shadow: 0px 4px 16px 0px rgba(99, 77, 255, 0.06);\">\n <h3 style=\"margin: 0 0 16px 0; color: #525356; font-size: 16px; font-weight: 600;\">\u26a0\ufe0f SQL Injection Vulnerabilities ({{ $json.auditData.sqlIssuesList.length }})</h3>\n <table style=\"width: 100%; border-collapse: collapse; font-size: 14px;\">\n <thead>\n <tr style=\"background: #f8fafc;\">\n <th style=\"text-align: left; padding: 12px 16px; border-bottom: 2px solid #e2e8f0; color: #525356; font-weight: 600;\">Workflow</th>\n <th style=\"text-align: left; padding: 12px 16px; border-bottom: 2px solid #e2e8f0; color: #525356; font-weight: 600;\">Node</th>\n </tr>\n </thead>\n <tbody>{{ $json.auditData.sqlIssuesList.map(issue => '<tr><td style=\"padding: 12px 16px; border-bottom: 1px solid #e2e8f0; color: #555;\">' + issue.workflow + '</td><td style=\"padding: 12px 16px; border-bottom: 1px solid #e2e8f0; font-family: monospace; background: #f8fafc; color: #555; font-size: 13px;\">' + issue.node + '</td></tr>').join('') }}</tbody>\n </table>\n </div>\n\n <div style=\"background: #ffffff; border: 1px solid #dbdfe7; padding: 20px; border-radius: 8px; margin-bottom: 24px; box-shadow: 0px 4px 16px 0px rgba(99, 77, 255, 0.06);\">\n <h3 style=\"margin: 0 0 16px 0; color: #525356; font-size: 16px; font-weight: 600;\">\ud83d\udce6 Community Packages Installed</h3>\n <table style=\"width: 100%; border-collapse: collapse; font-size: 14px;\">\n <thead>\n <tr style=\"background: #f8fafc;\">\n <th style=\"text-align: left; padding: 12px 16px; border-bottom: 2px solid #e2e8f0; color: #525356; font-weight: 600;\">Package Name</th>\n <th style=\"text-align: left; padding: 12px 16px; border-bottom: 2px solid #e2e8f0; color: #525356; font-weight: 600;\">NPM Link</th>\n </tr>\n </thead>\n <tbody>{{ [...new Set($json.auditData.communityPackages.map(p => p.name))].map(name => { const pkg = $json.auditData.communityPackages.find(p => p.name === name); return '<tr><td style=\"padding: 12px 16px; border-bottom: 1px solid #e2e8f0; font-family: monospace; font-size: 13px; color: #555;\">' + name + '</td><td style=\"padding: 12px 16px; border-bottom: 1px solid #e2e8f0;\"><a href=\"' + pkg.url + '\" target=\"_blank\" style=\"color: #ff6d5a; text-decoration: none; font-weight: 500;\">View on NPM \u2197</a></td></tr>'; }).join('') }}</tbody>\n </table>\n </div>\n\n <div style=\"background: #ffffff; border: 1px solid #dbdfe7; padding: 20px; border-radius: 8px; margin-bottom: 24px; box-shadow: 0px 4px 16px 0px rgba(99, 77, 255, 0.06);\">\n <h3 style=\"margin: 0 0 16px 0; color: #525356; font-size: 16px; font-weight: 600;\">\ud83d\udcbe Filesystem Access Nodes ({{ $json.auditData.filesystemNodesList.length }})</h3>\n <table style=\"width: 100%; border-collapse: collapse; font-size: 14px;\">\n <thead>\n <tr style=\"background: #f8fafc;\">\n <th style=\"text-align: left; padding: 12px 16px; border-bottom: 2px solid #e2e8f0; color: #525356; font-weight: 600;\">Workflow</th>\n <th style=\"text-align: left; padding: 12px 16px; border-bottom: 2px solid #e2e8f0; color: #525356; font-weight: 600;\">Node</th>\n <th style=\"text-align: left; padding: 12px 16px; border-bottom: 2px solid #e2e8f0; color: #525356; font-weight: 600;\">Type</th>\n </tr>\n </thead>\n <tbody>{{ $json.auditData.filesystemNodesList.map(node => '<tr><td style=\"padding: 12px 16px; border-bottom: 1px solid #e2e8f0; color: #555;\">' + node.workflow + '</td><td style=\"padding: 12px 16px; border-bottom: 1px solid #e2e8f0; color: #555;\">' + node.node + '</td><td style=\"padding: 12px 16px; border-bottom: 1px solid #e2e8f0; font-family: monospace; font-size: 12px; background: #f8fafc; color: #555;\">' + node.type + '</td></tr>').join('') }}</tbody>\n </table>\n </div>\n\n <div style=\"background: #f0fdf4; border: 1px solid #bbf7d0; padding: 20px; border-radius: 8px; margin-bottom: 24px;\">\n <h3 style=\"margin: 0 0 16px 0; color: #16a34a; font-size: 16px; font-weight: 600;\">\u2699\ufe0f Instance Configuration</h3>\n <table style=\"width: 100%; border-collapse: collapse; font-size: 14px;\">\n <tbody>\n <tr><td style=\"padding: 10px 0; border-bottom: 1px solid #dcfce7; font-weight: 500; color: #555; width: 50%;\">Community Packages</td><td style=\"padding: 10px 0; border-bottom: 1px solid #dcfce7; color: #555;\">{{ $json.auditData.instanceSettings.features.communityPackagesEnabled ? '\u2705 Enabled' : '\u274c Disabled' }}</td></tr>\n <tr><td style=\"padding: 10px 0; border-bottom: 1px solid #dcfce7; font-weight: 500; color: #555;\">Public API</td><td style=\"padding: 10px 0; border-bottom: 1px solid #dcfce7; color: #555;\">{{ $json.auditData.instanceSettings.features.publicApiEnabled ? '\u2705 Enabled' : '\u274c Disabled' }}</td></tr>\n <tr><td style=\"padding: 10px 0; border-bottom: 1px solid #dcfce7; font-weight: 500; color: #555;\">Templates</td><td style=\"padding: 10px 0; border-bottom: 1px solid #dcfce7; color: #555;\">{{ $json.auditData.instanceSettings.features.templatesEnabled ? '\u2705 Enabled' : '\u274c Disabled' }}</td></tr>\n <tr><td style=\"padding: 10px 0; border-bottom: 1px solid #dcfce7; font-weight: 500; color: #555;\">Diagnostics/Telemetry</td><td style=\"padding: 10px 0; border-bottom: 1px solid #dcfce7; color: #555;\">{{ $json.auditData.instanceSettings.telemetry.diagnosticsEnabled ? '\u2705 Enabled' : '\u274c Disabled' }}</td></tr>\n <tr><td style=\"padding: 10px 0; font-weight: 500; color: #555;\">Excluded Nodes</td><td style=\"padding: 10px 0; font-family: monospace; font-size: 12px; color: #555;\">{{ $json.auditData.instanceSettings.nodes.nodesExclude || 'None' }}</td></tr>\n </tbody>\n </table>\n </div>\n\n <div style=\"background: #ffffff; border: 1px solid #dbdfe7; padding: 20px; border-radius: 8px; margin-bottom: 24px; box-shadow: 0px 4px 16px 0px rgba(99, 77, 255, 0.06);\">\n <h3 style=\"margin: 0 0 16px 0; color: #525356; font-size: 16px; font-weight: 600;\">\ud83d\udcdd Full Report</h3>\n <div style=\"background: #f8fafc; padding: 20px; border-radius: 8px; font-size: 13px; line-height: 1.8; color: #555; max-height: 500px; overflow-y: auto; border: 1px solid #e2e8f0;\">\n <div style=\"white-space: pre-wrap;\">{{ $json.aiAnalysis.fullReport.replace(/##\\s+/g, '\\n\\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\\n').replace(/\\*\\*([^*]+)\\*\\*/g, '\u25b8 $1').replace(/^- /gm, ' \u2022 ') }}</div>\n </div>\n </div>\n\n <div style=\"text-align: center; padding: 24px; color: #7e8186; font-size: 13px; border-top: 1px solid #dbdfe7; margin-top: 32px;\">\n <p style=\"margin: 0;\">Report generated by n8n Security Audit Workflow</p>\n <p style=\"margin: 8px 0 0 0; font-family: monospace; font-size: 12px;\">Report ID: AUDIT-{{ Date.now() }}</p>\n </div>\n\n</div>"
},
"typeVersion": 2.3
}
],
"connections": {
"Get Audit Data": {
"main": [
[
{
"node": "Prepare Audit Data",
"type": "main",
"index": 0
}
]
]
},
"gemini-2.f-flash": {
"ai_languageModel": [
[
{
"node": "AI Report Generator",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"On form submission": {
"main": [
[
{
"node": "Get Audit Data",
"type": "main",
"index": 0
}
]
]
},
"Prepare Audit Data": {
"main": [
[
{
"node": "AI Report Generator",
"type": "main",
"index": 0
}
]
]
},
"AI Report Generator": {
"main": [
[
{
"node": "Format Report Output",
"type": "main",
"index": 0
}
]
]
},
"Format Report Output": {
"main": [
[
{
"node": "Display Final Audit Report",
"type": "main",
"index": 0
}
]
]
},
"Structured Output Parser": {
"ai_outputParser": [
[
{
"node": "AI Report Generator",
"type": "ai_outputParser",
"index": 0
}
]
]
}
}
}
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
googlePalmApi
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow provides a deep-dive security assessment of an n8n instance using the native Audit API and AI analysis. This template is for n8n administrators and DevSecOps engineers who need to maintain a high security standard across their automation infrastructure. It is…
Source: https://n8n.io/workflows/11975/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This template attempts to replicate OpenAI's DeepResearch feature which, at time of writing, is only available to their pro subscribers.
My workflow 53. Uses formTrigger, httpRequest, lmChatOpenAi, form. Event-driven trigger; 74 nodes.
Transform any YouTube video into an interactive MCQ quiz automatically! This workflow uses Google Gemini AI to analyze video content and generate comprehensive multiple-choice questions with automatic
Content - Newsletter Agent. Uses formTrigger, chainLlm, outputParserStructured, httpRequest. Event-driven trigger; 91 nodes.
Content - Newsletter Agent. Uses formTrigger, chainLlm, outputParserStructured, httpRequest. Event-driven trigger; 87 nodes.