AutomationFlowsAI & RAG › Ai-powered Security Analysis for N8n with Google Gemini and N8n Audit API

Ai-powered Security Analysis for N8n with Google Gemini and N8n Audit API

ByHatem Gifaeeri @hatemgifaeeri on n8n.io

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…

Event trigger★★★★☆ complexityAI-powered12 nodesChain LlmOutput Parser StructuredGoogle Gemini ChatForm TriggerHTTP RequestForm
AI & RAG Trigger: Event Nodes: 12 Complexity: ★★★★☆ AI nodes: yes Added:

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 →

Download .json
{
  "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.

Pro

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 →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

This template attempts to replicate OpenAI's DeepResearch feature which, at time of writing, is only available to their pro subscribers.

Output Parser Structured, OpenAI Chat, Form Trigger +8
AI & RAG

My workflow 53. Uses formTrigger, httpRequest, lmChatOpenAi, form. Event-driven trigger; 74 nodes.

Form Trigger, HTTP Request, OpenAI Chat +15
AI & RAG

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

Google Gemini Chat, Output Parser Structured, Form Trigger +3
AI & RAG

Content - Newsletter Agent. Uses formTrigger, chainLlm, outputParserStructured, httpRequest. Event-driven trigger; 91 nodes.

Form Trigger, Chain Llm, Output Parser Structured +8
AI & RAG

Content - Newsletter Agent. Uses formTrigger, chainLlm, outputParserStructured, httpRequest. Event-driven trigger; 87 nodes.

Form Trigger, Chain Llm, Output Parser Structured +7