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 →
{
"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.
anthropicApilinearApiscrapelessApi
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.
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
> ⚠️ Disclaimer: This workflow uses Scrapeless and Claude AI via community nodes, which require n8n self-hosted to work properly.
This workflow contains community nodes that are only compatible with the self-hosted version of n8n.
This template and YouTube video goes over 5 different implementations of evaluations within n8n. Categorization Correctness Tools used String similarity Helpfulness