AutomationFlowsAI & RAG › Ai-powered Research Assistant with Linear, Scrapeless, and Claude

Ai-powered Research Assistant with Linear, Scrapeless, and Claude

Byscrapeless official @scrapelessofficial on n8n.io

This workflow integrates Linear, Scrapeless, and Claude AI to create an AI research assistant that can respond to natural language commands and automatically perform market research, trend analysis, data extraction, and intelligent analysis.

Event trigger★★★★☆ complexityAI-powered17 nodesLinear TriggerN8N Nodes ScrapelessAgentAnthropic ChatLinear
AI & RAG Trigger: Event Nodes: 17 Complexity: ★★★★☆ AI nodes: yes Added:

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

This workflow follows the Agent → Anthropic Chat 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": "yTpEZbAAFcS0Yp4m",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Build an AI-Powered Research Assistant with Linear + Scrapeless + Claude",
  "tags": [],
  "nodes": [
    {
      "id": "9137108b-6a96-4264-bb3f-4f0dc5d5c7a5",
      "name": "Linear Trigger",
      "type": "n8n-nodes-base.linearTrigger",
      "position": [
        -580,
        380
      ],
      "parameters": {
        "teamId": "3a89590a-2521-4c4a-b3b2-7e7ad5962666",
        "resources": [
          "issue",
          "comment",
          "reaction"
        ]
      },
      "credentials": {
        "linearApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "d49110c2-f5f9-4939-b2a3-4ee7b9c1aa77",
      "name": "Switch",
      "type": "n8n-nodes-base.switch",
      "position": [
        -360,
        260
      ],
      "parameters": {
        "mode": "expression",
        "output": "={{\n  $json.type === 'Issue' && $json.data.title.toLowerCase().includes('/search') ? 0 :\n  $json.type === 'Issue' && $json.data.title.toLowerCase().includes('/trends') ? 1 :\n  $json.type === 'Issue' && $json.data.title.toLowerCase().includes('/unlock') ? 2 :\n  $json.type === 'Issue' && $json.data.title.toLowerCase().includes('/scrape') ? 3 :\n  $json.type === 'Issue' && $json.data.title.toLowerCase().includes('/crawl') ? 4 :\n  -1\n}}",
        "numberOutputs": 5
      },
      "typeVersion": 3.2
    },
    {
      "id": "627d13f1-1617-4a20-aa1f-2ae8cba643d6",
      "name": "Google Search",
      "type": "n8n-nodes-scrapeless.scrapeless",
      "position": [
        260,
        60
      ],
      "parameters": {
        "q": "={{ $json.data.title }}"
      },
      "credentials": {
        "scrapelessApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "16d29067-9aae-4159-8d31-37465885350d",
      "name": "Google Trends",
      "type": "n8n-nodes-scrapeless.scrapeless",
      "position": [
        260,
        220
      ],
      "parameters": {
        "q": "={{ $json.data.title }}",
        "operation": "googleTrends"
      },
      "credentials": {
        "scrapelessApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "cadc6292-efcf-4dcf-bc1f-03ea1a6c1a75",
      "name": "Web Unlocker",
      "type": "n8n-nodes-scrapeless.scrapeless",
      "position": [
        260,
        360
      ],
      "parameters": {
        "url": "={{ $json.data.title.replace(/\\/unlock/gi, '').trim() }}",
        "headless": false,
        "resource": "universalScrapingApi"
      },
      "credentials": {
        "scrapelessApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "979d5139-2593-4975-afa7-2ac16d8bb5da",
      "name": "Scrape",
      "type": "n8n-nodes-scrapeless.scrapeless",
      "position": [
        260,
        540
      ],
      "parameters": {
        "url": "={{ $json.data.title }}",
        "resource": "crawler"
      },
      "credentials": {
        "scrapelessApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "58658eec-316e-4fb2-8715-6f7efc49d381",
      "name": "Crawl",
      "type": "n8n-nodes-scrapeless.scrapeless",
      "position": [
        260,
        700
      ],
      "parameters": {
        "url": "={{ $json.data.title }}",
        "resource": "crawler",
        "operation": "crawl",
        "limitCrawlPages": 1
      },
      "credentials": {
        "scrapelessApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "410d82d4-2bdf-4242-b6a3-32e508608be4",
      "name": "Code2",
      "type": "n8n-nodes-base.code",
      "position": [
        0,
        0
      ],
      "parameters": {
        "jsCode": "const originalTitle = $json.data.title;\nlet cleanTitle = originalTitle;\n\nif (originalTitle.toLowerCase().includes('/search')) {\n  cleanTitle = originalTitle.replace(/\\/search/gi, '').trim();\n} else if (originalTitle.toLowerCase().includes('/trends')) {\n  cleanTitle = originalTitle.replace(/\\/trends/gi, '').trim();\n} else if (originalTitle.toLowerCase().includes('/unlock')) {\n  cleanTitle = originalTitle.replace(/\\/unlock/gi, '').trim();\n} else if (originalTitle.toLowerCase().includes('/scrape')) {\n  cleanTitle = originalTitle.replace(/\\/scrape/gi, '').trim();\n} else if (originalTitle.toLowerCase().includes('/crawl')) {\n  cleanTitle = originalTitle.replace(/\\/crawl/gi, '').trim();\n}\n\nreturn {\n\n  data: {\n    ...($json.data),\n    title: cleanTitle\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "8f633954-262b-482d-aa29-3a97a0e8cbb6",
      "name": "Code",
      "type": "n8n-nodes-base.code",
      "position": [
        580,
        340
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "return {\n  output: JSON.stringify($json, null, 2)\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "d8e55c8c-857b-403e-b2ee-afc1253d7aba",
      "name": "Code3",
      "type": "n8n-nodes-base.code",
      "position": [
        0,
        180
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "const originalTitle = $json.data.title;\nlet cleanTitle = originalTitle;\n\nif (originalTitle.toLowerCase().includes('/search')) {\n  cleanTitle = originalTitle.replace(/\\/search/gi, '').trim();\n} else if (originalTitle.toLowerCase().includes('/trends')) {\n  cleanTitle = originalTitle.replace(/\\/trends/gi, '').trim();\n} else if (originalTitle.toLowerCase().includes('/unlock')) {\n  cleanTitle = originalTitle.replace(/\\/unlock/gi, '').trim();\n} else if (originalTitle.toLowerCase().includes('/scrape')) {\n  cleanTitle = originalTitle.replace(/\\/scrape/gi, '').trim();\n} else if (originalTitle.toLowerCase().includes('/crawl')) {\n  cleanTitle = originalTitle.replace(/\\/crawl/gi, '').trim();\n}\n\nreturn {\n\n  data: {\n    ...($json.data),\n    title: cleanTitle\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "9e9a315e-6915-41a2-b77c-d46c773b9891",
      "name": "Code4",
      "type": "n8n-nodes-base.code",
      "position": [
        20,
        360
      ],
      "parameters": {
        "jsCode": "const originalTitle = $json.data.title;\nlet cleanTitle = originalTitle;\n\nif (originalTitle.toLowerCase().includes('/search')) {\n  cleanTitle = originalTitle.replace(/\\/search/gi, '').trim();\n} else if (originalTitle.toLowerCase().includes('/trends')) {\n  cleanTitle = originalTitle.replace(/\\/trends/gi, '').trim();\n} else if (originalTitle.toLowerCase().includes('/unlock')) {\n  cleanTitle = originalTitle.replace(/\\/unlock/gi, '').trim();\n} else if (originalTitle.toLowerCase().includes('/scrape')) {\n  cleanTitle = originalTitle.replace(/\\/scrape/gi, '').trim();\n} else if (originalTitle.toLowerCase().includes('/crawl')) {\n  cleanTitle = originalTitle.replace(/\\/crawl/gi, '').trim();\n}\n\nreturn {\n\n  data: {\n    ...($json.data),\n    title: cleanTitle\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "c076a7a6-c901-481d-8037-f1e06be1f8e4",
      "name": "Code5",
      "type": "n8n-nodes-base.code",
      "position": [
        20,
        520
      ],
      "parameters": {
        "jsCode": "const originalTitle = $json.data.title;\nlet cleanTitle = originalTitle;\n\nif (originalTitle.toLowerCase().includes('/search')) {\n  cleanTitle = originalTitle.replace(/\\/search/gi, '').trim();\n} else if (originalTitle.toLowerCase().includes('/trends')) {\n  cleanTitle = originalTitle.replace(/\\/trends/gi, '').trim();\n} else if (originalTitle.toLowerCase().includes('/unlock')) {\n  cleanTitle = originalTitle.replace(/\\/unlock/gi, '').trim();\n} else if (originalTitle.toLowerCase().includes('/scrape')) {\n  cleanTitle = originalTitle.replace(/\\/scrape/gi, '').trim();\n} else if (originalTitle.toLowerCase().includes('/crawl')) {\n  cleanTitle = originalTitle.replace(/\\/crawl/gi, '').trim();\n}\n\nreturn {\n\n  data: {\n    ...($json.data),\n    title: cleanTitle\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "b9e6ac08-8f3c-40cc-b183-a4303d9801cd",
      "name": "Code6",
      "type": "n8n-nodes-base.code",
      "position": [
        20,
        720
      ],
      "parameters": {
        "jsCode": "const originalTitle = $json.data.title;\nlet cleanTitle = originalTitle;\n\nif (originalTitle.toLowerCase().includes('/search')) {\n  cleanTitle = originalTitle.replace(/\\/search/gi, '').trim();\n} else if (originalTitle.toLowerCase().includes('/trends')) {\n  cleanTitle = originalTitle.replace(/\\/trends/gi, '').trim();\n} else if (originalTitle.toLowerCase().includes('/unlock')) {\n  cleanTitle = originalTitle.replace(/\\/unlock/gi, '').trim();\n} else if (originalTitle.toLowerCase().includes('/scrape')) {\n  cleanTitle = originalTitle.replace(/\\/scrape/gi, '').trim();\n} else if (originalTitle.toLowerCase().includes('/crawl')) {\n  cleanTitle = originalTitle.replace(/\\/crawl/gi, '').trim();\n}\n\nreturn {\n\n  data: {\n    ...($json.data),\n    title: cleanTitle\n  }\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "96631700-d64b-41f7-ba06-263be9acd76e",
      "name": "AI Agent1",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1040,
        420
      ],
      "parameters": {
        "text": "={{ $json.output }}",
        "options": {
          "systemMessage": "You are a data analyst. Summarize search/scrape results concisely. Be factual and brief. Format for Linear comments.\n\nAnalyze the provided data and create a structured summary that includes:\n- Key findings and insights\n- Data source and reliability assessment  \n- Actionable recommendations\n- Relevant metrics and trends\n- Next steps for further research\n\nFormat your response with clear headers and bullet points for easy reading in Linear."
        },
        "promptType": "define"
      },
      "typeVersion": 2
    },
    {
      "id": "300d7264-86df-485a-9183-ed42df732ccc",
      "name": "Anthropic Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatAnthropic",
      "position": [
        980,
        720
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "claude-sonnet-4-20250514",
          "cachedResultName": "Claude 4 Sonnet"
        },
        "options": {
          "temperature": 0.3,
          "maxTokensToSample": 4000
        }
      },
      "credentials": {
        "anthropicApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "20f412e2-4081-40a7-a458-af7b2908cc44",
      "name": "Code7",
      "type": "n8n-nodes-base.code",
      "position": [
        1540,
        600
      ],
      "parameters": {
        "jsCode": "return {\n  output: $json.output\n    .replace(/\\\\n/g, '\\n')\n    .replace(/\\\\\"/g, '\"')\n    .replace(/\\\\\\\\/g, '\\\\')\n    .trim()\n};"
      },
      "typeVersion": 2
    },
    {
      "id": "4379cc64-3b20-4ad5-a62b-470da3338cf8",
      "name": "Add a comment to an issue1",
      "type": "n8n-nodes-base.linear",
      "position": [
        1760,
        600
      ],
      "parameters": {
        "comment": "={{ $json.output }}",
        "issueId": "={{ $('Linear Trigger').item.json.data.id }}",
        "resource": "comment",
        "additionalFields": {}
      },
      "credentials": {
        "linearApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "e01eaa88-0eff-40de-b80b-51ca1bcd3acb",
  "connections": {
    "Code": {
      "main": [
        [
          {
            "node": "AI Agent1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code2": {
      "main": [
        [
          {
            "node": "Google Search",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code3": {
      "main": [
        [
          {
            "node": "Google Trends",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code4": {
      "main": [
        [
          {
            "node": "Web Unlocker",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code5": {
      "main": [
        [
          {
            "node": "Scrape",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code6": {
      "main": [
        [
          {
            "node": "Crawl",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code7": {
      "main": [
        [
          {
            "node": "Add a comment to an issue1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Crawl": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scrape": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Switch": {
      "main": [
        [
          {
            "node": "Code2",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Code3",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Code4",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Code5",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Code6",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent1": {
      "main": [
        [
          {
            "node": "Code7",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Web Unlocker": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Search": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Trends": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Linear Trigger": {
      "main": [
        [
          {
            "node": "Switch",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Anthropic Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent1",
            "type": "ai_languageModel",
            "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 integrates Linear, Scrapeless, and Claude AI to create an AI research assistant that can respond to natural language commands and automatically perform market research, trend analysis, data extraction, and intelligent analysis.

Source: https://n8n.io/workflows/6220/ — 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 workflow contains community nodes that are only compatible with the self-hosted version of n8n.

N8N Nodes Scrapeless, Output Parser Structured, Agent +3
AI & RAG

This workflow automatically classifies and routes new or updated Linear issues using AI. When an issue is created or updated, its title and description are analyzed by an OpenAI-powered classifier. Th

Linear Trigger, Agent, Linear +1
AI & RAG

&gt; ⚠️ Disclaimer: This workflow uses Scrapeless and Claude AI via community nodes, which require n8n self-hosted to work properly.

Agent, Anthropic Chat, HTTP Request +1
AI & RAG

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

Form Trigger, Google Sheets, HTTP Request +3
AI & RAG

This template and YouTube video goes over 5 different implementations of evaluations within n8n. Categorization Correctness Tools used String similarity Helpfulness

Evaluation, Evaluation Trigger, Google Gemini Chat +8