AutomationFlowsAI & RAG › Turn Your Website Docs Into a Gpt-4.1-mini Support Chatbot with Mrscraper…

Turn Your Website Docs Into a Gpt-4.1-mini Support Chatbot with Mrscraper…

Original n8n title: Turn Your Website Docs Into a Gpt-4.1-mini Support Chatbot with Mrscraper and Pinecone

Byriandra @riandradiva on n8n.io

This n8n template turns any website or documentation portal into a fully functional AI-powered support chatbot — no manual copy-pasting, no static FAQs. It uses MrScraper to crawl and extract your site's content, OpenAI to generate embeddings, and Pinecone to store and retrieve…

Event trigger★★★★☆ complexityAI-powered25 nodesN8N Nodes MrscraperOpenAI EmbeddingsPinecone Vector StoreMemory Buffer WindowAgentDocument Default Data LoaderOpenAI ChatChat
AI & RAG Trigger: Event Nodes: 25 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow corresponds to n8n.io template #13802 — we link there as the canonical source.

This workflow follows the Agent → Documentdefaultdataloader 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
{
  "id": "Vu6pZ1Ix17VmPSRS",
  "name": "Transform Your Website Into a Smart AI Chatbot Knowledge",
  "tags": [],
  "nodes": [
    {
      "id": "39f68fff-a20d-4fbb-bf70-702fee1c69dd",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -2432,
        144
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "9780ab91-3ab4-4c19-b38e-a56292b1cb59",
      "name": "MrScraper - Discover URLs (Map Agent)",
      "type": "n8n-nodes-mrscraper.mrscraper",
      "position": [
        -2160,
        144
      ],
      "parameters": {
        "url": "=// Input Your url (required)",
        "operation": "mapAgent",
        "scraperId": "=// Input Your scraperId from mrscraper (required)",
        "requestOptions": {},
        "excludePatterns": "=// Input Your Exclude Pattern (Optional)",
        "includePatterns": "=// Input Your Include Pattern (optional)"
      },
      "credentials": {
        "mrscraperApi": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "typeVersion": 1
    },
    {
      "id": "beaa1c00-3bf1-4299-bf40-81efaaa47c79",
      "name": "Batch URLs (Controlled Crawl)",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -1616,
        176
      ],
      "parameters": {
        "options": {},
        "batchSize": 10
      },
      "typeVersion": 3
    },
    {
      "id": "6ea836ba-0322-4366-b366-e7ff71f5adc1",
      "name": "MrScraper - Extract Page Content (General Agent)",
      "type": "n8n-nodes-mrscraper.mrscraper",
      "position": [
        -1392,
        144
      ],
      "parameters": {
        "url": "=// Input Your url (required)",
        "operation": "generalAgent",
        "scraperId": "=// Input Your scraperId from Mrscraper (required)",
        "requestOptions": {}
      },
      "credentials": {
        "mrscraperApi": {
          "name": "<your credential>"
        }
      },
      "retryOnFail": true,
      "typeVersion": 1,
      "continueOnFail": true
    },
    {
      "id": "ce80bee9-a7c6-4ca5-b519-f10e241a39de",
      "name": "Chunk Text for Embeddings",
      "type": "n8n-nodes-base.code",
      "position": [
        -864,
        160
      ],
      "parameters": {
        "jsCode": "// Chunk configuration (manual config here)\nconst chunkSize = 1100;\nconst overlap = 180;\n\nconst items = $input.all();\nconst output = [];\n\nfor (const item of items) {\n  const text = (item.json.content || item.json.text || '').trim();\n  const url = item.json.url || '';\n  const title = item.json.title || '';\n\n  let start = 0;\n  let idx = 0;\n\n  while (start < text.length) {\n    const end = Math.min(start + chunkSize, text.length);\n    const piece = text.slice(start, end).trim();\n\n    if (piece.length >= 80) {\n      output.push({\n        json: {\n          content: piece,\n          url,\n          title,\n          chunk_index: idx++\n        }\n      });\n    }\n\n    if (end >= text.length) break;\n\n    start = end - overlap;\n    if (start < 0) start = 0;\n  }\n}\n\nreturn output;"
      },
      "typeVersion": 2
    },
    {
      "id": "925bd235-6f2e-469f-8c83-54f73beeb372",
      "name": "OpenAI Embeddings (Indexing)",
      "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
      "position": [
        -592,
        304
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "dbd5c07c-8b9c-469a-b00d-1880d216c8de",
      "name": "Pinecone Vector Store (Upsert)",
      "type": "@n8n/n8n-nodes-langchain.vectorStorePinecone",
      "position": [
        -592,
        160
      ],
      "parameters": {
        "mode": "insert",
        "options": {
          "pineconeNamespace": "=// Input Your Pinecone Namespace (required)"
        },
        "pineconeIndex": {
          "__rl": true,
          "mode": "list",
          "value": ""
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "4fa0acb1-3986-4ddc-8091-4d8764c293ca",
      "name": "Chat Memory (Short)",
      "type": "@n8n/n8n-nodes-langchain.memoryBufferWindow",
      "position": [
        -32,
        416
      ],
      "parameters": {
        "contextWindowLength": 8
      },
      "typeVersion": 1.3
    },
    {
      "id": "3e727639-8faa-464d-8647-fcbecac4b12c",
      "name": "OpenAI Embeddings (Chat)",
      "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
      "position": [
        176,
        624
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "51362536-4f62-40f0-8ad9-444764d78841",
      "name": "Pinecone Retriever Tool",
      "type": "@n8n/n8n-nodes-langchain.vectorStorePinecone",
      "position": [
        96,
        416
      ],
      "parameters": {
        "mode": "retrieve-as-tool",
        "topK": 8,
        "options": {
          "pineconeNamespace": "={{ $items('Workflow Settings')[0].json.pineconeNamespace }}"
        },
        "pineconeIndex": {
          "__rl": true,
          "mode": "list",
          "value": ""
        },
        "toolDescription": "=Use this tool for any question about the website's documentation, help center articles, product usage, policies, FAQs, onboarding steps, or troubleshooting. If no relevant sources are returned, say you cannot find it and ask the user for a link or more detail."
      },
      "typeVersion": 1.3
    },
    {
      "id": "7aa85892-9663-41d8-b1f6-7878760d311a",
      "name": "Support Chat Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        -112,
        192
      ],
      "parameters": {
        "options": {
          "maxIterations": 8,
          "systemMessage": "=You are **Nova**, a support chatbot.\n\nRules:\n- Use retrieved knowledge for factual answers.\n- If the tool returns weak or empty results, say you can\u2019t confirm and ask for a link.\n- Keep answers short, step-based, and include 1\u20133 source URLs when available.\n- Never invent pricing, policies, or guarantees.\n",
          "returnIntermediateSteps": false
        }
      },
      "typeVersion": 3
    },
    {
      "id": "e3397354-4491-4297-aeb3-2007826c1327",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3200,
        -208
      ],
      "parameters": {
        "width": 592,
        "height": 1872,
        "content": "## Phase 0 \u2014 Prep & IDs (MrScraper + OpenAI + Pinecone)\n\n### Goal\nGet everything ready so the workflow can (1) **index your docs** into a vector database and (2) **answer chat questions** using only those docs.\n\n### What You Need Before Running\n**A) MrScraper scrapers (required)**\nYou must create **two scrapers** in your **MrScraper dashboard** first, because n8n needs the **`scraperId`** to run them using **Rerun**:\n\n1. **Map Agent Scraper (URL Discovery)**\n   * Purpose: crawl your website/docs and collect URLs\n   * Best for: `/docs/`, `/help/`, `/support/`, `/faq/`, knowledge base\n\n2. **General Agent Scraper (Page Content Extraction)**\n   * Purpose: extract readable doc content from each page into structured fields (title + text)\n   * Best output fields to target:\n     * `title`\n     * `content` or `text` or `markdown` (main body)\n     * optional: `headings`, `sections`, `last_updated`\n\nAfter creating each scraper, copy:\n* `mapScraperId`\n* `generalScraperId`\n\n**B) Credentials (required)**\nIn n8n, you\u2019ll need these credentials configured:\n* **MrScraper Credentials**\n  * Used by MrScraper nodes (Map Agent + General Agent)\n* **OpenAI Credentials**\n  * Used for embeddings (and for chat model if you\u2019re using agent/chat nodes)\n* **Pinecone Credentials**\n  * You need:\n    * Pinecone API key\n    * Pinecone index name\n    * A namespace (recommended: something like `docs-yourdomain`)\n\n**C) Pinecone index basics**\n* Your Pinecone index must exist before inserting.\n* Ensure the embedding dimensions match the model you use in OpenAI embeddings.\n\n### What To Do\n\n1. **Create scrapers in MrScraper**\n   * Create Map Agent scraper \u2192 copy its `scraperId`\n   * Create General Agent scraper \u2192 copy its `scraperId`\n\n2. **Configure the workflow settings**\n   In the \u201cWorkflow Settings\u201d / configuration node:\n   * Set `siteRoot` (example: `https://docs.yoursite.com` or `https://yoursite.com/docs`)\n   * Paste:\n     * `mapScraperId`\n     * `generalScraperId`\n   * Set patterns:\n     * `includePattern` (example: `/docs/` or `/help/`)\n     * `excludePattern` (example: `/assets/` or `/static/`)\n   * Set crawl limits:\n     * `maxUrls` (how many pages maximum you want indexed)\n     * `minTextChars` (minimum content threshold so junk pages get skipped)\n\n3. **Set n8n credentials**\n   * Select your MrScraper credential on the MrScraper nodes\n   * Select OpenAI credential on embeddings/chat nodes\n   * Select Pinecone credential on Pinecone vector store nodes\n\n4. **Choose your indexing scope (important)**\n   Decide what you want indexed:\n   * docs only (recommended)\n   * help center + FAQ\n   * blog/articles (optional, usually noisy for support)\n\n### Output\nA ready-to-run setup where:\n* MrScraper can discover URLs and extract page text\n* OpenAI can create embeddings\n* Pinecone can store and retrieve chunks\n* the chatbot can answer using retrieval only"
      },
      "typeVersion": 1
    },
    {
      "id": "3fb900f4-b162-441e-abc5-d2c8127d9c32",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1680,
        368
      ],
      "parameters": {
        "color": 5,
        "width": 640,
        "height": 800,
        "content": "### Goal\nConvert each URL into **clean, readable text** that is suitable for embeddings.\n\n### What To Do\n1. **Process URLs in batches**\n   Use SplitInBatches to control load:\n   * batch size 1\u20135 (start with 1 to keep it safe)\n   * prevents rate limits + avoids overload\n2. **Run General Agent (Rerun) per URL**\n   * Input: URL\n   * Output should include:\n     * `title`\n     * main content as `text/markdown/content`\n3. **Pick the best text field**\n   Use a code step to select the best content field:\n   * prefer `markdown` if available (usually clean)\n   * fallback to `content/text/body`\n4. **Clean the text**\n   * Normalize whitespace\n   * Remove repeated nav/footer text if it appears (optional)\n   * Keep it readable and dense\n5. **Skip low-value pages**\n   Drop pages where:\n   * `text.length < minTextChars`\n     This removes:\n   * empty pages\n   * redirects that returned nothing useful\n   * navigation-only pages\n\n### Output\nOne clean record per page:\n* `url`\n* `title`\n* `text` (main content)"
      },
      "typeVersion": 1
    },
    {
      "id": "3259015f-1736-4b53-a177-5426082820d1",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2496,
        80
      ],
      "parameters": {
        "color": 3,
        "width": 804,
        "height": 240,
        "content": "## Phase 1 \u2014 URL Discovery (MrScraper Map Agent)"
      },
      "typeVersion": 1
    },
    {
      "id": "9fbedbad-4cf8-439e-9d81-b83053bd4b59",
      "name": "Extract Url",
      "type": "n8n-nodes-base.code",
      "position": [
        -1872,
        144
      ],
      "parameters": {
        "jsCode": "// Get data from previous node\nconst inputData = $input.all();\n\n// Default empty array\nlet urls = [];\n\n// Extract URLs safely (correct nested path)\nif (\n  inputData.length > 0 &&\n  inputData[0].json?.data?.data?.urls &&\n  Array.isArray(inputData[0].json.data.data.urls)\n) {\n  urls = inputData[0].json.data.data.urls;\n}\n\n// Return each URL as separate item\nreturn urls.map((url, index) => ({\n  json: {\n    url,\n    index: index + 1\n  }\n}));"
      },
      "typeVersion": 2
    },
    {
      "id": "f2ac36e1-fd44-400b-b6c0-7cb926f607f1",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2496,
        336
      ],
      "parameters": {
        "color": 3,
        "width": 800,
        "height": 656,
        "content": "### Goal\nGenerate a clean, deduplicated list of docs/support URLs that will be indexed.\n\n### What To Do\n1. **Pick a starting URL**\n   Use either:\n   * website root (ex: `https://yoursite.com`)\n   * docs root (ex: `https://yoursite.com/docs`)\n   * help center root (ex: `https://support.yoursite.com`)\n2. **Run Map Agent (Rerun)**\n   * Input: the root URL above\n   * Use include patterns to keep it relevant:\n     * Include: `/docs/`, `/help/`, `/support/`, `/kb/`\n   * Optionally exclude:\n     * `/assets/`, `/static/`, `/images/`, `/tag/`, `/category/`\n3. **Extract URLs**\nIn a code step:\n* Retrieve `data.urls` from the previous node response\n* Validate that the URLs array exists\n* Return each URL as a separate item\n* Preserve original order (no filtering, no modification)\n\n### Output\nA focused list like:\n* `https://yoursite.com/docs/getting-started`\n* `https://yoursite.com/docs/api-auth`\n* `https://yoursite.com/docs/integrations/n8n`"
      },
      "typeVersion": 1
    },
    {
      "id": "c8e56663-7ea2-4d1b-aea8-716e6430e869",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1680,
        80
      ],
      "parameters": {
        "color": 5,
        "width": 640,
        "height": 272,
        "content": "## Phase 2 \u2014 Page Extraction (MrScraper General Agent)"
      },
      "typeVersion": 1
    },
    {
      "id": "5ae2cc65-5fb0-43bc-8ed7-31c2c90fc6ce",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1008,
        80
      ],
      "parameters": {
        "color": 4,
        "width": 720,
        "height": 368,
        "content": "## Phase 3 \u2014 Chunking + Embedding (OpenAI)"
      },
      "typeVersion": 1
    },
    {
      "id": "aa105cff-cff7-439d-b935-eade04f5b68f",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1008,
        464
      ],
      "parameters": {
        "color": 4,
        "width": 720,
        "height": 576,
        "content": "### Goal\nSplit page text into chunks optimized for retrieval, then generate embeddings for each chunk.\n\n### What To Do\n1. **Chunk the text**\n   Recommended defaults:\n   * `chunkSize`: 900\u20131400 chars\n   * `overlap`: 150\u2013250 chars\n     Why overlap matters:\n   * preserves context between chunk boundaries\n   * improves retrieval quality\n2. **Attach metadata**\n   For each chunk store:\n   * `url`\n   * `title`\n   * `chunk_index`\n   * chunk `content`\n3. **Create embeddings**\n   Send each chunk to OpenAI embeddings.\n   * Make sure your Pinecone index dimensions match the embedding model you choose.\n\n### Output\nEmbedding-ready chunks:\n* each chunk becomes one vector + metadata record"
      },
      "typeVersion": 1
    },
    {
      "id": "fadaaf48-ea41-4eee-a117-7f589c7ca48e",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -272,
        80
      ],
      "parameters": {
        "color": 6,
        "width": 624,
        "height": 688,
        "content": "## Phase 4 \u2014 Vector Store + Chat Endpoint (Pinecone + Chat Webhook)"
      },
      "typeVersion": 1
    },
    {
      "id": "a6495d06-f3df-4f11-8f01-382a75277d20",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -272,
        784
      ],
      "parameters": {
        "color": 6,
        "width": 624,
        "height": 704,
        "content": "### Goal\nStore chunks in Pinecone and expose a chat endpoint that answers using retrieval.\n\n### What To Do\n1. **Upsert into Pinecone**\n   Insert chunks into Pinecone with metadata:\n   * `url` (for sources)\n   * `title`\n   * `chunk_index`\n   * `content`\n2. **Set up retrieval as a tool**\n   Configure Pinecone retriever:\n   * `topK`: 6\u201310 (start at 8)\n   * namespace: `docs-yourdomain`\n3. **Create the chat webhook**\n   Use the Chat Trigger (webhook mode):\n   * public endpoint for your website/widget\n   * receives user query\n   * agent retrieves relevant chunks from Pinecone\n4. **Answer rules (anti-hallucination)**\n   In your system message:\n   * \u201cAnswer only using retrieved knowledge\u201d\n   * \u201cIf nothing relevant is returned, ask for a link or say you can\u2019t find it\u201d\n   * Include 1\u20133 source URLs when possible\n\n### Output\nA working docs chatbot that:\n* retrieves relevant docs chunks\n* answers using only those chunks\n* includes sources (URLs) so users can verify"
      },
      "typeVersion": 1
    },
    {
      "id": "4fa49e49-7bfe-4170-897e-64690d0bec9e",
      "name": "Docs Loader (Chunks \u2192 Documents)",
      "type": "@n8n/n8n-nodes-langchain.documentDefaultDataLoader",
      "position": [
        -464,
        304
      ],
      "parameters": {
        "options": {
          "metadata": {
            "metadataValues": [
              {
                "name": "url",
                "value": "={{ $json.url }}"
              },
              {
                "name": "title",
                "value": "={{ $json.title }}"
              },
              {
                "name": "chunk_index",
                "value": "={{ $json.chunk_index }}"
              }
            ]
          }
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "72cfdaed-ae93-4fa5-8f5d-16407acf9ead",
      "name": "OpenAI Chat",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -176,
        416
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-mini",
          "cachedResultName": "gpt-4.1-mini"
        },
        "options": {},
        "builtInTools": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "9f050a73-481f-4b66-b404-a32b9aa4470b",
      "name": "Chat",
      "type": "@n8n/n8n-nodes-langchain.chat",
      "position": [
        -256,
        192
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.2
    },
    {
      "id": "3195ee52-c010-402b-b6d5-157e017f0fae",
      "name": "Pick Content Field",
      "type": "n8n-nodes-base.code",
      "position": [
        -1168,
        144
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "// Get current item\nconst item = $input.item;\n\n// Safely extract content\nconst content = item.json?.data?.data?.content || \"\";\nconst url = item.json?.data?.url || \"\";\nconst title = item.json?.data?.data?.content || \"\";\n\n// Return only content\nreturn {\n  json: {\n    url,\n    title,\n    content\n  }\n};"
      },
      "typeVersion": 2
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "46f3df1c-f3c1-4810-a5fc-2859d48330f5",
  "connections": {
    "Chat": {
      "main": [
        [
          {
            "node": "Support Chat Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Url": {
      "main": [
        [
          {
            "node": "Batch URLs (Controlled Crawl)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat": {
      "ai_languageModel": [
        [
          {
            "node": "Support Chat Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Pick Content Field": {
      "main": [
        [
          {
            "node": "Chunk Text for Embeddings",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Chat Memory (Short)": {
      "ai_memory": [
        [
          {
            "node": "Support Chat Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Pinecone Retriever Tool": {
      "ai_tool": [
        [
          {
            "node": "Support Chat Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Embeddings (Chat)": {
      "ai_embedding": [
        [
          {
            "node": "Pinecone Retriever Tool",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "Chunk Text for Embeddings": {
      "main": [
        [
          {
            "node": "Pinecone Vector Store (Upsert)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Embeddings (Indexing)": {
      "ai_embedding": [
        [
          {
            "node": "Pinecone Vector Store (Upsert)",
            "type": "ai_embedding",
            "index": 0
          }
        ]
      ]
    },
    "Batch URLs (Controlled Crawl)": {
      "main": [
        [],
        [
          {
            "node": "MrScraper - Extract Page Content (General Agent)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Pinecone Vector Store (Upsert)": {
      "main": [
        [
          {
            "node": "Batch URLs (Controlled Crawl)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Docs Loader (Chunks \u2192 Documents)": {
      "ai_document": [
        [
          {
            "node": "Pinecone Vector Store (Upsert)",
            "type": "ai_document",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "MrScraper - Discover URLs (Map Agent)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "MrScraper - Discover URLs (Map Agent)": {
      "main": [
        [
          {
            "node": "Extract Url",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "MrScraper - Extract Page Content (General Agent)": {
      "main": [
        [
          {
            "node": "Pick Content Field",
            "type": "main",
            "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 n8n template turns any website or documentation portal into a fully functional AI-powered support chatbot — no manual copy-pasting, no static FAQs. It uses MrScraper to crawl and extract your site's content, OpenAI to generate embeddings, and Pinecone to store and retrieve…

Source: https://n8n.io/workflows/13802/ — 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

Imagine having a personal AI secretary accessible right from your Telegram, ready to assist you with information and remember everything you discuss. This n8n workflow transforms Telegram into your in

Telegram Trigger, OpenAI, Agent +9
AI & RAG

🤖📈 This workflow is my personal solution for the Agentic Arena Community Contest, where the goal is to build a Retrieval-Augmented Generation (RAG) AI agent capable of answering questions based on a p

Evaluation, Evaluation Trigger, Chat +11
AI & RAG

This n8n workflow implements a fully automated Retrieval-Augmented Generation (RAG) pipeline powered by Google Drive, OpenAI embeddings, and Pinecone.

Pinecone Vector Store, Document Default Data Loader, Text Splitter Recursive Character Text Splitter +10
AI & RAG

This workflow is built for individuals, teams, and businesses that receive regular inquiries via email and want to automate responses in a way that’s intelligent, brand-aligned, and always up to date.

OpenAI Chat, Tool Vector Store, Pinecone Vector Store +14
AI & RAG

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

Google Drive, Pinecone Vector Store, OpenAI Embeddings +7