# templates

name: Auto-Sync Local Events to Google Calendar with n8n
author_name: Yaron Been
author_username: yaron-nofluff
categories: []
created_at: 2025-06-24T15:53:39.105Z
updated_at: 2025-06-24T15:53:39.105Z
url: https://n8n.io/workflows/5216
scraped_at: 2025-07-06 21:16:30
description:
  Description

  This workflow automates the process of finding local events and adding them directly to your Google Calendar. It eliminates the need for manual event tracking by automatically scraping event information and creating calendar entries.

  Overview

  This workflow automates the process of finding local events and adding them to your Google Calendar. It uses Bright Data to scrape event information from a specified source and then creates new events in your calendar, ensuring you never miss out on what's happening around you.

  Tools Used

  n8n:** The automation platform that orchestrates the workflow.
  Bright Data:** For scraping event data from websites without getting blocked.
  Google Calendar API:** To create and manage calendar events.

  How to Install

  Import the Workflow: Download the .json file and import it into your n8n instance.
  Configure Bright Data: Add your Bright Data credentials to the Bright Data node.
  Set Up Google Calendar: Authenticate your Google Calendar account in the Google Calendar node.
  Customize: Adjust the workflow to target the specific websites and event types you're interested in.

  Use Cases

  Community Managers:** Keep track of local meetups and community events.
  Event Enthusiasts:** Never miss a concert, festival, or local gathering.
  Marketing Professionals:** Monitor competitor events and industry conferences.

  Connect with Me

  Website:** https://www.nofluff.online
  YouTube:** https://www.youtube.com/@YaronBeen/videos
  LinkedIn:** https://www.linkedin.com/in/yaronbeen/
  Get Bright Data:** https://get.brightdata.com/1tndi4600b25 (Using this link supports my free workflows with a small commission)

  #n8n #automation #googlecalendar #brightdata #webscraping #events #eventautomation #localevents #calendarintegration #eventtracking #n8nworkflow #workflow #nocode #eventmanagement #productivitytools #timemanagement #eventplanning #automatedcalendar #eventdiscovery #techautomation #eventnotifications #eventscheduling #calendarsync #eventorganizer #automatedevents

nodes_used:
  ["n8n-nodes-base.httpRequest","n8n-nodes-base.googleCalendar","n8n-nodes-base.code","n8n-nodes-base.html"]

workflow_json:
  {"id":"y1ZOHX6Zq13C68dP","meta":{"instanceId":"60046904b104f0f72b2629a9d88fe9f676be4035769f1f08dad1dd38a76b9480"},"name":"AutoSync_Local_Events_to_Google_Calendar","tags":[],"nodes":[{"id":"433e4192-599f-4f3d-a251-651b81db4960","name":"Daily Event Sync Trigger","type":"n8n-nodes-base.scheduleTrigger","position":[-2740,220],"parameters":{"rule":{"interval":[{"triggerAtHour":8}]}},"typeVersion":1.2},{"id":"94f20c26-9a90-43ba-8ab1-b1107c17345c","name":"Fetch Event Page (Bright Data)","type":"n8n-nodes-base.httpRequest","position":[-2520,220],"parameters":{"url":"https://api.brightdata.com/request","method":"POST","options":{},"sendBody":true,"sendHeaders":true,"bodyParameters":{"parameters":[{"name":"zone","value":"n8n_unblocker"},{"name":"url","value":"https://www.nypl.org/events/calendar"},{"name":"country","value":"us"},{"name":"format","value":"raw"}]},"headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer YOUR_TOKEN_HERE"}]}},"typeVersion":4.2},{"id":"e55c8584-f673-4201-bda7-42cdbadf49bf","name":"Extract Event Data (HTML Parser)","type":"n8n-nodes-base.html","position":[-2220,220],"parameters":{"options":{},"operation":"extractHtmlContent","extractionValues":{"values":[{"key":"Title","cssSelector":".event-title","returnArray":true},{"key":"Location","cssSelector":".event-location","returnArray":true},{"key":"Audience","cssSelector":".event-audience","returnArray":true},{"key":"Time","cssSelector":".event-time","returnArray":true}]}},"typeVersion":1.2},{"id":"48196549-0378-4cd9-8e1d-f289c4b50180","name":"Clean & Format Event Data","type":"n8n-nodes-base.code","position":[-2000,220],"parameters":{"jsCode":"const data = items[0].json;\n\n// Extract arrays\nconst titles = data.Title || [];\nconst locations = data.Location || [];\nconst audiences = data.Audience || [];\nconst rawTimes = data.Time || [];\n\n// Step 1: Remove invalid \"time\" placeholders\nconst invalidTimeLabels = [\"Date/Time\", \"Title/Description\", \"Location\", \"Audience\"];\nconst times = rawTimes.filter(time => !invalidTimeLabels.includes(time.trim()));\n\n// Step 2: Safely calculate number of valid events\nconst eventCount = Math.min(titles.length, locations.length, audiences.length, times.length);\n\n// Helper: Convert \"Today @ 10 AM\" → ISO string with timezone\nfunction parseTimeToISO(rawTime) {\n  const match = rawTime.match(/@ ([0-9]{1,2})(?::([0-9]{2}))?\\s?(AM|PM)/i);\n  const now = new Date();\n\n  if (!match) return null;\n\n  let hour = parseInt(match[1]);\n  const minute = match[2] ? parseInt(match[2]) : 0;\n  const meridian = match[3].toUpperCase();\n\n  if (meridian === \"PM\" && hour !== 12) hour += 12;\n  if (meridian === \"AM\" && hour === 12) hour = 0;\n\n  const start = new Date(now.getFullYear(), now.getMonth(), now.getDate(), hour, minute);\n  const end = new Date(start.getTime() + 60 * 60 * 1000); // 1-hour event\n\n  const offsetMinutes = start.getTimezoneOffset();\n  const offsetHours = Math.floor(Math.abs(offsetMinutes) / 60);\n  const offsetMins = Math.abs(offsetMinutes) % 60;\n  const offsetSign = offsetMinutes > 0 ? \"-\" : \"+\";\n  const offset = `${offsetSign}${String(offsetHours).padStart(2, \"0\")}:${String(offsetMins).padStart(2, \"0\")}`;\n\n  const toISOStringWithOffset = (d) => {\n    const pad = (n) => n.toString().padStart(2, \"0\");\n    return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}T${pad(d.getHours())}:${pad(d.getMinutes())}:00${offset}`;\n  };\n\n  return {\n    start: toISOStringWithOffset(start),\n    end: toISOStringWithOffset(end),\n  };\n}\n\n// Step 3: Build cleaned and enriched event objects\nconst results = [];\n\nfor (let i = 0; i < eventCount; i++) {\n  const titleText = titles[i];\n  const timeText = times[i]?.trim();\n  const parsedTime = parseTimeToISO(timeText);\n\n  results.push({\n    json: {\n      title: titleText.split('\\n')[0]?.trim(),\n      description: titleText.trim(),\n      location: locations[i]?.trim(),\n      audience: audiences[i]?.trim(),\n      time: timeText,\n      start: { dateTime: parsedTime?.start || null },\n      end: { dateTime: parsedTime?.end || null },\n      sourceUrl: \"https://www.nypl.org\" + (titleText.match(/\\[([^\\]]+)\\]/)?.[1] || '')\n    }\n  });\n}\n\nreturn results;\n"},"typeVersion":2},{"id":"945e912a-609a-42e0-82a4-c3d36623a767","name":"Create Google Calendar Events","type":"n8n-nodes-base.googleCalendar","position":[-1700,220],"parameters":{"end":"={{ $json.end.dateTime }}","start":"={{ $json.start.dateTime }}","calendar":{"__rl":true,"mode":"list","value":"f14d18c7802fe01f77d5200ada9658c96cbc69b3cb9ff7b2914dc63bf6f263e3@group.calendar.google.com","cachedResultName":"Community Events"},"additionalFields":{"attendees":[],"description":"=Title: {{ $json.title }}\nDescription: {{ $json.description }}\nLocation: {{ $json.location }}\nAudience: {{ $json.audience }}\nTime: {{ $json.time }}"}},"credentials":{"googleCalendarOAuth2Api":{"id":"ZiXaTJAXCcyzY5iy","name":"Google Calendar account"}},"typeVersion":1.3},{"id":"6c5825a7-6a1e-485c-820b-ed4188c6b718","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-2800,-540],"parameters":{"color":5,"width":440,"height":980,"content":"## 🧭 **Section 1: Event Data Fetcher**\n\n### 🔁 `🕒 Daily Event Sync Trigger`\n\n> **Node:** *Schedule Trigger*\n> ⏰ This node sets **when** your automation runs. For example, you might want it to run every morning at 8:00 AM to check for new community events.\n\n🔍 Why it matters:\n\n> This ensures your public calendar is always up to date without manual work.\n\n---\n\n### 🌐 `🌐 Fetch Event Page (Bright Data)`\n\n> **Node:** *HTTP Request using Bright Data Web Unlocker*\n> 🛡 This node sends a request to a **local government or library event page** using Bright Data’s **Web Unlocker proxy**, which helps bypass blocks or bot detection.\n\n🔧 What’s special here:\n\n* It uses your **Bright Data proxy zone**\n* It targets a public events URL (e.g., a `.gov` or `.org`)\n* Makes sure you get the raw HTML page — even if the site tries to hide it\n\n✅ Benefit:\n\n> This lets you scrape data reliably from websites that are normally hard to reach for bots.\n\n---\n\n"},"typeVersion":1},{"id":"aa5624b4-6c2e-4d70-a05b-4e038ee82dfb","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-2300,-660],"parameters":{"color":3,"width":440,"height":1100,"content":"## 🧩 **Section 2: Smart Event Extractor**\n\n### 🧩 `🧩 Extract Event Data (HTML Parser)`\n\n> **Node:** *HTML*\n> 📄 This node parses the raw HTML response from the website and extracts useful information like:\n\n* 🏷 Event Titles\n* 📍 Locations\n* 👥 Target Audience\n* ⏰ Raw Times\n\nIt uses selectors (like CSS) to grab content from specific parts of the page.\n\n🎯 Goal:\n\n> Transform messy website code into **structured data** you can actually use.\n\n---\n\n### 🧠 `🧠 Clean & Format Event Data`\n\n> **Node:** *Code*\n> 🧼 This is the brain of your workflow. It takes the raw extracted data and:\n\n* Matches titles with their correct time/location\n* Skips garbage data like `\"Date/Time\"` headers\n* 🧮 Converts time to proper ISO format (like `2025-06-21T11:00:00-07:00`) for Google Calendar\n\n🚀 Bonus:\n\n> This ensures only **valid**, well-structured events are passed forward — nothing broken, empty, or misaligned.\n\n---\n\n"},"typeVersion":1},{"id":"b19c44ba-1abb-4d0b-a854-1d844163ffdf","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-1800,-240],"parameters":{"color":6,"width":320,"height":680,"content":"## 📅 **Section 3: Auto Calendar Creator**\n\n### 📅 `📅 Create Google Calendar Events`\n\n> **Node:** *Google Calendar*\n> 🧙‍♂️ This node automatically **creates public calendar events** using the cleaned-up data.\n\nHere’s what it sets:\n\n* **Summary:** Event title\n* **Description:** Full details (e.g., location, what it’s about)\n* **Start/End Time:** In the correct Google Calendar format\n\n"},"typeVersion":1},{"id":"85488a2c-a51a-4561-8f7d-44901a3a04a1","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[-4600,-500],"parameters":{"color":4,"width":1300,"height":320,"content":"=======================================\n            WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n    Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n   - YouTube: https://www.youtube.com/@YaronBeen/videos\n   - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"},"typeVersion":1},{"id":"2395bf91-efa9-4149-b411-38d18924c5c5","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-4600,-160],"parameters":{"color":4,"width":1289,"height":2298,"content":"# **📅 AutoSync Local Events to Google Calendar**\n\n### *A No-Code Automation to Scrape, Clean, and Publish Community Events*\n\n---\n## 🧭 **Section 1: Event Data Fetcher**\n\n### 🔁 `🕒 Daily Event Sync Trigger`\n\n> **Node:** *Schedule Trigger*\n> ⏰ This node sets **when** your automation runs. For example, you might want it to run every morning at 8:00 AM to check for new community events.\n\n🔍 Why it matters:\n\n> This ensures your public calendar is always up to date without manual work.\n\n---\n\n### 🌐 `🌐 Fetch Event Page (Bright Data)`\n\n> **Node:** *HTTP Request using Bright Data Web Unlocker*\n> 🛡 This node sends a request to a **local government or library event page** using Bright Data’s **Web Unlocker proxy**, which helps bypass blocks or bot detection.\n\n🔧 What’s special here:\n\n* It uses your **Bright Data proxy zone**\n* It targets a public events URL (e.g., a `.gov` or `.org`)\n* Makes sure you get the raw HTML page — even if the site tries to hide it\n\n✅ Benefit:\n\n> This lets you scrape data reliably from websites that are normally hard to reach for bots.\n\n---\n\n## 🧩 **Section 2: Smart Event Extractor**\n\n### 🧩 `🧩 Extract Event Data (HTML Parser)`\n\n> **Node:** *HTML*\n> 📄 This node parses the raw HTML response from the website and extracts useful information like:\n\n* 🏷 Event Titles\n* 📍 Locations\n* 👥 Target Audience\n* ⏰ Raw Times\n\nIt uses selectors (like CSS) to grab content from specific parts of the page.\n\n🎯 Goal:\n\n> Transform messy website code into **structured data** you can actually use.\n\n---\n\n### 🧠 `🧠 Clean & Format Event Data`\n\n> **Node:** *Code*\n> 🧼 This is the brain of your workflow. It takes the raw extracted data and:\n\n* Matches titles with their correct time/location\n* Skips garbage data like `\"Date/Time\"` headers\n* 🧮 Converts time to proper ISO format (like `2025-06-21T11:00:00-07:00`) for Google Calendar\n\n🚀 Bonus:\n\n> This ensures only **valid**, well-structured events are passed forward — nothing broken, empty, or misaligned.\n\n---\n\n## 📅 **Section 3: Auto Calendar Creator**\n\n### 📅 `📅 Create Google Calendar Events`\n\n> **Node:** *Google Calendar*\n> 🧙‍♂️ This node automatically **creates public calendar events** using the cleaned-up data.\n\nHere’s what it sets:\n\n* **Summary:** Event title\n* **Description:** Full details (e.g., location, what it’s about)\n* **Start/End Time:** In the correct Google Calendar format\n\n🫶 Why this matters:\n\n> Now your scraped community events are published straight to a **Google Calendar** — which you can embed on a website, share with citizens, or subscribe to.\n\n---\n\n## 🧩 Summary: Why This Workflow Rocks\n\n| 🔧 Step              | 📌 What It Does                                       | 🎁 Benefit to You                            |\n| -------------------- | ----------------------------------------------------- | -------------------------------------------- |\n| **Schedule Trigger** | Starts the automation daily                           | Keeps your calendar always fresh             |\n| **HTTP Request**     | Grabs raw event info from a gov/library site          | Reliable access to public event data         |\n| **HTML Parser**      | Pulls structured info from messy HTML                 | Turns code into useful content               |\n| **Code Node**        | Fixes formatting, converts time, aligns titles & more | Clean data ready for use                     |\n| **Calendar Node**    | Publishes events into your Google Calendar            | Fully automated public calendar — no effort! |\n\n---\n\n"},"typeVersion":1},{"id":"f4286f93-9457-4042-9b4d-bbb8304eaac1","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[-1420,-240],"parameters":{"color":7,"width":380,"height":240,"content":"## I’ll receive a tiny commission if you join Bright Data through this link—thanks for fueling more free content!\n\n### https://get.brightdata.com/1tndi4600b25"},"typeVersion":1}],"active":false,"settings":{"executionOrder":"v1"},"versionId":"69086b47-9272-4887-8844-db532999a0ba","connections":{"Daily Event Sync Trigger":{"main":[[{"node":"Fetch Event Page (Bright Data)","type":"main","index":0}]]},"Clean & Format Event Data":{"main":[[{"node":"Create Google Calendar Events","type":"main","index":0}]]},"Fetch Event Page (Bright Data)":{"main":[[{"node":"Extract Event Data (HTML Parser)","type":"main","index":0}]]},"Extract Event Data (HTML Parser)":{"main":[[{"node":"Clean & Format Event Data","type":"main","index":0}]]}}}


name: Real-Time Bitcoin Price Alerts with Bright Data & n8n
author_name: Yaron Been
author_username: yaron-nofluff
categories: []
created_at: 2025-06-24T15:54:04.538Z
updated_at: 2025-06-24T15:54:04.538Z
url: https://n8n.io/workflows/5217
scraped_at: 2025-07-06 21:16:30
description:
  Description

  This workflow monitors Bitcoin prices across multiple exchanges and sends you alerts when significant price drops occur. It helps crypto traders and investors identify buying opportunities without constantly watching the markets.

  Overview

  This workflow monitors Bitcoin prices across multiple exchanges and sends you alerts when significant price drops occur. It uses Bright Data to scrape real-time price data and can be configured to notify you through various channels.

  Tools Used

  n8n:** The automation platform that orchestrates the workflow.
  Bright Data:** For scraping cryptocurrency exchange data without getting blocked.
  Notification Services:** Email, SMS, Telegram, or other messaging platforms.

  How to Install

  Import the Workflow: Download the .json file and import it into your n8n instance.
  Configure Bright Data: Add your Bright Data credentials to the Bright Data node.
  Set Up Notifications: Configure your preferred notification method.
  Customize: Set your price thresholds, monitoring frequency, and which exchanges to track.

  Use Cases

  Crypto Traders:** Get notified of buying opportunities during price dips.
  Investors:** Monitor your crypto investments and make informed decisions.
  Financial Analysts:** Track Bitcoin price movements for market analysis.

  Connect with Me

  Website:** https://www.nofluff.online
  YouTube:** https://www.youtube.com/@YaronBeen/videos
  LinkedIn:** https://www.linkedin.com/in/yaronbeen/
  Get Bright Data:** https://get.brightdata.com/1tndi4600b25 (Using this link supports my free workflows with a small commission)

  #n8n #automation #bitcoin #cryptocurrency #brightdata #pricealerts #cryptotrading #bitcoinalerts #cryptoalerts #cryptomonitoring #n8nworkflow #workflow #nocode #cryptoinvesting #bitcoinprice #cryptomarket #tradingalerts #cryptotools #bitcointrading #pricemonitoring #cryptoautomation #bitcoininvestment #cryptotracker #marketalerts #tradingopportunities #cryptoprices

nodes_used:
  ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest","n8n-nodes-base.gmail","n8n-nodes-base.code","n8n-nodes-base.html"]

workflow_json:
  {"id":"HPuntqVPRH2UITi4","meta":{"instanceId":"60046904b104f0f72b2629a9d88fe9f676be4035769f1f08dad1dd38a76b9480"},"name":"Bitcoin_Price_Drop_Alert_System_via_Bright_Data","tags":[],"nodes":[{"id":"8746bf3b-5e6b-4f14-815d-4b774c3302c3","name":"Manual Trigger","type":"n8n-nodes-base.manualTrigger","position":[2040,780],"parameters":{},"typeVersion":1},{"id":"1a5d6ae5-9491-4199-a6fe-ae01593ebedd","name":"Get Last Recorded Price","type":"n8n-nodes-base.googleSheets","position":[2880,780],"parameters":{"options":{},"sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/15DSwLkRw9NK2RIhXLMjzysmF9QYa5afreDXFrDQNXPM/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"15DSwLkRw9NK2RIhXLMjzysmF9QYa5afreDXFrDQNXPM","cachedResultUrl":"https://docs.google.com/spreadsheets/d/15DSwLkRw9NK2RIhXLMjzysmF9QYa5afreDXFrDQNXPM/edit?usp=drivesdk","cachedResultName":"Bitcoin latest price"}},"credentials":{"googleSheetsOAuth2Api":{"id":"r2mDaisH6e9VkwHl","name":"Google Sheets account"}},"typeVersion":4.6},{"id":"b48cce2e-63f3-4b4a-b9e7-f7506695dd8a","name":"Send Alert Email","type":"n8n-nodes-base.gmail","position":[3780,600],"webhookId":"bb09c84f-b390-4ce6-937e-eaeaefc979c5","parameters":{"sendTo":"shahkar.genai@gmail.com","message":"=Hello,\n\nThe price of Bitcoin has dropped by {{ $json.dropPercent }}% since the last check.\n\nPrevious Price: {{ $json.previousPrice }}\nCurrent Price: {{ $json.currentPrice }}\n\nPlease review accordingly.\n\nBest regards,\nYour Crypto Monitor Bot\n`;\n","options":{"appendAttribution":false},"subject":"=Bitcoin Price has dropped {{ $json.dropPercent }}%","emailType":"text"},"credentials":{"gmailOAuth2":{"id":"AQDSl75AdzK3vmqJ","name":"Gmail account"}},"typeVersion":2.1},{"id":"d1f96797-9558-403d-a37c-604e07e76563","name":"No Alert Needed","type":"n8n-nodes-base.noOp","position":[3780,900],"parameters":{},"typeVersion":1},{"id":"208006b9-4cae-4199-9342-d7646fe38672","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[0,0],"parameters":{"color":4,"width":1300,"height":320,"content":"=======================================\n            WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n    Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n   - YouTube: https://www.youtube.com/@YaronBeen/videos\n   - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"},"typeVersion":1},{"id":"403e8b40-1a0f-464e-8d81-a162c0308252","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[0,340],"parameters":{"color":4,"width":1289,"height":2558,"content":"# 📉💰 **Bitcoin Price Drop Alert Workflow**\n\nThis automated workflow checks the current Bitcoin price and **sends an email alert if it drops by 5% or more** compared to the last recorded value. It’s split into 3 easy-to-understand sections:\n\n---\n\n## 🔎 **Section 1: Fetch the Current Bitcoin Price**\n\n🧩 **Nodes:**\n\n1. **⚡ Manual Trigger**\n2. **🌐 Fetch Bitcoin Price**\n3. **🧱 Extract Price**\n\n### 🧠 What Happens:\n\n* **⚡ Manual Trigger**\n  This starts the process manually. Think of it like pressing a \"Start\" button.\n\n* **🌐 Fetch Bitcoin Price**\n  Uses the [Bright Data API](https://brightdata.com/) to scrape the live Bitcoin price from a specific website using a POST request.\n\n* **🧱 Extract Price**\n  Extracts the **exact price value** from the scraped HTML using selectors (like CSS paths).\n\n### 💡 Why It’s Useful:\n\nYou can track the **real-time price** of Bitcoin straight from any public site, even those not offering official APIs. It's like building your own live feed.\n\n---\n\n## 📊 **Section 2: Calculate and Compare with Historical Price**\n\n🧩 **Nodes:**\n4\\. **🔄 Convert Type**\n5\\. **📗 Get Last Recorded Price (Google Sheet)**\n6\\. **📉 Find Drop Percentage**\n\n### 🧠 What Happens:\n\n* **🔄 Convert Type**\n  Converts the price from a text format to a number so we can calculate with it.\n\n* **📗 Get Last Recorded Price**\n  Pulls the **previous Bitcoin price** from a Google Sheet (a record from last check). Acts like your “memory”.\n\n* **📉 Find Drop Percentage**\n  Calculates how much the price has dropped:\n\n  $$\n  \\text{Drop (\\%)} = \\frac{\\text{Previous Price - Current Price}}{\\text{Previous Price}} \\times 100\n  $$\n\n### 💡 Why It’s Useful:\n\nYou’re comparing real-time data with past values automatically—no spreadsheets or calculators needed! This makes it ideal for **traders or enthusiasts** watching for price alerts.\n\n---\n\n## 🚨 **Section 3: Send Alert if Drop ≥ 5%**\n\n🧩 **Nodes:**\n7\\. **🔀 If droppercentage >= 5**\n8\\. **📧 Send Alert Email**\n9\\. **➡️ No Alert Needed**\n\n### 🧠 What Happens:\n\n* **🔀 If Statement**\n  Checks: Has the price dropped by **5% or more**?\n\n* **📧 Send Alert Email** (if true)\n  Automatically sends an email to notify you about the drop. This could go to your inbox, or a team.\n\n* **➡️ No Alert Needed** (if false)\n  The workflow ends quietly without doing anything else.\n\n### 💡 Why It’s Useful:\n\nIt **only alerts you when it matters**, saving your attention for big changes. You don’t need to monitor prices all day.\n\n---\n\n## 🎁 **Final Benefits:**\n\n✅ **No coding required**\n✅ **Real-time price check**\n✅ **Smart alerts based on thresholds**\n✅ **Great for traders, analysts, or crypto fans**\n✅ **Fully extendable** – you could log alerts, update the sheet, send Slack/Telegram messages, etc.\n\n---\n\n## 🌈 BONUS IDEA:\n\nWant it to run automatically? Add a **🕒 Cron Trigger** to check every 10 mins, 1 hour, or even daily!\n\n---\n"},"typeVersion":1},{"id":"201e7c73-d960-47c5-934e-f8fe0630ca2c","name":"Fetch Bitcoin Price","type":"n8n-nodes-base.httpRequest","position":[2240,780],"parameters":{"url":"https://api.brightdata.com/request","method":"POST","options":{},"sendBody":true,"sendHeaders":true,"bodyParameters":{"parameters":[{"name":"zone","value":"n8n_unblocker"},{"name":"url","value":"https://coinmarketcap.com/currencies/bitcoin/"},{"name":"country","value":"us"},{"name":"format","value":"raw"}]},"headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer YOUR_TOKEN_HERE"}]}},"typeVersion":4.2},{"id":"ff6d0c30-0e72-4a28-9628-b94606461a20","name":"Extract Price","type":"n8n-nodes-base.html","position":[2440,780],"parameters":{"options":{},"operation":"extractHtmlContent","extractionValues":{"values":[{"key":"price","cssSelector":"<span class=\"sc-65e7f566-0 esyGGG base-text\" data-test=\"text-cdp-price-display\">$105,095.42</span>"}]}},"typeVersion":1.2},{"id":"759e26b7-a260-469e-ba17-fc5bee7be762","name":"Convert type","type":"n8n-nodes-base.code","position":[2660,780],"parameters":{"jsCode":"return items.map(item => {\n  const priceStr = item.json.price;\n  const priceNumber = parseFloat(priceStr.replace(/[$,]/g, ''));\n  return {\n    json: {\n      price: priceNumber\n    }\n  };\n});\n"},"typeVersion":2},{"id":"c33e81f4-f06e-4e47-942f-4764027f270c","name":"Find drop percentage","type":"n8n-nodes-base.code","position":[3100,780],"parameters":{"jsCode":"// Extract current and previous price from separate input items\nconst currentPrice = $('Convert type').first().json.price;\nconst previousPrice = $input.first().json.Price;\n\nconst dropPercent = previousPrice !== 0 \n  ? ((previousPrice - currentPrice) / previousPrice) * 100 \n  : 0;\n\nreturn [{\n  json: {\n    currentPrice,\n    previousPrice,\n    dropPercent: parseFloat(dropPercent.toFixed(2))\n  }\n}];\n"},"typeVersion":2},{"id":"cb64ae28-6086-4301-85b7-a8bdac6c2370","name":"If droppercentage >= 5","type":"n8n-nodes-base.if","position":[3420,780],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"9b9dfa4e-92d1-408e-90f0-355141f73d54","operator":{"type":"number","operation":"gte"},"leftValue":"={{ $json.dropPercent }}","rightValue":5}]}},"typeVersion":2.2},{"id":"08bcbb20-2f85-45c9-b56e-61edb70ccd74","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[2020,0],"parameters":{"color":3,"width":540,"height":980,"content":"## 🔎 **Section 1: Fetch the Current Bitcoin Price**\n\n🧩 **Nodes:**\n\n1. **⚡ Manual Trigger**\n2. **🌐 Fetch Bitcoin Price**\n3. **🧱 Extract Price**\n\n### 🧠 What Happens:\n\n* **⚡ Manual Trigger**\n  This starts the process manually. Think of it like pressing a \"Start\" button.\n\n* **🌐 Fetch Bitcoin Price**\n  Uses the [Bright Data API](https://brightdata.com/) to scrape the live Bitcoin price from a specific website using a POST request.\n\n* **🧱 Extract Price**\n  Extracts the **exact price value** from the scraped HTML using selectors (like CSS paths).\n\n### 💡 Why It’s Useful:\n\nYou can track the **real-time price** of Bitcoin straight from any public site, even those not offering official APIs. It's like building your own live feed.\n\n---\n\n"},"typeVersion":1},{"id":"9c153740-4fb9-4ab7-b129-c6bc8c61c274","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[2640,-40],"parameters":{"color":5,"width":600,"height":1020,"content":"## 📊 **Section 2: Calculate and Compare with Historical Price**\n\n🧩 **Nodes:**\n4\\. **🔄 Convert Type**\n5\\. **📗 Get Last Recorded Price (Google Sheet)**\n6\\. **📉 Find Drop Percentage**\n\n### 🧠 What Happens:\n\n* **🔄 Convert Type**\n  Converts the price from a text format to a number so we can calculate with it.\n\n* **📗 Get Last Recorded Price**\n  Pulls the **previous Bitcoin price** from a Google Sheet (a record from last check). Acts like your “memory”.\n\n* **📉 Find Drop Percentage**\n  Calculates how much the price has dropped:\n\n  $$\n  \\text{Drop (\\%)} = \\frac{\\text{Previous Price - Current Price}}{\\text{Previous Price}} \\times 100\n  $$\n\n### 💡 Why It’s Useful:\n\nYou’re comparing real-time data with past values automatically—no spreadsheets or calculators needed! This makes it ideal for **traders or enthusiasts** watching for price alerts.\n\n---\n\n"},"typeVersion":1},{"id":"58dbf6d5-371f-4123-8838-5c6f40185711","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[3380,100],"parameters":{"color":6,"width":540,"height":940,"content":"## 🚨 **Section 3: Send Alert if Drop ≥ 5%**\n\n🧩 **Nodes:**\n7\\. **🔀 If droppercentage >= 5**\n8\\. **📧 Send Alert Email**\n9\\. **➡️ No Alert Needed**\n\n### 🧠 What Happens:\n\n* **🔀 If Statement**\n  Checks: Has the price dropped by **5% or more**?\n\n* **📧 Send Alert Email** (if true)\n  Automatically sends an email to notify you about the drop. This could go to your inbox, or a team.\n\n* **➡️ No Alert Needed** (if false)\n  The workflow ends quietly without doing anything else.\n\n\n"},"typeVersion":1},{"id":"a9608daf-aff9-460a-8ca5-14c1fc41916e","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[4000,100],"parameters":{"color":7,"width":380,"height":240,"content":"## I’ll receive a tiny commission if you join Bright Data through this link—thanks for fueling more free content!\n\n### https://get.brightdata.com/1tndi4600b25"},"typeVersion":1}],"active":false,"settings":{"executionOrder":"v1"},"versionId":"125a795b-a427-4a83-abee-62fe60538000","connections":{"Convert type":{"main":[[{"node":"Get Last Recorded Price","type":"main","index":0}]]},"Extract Price":{"main":[[{"node":"Convert type","type":"main","index":0}]]},"Manual Trigger":{"main":[[{"node":"Fetch Bitcoin Price","type":"main","index":0}]]},"Fetch Bitcoin Price":{"main":[[{"node":"Extract Price","type":"main","index":0}]]},"Find drop percentage":{"main":[[{"node":"If droppercentage >= 5","type":"main","index":0}]]},"If droppercentage >= 5":{"main":[[{"node":"Send Alert Email","type":"main","index":0}],[{"node":"No Alert Needed","type":"main","index":0}]]},"Get Last Recorded Price":{"main":[[{"node":"Find drop percentage","type":"main","index":0}]]}}}


name: Find the Cheapest Flights Automatically with Bright Data & n8n
author_name: Yaron Been
author_username: yaron-nofluff
nodes_used: ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest","n8n-nodes-base.html"]
categories: []
created_at: 2025-06-24T15:54:24.914Z
updated_at: 2025-06-24T15:54:24.914Z
url: https://n8n.io/workflows/5218
scraped_at: 2025-07-06 21:16:30
description:
  Description

  This workflow automatically searches multiple flight booking websites to find the cheapest flights for your desired routes. It leverages web scraping to compare prices across platforms, helping you save money on air travel.

  Overview

  This workflow automatically searches multiple flight booking websites to find the cheapest flights for your desired routes. It uses Bright Data to scrape flight prices and can notify you when prices drop below your target threshold.

  Tools Used

  n8n:** The automation platform that orchestrates the workflow.
  Bright Data:** For scraping flight prices from booking websites.
  Notification Services:** Email, SMS, or other messaging platforms.

  How to Install

  Import the Workflow: Download the .json file and import it into your n8n instance.
  Configure Bright Data: Add your Bright Data credentials to the Bright Data node.
  Set Up Notifications: Configure your preferred notification method.
  Customize: Set your routes, date ranges, and price thresholds.

  Use Cases

  Frequent Travelers:** Find the best deals for your regular routes.
  Travel Agencies:** Monitor flight prices for client bookings.
  Budget Travelers:** Get notified when flights to your dream destination become affordable.

  Connect with Me

  YouTube:** https://www.youtube.com/@YaronBeen/videos
  LinkedIn:** https://www.linkedin.com/in/yaronbeen/
  Get Bright Data:** https://get.brightdata.com/1tndi4600b25 (Using this link supports my free workflows with a small commission)

  #n8n #automation #travel #flights #brightdata #dealalerts #webscraping #flightdeals #cheapflights #travelhacks #budgettravel #travelplanning #airfare #flightprices #travelautomation #n8nworkflow #workflow #nocode #traveltech #flightbooking #savemoney #traveltools #flightcomparison #bestflightdeals #travelsmarter #automatedtravel

workflow_json:
  {"id":"YhwckWo4y8FNZ4v4","meta":{"instanceId":"60046904b104f0f72b2629a9d88fe9f676be4035769f1f08dad1dd38a76b9480","templateCredsSetupCompleted":true},"name":"Cheapest_Flight_Finder_via_Bright_Data","tags":[],"nodes":[{"id":"6da8e17f-3448-4195-b812-43564470d376","name":"Manual Trigger","type":"n8n-nodes-base.manualTrigger","position":[-480,2340],"parameters":{},"typeVersion":1},{"id":"6e92c67b-3e06-4de8-ac8f-f09d33bc6115","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[-2460,500],"parameters":{"color":4,"width":1300,"height":320,"content":"=======================================\n            WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n    Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n   - YouTube: https://www.youtube.com/@YaronBeen/videos\n   - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"},"typeVersion":1},{"id":"ffb0ba94-e697-409d-9190-1e6f8656c775","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-2460,840],"parameters":{"color":4,"width":1289,"height":2458,"content":"# 🧳 ✈️ **Flight Price Scraper from Skiplagged using Bright Data**\n\nThis automation helps you extract **cheap flight prices** from [Skiplagged.com](https://skiplagged.com) using **Bright Data** and automatically logs those prices into a **Google Sheet** for review and tracking.\n\n---\n\n## 🔹 **SECTION 1: Getting the Flight Prices**\n\n*Combining: Manual Trigger + HTTP Request (Bright Data)*\n\n### 🌩️ 1. **Manual Trigger**\n\n* **🧠 What it does**: Starts the workflow when you click **Execute Workflow** in n8n.\n* **👨‍🏫 For beginners**: Think of it like a **start button**. No schedule, just run it manually whenever you want to check for deals.\n\n---\n\n### 🌐 2. **Fetch Flight Details from Skiplagged via Bright Data**\n\n* **🔧 Node Type**: `HTTP Request` (POST)\n\n* **🌍 What's happening**:\n\n  * Uses Bright Data Web Unlocker to **bypass bot protection** and fetch HTML content from Skiplagged.\n  * You’re sending a POST request to `https://api.brightdata.com/request`, asking Bright Data to open:\n    `https://skiplagged.com/flights/DUB/LON/2024-06-30` (or a dynamic route).\n  * Headers & proxy make it **look like a real browser**.\n\n* **💡 Why it’s useful**:\n\n  * **Skiplagged is tricky to scrape** directly, but Bright Data makes it easy.\n  * You get the **entire HTML** of the search results page, ready to extract price info.\n\n* ✅ **Returns**: HTML of the page (not yet structured — we handle that next)\n\n---\n\n## 🔹 **SECTION 2: Extracting & Storing Flight Prices**\n\n*Combining: HTML Node + Google Sheets*\n\n### 🖥️ 3. **HTML Extract (extractHtmlContent)**\n\n* **🔧 Node Type**: `HTML Extract`\n\n* **🎯 Goal**: Pull out **all flight prices** from the raw HTML.\n\n* **How it works**:\n\n  * Uses a selector like `.flights-landing__flight-price` to find every element that matches.\n  * **Returns multiple values** if \"Return All Matches\" is enabled.\n\n* 🧠 **Beginner Note**: Imagine your browser looking for all `<div class=\"flights-landing__flight-price\">`. This is like **copying all price tags off the screen**.\n\n* ✅ **Returns**:\n\n  ```json\n  [\n    \"$104\", \"$117\", \"$99\", \"$88\"\n  ]\n  ```\n\n---\n\n### 📊 4. **Google Sheets (append: sheet)**\n\n* **🔧 Node Type**: `Google Sheets Append`\n\n* **📋 What it does**: Appends each flight price as a new row in your spreadsheet.\n\n* **🛠️ Tip**: Make sure your sheet has one column titled something like `Price` and authentication is set up.\n\n* ❌ **Error Warning**: If this node is red, likely issues are:\n\n  * Missing Google credentials\n  * Sheet name doesn’t match\n  * Field mapping mismatch\n\n* ✅ **Returns**: New rows in your sheet like:\n\n| Price |\n| ----- |\n| \\$88  |\n| \\$99  |\n| \\$104 |\n\n---\n\n## 🌟 Final Thoughts: Why This Is Powerful\n\n✅ **Perfect for spontaneous travelers** who want to grab last-minute deals.\n✅ **Low-cost** thanks to free tools (n8n + Google Sheets) and flexible Bright Data usage.\n✅ **Easy to expand**: Add logic to filter cheapest flight, add Telegram/email alert, or schedule it daily.\n\n---\n\n## 🧭 Next Steps You Could Add\n\n* 📅 Add a **Cron node** to automate daily checks.\n* 📬 Add **Telegram or Email node** to notify when price < \\$100.\n* 🔧 Use **Set node** to make route and date dynamic.\n\n---\n\n\n"},"typeVersion":1},{"id":"3e3a26e0-eeed-4a0f-85bb-ac49e438eb43","name":"HTML","type":"n8n-nodes-base.html","position":[20,2340],"parameters":{"options":{},"operation":"extractHtmlContent","extractionValues":{"values":[{"key":"Title","cssSelector":"<span class=\"flights-landing__flight-logo-txt\" data-translate=\"false\">United</span>"},{"key":"Price","cssSelector":"<div class=\"flights-landing__flight-price\">$114</div>"}]}},"typeVersion":1.2},{"id":"4213760f-1d00-4d4c-b918-5b46728c78e8","name":"Google Sheets","type":"n8n-nodes-base.googleSheets","position":[240,2340],"parameters":{"operation":"append","sheetName":{"__rl":true,"mode":"list","value":""},"documentId":{"__rl":true,"mode":"list","value":""}},"credentials":{"googleSheetsOAuth2Api":{"id":"r2mDaisH6e9VkwHl","name":"Google Sheets account"}},"typeVersion":4.6},{"id":"c1bda948-e9f0-4539-ba18-fa37ac431d91","name":"Fetch flight details from skiplegged via bright data","type":"n8n-nodes-base.httpRequest","position":[-260,2340],"parameters":{"url":"https://api.brightdata.com/request","method":"POST","options":{},"jsonBody":"{\n  \"zone\": \"n8n_unblocker\",\n  \"url\": \"https://skiplagged.com/flights/NYC/LAX/2024-07-01\",\n  \"country\": \"ie\",\n  \"format\": \"raw\",\n  \"headers\": {\n    \"User-Agent\": \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36\",\n    \"Accept-Language\": \"en-US,en;q=0.9\",\n    \"Accept\": \"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\"\n  }\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer YOUR_TOKEN_HERE"}]}},"typeVersion":4.2},{"id":"6f4009d4-bd47-4bda-a4b1-cd6bdfa59821","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[-500,1340],"parameters":{"color":3,"width":400,"height":1200,"content":"## 🔹 **SECTION 1: Getting the Flight Prices**\n\n*Combining: Manual Trigger + HTTP Request (Bright Data)*\n\n### 🌩️ 1. **Manual Trigger**\n\n* **🧠 What it does**: Starts the workflow when you click **Execute Workflow** in n8n.\n* **👨‍🏫 For beginners**: Think of it like a **start button**. No schedule, just run it manually whenever you want to check for deals.\n\n---\n\n### 🌐 2. **Fetch Flight Details from Skiplagged via Bright Data**\n\n* **🔧 Node Type**: `HTTP Request` (POST)\n\n* **🌍 What's happening**:\n\n  * Uses Bright Data Web Unlocker to **bypass bot protection** and fetch HTML content from Skiplagged.\n  * You’re sending a POST request to `https://api.brightdata.com/request`, asking Bright Data to open:\n    `https://skiplagged.com/flights/DUB/LON/2024-06-30` (or a dynamic route).\n  * Headers & proxy make it **look like a real browser**.\n\n* **💡 Why it’s useful**:\n\n  * **Skiplagged is tricky to scrape** directly, but Bright Data makes it easy.\n  * You get the **entire HTML** of the search results page, ready to extract price info.\n\n* ✅ **Returns**: HTML of the page (not yet structured — we handle that next)\n\n---\n\n"},"typeVersion":1},{"id":"15115b20-c08a-4953-be0b-8e7a7f2a4030","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[-20,1080],"parameters":{"color":5,"width":400,"height":1460,"content":"## 🔹 **SECTION 2: Extracting & Storing Flight Prices**\n\n*Combining: HTML Node + Google Sheets*\n\n### 🖥️ 3. **HTML Extract (extractHtmlContent)**\n\n* **🔧 Node Type**: `HTML Extract`\n\n* **🎯 Goal**: Pull out **all flight prices** from the raw HTML.\n\n* **How it works**:\n\n  * Uses a selector like `.flights-landing__flight-price` to find every element that matches.\n  * **Returns multiple values** if \"Return All Matches\" is enabled.\n\n* 🧠 **Beginner Note**: Imagine your browser looking for all `<div class=\"flights-landing__flight-price\">`. This is like **copying all price tags off the screen**.\n\n* ✅ **Returns**:\n\n  ```json\n  [\n    \"$104\", \"$117\", \"$99\", \"$88\"\n  ]\n  ```\n\n---\n\n### 📊 4. **Google Sheets (append: sheet)**\n\n* **🔧 Node Type**: `Google Sheets Append`\n\n* **📋 What it does**: Appends each flight price as a new row in your spreadsheet.\n\n* **🛠️ Tip**: Make sure your sheet has one column titled something like `Price` and authentication is set up.\n\n* ❌ **Error Warning**: If this node is red, likely issues are:\n\n  * Missing Google credentials\n  * Sheet name doesn’t match\n  * Field mapping mismatch\n\n* ✅ **Returns**: New rows in your sheet like:\n\n| Price |\n| ----- |\n| \\$88  |\n| \\$99  |\n| \\$104 |\n\n---\n"},"typeVersion":1},{"id":"b151fc17-d628-4e38-a5e7-91b2555b8e1f","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[460,1080],"parameters":{"color":7,"width":380,"height":240,"content":"## I’ll receive a tiny commission if you join Bright Data through this link—thanks for fueling more free content!\n\n### https://get.brightdata.com/1tndi4600b25"},"typeVersion":1}],"active":false,"settings":{"executionOrder":"v1"},"versionId":"d966578d-4e22-4067-b7b6-1b310276ba5a","connections":{"HTML":{"main":[[{"node":"Google Sheets","type":"main","index":0}]]},"Manual Trigger":{"main":[[{"node":"Fetch flight details from skiplegged via bright data","type":"main","index":0}]]},"Fetch flight details from skiplegged via bright data":{"main":[[{"node":"HTML","type":"main","index":0}]]}}}


name: Automated Competitor Price Monitoring with Bright Data & n8n
author_name: Yaron Been
author_username: yaron-nofluff
categories: []
created_at: 2025-06-24T15:54:46.724Z
updated_at: 2025-06-24T15:54:46.724Z
url: https://n8n.io/workflows/5219
scraped_at: 2025-07-06 21:16:30
description:
  Description

  This workflow automatically monitors your competitors' product prices and notifies you of any changes. It helps you stay competitive in the market by providing real-time insights into pricing strategies without manual checking.

  Overview

  This workflow automatically tracks your competitors' pricing across their websites and notifies you of any changes. It uses Bright Data to scrape pricing data and can generate reports or send alerts when prices change.

  Tools Used

  n8n:** The automation platform that orchestrates the workflow.
  Bright Data:** For scraping competitor websites without being blocked.
  Spreadsheets/Databases:** For storing and analyzing price data.
  Notification Services:** For alerting you to significant price changes.

  How to Install

  Import the Workflow: Download the .json file and import it into your n8n instance.
  Configure Bright Data: Add your Bright Data credentials to the Bright Data node.
  Set Up Data Storage: Configure where you want to store the price data.
  Customize: Add your competitors' URLs and the specific products to monitor.

  Use Cases

  E-commerce Businesses:** Stay competitive with real-time price monitoring.
  Pricing Analysts:** Automate data collection for pricing strategy.
  Retailers:** Adjust your pricing strategy based on market trends.

  Connect with Me

  Website:** https://www.nofluff.online
  YouTube:** https://www.youtube.com/@YaronBeen/videos
  LinkedIn:** https://www.linkedin.com/in/yaronbeen/
  Get Bright Data:** https://get.brightdata.com/1tndi4600b25 (Using this link supports my free workflows with a small commission)

  #n8n #automation #pricing #competitoranalysis #brightdata #ecommerce #pricemonitoring #competitiveintelligence #pricetracking #marketanalysis #n8nworkflow #workflow #nocode #pricingstrategy #competitortracking #ecommercetools #pricecomparison #businessintelligence #marketresearch #competitivepricing #retailautomation #pricealerts #datadriven #webscraping #pricinganalysis #competitorinsights

nodes_used:
  ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest","n8n-nodes-base.gmail","n8n-nodes-base.code","n8n-nodes-base.html"]

workflow_json:
  {"id":"6RP5sxs8BvIIinq2","meta":{"instanceId":"60046904b104f0f72b2629a9d88fe9f676be4035769f1f08dad1dd38a76b9480"},"name":"Competitor_Price_Monitoring_via_Bright_Data","tags":[],"nodes":[{"id":"0fa21dc1-fae9-45ca-b2a9-8c4dc212c964","name":"Check Pricing Every Day","type":"n8n-nodes-base.scheduleTrigger","position":[-1400,1000],"parameters":{"rule":{"interval":[{"triggerAtHour":9}]}},"typeVersion":1.2},{"id":"58e4effc-32b1-4767-bc79-1f5147a00c4e","name":"Fetch Page via Bright Data","type":"n8n-nodes-base.httpRequest","position":[-1180,1000],"parameters":{"url":"https://api.brightdata.com/request","method":"POST","options":{},"jsonBody":"{\n  \"zone\": \"n8n_unblocker\",\n  \"url\": \"https://www.shopify.com/uk/pricing\",\n  \"country\": \"us\",\n  \"format\": \"raw\",\n  \"headers\": {\n    \"User-Agent\": \"Mozilla/5.0\",\n    \"Accept\": \"text/html\"\n  }\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer YOUR_TOKEN_HERE"}]}},"typeVersion":4.2},{"id":"d1bfc4d4-5951-459f-8dd9-65cbeee325ea","name":"Extract HTML Content","type":"n8n-nodes-base.html","position":[-960,1000],"parameters":{"options":{},"operation":"extractHtmlContent","extractionValues":{"values":[{"key":"Plan name","cssSelector":"h3","returnArray":true},{"key":"Pricing","cssSelector":"span","returnArray":true}]}},"typeVersion":1.2},{"id":"4983085d-a355-4f1a-8141-cbb622e94776","name":"Format & Isolate Price Block","type":"n8n-nodes-base.code","position":[-760,1000],"parameters":{"jsCode":"// Step 1: Get data from the previous node\nconst inputData = items[0].json;\n\n// Extract plan names and pricing blocks\nconst planNames = inputData[\"Plan name\"];\nconst pricingList = inputData[\"Pricing\"];\n\n// Regex to match entries like \"$2,300USD/month\"\nconst priceRegex = /\\$[\\d,]+USD\\/month/;\n\n// Step 2: Extract only valid price strings\nconst prices = pricingList.filter(item => typeof item === 'string' && priceRegex.test(item));\n\n// Clean prices: \"$2,300USD/month\" -> 2300 (number)\nconst cleanedPrices = prices.map(p => {\n  const match = p.match(/\\$[\\d,]+/);\n  if (match) {\n    return parseFloat(match[0].replace(/[$,]/g, ''));\n  }\n  return null;\n}).filter(p => p !== null);\n\n// Step 3: Build result object\nconst planPriceMap = {};\n\nfor (let i = 0; i < planNames.length; i++) {\n  const plan = planNames[i];\n\n  if (['Basic', 'Grow', 'Advanced', 'Plus'].includes(plan) && !(plan in planPriceMap)) {\n    planPriceMap[plan] = cleanedPrices.shift() ?? null;\n  }\n}\n\n// Step 4: Return final structured item\nreturn [\n  {\n    json: planPriceMap\n  }\n];\n"},"typeVersion":2},{"id":"178945da-4167-43d1-af20-f3acb8003f17","name":"Read Last Saved Price","type":"n8n-nodes-base.googleSheets","position":[-520,1000],"parameters":{"options":{},"sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1LTGVeEXaU1PSMcNWI6beT_IuETKH147vfi8vAtWJ0MQ/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1LTGVeEXaU1PSMcNWI6beT_IuETKH147vfi8vAtWJ0MQ","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1LTGVeEXaU1PSMcNWI6beT_IuETKH147vfi8vAtWJ0MQ/edit?usp=drivesdk","cachedResultName":"Competitor price analyzer"}},"credentials":{"googleSheetsOAuth2Api":{"id":"r2mDaisH6e9VkwHl","name":"Google Sheets account"}},"typeVersion":4.6},{"id":"67534ae0-f365-4e11-b244-73cc999ed47a","name":"Has Price Changed?","type":"n8n-nodes-base.if","position":[-300,1000],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"2ca35690-3534-40c4-8d79-02833e331e17","operator":{"type":"number","operation":"equals"},"leftValue":"={{ $('Format & Isolate Price Block').item.json.Basic }}","rightValue":"={{ $json.Basic }}"},{"id":"fe7e3cac-d614-4962-82a4-d3e06464ae14","operator":{"type":"number","operation":"equals"},"leftValue":"={{ $('Format & Isolate Price Block').item.json.Grow }}","rightValue":"={{ $json.Grow }}"},{"id":"bf877945-b2f4-48f9-be88-c3e97600c984","operator":{"type":"number","operation":"equals"},"leftValue":"={{ $('Format & Isolate Price Block').item.json.Advanced }}","rightValue":"={{ $json.Advanced }}"},{"id":"5045eaa9-4798-4ca8-83e3-6c8c51a297d2","operator":{"type":"number","operation":"equals"},"leftValue":"={{ $('Format & Isolate Price Block').item.json.Plus }}","rightValue":"={{ $json.Plus }}"}]}},"typeVersion":2.2},{"id":"023f6e01-6625-4310-a61f-4dac9748c19d","name":"No Change Detected – Stop","type":"n8n-nodes-base.noOp","position":[60,800],"parameters":{},"typeVersion":1},{"id":"eaf629e8-eb2d-49b2-a568-a87c52dbe131","name":"Update Stored Price","type":"n8n-nodes-base.googleSheets","position":[60,1180],"parameters":{"columns":{"value":{"Grow":"={{ $json.Grow }}","Plus":"={{ $json.Plus }}","Basic":"={{ $json.Basic }}","Advanced":"={{ $json.Advanced }}","row_number":"={{ $json.row_number }}"},"schema":[{"id":"Basic","type":"string","display":true,"required":false,"displayName":"Basic","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Grow","type":"string","display":true,"required":false,"displayName":"Grow","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Advanced","type":"string","display":true,"required":false,"displayName":"Advanced","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Plus","type":"string","display":true,"required":false,"displayName":"Plus","defaultMatch":false,"canBeUsedToMatch":true},{"id":"row_number","type":"string","display":true,"removed":false,"readOnly":true,"required":false,"displayName":"row_number","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["row_number"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"update","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1LTGVeEXaU1PSMcNWI6beT_IuETKH147vfi8vAtWJ0MQ/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1LTGVeEXaU1PSMcNWI6beT_IuETKH147vfi8vAtWJ0MQ","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1LTGVeEXaU1PSMcNWI6beT_IuETKH147vfi8vAtWJ0MQ/edit?usp=drivesdk","cachedResultName":"Competitor price analyzer"}},"credentials":{"googleSheetsOAuth2Api":{"id":"r2mDaisH6e9VkwHl","name":"Google Sheets account"}},"typeVersion":4.6},{"id":"7505ca0e-f968-437e-a4ca-0cdbd4fee93b","name":"Send Price Change Alert Email","type":"n8n-nodes-base.gmail","position":[280,1180],"webhookId":"b2bf0aba-123e-489e-9669-4034d16a060c","parameters":{"sendTo":"shahkar.genai@gmail.com","message":"=<p>Hi Team,</p>  <p>This is an automated alert to inform you that the pricing page of a competitor has changed.</p>  <ul>   <li><strong>Competitor:</strong> Wix</li>   <li><strong>Page URL:</strong> <a href=\"https://www.wix.com/upgrade/website\">https://www.wix.com/upgrade/website</a></li>   <li><strong>Checked On:</strong> {{ $now }}</li> </ul>  <p>Please review the new pricing to assess if any strategic adjustments are needed.\nPlease check in Google sheets for the latest pricing as soon as possible\n</p>  <p>Best regards,<br>Muhammad Shahkar </p>","options":{"appendAttribution":false},"subject":"Competitor Pricing Page Has Changed"},"credentials":{"gmailOAuth2":{"id":"AQDSl75AdzK3vmqJ","name":"Gmail account"}},"typeVersion":2.1},{"id":"494ab1e4-de04-4a98-acca-a0e8e242575c","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-1460,640],"parameters":{"color":6,"width":840,"height":540,"content":"\n## 🟢 **SECTION 1: Fetch the Latest Pricing Info**\n\n### 📡 Scheduled Scraping Using Bright Data\n\n| 🧩 Nodes Involved                   | 💬 Description                                                                                                                                               |\n| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| 🕒 **Check Pricing Every Hour**     | This **Schedule Trigger** runs your workflow automatically (e.g., every hour). You don’t have to manually check the website.                                 |\n| 🌐 **Fetch Page via Bright Data**   | Uses **Bright Data Web Unlocker API** to bypass bot protections and fetch the HTML of the pricing page from a competitor site (e.g., Wix, Squarespace, etc). |\n| 🧾 **Extract HTML Content**         | This node pulls out the actual **HTML code** of the page from the API response, ready to be analyzed.                                                        |\n| 🔧 **Format & Isolate Price Block** | This custom code node filters or extracts just the **pricing section** (e.g., plan names, \\$ amounts) from the HTML to compare later.                        |\n\n> ✅ **Advantage for Beginners**: You don’t need to manually visit or inspect the site. Everything is automated and updated behind the scenes.\n\n---\n\n"},"typeVersion":1},{"id":"a9beb646-c639-408c-a3c4-678e19e7bee2","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-580,520],"parameters":{"color":3,"width":440,"height":660,"content":"## 🟡 **SECTION 2: Check If the Price Has Changed**\n\n### 🔍 Compare New Data with the Last Saved One\n\n| 🧩 Nodes Involved            | 💬 Description                                                                                                                                                                                          |\n| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 📄 **Read Last Saved Price** | This reads from a **Google Sheet** that stores the **last known pricing data**. This becomes your reference point for comparison.                                                                       |\n| 🔁 **Has Price Changed?**    | A simple **IF condition** compares the current scraped pricing to the previously saved one. If the content is **exactly the same**, nothing happens. If it's **different**, it moves to the alert flow. |\n\n> ✅ **Advantage for Beginners**: No need for complex logic. n8n handles the comparison using a basic condition node.\n\n---"},"typeVersion":1},{"id":"cdb1ef33-fcbb-449d-b81e-b7f8cbaf7a18","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[0,0],"parameters":{"color":5,"width":440,"height":1360,"content":"## 🔴 **SECTION 3: Alert & Save New Price**\n\n### 🚨 Notify + Update Sheet\n\n| 🧩 Nodes Involved                    | 💬 Description                                                                                                                                          |\n| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| ➖ **No Change Detected – Stop**      | If no changes were found, this does nothing and exits. Keeps your flow efficient.                                                                       |\n| 📄 **Update Stored Price**           | If the price **has changed**, it writes the new value to the **Google Sheet** so future comparisons are accurate.                                       |\n| 📧 **Send Price Change Alert Email** | This node sends a **professional email** (via Gmail) to alert you or your team about the pricing update. The email includes the date and the page link. |\n\n> ✅ **Advantage for Beginners**: No need to monitor email manually or check sheets. You’re notified only when something meaningful happens!\n\n---\n\n## 🖼️ 📊 VISUAL WORKFLOW SUMMARY\n\n```mermaid\ngraph TD;\n  A[🕒 Schedule Trigger] --> B[🌐 Fetch via Bright Data];\n  B --> C[🧾 Extract HTML];\n  C --> D[🔧 Extract Pricing];\n  D --> E[📄 Read Last Price from Sheet];\n  E --> F{🔁 Has Price Changed?};\n  F -- Yes --> G[📄 Update Sheet];\n  G --> H[📧 Send Alert Email];\n  F -- No --> I[➖ Do Nothing];\n```\n\n---\n"},"typeVersion":1},{"id":"afc23ae0-ef5e-490a-980b-a56e9436fa31","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[-3160,640],"parameters":{"color":4,"width":1300,"height":320,"content":"=======================================\n            WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n    Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n   - YouTube: https://www.youtube.com/@YaronBeen/videos\n   - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"},"typeVersion":1},{"id":"4a1af414-b88b-4618-970e-0b2e67beda67","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-3160,980],"parameters":{"color":4,"width":1289,"height":1798,"content":"## 🧠💼 Title:\n\n**Competitor Pricing Page Monitor — Automated Alerts Using n8n + Bright Data**\n\nThis workflow automatically **monitors a competitor’s pricing page**, **detects changes**, and sends an **alert email** while keeping a record in **Google Sheets**. Perfect for businesses tracking market moves or SaaS competitors!\n\n---\n\n## 🟢 **SECTION 1: Fetch the Latest Pricing Info**\n\n### 📡 Scheduled Scraping Using Bright Data\n\n| 🧩 Nodes Involved                   | 💬 Description                                                                                                                                               |\n| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |\n| 🕒 **Check Pricing Every Hour**     | This **Schedule Trigger** runs your workflow automatically (e.g., every hour). You don’t have to manually check the website.                                 |\n| 🌐 **Fetch Page via Bright Data**   | Uses **Bright Data Web Unlocker API** to bypass bot protections and fetch the HTML of the pricing page from a competitor site (e.g., Wix, Squarespace, etc). |\n| 🧾 **Extract HTML Content**         | This node pulls out the actual **HTML code** of the page from the API response, ready to be analyzed.                                                        |\n| 🔧 **Format & Isolate Price Block** | This custom code node filters or extracts just the **pricing section** (e.g., plan names, \\$ amounts) from the HTML to compare later.                        |\n\n> ✅ **Advantage for Beginners**: You don’t need to manually visit or inspect the site. Everything is automated and updated behind the scenes.\n\n---\n\n## 🟡 **SECTION 2: Check If the Price Has Changed**\n\n### 🔍 Compare New Data with the Last Saved One\n\n| 🧩 Nodes Involved            | 💬 Description                                                                                                                                                                                          |\n| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 📄 **Read Last Saved Price** | This reads from a **Google Sheet** that stores the **last known pricing data**. This becomes your reference point for comparison.                                                                       |\n| 🔁 **Has Price Changed?**    | A simple **IF condition** compares the current scraped pricing to the previously saved one. If the content is **exactly the same**, nothing happens. If it's **different**, it moves to the alert flow. |\n\n> ✅ **Advantage for Beginners**: No need for complex logic. n8n handles the comparison using a basic condition node.\n\n---\n\n## 🔴 **SECTION 3: Alert & Save New Price**\n\n### 🚨 Notify + Update Sheet\n\n| 🧩 Nodes Involved                    | 💬 Description                                                                                                                                          |\n| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| ➖ **No Change Detected – Stop**      | If no changes were found, this does nothing and exits. Keeps your flow efficient.                                                                       |\n| 📄 **Update Stored Price**           | If the price **has changed**, it writes the new value to the **Google Sheet** so future comparisons are accurate.                                       |\n| 📧 **Send Price Change Alert Email** | This node sends a **professional email** (via Gmail) to alert you or your team about the pricing update. The email includes the date and the page link. |\n\n> ✅ **Advantage for Beginners**: No need to monitor email manually or check sheets. You’re notified only when something meaningful happens!\n\n---\n\n## 🖼️ 📊 VISUAL WORKFLOW SUMMARY\n\n```mermaid\ngraph TD;\n  A[🕒 Schedule Trigger] --> B[🌐 Fetch via Bright Data];\n  B --> C[🧾 Extract HTML];\n  C --> D[🔧 Extract Pricing];\n  D --> E[📄 Read Last Price from Sheet];\n  E --> F{🔁 Has Price Changed?};\n  F -- Yes --> G[📄 Update Sheet];\n  G --> H[📧 Send Alert Email];\n  F -- No --> I[➖ Do Nothing];\n```\n\n---\n\n## 🌟 WHY THIS WORKFLOW IS POWERFUL (EVEN FOR BEGINNERS):\n\n| Feature                  | Benefit                                                   |\n| ------------------------ | --------------------------------------------------------- |\n| ✅ No Code                | Drag-and-drop automation — no dev experience needed       |\n| 🔐 Unlocks Sites         | Bright Data handles websites that block scrapers          |\n| 📈 Business Intelligence | Stay competitive by tracking market pricing in real-time  |\n| 💬 Real-time Alerts      | Act fast with Gmail notifications when pricing changes    |\n| 📝 Data Logging          | Google Sheets keeps a historical log of every price point |\n\n---\n\n"},"typeVersion":1},{"id":"eb40dc03-c451-4442-9742-90ca7aa11f16","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[520,0],"parameters":{"color":7,"width":380,"height":240,"content":"## I’ll receive a tiny commission if you join Bright Data through this link—thanks for fueling more free content!\n\n### https://get.brightdata.com/1tndi4600b25"},"typeVersion":1}],"active":false,"settings":{"executionOrder":"v1"},"versionId":"10b3a37b-12c0-4a26-a058-b9950a6e26ff","connections":{"Has Price Changed?":{"main":[[{"node":"No Change Detected – Stop","type":"main","index":0}],[{"node":"Update Stored Price","type":"main","index":0}]]},"Update Stored Price":{"main":[[{"node":"Send Price Change Alert Email","type":"main","index":0}]]},"Extract HTML Content":{"main":[[{"node":"Format & Isolate Price Block","type":"main","index":0}]]},"Read Last Saved Price":{"main":[[{"node":"Has Price Changed?","type":"main","index":0}]]},"Check Pricing Every Day":{"main":[[{"node":"Fetch Page via Bright Data","type":"main","index":0}]]},"Fetch Page via Bright Data":{"main":[[{"node":"Extract HTML Content","type":"main","index":0}]]},"Format & Isolate Price Block":{"main":[[{"node":"Read Last Saved Price","type":"main","index":0}]]}}}


name: Automated Property Market Reports with Bright Data & n8n
author_name: Yaron Been
author_username: yaron-nofluff
nodes_used: ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest","n8n-nodes-base.html"]
categories: []
created_at: 2025-06-24T15:55:09.767Z
updated_at: 2025-06-24T15:55:09.767Z
url: https://n8n.io/workflows/5220
scraped_at: 2025-07-06 21:16:30
description:
  Description

  This workflow automatically generates comprehensive property market reports by scraping real estate listings and market data from multiple sources. It helps real estate professionals save time and provide data-driven insights to clients without manual research.

  Overview

  This workflow automatically generates property market reports by scraping real estate listings and market data. It uses Bright Data to access multiple real estate websites and compiles the data into comprehensive reports.

  Tools Used

  n8n:** The automation platform that orchestrates the workflow.
  Bright Data:** For scraping real estate websites and property data without getting blocked.
  Spreadsheets/Databases:** For storing and analyzing property data.
  Document Generation:** For creating professional PDF reports.

  How to Install

  Import the Workflow: Download the .json file and import it into your n8n instance.
  Configure Bright Data: Add your Bright Data credentials to the Bright Data node.
  Set Up Data Storage: Configure where you want to store the property data.
  Customize: Specify locations, property types, and report format.

  Use Cases

  Real Estate Agents:** Generate market reports for clients.
  Property Investors:** Track market trends in target areas.
  Market Analysts:** Automate data collection for property market analysis.

  Connect with Me

  Website:** https://www.nofluff.online
  YouTube:** https://www.youtube.com/@YaronBeen/videos
  LinkedIn:** https://www.linkedin.com/in/yaronbeen/
  Get Bright Data:** https://get.brightdata.com/1tndi4600b25 (Using this link supports my free workflows with a small commission)

  #n8n #automation #realestate #propertymarket #brightdata #marketreports #propertyanalysis #realestatedata #markettrends #propertyinvestment #n8nworkflow #workflow #nocode #realestateanalysis #propertyreports #realestateintelligence #marketresearch #propertyscraping #realestateautomation #investmentanalysis #propertytrends #datadriven #realestatetech #propertyinsights #marketanalysis #realestateinvesting

workflow_json:
  {"id":"TmVkR7VvM0nMMgE8","meta":{"instanceId":"60046904b104f0f72b2629a9d88fe9f676be4035769f1f08dad1dd38a76b9480","templateCredsSetupCompleted":true},"name":"Property_Market_Report_via_Bright_data","tags":[],"nodes":[{"id":"8891d7b5-79a7-4270-9bf2-374928f36c2a","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[-2160,260],"parameters":{"color":4,"width":1300,"height":320,"content":"=======================================\n            WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n    Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n   - YouTube: https://www.youtube.com/@YaronBeen/videos\n   - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"},"typeVersion":1},{"id":"edafc05e-31ee-4451-b0cf-89f83db0cbca","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-2160,600],"parameters":{"color":4,"width":1289,"height":2218,"content":"# 📊 **Commercial Real Estate Weekly Report Automation**\n\nThis automation helps you **scrape commercial property listings** (like office and retail spaces) from top websites using **Bright Data**, and automatically stores that data into a **Google Sheet**, ready for reporting or analysis.\n\n---\n\n## 🔹 **SECTION 1: 🔁 Automate + Scrape Listings**\n\n### 🧩 1. 📆 Weekly Market Trigger\n\n**Node Name:** `Weekly Market Trigger`\n**What it does:**\nThis node automatically starts the workflow every week (e.g., Monday at 8 AM). You don't have to press a button — it just runs in the background.\n\n🧠 **Beginner Benefit:**\n\n> Automate your market research without ever missing a week. Set it once and let it run!\n\n---\n\n### 🧩 2. 🌐 Fetch Listings via Bright Data\n\n**Node Name:** `Fetch Listings via Bright Data`\n**What it does:**\nThis node sends a `POST` request to **Bright Data Web Unlocker API**, which is a tool that bypasses captchas, anti-bot systems, and complex JavaScript-loaded pages to give you clean HTML content.\n\n**It targets a URL like:**\n\n```\nhttps://www.loopnet.com/for-lease/office/san-francisco-ca/\n```\n\n🛡️ Bright Data ensures the page is accessed as if it's being opened by a real user — no blocks, no errors.\n\n🧠 **Beginner Benefit:**\n\n> Even if a website has bot protections or hidden content, this node ensures you can access the data consistently and safely.\n\n---\n\n## 🔸 **SECTION 2: 🧱 Extract + Save Listings**\n\n### 🧩 3. 🧱 Extract Listing Details (HTML)\n\n**Node Name:** `Extract Listing Details (HTML)`\n**What it does:**\nIt scans the HTML content from the Bright Data response and pulls out important fields like:\n\n* 🏢 Property Title\n* 💵 Price\n* 📍 Address\n* 📐 Size\n* 🔗 Link to the listing\n\nUses **CSS selectors** like `.listing-title` or `.price-info` to find this info.\n\n🧠 **Beginner Benefit:**\n\n> This node turns messy website code into clean, structured data you can actually use in a report or analysis.\n\n---\n\n### 🧩 4. 📊 Save to Google Sheets\n\n**Node Name:** `Save to Google Sheets`\n**What it does:**\nThis final step **appends each extracted listing** into a Google Sheet in real time.\n\nYou’ll get a spreadsheet like this:\n\n| Title | Price | Address | Size | URL |\n| ----- | ----- | ------- | ---- | --- |\n\n🧠 **Beginner Benefit:**\n\n> Your scraped data is saved instantly where you can filter, chart, or share it with clients or your team.\n\n---\n\n## 🚀 **What You Can Do With This Workflow**\n\n* 📈 Track weekly commercial real estate trends\n* 🧠 Compare price per square foot by neighborhood\n* 📨 Send reports to clients or investors\n* 🔁 Use Google Sheets to trigger visual dashboards\n\n---\n\n## 🎁 Want to Make It Better?\n\n* Add a ✉️ **Slack or Email notification** node at the end\n* Use a 🪄 **Markdown Generator** to create beautiful weekly summaries\n* Append data to **separate tabs by week** for historical tracking\n\n---\n"},"typeVersion":1},{"id":"f1c420c9-ad46-48a5-83cf-f43a6377241c","name":"Weekly Market Trigger","type":"n8n-nodes-base.scheduleTrigger","position":[-400,1660],"parameters":{"rule":{"interval":[{"field":"weeks","triggerAtDay":[1],"triggerAtHour":9}]}},"typeVersion":1.2},{"id":"a8acbc10-66cf-4568-b81d-4fce0ec576e7","name":"Fetch Listings via Bright Data","type":"n8n-nodes-base.httpRequest","position":[-180,1660],"parameters":{"url":"https://api.brightdata.com/request","method":"POST","options":{},"sendBody":true,"sendHeaders":true,"bodyParameters":{"parameters":[{"name":"zone","value":"n8n_unblocker"},{"name":"url","value":"https://www.crexi.com/properties?geo=san-francisco-ca"},{"name":"country","value":"us"},{"name":"format","value":"raw"}]},"headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer YOUR_TOKEN_HERE"}]}},"typeVersion":4.2},{"id":"800989c9-af12-4c5f-b7a4-4a2ea290110f","name":"Extract Listing Details (HTML)","type":"n8n-nodes-base.html","position":[120,1660],"parameters":{"options":{},"operation":"extractHtmlContent","extractionValues":{"values":[{"key":"Price","cssSelector":"<span _ngcontent-ng-c2107907900=\"\" data-cy=\"propertyPrice\" class=\"ng-star-inserted\">$3,995,000</span>","returnArray":true}]}},"typeVersion":1.2},{"id":"54724fca-c18d-44df-a0e7-f267ddd09d73","name":"Save to Google Sheets","type":"n8n-nodes-base.googleSheets","position":[340,1660],"parameters":{"operation":"append","sheetName":{"__rl":true,"mode":"list","value":""},"documentId":{"__rl":true,"mode":"list","value":""}},"credentials":{"googleSheetsOAuth2Api":{"id":"r2mDaisH6e9VkwHl","name":"Google Sheets account"}},"typeVersion":4.6},{"id":"3d8af14f-3cb5-4f4f-aa71-be521322c113","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-440,720],"parameters":{"color":6,"width":420,"height":1120,"content":"## 🔹 **SECTION 1: 🔁 Automate + Scrape Listings**\n\n### 🧩 1. 📆 Weekly Market Trigger\n\n**Node Name:** `Weekly Market Trigger`\n**What it does:**\nThis node automatically starts the workflow every week (e.g., Monday at 8 AM). You don't have to press a button — it just runs in the background.\n\n🧠 **Beginner Benefit:**\n\n> Automate your market research without ever missing a week. Set it once and let it run!\n\n---\n\n### 🧩 2. 🌐 Fetch Listings via Bright Data\n\n**Node Name:** `Fetch Listings via Bright Data`\n**What it does:**\nThis node sends a `POST` request to **Bright Data Web Unlocker API**, which is a tool that bypasses captchas, anti-bot systems, and complex JavaScript-loaded pages to give you clean HTML content.\n\n**It targets a URL like:**\n\n```\nhttps://www.loopnet.com/for-lease/office/san-francisco-ca/\n```\n\n🛡️ Bright Data ensures the page is accessed as if it's being opened by a real user — no blocks, no errors.\n\n🧠 **Beginner Benefit:**\n\n> Even if a website has bot protections or hidden content, this node ensures you can access the data consistently and safely.\n\n---\n"},"typeVersion":1},{"id":"2fd2d9bb-ec9c-48c7-a745-bd5b653e76b5","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[60,700],"parameters":{"color":5,"width":420,"height":1140,"content":"## 🔸 **SECTION 2: 🧱 Extract + Save Listings**\n\n### 🧩 3. 🧱 Extract Listing Details (HTML)\n\n**Node Name:** `Extract Listing Details (HTML)`\n**What it does:**\nIt scans the HTML content from the Bright Data response and pulls out important fields like:\n\n* 🏢 Property Title\n* 💵 Price\n* 📍 Address\n* 📐 Size\n* 🔗 Link to the listing\n\nUses **CSS selectors** like `.listing-title` or `.price-info` to find this info.\n\n🧠 **Beginner Benefit:**\n\n> This node turns messy website code into clean, structured data you can actually use in a report or analysis.\n\n---\n\n### 🧩 4. 📊 Save to Google Sheets\n\n**Node Name:** `Save to Google Sheets`\n**What it does:**\nThis final step **appends each extracted listing** into a Google Sheet in real time.\n\nYou’ll get a spreadsheet like this:\n\n| Title | Price | Address | Size | URL |\n| ----- | ----- | ------- | ---- | --- |\n\n🧠 **Beginner Benefit:**\n\n> Your scraped data is saved instantly where you can filter, chart, or share it with clients or your team.\n\n---\n"},"typeVersion":1},{"id":"82aa81aa-39af-410e-9434-ee6189aabc7b","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[560,700],"parameters":{"color":7,"width":380,"height":240,"content":"## I’ll receive a tiny commission if you join Bright Data through this link—thanks for fueling more free content!\n\n### https://get.brightdata.com/1tndi4600b25"},"typeVersion":1}],"active":false,"settings":{"executionOrder":"v1"},"versionId":"b60c01a8-a0b5-43de-bde0-5fa9fd1bb732","connections":{"Weekly Market Trigger":{"main":[[{"node":"Fetch Listings via Bright Data","type":"main","index":0}]]},"Extract Listing Details (HTML)":{"main":[[{"node":"Save to Google Sheets","type":"main","index":0}]]},"Fetch Listings via Bright Data":{"main":[[{"node":"Extract Listing Details (HTML)","type":"main","index":0}]]}}}


name: Automate Research Paper Collection with Bright Data & n8n
author_name: Yaron Been
author_username: yaron-nofluff
categories: []
created_at: 2025-06-24T15:55:40.455Z
updated_at: 2025-06-24T15:55:40.455Z
url: https://n8n.io/workflows/5221
scraped_at: 2025-07-06 21:16:30
description:
  Description

  This workflow automatically collects and organizes research papers from academic databases and journals into Google Sheets. It helps researchers and students save time by eliminating manual searches across multiple academic sources and centralizing research materials.

  Overview

  This workflow automatically scrapes research papers from academic databases and journals, then organizes them in Google Sheets. It uses Bright Data to access academic sources and extracts key information like titles, authors, abstracts, and citations.

  Tools Used

  n8n:** The automation platform that orchestrates the workflow.
  Bright Data:** For scraping academic websites and research databases without getting blocked.
  Google Sheets:** For organizing and storing research paper data.

  How to Install

  Import the Workflow: Download the .json file and import it into your n8n instance.
  Configure Bright Data: Add your Bright Data credentials to the Bright Data node.
  Connect Google Sheets: Authenticate your Google account.
  Customize: Specify research topics, journals, or authors to track.

  Use Cases

  Academic Researchers:** Stay updated on new papers in your field.
  Students:** Collect research for literature reviews and dissertations.
  Research Teams:** Collaborate on literature databases.

  Connect with Me

  Website:** https://www.nofluff.online
  YouTube:** https://www.youtube.com/@YaronBeen/videos
  LinkedIn:** https://www.linkedin.com/in/yaronbeen/
  Get Bright Data:** https://get.brightdata.com/1tndi4600b25 (Using this link supports my free workflows with a small commission)

  #n8n #automation #research #academicpapers #brightdata #googlesheets #researchpapers #academicresearch #literaturesearch #scholarlyarticles #n8nworkflow #workflow #nocode #researchautomation #academicscraping #researchtools #papertracking #academicjournals #researchdatabase #literaturereview #academicwriting #datascraping #researchorganization #scholarlyresearch #citationmanagement #academicproductivity

nodes_used:
  ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest","n8n-nodes-base.code","n8n-nodes-base.html"]

workflow_json:
  {"id":"giq3zqaP4QbY6LgC","meta":{"instanceId":"60046904b104f0f72b2629a9d88fe9f676be4035769f1f08dad1dd38a76b9480"},"name":"Research_Paper_Scraper_to_Google_Sheets","tags":[],"nodes":[{"id":"7d81edf3-6f00-4634-b79f-dbda3f9958e5","name":"Start Scraping (Manual Trigger)","type":"n8n-nodes-base.manualTrigger","position":[-1080,580],"parameters":{},"typeVersion":1},{"id":"6e172db5-7483-4079-bf8a-785602526bdc","name":"Set Research topic","type":"n8n-nodes-base.set","position":[-860,580],"parameters":{"options":{},"assignments":{"assignments":[{"id":"b530a847-0bb2-4039-9ad0-cbc9cc4d909e","name":"Topic","type":"string","value":"machine+learning"}]}},"typeVersion":3.4},{"id":"e65d092a-6854-478c-b33e-2fc309f71ae8","name":"Send Request to Bright Data API","type":"n8n-nodes-base.httpRequest","position":[-600,580],"parameters":{"url":"https://api.brightdata.com/request","method":"POST","options":{},"sendBody":true,"sendHeaders":true,"bodyParameters":{"parameters":[{"name":"zone","value":"n8n_unblocker"},{"name":"url","value":"=https://scholar.google.com/scholar?q={{ $json.Topic }}"},{"name":"country","value":"us"},{"name":"format","value":"raw"}]},"headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer YOUR_TOKEN_HERE"}]}},"typeVersion":4.2},{"id":"211bae33-32c5-44e8-b306-a5e0d520a4a0","name":"Extract Data from HTML (Title, Author, etc.)","type":"n8n-nodes-base.html","position":[-400,580],"parameters":{"options":{},"operation":"extractHtmlContent","extractionValues":{"values":[{"key":"Title","cssSelector":"h3.gs_rt, a.gs_rt","returnArray":true},{"key":"Author","cssSelector":"div.gs_a","returnArray":true},{"key":"Abstract","cssSelector":"div.gs_rs","returnArray":true},{"key":"PDF Link\t","cssSelector":"a[href*='pdf']","returnArray":true,"returnValue":"attribute"}]}},"typeVersion":1.2},{"id":"9ab7ba20-8614-46c5-b57a-3749d6ae04c4","name":"Clean & Structure Extracted Data","type":"n8n-nodes-base.code","position":[-200,580],"parameters":{"jsCode":"const titles = items[0].json.Title || [];\nconst authors = items[0].json.Author || [];\nconst abstracts = items[0].json.Abstract || [];\nconst pdfLinks = items[0].json[\"PDF Link\\t\"] || [];\n\nconst output = [];\n\nfor (let i = 0; i < titles.length; i++) {\n  // Clean title (remove tags like [PDF][B])\n  let title = titles[i].replace(/\\[.*?\\]/g, '').trim();\n\n  // Clean author (remove any trailing dashes or HTML leftovers)\n  let author = authors[i] ? authors[i].replace(/\\s*-\\s*.*/, '').trim() : '';\n\n  // Abstract fallback\n  let abstract = abstracts[i] || '';\n\n  // Get PDF link — from either a single object or array of duplicates\n  let linkObj = pdfLinks[i];\n  let pdfLink = '';\n\n  if (Array.isArray(linkObj)) {\n    // If multiple objects per item\n    pdfLink = linkObj.find(obj => obj.href)?.href || '';\n  } else if (linkObj?.href) {\n    pdfLink = linkObj.href;\n  }\n\n  // Push cleaned object\n  output.push({\n    json: {\n      title,\n      author,\n      abstract,\n      pdfLink\n    }\n  });\n}\n\nreturn output;\n"},"typeVersion":2},{"id":"a246f20c-2bb9-4319-8812-e296c87a7df0","name":"Save Results to Google Sheet","type":"n8n-nodes-base.googleSheets","position":[120,580],"parameters":{"columns":{"value":{"Topic":"={{ $('Set Research topic').item.json.Topic }}","title":"={{ $json.title }}","author":"={{ $json.author }}","abstract":"={{ $json.abstract }}","pdf link":"={{ $json.pdfLink }}"},"schema":[{"id":"Topic","type":"string","display":true,"required":false,"displayName":"Topic","defaultMatch":false,"canBeUsedToMatch":true},{"id":"title","type":"string","display":true,"required":false,"displayName":"title","defaultMatch":false,"canBeUsedToMatch":true},{"id":"author","type":"string","display":true,"required":false,"displayName":"author","defaultMatch":false,"canBeUsedToMatch":true},{"id":"abstract","type":"string","display":true,"required":false,"displayName":"abstract","defaultMatch":false,"canBeUsedToMatch":true},{"id":"pdf link","type":"string","display":true,"required":false,"displayName":"pdf link","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1sOfCFsvHS9-BeE_PQ6J_jtQofCRcOv02XS7hrmFmpxQ/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1sOfCFsvHS9-BeE_PQ6J_jtQofCRcOv02XS7hrmFmpxQ","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1sOfCFsvHS9-BeE_PQ6J_jtQofCRcOv02XS7hrmFmpxQ/edit?usp=drivesdk","cachedResultName":"Research papers from Google Scholar"}},"credentials":{"googleSheetsOAuth2Api":{"id":"r2mDaisH6e9VkwHl","name":"Google Sheets account"}},"typeVersion":4.6},{"id":"1b4a1504-4a4a-4a0d-892b-d0c3e205ed85","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-1140,60],"parameters":{"color":5,"width":420,"height":720,"content":"## 🔹 **Section 1: User Input & Trigger**\n\n**🧩 Nodes: Start Scraping | Set Topic**\n📍 **Purpose:** Let users easily input the topic they want to scrape — no need to deal with complex URLs.\n\n| 🧱 Node   | ✅ New Name                   | 💡 Description                                                                                                                                                                         |\n| --------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| ⚡ Trigger | **Start Scraping (Manual)**  | This node starts the workflow when you click “Execute Workflow.” It's the entry point.                                                                                                 |\n| ✏️ Set    | **Set Topic (Manual Input)** | Instead of requiring a URL, the user will enter a topic (like \"machine learning\" or \"digital marketing\"). This topic will be used to automatically generate the URL behind the scenes. |\n\n### 🧠 How it helps:\n\n* Great for beginners: Just type the topic, hit run.\n* Keeps the interface clean and user-friendly.\n* Avoids confusion around URLs and formats.\n\n---\n\n"},"typeVersion":1},{"id":"bc56f528-6d18-4e05-942f-c06bb6e10b27","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-660,80],"parameters":{"color":6,"width":600,"height":700,"content":"## 🔸 **Section 2: Scrape & Parse Website**\n\n**🧩 Nodes: Send Request | Extract HTML | Clean Data**\n📍 **Purpose:** Uses the Bright Data proxy to access the webpage, extract raw HTML content, and clean it up into a readable format (title, author, abstract, etc.).\n\n| 🧱 Node         | ✅ New Name                            | 💡 Description                                                                                                                                                        |\n| --------------- | ------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 🌐 HTTP Request | **Send Topic Request to Bright Data** | This sends a request to the Bright Data API using the topic you set earlier. It uses Bright Data’s network to safely load the actual website and return HTML content. |\n| 🧱 HTML Extract | **Extract Data from Webpage**         | Parses the returned HTML to find relevant data like titles, authors, abstracts, and links.                                                                            |\n| 🔣 Code         | **Clean and Format Scraped Data**     | A custom code block that organizes the messy data into neat records. For example: title → column A, abstract → column B, etc.                                         |\n\n### 🧠 How it helps:\n\n* Makes web scraping safe and reliable by using proxies.\n* Converts unreadable HTML into structured information.\n* Beginner-friendly: No need to write a parser yourself.\n\n---\n\n"},"typeVersion":1},{"id":"2c54e5e6-011a-4562-98ac-9cc9834bc284","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[0,0],"parameters":{"color":3,"width":340,"height":780,"content":"## 🟢 **Section 3: Save to Google Sheets**\n\n**🧩 Node: Append to Google Sheets**\n📍 **Purpose:** Automatically sends the clean data into a Google Sheet for easy access, filtering, or sharing.\n\n| 🧱 Node          | ✅ New Name                            | 💡 Description                                                                                                                      |\n| ---------------- | ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |\n| 📄 Google Sheets | **Store Scraped Data in Spreadsheet** | Takes the structured output and appends it to the connected Google Sheet. Each result gets a row with title, author, abstract, etc. |\n\n### 🧠 How it helps:\n\n* No manual copy-pasting ever again!\n* Shareable and searchable format.\n* Updates automatically as you scrape more topics.\n\n---\n\n"},"typeVersion":1},{"id":"4ce90703-961e-4070-9356-c9dffc23a6c5","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[-2980,80],"parameters":{"color":4,"width":1300,"height":320,"content":"=======================================\n            WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n    Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n   - YouTube: https://www.youtube.com/@YaronBeen/videos\n   - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"},"typeVersion":1},{"id":"069ddb89-f7a1-4c4b-b65d-212be3252750","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-2980,420],"parameters":{"color":4,"width":1289,"height":1878,"content":"## 🌟 Research Paper Scraper to Google Sheets\n\n**Automate extraction of data from any website based on a topic — no coding needed!**\n\n---\n\n## 🔹 **Section 1: User Input & Trigger**\n\n**🧩 Nodes: Start Scraping | Set Topic**\n📍 **Purpose:** Let users easily input the topic they want to scrape — no need to deal with complex URLs.\n\n| 🧱 Node   | ✅ New Name                   | 💡 Description                                                                                                                                                                         |\n| --------- | ---------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| ⚡ Trigger | **Start Scraping (Manual)**  | This node starts the workflow when you click “Execute Workflow.” It's the entry point.                                                                                                 |\n| ✏️ Set    | **Set Topic (Manual Input)** | Instead of requiring a URL, the user will enter a topic (like \"machine learning\" or \"digital marketing\"). This topic will be used to automatically generate the URL behind the scenes. |\n\n### 🧠 How it helps:\n\n* Great for beginners: Just type the topic, hit run.\n* Keeps the interface clean and user-friendly.\n* Avoids confusion around URLs and formats.\n\n---\n\n## 🔸 **Section 2: Scrape & Parse Website**\n\n**🧩 Nodes: Send Request | Extract HTML | Clean Data**\n📍 **Purpose:** Uses the Bright Data proxy to access the webpage, extract raw HTML content, and clean it up into a readable format (title, author, abstract, etc.).\n\n| 🧱 Node         | ✅ New Name                            | 💡 Description                                                                                                                                                        |\n| --------------- | ------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| 🌐 HTTP Request | **Send Topic Request to Bright Data** | This sends a request to the Bright Data API using the topic you set earlier. It uses Bright Data’s network to safely load the actual website and return HTML content. |\n| 🧱 HTML Extract | **Extract Data from Webpage**         | Parses the returned HTML to find relevant data like titles, authors, abstracts, and links.                                                                            |\n| 🔣 Code         | **Clean and Format Scraped Data**     | A custom code block that organizes the messy data into neat records. For example: title → column A, abstract → column B, etc.                                         |\n\n### 🧠 How it helps:\n\n* Makes web scraping safe and reliable by using proxies.\n* Converts unreadable HTML into structured information.\n* Beginner-friendly: No need to write a parser yourself.\n\n---\n\n## 🟢 **Section 3: Save to Google Sheets**\n\n**🧩 Node: Append to Google Sheets**\n📍 **Purpose:** Automatically sends the clean data into a Google Sheet for easy access, filtering, or sharing.\n\n| 🧱 Node          | ✅ New Name                            | 💡 Description                                                                                                                      |\n| ---------------- | ------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |\n| 📄 Google Sheets | **Store Scraped Data in Spreadsheet** | Takes the structured output and appends it to the connected Google Sheet. Each result gets a row with title, author, abstract, etc. |\n\n### 🧠 How it helps:\n\n* No manual copy-pasting ever again!\n* Shareable and searchable format.\n* Updates automatically as you scrape more topics.\n\n---\n\n## ✅ What a Beginner Gains from This Workflow\n\n| 💡 Feature                  | 🚀 Benefit                                                                        |\n| --------------------------- | --------------------------------------------------------------------------------- |\n| Topic-based input           | You don’t need to find or understand complex URLs. Just type “AI” or “marketing.” |\n| Fully automated scraping    | You don’t need to open browsers or inspect elements.                              |\n| Ready-to-use Google Sheet   | The final data is clean and saved into a sheet you can use anywhere.              |\n| Beautiful, modular workflow | Each step is visual, editable, and reusable without coding skills.                |\n\n---\n\n## 🎯 Final Result:\n\nYou type a **topic** → Bright Data scrapes the web → It extracts content → Cleans it → Saves it into **Google Sheets**.\nEverything happens automatically. **No code. No hassle. Just data.**\n\n---\n\n"},"typeVersion":1},{"id":"a1a5e609-756a-4757-a026-1349cf388e61","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[400,0],"parameters":{"color":7,"width":380,"height":240,"content":"## I’ll receive a tiny commission if you join Bright Data through this link—thanks for fueling more free content!\n\n### https://get.brightdata.com/1tndi4600b25"},"typeVersion":1}],"active":false,"settings":{"executionOrder":"v1"},"versionId":"f931202a-3c22-495d-b775-71665bdf6c27","connections":{"Set Research topic":{"main":[[{"node":"Send Request to Bright Data API","type":"main","index":0}]]},"Send Request to Bright Data API":{"main":[[{"node":"Extract Data from HTML (Title, Author, etc.)","type":"main","index":0}]]},"Start Scraping (Manual Trigger)":{"main":[[{"node":"Set Research topic","type":"main","index":0}]]},"Clean & Structure Extracted Data":{"main":[[{"node":"Save Results to Google Sheet","type":"main","index":0}]]},"Extract Data from HTML (Title, Author, etc.)":{"main":[[{"node":"Clean & Structure Extracted Data","type":"main","index":0}]]}}}


name: Find the Best Airbnb Deals Automatically with Bright Data & n8n
author_name: Yaron Been
author_username: yaron-nofluff
nodes_used: ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest","n8n-nodes-base.code"]
categories: []
created_at: 2025-06-24T15:56:58.236Z
updated_at: 2025-06-24T15:56:58.236Z
url: https://n8n.io/workflows/5224
scraped_at: 2025-07-06 21:16:30
description:
  F

  Description

  This workflow automatically searches Airbnb for the best deals in your target locations and saves them for later reference. It helps travelers find affordable accommodations by continuously monitoring listings and identifying properties that match your budget and preferences.

  Overview

  This workflow automatically searches Airbnb for the best deals in your target locations and saves them for later reference. It uses Bright Data to scrape Airbnb listings and can filter results based on your preferences for price, amenities, and ratings.

  Tools Used

  n8n:** The automation platform that orchestrates the workflow.
  Bright Data:** For scraping Airbnb listings without being blocked.
  Spreadsheets/Databases:** For storing and comparing property deals.

  How to Install

  Import the Workflow: Download the .json file and import it into your n8n instance.
  Configure Bright Data: Add your Bright Data credentials to the Bright Data node.
  Set Up Data Storage: Configure where you want to store the Airbnb deals.
  Customize: Specify locations, date ranges, and your budget constraints.

  Use Cases

  Travelers:** Find the best accommodation deals for your trips.
  Digital Nomads:** Track affordable long-term stays in different locations.
  Property Managers:** Monitor competitor pricing in your area.

  Connect with Me

  Website:** https://www.nofluff.online
  YouTube:** https://www.youtube.com/@YaronBeen/videos
  LinkedIn:** https://www.linkedin.com/in/yaronbeen/
  Get Bright Data:** https://get.brightdata.com/1tndi4600b25 (Using this link supports my free workflows with a small commission)

  #n8n #automation #airbnb #travel #brightdata #dealhunting #vacationrentals #traveldeals #accommodationdeals #airbnbdeals #n8nworkflow #workflow #nocode #travelhacks #budgettravel #propertydeals #travelplanning #airbnbscraper #vacationplanning #bestairbnbs #travelautomation #affordableaccommodation #staydeals #traveltech #digitalnomad #accommodationfinder

workflow_json:
  {"id":"kO0kNE2AKKzesj0F","meta":{"instanceId":"60046904b104f0f72b2629a9d88fe9f676be4035769f1f08dad1dd38a76b9480"},"name":"Store_Best_Deals_on_Airbnb","tags":[],"nodes":[{"id":"3be17a72-1d6a-4bea-a36c-708125eef7ef","name":"Run Daily (9 AM)","type":"n8n-nodes-base.scheduleTrigger","position":[20,1020],"parameters":{"rule":{"interval":[{"triggerAtHour":9}]}},"typeVersion":1.2},{"id":"d47e5caa-a861-4dad-9f48-52e816fc7a71","name":"Set Search Criteria","type":"n8n-nodes-base.set","position":[240,1020],"parameters":{"options":{},"assignments":{"assignments":[{"id":"9426515e-7232-483f-ae94-09cf500c8dc4","name":"Location","type":"string","value":"Los-Angeles"},{"id":"61bc5a40-687c-4f49-b9dc-ee0f24511b6f","name":"checkin","type":"string","value":"2025-09-15"},{"id":"5bc0153f-90cc-43cc-92b0-64c87dcc4e59","name":"checkout","type":"string","value":"2025-09-20"},{"id":"e6b268f2-c05a-44ed-9303-c0def3abf4fe","name":"adults","type":"number","value":2}]}},"typeVersion":3.4},{"id":"80e8b765-0840-47d3-b591-060f82bb97c2","name":"Scrape Airbnb via Bright Data","type":"n8n-nodes-base.httpRequest","position":[500,1020],"parameters":{"url":"https://api.brightdata.com/request","method":"POST","options":{},"sendBody":true,"sendHeaders":true,"bodyParameters":{"parameters":[{"name":"zone","value":"n8n_unblocker"},{"name":"url","value":"=https://www.airbnb.com/s/{{ $json.Location }}--CA--United-States/homes?checkin={{ $json.checkin }}&checkout={{ $json.checkout }}&adults={{ $json.adults }}"},{"name":"country","value":"us"},{"name":"format","value":"raw"}]},"headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer YOUR_TOKEN_HERE KEY"}]}},"typeVersion":4.2},{"id":"59da6712-9264-4622-a2ca-9791a892d336","name":"Extract Price & Title","type":"n8n-nodes-base.code","position":[720,1020],"parameters":{"jsCode":"// Get the HTML content from the previous node.\n// Assuming your HTTP Request node's output is named 'data'.\nconst html = items[0].json.data;\n\n// This regex finds the specific <script> tag containing the search results.\nconst regex = /<script id=\"data-deferred-state-0\"[^>]*>([\\s\\S]*?)<\\/script>/;\nconst match = html.match(regex);\n\nif (!match || !match[1]) {\n  console.log(\"Could not find the data script tag.\");\n  return [{\n    error: \"Data script tag not found. The page structure might have changed.\"\n  }];\n}\n\ntry {\n  // Parse the JSON string found inside the script tag.\n  const jsonData = JSON.parse(match[1]);\n\n  // Navigate through the complex object to find the search results array.\n  // Using optional chaining (?.) prevents errors if a key doesn't exist.\n  const searchResults = jsonData?.niobeMinimalClientData?.[0]?.[1]?.data?.presentation?.staysSearch?.results?.searchResults;\n\n  if (!searchResults || !Array.isArray(searchResults)) {\n    console.log(\"Could not find search results in the JSON data.\");\n    return [{\n      error: \"Search results not found in the JSON data. The data structure may have changed.\"\n    }];\n  }\n\n  // Map over the results to extract the title and price for each listing.\n  const listings = searchResults.map(item => {\n    const title = item.title;\n    \n    // The price can be in 'discountedPrice' or 'price', so we check for both.\n    const primaryLine = item.structuredDisplayPrice?.primaryLine;\n    let price = \"N/A\";\n    if (primaryLine) {\n      const priceValue = primaryLine.discountedPrice || primaryLine.price;\n      const qualifier = primaryLine.qualifier || '';\n      price = `${priceValue} ${qualifier}`.trim();\n    }\n\n    return {\n      title,\n      price,\n    };\n  });\n\n  // n8n expects an array of objects to be returned.\n  // Each object will become a separate item for the next node.\n  return listings;\n\n} catch (e) {\n  console.error(\"Error parsing JSON data:\", e);\n  return [{\n    error: \"Failed to parse JSON data from the script tag.\"\n  }];\n}"},"typeVersion":2},{"id":"4710e13c-3ce5-4980-bfbf-727b4a425ae3","name":"Save to Google Sheets","type":"n8n-nodes-base.googleSheets","position":[1000,1020],"parameters":{"columns":{"value":{"Price":"={{ $json.price }}","Title":"={{ $json.title }}","Adults":"={{ $('Set Search Criteria').item.json.adults }}","CheckIn":"={{ $('Set Search Criteria').item.json.checkin }}","CheckOut":"={{ $('Set Search Criteria').item.json.checkout }}","Location":"={{ $('Set Search Criteria').item.json.Location }}"},"schema":[{"id":"Location","type":"string","display":true,"required":false,"displayName":"Location","defaultMatch":false,"canBeUsedToMatch":true},{"id":"CheckIn","type":"string","display":true,"required":false,"displayName":"CheckIn","defaultMatch":false,"canBeUsedToMatch":true},{"id":"CheckOut","type":"string","display":true,"required":false,"displayName":"CheckOut","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Adults","type":"string","display":true,"required":false,"displayName":"Adults","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Price","type":"string","display":true,"required":false,"displayName":"Price","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Title","type":"string","display":true,"required":false,"displayName":"Title","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1nwNkfh8n1qr6ft5mF3PhhDTTaDXb1K_4H3gd3D-nADc/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1nwNkfh8n1qr6ft5mF3PhhDTTaDXb1K_4H3gd3D-nADc","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1nwNkfh8n1qr6ft5mF3PhhDTTaDXb1K_4H3gd3D-nADc/edit?usp=drivesdk","cachedResultName":"Rooms on Airbnb"}},"credentials":{"googleSheetsOAuth2Api":{"id":"r2mDaisH6e9VkwHl","name":"Google Sheets account"}},"typeVersion":4.6},{"id":"7e0664d1-40ce-4498-b412-6ebc60fc9a7f","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[0,0],"parameters":{"color":6,"width":380,"height":1180,"content":"## 🟢 **Section 1: 🧭 Define & Trigger the Search**\n\n### 🧩 Nodes:\n\n1. ⏰ **Run Daily**\n2. 🛠 **Set Search Criteria**\n\n---\n\n### ✨ What's Happening Here:\n\n#### ⏰ **Run Daily**\n\n* This node is your **alarm clock** ⏰.\n* It automatically **starts the workflow** based on a schedule (e.g., daily at 8:00 AM).\n* You never need to click \"Execute Workflow\" manually again — it's 100% hands-free.\n\n> *“Imagine this as your personal assistant waking up every day to go find vacation deals for you.”*\n\n#### 🛠 **Set Search Criteria**\n\n* This is where you **set your filters**: destination, travel dates, number of guests.\n* For example:\n\n  ```json\n  {\n    \"location\": \"Los Angeles\",\n    \"checkin\": \"2025-09-15\",\n    \"checkout\": \"2025-09-20\",\n    \"adults\": 2\n  }\n  ```\n* This data will be **used in the scraping URL** sent to Airbnb through Bright Data.\n\n> *“It’s like telling your assistant: ‘Look for 2-person stays in LA from Sept 15–20.’”*\n\n---\n\n"},"typeVersion":1},{"id":"b3904951-145f-44dd-947d-d99194798798","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[420,60],"parameters":{"color":3,"width":440,"height":1120,"content":"## 🌐 **Section 2: 🚀 Scrape & Extract Airbnb Data**\n\n### 🧩 Nodes:\n\n3. 🌐 **Scrape Airbnb via Bright Data**\n4. 🧠 **Extract Price & Title**\n\n---\n\n### ✨ What's Happening Here:\n\n#### 🌐 **Scrape Airbnb via Bright Data**\n\n* This node **sends a request** to Airbnb using **Bright Data Web Unlocker**.\n* Bright Data acts like a **stealth browser** 🕵️ that avoids blocks and loads the real webpage for you.\n* It fetches all the page data (even if Airbnb tries to hide it from bots).\n\n> *“Imagine Bright Data as your super-sneaky browser that can go where others can't.”*\n\n#### 🧠 **Extract Price & Title**\n\n* The raw response from Airbnb (HTML or JSON) is **parsed** in this Code node.\n* The code looks for:\n\n  * 🏷️ **Listing Title**\n  * 💰 **Price per night**\n* These are pulled out from the messy page code and transformed into clean data items.\n\n> *“It’s like using a fine-tooth comb to extract the useful info from a messy travel brochure.”*\n\n---\n\n"},"typeVersion":1},{"id":"c41d599a-6211-4d0b-a392-212d2f948612","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[900,280],"parameters":{"color":5,"width":320,"height":900,"content":"## 📄 **Section 3: 🧾 Store the Results**\n\n### 🧩 Node:\n\n5. 📄 **Save to Google Sheets**\n\n---\n\n### ✨ What's Happening Here:\n\n#### 📄 **Save to Google Sheets**\n\n* All the extracted data (titles and prices) are **stored row-by-row** in a Google Sheet.\n* Each day adds a new set of listings, creating a full **price history** over time.\n* You can use this sheet to:\n\n  * Track **price changes**\n  * Find **off-peak bargains**\n  * Compare cities or time periods\n\n> *“This is your digital notebook where every deal is neatly logged for review, comparison, or alerts.”*\n\n---\n\n"},"typeVersion":1},{"id":"6d833041-f1a3-40e4-a192-78aa903cb9e7","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[-1880,20],"parameters":{"color":4,"width":1300,"height":320,"content":"=======================================\n            WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n    Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n   - YouTube: https://www.youtube.com/@YaronBeen/videos\n   - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"},"typeVersion":1},{"id":"1adeb274-de15-4f85-b198-5a235ae934a5","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-1880,360],"parameters":{"color":4,"width":1289,"height":2738,"content":"# 🌟 Automation Overview: “Find Best Airbnb Deals (Daily Tracker)”\n\nThis n8n workflow automatically scrapes Airbnb listings every day and records the **title and price** of each rental into **Google Sheets**, helping you track the best travel deals over time — perfect for deal hunters, travel bloggers, or market researchers!\n\n---\n\n## 🟢 **Section 1: 🧭 Define & Trigger the Search**\n\n### 🧩 Nodes:\n\n1. ⏰ **Run Daily**\n2. 🛠 **Set Search Criteria**\n\n---\n\n### ✨ What's Happening Here:\n\n#### ⏰ **Run Daily**\n\n* This node is your **alarm clock** ⏰.\n* It automatically **starts the workflow** based on a schedule (e.g., daily at 8:00 AM).\n* You never need to click \"Execute Workflow\" manually again — it's 100% hands-free.\n\n> *“Imagine this as your personal assistant waking up every day to go find vacation deals for you.”*\n\n#### 🛠 **Set Search Criteria**\n\n* This is where you **set your filters**: destination, travel dates, number of guests.\n* For example:\n\n  ```json\n  {\n    \"location\": \"Los Angeles\",\n    \"checkin\": \"2025-09-15\",\n    \"checkout\": \"2025-09-20\",\n    \"adults\": 2\n  }\n  ```\n* This data will be **used in the scraping URL** sent to Airbnb through Bright Data.\n\n> *“It’s like telling your assistant: ‘Look for 2-person stays in LA from Sept 15–20.’”*\n\n---\n\n## 🌐 **Section 2: 🚀 Scrape & Extract Airbnb Data**\n\n### 🧩 Nodes:\n\n3. 🌐 **Scrape Airbnb via Bright Data**\n4. 🧠 **Extract Price & Title**\n\n---\n\n### ✨ What's Happening Here:\n\n#### 🌐 **Scrape Airbnb via Bright Data**\n\n* This node **sends a request** to Airbnb using **Bright Data Web Unlocker**.\n* Bright Data acts like a **stealth browser** 🕵️ that avoids blocks and loads the real webpage for you.\n* It fetches all the page data (even if Airbnb tries to hide it from bots).\n\n> *“Imagine Bright Data as your super-sneaky browser that can go where others can't.”*\n\n#### 🧠 **Extract Price & Title**\n\n* The raw response from Airbnb (HTML or JSON) is **parsed** in this Code node.\n* The code looks for:\n\n  * 🏷️ **Listing Title**\n  * 💰 **Price per night**\n* These are pulled out from the messy page code and transformed into clean data items.\n\n> *“It’s like using a fine-tooth comb to extract the useful info from a messy travel brochure.”*\n\n---\n\n## 📄 **Section 3: 🧾 Store the Results**\n\n### 🧩 Node:\n\n5. 📄 **Save to Google Sheets**\n\n---\n\n### ✨ What's Happening Here:\n\n#### 📄 **Save to Google Sheets**\n\n* All the extracted data (titles and prices) are **stored row-by-row** in a Google Sheet.\n* Each day adds a new set of listings, creating a full **price history** over time.\n* You can use this sheet to:\n\n  * Track **price changes**\n  * Find **off-peak bargains**\n  * Compare cities or time periods\n\n> *“This is your digital notebook where every deal is neatly logged for review, comparison, or alerts.”*\n\n---\n\n## 🎯 Why This Workflow is Powerful (Even for Beginners):\n\n| Benefit 💡                   | Description                                                               |\n| ---------------------------- | ------------------------------------------------------------------------- |\n| 📆 **Fully Automated**       | No manual work — set it once and let it run every day.                    |\n| 📊 **Easy Tracking**         | Automatically builds a database of deals over time.                       |\n| 💻 **Low-Code & Expandable** | You can easily add filters, alerts (e.g., Telegram, email), or analytics. |\n| 🧰 **Bright Data-Powered**   | Avoids bot detection and ensures clean, reliable data.                    |\n\n---\n\n"},"typeVersion":1},{"id":"d309ee77-594c-40ad-b943-2ea268b0b47f","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[1300,280],"parameters":{"color":7,"width":380,"height":240,"content":"## I’ll receive a tiny commission if you join Bright Data through this link—thanks for fueling more free content!\n\n### https://get.brightdata.com/1tndi4600b25"},"typeVersion":1}],"active":false,"settings":{"executionOrder":"v1"},"versionId":"4a456006-c946-40d6-8cd8-55db7f2518a6","connections":{"Run Daily (9 AM)":{"main":[[{"node":"Set Search Criteria","type":"main","index":0}]]},"Set Search Criteria":{"main":[[{"node":"Scrape Airbnb via Bright Data","type":"main","index":0}]]},"Extract Price & Title":{"main":[[{"node":"Save to Google Sheets","type":"main","index":0}]]},"Scrape Airbnb via Bright Data":{"main":[[{"node":"Extract Price & Title","type":"main","index":0}]]}}}


name: Automated Trend Tracking with Bright Data & n8n
author_name: Yaron Been
author_username: yaron-nofluff
nodes_used: ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest","n8n-nodes-base.html"]
categories: []
created_at: 2025-06-24T15:57:17.896Z
updated_at: 2025-06-24T15:57:17.896Z
url: https://n8n.io/workflows/5225
scraped_at: 2025-07-06 21:16:30
description:
  Description

  This workflow automatically monitors and tracks trending topics across multiple platforms and websites. It helps content creators and marketers stay ahead of the curve by identifying emerging trends before they go mainstream.

  Overview

  This workflow automatically monitors and tracks trending topics across multiple platforms and websites. It uses Bright Data to scrape trend data from social media, news sites, and other sources, then compiles the information into a structured format.

  Tools Used

  n8n:** The automation platform that orchestrates the workflow.
  Bright Data:** For scraping trend data from various websites without getting blocked.
  Spreadsheets/Databases:** For storing and analyzing trend information.

  How to Install

  Import the Workflow: Download the .json file and import it into your n8n instance.
  Configure Bright Data: Add your Bright Data credentials to the Bright Data node.
  Set Up Data Storage: Configure where you want to store the trend data.
  Customize: Specify which platforms to monitor and what topics to focus on.

  Use Cases

  Content Creators:** Stay on top of trending topics for content ideas.
  Marketers:** Identify emerging trends for timely campaigns.
  Researchers:** Track the evolution of topics and conversations over time.

  Connect with Me

  Website:** https://www.nofluff.online
  YouTube:** https://www.youtube.com/@YaronBeen/videos
  LinkedIn:** https://www.linkedin.com/in/yaronbeen/
  Get Bright Data:** https://get.brightdata.com/1tndi4600b25 (Using this link supports my free workflows with a small commission)

  #n8n #automation #trends #trendtracking #brightdata #contentmarketing #trendanalysis #trendalerts #markettrends #trendmonitoring #n8nworkflow #workflow #nocode #trendresearch #emergingtrends #socialmediatrends #trendscraping #trenddata #contentideas #digitalmarketing #marketresearch #trendforecasting #trendspotting #dataanalysis #marketintelligence #trendautomation

workflow_json:
  {"id":"m4kRfWIYJxn6PoOx","meta":{"instanceId":"60046904b104f0f72b2629a9d88fe9f676be4035769f1f08dad1dd38a76b9480","templateCredsSetupCompleted":true},"name":"Trend_Tracker_via_Bright_Data","tags":[],"nodes":[{"id":"6cebc2fd-3e61-41c8-9f23-25ca5bff2a54","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[-2400,620],"parameters":{"color":4,"width":1300,"height":320,"content":"=======================================\n            WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n    Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n   - YouTube: https://www.youtube.com/@YaronBeen/videos\n   - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"},"typeVersion":1},{"id":"e4b7bd42-1b24-4f7c-90a0-b7909afcdca0","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-2400,960],"parameters":{"color":4,"width":1289,"height":2258,"content":"## 🚀 **Monthly Viral Trend Tracker Workflow**\n\nThis automation helps you track viral posts on **Quora** around specific topics (like *marketing* or *design*) every month. It scrapes trending content, extracts useful data (titles, URLs, stats), and saves it into a Google Sheet for later use — perfect for trend research, reporting, or content inspiration.\n\n---\n\n### 🧠 **SECTION 1: Trend Trigger & Scraper**\n\n> **Purpose:** Automate the scraping of viral content from Quora every month.\n\n#### ⏰ `Node 1: Monthly Trend Trigger`\n\n**🔗 Type:** Cron Scheduler\n**🧩 What it does:**\nThis node is like your personal assistant — it **automatically starts the workflow on the 1st day of every month** without you lifting a finger.\n\n* 🗓 Trigger schedule: Monthly (e.g., `0 0 1 * *`)\n* 📈 Use Case: Keeps your trend tracking consistent and timely\n\n> 🧠 *Why it matters:* Instead of manually checking viral trends, this node ensures it’s **fully automated**, perfect for monthly reports or trend tracking dashboards.\n\n---\n\n#### 🌐 `Node 2: Scrape Quora Trends (Bright Data)`\n\n**🔗 Type:** HTTP Request\n**🧩 What it does:**\nThis node sends a **POST request to Bright Data** to scrape trending Quora results for a given topic (like `\"https://www.quora.com/search?q=marketing\"`).\n\n* 🔒 Uses **Bright Data Web Unlocker** to bypass restrictions\n* 🧠 Intelligent scraping with full HTML + rendering\n* 🔍 Targets specific search terms (e.g., `marketing`, `UX`, `AI in marketing`)\n\n> 💡 *Why it matters:* You can collect **real trending content** from Quora without opening your browser. Bright Data handles the hard stuff like JavaScript, proxies, and blocks.\n\n---\n\n### 🧾 **SECTION 2: Extract & Save Insights**\n\n> **Purpose:** Process the scraped data and store it in a usable format (Google Sheets).\n\n#### 🧱 `Node 3: Extract Post Titles & Stats`\n\n**🔗 Type:** HTML Extract\n**🧩 What it does:**\nTakes the raw HTML from Quora and pulls out the meaningful information you care about:\n\n* 📝 Question titles or post headlines\n* 🔗 URLs\n* 👍 Vote count or engagement\n* 🧑 Author or answer snippet (if desired)\n\nYou use **CSS Selectors or XPath** to tell n8n what to extract. For example:\n\n```css\na.q-box.qu-mb--tiny  →  Post links  \ndiv.q-relative  →  Snippets or text  \n```\n\n> 🧠 *Why it matters:* This is where raw data becomes structured. You’re now transforming messy HTML into useful, clean trend info.\n\n---\n\n#### 📊 `Node 4: Save Trends to Sheet`\n\n**🔗 Type:** Google Sheets\n**🧩 What it does:**\nTakes the structured trend data and **appends it to a Google Sheet** for archiving, analysis, or sharing.\n\n* 🔄 Keeps data centralized in Google Drive\n* 🧾 Every entry becomes part of a monthly trend log\n* 📤 Can be exported, visualized, or emailed later\n\n> 💡 *Why it matters:* This gives you a **living database of viral content** that you can reference later for reports, content ideas, social strategy, or client insights.\n\n---\n\n### 📦 **Workflow Summary**\n\n| Section                              | What's Happening                                                                  | Icons    |\n| ------------------------------------ | --------------------------------------------------------------------------------- | -------- |\n| **🧠 Section 1**<br>Trigger & Scrape | Automatically triggers each month → sends request to scrape Quora via Bright Data | ⏰ 🌐 🔍  |\n| **🧾 Section 2**<br>Extract & Store  | Parses HTML → extracts question titles, votes, links → saves to Google Sheets     | 🧾 🧪 📊 |\n\n---\n\n### 💼 How a Beginner Can Use This\n\n1. **No Code Needed:** All steps use visual nodes in n8n.\n2. **Customizable Topics:** Change `\"url\"` in the HTTP node to track any niche.\n3. **Scalable:** Duplicate the scraping node to include Reddit, Twitter, or LinkedIn later.\n4. **Google Sheets Ready:** Easy to share or use in reporting tools like Looker Studio or Excel.\n\n---\n"},"typeVersion":1},{"id":"d1595d84-94ee-4678-9ed5-ee83dc421d50","name":"Monthly Trend Trigger1","type":"n8n-nodes-base.scheduleTrigger","position":[-420,1580],"parameters":{"rule":{"interval":[{"field":"months","triggerAtHour":9}]}},"typeVersion":1.2},{"id":"5796454a-2479-450d-8e1c-b9e9344e0da0","name":"Scrape Quora Trends (Bright Data)","type":"n8n-nodes-base.httpRequest","position":[-200,1580],"parameters":{"url":"https://api.brightdata.com/request","method":"POST","options":{},"sendBody":true,"sendHeaders":true,"bodyParameters":{"parameters":[{"name":"zone","value":"n8n_unblocker"},{"name":"url","value":"https://www.quora.com/search?q=marketing"},{"name":"country","value":"us"},{"name":"format","value":"raw"},{"name":"render","value":"true"}]},"headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer YOUR_TOKEN_HERE"}]}},"typeVersion":4.2},{"id":"4c93f548-a848-4aa9-bdf7-d8b282d49dbb","name":"Extract Post Titles & Stats","type":"n8n-nodes-base.html","position":[80,1580],"parameters":{"options":{},"operation":"extractHtmlContent","extractionValues":{"values":[{"key":"Title","cssSelector":"<span style=\"background: none;\">What exactly is digital marketing</span>"},{"key":"Answers","cssSelector":"<a class=\"q-box qu-cursor--pointer qu-hover--textDecoration--underline b2c1r2a puppeteer_test_link\" href=\"https://www.quora.com/What-exactly-is-digital-marketing\" target=\"_blank\" style=\"box-sizing: border-box; border-radius: inherit;\">3.2K answers</a>"}]}},"typeVersion":1.2},{"id":"40bf951b-4c60-4660-a6dc-c3cd99298e94","name":"Save Trends to Sheet","type":"n8n-nodes-base.googleSheets","position":[300,1580],"parameters":{"columns":{"value":{"Title":"={{ $json.Title }}","Answer":"={{ $json.Answers }}"},"schema":[{"id":"Title","type":"string","display":true,"required":false,"displayName":"Title","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Answer","type":"string","display":true,"required":false,"displayName":"Answer","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/19j13GLmFHZUnIKH5KGgdj0ohVMx4MhOnDf5ovI0yz6Y/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"19j13GLmFHZUnIKH5KGgdj0ohVMx4MhOnDf5ovI0yz6Y","cachedResultUrl":"https://docs.google.com/spreadsheets/d/19j13GLmFHZUnIKH5KGgdj0ohVMx4MhOnDf5ovI0yz6Y/edit?usp=drivesdk","cachedResultName":"Trend tracker"}},"credentials":{"googleSheetsOAuth2Api":{"id":"r2mDaisH6e9VkwHl","name":"Google Sheets account"}},"typeVersion":4.6},{"id":"b8bff546-392a-4f88-ac67-7d3336978cc0","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-460,600],"parameters":{"color":3,"width":400,"height":1180,"content":"### 🧠 **SECTION 1: Trend Trigger & Scraper**\n\n> **Purpose:** Automate the scraping of viral content from Quora every month.\n\n#### ⏰ `Node 1: Monthly Trend Trigger`\n\n**🔗 Type:** Cron Scheduler\n**🧩 What it does:**\nThis node is like your personal assistant — it **automatically starts the workflow on the 1st day of every month** without you lifting a finger.\n\n* 🗓 Trigger schedule: Monthly (e.g., `0 0 1 * *`)\n* 📈 Use Case: Keeps your trend tracking consistent and timely\n\n> 🧠 *Why it matters:* Instead of manually checking viral trends, this node ensures it’s **fully automated**, perfect for monthly reports or trend tracking dashboards.\n\n---\n\n#### 🌐 `Node 2: Scrape Quora Trends (Bright Data)`\n\n**🔗 Type:** HTTP Request\n**🧩 What it does:**\nThis node sends a **POST request to Bright Data** to scrape trending Quora results for a given topic (like `\"https://www.quora.com/search?q=marketing\"`).\n\n* 🔒 Uses **Bright Data Web Unlocker** to bypass restrictions\n* 🧠 Intelligent scraping with full HTML + rendering\n* 🔍 Targets specific search terms (e.g., `marketing`, `UX`, `AI in marketing`)\n\n> 💡 *Why it matters:* You can collect **real trending content** from Quora without opening your browser. Bright Data handles the hard stuff like JavaScript, proxies, and blocks.\n\n---\n\n"},"typeVersion":1},{"id":"c4c10db4-b6e1-413d-9183-cd9b8fb6c0fa","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[20,720],"parameters":{"color":5,"width":400,"height":1060,"content":"### 🧾 **SECTION 2: Extract & Save Insights**\n\n> **Purpose:** Process the scraped data and store it in a usable format (Google Sheets).\n\n#### 🧱 `Node 3: Extract Post Titles & Stats`\n\n**🔗 Type:** HTML Extract\n**🧩 What it does:**\nTakes the raw HTML from Quora and pulls out the meaningful information you care about:\n\n* 📝 Question titles or post headlines\n* 🔗 URLs\n* 👍 Vote count or engagement\n* 🧑 Author or answer snippet (if desired)\n\nYou use **CSS Selectors or XPath** to tell n8n what to extract. For example:\n\n```css\na.q-box.qu-mb--tiny  →  Post links  \ndiv.q-relative  →  Snippets or text  \n```\n\n> 🧠 *Why it matters:* This is where raw data becomes structured. You’re now transforming messy HTML into useful, clean trend info.\n\n---\n\n#### 📊 `Node 4: Save Trends to Sheet`\n\n**🔗 Type:** Google Sheets\n**🧩 What it does:**\nTakes the structured trend data and **appends it to a Google Sheet** for archiving, analysis, or sharing.\n\n"},"typeVersion":1},{"id":"772bfade-22ab-46d5-aadf-9ec46d99b7f6","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[480,720],"parameters":{"color":7,"width":380,"height":240,"content":"## I’ll receive a tiny commission if you join Bright Data through this link—thanks for fueling more free content!\n\n### https://get.brightdata.com/1tndi4600b25"},"typeVersion":1}],"active":false,"settings":{"executionOrder":"v1"},"versionId":"f4efa76f-fdce-4081-aa53-54b8c36cbcfc","connections":{"Monthly Trend Trigger1":{"main":[[{"node":"Scrape Quora Trends (Bright Data)","type":"main","index":0}]]},"Extract Post Titles & Stats":{"main":[[{"node":"Save Trends to Sheet","type":"main","index":0}]]},"Scrape Quora Trends (Bright Data)":{"main":[[{"node":"Extract Post Titles & Stats","type":"main","index":0}]]}}}


name: Automated Weather Reports with Bright Data & n8n
author_name: Yaron Been
author_username: yaron-nofluff
nodes_used: ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest","n8n-nodes-base.html"]
categories: []
created_at: 2025-06-24T15:57:38.109Z
updated_at: 2025-06-24T15:57:38.109Z
url: https://n8n.io/workflows/5226
scraped_at: 2025-07-06 21:16:30
description:
  Description

  This workflow automatically collects weather data from multiple sources and compiles it into comprehensive reports. It helps you make informed decisions based on accurate weather forecasts without manually checking multiple weather services.

  Overview

  This workflow automatically scrapes weather data from multiple sources and compiles it into a comprehensive report. It uses Bright Data to access weather websites and can be configured to send you regular weather updates for your locations of interest.

  Tools Used

  n8n:** The automation platform that orchestrates the workflow.
  Bright Data:** For scraping weather websites and forecast data without getting blocked.
  Notification Services:** Email, messaging apps, or other platforms.

  How to Install

  Import the Workflow: Download the .json file and import it into your n8n instance.
  Configure Bright Data: Add your Bright Data credentials to the Bright Data node.
  Set Up Notifications: Configure how you want to receive weather reports.
  Customize: Add your locations of interest and reporting frequency.

  Use Cases

  Event Planners:** Get weather forecasts for upcoming outdoor events.
  Farmers:** Monitor weather conditions for agricultural planning.
  Travelers:** Check weather forecasts for destinations before trips.

  Connect with Me

  Website:** https://www.nofluff.online
  YouTube:** https://www.youtube.com/@YaronBeen/videos
  LinkedIn:** https://www.linkedin.com/in/yaronbeen/
  Get Bright Data:** https://get.brightdata.com/1tndi4600b25 (Using this link supports my free workflows with a small commission)

  #n8n #automation #weather #weatherforecasts #brightdata #webscraping #weatherreports #weatheralerts #weatherdata #weathermonitoring #n8nworkflow #workflow #nocode #weatherautomation #weatherscraping #weathertracking #weathernotifications #weatherupdates #forecastdata #weatherplanning #weatherservice #outdoorevents #weatherapi #weatherinformation #climatedata #weathertech

workflow_json:
  {"id":"2v8K3VanHj11PubB","meta":{"instanceId":"60046904b104f0f72b2629a9d88fe9f676be4035769f1f08dad1dd38a76b9480","templateCredsSetupCompleted":true},"name":"Weather_Report_Scraper_via_Bright_Data","tags":[],"nodes":[{"id":"d143f06d-3ea0-4feb-9157-62bc3d28b2aa","name":"Start Workflow","type":"n8n-nodes-base.manualTrigger","position":[-460,1720],"parameters":{},"typeVersion":1},{"id":"579b56bf-35e6-4114-947c-9e62814a2bff","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[-2180,1020],"parameters":{"color":4,"width":1300,"height":320,"content":"=======================================\n            WORKFLOW ASSISTANCE\n=======================================\nFor any questions or support, please contact:\n    Yaron@nofluff.online\n\nExplore more tips and tutorials here:\n   - YouTube: https://www.youtube.com/@YaronBeen/videos\n   - LinkedIn: https://www.linkedin.com/in/yaronbeen/\n=======================================\n"},"typeVersion":1},{"id":"bd02001c-f390-4138-8013-d43f89802ab5","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-2180,1360],"parameters":{"color":4,"width":1289,"height":1718,"content":"## 🌦️ **Weather Data Scraper Automation**\n\nThis n8n automation helps you **scrape weather data from a website**, extract useful info, and **log it directly to a Google Sheet** — great for personal dashboards, weather research, or historical weather tracking.\n\n---\n\n### 🟢 **SECTION 1: Start & Fetch Weather via Bright Data**\n\n| ⚡ Start Workflow                                          | 🌐 Request Weather                                     |\n| --------------------------------------------------------- | ------------------------------------------------------ |\n| ![Start](https://img.icons8.com/ios-filled/40/rocket.png) | ![Web](https://img.icons8.com/fluency/40/internet.png) |\n\n#### 🧩 Node 1: `Start Workflow`\n\n* **Type**: Trigger node\n* **What it does**: Starts the automation manually or through a schedule.\n* **For Beginners**: Think of this like the **\"play button\"** for your entire workflow. You can trigger it by hand or set it on a timer.\n\n#### 🧩 Node 2: `Request/Fetch Weather via Bright Data`\n\n* **Type**: HTTP Request\n* **What it does**: Uses [Bright Data Proxy](https://brightdata.com) to send a request to a weather website and **fetch the full HTML page**, even bypassing bot protections.\n* **For Beginners**: Bright Data acts like a smart assistant that **gets web pages without getting blocked**. It makes web scraping more reliable.\n\n---\n\n### 🟠 **SECTION 2: Extract & Process Weather Info**\n\n| 🧠 Extract HTML                                         | 📋 Log to Sheet                                             |\n| ------------------------------------------------------- | ----------------------------------------------------------- |\n| ![HTML](https://img.icons8.com/color/40/html-5--v1.png) | ![Sheet](https://img.icons8.com/color/40/google-sheets.png) |\n\n#### 🧩 Node 3: `Extract Weather Info`\n\n* **Type**: HTML Extractor\n* **What it does**: Parses the HTML and **pulls out specific info** like temperature, humidity, and conditions using CSS selectors.\n* **For Beginners**: Imagine this node as a **filter** — it sifts through a huge webpage and pulls only the useful details you care about (like the current temperature).\n\n#### 🧩 Node 4: `Log to Weather Sheet`\n\n* **Type**: Google Sheets Integration\n* **What it does**: Appends the extracted weather info into a Google Sheet — creating a simple log or database you can review later.\n* **For Beginners**: This is where all the magic gets stored! Each run adds a new row with the latest weather so you can build a **daily weather tracker**.\n\n---\n\n### 📦 **SECTION 3: Output and Use**\n\n| ✅ Final Output                                                                                                                       |\n| ------------------------------------------------------------------------------------------------------------------------------------ |\n| ![Output](https://img.icons8.com/external-flat-icons-inmotus-design/40/external-Export-File-interface-flat-icons-inmotus-design.png) |\n\n#### 🧩 Final Output: Weather Data Stored\n\n* **What it means**: The Google Sheet now holds all the weather data you’ve collected over time.\n* **How to use**: You can:\n\n  * Analyze trends 📈\n  * Create dashboards 📊\n  * Set up alerts for specific weather events (next step!)\n  * Or just check how today compares to last week!\n\n---\n\n### 🧠 Summary (For Beginners)\n\n> **In simple terms**:\n> You click a button (or schedule it), it gets the weather from a website using a smart fetcher (Bright Data), pulls only the info you care about, and **stores it safely in Google Sheets**.\n> It's like building your own **personal weather archive**, no coding needed!\n\n---\n\n"},"typeVersion":1},{"id":"d22f87aa-4365-44f1-aab9-6e764af748f9","name":"RequestFetch Weather via Bright data","type":"n8n-nodes-base.httpRequest","position":[-240,1720],"parameters":{"url":"https://api.brightdata.com/request","method":"POST","options":{},"sendBody":true,"sendHeaders":true,"bodyParameters":{"parameters":[{"name":"zone","value":"n8n_unblocker"},{"name":"url","value":"https://www.weather.com/weather/today/l/Paris,FR"},{"name":"country","value":"fr"},{"name":"format","value":"raw"}]},"headerParameters":{"parameters":[{"name":"Authorization","value":"Bearer YOUR_TOKEN_HERE"}]}},"typeVersion":4.2},{"id":"f28bf59a-1671-43af-9a98-0ce8cc9ca1e4","name":"Extract Weather Info","type":"n8n-nodes-base.html","position":[20,1720],"parameters":{"options":{},"operation":"extractHtmlContent","extractionValues":{"values":[{"key":"Temperature","cssSelector":"<span data-testid=\"TemperatureValue\" class=\"CurrentConditions--tempValue--zUBSz\" dir=\"ltr\">81<span class=\"CurrentConditions--degreeSymbol--tzLy9\">°</span><span></span></span>"}]}},"typeVersion":1.2},{"id":"76410c0c-560c-48c2-87cd-68114b5de9ad","name":"Log to Weather Sheet","type":"n8n-nodes-base.googleSheets","position":[240,1720],"parameters":{"columns":{"value":{"City":"Paris","Country":"France","Temperature":"={{ $json.a }}"},"schema":[{"id":"Country","type":"string","display":true,"removed":false,"required":false,"displayName":"Country","defaultMatch":false,"canBeUsedToMatch":true},{"id":"City","type":"string","display":true,"removed":false,"required":false,"displayName":"City","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Temperature","type":"string","display":true,"removed":false,"required":false,"displayName":"Temperature","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"append","sheetName":{"__rl":true,"mode":"list","value":"gid=0","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1mpIFtKgbtV_LgxFD2LTeXbHdaMu-Qca1S9RRSlFpZWQ/edit#gid=0","cachedResultName":"Sheet1"},"documentId":{"__rl":true,"mode":"list","value":"1mpIFtKgbtV_LgxFD2LTeXbHdaMu-Qca1S9RRSlFpZWQ","cachedResultUrl":"https://docs.google.com/spreadsheets/d/1mpIFtKgbtV_LgxFD2LTeXbHdaMu-Qca1S9RRSlFpZWQ/edit?usp=drivesdk","cachedResultName":"Weather report"}},"credentials":{"googleSheetsOAuth2Api":{"id":"r2mDaisH6e9VkwHl","name":"Google Sheets account"}},"typeVersion":4.6},{"id":"fe209422-9127-407b-8ac8-bff7951c18ca","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-500,1040],"parameters":{"color":6,"width":420,"height":900,"content":"### 🟢 **SECTION 1: Start & Fetch Weather via Bright Data**\n\n| ⚡ Start Workflow                                          | 🌐 Request Weather                                     |\n| --------------------------------------------------------- | ------------------------------------------------------ |\n| ![Start](https://img.icons8.com/ios-filled/40/rocket.png) | ![Web](https://img.icons8.com/fluency/40/internet.png) |\n\n#### 🧩 Node 1: `Start Workflow`\n\n* **Type**: Trigger node\n* **What it does**: Starts the automation manually or through a schedule.\n* **For Beginners**: Think of this like the **\"play button\"** for your entire workflow. You can trigger it by hand or set it on a timer.\n\n#### 🧩 Node 2: `Request/Fetch Weather via Bright Data`\n\n* **Type**: HTTP Request\n* **What it does**: Uses [Bright Data Proxy](https://brightdata.com) to send a request to a weather website and **fetch the full HTML page**, even bypassing bot protections.\n* **For Beginners**: Bright Data acts like a smart assistant that **gets web pages without getting blocked**. It makes web scraping more reliable.\n\n---\n\n"},"typeVersion":1},{"id":"23e7ddee-8409-4633-a7de-e29ea9face06","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[-20,1020],"parameters":{"color":3,"width":420,"height":920,"content":"### 🟠 **SECTION 2: Extract & Process Weather Info**\n\n| 🧠 Extract HTML                                         | 📋 Log to Sheet                                             |\n| ------------------------------------------------------- | ----------------------------------------------------------- |\n| ![HTML](https://img.icons8.com/color/40/html-5--v1.png) | ![Sheet](https://img.icons8.com/color/40/google-sheets.png) |\n\n#### 🧩 Node 3: `Extract Weather Info`\n\n* **Type**: HTML Extractor\n* **What it does**: Parses the HTML and **pulls out specific info** like temperature, humidity, and conditions using CSS selectors.\n* **For Beginners**: Imagine this node as a **filter** — it sifts through a huge webpage and pulls only the useful details you care about (like the current temperature).\n\n#### 🧩 Node 4: `Log to Weather Sheet`\n\n* **Type**: Google Sheets Integration\n* **What it does**: Appends the extracted weather info into a Google Sheet — creating a simple log or database you can review later.\n* **For Beginners**: This is where all the magic gets stored! Each run adds a new row with the latest weather so you can build a **daily weather tracker**.\n\n---\n\n"},"typeVersion":1},{"id":"aabc6470-727f-4d60-b390-44b52114821a","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[460,1020],"parameters":{"color":7,"width":380,"height":240,"content":"## I’ll receive a tiny commission if you join Bright Data through this link—thanks for fueling more free content!\n\n### https://get.brightdata.com/1tndi4600b25"},"typeVersion":1}],"active":false,"settings":{"executionOrder":"v1"},"versionId":"4e7b1293-10f1-4bee-a389-42835314731d","connections":{"Start Workflow":{"main":[[{"node":"RequestFetch Weather via Bright data","type":"main","index":0}]]},"Extract Weather Info":{"main":[[{"node":"Log to Weather Sheet","type":"main","index":0}]]},"RequestFetch Weather via Bright data":{"main":[[{"node":"Extract Weather Info","type":"main","index":0}]]}}}


name: Generate video from prompt using Vertex AI Veo 3 and upload to Google Drive
author_name: Jaruphat J.
author_username: jaruphatj
nodes_used: ["n8n-nodes-base.httpRequest","n8n-nodes-base.googleDrive"]
categories: []
created_at: 2025-06-24T16:12:05.313Z
updated_at: 2025-06-24T16:12:05.313Z
url: https://n8n.io/workflows/5228
scraped_at: 2025-07-06 21:16:30
description:
  Who’s it for
  This template is perfect for content creators, AI enthusiasts, marketers, and developers who want to automate the generation of cinematic videos using Google Vertex AI’s Veo 3 model. It’s also ideal for anyone experimenting with generative AI for video using n8n.

  What it does
  This workflow:
  Accepts a text prompt and a GCP access token via form.
  Sends the prompt to the Veo 3 (preview model) using Vertex AI’s predictLongRunning endpoint.
  Waits for the video rendering to complete.
  Fetches the final result and converts the base64-encoded video to a file.
  Uploads the resulting .mp4 to your Google Drive.

  Output

  How to set up
  Enable Vertex AI API in your GCP project:
  https://console.cloud.google.com/marketplace/product/google/aiplatform.googleapis.com

  Authenticate with GCP using Cloud Shell or local terminal:
  gcloud auth login
  gcloud config set project [YOUR_PROJECT_ID]
  gcloud auth application-default set-quota-project [YOUR_PROJECT_ID]
  gcloud auth print-access-token
  Copy the token and use it in the form when running the workflow.
  ⚠️ This token lasts ~1 hour. Regenerate as needed.

  Connect your Google Drive OAuth2 credentials to allow file upload.

  Import this workflow into n8n and execute it via form trigger.

  Requirements
  n8n (v1.94.1+)**
  A Google Cloud project with:
    Vertex AI API enabled
    Billing enabled
  A way to get Access Token A Google Drive OAuth2 credential connected to n8n

  How to customize the workflow
  You can modify the 
        
  in the HTTP node to match your use case.
  Replace the Google Drive upload node with alternatives like Dropbox, S3, or YouTube upload.
  Extend the workflow to add subtitles, audio dubbing, or LINE/Slack alerts.

  Step-by-step for each major node:

  Prompt Input → Vertex Predict → Wait → Fetch Result → Convert to File → Upload

  Best Practices Followed
  No hardcoded API tokens
  Secure: GCP token is input via form, not stored in workflow
  All nodes are renamed with clear purpose
  All editable config grouped in Set node

  External References
  GCP Veo API Docs:
  https://cloud.google.com/vertex-ai/docs/generative-ai/video/overview

  Disclaimer
  This workflow uses official Google Cloud APIs and requires a valid GCP project.
  Access token should be generated securely using gcloud CLI.
  Do not embed tokens in the workflow itself.

  Notes on GCP Access Token
  To use the Vertex AI API in n8n securely:
  Run the following on your local machine or GCP Cloud Shell:
  gcloud auth login
  gcloud config set project your-project-id
  gcloud auth print-access-token
  Paste the token in the workflow form field  when submitting.
  Do not hardcode the token into HTTP nodes or Set nodes — input it each time or use a secure credential vault.

workflow_json:
  {"id":"dLrtZMRZzusZDlpa","meta":{"instanceId":"2c12b0b552404dc07af67cd5f092afd21d18c808d4fdabdb04cb4b064195b6fb","templateCredsSetupCompleted":true},"name":"GoogleVertex_template","tags":[],"nodes":[{"id":"9f66e6be-6de0-4e2c-ad5e-20059f4a0d85","name":"Setting","type":"n8n-nodes-base.set","position":[-80,0],"parameters":{"options":{},"assignments":{"assignments":[{"id":"5cedc3de-6221-4d7e-a6c8-82f4cb9cf0e9","name":"PROJECT_ID","type":"string","value":"<YOUR_PROJECT_ID>"},{"id":"90019751-e2d5-4764-9bf9-e13916dcc528","name":"MODEL_VERSION","type":"string","value":"veo-3.0-generate-preview"},{"id":"67ab205c-82b3-4263-99c4-c906a0ca6ae9","name":"LOCATION","type":"string","value":"<YOUR_LOCATION>"},{"id":"413415fb-60c5-4d0d-ac45-1e6178a55227","name":"TEXT_PROMPT","type":"string","value":"={{ $json.Prompt }}"},{"id":"91d09e20-87db-474f-91e1-6ed58b96dae5","name":"IMAGE_COUNT","type":"string","value":"1"},{"id":"17954335-b96b-4813-9c4a-20817d675448","name":"API_ENDPOINT","type":"string","value":"<YOUR_LOCATION>-aiplatform.googleapis.com"},{"id":"bf0910e1-b757-4852-9341-a7792161f89b","name":"ACCESS_TOKEN","type":"string","value":"={{ $json.YOUR_ACCESS_TOKEN }}"}]}},"typeVersion":3.4},{"id":"252be387-d2c6-4618-9d44-326baa0a1d6f","name":"Convert to File","type":"n8n-nodes-base.convertToFile","position":[760,0],"parameters":{"options":{},"operation":"toBinary","sourceProperty":"response.videos[0].bytesBase64Encoded"},"typeVersion":1.1},{"id":"ab04d16e-4727-49bb-b868-28db703b1b0f","name":"On form submission","type":"n8n-nodes-base.formTrigger","position":[-300,0],"webhookId":"1c041721-9e17-4486-927e-d2de9a113977","parameters":{"options":{},"formTitle":"Google Vertex AI","formFields":{"values":[{"fieldLabel":"Prompt","requiredField":true},{"fieldLabel":"YOUR_ACCESS_TOKEN","requiredField":true}]},"formDescription":"Google Vertex"},"typeVersion":2.2},{"id":"2497f762-8f0a-4a4d-87a2-31d05c62fdee","name":"Google Drive","type":"n8n-nodes-base.googleDrive","position":[980,0],"parameters":{"name":"={{ $('On form submission').item.json.submittedAt }}.mp4","driveId":{"__rl":true,"mode":"list","value":"My Drive","cachedResultUrl":"https://drive.google.com/drive/my-drive","cachedResultName":"My Drive"},"options":{},"folderId":{"__rl":true,"mode":"list","value":"1tzpmwAWiUGolnKciZvcCghB5obhPoXzL","cachedResultUrl":"https://drive.google.com/drive/folders/1tzpmwAWiUGolnKciZvcCghB5obhPoXzL","cachedResultName":"n8n_VertexAI"}},"credentials":{"googleDriveOAuth2Api":{"id":"QVrgALkld7whKIgB","name":"Google Drive account - Peakwave"}},"typeVersion":3},{"id":"f2b78a57-403e-47d8-8f48-8af3263077d5","name":"Vertex AI-VEO3","type":"n8n-nodes-base.httpRequest","position":[180,0],"parameters":{"url":"=https://{{ $json.API_ENDPOINT }}/v1/projects/{{ $json.PROJECT_ID }}/locations/{{ $json.LOCATION }}/publishers/google/models/{{ $json.MODEL_VERSION }}:predictLongRunning","method":"POST","options":{},"jsonBody":"={\n  \"endpoint\": \"projects/n8n-project-440404/locations/us-central1/publishers/google/models/veo-3.0-generate-preview\",\n  \"instances\": [\n    {\n      \"prompt\": {{ $json.TEXT_PROMPT }}\n    }\n  ],\n  \"parameters\": {\n    \"aspectRatio\": \"16:9\",\n    \"sampleCount\": 1,\n    \"durationSeconds\": \"8\",\n    \"personGeneration\": \"allow_all\",\n    \"addWatermark\": true,\n    \"includeRaiReason\": true,\n    \"generateAudio\": true\n  }\n}\n","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Content-Type","value":"application/json"},{"name":"Authorization","value":"=Bearer {{ $json.ACCESS_TOKEN }}"}]}},"typeVersion":4.2},{"id":"8b5f1887-c001-4d95-ae04-0b9c9dd80dc4","name":"Vertex AI-fetch","type":"n8n-nodes-base.httpRequest","position":[540,0],"parameters":{"url":"=https://{{ $('Setting').item.json.API_ENDPOINT }}/v1/projects/{{ $('Setting').item.json.PROJECT_ID }}/locations/{{ $('Setting').item.json.LOCATION }}/publishers/google/models/{{ $('Setting').item.json.MODEL_VERSION }}:fetchPredictOperation\n","method":"POST","options":{},"jsonBody":"={\n  \"operationName\": \"{{ $json.name }}\"\n}\n","sendBody":true,"sendHeaders":true,"specifyBody":"json","headerParameters":{"parameters":[{"name":"Content-Type","value":"application/json"},{"name":"Authorization","value":"=Bearer {{ $('On form submission').item.json.YOUR_ACCESS_TOKEN }}"}]}},"typeVersion":4.2},{"id":"61565d47-ee78-4a77-bcf1-0043636a8338","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-140,-160],"parameters":{"height":320,"content":"### Setting GCP\n- PROJECT_ID\n- MODEL_VERSION\n- LOCATION\n- IMAGE_COUNT\n- API_ENDPOINT"},"typeVersion":1},{"id":"161e051f-9a74-46bd-a2f8-cf32b68279a2","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[120,-160],"parameters":{"color":4,"width":580,"height":320,"content":"## Veo3\n1. Sends the prompt to the Veo3 using Vertex AI’s predictLongRunning endpoint.\n2. Waits for the video rendering to complete.\n3. Fetches the final result"},"typeVersion":1},{"id":"ca75a288-5f19-4678-ac5f-cf924843f64a","name":"Wait","type":"n8n-nodes-base.wait","position":[360,0],"webhookId":"b263025f-8acf-406b-b3cc-aaaf5b6a4557","parameters":{"unit":"minutes","amount":2},"typeVersion":1.1},{"id":"088bf7c8-bc74-47e5-9ca7-23807c9d5c32","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[720,-160],"parameters":{"color":5,"width":200,"height":320,"content":"### Convert to Video file\n\nBase64 Input Field:\n```response.videos[0].bytesBase64Encoded```"},"typeVersion":1},{"id":"091c8fe2-57a9-4f62-949c-84f88b38b91a","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[940,-160],"parameters":{"color":6,"width":180,"height":320,"content":"### Upload Video to Google Drive"},"typeVersion":1},{"id":"25da0c72-2dd8-47f1-93fc-8e116b5c3768","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-380,-160],"parameters":{"color":7,"width":230,"height":320,"content":"### Accepts a text prompt and a GCP access token via form.\n\n\n"},"typeVersion":1},{"id":"14aa3de1-ece7-4272-a52e-0f0f72197f77","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[-140,180],"parameters":{"color":7,"width":660,"height":400,"content":"### Workflow Process\n![Alt text](https://drive.google.com/thumbnail?id=1L9KKkuS0hk5LW9hpGJ_FB9giKYFZpmy4&sz=w1000)"},"typeVersion":1},{"id":"4e8c2cf8-0ef1-4da0-930e-54854062e36d","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[540,180],"parameters":{"color":7,"width":580,"height":400,"content":"### Output\n![Alt text](https://drive.google.com/thumbnail?id=1Biq2vhbzaFLya1ZsF8PhGL1RRta7XkMK&sz=w1000)"},"typeVersion":1},{"id":"120dcf68-1a9b-447d-a530-1e2264eb9b8f","name":"Sticky Note7","type":"n8n-nodes-base.stickyNote","position":[-380,180],"parameters":{"color":7,"width":230,"height":400,"content":"### How to get GCP Access Token\n\nUse this command in your VM/Cloud Shell:\n\n```bash\ngcloud auth print-access-token\n"},"typeVersion":1}],"active":false,"settings":{"executionOrder":"v1"},"versionId":"f9faaec3-832c-407d-a356-14844be9fdca","connections":{"Wait":{"main":[[{"node":"Vertex AI-fetch","type":"main","index":0}]]},"Setting":{"main":[[{"node":"Vertex AI-VEO3","type":"main","index":0}]]},"Vertex AI-VEO3":{"main":[[{"node":"Wait","type":"main","index":0}]]},"Convert to File":{"main":[[{"node":"Google Drive","type":"main","index":0}]]},"Vertex AI-fetch":{"main":[[{"node":"Convert to File","type":"main","index":0}]]},"On form submission":{"main":[[{"node":"Setting","type":"main","index":0}]]}}}


name: YouTube Optimization Automation: Google Sheets + DeepSeek Integration
author_name: Jacob
author_username: jacobgad
categories: []
created_at: 2025-06-24T17:48:25.293Z
updated_at: 2025-06-24T17:48:25.293Z
url: https://n8n.io/workflows/5229
scraped_at: 2025-07-06 21:16:30
description:
  Unlock the full potential of your YouTube channel with our powerful integration that connects Google Sheets and DeepSeek AI — designed to skyrocket your video visibility and engagement without manual hassle.

  What this integration does for you:
  Automates video data management by pulling your YouTube URLs straight from Google Sheets — no more copy-pasting or manual tracking.

  Extracts your current titles and descriptions directly from YouTube, giving you a clear starting point.

  Generates 3 high-impact, SEO-optimized titles plus 1 compelling, conversion-focused description — crafted by DeepSeek’s AI to grab attention and rank higher.

  Updates your Google Sheet automatically with new optimized titles and descriptions — keeping all your video info in one place, ready to publish.

  Why it matters:
  In the crowded world of YouTube, having the right title and description can make all the difference between millions of views or being lost in the noise. This integration takes the guesswork out of optimization, saving you time and boosting your channel’s growth with proven AI-driven content.

  You need to Sheet with columns:

  Url
  Keyword
  Status
  Old Title
  New Title
  Old Description
  New Description

  My contact: 
  jacobmarketingservice@gmail.com

nodes_used:
  ["n8n-nodes-base.googleSheets","n8n-nodes-base.httpRequest","n8n-nodes-base.code","@n8n/n8n-nodes-langchain.chainLlm","@n8n/n8n-nodes-langchain.lmChatDeepSeek"]

workflow_json:
  {"id":"wSJzfPqFnJgQoet0","meta":{"instanceId":"cd438fd1eca1b4215129611b59e2a783bbecd4a7fc04e24e9ac21de3d46ce6cc","templateCredsSetupCompleted":true},"name":"Youtube optimalization","tags":[],"nodes":[{"id":"c04d2583-25b6-4875-9bef-190d43b3ba55","name":"When clicking ‘Execute workflow’","type":"n8n-nodes-base.manualTrigger","position":[0,0],"parameters":{},"typeVersion":1},{"id":"12b1cb02-995c-490b-a1be-3f53831fa2ca","name":"Get row(s) in sheet","type":"n8n-nodes-base.googleSheets","position":[220,0],"parameters":{"options":{},"filtersUI":{"values":[{"lookupValue":"Pending","lookupColumn":"Status"}]},"sheetName":{"__rl":true,"mode":"list","value":46645040,"cachedResultUrl":"","cachedResultName":""},"documentId":{"__rl":true,"mode":"list","value":"1zoIIfA03no9Q_huenS6qYrDFKdhrf1kFijDEHoiBZdk","cachedResultUrl":"","cachedResultName":""}},"credentials":{"googleSheetsOAuth2Api":{"id":"8697bDzanPk5JVnu","name":"Google Sheets account"}},"typeVersion":4.6},{"id":"e58439a8-5add-4ff3-87cc-dfac283b8848","name":"HTTP Request","type":"n8n-nodes-base.httpRequest","position":[440,0],"parameters":{"url":"={{ $json.Url }}","options":{},"jsonHeaders":"{\n  \"User-Agent\": \"Mozilla/5.0\"\n}","sendHeaders":true,"specifyHeaders":"json"},"typeVersion":4.2},{"id":"b2757b85-9256-43af-bd59-4455b30a5d88","name":"Code","type":"n8n-nodes-base.code","position":[660,0],"parameters":{"jsCode":"const html = $input.first().json.data;\n\n\nconst match = html.match(/var ytInitialData = (.*?);\\s*<\\/script>/s);\nif (!match) {\n  return [{ json: { error: \"ytInitialData not found\" } }];\n}\n\nlet data;\ntry {\n  data = JSON.parse(match[1]);\n} catch (err) {\n  return [{ json: { error: \"Invalid JSON\", details: err.message } }];\n}\n\nlet title = null;\nlet description = null;\n\n\ntry {\n  const contents = data.contents.twoColumnWatchNextResults.results.results.contents;\n  const videoPrimaryInfo = contents.find(c => c.videoPrimaryInfoRenderer);\n  title = videoPrimaryInfo.videoPrimaryInfoRenderer.title.runs[0].text;\n} catch (e) {\n  title = null;\n}\n\n\nfunction findAttributedDescription(obj) {\n  if (typeof obj !== 'object' || obj === null) return null;\n\n  if (obj.attributedDescription && obj.attributedDescription.content) {\n    return obj.attributedDescription.content;\n  }\n\n  for (const key in obj) {\n    const result = findAttributedDescription(obj[key]);\n    if (result) return result;\n  }\n\n  return null;\n}\n\ndescription = findAttributedDescription(data);\n\nreturn [{\n  json: {\n    title,\n    description\n  }\n}];"},"typeVersion":2},{"id":"d388f1a8-e92f-439b-8fdd-baeda842f703","name":"DeepSeek Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatDeepSeek","position":[560,220],"parameters":{"options":{}},"credentials":{"deepSeekApi":{"id":"jPnyKkmqHRq5dXfZ","name":"DeepSeek account"}},"typeVersion":1},{"id":"b8b37c7f-10ed-48e3-9681-74f1b4eabcc8","name":"Merge","type":"n8n-nodes-base.merge","position":[1400,-20],"parameters":{"numberInputs":3},"typeVersion":3.2},{"id":"52da4d3e-48d6-4cd3-b52a-cd07a9d6df77","name":"Update row in sheet1","type":"n8n-nodes-base.googleSheets","position":[1720,-20],"parameters":{"columns":{"value":{"Url":"={{ $('Get row(s) in sheet').item.json.Url }}","Etap":"=Done","New Title":"={{ $json.data[0].newTitle }}","Old Title":"={{ $json.data[2].title }}","New Description":"={{ $json.data[1].newDescription }}","Old Description":"={{ $json.data[2].description }}"},"schema":[{"id":"Url","type":"string","display":true,"removed":false,"required":false,"displayName":"Url","defaultMatch":false,"canBeUsedToMatch":true},{"id":"keyword","type":"string","display":true,"required":false,"displayName":"keyword","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Status","type":"string","display":true,"required":false,"displayName":"Status","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Old Title","type":"string","display":true,"required":false,"displayName":"Old Title","defaultMatch":false,"canBeUsedToMatch":true},{"id":"New Title","type":"string","display":true,"required":false,"displayName":"New Title","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Old Description","type":"string","display":true,"required":false,"displayName":"Old Description","defaultMatch":false,"canBeUsedToMatch":true},{"id":"New Description","type":"string","display":true,"required":false,"displayName":"New Description","defaultMatch":false,"canBeUsedToMatch":true},{"id":"All Keywords","type":"string","display":true,"required":false,"displayName":"All Keywords","defaultMatch":false,"canBeUsedToMatch":true},{"id":"row_number","type":"string","display":true,"removed":true,"readOnly":true,"required":false,"displayName":"row_number","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["Url"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"update","sheetName":{"__rl":true,"mode":"list","value":46645040,"cachedResultUrl":"","cachedResultName":""},"documentId":{"__rl":true,"mode":"list","value":"1zoIIfA03no9Q_huenS6qYrDFKdhrf1kFijDEHoiBZdk","cachedResultUrl":"","cachedResultName":""}},"credentials":{"googleSheetsOAuth2Api":{"id":"8697bDzanPk5JVnu","name":"Google Sheets account"}},"typeVersion":4.6},{"id":"1be2ad4b-c29a-43af-9ac5-24eee218aee6","name":"Code1","type":"n8n-nodes-base.code","position":[1140,0],"parameters":{"jsCode":"\nconst rawText = items[0].json.text;\n\n\nconst parsed = JSON.parse(rawText);\n\n\nreturn [{ json: parsed }];"},"typeVersion":2},{"id":"ad7d912a-7cbc-4552-ad21-2a7ab1455c05","name":"Code2","type":"n8n-nodes-base.code","position":[1140,160],"parameters":{"jsCode":"\nconst rawText = items[0].json.text;\n\n\nconst parsed = JSON.parse(rawText);\n\n\nreturn [{ json: parsed }];"},"typeVersion":2},{"id":"e7f50baa-570d-4426-b5ec-56ef0272bf20","name":"Aggregate","type":"n8n-nodes-base.aggregate","position":[1540,-20],"parameters":{"options":{},"aggregate":"aggregateAllItemData"},"typeVersion":1},{"id":"6dc22bd3-93eb-4c00-b230-19981f12b7a1","name":"New Title Generating","type":"@n8n/n8n-nodes-langchain.chainLlm","position":[820,0],"parameters":{"text":"=You are a YouTube SEO and copywriting expert.\n\nI will give you:\n- the current (old) video title,\n- the main keyword we want to rank for.\n\nYour job is to rewrite the title to:\n1. Be **more attention-grabbing** (clickable / curiosity-driven),\n2. Include the **given keyword naturally** (for SEO),\n3. Stay relevant to the original title's topic,\n5. Use power words, numbers, questions, or hooks where possible.\n\nOutput only 3 optimized YouTube titles. Number them. Do not add anything else.\n\nOld title: \"{{ $json.title }}\"\nKeyword: \"{{ $('Get row(s) in sheet').item.json.keyword }}\"\n\nVery important: Output only a **valid single-line JSON** with a key called `newTitle`. Do not use markdown, do not include explanations, lists, or comments.\n\nFormat example:\n{\"newTitle\": \"...\"}","batching":{},"messages":{"messageValues":[{"message":"Very important: Output only a **valid single-line JSON** with a key called `newTitle`. Do not use markdown, do not include explanations, lists, or comments.  Format example: {\"newTitle\": \"...\"}"}]},"promptType":"define"},"typeVersion":1.7,"alwaysOutputData":false},{"id":"f19b8383-9fe4-4ae2-9c66-5743f734d3b8","name":"New Description Generating","type":"@n8n/n8n-nodes-langchain.chainLlm","position":[820,160],"parameters":{"text":"=You are an expert in YouTube SEO and copywriting.\n\nYour task is to rewrite a YouTube video description using the following inputs:\n- The **original description**\n- The **main keyword** we want to rank for\n\nInstructions:\n1. Keep the original **timeline section** exactly as it is (do not change order or content).\n2. Improve the rest of the description to:\n   - Be more **engaging and persuasive** (increase watch time and clicks)\n   - Naturally include the **given keyword** for better SEO\n   - Encourage viewers to subscribe, comment, or check other content\n   - Use line breaks, emojis (optionally), and formatting for readability\n3. Output the final version as plain text. Do not explain anything.\n4. The new description should be max 1500 characters if possible.\n\n---\n\nOriginal description:\n\"\"\"\n{{ $json.description }}\n\"\"\"\n\nKeyword: \"{{ $('Get row(s) in sheet').item.json.keyword }}\"\n\n Return in this JSON format:\n{\n  \"newDescription\": \"...\"\n}","batching":{},"promptType":"define"},"typeVersion":1.7}],"active":false,"settings":{"executionOrder":"v1"},"versionId":"80a821b7-719c-4fc0-bed7-698c2f17dc5a","connections":{"Code":{"main":[[{"node":"New Title Generating","type":"main","index":0},{"node":"New Description Generating","type":"main","index":0},{"node":"Merge","type":"main","index":2}]]},"Code1":{"main":[[{"node":"Merge","type":"main","index":0}]]},"Code2":{"main":[[{"node":"Merge","type":"main","index":1}]]},"Merge":{"main":[[{"node":"Aggregate","type":"main","index":0}]]},"Aggregate":{"main":[[{"node":"Update row in sheet1","type":"main","index":0}]]},"HTTP Request":{"main":[[{"node":"Code","type":"main","index":0}]]},"DeepSeek Chat Model":{"ai_languageModel":[[{"node":"New Title Generating","type":"ai_languageModel","index":0},{"node":"New Description Generating","type":"ai_languageModel","index":0}]]},"Get row(s) in sheet":{"main":[[{"node":"HTTP Request","type":"main","index":0}]]},"New Title Generating":{"main":[[{"node":"Code1","type":"main","index":0}]]},"New Description Generating":{"main":[[{"node":"Code2","type":"main","index":0}]]},"When clicking ‘Execute workflow’":{"main":[[{"node":"Get row(s) in sheet","type":"main","index":0}]]}}}


name: Content Farming - : AI-Powered Blog Automation for WordPress
author_name: Jay Emp0
author_username: jay-emp0
categories: []
created_at: 2025-06-24T18:08:37.398Z
updated_at: 2025-06-24T18:08:37.398Z
url: https://n8n.io/workflows/5230
scraped_at: 2025-07-06 21:16:30
description:
  n8n Workflow: AI-Powered Blog Automation for WordPress

  This workflow automatically generates and publishes 10 blog posts per day to a WordPress site. It collects tech-related news articles, filters and analyzes them for relevance, expands them with research, generates SEO-optimized long-form articles using AI, creates a matching image using Leonardo AI, and publishes them via the WordPress REST API. Every step is tracked and stored in MongoDB for reference and performance tracking.

  You can see the demo results for the AI based articles here: Emp0 Articles

  How it works

  A scheduler runs daily to fetch the latest news from RSS feeds including BBC, TechCrunch, Wired, MIT Tech Review, HackerNoon, and others.
  The RSS data is normalized and filtered to include only articles published within the past 24 hours.
  Each article is passed through an OpenAI-powered classifier to check for relevance to predefined user topics like AI, robotics, or tech policy.
  Relevant articles are then aggregated, researched, and summarized with supporting sources and citations.
  An AI agent generates five long-tail SEO blog title ideas, ranks them by uniqueness and performance score, and selects the top one.
  A blog outline is created including H1 and H2 headers, keyword targeting, content structure, and featured snippet optimization.
  A full-length article (1000 to 1500 words) is generated based on the outline, with analogies, citations, examples, and keyword density maintained.
  SEO metadata is produced including meta title, description, image alt text, slug, and a readability audit.
  An AI-generated image is created based on the blog theme using Leonardo AI, enhanced for emotional storytelling and visual consistency.
  The blog article, metadata, and image are uploaded to WordPress as a draft, the image is attached, Yoast SEO metadata is set, and the article is published.

  All outputs including article versions, metadata, generation steps, and final blog URLs are stored in MongoDB to allow for future analytics and feedback.

  Requirements

  To run this project, you need accounts and API access for the following:

  | Tool         | Purpose                                                         | Notes                                                                 |
  |--------------|------------------------------------------------------------------|-----------------------------------------------------------------------|
  | OpenAI       | Used for blog classification, generation, summarization, SEO    | Around $0.20 per day, using GPT-4o-mini. Estimated monthly: $6       |
  | MongoDB      | Stores data flexibly including drafts, titles, metadata, logs   | Free tier on MongoDB Atlas offers 512 MB, enough for 64,000 articles |
  | Leonardo AI  | Generates featured images for blog articles                     | $9 for 3500 credits, $5 monthly top-up needed for 300 images          |
  | WordPress    | Final publishing platform via REST API                          | Hosted on Hostinger for $15/year including domain                     |

  Setup Instructions

  Import the provided JSON file into your n8n instance.
  Configure these credentials in n8n:
     OpenAI API key
     MongoDB Atlas connection string
     HTTP Header Auth for Leonardo AI
     WordPress REST API credentials
  Modify the classifier and prompt nodes to reflect your preferred content themes.
  Adjust scheduler nodes if you want to change post frequency or publishing times.
  Run the n8n instance continuously using Docker, PM2, or hosted automation platform.

  Cost Estimate

  | Component     | Daily Usage                  | Monthly Cost Estimate |
  |---------------|------------------------------|------------------------|
  | OpenAI        | 10 posts per day             | ~$6                   |
  | Leonardo AI   | 10 images per day (15 credits each) | ~$14 (9 base + 5 top-up) |
  | MongoDB       | Free up to 512 MB            | $0                    |
  | WordPress     | Hosting and domain           | ~$1.25                |
  | Total     |                              | ~$21/month        |

  Observations and Learnings

  This system can scale daily article publishing with zero manual effort. However, current limitations include inconsistent blog length and occasional coherence issues. To address this, I plan to build a feedback loop within the workflow:

  An SEO Commentator Agent will assess keyword strength, structure, and discoverability.
  An Editor-in-Chief Agent will review tone, clarity, and narrative structure.
  Both agents will loop back suggestions to the content generator, improving each draft until it meets human-level standards.

  The final goal is to consistently produce high-quality, readable, SEO-optimized content that is indistinguishable from human writing.

nodes_used:
  ["n8n-nodes-base.httpRequest","n8n-nodes-base.mongoDb","n8n-nodes-base.wordpress","n8n-nodes-base.code","n8n-nodes-base.html","@n8n/n8n-nodes-langchain.agent","@n8n/n8n-nodes-langchain.lmChatOpenAi","@n8n/n8n-nodes-langchain.outputParserStructured","@n8n/n8n-nodes-langchain.openAi","@n8n/n8n-nodes-langchain.textClassifier"]

workflow_json:
  {"meta":{"instanceId":"52254486b159b349334953c1738da94e90477c7604aa8db2062d11afc0120739","templateCredsSetupCompleted":true},"nodes":[{"id":"45b86db7-50e8-46b8-835b-2fb61709e362","name":"Split Out","type":"n8n-nodes-base.splitOut","position":[-360,-160],"parameters":{"options":{},"fieldToSplitOut":"rss"},"typeVersion":1},{"id":"ba641186-ea96-466d-ba5c-f98128a450e2","name":"Get Articles Daily","type":"n8n-nodes-base.scheduleTrigger","position":[-800,-160],"parameters":{"rule":{"interval":[{"triggerAtHour":12}]}},"typeVersion":1.2},{"id":"b4c98895-ef0e-4247-a08b-99b5bf069d1e","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-860,-320],"parameters":{"color":3,"width":2420,"height":820,"content":"## Step 1. Save news in a vector store (runs daily)"},"typeVersion":1},{"id":"ddc6261e-6d92-42ad-88d9-6ff2078943b2","name":"Set Tech News RSS Feeds","type":"n8n-nodes-base.set","position":[-580,-160],"parameters":{"options":{},"assignments":{"assignments":[{"id":"b8c00469-890b-4b5b-8e2e-2ad9ec2d0815","name":"rss","type":"array","value":"=[\n  \"https://feeds.bbci.co.uk/news/technology/rss.xml\",\n  \"https://www.wired.com/feed/rss\",\n  \"https://www.technologyreview.com/topnews.rss\",\n  \"https://techcrunch.com/feed/\",\n\"https://www.marktechpost.com/feed/\",\n\"https://hackernoon.com/feed\",\n\"https://www.artificialintelligence-news.com/feed/\"\n]\n"}]}},"typeVersion":3.4},{"id":"52605fe6-bd2a-41c3-a25f-f372701b28df","name":"Read RSS News Feeds","type":"n8n-nodes-base.rssFeedRead","position":[-140,-160],"parameters":{"url":"={{ $json.rss }}","options":{"ignoreSSL":false}},"typeVersion":1.1},{"id":"5758e689-58fe-407e-b3aa-dafe73176e78","name":"Set and Normalize Fields","type":"n8n-nodes-base.set","position":[220,-160],"parameters":{"options":{},"assignments":{"assignments":[{"id":"e9f27ceb-c5f2-4997-8cb1-67576a7bb337","name":"title","type":"string","value":"={{ $json.title }}"},{"id":"4c4f9417-40f2-4fb0-9976-d09f5984680f","name":"content","type":"string","value":"={{ $json['content:encodedSnippet'] ?? $json.contentSnippet}}"},{"id":"e1986bac-054e-4240-ba50-536dbcd27337","name":"date","type":"string","value":"={{ $json.isoDate}}"},{"id":"9566e23c-ac30-4d66-abbd-889f322688b7","name":"link","type":"string","value":"={{ $json.link }}"},{"id":"61203b8d-7198-4087-83dc-83ac83afa5b1","name":"categories","type":"string","value":"={{ $json.categories }}"}]}},"typeVersion":3.4},{"id":"c88f982d-8ee5-4ef5-bbdc-387e33d4d5d7","name":"OpenAI Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[400,40],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4o-mini"},"options":{}},"credentials":{"openAiApi":{"id":"k5QLUV8boAepwce0","name":"OpenAi account - jharilela@gmail.com - default project"}},"typeVersion":1.2},{"id":"c34832be-0561-485b-92f5-68c05b9b77ce","name":"Text Classifier","type":"@n8n/n8n-nodes-langchain.textClassifier","position":[460,-160],"parameters":{"options":{"fallback":"discard"},"inputText":"=Title: {{ $json.title }}\nContent: {{ $json.content }}\nCategories: {{ $json.categories }}","categories":{"categories":[{"category":"=AI","description":"AI and Artificial Intelligence related articles "}]}},"typeVersion":1},{"id":"89c58644-23dc-473c-b5c3-17e46642ce93","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[1700,-340],"parameters":{"color":5,"width":1140,"height":800,"content":"## Step 2: Relevance scoring\n\nConsider improving this by using\n- [serp api](https://serpapi.com/dashboard)\n- [jina ai](https://jina.ai/api-dashboard/reader)\n- [perplexity ai](https://www.perplexity.ai/)\n- [open ai web search](https://www.youtube.com/watch?v=eeuLRpvQ3DY)"},"typeVersion":1},{"id":"93339b1d-6ff3-4868-be68-9ccaacc0bfc5","name":"AI Agent","type":"@n8n/n8n-nodes-langchain.agent","position":[1900,-100],"parameters":{"text":"=Here are 24 trending AI-related articles published today:\n\n {{ JSON.stringify($json.data) }}\n\nFrom this, generate:\n1. 10 unique long-tail blog title ideas based on these trends\n2. For each title, suggest:\n   - Main keyword\n   - Related keywords\n   - Suggested angle or tone (e.g. educational, provocative, analytical)\n3. Ensure each title is SEO-friendly, non-generic, and future-resilient\n","options":{"systemMessage":"You are a content strategist for an AI-focused blog.\n"},"promptType":"define","hasOutputParser":true},"retryOnFail":true,"typeVersion":2},{"id":"118aee64-ac8f-40d5-a0c1-44b9713cbce0","name":"OpenAI Chat Model1","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[1800,120],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4o-mini"},"options":{}},"credentials":{"openAiApi":{"id":"k5QLUV8boAepwce0","name":"OpenAi account - jharilela@gmail.com - default project"}},"typeVersion":1.2},{"id":"b9ce417b-1e12-4385-8559-577b636337be","name":"Aggregate","type":"n8n-nodes-base.aggregate","position":[1720,-100],"parameters":{"options":{},"aggregate":"aggregateAllItemData"},"typeVersion":1},{"id":"6f29f470-d74e-4bba-91b0-ba6f1e34bfcf","name":"Structured Output Parser","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[2160,100],"parameters":{"jsonSchemaExample":"[\n  {\n  \"title\": \"Why Code Review AI Like CriticGPT Might Replace Juniors\",\n  \"main_keyword\": \"AI code review\",\n  \"related_keywords\": [\"CriticGPT\", \"OpenAI\", \"developer tools\", \"LLM code agent\"],\n  \"tone\": \"analytical\",\n  \"link_articles\": [\"https://www.hatica.io/blog/future-of-code-reviews-2025-trends/\", \"https://graphite.dev/blog/ai-wont-replace-human-code-review\", \"https://medium.com/@ravibiswas0909/can-ai-replace-junior-developers-my-honest-take-861c7d430ce7\"],\n  \"date\": \"2025-06-16\"\n},{\n  \"title\": \"Huawei AI chips that power BYD and self driving cars in china\",\n  \"main_keyword\": \"AI chips\",\n  \"related_keywords\": [\"Huawei\", \"AI\", \"self driving cars\", \"BYD\"],\n  \"tone\": \"skeptical\",\n  \"link_articles\": [\"https://technode.com/2025/03/11/chinas-gac-to-sell-level-3-autonomous-driving-vehicles-with-huawei/\", \"https://www.reuters.com/business/autos-transportation/chinas-byd-use-huaweis-advanced-autonomous-driving-system-off-road-evs-2024-08-27/\", \"https://schen583.medium.com/huawei-intelligent-driving-solutions-overview-a-16-billion-valued-automotive-tier-1-f88f4bdfdff9\"],\n  \"date\": \"2025-06-16\"\n}\n]\n"},"typeVersion":1.2},{"id":"9ba4a367-e0b1-450d-971b-7892201ff530","name":"Filter","type":"n8n-nodes-base.filter","position":[40,-160],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"dda47c0b-b0b2-46f0-a469-cd1b0e1b8152","operator":{"type":"dateTime","operation":"after"},"leftValue":"={{ $json.isoDate }}","rightValue":"={{ $now.minus(1,\"days\") }}"}]}},"typeVersion":2.2},{"id":"918ea92f-6a19-4fb7-a896-3911a24cb306","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-1940,-320],"parameters":{"color":7,"width":1020,"height":1360,"content":"## Steps\n1. RSS Feed Ingestion (Daily Trigger)\n[x] Fetch latest articles from curated AI RSS feeds:\n[x] OpenAI, Meta AI, DeepMind, arXiv AI, HuggingFace, TechCrunch AI, VentureBeat AI, etc.\n[x] Deduplicate and store links + metadata (title, date, summary)\n\n2. Relevance Filtering\n[x] Filter for articles:\n[x] Published within last 24 hours\n[x] Containing key topics: model releases, tool updates, research, AI regulation, etc.\n[x] Score relevance using: Keyword match, Named entity recognition, Popularity heuristics (retweet count, domain authority, etc.)\n\n3. Content Summarization\n[x] Summarize 2–3 selected articles using extractive + abstractive methods\nExtract:\n[x] Key ideas\n[x] Notable names (models, companies, researchers)\n[x] Quotes or stats\n\n4. Long-Tail Angle Generation\nConvert short-tail news into long-tail evergreen angles: E.g. “OpenAI launches CriticGPT” → “Why AI Code Review Will Replace Junior Engineers”\nUse prompt chaining:\n[x] Step 1: extract the core topic\n[x] Step 2: generate 5 long-tail blog titles with intent match (e.g., 'how', 'why', 'what's next')\n[x] Step 3: score titles based on uniqueness + search intent\n\n5. SEO-Driven Outline Creation\nGenerate outline optimized for:\n[x] H1 + H2 structure\n[x] Natural keyword inclusion\n[x] Featured snippet targeting\n[x] Structure: Intro → Background → Trend → Insight → Forecast → CTA\n\n6. Full-Length Blog Drafting\n[x] Draft 1,000–1,500 word blog using outline\nInclude:\n[x] Citations from original articles\n[x] External links for trust\n[x] Analogies, examples, future implications\n[x] Maintain tone: informative, thought-leader, semi-technical\n\n7. SEO Enrichment\nGenerate:\n[x] Meta title (60 chars)\n[x] Meta description (160 chars)\n[x] Alt text for images\n[x] Slug URL with keyword\n[x] Auto-check for keyword density, passive voice, Flesch score\n\n8. Image Generation (Optional)\n[x] Create featured image using AI (e.g., DALL·E)\n\n9. Export & Publish\n[x] Export article in Markdown or HTML\n[x] Push to CMS (e.g., WordPress REST API)\n[x] publish immediately\n[ ] schedule\n\n10. Logging & Feedback Loop\n[x] Log:\n- Source articles\n- Generated title\n- Keywords used\n- Post URL\n- Store in database for:\n- Deduplication\n- Trend tracking\n- Traffic correlation\n[ ] Feedback loop:\n\n\n"},"typeVersion":1},{"id":"d7468098-66f8-47bf-8699-abf78eb06a13","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-860,580],"parameters":{"color":4,"width":2400,"height":800,"content":"## Step 3: Research the news articles\n**Double click** to edit me. [Guide](https://docs.n8n.io/workflows/sticky-notes/)"},"typeVersion":1},{"id":"3eee8f2b-8c60-47f2-a1fa-e612e65ca131","name":"HTTP Request","type":"n8n-nodes-base.httpRequest","position":[180,980],"parameters":{"url":"={{ $json[\"link_articles\"] }}","options":{}},"typeVersion":4.2},{"id":"d75cb082-27f0-4201-b220-c6da5ff50c37","name":"HTML","type":"n8n-nodes-base.html","position":[360,980],"parameters":{"options":{},"operation":"extractHtmlContent","extractionValues":{"values":[{"key":"body","cssSelector":"body","skipSelectors":"img"}]}},"typeVersion":1.2},{"id":"a8039220-b7ec-4952-b33b-c3198cc8c4fd","name":"OpenAI Chat Model2","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[740,1180],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4o-mini"},"options":{}},"credentials":{"openAiApi":{"id":"k5QLUV8boAepwce0","name":"OpenAi account - jharilela@gmail.com - default project"}},"typeVersion":1.2},{"id":"69785989-babd-4c85-9112-36261a5099c0","name":"AI Agent1","type":"@n8n/n8n-nodes-langchain.agent","position":[800,980],"parameters":{"text":"=Below is an article. Extract the 3 most important sentences that summarize the factual content. Do not interpret. Only copy exact sentences.\n\nUse that to extract and list:\n1. write a 2-paragraph summary of the article in your own words.\n2. Key concepts or ideas\n3. Names of companies, models, or researchers\n4. Any quoted statements or numerical/statistical claims\n\nHere is the article:\n {{ $json.data }}","options":{},"promptType":"define","hasOutputParser":true},"typeVersion":2},{"id":"418c402c-5467-4dda-9a25-796384c3bce0","name":"Structured Output Parser1","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[1020,1180],"parameters":{"jsonSchemaExample":"{\n  \"abstract_summary\": \"...\",\n  \"ideas\": [\"...\"],\n  \"names\": [\"OpenAI\", \"CriticGPT\"],\n  \"quotes_or_stats\": [\"'70% faster than human review'\", \"CriticGPT released in June 2025\"]\n}\n"},"typeVersion":1.2},{"id":"827e24bd-e62a-41a9-a48b-7a4423270d5e","name":"Aggregate1","type":"n8n-nodes-base.aggregate","position":[200,780],"parameters":{"options":{},"aggregate":"aggregateAllItemData","destinationFieldName":"articles"},"typeVersion":1},{"id":"e0d1c4a3-cdce-4684-b6dc-83a10fc49977","name":"AI Agent2","type":"@n8n/n8n-nodes-langchain.agent","notes":"generate blog title ideas","position":[-400,1640],"parameters":{"text":"=You are a viral blog strategist. Given the following blog article concept: {{ JSON.stringify($json) }}\n\nGenerate 5 compelling blog post titles that:\n- Evoke curiosity or urgency\n- Include emotional or controversial angles\n- Use long-tail keywords for SEO\n- Are clear, specific, and make the reader want to click\n- Follow formats like:\n  - “Why [X] Is About to Change Everything in [Y]”\n  - “The Hidden Truth About [Topic]”\n  - “How [Persona] Are Using [X] to [Y]”\n  - “What No One Tells You About [Topic]”\n  - “X Predictions About the Future of [Topic] That’ll Shock You”\n\nEnd your response with:  \n**Core Topic:** [a single phrase summarizing the article idea]\n","options":{},"promptType":"define","hasOutputParser":true},"notesInFlow":true,"typeVersion":2},{"id":"becfb981-a620-463b-9053-4e97ab7822b9","name":"OpenAI Chat Model3","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[-380,1860],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4o-mini"},"options":{}},"credentials":{"openAiApi":{"id":"k5QLUV8boAepwce0","name":"OpenAi account - jharilela@gmail.com - default project"}},"typeVersion":1.2},{"id":"a578c715-df33-42bf-af9f-4d441d750e28","name":"Structured Output Parser2","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[-260,1860],"parameters":{"jsonSchemaExample":"{\n  \"titles\": [\n    \"Why AI Code Review Will Replace Junior Engineers\",\n    \"How AI is Reshaping Software QA in 2025\",\n    \"What CriticGPT Means for Developer Workflows\",\n    \"The Future of Code Reviews: AI vs Human Engineers\",\n    \"5 Benefits of Using AI for Code Quality Control\"\n  ],\n  \"core_topic\" : \"AI software engineers\"\n}"},"typeVersion":1.2},{"id":"857ef5d7-768a-471c-ba86-1d08212fae1b","name":"Split Out2","type":"n8n-nodes-base.splitOut","position":[2280,-100],"parameters":{"options":{},"fieldToSplitOut":"output"},"typeVersion":1},{"id":"378ff680-dcd6-48c5-b142-e36768ddb153","name":"Split Out1","type":"n8n-nodes-base.splitOut","position":[-440,860],"parameters":{"include":"allOtherFields","options":{},"fieldToSplitOut":"link_articles"},"typeVersion":1},{"id":"c2520709-9364-48c1-8ef8-03be04802c98","name":"MongoDB","type":"n8n-nodes-base.mongoDb","position":[2680,-100],"parameters":{"fields":"=title,main_keyword,related_keywords,tone,completed_step,link_articles","options":{"dateFields":"date"},"operation":"insert","collection":"blog"},"credentials":{"mongoDb":{"id":"TwJB8fMcekPw13qA","name":"MongoDB account - jharilela@gmail.com"}},"typeVersion":1.2},{"id":"a52fcd08-93ad-49f9-a4f1-a8c1ddafa9f3","name":"MongoDB1","type":"n8n-nodes-base.mongoDb","position":[-620,860],"parameters":{"query":"{\"completed_step\":2}","options":{"limit":1},"collection":"blog"},"credentials":{"mongoDb":{"id":"TwJB8fMcekPw13qA","name":"MongoDB account - jharilela@gmail.com"}},"typeVersion":1.2},{"id":"52fe3080-a279-42ae-a56d-af0e2491f948","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-840,1480],"parameters":{"color":6,"width":3880,"height":800,"content":"## Step 4,5,6,7: Write the article and prepare SEO\n**Double click** to edit me. [Guide](https://docs.n8n.io/workflows/sticky-notes/)"},"typeVersion":1},{"id":"8df64bb2-6bc8-4c46-9223-2fb2c2682764","name":"MongoDB3","type":"n8n-nodes-base.mongoDb","position":[-580,1640],"parameters":{"query":"{\"completed_step\":3}","options":{"limit":1},"collection":"blog"},"credentials":{"mongoDb":{"id":"TwJB8fMcekPw13qA","name":"MongoDB account - jharilela@gmail.com"}},"typeVersion":1.2},{"id":"118ab8a8-4047-4da5-8723-f13c38becd2d","name":"MongoDB4","type":"n8n-nodes-base.mongoDb","position":[1280,1640],"parameters":{"fields":"blog_outline, completed_step","options":{},"operation":"update","updateKey":"_id","collection":"blog"},"credentials":{"mongoDb":{"id":"TwJB8fMcekPw13qA","name":"MongoDB account - jharilela@gmail.com"}},"typeVersion":1.2},{"id":"5d4b8a5b-3e3f-4cf7-a813-5ae6417c34f1","name":"AI Agent3","type":"@n8n/n8n-nodes-langchain.agent","notes":"rate blog title ideas","position":[-60,1640],"parameters":{"text":"=Rate the following blog titles based on the **core topic**. Score each title out of 10 in:\n1. Uniqueness\n2. SEO keyword clarity\n3. Emotional and curiosity-driven clickbait quality\n\nTitles: {{ JSON.stringify($json.output.titles) }}\nCore Topic: {{ JSON.stringify($json.output.core_topic) }}\n\nReturn a ranked list with justifications for each score. Highlight the best one.\n","options":{},"promptType":"define","hasOutputParser":true},"notesInFlow":true,"typeVersion":2},{"id":"0de5e677-eb04-4c2f-90df-f3637a244877","name":"OpenAI Chat Model4","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[-20,1860],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4o-mini"},"options":{}},"credentials":{"openAiApi":{"id":"k5QLUV8boAepwce0","name":"OpenAi account - jharilela@gmail.com - default project"}},"typeVersion":1.2},{"id":"eb6fe9ab-9a3a-4641-a0ac-6c3990c70e74","name":"Structured Output Parser3","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[80,1860],"parameters":{"jsonSchemaExample":"[\n  {\n    \"title\": \"Why AI Code Review Will Replace Junior Engineers\",\n    \"uniqueness_score\": 8,\n    \"seo_score\": 7,\n    \"longtail_score\": 9,\n    \"reason\": \"Strong intent signal ('why'), specific audience reference ('junior engineers'), but replacement framing may be oversimplified.\"\n  },\n  {\n    \"title\": \"How AI is Reshaping Software QA in 2025\",\n    \"uniqueness_score\": 6,\n    \"seo_score\": 9,\n    \"longtail_score\": 8,\n    \"reason\": \"Good long-tail and temporal relevance, but the 'reshaping' verb is generic and the angle lacks a unique hook.\"\n  },\n  {\n    \"title\": \"What CriticGPT Means for Developer Workflows\",\n    \"uniqueness_score\": 5,\n    \"seo_score\": 6,\n    \"longtail_score\": 6,\n    \"reason\": \"Moderately informative but lacks specificity, and may be too short-tail. Could benefit from clearer impact framing.\"\n  },\n  {\n    \"title\": \"The Future of Code Reviews: AI vs Human Engineers\",\n    \"uniqueness_score\": 7,\n    \"seo_score\": 8,\n    \"longtail_score\": 9,\n    \"reason\": \"Decent contrast-based framing. 'Future of' titles have strong SEO pull, but risk becoming overused.\"\n  },\n  {\n    \"title\": \"5 Benefits of Using AI for Code Quality Control\",\n    \"uniqueness_score\": 6,\n    \"seo_score\": 10,\n    \"longtail_score\": 8,\n    \"reason\": \"Clear list format, strong SEO structure, but uses a very common benefits-based formula with a broad target.\"\n  }\n]\n"},"typeVersion":1.2},{"id":"f94e8254-62ad-490a-924e-036ed971c2ba","name":"Code3","type":"n8n-nodes-base.code","notes":"rank and choose the best one","position":[1140,1640],"parameters":{"jsCode":"let outline = $input.first().json.output[0].outline || '';\n\n// Step 1: Remove ```markdown and ``` fences\noutline = outline\n  .replace(/```markdown\\n?/g, '')   // remove opening ```markdown\n  .replace(/```/g, '')              // remove closing ```\n  .trim();\n\n// Step 2: Escape backslashes and double quotes\noutline = outline\n  .replace(/\\\\/g, '\\\\\\\\')           // escape backslashes\n  .replace(/\"/g, '\\\\\"');            // escape double quotes\n\nreturn {\n    _id : $('Code7').first().json._id,\n    blog_outline: outline,\n    completed_step : 5\n  }\n"},"notesInFlow":true,"typeVersion":2},{"id":"7ede969a-a684-4a59-89f6-7f95dc05a442","name":"Code4","type":"n8n-nodes-base.code","position":[380,780],"parameters":{"jsCode":"function escapeQuotes(str) {\n  if (typeof str !== 'string') return str;\n  return str.replace(/\"/g, \"'\");\n}\n\nconst articles = $input.first().json.articles.map(article => {\n  const sanitized = {};\n\n  // Loop through keys and escape problematic strings\n  for (const [key, value] of Object.entries(article)) {\n    if (Array.isArray(value)) {\n      sanitized[key] = value.map(v => escapeQuotes(v));\n    } else if (typeof value === 'string') {\n      sanitized[key] = escapeQuotes(value);\n    } else {\n      sanitized[key] = value;\n    }\n  }\n\n  return sanitized;\n});\n\nconst item_id = $('MongoDB1').first().json._id\n\nreturn {\n    _id: item_id,\n    articles: articles,\n    completed_step: 3\n  }\n"},"typeVersion":2},{"id":"c8462857-7249-4878-b024-4ab90c53a9ef","name":"MongoDB2","type":"n8n-nodes-base.mongoDb","position":[560,780],"parameters":{"fields":"articles, completed_step","options":{},"operation":"update","updateKey":"_id","collection":"blog"},"credentials":{"mongoDb":{"id":"TwJB8fMcekPw13qA","name":"MongoDB account - jharilela@gmail.com"}},"typeVersion":1.2,"alwaysOutputData":true},{"id":"02db3b5e-6ebc-47ce-91d4-b0120e62888f","name":"AI Agent5","type":"@n8n/n8n-nodes-langchain.agent","notes":"generate blog outline markdown","position":[800,1640],"parameters":{"text":"=You are an SEO blog strategist.\n\nGiven:\n- Title: {{ $('MongoDB3').item.json.blog_title }}\n- Main keyword: {{ $('MongoDB3').item.json.main_keyword }}\n- Related keywords: {{ JSON.stringify($('MongoDB3').item.json.related_keywords) }}\n- Related articles: {{ JSON.stringify($('MongoDB3').item.json.articles) }}\n\nGenerate a detailed outline for a blog post that:\n- Uses a strong **H1** as the main title\n- Includes **H2 subheadings** for each major section\n- Naturally incorporates the main keyword and related keywords\n- Follows this structure:\n  1. Intro\n  2. Background\n  3. Trend\n  4. Insight\n  5. Forecast\n  6. CTA\n- Is optimized for **featured snippet** inclusion on Google\n\nRespond in Markdown format. Include H1 and H2 tags.\n","options":{},"promptType":"define","hasOutputParser":true},"notesInFlow":true,"typeVersion":2},{"id":"106cb1f4-c0e0-4bb6-baf4-e73128beff58","name":"OpenAI Chat Model6","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[800,1860],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4o-mini"},"options":{}},"credentials":{"openAiApi":{"id":"k5QLUV8boAepwce0","name":"OpenAi account - jharilela@gmail.com - default project"}},"typeVersion":1.2},{"id":"404b3108-fd22-48dc-ad0c-cc96fdef6c6d","name":"Code7","type":"n8n-nodes-base.code","notes":"rank and choose the best one","position":[300,1640],"parameters":{"jsCode":"const input = $('AI Agent3').first().json.output;\n\n// Add average_score to each item\nfor (const item of input) {\n  item.average_score = (\n    (item.uniqueness_score || 0) +\n    (item.seo_score || 0) +\n    (item.longtail_score || 0)\n  ) / 3;\n}\n\n// Sort by average_score descending\ninput.sort((a, b) => b.average_score - a.average_score);\n\n// Return full sorted list + top blog title\nreturn {\n    blog_title_ideas: input,\n    blog_title: input[0].title,\n    core_topic: $('AI Agent2').first().json.output.core_topic , \n    _id: $('MongoDB3').first().json._id,\n    completed_step : 4\n  }\n"},"notesInFlow":true,"typeVersion":2},{"id":"d690e954-bd1d-4e66-aca6-852a8054208e","name":"MongoDB7","type":"n8n-nodes-base.mongoDb","position":[440,1640],"parameters":{"fields":"blog_title, blog_title_ideas, core_topic, completed_step","options":{},"operation":"update","updateKey":"_id","collection":"blog"},"credentials":{"mongoDb":{"id":"TwJB8fMcekPw13qA","name":"MongoDB account - jharilela@gmail.com"}},"typeVersion":1.2},{"id":"fddb3ed6-d327-45c7-b2bf-4ad22a2cb818","name":"AI Agent6","type":"@n8n/n8n-nodes-langchain.agent","notes":"create blog content","position":[1420,1640],"parameters":{"text":"=Use this information:\n\n- **Title**: {{ $('MongoDB3').item.json.blog_title }}\n- **Main Keyword**: {{ $('MongoDB3').item.json.main_keyword }}\n- **Related Keywords**: {{ JSON.stringify($('MongoDB3').item.json.related_keywords) }}\n- **Tone**: {{ $('MongoDB3').item.json.tone }}\n- **Outline**: {{ $('Code3').item.json.blog_outline }}\n- **Related Articles**: {{ JSON.stringify($('MongoDB3').item.json.articles) }}\n- **Citations**: {{ JSON.stringify($('MongoDB3').item.json.link_articles) }}\n\nInstructions:\n\n1. Write approximately 300 to 500 words per section outline\n2. Naturally include the main and related keywords.\n3. Incorporate:\n   - At least 2 **citations** (link to or mention source_articles)\n   - 1 analogy or example for clarity\n   - Future implications or forecasts\n4. Maintain the tone: {{ $('MongoDB3').item.json.tone }}\n5. Write in Markdown format with:\n   - `#` for H1\n   - `##` for H2\n   - bullet points, bold text, or italics where needed\n\nRespond with the full blog article only.\n","options":{"systemMessage":"You are a professional blog writer for a leading AI publication.\n\nYour job is to write a complete, well-structured, SEO-friendly blog post."},"promptType":"define","hasOutputParser":true},"notesInFlow":true,"typeVersion":2},{"id":"520787ba-fe10-416d-846e-a63b588f52c2","name":"OpenAI Chat Model7","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[1360,1860],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4o","cachedResultName":"gpt-4o"},"options":{}},"credentials":{"openAiApi":{"id":"k5QLUV8boAepwce0","name":"OpenAi account - jharilela@gmail.com - default project"}},"typeVersion":1.2},{"id":"a41dbfe7-49a7-4b30-aa37-368d16d01b43","name":"MongoDB5","type":"n8n-nodes-base.mongoDb","position":[1980,1640],"parameters":{"fields":"blog_article, completed_step","options":{},"operation":"update","updateKey":"_id","collection":"blog"},"credentials":{"mongoDb":{"id":"TwJB8fMcekPw13qA","name":"MongoDB account - jharilela@gmail.com"}},"typeVersion":1.2},{"id":"e8cb6a64-a778-4129-a74e-cfe8c4c00080","name":"Code5","type":"n8n-nodes-base.code","notes":"rank and choose the best one","position":[1800,1640],"parameters":{"jsCode":"let blog_article = $('AI Agent6').first().json.output\nblog_article = blog_article\n  .replace(/```markdown\\n?/g, '')   // remove opening ```markdown\n  .replace(/```/g, '')              // remove closing ```\n  .trim();\n\n// Step 2: Escape backslashes and double quotes\nblog_article = blog_article\n  .replace(/\\\\/g, '\\\\\\\\')           // escape backslashes\n  .replace(/\"/g, '\\\\\"');        \n\nreturn {\n    _id : $('Code7').first().json._id,\n    blog_article: blog_article,\n    completed_step : 6\n  }\n"},"notesInFlow":true,"typeVersion":2},{"id":"ca4193e1-d31a-4d6d-a059-5b6ce3a2b318","name":"Code","type":"n8n-nodes-base.code","position":[2500,-100],"parameters":{"mode":"runOnceForEachItem","jsCode":"return {\n  ...$input.item.json,\n  completed_step: 2\n}"},"typeVersion":2},{"id":"8a55bbcc-9562-4334-9da7-ffefbd161091","name":"AI Agent7","type":"@n8n/n8n-nodes-langchain.agent","notes":"generate meta data","position":[2160,1640],"parameters":{"text":"=Based on the blog article below, generate:\n1. A **meta title** (max 60 characters)\n2. A **meta description** (max 160 characters)\n3. An **image alt text** for the featured image\n4. A **URL slug** based on the blog title and keyword\n5. A basic SEO report:\n   - Keyword density for the main keyword\n   - Count of passive voice sentences\n   - Estimated Flesch reading score (0–100 scale)\n\nData:\n- Title: {{ $('MongoDB3').item.json.blog_title }}\n- Main Keyword: {{ $('MongoDB3').item.json.main_keyword }}\n- Related Keywords: {{ JSON.stringify($('MongoDB3').item.json.related_keywords) }}\n- Content: {{ $json.blog_article }}\n","options":{"systemMessage":"You are an SEO expert."},"promptType":"define","hasOutputParser":true},"notesInFlow":true,"typeVersion":2},{"id":"65d65285-f403-4332-9f6e-e70dcca6eb13","name":"OpenAI Chat Model8","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[2100,1860],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4o-mini"},"options":{}},"credentials":{"openAiApi":{"id":"k5QLUV8boAepwce0","name":"OpenAi account - jharilela@gmail.com - default project"}},"typeVersion":1.2},{"id":"ba552978-35a5-48e2-bfbe-6fccf69d03a3","name":"MongoDB6","type":"n8n-nodes-base.mongoDb","position":[2700,1640],"parameters":{"fields":"=completed_step,meta_title,meta_description,image_alt_text, slug, seo_report","options":{},"operation":"update","updateKey":"_id","collection":"blog"},"credentials":{"mongoDb":{"id":"TwJB8fMcekPw13qA","name":"MongoDB account - jharilela@gmail.com"}},"typeVersion":1.2},{"id":"334c62b5-15b8-442c-9978-d94d90ee3926","name":"Code6","type":"n8n-nodes-base.code","notes":"rank and choose the best one","position":[2540,1640],"parameters":{"jsCode":"return {\n    _id : $('Code7').first().json._id,\n    ...$input.first().json.output,\n    completed_step : 7\n  }\n"},"notesInFlow":true,"typeVersion":2},{"id":"12045d2a-a760-445b-bdbb-c7dd814e886f","name":"Structured Output Parser4","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[2380,1840],"parameters":{"jsonSchemaExample":"{\n  \"meta_title\": \"Why AI Code Review Tools Matter\",\n  \"meta_description\": \"Explore how AI is reshaping code reviews and what it means for developers.\",\n  \"image_alt_text\": \"AI reviewing code on a laptop screen\",\n  \"slug\": \"ai-code-review-tools\",\n  \"seo_report\": {\n    \"keyword_density\": \"2.8%\",\n    \"passive_voice_count\": 4,\n    \"flesch_score\": 62.5\n  }\n}"},"typeVersion":1.2},{"id":"abcd3bc8-6983-424b-9378-3db2be76e3a9","name":"MongoDB8","type":"n8n-nodes-base.mongoDb","position":[-520,2420],"parameters":{"query":"{\"completed_step\":7}","options":{"limit":1},"collection":"blog"},"credentials":{"mongoDb":{"id":"TwJB8fMcekPw13qA","name":"MongoDB account - jharilela@gmail.com"}},"typeVersion":1.2},{"id":"90e042a5-fd2d-4738-a0cd-c11128dd54f6","name":"OpenAI","type":"@n8n/n8n-nodes-langchain.openAi","position":[60,2640],"parameters":{"prompt":"={{ $('MongoDB8').item.json.image_alt_text }}","options":{"size":"1792x1024"},"resource":"image"},"credentials":{"openAiApi":{"id":"k5QLUV8boAepwce0","name":"OpenAi account - jharilela@gmail.com - default project"}},"typeVersion":1.8},{"id":"1d34c2fc-dc4a-4616-9651-22a920fc8ce7","name":"AI Agent4","type":"@n8n/n8n-nodes-langchain.agent","notes":"rate blog title ideas","position":[-280,2640],"parameters":{"text":"=Use the blog title, main keyword, and image alt text to craft a image generation prompt that captures a human-centered, emotionally compelling moment related to the image alt text.\n\nImagine a scene that tells a story or captures a pivotal feeling — something symbolic, cinematic, and relatable. Think in terms of real-world settings, natural environments, recognizable objects, or subtle interactions that represent change, tension, or hope. Let the visual convey meaning without relying on text or overt symbols.\n\nAvoid abstract visualizations like circuits, networks, floating data, or robotic aesthetics. Instead, evoke emotion and narrative through setting, lighting, perspective, and atmosphere. Let the image feel like a glimpse into a personal story, a lived moment, or a metaphor unfolding.\n\nDo not include any text or words in the image.\n\nRespond only with the image generation rompt.\n\nBlog Titile: {{ $json.blog_title }}\nMain Keyword: {{ $json.main_keyword }}\nImage Alt Text: {{ $json.image_alt_text }}","options":{"systemMessage":"You are a creative visual expert in marketing and digital design. Your job is to craft emotionally compelling image prompts that generate click bait images for social media posts\n"},"promptType":"define","hasOutputParser":true},"notesInFlow":true,"typeVersion":2},{"id":"e1573b88-90fd-425a-93a5-5f6f71e90ded","name":"OpenAI Chat Model5","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[-280,2860],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4o-mini"},"options":{}},"credentials":{"openAiApi":{"id":"k5QLUV8boAepwce0","name":"OpenAi account - jharilela@gmail.com - default project"}},"typeVersion":1.2},{"id":"046d025b-01a8-4a29-9373-47bd051a70ef","name":"Structured Output Parser5","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[-120,2860],"parameters":{"jsonSchemaExample":"{\n\t\"prompt\": \"Create a visually striking digital banner for a blog article titled 'Exploring the Future of Generative Models Through Latent Space Interpolation.' The banner should feature a vibrant and abstract representation of a 'latent space,' showcasing smooth, flowing transitions between diverse data point visuals like images, sounds, and patterns. Incorporate elements symbolizing generative models such as neural networks, GANs, and VAEs. Use a color palette that blends futuristic blues, purples, and tech-inspired gradients\"\n}"},"typeVersion":1.3},{"id":"fae23884-28f9-454d-a9a0-78efe85d2f24","name":"Wordpress1","type":"n8n-nodes-base.wordpress","position":[1580,2420],"parameters":{"title":"={{ $('MongoDB8').first().json.blog_title }}","additionalFields":{"slug":"={{ $('MongoDB8').first().json.slug }}","status":"draft","sticky":false,"content":"={{ $json.blog_html }}","authorId":3,"categories":[8],"postTemplate":{"values":{}},"commentStatus":"closed"}},"credentials":{"wordpressApi":{"id":"G1G8jDdEoWAVytQb","name":"Wordpress  - anya@emp0.com"}},"typeVersion":1},{"id":"51780c90-ac3f-4960-a5d1-fb038119ec43","name":"Set Image","type":"n8n-nodes-base.httpRequest","position":[1760,2420],"parameters":{"url":"=https://articles.emp0.com/wp-json/wp/v2/posts/{{ $('Wordpress1').item.json.id }}","method":"POST","options":{},"sendQuery":true,"authentication":"predefinedCredentialType","queryParameters":{"parameters":[{"name":"featured_media","value":"={{ $('Upload image2').item.json.id }}"}]},"nodeCredentialType":"wordpressApi"},"credentials":{"wordpressApi":{"id":"G1G8jDdEoWAVytQb","name":"Wordpress  - anya@emp0.com"}},"typeVersion":4.2},{"id":"d53f2502-4c15-45c3-a085-5c5d28cea827","name":"Upload image2","type":"n8n-nodes-base.httpRequest","position":[860,2420],"parameters":{"url":"https://articles.emp0.com/wp-json/wp/v2/media","method":"POST","options":{},"sendBody":true,"contentType":"binaryData","sendHeaders":true,"authentication":"predefinedCredentialType","headerParameters":{"parameters":[{"name":"Content-Disposition","value":"=attachment; filename=\"img-{{ $('MongoDB8').item.json.slug }}.jpg\""}]},"inputDataFieldName":"data","nodeCredentialType":"wordpressApi"},"credentials":{"wordpressApi":{"id":"G1G8jDdEoWAVytQb","name":"Wordpress  - anya@emp0.com"}},"retryOnFail":true,"typeVersion":4.2,"waitBetweenTries":5000},{"id":"a37a09bb-f82d-462d-9e67-ee180097429b","name":"Set metatag1","type":"n8n-nodes-base.httpRequest","position":[1940,2420],"parameters":{"url":"=https://articles.emp0.com/wp-json/wp/v2/posts/{{ $('Wordpress1').item.json.id }}","method":"PUT","options":{},"jsonBody":"={\n  \"meta\":{\n    \"_yoast_wpseo_title\":\"{{ $('MongoDB8').item.json.meta_title }}\",\n    \"_yoast_wpseo_metadesc\":\"{{ $('MongoDB8').item.json.meta_description }}\"\n  }\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","authentication":"predefinedCredentialType","headerParameters":{"parameters":[{"name":"Content-Type","value":"application/json"}]},"nodeCredentialType":"wordpressApi"},"credentials":{"wordpressApi":{"id":"G1G8jDdEoWAVytQb","name":"Wordpress  - anya@emp0.com"}},"typeVersion":4.2},{"id":"9363f64c-6494-419e-bc84-166f2013fc3c","name":"Code12","type":"n8n-nodes-base.code","position":[1040,2420],"parameters":{"jsCode":"return { \n  \"_id\" : $('MongoDB8').first().json._id,\n  \"blog_image_url\": $input.first().json.source_url,\n  completed_step : 8\n};\n"},"typeVersion":2},{"id":"2f149a7d-e6a8-4cdb-84a9-f474274fe4dc","name":"MongoDB15","type":"n8n-nodes-base.mongoDb","position":[1220,2420],"parameters":{"fields":"=completed_step,blog_image_url","options":{},"operation":"update","updateKey":"_id","collection":"blog"},"credentials":{"mongoDb":{"id":"TwJB8fMcekPw13qA","name":"MongoDB account - jharilela@gmail.com"}},"typeVersion":1.2},{"id":"d687a052-adf1-4a3d-be85-94f7b0e8f772","name":"Wordpress2","type":"n8n-nodes-base.wordpress","position":[2160,2420],"parameters":{"postId":"={{ $('Wordpress1').item.json.id }}","operation":"update","updateFields":{"status":"publish"}},"credentials":{"wordpressApi":{"id":"ROMzk4TNprbiDIjp","name":"wp - jay@emp0.com"}},"typeVersion":1},{"id":"9a90e900-ad8e-490f-bf3a-8788cca624d5","name":"MongoDB16","type":"n8n-nodes-base.mongoDb","position":[2560,2420],"parameters":{"fields":"completed_step, blog_status, blog_link","options":{},"operation":"update","updateKey":"_id","collection":"blog"},"credentials":{"mongoDb":{"id":"TwJB8fMcekPw13qA","name":"MongoDB account - jharilela@gmail.com"}},"typeVersion":1.1},{"id":"3292cb3b-22c0-43aa-8860-e1b2bcea3280","name":"Code14","type":"n8n-nodes-base.code","position":[2360,2420],"parameters":{"jsCode":"return { \n  \"_id\" : $('MongoDB8').first().json._id,\n  \"blog_status\": \"Publish\",\n  \"blog_link\" : $('Wordpress1').first().json.link, \n  completed_step : 9\n};\n"},"typeVersion":2},{"id":"8dca0746-0c42-4597-93d7-26023f9c237e","name":"Code8","type":"n8n-nodes-base.code","position":[1400,2420],"parameters":{"jsCode":"const markdown = $('MongoDB8').first().json.blog_article || '';\n\n// Simple replacements (limited Markdown support)\nlet html = markdown\n  .replace(/^### (.*$)/gim, '<h3>$1</h3>')\n  .replace(/^## (.*$)/gim, '<h2>$1</h2>')\n  .replace(/^# (.*$)/gim, '<h1>$1</h1>')\n  .replace(/\\*\\*(.*?)\\*\\*/gim, '<strong>$1</strong>')\n  .replace(/\\*(.*?)\\*/gim, '<em>$1</em>')\n  .replace(/\\[(.*?)\\]\\((.*?)\\)/gim, '<a href=\"$2\">$1</a>')\n  .replace(/\\n$/gim, '<br />');\n\nhtml = `<div>${html}</div>`; // wrap in container\n\nreturn [{\n  json: {\n    blog_html: html\n  }\n}];\n"},"typeVersion":2},{"id":"bd78a139-74de-4b89-980f-bc60d8c09b59","name":"HTTP Request1","type":"n8n-nodes-base.httpRequest","position":[-180,2420],"parameters":{"url":"https://cloud.leonardo.ai/api/rest/v1/generations","method":"POST","options":{},"jsonBody":"={\n  \"modelId\": \"b2614463-296c-462a-9586-aafdb8f00e36\",\n  \"contrast\": 3.5,\n  \"prompt\": \"{{$json.prompt }}\",\n  \"num_images\": 1,\n  \"width\": 1472,\n  \"height\": 832,\n  \"styleUUID\": \"111dc692-d470-4eec-b791-3475abac4c46\",\n  \"enhancePrompt\": true\n}","sendBody":true,"sendHeaders":true,"specifyBody":"json","authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth","headerParameters":{"parameters":[{"name":"content-type","value":"application/json"},{"name":"accept","value":"application/json"}]}},"credentials":{"httpBearerAuth":{"id":"JvhQAEa4Frw0CDoq","name":"Leonardo AI"},"httpHeaderAuth":{"id":"rGBKnDk3FO1WfA4z","name":"Header Auth - leonardo ai"}},"typeVersion":4.2},{"id":"fa9d6f10-ea2e-442d-bce1-419e7cf9769a","name":"HTTP Request2","type":"n8n-nodes-base.httpRequest","position":[360,2420],"parameters":{"url":"=https://cloud.leonardo.ai/api/rest/v1/generations/{{ $json.sdGenerationJob.generationId }}","options":{},"sendHeaders":true,"authentication":"genericCredentialType","genericAuthType":"httpHeaderAuth","headerParameters":{"parameters":[{"name":"accept","value":"application/json"}]}},"credentials":{"httpBearerAuth":{"id":"JvhQAEa4Frw0CDoq","name":"Leonardo AI"},"httpHeaderAuth":{"id":"rGBKnDk3FO1WfA4z","name":"Header Auth - leonardo ai"}},"typeVersion":4.2},{"id":"80ea7142-4fed-4469-881b-39139456e1ad","name":"Wait","type":"n8n-nodes-base.wait","position":[0,2420],"webhookId":"c6eba895-fa7a-4113-88a0-8352816b4b98","parameters":{"unit":"minutes","amount":1},"typeVersion":1.1},{"id":"928aaf73-65c1-4d21-85aa-abca6a723525","name":"HTTP Request3","type":"n8n-nodes-base.httpRequest","position":[580,2420],"parameters":{"url":"={{ $json.generations_by_pk.generated_images[0].url }}","options":{}},"typeVersion":4.2},{"id":"ba31143c-c24a-40de-8fbb-b14976b91ec4","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[-840,2340],"parameters":{"width":3880,"height":800,"content":"## Step 8,9: Generate image and create blog article"},"typeVersion":1},{"id":"ba31cf93-d6ac-4a17-a19a-d5679f5da805","name":"Get Articles Daily1","type":"n8n-nodes-base.scheduleTrigger","position":[-760,2420],"parameters":{"rule":{"interval":[{"field":"hours","hoursInterval":2,"triggerAtMinute":20}]}},"typeVersion":1.2},{"id":"5e3dbe1b-1f6f-440e-bbfd-7c3d02f4faea","name":"Get Articles Daily2","type":"n8n-nodes-base.scheduleTrigger","position":[-800,860],"parameters":{"rule":{"interval":[{"field":"hours","hoursInterval":2}]}},"typeVersion":1.2},{"id":"6c16c912-c25a-42f9-bdc7-34d241e49255","name":"Get Articles Daily3","type":"n8n-nodes-base.scheduleTrigger","position":[-760,1640],"parameters":{"rule":{"interval":[{"field":"hours","hoursInterval":2,"triggerAtMinute":10}]}},"typeVersion":1.2},{"id":"e3898031-6f85-4ff7-a868-c63016865d5e","name":"Structured Output Parser6","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[1000,1860],"parameters":{"jsonSchemaExample":"[\n  {\n    \"outline\": \"```markdown\\n# Navigating Legal Complexities in AI and Copyright: A Complete Guide\\n\\n## Introduction: The Intersection of AI and Copyright\\nThe rise of generative AI has sparked a seismic shift in the creative landscape, leading to a plethora of AI copyright issues that challenge traditional views on intellectual property. As artists, musicians, and creators increasingly turn to AI-generated content, the question arises: who owns the rights to these creations? In this guide, we will explore the nuances of AI copyright issues, the implications for creativity rights, and what the future holds for artists harnessing the power of AI.\\n\\n## Background: Understanding AI and Copyright\\nIn order to grasp the complexities of AI copyright issues, one must first understand the fundamentals of copyright law and its application to generative AI. Copyright is designed to protect original works of authorship, but the emergence of AI-generated content complicates this traditional framework. This section will cover:\\n- Key definitions of intellectual property.\\n- The role of creativity rights in copyright law.\\n- Examples of how traditional copyright has been challenged by advancements in generative AI technologies.\\n\\n## Trend: The Rise of Generative AI and Its Impact\\nThe increasing sophistication of generative AI tools means more creators are using these technologies to produce art and music. This trend raises significant questions about originality and ownership. In this section, we will discuss:\\n- Notable applications of generative AI in various creative fields.\\n- The ongoing debate surrounding the legality and ethics of AI-generated content.\\n- Highlighting perspectives from industry experts, including insights from creators like Ed Sheeran on the nature of creativity in a world shaped by AI.\\n\\n## Insight: The Tension Between Innovation and Copyright Law\\nAs the lines blur between human creativity and machine-generated art, there is a growing tension between innovation and the protection of creativity rights. This section will delve into:\\n- Case studies showcasing the struggles artists face in asserting ownership over AI-assisted works.\\n- Quotations from thought leaders, such as Ed Sheeran’s view on the shared building blocks of creativity.\\n- Analyzing the statements of influential figures who have commented on the implications of AI on artistic expression, including references to past artistic movements.\\n\\n## Forecast: The Future of AI Copyright Issues\\nLooking ahead, the legal frameworks surrounding AI copyright issues are likely to evolve. This section will provide:\\n- Predictions on how copyright law may adapt to accommodate the realities of generative AI.\\n- Insights into potential policy changes and reforms that could arise from ongoing debates.\\n- A discussion on the importance of fostering a balanced approach that respects creativity rights while encouraging innovation.\\n\\n## Call to Action: Join the Conversation\\nAs the landscape of AI-generated content continues to evolve, the need for informed stakeholders is more critical than ever. We encourage readers to engage in this important dialogue. Share your thoughts on AI copyright issues and how you see the future of creativity rights developing. Stay updated with our latest insights and contribute to shaping the future of intellectual property in the age of AI.\\n```\\n\"\n  }\n]"},"typeVersion":1.3},{"id":"c5b15f9c-e367-4e5e-bb1d-84742b75efeb","name":"Code9","type":"n8n-nodes-base.code","position":[-340,2420],"parameters":{"jsCode":"const base = $('MongoDB8').first().json.image_alt_text || '';\nconst cleanBase = base.replace(/[\"\\n\\r]/g, ''); // Remove double quotes and line breaks\nconst enrichedPrompt = `A cinematic, emotionally compelling scene involving people that captures the essence of: ${cleanBase}. Include visible human figures in natural interaction or meaningful posture, placed in a symbolic setting that reinforces the story.`;\n\nreturn [{\n  json: {\n    prompt: enrichedPrompt\n  }\n}];\n"},"typeVersion":2},{"id":"d566905f-666f-4ec0-b3e8-3e2ed9e6121d","name":"Transform news to MD","type":"n8n-nodes-base.code","position":[580,980],"parameters":{"mode":"runOnceForEachItem","jsCode":"function stripHtmlTags(html) {\n  return html\n    .replace(/<\\/?[^>]+(>|$)/g, '') // remove all HTML tags\n    .replace(/&nbsp;/g, ' ')\n    .replace(/&amp;/g, '&')\n    .replace(/&quot;/g, '\"')\n    .replace(/&#39;/g, \"'\")\n    .replace(/&lt;/g, '<')\n    .replace(/&gt;/g, '>');\n}\n\nconst input = $json.body || \"\";\nconst markdownContent = stripHtmlTags(input).trim();\n\nreturn {\n  json: {\n    data: markdownContent\n  }\n};\n"},"typeVersion":2},{"id":"155318c9-d262-43f1-b7ed-5a4fa8bedc84","name":"Code1","type":"n8n-nodes-base.code","position":[1220,980],"parameters":{"jsCode":"// Get current item data\nlet article = $json.output || {};\n\narticle.link = $('Code10').first().json.link_articles;\n\n// Return with flattened structure\nreturn {\n  json: {\n    ...article\n  }\n};\n"},"typeVersion":2},{"id":"f95f87f6-6125-4685-a772-cedc5ef6bb4e","name":"Loop Over Items","type":"n8n-nodes-base.splitInBatches","position":[-240,860],"parameters":{"options":{"reset":false}},"typeVersion":3,"alwaysOutputData":false},{"id":"ea0b5f05-e784-44e6-9949-0c30d6dabf7d","name":"Code10","type":"n8n-nodes-base.code","position":[0,980],"parameters":{"jsCode":"return $input.all();"},"typeVersion":2}],"connections":{"Code":{"main":[[{"node":"MongoDB","type":"main","index":0}]]},"HTML":{"main":[[{"node":"Transform news to MD","type":"main","index":0}]]},"Wait":{"main":[[{"node":"HTTP Request2","type":"main","index":0}]]},"Code1":{"main":[[{"node":"Loop Over Items","type":"main","index":0}]]},"Code3":{"main":[[{"node":"MongoDB4","type":"main","index":0}]]},"Code4":{"main":[[{"node":"MongoDB2","type":"main","index":0}]]},"Code5":{"main":[[{"node":"MongoDB5","type":"main","index":0}]]},"Code6":{"main":[[{"node":"MongoDB6","type":"main","index":0}]]},"Code7":{"main":[[{"node":"MongoDB7","type":"main","index":0}]]},"Code8":{"main":[[{"node":"Wordpress1","type":"main","index":0}]]},"Code9":{"main":[[{"node":"HTTP Request1","type":"main","index":0}]]},"Code10":{"main":[[{"node":"HTTP Request","type":"main","index":0}]]},"Code12":{"main":[[{"node":"MongoDB15","type":"main","index":0}]]},"Code14":{"main":[[{"node":"MongoDB16","type":"main","index":0}]]},"Filter":{"main":[[{"node":"Set and Normalize Fields","type":"main","index":0}]]},"OpenAI":{"main":[[]]},"MongoDB":{"main":[[]]},"AI Agent":{"main":[[{"node":"Split Out2","type":"main","index":0}]]},"MongoDB1":{"main":[[{"node":"Split Out1","type":"main","index":0}]]},"MongoDB2":{"main":[[]]},"MongoDB3":{"main":[[{"node":"AI Agent2","type":"main","index":0}]]},"MongoDB4":{"main":[[{"node":"AI Agent6","type":"main","index":0}]]},"MongoDB5":{"main":[[{"node":"AI Agent7","type":"main","index":0}]]},"MongoDB6":{"main":[[]]},"MongoDB7":{"main":[[{"node":"AI Agent5","type":"main","index":0}]]},"MongoDB8":{"main":[[{"node":"Code9","type":"main","index":0}]]},"AI Agent1":{"main":[[{"node":"Code1","type":"main","index":0}]]},"AI Agent2":{"main":[[{"node":"AI Agent3","type":"main","index":0}]]},"AI Agent3":{"main":[[{"node":"Code7","type":"main","index":0}]]},"AI Agent4":{"main":[[]]},"AI Agent5":{"main":[[{"node":"Code3","type":"main","index":0}]]},"AI Agent6":{"main":[[{"node":"Code5","type":"main","index":0}]]},"AI Agent7":{"main":[[{"node":"Code6","type":"main","index":0}]]},"Aggregate":{"main":[[{"node":"AI Agent","type":"main","index":0}]]},"MongoDB15":{"main":[[{"node":"Code8","type":"main","index":0}]]},"Set Image":{"main":[[{"node":"Set metatag1","type":"main","index":0}]]},"Split Out":{"main":[[{"node":"Read RSS News Feeds","type":"main","index":0}]]},"Aggregate1":{"main":[[{"node":"Code4","type":"main","index":0}]]},"Split Out1":{"main":[[{"node":"Loop Over Items","type":"main","index":0}]]},"Split Out2":{"main":[[{"node":"Code","type":"main","index":0}]]},"Wordpress1":{"main":[[{"node":"Set Image","type":"main","index":0}]]},"Wordpress2":{"main":[[{"node":"Code14","type":"main","index":0}]]},"HTTP Request":{"main":[[{"node":"HTML","type":"main","index":0}]]},"Set metatag1":{"main":[[{"node":"Wordpress2","type":"main","index":0}]]},"HTTP Request1":{"main":[[{"node":"Wait","type":"main","index":0}]]},"HTTP Request2":{"main":[[{"node":"HTTP Request3","type":"main","index":0}]]},"HTTP Request3":{"main":[[{"node":"Upload image2","type":"main","index":0}]]},"Upload image2":{"main":[[{"node":"Code12","type":"main","index":0}]]},"Loop Over Items":{"main":[[{"node":"Aggregate1","type":"main","index":0}],[{"node":"Code10","type":"main","index":0}]]},"Text Classifier":{"main":[[{"node":"Aggregate","type":"main","index":0}]]},"OpenAI Chat Model":{"ai_languageModel":[[{"node":"Text Classifier","type":"ai_languageModel","index":0}]]},"Get Articles Daily":{"main":[[{"node":"Set Tech News RSS Feeds","type":"main","index":0}]]},"OpenAI Chat Model1":{"ai_languageModel":[[{"node":"AI Agent","type":"ai_languageModel","index":0}]]},"OpenAI Chat Model2":{"ai_languageModel":[[{"node":"AI Agent1","type":"ai_languageModel","index":0}]]},"OpenAI Chat Model3":{"ai_languageModel":[[{"node":"AI Agent2","type":"ai_languageModel","index":0}]]},"OpenAI Chat Model4":{"ai_languageModel":[[{"node":"AI Agent3","type":"ai_languageModel","index":0}]]},"OpenAI Chat Model5":{"ai_languageModel":[[{"node":"AI Agent4","type":"ai_languageModel","index":0}]]},"OpenAI Chat Model6":{"ai_languageModel":[[{"node":"AI Agent5","type":"ai_languageModel","index":0}]]},"OpenAI Chat Model7":{"ai_languageModel":[[{"node":"AI Agent6","type":"ai_languageModel","index":0}]]},"OpenAI Chat Model8":{"ai_languageModel":[[{"node":"AI Agent7","type":"ai_languageModel","index":0}]]},"Get Articles Daily1":{"main":[[{"node":"MongoDB8","type":"main","index":0}]]},"Get Articles Daily2":{"main":[[{"node":"MongoDB1","type":"main","index":0}]]},"Get Articles Daily3":{"main":[[{"node":"MongoDB3","type":"main","index":0}]]},"Read RSS News Feeds":{"main":[[{"node":"Filter","type":"main","index":0}]]},"Transform news to MD":{"main":[[{"node":"AI Agent1","type":"main","index":0}]]},"Set Tech News RSS Feeds":{"main":[[{"node":"Split Out","type":"main","index":0}]]},"Set and Normalize Fields":{"main":[[{"node":"Text Classifier","type":"main","index":0}]]},"Structured Output Parser":{"ai_outputParser":[[{"node":"AI Agent","type":"ai_outputParser","index":0}]]},"Structured Output Parser1":{"ai_outputParser":[[{"node":"AI Agent1","type":"ai_outputParser","index":0}]]},"Structured Output Parser2":{"ai_outputParser":[[{"node":"AI Agent2","type":"ai_outputParser","index":0}]]},"Structured Output Parser3":{"ai_outputParser":[[{"node":"AI Agent3","type":"ai_outputParser","index":0}]]},"Structured Output Parser4":{"ai_outputParser":[[{"node":"AI Agent7","type":"ai_outputParser","index":0}]]},"Structured Output Parser5":{"ai_outputParser":[[{"node":"AI Agent4","type":"ai_outputParser","index":0}]]},"Structured Output Parser6":{"ai_outputParser":[[{"node":"AI Agent5","type":"ai_outputParser","index":0}]]}}}


name: AI Agents can Create, Enrich leads with this Lemlist Tool MCP Server
author_name: David Ashby
author_username: cfomodz
nodes_used: []
categories: []
created_at: 2025-06-24T21:24:15.749Z
updated_at: 2025-06-24T21:24:15.749Z
url: https://n8n.io/workflows/5233
scraped_at: 2025-07-06 21:16:30
description:
  🛠️ Lemlist Tool MCP Server

  Complete MCP server exposing all Lemlist Tool operations to AI agents. Zero configuration needed - all 15 operations pre-built.

  ⚡ Quick Setup

  Import this workflow into your n8n instance
  Activate the workflow to start your MCP server
  Copy the webhook URL from the MCP trigger node
  Connect AI agents using the MCP URL

  🔧 How it Works

  • MCP Trigger: Serves as your server endpoint for AI agent requests
  • Tool Nodes: Pre-configured for every Lemlist Tool operation
  • AI Expressions: Automatically populate parameters via $fromAI() placeholders
  • Native Integration: Uses official n8n Lemlist Tool tool with full error handling

  📋 Available Operations (15 total)

  Every possible Lemlist Tool operation is included:

  🔧 Activity (1 operations)

  • Get many activities

  📢 Campaign (2 operations)

  • Get many campaigns
  • Get campaign stats

  🔧 Enrich (3 operations)

  • Fetches a previously completed enrichment
  • Enrich a lead using an email or LinkedIn URL
  • Enrich a person using an email or LinkedIn URL

  🔧 Lead (4 operations)

  • Create a lead
  • Delete a lead
  • Get a lead
  • Unsubscribe a lead

  🔧 Team (2 operations)

  • Get a team
  • Get team credits

  🔧 Unsubscribe (3 operations)

  • Add an email to an unsubscribe list
  • Delete an email from an unsubscribe list
  • Get many unsubscribed emails

  🤖 AI Integration

  Parameter Handling: AI agents automatically provide values for:
  • Resource IDs and identifiers
  • Search queries and filters
  • Content and data payloads
  • Configuration options

  Response Format: Native Lemlist Tool API responses with full data structure

  Error Handling: Built-in n8n error management and retry logic

  💡 Usage Examples

  Connect this MCP server to any AI agent or workflow:

  • Claude Desktop: Add MCP server URL to configuration
  • Custom AI Apps: Use MCP URL as tool endpoint
  • Other n8n Workflows: Call MCP tools from any workflow
  • API Integration: Direct HTTP calls to MCP endpoints

  ✨ Benefits

  • Complete Coverage: Every Lemlist Tool operation available
  • Zero Setup: No parameter mapping or configuration needed
  • AI-Ready: Built-in $fromAI() expressions for all parameters
  • Production Ready: Native n8n error handling and logging
  • Extensible: Easily modify or add custom logic

  &gt; 🆓 Free for community use! Ready to deploy in under 2 minutes.

workflow_json:
  {"id":"uVliKCXmDFSD2oW2","meta":null,"name":"Lemlist Tool MCP Server","tags":[],"nodes":[{"id":"00ea77c5-85b0-4c04-89c5-3d1f14835650","name":"Workflow Overview 0","type":"n8n-nodes-base.stickyNote","position":[-1480,100],"parameters":{"content":""},"typeVersion":1},{"id":"c456ec28-00a3-4430-9c71-ca9967782f1e","name":"Lemlist Tool MCP Server","type":"@n8n/n8n-nodes-langchain.mcpTrigger","position":[-340,140],"webhookId":"d7e77bad-6382-4b2b-826a-6c8c2ac04521","parameters":{},"typeVersion":1},{"id":"a248f265-1cca-490d-8b07-09a11883931b","name":"Get many activities","type":"n8n-nodes-base.lemlistTool","position":[-800,140],"parameters":{},"typeVersion":2},{"id":"6f76df4a-f560-4a6c-ab6e-1503e4ea084d","name":"Sticky Note 1","type":"n8n-nodes-base.stickyNote","position":[-1000,120],"parameters":{"content":""},"typeVersion":1},{"id":"af37bfa6-7a16-4e97-abdf-bb086c90f49e","name":"Get many campaigns","type":"n8n-nodes-base.lemlistTool","position":[-800,380],"parameters":{},"typeVersion":2},{"id":"bdf85bd1-604e-4d1a-803f-1b70c998e5b7","name":"Get campaign stats","type":"n8n-nodes-base.lemlistTool","position":[-580,380],"parameters":{},"typeVersion":2},{"id":"793e0763-adbe-4466-be9b-5a17653fab1e","name":"Sticky Note 2","type":"n8n-nodes-base.stickyNote","position":[-1000,360],"parameters":{"content":""},"typeVersion":1},{"id":"c34dbedc-0d07-4ec0-800f-e94edb8d450d","name":"Fetches a previously completed enrichment","type":"n8n-nodes-base.lemlistTool","position":[-800,620],"parameters":{},"typeVersion":2},{"id":"a634767a-f804-4ad9-885f-15d77bf5d236","name":"Enrich a lead using an email or LinkedIn URL","type":"n8n-nodes-base.lemlistTool","position":[-580,620],"parameters":{},"typeVersion":2},{"id":"7ffdf5b6-499b-4f34-b484-78cdb74d4864","name":"Enrich a person using an email or LinkedIn URL","type":"n8n-nodes-base.lemlistTool","position":[-360,620],"parameters":{},"typeVersion":2},{"id":"0a768374-b0f1-4daf-a95f-7528acca1127","name":"Sticky Note 3","type":"n8n-nodes-base.stickyNote","position":[-1000,600],"parameters":{"content":""},"typeVersion":1},{"id":"c96be52e-ecc4-49e7-a7ed-177a2b9e147a","name":"Create a lead","type":"n8n-nodes-base.lemlistTool","position":[-800,860],"parameters":{},"typeVersion":2},{"id":"c6b69cb0-7f8a-4a0d-a301-4d44453c0d30","name":"Delete a lead","type":"n8n-nodes-base.lemlistTool","position":[-580,860],"parameters":{},"typeVersion":2},{"id":"f287e645-74c3-4fc9-920b-6bc7d39fd5e9","name":"Get a lead","type":"n8n-nodes-base.lemlistTool","position":[-360,860],"parameters":{},"typeVersion":2},{"id":"45c17f0b-9b12-413c-8d76-efa748480064","name":"Unsubscribe a lead","type":"n8n-nodes-base.lemlistTool","position":[-140,860],"parameters":{},"typeVersion":2},{"id":"abcae69d-3c9f-4a9c-b9da-d8c9d6d094fa","name":"Sticky Note 4","type":"n8n-nodes-base.stickyNote","position":[-1000,840],"parameters":{"content":""},"typeVersion":1},{"id":"5f50ff11-ad13-4628-b59e-d072e990157c","name":"Get a team","type":"n8n-nodes-base.lemlistTool","position":[-800,1100],"parameters":{},"typeVersion":2},{"id":"7553939a-a51d-4b5c-b119-4700b06f0dca","name":"Get team credits","type":"n8n-nodes-base.lemlistTool","position":[-580,1100],"parameters":{},"typeVersion":2},{"id":"ac3890e7-2558-4e22-aaf7-7369827ee28b","name":"Sticky Note 5","type":"n8n-nodes-base.stickyNote","position":[-1000,1080],"parameters":{"content":""},"typeVersion":1},{"id":"1325248a-9f10-4fa4-aed4-4638562f6b81","name":"Add an email to an unsubscribe list","type":"n8n-nodes-base.lemlistTool","position":[-800,1340],"parameters":{},"typeVersion":2},{"id":"d053c270-3cbe-4ff1-9a51-dbb3d3472341","name":"Delete an email from an unsubscribe list","type":"n8n-nodes-base.lemlistTool","position":[-580,1340],"parameters":{},"typeVersion":2},{"id":"39a06b1d-ed60-402c-82f9-4ddf65c6f3a1","name":"Get many unsubscribed emails","type":"n8n-nodes-base.lemlistTool","position":[-360,1340],"parameters":{},"typeVersion":2},{"id":"f4f02b1e-9565-4c9e-9224-c141938d10cc","name":"Sticky Note 6","type":"n8n-nodes-base.stickyNote","position":[-1000,1320],"parameters":{"content":""},"typeVersion":1}],"active":false,"shared":[{"role":"workflow:owner","project":{"id":"G5fce9xGuBAsWBXe","icon":null,"name":"David Ashby <david.ashby.lds@gmail.com>","type":"personal","createdAt":"2025-06-04T02:55:02.013Z","updatedAt":"2025-06-04T02:56:01.361Z","projectRelations":[{"role":"project:personalOwner","user":{"id":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","role":"global:owner","email":"david.ashby.lds@gmail.com","disabled":false,"lastName":"Ashby","settings":{"npsSurvey":{"responded":true,"lastShownAt":1749357655581},"userActivated":true,"userActivatedAt":1749075994495,"easyAIWorkflowOnboarded":true,"firstSuccessfulWorkflowId":"3N3vVikZb3MckFYm"},"createdAt":"2025-06-04T02:55:01.745Z","firstName":"David","isPending":false,"updatedAt":"2025-06-08T04:40:58.399Z","mfaEnabled":false,"personalizationAnswers":{"version":"v4","personalization_survey_n8n_version":"1.95.3","personalization_survey_submitted_at":"2025-06-04T02:56:07.075Z"}},"userId":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","createdAt":"2025-06-04T02:55:02.013Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-04T02:55:02.013Z"}]},"createdAt":"2025-06-24T16:16:00.631Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-24T16:16:00.631Z","workflowId":"uVliKCXmDFSD2oW2"}],"settings":{"timezone":"America/New_York"},"createdAt":"2025-06-24T16:16:00.630Z","updatedAt":"2025-06-24T16:38:44.000Z","versionId":"94517d65-e4e6-4a8c-84af-279e251dee95","isArchived":false,"staticData":null,"connections":{"Get a lead":{"ai_tool":[[{"node":"Lemlist Tool MCP Server","type":"ai_tool","index":0}]]},"Get a team":{"ai_tool":[[{"node":"Lemlist Tool MCP Server","type":"ai_tool","index":0}]]},"Create a lead":{"ai_tool":[[{"node":"Lemlist Tool MCP Server","type":"ai_tool","index":0}]]},"Delete a lead":{"ai_tool":[[{"node":"Lemlist Tool MCP Server","type":"ai_tool","index":0}]]},"Get team credits":{"ai_tool":[[{"node":"Lemlist Tool MCP Server","type":"ai_tool","index":0}]]},"Get campaign stats":{"ai_tool":[[{"node":"Lemlist Tool MCP Server","type":"ai_tool","index":0}]]},"Get many campaigns":{"ai_tool":[[{"node":"Lemlist Tool MCP Server","type":"ai_tool","index":0}]]},"Unsubscribe a lead":{"ai_tool":[[{"node":"Lemlist Tool MCP Server","type":"ai_tool","index":0}]]},"Get many activities":{"ai_tool":[[{"node":"Lemlist Tool MCP Server","type":"ai_tool","index":0}]]},"Get many unsubscribed emails":{"ai_tool":[[{"node":"Lemlist Tool MCP Server","type":"ai_tool","index":0}]]},"Add an email to an unsubscribe list":{"ai_tool":[[{"node":"Lemlist Tool MCP Server","type":"ai_tool","index":0}]]},"Delete an email from an unsubscribe list":{"ai_tool":[[{"node":"Lemlist Tool MCP Server","type":"ai_tool","index":0}]]},"Fetches a previously completed enrichment":{"ai_tool":[[{"node":"Lemlist Tool MCP Server","type":"ai_tool","index":0}]]},"Enrich a lead using an email or LinkedIn URL":{"ai_tool":[[{"node":"Lemlist Tool MCP Server","type":"ai_tool","index":0}]]},"Enrich a person using an email or LinkedIn URL":{"ai_tool":[[{"node":"Lemlist Tool MCP Server","type":"ai_tool","index":0}]]}},"triggerCount":0}


name: Narrative Threat / Opportunity Detection (AskRally)
author_name: Rhys
author_username: virtual-rf
nodes_used: ["n8n-nodes-base.httpRequest","n8n-nodes-base.gmail","n8n-nodes-base.code"]
categories: []
created_at: 2025-06-24T21:32:53.935Z
updated_at: 2025-06-24T21:32:53.935Z
url: https://n8n.io/workflows/5234
scraped_at: 2025-07-06 21:16:30
description:
  This workflow turns news monitoring into an early-warning demand engine. It continuously ingests Google Alert RSS feeds, extracts the full text of every article, and runs real-time purchase-intent modeling to predict which stories will sway your buyers—positively or negatively. The moment a spike in intent is detected, it triggers an early warning email so you can run with the right playbooks: amplify favorable narratives to accelerate deal cycles, or counter harmful ones before they dent your pipeline. Ideal for revenue teams that want to harness media signals instead of reacting to them after the fact.

  📝 Step-by-Step Instructions
  RSS Triggers - RSS trigger checks for news every [enter time] 
  Extract content- using the RSS link, run a HTTP request.
  Structure Output - Parse out article content and format simulation query 
  Rally Simulation Testing - AI personas get content as memory, and are asked (in voting mode) to answer how it impacts interest in spending money on [synthetic research] (swap for your category)
  Extract Individual Votes - Splits Rally's response array to process each persona's individual voting decision for detailed analysis
  Calculate Responses - Custom code processes all votes, counts selections for each variation, calculates percentages
  Alert trigger- Depending on count thresholds, triggers emails.

workflow_json:
  {"id":"bHmHHEt75JaovVaB","meta":{"instanceId":"7921b3cd29c1121b3ec4f2177acf06fe1f1325838297f593db7db4e9563eb98d","templateCredsSetupCompleted":true},"name":"narrative monitoring","tags":[{"id":"G8kDAqCFw5rVCOgs","name":"News Pipeline Testing","createdAt":"2025-06-22T22:10:20.475Z","updatedAt":"2025-06-22T22:10:20.475Z"}],"nodes":[{"id":"52dc2d74-fe6a-422c-9be9-d14b68250afc","name":"Code","type":"n8n-nodes-base.code","position":[600,0],"parameters":{"mode":"runOnceForEachItem","jsCode":"// Extract content and prepare Rally API payload\nlet rssData = {};\nlet httpData = {};\n\ntry {\n  // Get RSS data from the dedup + URL extraction step\n  rssData = $('Dedup + url extraction').item.json || {};\n} catch (e) {\n  console.log('No RSS data accessible:', e.message);\n}\n\ntry {\n  // Get HTTP data from the content fetching step\n  httpData = $('Get Content').item.json || {};\n} catch (e) {\n  console.log('No HTTP data accessible:', e.message);\n}\n\n// Extract HTML content\nconst htmlContent = httpData.data || httpData.body || '';\n\n// Extract RSS metadata\nconst title = rssData.title || '';\nconst snippet = rssData.contentSnippet || rssData.content || rssData.summary || '';\nconst articleUrl = rssData.cleanUrl || rssData.link || '';\n\n// Extract article content from HTML\nlet extractedContent = '';\nif (htmlContent) {\n  extractedContent = htmlContent\n    .replace(/<script[^>]*>[\\s\\S]*?<\\/script>/gi, '')\n    .replace(/<style[^>]*>[\\s\\S]*?<\\/style>/gi, '')\n    .replace(/<[^>]*>/g, ' ')\n    .replace(/&nbsp;/g, ' ')\n    .replace(/&amp;/g, '&')\n    .replace(/&lt;/g, '<')\n    .replace(/&gt;/g, '>')\n    .replace(/&quot;/g, '\"')\n    .replace(/\\s+/g, ' ')\n    .trim();\n\n  // Limit length\n  if (extractedContent.length > 3000) {\n    extractedContent = extractedContent.substring(0, 3000) + '...';\n  }\n}\n\n// Use extracted content if substantial, otherwise RSS snippet\nconst useExtracted = extractedContent.length > 200;\nconst fullContent = useExtracted ? extractedContent : snippet;\nconst memoryContent = [`You've just read this content: ${fullContent}`];\n\n// Rally API payload\nconst rallyPayload = {\n  smart: false,\n  provider: \"openai\",\n  query: \"After reading that content, how has your interest in spending money on synthetic research changed? A) Much more interested, B) Somewhat more interested, C) No change, D) Somewhat less interested, E) Much less interested\",\n  audience_id: \"r8eb276513d8241\",\n  voting_mode: true,\n  mode: \"fast\",\n  manual_memories: memoryContent,\n};\n\nreturn {\n  title: title,\n  content: snippet,\n  url: articleUrl,\n  fullContent: fullContent,\n  rallyPayload: rallyPayload,\n  extractedLength: extractedContent.length,\n  usedExtracted: useExtracted,\n  debug: {\n    hasTitle: !!title,\n    hasUrl: !!articleUrl,\n    htmlLength: htmlContent.length,\n    rssDataFound: Object.keys(rssData).length > 0,\n    httpDataFound: Object.keys(httpData).length > 0\n  }\n};"},"typeVersion":2},{"id":"8f134637-f907-4be4-bcf0-0e497b7a711e","name":"HTTP Request","type":"n8n-nodes-base.httpRequest","position":[840,0],"parameters":{"url":"ENTER RALLY API END POINT HERE","method":"POST","options":{},"jsonBody":"={{$json.rallyPayload}}","sendBody":true,"sendHeaders":true,"specifyBody":"json","authentication":"genericCredentialType","genericAuthType":"httpBearerAuth","headerParameters":{"parameters":[{"name":"Content-Type","value":"application/json"}]}},"credentials":{"httpBearerAuth":{"id":"wSoUK2sXm0c8MCMq","name":"Bearer YOUR_TOKEN_HERE account 2"}},"typeVersion":4.2},{"id":"eb63694e-b291-4d24-a1ee-c87a5a4304ce","name":"Gmail","type":"n8n-nodes-base.gmail","position":[1840,0],"webhookId":"d47ea3ca-9545-4638-a6f5-b25374cf0760","parameters":{"sendTo":"ENTER YOUR EMAIL HERE","message":"=<div style=\"font-family: Arial, sans-serif; max-width: 600px; margin: 0 auto; padding: 20px;\">\n\n<!-- Header Section -->\n<div style=\"background-color: #f8f9fa; padding: 15px; border-radius: 8px; margin-bottom: 20px;\">\n  <h2 style=\"margin: 0; color: #333;\">📰 AskRally Alert</h2>\n</div>\n\n<!-- Article Information -->\n<div style=\"background-color: #ffffff; border: 1px solid #e9ecef; border-radius: 8px; padding: 20px; margin-bottom: 20px;\">\n  <h3 style=\"color: #495057; margin-top: 0; border-bottom: 2px solid #dee2e6; padding-bottom: 10px;\">\n    📄 Article Details\n  </h3>\n  \n  <p><strong>Title:</strong><br/>\n  {{ $('Code').item.json.title }}</p>\n  \n  <p><strong>URL:</strong><br/>\n  <a href=\"{{$node[\"Code\"].json[\"url\"]}}\" style=\"color: #007bff; text-decoration: none;\">\n    {{$node[\"Code\"].json[\"url\"]}}\n  </a></p>\n  \n  <p><strong>Content Snippet:</strong><br/>\n  <em style=\"color: #6c757d;\">{{ $('Dedup + url extraction').item.json.contentSnippet }}</em></p>\n</div>\n\n<!-- Full Content Section -->\n<div style=\"background-color: #f8f9fa; border: 1px solid #e9ecef; border-radius: 8px; padding: 20px; margin-bottom: 20px;\">\n  <h3 style=\"color: #495057; margin-top: 0; border-bottom: 2px solid #dee2e6; padding-bottom: 10px;\">\n    📖 Full Content\n  </h3>\n  <div style=\"background-color: #ffffff; padding: 15px; border-radius: 4px; border-left: 4px solid #007bff; font-size: 14px; line-height: 1.6;\">\n    {{$node[\"Code\"].json[\"fullContent\"]}}\n  </div>\n</div>\n\n<!-- Results Section -->\n<div style=\"background-color: #ffffff; border: 1px solid #e9ecef; border-radius: 8px; padding: 20px; margin-bottom: 20px;\">\n  <h3 style=\"color: #495057; margin-top: 0; border-bottom: 2px solid #dee2e6; padding-bottom: 10px;\">\n    📊 Rally Results\n  </h3>\n  \n  <div style=\"background-color: #f8f9fa; padding: 15px; border-radius: 4px; margin-bottom: 15px;\">\n    <p><strong>{{ $json.message }}</strong></p>\n    <p><strong>Total Voters:</strong> {{ $json.totalVoters }}</p>\n    <p><strong>Pro-Narrative:</strong> {{ $json.proNarrative }}% | \n       <strong>Contra-Narrative:</strong> {{ $json.contraNarrative }}% | \n       <strong>Neutral:</strong> {{ $json.neutral }}%</p>\n  </div>\n\n  <!-- Sample Responses -->\n  <div style=\"background-color: #ffffff; border: 1px solid #dee2e6; border-radius: 4px; padding: 15px;\">\n    <h4 style=\"margin-top: 0; color: #495057;\">💬 Sample Responses</h4>\n    \n    {{\n      (() => {\n        const sampleResponses = $json.sampleResponses || [];\n        const notificationType = $json.notificationType;\n        \n        if (sampleResponses.length === 0) {\n          return '<p style=\"color: #6c757d; font-style: italic;\">No sample responses available.</p>';\n        }\n        \n        let sectionTitle = \"\";\n        let sectionColor = \"\";\n        \n        if (notificationType === 'pro-narrative') {\n          sectionTitle = \"🟢 Pro-Narrative Voices (A & B voters):\";\n          sectionColor = \"#d4edda\";\n        } else if (notificationType === 'contra-narrative') {\n          sectionTitle = \"🔴 Contra-Narrative Voices (D & E voters):\";\n          sectionColor = \"#f8d7da\";\n        } else {\n          sectionTitle = \"⚪ Mixed Responses:\";\n          sectionColor = \"#fff3cd\";\n        }\n        \n        let html = `<div style=\"background-color: ${sectionColor}; padding: 10px; border-radius: 4px; margin-bottom: 10px;\">\n          <strong>${sectionTitle}</strong>\n        </div>`;\n        \n        sampleResponses.forEach((response, index) => {\n          const optionLabel = {\n            'A': 'Much more interested',\n            'B': 'Somewhat more interested', \n            'C': 'No change',\n            'D': 'Somewhat less interested',\n            'E': 'Much less interested'\n          }[response.option] || response.option;\n          \n          html += `\n          <div style=\"border-left: 3px solid #007bff; padding: 10px; margin: 10px 0; background-color: #f8f9fa;\">\n            <p style=\"margin: 0 0 5px 0;\"><strong>Voter ${index + 1} (${response.option} - ${optionLabel}):</strong></p>\n            <p style=\"margin: 0; font-size: 14px; line-height: 1.4; color: #495057;\">\"${response.thinking}\"</p>\n          </div>`;\n        });\n        \n        return html;\n      })()\n    }}\n  </div>\n</div>\n\n<!-- Footer -->\n<div style=\"background-color: #f8f9fa; padding: 15px; border-radius: 8px; text-align: center; font-size: 12px; color: #6c757d;\">\n  <p style=\"margin: 0;\">\n    Powered by <a href=\"https://askrally.com/?utm_source=api&utm_medium=email&utm_campaign=narrative-alerts-n8n\" style=\"color: #007bff; text-decoration: none;\">AskRally.com</a>\n  </p>\n</div>\n\n</div>","options":{},"subject":"={{ $json.message }}"},"credentials":{"gmailOAuth2":{"id":"JFRMn1ji8imM26f4","name":"Gmail account"}},"typeVersion":2.1},{"id":"390bb7a2-3e59-4824-af8b-be188c49284d","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-60,-120],"parameters":{"width":800,"height":300,"content":"## Dedup + Extract content from RSS alert"},"typeVersion":1},{"id":"3a1c9b9b-192c-499a-be4a-0edaf4b6bf47","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[760,-120],"parameters":{"color":5,"width":720,"height":300,"content":"## Ask Rally"},"typeVersion":1},{"id":"c3d20aa4-83f8-4398-8537-9580450f8736","name":"analyze simulation results","type":"n8n-nodes-base.code","position":[1160,0],"parameters":{"mode":"runOnceForEachItem","jsCode":"// Process each Rally API response individually\nconst item = $input.item.json;\n\nlet voteCounts = { A: 0, B: 0, C: 0, D: 0, E: 0 };\nlet totalVoters = 0;\nlet responses = [];\n\ntry {\n  // The Rally API response is in 'responses' array\n  if (item.responses && Array.isArray(item.responses)) {\n    totalVoters = item.responses.length;\n    \n    for (const personaResponse of item.responses) {\n      try {\n        // Parse each persona's response\n        const data = JSON.parse(personaResponse.response);\n        const option = data.option;\n        \n        if (option && voteCounts.hasOwnProperty(option)) {\n          voteCounts[option]++;\n        }\n        \n        responses.push({\n          persona_id: personaResponse.persona_id,\n          option: option,\n          thinking: data.thinking || '',\n          thoughts: personaResponse.thoughts\n        });\n        \n      } catch (parseErr) {\n        console.log(`Error parsing persona ${personaResponse.persona_id} response:`, parseErr.message);\n      }\n    }\n  }\n} catch (err) {\n  console.log('Error processing Rally response:', err.message);\n}\n\n// Calculate percentages for this individual simulation\nconst percentages = {};\nfor (const opt of Object.keys(voteCounts)) {\n  percentages[opt] = totalVoters > 0\n    ? Math.round((voteCounts[opt] / totalVoters) * 100)\n    : 0;\n}\n\nconst proNarrative = percentages.A + percentages.B;\nconst contraNarrative = percentages.D + percentages.E;\nconst neutral = percentages.C;\n\n// Determine narrative type and select sample responses\nlet notificationType = '';\nlet sampleResponses = [];\n\nif (proNarrative >= 75) {\n  notificationType = 'pro-narrative';\n  // Get 5 random responses from A & B voters\n  const proResponses = responses.filter(r => ['A', 'B'].includes(r.option));\n  sampleResponses = proResponses.sort(() => 0.5 - Math.random()).slice(0, 5);\n} else if (contraNarrative >= 75) {\n  notificationType = 'contra-narrative';\n  // Get 5 random responses from D & E voters\n  const contraResponses = responses.filter(r => ['D', 'E'].includes(r.option));\n  sampleResponses = contraResponses.sort(() => 0.5 - Math.random()).slice(0, 5);\n} else {\n  notificationType = 'mixed';\n  // Get 5 random responses from all voters\n  sampleResponses = responses.sort(() => 0.5 - Math.random()).slice(0, 5);\n}\n\n// Return individual result for this RSS item\nreturn {\n  // Rally simulation metadata\n  session_id: item.session_id || '',\n  title: item.title || 'Interest in Synthetic Research Spending',\n  \n  // Rally simulation results\n  totalVoters,\n  voteCounts,\n  percentages,\n  proNarrative,\n  contraNarrative,\n  neutral,\n  responses,\n  summary: item.summary || '',\n  \n  // Pre-selected sample responses for email\n  sampleResponses,\n  notificationType,\n  \n  // Metadata\n  simulationId: item.session_id || `sim_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,\n  \n  // Debug info\n  debug: {\n    foundResponses: !!item.responses,\n    responseCount: item.responses ? item.responses.length : 0,\n    hasSessionId: !!item.session_id,\n    sampleResponsesCount: sampleResponses.length\n  }\n};"},"typeVersion":2},{"id":"a0620b7b-b18c-4568-aa67-6b6a180134a1","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[1500,-120],"parameters":{"color":6,"width":540,"height":300,"content":"## Send an Alert"},"typeVersion":1},{"id":"889d4d3d-3f57-44d8-82c9-87da3fcbd94e","name":"alert trigger","type":"n8n-nodes-base.code","position":[1580,0],"parameters":{"mode":"runOnceForEachItem","jsCode":"// Process each Rally API response individually\nconst item = $input.item.json;\n\n// The data is already processed - just extract what we need\nconst voteCounts = item.voteCounts || { A: 0, B: 0, C: 0, D: 0, E: 0 };\nconst totalVoters = item.totalVoters || 0;\nconst responses = item.responses || [];\n\n// Calculate percentages\nconst percentages = {};\nfor (const opt of Object.keys(voteCounts)) {\n  percentages[opt] = totalVoters > 0\n    ? Math.round((voteCounts[opt] / totalVoters) * 100)\n    : 0;\n}\n\n// Calculate narrative aggregates\nconst proNarrative = percentages.A + percentages.B;\nconst contraNarrative = percentages.D + percentages.E;\nconst neutral = percentages.C;\n\n// Determine notification type\nlet notificationType, message;\nif (proNarrative >= 75) {\n  notificationType = 'pro-narrative';\n  message = `🟢 Pro-Narrative Detected: ${proNarrative}% voted A+B ` +\n            `(${percentages.A}% A, ${percentages.B}% B)`;\n} else if (contraNarrative >= 75) {\n  notificationType = 'contra-narrative';\n  message = `🔴 Contra-Narrative Detected: ${contraNarrative}% voted D+E ` +\n            `(${percentages.D}% D, ${percentages.E}% E)`;\n} else {\n  notificationType = 'mixed';\n  message = `⚪ Mixed Response: Pro=${proNarrative}%, ` +\n            `Contra=${contraNarrative}%, Neutral=${neutral}%`;\n}\n\n// Select sample responses based on narrative type\nlet sampleResponses = [];\nif (responses.length > 0) {\n  let targetOptions = [];\n  \n  if (notificationType === 'pro-narrative') {\n    targetOptions = ['A', 'B'];\n  } else if (notificationType === 'contra-narrative') {\n    targetOptions = ['D', 'E'];\n  } else {\n    // For mixed, get a variety\n    targetOptions = ['A', 'B', 'C', 'D', 'E'];\n  }\n  \n  // Filter responses by target options and take up to 5\n  sampleResponses = responses\n    .filter(r => targetOptions.includes(r.option))\n    .slice(0, 5);\n}\n\n// Return the processed data\nreturn {\n  session_id: item.session_id,\n  title: item.title,\n  totalVoters,\n  voteCounts,\n  percentages,\n  proNarrative,\n  contraNarrative,\n  neutral,\n  responses,\n  summary: item.summary,\n  sampleResponses,\n  notificationType,\n  message,\n  simulationId: item.session_id,\n  shouldNotify: proNarrative >= 75 || contraNarrative >= 75,\n  debug: {\n    foundResponses: responses.length > 0,\n    responseCount: responses.length,\n    hasSessionId: !!item.session_id,\n    sampleResponsesCount: sampleResponses.length\n  }\n};"},"typeVersion":2},{"id":"8874bf82-4182-4846-ba83-77299a357323","name":"RSS Read","type":"n8n-nodes-base.rssFeedRead","position":[0,0],"parameters":{"url":"https://www.google.com/alerts/feeds/12254772602100657129/16808085471630190739","options":{}},"typeVersion":1.2},{"id":"63dcaba0-650d-42fb-b2c5-9ef9447e7f3a","name":"Schedule Trigger","type":"n8n-nodes-base.scheduleTrigger","position":[-260,0],"parameters":{"rule":{"interval":[{"field":"hours","hoursInterval":2}]}},"typeVersion":1.2},{"id":"a15c2ecb-a6bf-4546-b989-4edf480227f9","name":"Dedup + url extraction","type":"n8n-nodes-base.code","position":[200,0],"parameters":{"jsCode":"// Multi-item deduplication + URL extraction\nconst items = $input.all();\nconst hoursThreshold = 3; // Adjust as needed (24 hours = 1 day)\nconst now = new Date();\n\nconsole.log(`Processing ${items.length} RSS items for deduplication and URL extraction`);\n\nconst processedItems = items.filter((item, index) => {\n  try {\n    // First: Check age for deduplication\n    const pubDate = new Date(item.json.pubDate || item.json.isoDate);\n    const ageInHours = (now - pubDate) / (1000 * 60 * 60);\n    \n    console.log(`Item ${index}: \"${item.json.title}\" - Age: ${ageInHours.toFixed(1)} hours`);\n    \n    if (ageInHours <= hoursThreshold) {\n      console.log(`✅ Item ${index} passed filter (within ${hoursThreshold} hours)`);\n      return true;\n    } else {\n      console.log(`❌ Item ${index} filtered out (older than ${hoursThreshold} hours)`);\n      return false;\n    }\n  } catch (error) {\n    console.log(`⚠️ Error processing item ${index}:`, error.message);\n    return false;\n  }\n}).map(item => {\n  // Second: Extract clean URL for items that passed the filter\n  const originalUrl = item.json.link;\n  let cleanUrl = originalUrl;\n  \n  // Handle Google redirect URLs (from Google Alerts)\n  if (originalUrl && originalUrl.includes('google.com/url')) {\n    const match = originalUrl.match(/[&?]url=([^&]+)/);\n    if (match) {\n      try {\n        cleanUrl = decodeURIComponent(match[1]);\n        console.log(`🔗 URL extracted: ${originalUrl} → ${cleanUrl}`);\n      } catch (error) {\n        console.log('URL decode error:', error);\n        cleanUrl = originalUrl;\n      }\n    }\n  }\n  \n  // Return item with clean URL added\n  return {\n    json: {\n      ...item.json,\n      cleanUrl: cleanUrl\n    }\n  };\n});\n\nconsole.log(`Final result: ${processedItems.length} items processed with clean URLs`);\n\nreturn processedItems;"},"typeVersion":2},{"id":"bb7083f6-b6bd-45cb-ba85-9c45457d3af2","name":"Get Content","type":"n8n-nodes-base.httpRequest","position":[400,0],"parameters":{"url":"={{ \n  (() => {\n    const url = $json.link;\n    if (url.includes('google.com/url')) {\n      const match = url.match(/[&?]url=([^&]+)/);\n      return match ? decodeURIComponent(match[1]) : url;\n    }\n    return url;\n  })() \n}}","options":{}},"typeVersion":4.2}],"active":true,"settings":{"executionOrder":"v1"},"versionId":"78058eb2-dfaa-44bd-8a20-0906b547d699","connections":{"Code":{"main":[[{"node":"HTTP Request","type":"main","index":0}]]},"RSS Read":{"main":[[{"node":"Dedup + url extraction","type":"main","index":0}]]},"Get Content":{"main":[[{"node":"Code","type":"main","index":0}]]},"HTTP Request":{"main":[[{"node":"analyze simulation results","type":"main","index":0}]]},"alert trigger":{"main":[[{"node":"Gmail","type":"main","index":0}]]},"Schedule Trigger":{"main":[[{"node":"RSS Read","type":"main","index":0}]]},"Dedup + url extraction":{"main":[[{"node":"Get Content","type":"main","index":0}]]},"analyze simulation results":{"main":[[{"node":"alert trigger","type":"main","index":0}]]}}}


name: Let AI Agents handle issues with the Jira MCP Server 💪 all 20 operations
author_name: David Ashby
author_username: cfomodz
nodes_used: []
categories: []
created_at: 2025-06-24T21:39:24.980Z
updated_at: 2025-06-24T21:39:24.980Z
url: https://n8n.io/workflows/5237
scraped_at: 2025-07-06 21:16:30
description:
  🛠️ Jira Software Tool MCP Server

  Complete MCP server exposing all Jira Software Tool operations to AI agents. Zero configuration needed - all 20 operations pre-built.

  ⚡ Quick Setup

  Import this workflow into your n8n instance
  Activate the workflow to start your MCP server
  Copy the webhook URL from the MCP trigger node
  Connect AI agents using the MCP URL

  🔧 How it Works

  • MCP Trigger: Serves as your server endpoint for AI agent requests
  • Tool Nodes: Pre-configured for every Jira Software Tool operation
  • AI Expressions: Automatically populate parameters via $fromAI() placeholders
  • Native Integration: Uses official n8n Jira Software Tool tool with full error handling

  📋 Available Operations (20 total)

  Every possible Jira Software Tool operation is included:

  🐛 Issue (8 operations)

  • Get an issue changelog
  • Create an issue
  • Delete an issue
  • Get an issue
  • Get many issues
  • Create an email notification for an issue
  • Get the status of an issue
  • Update an issue

  🔧 Issueattachment (4 operations)

  • Add an attachment to an issue
  • Get an attachment from an issue
  • Get many issue attachments
  • Remove an attachment from an issue

  🔧 Issuecomment (5 operations)

  • Add a comment
  • Get a comment
  • Get many comments
  • Remove a comment
  • Update a comment

  👤 User (3 operations)

  • Create a user
  • Delete a user
  • Get a user

  🤖 AI Integration

  Parameter Handling: AI agents automatically provide values for:
  • Resource IDs and identifiers
  • Search queries and filters
  • Content and data payloads
  • Configuration options

  Response Format: Native Jira Software Tool API responses with full data structure

  Error Handling: Built-in n8n error management and retry logic

  💡 Usage Examples

  Connect this MCP server to any AI agent or workflow:

  • Claude Desktop: Add MCP server URL to configuration
  • Custom AI Apps: Use MCP URL as tool endpoint
  • Other n8n Workflows: Call MCP tools from any workflow
  • API Integration: Direct HTTP calls to MCP endpoints

  ✨ Benefits

  • Complete Coverage: Every Jira Software Tool operation available
  • Zero Setup: No parameter mapping or configuration needed
  • AI-Ready: Built-in $fromAI() expressions for all parameters
  • Production Ready: Native n8n error handling and logging
  • Extensible: Easily modify or add custom logic

  &gt; 🆓 Free for community use! Ready to deploy in under 2 minutes.

workflow_json:
  {"id":"4p1nfdzFh058aVGY","meta":null,"name":"Jira Software Tool MCP Server","tags":[],"nodes":[{"id":"e6ca66a3-450e-4b4b-b1fe-ef0ea24c9a82","name":"Workflow Overview 0","type":"n8n-nodes-base.stickyNote","position":[-1480,120],"parameters":{"content":""},"typeVersion":1},{"id":"5f0aba39-43c0-4921-b738-46b441bed533","name":"Jira Software Tool MCP Server","type":"@n8n/n8n-nodes-langchain.mcpTrigger","position":[-420,-100],"webhookId":"fc56fd9c-2e2f-4805-a34c-6a9d3479e004","parameters":{},"typeVersion":1},{"id":"75dedc2f-9a9b-4364-97ad-24509404c5af","name":"Get an issue changelog","type":"n8n-nodes-base.jiraTool","position":[-800,140],"parameters":{},"typeVersion":1},{"id":"b6b168c7-ab12-458b-8681-6518c6a57316","name":"Create an issue","type":"n8n-nodes-base.jiraTool","position":[-580,140],"parameters":{},"typeVersion":1},{"id":"34cf1e46-531c-44bb-a8de-9640560e5625","name":"Delete an issue","type":"n8n-nodes-base.jiraTool","position":[-360,140],"parameters":{},"typeVersion":1},{"id":"03aa300a-c729-4df4-8821-eef568627c01","name":"Get an issue","type":"n8n-nodes-base.jiraTool","position":[-140,140],"parameters":{},"typeVersion":1},{"id":"c4908193-c0c6-4722-8977-31a1b5ca3b86","name":"Get many issues","type":"n8n-nodes-base.jiraTool","position":[80,140],"parameters":{},"typeVersion":1},{"id":"c6bacc5b-5ad6-47c5-b471-6241ff362de0","name":"Create an email notification for an issue","type":"n8n-nodes-base.jiraTool","position":[300,140],"parameters":{},"typeVersion":1},{"id":"90ed8c42-3a64-47bc-96f7-31573f98b126","name":"Get the status of an issue","type":"n8n-nodes-base.jiraTool","position":[520,140],"parameters":{},"typeVersion":1},{"id":"a182388f-269a-4697-8006-65e289e91f1d","name":"Update an issue","type":"n8n-nodes-base.jiraTool","position":[740,140],"parameters":{},"typeVersion":1},{"id":"508c29fd-9a39-4202-a1bd-1bf5edd49f0f","name":"Sticky Note 1","type":"n8n-nodes-base.stickyNote","position":[-1000,120],"parameters":{"content":""},"typeVersion":1},{"id":"f8590715-533d-4af8-92e6-2bd55cf81288","name":"Add an attachment to an issue","type":"n8n-nodes-base.jiraTool","position":[-800,380],"parameters":{},"typeVersion":1},{"id":"b36a05b9-29ee-4647-acd8-9a16fd80f433","name":"Get an attachment from an issue","type":"n8n-nodes-base.jiraTool","position":[-580,380],"parameters":{},"typeVersion":1},{"id":"216ba7e1-8867-4892-a8cf-db6ef2bff22f","name":"Get many issue attachments","type":"n8n-nodes-base.jiraTool","position":[-360,380],"parameters":{},"typeVersion":1},{"id":"e9cb2776-ef21-4ea5-a951-8553a590748c","name":"Remove an attachment from an issue","type":"n8n-nodes-base.jiraTool","position":[-140,380],"parameters":{},"typeVersion":1},{"id":"70594f35-b0fc-46f4-a9c0-f3d12f9c294a","name":"Sticky Note 2","type":"n8n-nodes-base.stickyNote","position":[-1000,360],"parameters":{"content":""},"typeVersion":1},{"id":"a0028d86-635f-434c-af26-c19d4c91ddc5","name":"Add a comment","type":"n8n-nodes-base.jiraTool","position":[-800,620],"parameters":{},"typeVersion":1},{"id":"e14641da-26e5-40ec-854d-10ce34959685","name":"Get a comment","type":"n8n-nodes-base.jiraTool","position":[-580,620],"parameters":{},"typeVersion":1},{"id":"b00317b2-61db-4faa-bc4c-23cf5f1dce5b","name":"Get many comments","type":"n8n-nodes-base.jiraTool","position":[-360,620],"parameters":{},"typeVersion":1},{"id":"0b26be31-1f80-408a-b7c6-3acf9c968787","name":"Remove a comment","type":"n8n-nodes-base.jiraTool","position":[-140,620],"parameters":{},"typeVersion":1},{"id":"316c82b1-68bc-483e-b0a2-6bb6f7d7b190","name":"Update a comment","type":"n8n-nodes-base.jiraTool","position":[80,620],"parameters":{},"typeVersion":1},{"id":"b5d732ea-b3d8-49f0-b2d6-68acf776232c","name":"Sticky Note 3","type":"n8n-nodes-base.stickyNote","position":[-1000,600],"parameters":{"content":""},"typeVersion":1},{"id":"6a99739a-a770-4f87-8c44-6156074fbeac","name":"Create a user","type":"n8n-nodes-base.jiraTool","position":[-800,860],"parameters":{},"typeVersion":1},{"id":"174c90d1-b2f3-4c6e-9060-6d2f2cad85ce","name":"Delete a user","type":"n8n-nodes-base.jiraTool","position":[-580,860],"parameters":{},"typeVersion":1},{"id":"dde083c3-bafe-4649-be92-03a5c1352f99","name":"Get a user","type":"n8n-nodes-base.jiraTool","position":[-360,860],"parameters":{},"typeVersion":1},{"id":"57ac46fc-6adf-44eb-b814-e5e7996e3f4b","name":"Sticky Note 4","type":"n8n-nodes-base.stickyNote","position":[-1000,840],"parameters":{"content":""},"typeVersion":1}],"active":false,"shared":[{"role":"workflow:owner","project":{"id":"G5fce9xGuBAsWBXe","icon":null,"name":"David Ashby <david.ashby.lds@gmail.com>","type":"personal","createdAt":"2025-06-04T02:55:02.013Z","updatedAt":"2025-06-04T02:56:01.361Z","projectRelations":[{"role":"project:personalOwner","user":{"id":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","role":"global:owner","email":"david.ashby.lds@gmail.com","disabled":false,"lastName":"Ashby","settings":{"npsSurvey":{"responded":true,"lastShownAt":1749357655581},"userActivated":true,"userActivatedAt":1749075994495,"easyAIWorkflowOnboarded":true,"firstSuccessfulWorkflowId":"3N3vVikZb3MckFYm"},"createdAt":"2025-06-04T02:55:01.745Z","firstName":"David","isPending":false,"updatedAt":"2025-06-08T04:40:58.399Z","mfaEnabled":false,"personalizationAnswers":{"version":"v4","personalization_survey_n8n_version":"1.95.3","personalization_survey_submitted_at":"2025-06-04T02:56:07.075Z"}},"userId":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","createdAt":"2025-06-04T02:55:02.013Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-04T02:55:02.013Z"}]},"createdAt":"2025-06-24T21:38:18.119Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-24T21:38:18.119Z","workflowId":"4p1nfdzFh058aVGY"}],"settings":{"timezone":"America/New_York"},"createdAt":"2025-06-24T21:38:18.117Z","updatedAt":"2025-06-24T21:38:51.000Z","versionId":"9c29015c-6732-40b6-a8d0-7b14ec9e6b30","isArchived":false,"staticData":null,"connections":{"Get a user":{"ai_tool":[[{"node":"Jira Software Tool MCP Server","type":"ai_tool","index":0}]]},"Get an issue":{"ai_tool":[[{"node":"Jira Software Tool MCP Server","type":"ai_tool","index":0}]]},"Add a comment":{"ai_tool":[[{"node":"Jira Software Tool MCP Server","type":"ai_tool","index":0}]]},"Create a user":{"ai_tool":[[{"node":"Jira Software Tool MCP Server","type":"ai_tool","index":0}]]},"Delete a user":{"ai_tool":[[{"node":"Jira Software Tool MCP Server","type":"ai_tool","index":0}]]},"Get a comment":{"ai_tool":[[{"node":"Jira Software Tool MCP Server","type":"ai_tool","index":0}]]},"Create an issue":{"ai_tool":[[{"node":"Jira Software Tool MCP Server","type":"ai_tool","index":0}]]},"Delete an issue":{"ai_tool":[[{"node":"Jira Software Tool MCP Server","type":"ai_tool","index":0}]]},"Get many issues":{"ai_tool":[[{"node":"Jira Software Tool MCP Server","type":"ai_tool","index":0}]]},"Update an issue":{"ai_tool":[[{"node":"Jira Software Tool MCP Server","type":"ai_tool","index":0}]]},"Remove a comment":{"ai_tool":[[{"node":"Jira Software Tool MCP Server","type":"ai_tool","index":0}]]},"Update a comment":{"ai_tool":[[{"node":"Jira Software Tool MCP Server","type":"ai_tool","index":0}]]},"Get many comments":{"ai_tool":[[{"node":"Jira Software Tool MCP Server","type":"ai_tool","index":0}]]},"Get an issue changelog":{"ai_tool":[[{"node":"Jira Software Tool MCP Server","type":"ai_tool","index":0}]]},"Get many issue attachments":{"ai_tool":[[{"node":"Jira Software Tool MCP Server","type":"ai_tool","index":0}]]},"Get the status of an issue":{"ai_tool":[[{"node":"Jira Software Tool MCP Server","type":"ai_tool","index":0}]]},"Add an attachment to an issue":{"ai_tool":[[{"node":"Jira Software Tool MCP Server","type":"ai_tool","index":0}]]},"Get an attachment from an issue":{"ai_tool":[[{"node":"Jira Software Tool MCP Server","type":"ai_tool","index":0}]]},"Remove an attachment from an issue":{"ai_tool":[[{"node":"Jira Software Tool MCP Server","type":"ai_tool","index":0}]]},"Create an email notification for an issue":{"ai_tool":[[{"node":"Jira Software Tool MCP Server","type":"ai_tool","index":0}]]}},"triggerCount":0}


name: 🛠️ Jina AI Tool MCP Server 💪 all 3 operations
author_name: David Ashby
author_username: cfomodz
nodes_used: []
categories: []
created_at: 2025-06-24T21:40:45.534Z
updated_at: 2025-06-24T21:40:45.534Z
url: https://n8n.io/workflows/5238
scraped_at: 2025-07-06 21:16:30
description:
  🛠️ Jina AI Tool MCP Server

  Complete MCP server exposing all Jina AI Tool operations to AI agents. Zero configuration needed - all 3 operations pre-built.

  ⚡ Quick Setup

  Import this workflow into your n8n instance
  Activate the workflow to start your MCP server
  Copy the webhook URL from the MCP trigger node
  Connect AI agents using the MCP URL

  🔧 How it Works

  • MCP Trigger: Serves as your server endpoint for AI agent requests
  • Tool Nodes: Pre-configured for every Jina AI Tool operation
  • AI Expressions: Automatically populate parameters via $fromAI() placeholders
  • Native Integration: Uses official n8n Jina AI Tool tool with full error handling

  📋 Available Operations (3 total)

  Every possible Jina AI Tool operation is included:

  🔧 Reader (2 operations)

  • Read URL content
  • Search web

  🔧 Research (1 operations)

  • Perform deep research

  🤖 AI Integration

  Parameter Handling: AI agents automatically provide values for:
  • Resource IDs and identifiers
  • Search queries and filters
  • Content and data payloads
  • Configuration options

  Response Format: Native Jina AI Tool API responses with full data structure

  Error Handling: Built-in n8n error management and retry logic

  💡 Usage Examples

  Connect this MCP server to any AI agent or workflow:

  • Claude Desktop: Add MCP server URL to configuration
  • Custom AI Apps: Use MCP URL as tool endpoint
  • Other n8n Workflows: Call MCP tools from any workflow
  • API Integration: Direct HTTP calls to MCP endpoints

  ✨ Benefits

  • Complete Coverage: Every Jina AI Tool operation available
  • Zero Setup: No parameter mapping or configuration needed
  • AI-Ready: Built-in $fromAI() expressions for all parameters
  • Production Ready: Native n8n error handling and logging
  • Extensible: Easily modify or add custom logic

  🆓 Free for community use! Ready to deploy in under 2 minutes.

workflow_json:
  {"id":"jkPWz0xAzYudsxZn","meta":null,"name":"Jina AI Tool MCP Server","tags":[],"nodes":[{"id":"5ab6d59e-ae60-4820-b4c8-268e1f96d61e","name":"Workflow Overview 0","type":"n8n-nodes-base.stickyNote","position":[-1460,-160],"parameters":{"width":420,"height":800,"content":"## 🛠️ Jina AI Tool MCP Server\n\n### 📋 Available Operations (3 total)\n\n**Reader**: read, search\n**Research**: deep research\n\n### ⚙️ Setup Instructions\n\n1. **Import Workflow**: Load this workflow into your n8n instance\n\n1. **🔑 Add Credentials**: Configure Jina AI Tool authentication in one tool node then open and close all others.\n2. **🚀 Activate**: Enable this workflow to start your MCP server\n3. **🔗 Get URL**: Copy webhook URL from MCP trigger (right side)\n4. **🤖 Connect**: Use MCP URL in your AI agent configurations\n\n### ✨ Ready-to-Use Features\n\n• Zero configuration - all 3 operations pre-built\n• AI agents automatically populate parameters via `$fromAI()` expressions\n• Every resource and operation combination available\n• Native n8n error handling and response formatting\n• Modify parameter defaults in any tool node as needed\n\n### 💬 Need Help?\nCheck the [n8n documentation](https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.toolmcp/) or ping me on [discord](https://discord.me/cfomodz) for MCP integration guidance or customizations."},"typeVersion":1},{"id":"e91a6b66-f6ca-482c-ba5c-9e39427f387e","name":"Jina AI Tool MCP Server","type":"@n8n/n8n-nodes-langchain.mcpTrigger","position":[-640,-120],"webhookId":"a42c6d6a-6359-4bb9-989f-0d07ad047b62","parameters":{"path":"jina-ai-tool-mcp"},"typeVersion":1},{"id":"d210d1e9-5a5a-4f87-b797-04b4f8e4fbd5","name":"Read URL content","type":"n8n-nodes-base.jinaAiTool","position":[-800,140],"parameters":{"url":"={{ $fromAI('Url', ``, 'string') }}","options":{},"simplify":"={{ $fromAI('Simplify', ``, 'boolean') }}","requestOptions":{}},"credentials":{"jinaAiApi":{"id":"SET_YOUR_CREDENTIAL_ID_HERE","name":"Credential Name"}},"typeVersion":1},{"id":"3cedddc5-4ca2-4214-8fa7-84165c6b3ca2","name":"Search web","type":"n8n-nodes-base.jinaAiTool","position":[-580,140],"parameters":{"options":{},"simplify":"={{ $fromAI('Simplify', ``, 'boolean') }}","operation":"search","searchQuery":"={{ $fromAI('Search_Query', ``, 'string') }}","requestOptions":{}},"credentials":{"jinaAiApi":{"id":"SET_YOUR_CREDENTIAL_ID_HERE","name":"Credential Name"}},"typeVersion":1},{"id":"b5a366fe-e65b-4c13-a462-b0bd4f58edb2","name":"Sticky Note 1","type":"n8n-nodes-base.stickyNote","position":[-1000,120],"parameters":{"color":4,"width":620,"height":180,"content":"## Reader"},"typeVersion":1},{"id":"c50231d8-2c2a-44a2-8cf1-44c430b8c6ed","name":"Perform deep research","type":"n8n-nodes-base.jinaAiTool","position":[-800,380],"parameters":{"options":{},"resource":"research","simplify":"={{ $fromAI('Simplify', ``, 'boolean') }}","researchQuery":"={{ $fromAI('Research_Query', ``, 'string') }}","requestOptions":{}},"credentials":{"jinaAiApi":{"id":"SET_YOUR_CREDENTIAL_ID_HERE","name":"Credential Name"}},"typeVersion":1},{"id":"48f7c177-d67e-4d51-8f62-e0f116e3a876","name":"Sticky Note 2","type":"n8n-nodes-base.stickyNote","position":[-1000,360],"parameters":{"color":5,"width":400,"height":180,"content":"## Research"},"typeVersion":1}],"active":false,"shared":[{"role":"workflow:owner","project":{"id":"G5fce9xGuBAsWBXe","icon":null,"name":"David Ashby <david.ashby.lds@gmail.com>","type":"personal","createdAt":"2025-06-04T02:55:02.013Z","updatedAt":"2025-06-04T02:56:01.361Z","projectRelations":[{"role":"project:personalOwner","user":{"id":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","role":"global:owner","email":"david.ashby.lds@gmail.com","disabled":false,"lastName":"Ashby","settings":{"npsSurvey":{"responded":true,"lastShownAt":1749357655581},"userActivated":true,"userActivatedAt":1749075994495,"easyAIWorkflowOnboarded":true,"firstSuccessfulWorkflowId":"3N3vVikZb3MckFYm"},"createdAt":"2025-06-04T02:55:01.745Z","firstName":"David","isPending":false,"updatedAt":"2025-06-08T04:40:58.399Z","mfaEnabled":false,"personalizationAnswers":{"version":"v4","personalization_survey_n8n_version":"1.95.3","personalization_survey_submitted_at":"2025-06-04T02:56:07.075Z"}},"userId":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","createdAt":"2025-06-04T02:55:02.013Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-04T02:55:02.013Z"}]},"createdAt":"2025-06-24T21:39:51.737Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-24T21:39:51.737Z","workflowId":"jkPWz0xAzYudsxZn"}],"settings":{"timezone":"America/New_York"},"createdAt":"2025-06-24T21:39:51.735Z","updatedAt":"2025-06-24T21:40:36.000Z","versionId":"02a748f3-dab8-4448-a09d-080470d0b791","isArchived":false,"staticData":null,"connections":{"Search web":{"ai_tool":[[{"node":"Jina AI Tool MCP Server","type":"ai_tool","index":0}]]},"Read URL content":{"ai_tool":[[{"node":"Jina AI Tool MCP Server","type":"ai_tool","index":0}]]},"Perform deep research":{"ai_tool":[[{"node":"Jina AI Tool MCP Server","type":"ai_tool","index":0}]]}},"triggerCount":0}


name: 🛠️ Harvest Tool MCP Server 💪 all 51 operations
author_name: David Ashby
author_username: cfomodz
nodes_used: []
categories: []
created_at: 2025-06-24T21:51:44.002Z
updated_at: 2025-06-24T21:51:44.002Z
url: https://n8n.io/workflows/5242
scraped_at: 2025-07-06 21:16:30
description:
  🛠️ Harvest Tool MCP Server

  Complete MCP server exposing all Harvest Tool operations to AI agents. Zero configuration needed - all 51 operations pre-built.

  ⚡ Quick Setup

  Import this workflow into your n8n instance
  Activate the workflow to start your MCP server
  Copy the webhook URL from the MCP trigger node
  Connect AI agents using the MCP URL

  🔧 How it Works

  • MCP Trigger: Serves as your server endpoint for AI agent requests
  • Tool Nodes: Pre-configured for every Harvest Tool operation
  • AI Expressions: Automatically populate parameters via $fromAI() placeholders
  • Native Integration: Uses official n8n Harvest Tool tool with full error handling

  📋 Available Operations (51 total)

  Every possible Harvest Tool operation is included:

  🔧 Client (5 operations)

  • Create a client
  • Delete a client
  • Get data of a client
  • Get data of all clients
  • Update a client

  🔧 Company (1 operations)

  • Retrieve the company for the currently authenticated user

  📇 Contact (5 operations)

  • Create a contact
  • Delete a contact
  • Get data of a contact
  • Get data of all contacts
  • Update a contact

  🔧 Estimate (5 operations)

  • Create an estimate
  • Delete an estimate
  • Get data of an estimate
  • Get data of all estimates
  • Update an estimate

  🔧 Expense (5 operations)

  • Create an expense
  • Delete an expense
  • Get data of an expense
  • Get data of all expenses
  • Update an expense

  🔧 Invoice (5 operations)

  • Create an invoice
  • Delete an invoice
  • Get data of an invoice
  • Get data of all invoices
  • Update an invoice

  🔧 Project (5 operations)

  • Create a project
  • Delete a project
  • Get data of a project
  • Get data of all projects
  • Update a project

  🔧 Task (5 operations)

  • Create a task
  • Delete a task
  • Get data of a task
  • Get data of all tasks
  • Update a task

  🔧 Timeentry (9 operations)

  • Create a time entry via duration
  • Create a time entry via start and end time
  • Delete a time entry
  • Delete a time entry’s external reference
  • Get data of a time entry
  • Get data of all time entries
  • Restart a time entry
  • Stop a time entry
  • Update a time entry

  👤 User (6 operations)

  • Create a user
  • Delete a user
  • Get data of a user
  • Get data of all users
  • Get data of authenticated user
  • Update a user

  🤖 AI Integration

  Parameter Handling: AI agents automatically provide values for:
  • Resource IDs and identifiers
  • Search queries and filters
  • Content and data payloads
  • Configuration options

  Response Format: Native Harvest Tool API responses with full data structure

  Error Handling: Built-in n8n error management and retry logic

  💡 Usage Examples

  Connect this MCP server to any AI agent or workflow:

  • Claude Desktop: Add MCP server URL to configuration
  • Custom AI Apps: Use MCP URL as tool endpoint
  • Other n8n Workflows: Call MCP tools from any workflow
  • API Integration: Direct HTTP calls to MCP endpoints

  ✨ Benefits

  • Complete Coverage: Every Harvest Tool operation available
  • Zero Setup: No parameter mapping or configuration needed
  • AI-Ready: Built-in $fromAI() expressions for all parameters
  • Production Ready: Native n8n error handling and logging
  • Extensible: Easily modify or add custom logic

  &gt; 🆓 Free for community use! Ready to deploy in under 2 minutes.

workflow_json:
  {"id":"eMuVlpWBWl6RdjqF","meta":null,"name":"Harvest Tool MCP Server","tags":[],"nodes":[{"id":"b3d5094b-9036-46aa-b818-fe72422d7134","name":"Workflow Overview 0","type":"n8n-nodes-base.stickyNote","position":[-1480,80],"parameters":{"content":""},"typeVersion":1},{"id":"dec278a3-0561-4478-8d00-26482c7dcaf1","name":"Harvest Tool MCP Server","type":"@n8n/n8n-nodes-langchain.mcpTrigger","position":[-420,80],"webhookId":"80f8e84d-8ffc-4d53-9f93-8d4bdc6bfb83","parameters":{},"typeVersion":1},{"id":"00514a61-08d4-4440-84a2-5b2f0356e53f","name":"Create a client","type":"n8n-nodes-base.harvestTool","position":[-800,360],"parameters":{},"typeVersion":1},{"id":"cc7047e5-3732-44a9-9d09-4bf490d6499c","name":"Delete a client","type":"n8n-nodes-base.harvestTool","position":[-580,360],"parameters":{},"typeVersion":1},{"id":"6e0a9443-ec36-4b26-8147-0f999921f71d","name":"Get data of a client","type":"n8n-nodes-base.harvestTool","position":[-360,360],"parameters":{},"typeVersion":1},{"id":"8cae8628-23bd-4a3c-a577-335f57800b40","name":"Get data of all clients","type":"n8n-nodes-base.harvestTool","position":[-140,360],"parameters":{},"typeVersion":1},{"id":"aec0017e-30df-4933-b30f-e48368098ed3","name":"Update a client","type":"n8n-nodes-base.harvestTool","position":[80,360],"parameters":{},"typeVersion":1},{"id":"d7e8e0e9-4bcb-4e23-8dc0-6f28b0f355a2","name":"Sticky Note 1","type":"n8n-nodes-base.stickyNote","position":[-1000,340],"parameters":{"content":""},"typeVersion":1},{"id":"55080026-cca5-4816-bdc6-7947ba8fd020","name":"Retrieve the company for the currently authenticated user","type":"n8n-nodes-base.harvestTool","position":[-800,100],"parameters":{},"typeVersion":1},{"id":"7f37c01e-41cb-4623-a47b-029fc9c792a8","name":"Sticky Note 2","type":"n8n-nodes-base.stickyNote","position":[-1000,80],"parameters":{"content":""},"typeVersion":1},{"id":"33e721db-11b7-4017-9163-394f9545c734","name":"Create a contact","type":"n8n-nodes-base.harvestTool","position":[-800,620],"parameters":{},"typeVersion":1},{"id":"7bdadcc7-c951-4bc3-82a5-b8f18314f9cd","name":"Delete a contact","type":"n8n-nodes-base.harvestTool","position":[-580,620],"parameters":{},"typeVersion":1},{"id":"50641c50-7377-441d-ad9f-38b6f7013a5f","name":"Get data of a contact","type":"n8n-nodes-base.harvestTool","position":[-360,620],"parameters":{},"typeVersion":1},{"id":"69c97985-daf4-44e8-ba44-7e4b4caea696","name":"Get data of all contacts","type":"n8n-nodes-base.harvestTool","position":[-140,620],"parameters":{},"typeVersion":1},{"id":"8f4143a1-14b6-4a13-b466-497ce5dc7758","name":"Update a contact","type":"n8n-nodes-base.harvestTool","position":[80,620],"parameters":{},"typeVersion":1},{"id":"7367ef16-0fdc-458d-bf3a-14fd64540d16","name":"Sticky Note 3","type":"n8n-nodes-base.stickyNote","position":[-1000,600],"parameters":{"content":""},"typeVersion":1},{"id":"6cf973a1-2dff-4e52-8718-a148585a6718","name":"Create an estimate","type":"n8n-nodes-base.harvestTool","position":[-800,860],"parameters":{},"typeVersion":1},{"id":"a3fe945c-d13f-42cc-b73c-18c124908214","name":"Delete an estimate","type":"n8n-nodes-base.harvestTool","position":[-580,860],"parameters":{},"typeVersion":1},{"id":"60b29941-fb77-40d2-a226-1b7bd4b55b00","name":"Get data of an estimate","type":"n8n-nodes-base.harvestTool","position":[-360,860],"parameters":{},"typeVersion":1},{"id":"b38ed1df-1748-4c00-86d0-5b68904e3714","name":"Get data of all estimates","type":"n8n-nodes-base.harvestTool","position":[-140,860],"parameters":{},"typeVersion":1},{"id":"5d2ea657-7896-437d-86da-62c1fb03283b","name":"Update an estimate","type":"n8n-nodes-base.harvestTool","position":[80,860],"parameters":{},"typeVersion":1},{"id":"35dee765-b6eb-4d70-9236-ee8e9ca3eb58","name":"Sticky Note 4","type":"n8n-nodes-base.stickyNote","position":[-1000,840],"parameters":{"content":""},"typeVersion":1},{"id":"b4607f76-7fa9-4a03-b027-a07fac7ee54d","name":"Create an expense","type":"n8n-nodes-base.harvestTool","position":[-800,1100],"parameters":{},"typeVersion":1},{"id":"42df28f0-a4a0-458c-b27d-5bed32e45c23","name":"Delete an expense","type":"n8n-nodes-base.harvestTool","position":[-580,1100],"parameters":{},"typeVersion":1},{"id":"5b093d84-0de9-47a6-b666-8330690ae7ca","name":"Get data of an expense","type":"n8n-nodes-base.harvestTool","position":[-360,1100],"parameters":{},"typeVersion":1},{"id":"433e604c-a455-4361-a483-587a7c2fc36a","name":"Get data of all expenses","type":"n8n-nodes-base.harvestTool","position":[-140,1100],"parameters":{},"typeVersion":1},{"id":"0a1772f9-36b2-4904-beff-4a7ab0be904d","name":"Update an expense","type":"n8n-nodes-base.harvestTool","position":[80,1100],"parameters":{},"typeVersion":1},{"id":"43aba88c-0e45-47ca-96c6-8f7e78917797","name":"Sticky Note 5","type":"n8n-nodes-base.stickyNote","position":[-1000,1080],"parameters":{"content":""},"typeVersion":1},{"id":"4818bf85-a630-454a-9985-b2e31078511c","name":"Create an invoice","type":"n8n-nodes-base.harvestTool","position":[-800,1340],"parameters":{},"typeVersion":1},{"id":"6799dc1f-8f86-4dfc-896b-226884c20dac","name":"Delete an invoice","type":"n8n-nodes-base.harvestTool","position":[-580,1340],"parameters":{},"typeVersion":1},{"id":"f62d121e-470d-4acf-b03e-fee7779f7296","name":"Get data of an invoice","type":"n8n-nodes-base.harvestTool","position":[-360,1340],"parameters":{},"typeVersion":1},{"id":"173f0059-847f-4400-924a-de4f640765ac","name":"Get data of all invoices","type":"n8n-nodes-base.harvestTool","position":[-140,1340],"parameters":{},"typeVersion":1},{"id":"dd9a611e-9dc5-4acb-8513-f4f4df90907c","name":"Update an invoice","type":"n8n-nodes-base.harvestTool","position":[80,1340],"parameters":{},"typeVersion":1},{"id":"31fd8775-4e94-42a0-8bbf-c09bba7a16c4","name":"Sticky Note 6","type":"n8n-nodes-base.stickyNote","position":[-1000,1320],"parameters":{"content":""},"typeVersion":1},{"id":"9f9c6332-2092-4523-9b57-f679e9a0a03b","name":"Create a project","type":"n8n-nodes-base.harvestTool","position":[-800,1580],"parameters":{},"typeVersion":1},{"id":"560c9862-1ab3-4c11-adee-0b452d104b5c","name":"Delete a project","type":"n8n-nodes-base.harvestTool","position":[-580,1580],"parameters":{},"typeVersion":1},{"id":"68f61e3a-63a6-44ba-be90-1f57d58e732c","name":"Get data of a project","type":"n8n-nodes-base.harvestTool","position":[-360,1580],"parameters":{},"typeVersion":1},{"id":"64ee3964-8af9-4be5-9f19-1c9bf241e337","name":"Get data of all projects","type":"n8n-nodes-base.harvestTool","position":[-140,1580],"parameters":{},"typeVersion":1},{"id":"c96d2078-2ed4-44c6-b97f-e62e255936ef","name":"Update a project","type":"n8n-nodes-base.harvestTool","position":[80,1580],"parameters":{},"typeVersion":1},{"id":"4a3c430c-9064-4aaf-a42a-4ea7f88de7eb","name":"Sticky Note 7","type":"n8n-nodes-base.stickyNote","position":[-1000,1560],"parameters":{"content":""},"typeVersion":1},{"id":"11ff2ec7-579b-4a9d-88ae-565768303b91","name":"Create a task","type":"n8n-nodes-base.harvestTool","position":[-800,1820],"parameters":{},"typeVersion":1},{"id":"b4ba4e1c-a5ea-45a9-a4ca-f2a13887349c","name":"Delete a task","type":"n8n-nodes-base.harvestTool","position":[-580,1820],"parameters":{},"typeVersion":1},{"id":"f7a0db27-9dd6-4750-bd85-50f2fca771cb","name":"Get data of a task","type":"n8n-nodes-base.harvestTool","position":[-360,1820],"parameters":{},"typeVersion":1},{"id":"9a1019fa-4e56-4191-a664-0fbb215380f1","name":"Get data of all tasks","type":"n8n-nodes-base.harvestTool","position":[-140,1820],"parameters":{},"typeVersion":1},{"id":"951b1002-43cc-4792-9cae-8a357fa66a27","name":"Update a task","type":"n8n-nodes-base.harvestTool","position":[80,1820],"parameters":{},"typeVersion":1},{"id":"8ce66fa8-14ed-4ad5-84f2-798046e0ed2c","name":"Sticky Note 8","type":"n8n-nodes-base.stickyNote","position":[-1000,1800],"parameters":{"content":""},"typeVersion":1},{"id":"e81ae3f8-27d9-42d3-8d83-4eddc1b7688f","name":"Create a time entry via duration","type":"n8n-nodes-base.harvestTool","position":[-800,2060],"parameters":{},"typeVersion":1},{"id":"cfe158c0-c034-4a2c-a5c8-76cbb411c378","name":"Create a time entry via start and end time","type":"n8n-nodes-base.harvestTool","position":[-580,2060],"parameters":{},"typeVersion":1},{"id":"4f6fac29-a5e0-4601-be80-2bed9f1904db","name":"Delete a time entry","type":"n8n-nodes-base.harvestTool","position":[-360,2060],"parameters":{},"typeVersion":1},{"id":"c64e7330-71f2-4c6a-8ea8-cc200d70c9f3","name":"Delete a time entry’s external reference","type":"n8n-nodes-base.harvestTool","position":[-140,2060],"parameters":{},"typeVersion":1},{"id":"e7d2c43b-4de1-4e01-a5f4-397474e2a4b6","name":"Get data of a time entry","type":"n8n-nodes-base.harvestTool","position":[80,2060],"parameters":{},"typeVersion":1},{"id":"91b82b17-9ba4-4bfe-a9d0-1a48442df886","name":"Get data of all time entries","type":"n8n-nodes-base.harvestTool","position":[300,2060],"parameters":{},"typeVersion":1},{"id":"f7e62a34-f5fa-46de-b3e2-7eda2c9992ce","name":"Restart a time entry","type":"n8n-nodes-base.harvestTool","position":[520,2060],"parameters":{},"typeVersion":1},{"id":"8ce2204c-b80b-4102-9c5d-c640cd7a5cf7","name":"Stop a time entry","type":"n8n-nodes-base.harvestTool","position":[740,2060],"parameters":{},"typeVersion":1},{"id":"a4b43943-f2a2-4039-8bc3-afe020cece27","name":"Update a time entry","type":"n8n-nodes-base.harvestTool","position":[960,2060],"parameters":{},"typeVersion":1},{"id":"125f9fc3-89fa-4fcd-9985-2164d3bd0f3f","name":"Sticky Note 9","type":"n8n-nodes-base.stickyNote","position":[-1000,2040],"parameters":{"content":""},"typeVersion":1},{"id":"20dc4a7a-be48-49c3-8725-b85cac6e4a2e","name":"Create a user","type":"n8n-nodes-base.harvestTool","position":[-800,2300],"parameters":{},"typeVersion":1},{"id":"88c43289-c0b1-44cc-aba4-d45932ec6e96","name":"Delete a user","type":"n8n-nodes-base.harvestTool","position":[-580,2300],"parameters":{},"typeVersion":1},{"id":"1e1f0875-fe1f-4160-ab8b-1cbf6fc96b02","name":"Get data of a user","type":"n8n-nodes-base.harvestTool","position":[-360,2300],"parameters":{},"typeVersion":1},{"id":"d893fd3e-c94f-4d64-9cae-afc7c07f3b92","name":"Get data of all users","type":"n8n-nodes-base.harvestTool","position":[-140,2300],"parameters":{},"typeVersion":1},{"id":"1e2b6927-068a-4bf7-862e-2082ed6f37a1","name":"Get data of authenticated user","type":"n8n-nodes-base.harvestTool","position":[80,2300],"parameters":{},"typeVersion":1},{"id":"0bce64c6-7c22-4e68-9dab-b52d2eaf8b1d","name":"Update a user","type":"n8n-nodes-base.harvestTool","position":[300,2300],"parameters":{},"typeVersion":1},{"id":"03df9dfd-99cf-40b5-883e-0e42602d43d1","name":"Sticky Note 10","type":"n8n-nodes-base.stickyNote","position":[-1000,2280],"parameters":{"content":""},"typeVersion":1}],"active":false,"shared":[{"role":"workflow:owner","project":{"id":"G5fce9xGuBAsWBXe","icon":null,"name":"David Ashby <david.ashby.lds@gmail.com>","type":"personal","createdAt":"2025-06-04T02:55:02.013Z","updatedAt":"2025-06-04T02:56:01.361Z","projectRelations":[{"role":"project:personalOwner","user":{"id":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","role":"global:owner","email":"david.ashby.lds@gmail.com","disabled":false,"lastName":"Ashby","settings":{"npsSurvey":{"responded":true,"lastShownAt":1749357655581},"userActivated":true,"userActivatedAt":1749075994495,"easyAIWorkflowOnboarded":true,"firstSuccessfulWorkflowId":"3N3vVikZb3MckFYm"},"createdAt":"2025-06-04T02:55:01.745Z","firstName":"David","isPending":false,"updatedAt":"2025-06-08T04:40:58.399Z","mfaEnabled":false,"personalizationAnswers":{"version":"v4","personalization_survey_n8n_version":"1.95.3","personalization_survey_submitted_at":"2025-06-04T02:56:07.075Z"}},"userId":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","createdAt":"2025-06-04T02:55:02.013Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-04T02:55:02.013Z"}]},"createdAt":"2025-06-24T21:48:25.707Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-24T21:48:25.707Z","workflowId":"eMuVlpWBWl6RdjqF"}],"settings":{"timezone":"America/New_York"},"createdAt":"2025-06-24T21:48:25.706Z","updatedAt":"2025-06-24T21:49:52.000Z","versionId":"d1618a97-1671-4159-9d9a-a553c20d96bf","isArchived":false,"staticData":null,"connections":{"Create a task":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Create a user":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Delete a task":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Delete a user":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Update a task":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Update a user":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Create a client":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Delete a client":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Update a client":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Create a contact":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Create a project":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Delete a contact":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Delete a project":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Update a contact":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Update a project":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Create an expense":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Create an invoice":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Delete an expense":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Delete an invoice":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Stop a time entry":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Update an expense":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Update an invoice":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Create an estimate":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Delete an estimate":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Get data of a task":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Get data of a user":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Update an estimate":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Delete a time entry":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Update a time entry":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Get data of a client":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Restart a time entry":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Get data of a contact":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Get data of a project":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Get data of all tasks":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Get data of all users":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Get data of an expense":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Get data of an invoice":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Get data of all clients":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Get data of an estimate":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Get data of a time entry":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Get data of all contacts":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Get data of all expenses":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Get data of all invoices":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Get data of all projects":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Get data of all estimates":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Get data of all time entries":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Get data of authenticated user":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Create a time entry via duration":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Create a time entry via start and end time":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Delete a time entry’s external reference":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]},"Retrieve the company for the currently authenticated user":{"ai_tool":[[{"node":"Harvest Tool MCP Server","type":"ai_tool","index":0}]]}},"triggerCount":0}


name: 🛠️ Hacker News Tool MCP Server
author_name: David Ashby
author_username: cfomodz
nodes_used: []
categories: []
created_at: 2025-06-24T21:55:59.438Z
updated_at: 2025-06-24T21:55:59.438Z
url: https://n8n.io/workflows/5244
scraped_at: 2025-07-06 21:16:30
description:
  🛠️ Hacker News Tool MCP Server

  Complete MCP server exposing all Hacker News Tool operations to AI agents. Zero configuration needed - all 3 operations pre-built.

  ⚡ Quick Setup

  Import this workflow into your n8n instance
  Activate the workflow to start your MCP server
  Copy the webhook URL from the MCP trigger node
  Connect AI agents using the MCP URL

  🔧 How it Works

  • MCP Trigger: Serves as your server endpoint for AI agent requests
  • Tool Nodes: Pre-configured for every Hacker News Tool operation
  • AI Expressions: Automatically populate parameters via $fromAI() placeholders
  • Native Integration: Uses official n8n Hacker News Tool tool with full error handling

  📋 Available Operations (3 total)

  Every possible Hacker News Tool operation is included:

  🔧 All (1 operations)

  • Get many items

  🔧 Article (1 operations)

  • Get an article

  👤 User (1 operations)

  • Get a user

  🤖 AI Integration

  Parameter Handling: AI agents automatically provide values for:
  • Resource IDs and identifiers
  • Search queries and filters
  • Content and data payloads
  • Configuration options

  Response Format: Native Hacker News Tool API responses with full data structure

  Error Handling: Built-in n8n error management and retry logic

  💡 Usage Examples

  Connect this MCP server to any AI agent or workflow:

  • Claude Desktop: Add MCP server URL to configuration
  • Custom AI Apps: Use MCP URL as tool endpoint
  • Other n8n Workflows: Call MCP tools from any workflow
  • API Integration: Direct HTTP calls to MCP endpoints

  ✨ Benefits

  • Complete Coverage: Every Hacker News Tool operation available
  • Zero Setup: No parameter mapping or configuration needed
  • AI-Ready: Built-in $fromAI() expressions for all parameters
  • Production Ready: Native n8n error handling and logging
  • Extensible: Easily modify or add custom logic

  &gt; 🆓 Free for community use! Ready to deploy in under 2 minutes.

workflow_json:
  {"id":"j3lGzG1i2stMiy3P","meta":null,"name":"Hacker News Tool MCP Server","tags":[],"nodes":[{"id":"308e7b8b-9a55-4f8c-86fe-67acfdc44501","name":"Workflow Overview 0","type":"n8n-nodes-base.stickyNote","position":[-1460,0],"parameters":{"width":420,"height":780,"content":"## 🛠️ Hacker News Tool MCP Server\n\n### 📋 Available Operations (3 total)\n\n**All**: get all\n**Article**: get\n**User**: get\n\n### ⚙️ Setup Instructions\n\n1. **Import Workflow**: Load this workflow into your n8n instance\n\n1. **✅ No Auth Required**: Ready to use immediately\n2. **🚀 Activate**: Enable this workflow to start your MCP server\n3. **🔗 Get URL**: Copy webhook URL from MCP trigger (right side)\n4. **🤖 Connect**: Use MCP URL in your AI agent configurations\n\n### ✨ Ready-to-Use Features\n\n• Zero configuration - all 3 operations pre-built\n• AI agents automatically populate parameters via `$fromAI()` expressions\n• Every resource and operation combination available\n• Native n8n error handling and response formatting\n• Modify parameter defaults in any tool node as needed\n\n### 💬 Need Help?\nCheck the [n8n documentation](https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.toolmcp/) or ping me on [discord](https://discord.me/cfomodz) for MCP integration guidance or customizations."},"typeVersion":1},{"id":"e0fa03aa-3ce8-40bd-821e-75b64ec52f55","name":"Hacker News Tool MCP Server","type":"@n8n/n8n-nodes-langchain.mcpTrigger","position":[-700,-20],"webhookId":"87047423-370a-43f4-92e1-26b83daa0cc8","parameters":{"path":"hacker-news-tool-mcp"},"typeVersion":1},{"id":"42339d85-3ebe-4613-a948-ba6ab2896571","name":"Get many items","type":"n8n-nodes-base.hackerNewsTool","position":[-800,140],"parameters":{"limit":"={{ $fromAI('Limit', ``, 'number') }}","resource":"all","returnAll":"={{ $fromAI('Return_All', ``, 'boolean') }}","additionalFields":{}},"typeVersion":1},{"id":"69349c27-411d-4c71-8eee-b0792a096fe2","name":"Sticky Note 1","type":"n8n-nodes-base.stickyNote","position":[-1000,120],"parameters":{"color":4,"width":400,"height":180,"content":"## All"},"typeVersion":1},{"id":"f24e8a5c-b66c-477c-b764-2cad8bd0148e","name":"Get an article","type":"n8n-nodes-base.hackerNewsTool","position":[-800,380],"parameters":{"articleId":"={{ $fromAI('Article_Id', ``, 'string') }}","additionalFields":{}},"typeVersion":1},{"id":"6a8cae55-5c61-42ce-a542-c24f22ae23e9","name":"Sticky Note 2","type":"n8n-nodes-base.stickyNote","position":[-1000,360],"parameters":{"color":5,"width":400,"height":180,"content":"## Article"},"typeVersion":1},{"id":"c7543fc5-3862-455e-ade7-d7fa2b3da723","name":"Get a user","type":"n8n-nodes-base.hackerNewsTool","position":[-800,620],"parameters":{"resource":"user","username":"={{ $fromAI('Username', ``, 'string') }}"},"typeVersion":1},{"id":"bffef4b5-06ec-40a2-9fcc-d094ebf4e19b","name":"Sticky Note 3","type":"n8n-nodes-base.stickyNote","position":[-1000,600],"parameters":{"color":6,"width":400,"height":180,"content":"## User"},"typeVersion":1}],"active":false,"shared":[{"role":"workflow:owner","project":{"id":"G5fce9xGuBAsWBXe","icon":null,"name":"David Ashby <david.ashby.lds@gmail.com>","type":"personal","createdAt":"2025-06-04T02:55:02.013Z","updatedAt":"2025-06-04T02:56:01.361Z","projectRelations":[{"role":"project:personalOwner","user":{"id":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","role":"global:owner","email":"david.ashby.lds@gmail.com","disabled":false,"lastName":"Ashby","settings":{"npsSurvey":{"responded":true,"lastShownAt":1749357655581},"userActivated":true,"userActivatedAt":1749075994495,"easyAIWorkflowOnboarded":true,"firstSuccessfulWorkflowId":"3N3vVikZb3MckFYm"},"createdAt":"2025-06-04T02:55:01.745Z","firstName":"David","isPending":false,"updatedAt":"2025-06-08T04:40:58.399Z","mfaEnabled":false,"personalizationAnswers":{"version":"v4","personalization_survey_n8n_version":"1.95.3","personalization_survey_submitted_at":"2025-06-04T02:56:07.075Z"}},"userId":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","createdAt":"2025-06-04T02:55:02.013Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-04T02:55:02.013Z"}]},"createdAt":"2025-06-24T21:55:32.153Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-24T21:55:32.153Z","workflowId":"j3lGzG1i2stMiy3P"}],"settings":{"timezone":"America/New_York"},"createdAt":"2025-06-24T21:55:32.149Z","updatedAt":"2025-06-24T21:55:51.000Z","versionId":"98ce78b1-07b2-431c-9a22-c4b7207e1be7","isArchived":false,"staticData":null,"connections":{"Get a user":{"ai_tool":[[{"node":"Hacker News Tool MCP Server","type":"ai_tool","index":0}]]},"Get an article":{"ai_tool":[[{"node":"Hacker News Tool MCP Server","type":"ai_tool","index":0}]]},"Get many items":{"ai_tool":[[{"node":"Hacker News Tool MCP Server","type":"ai_tool","index":0}]]}},"triggerCount":0}


name: 🛠️ Grafana Tool MCP Server 💪 all 16 operations
author_name: David Ashby
author_username: cfomodz
nodes_used: []
categories: []
created_at: 2025-06-24T21:58:43.453Z
updated_at: 2025-06-24T21:58:43.453Z
url: https://n8n.io/workflows/5245
scraped_at: 2025-07-06 21:16:30
description:
  🛠️ Grafana Tool MCP Server

  Complete MCP server exposing all Grafana Tool operations to AI agents. Zero configuration needed - all 16 operations pre-built.

  ⚡ Quick Setup

  Import this workflow into your n8n instance
  Activate the workflow to start your MCP server
  Copy the webhook URL from the MCP trigger node
  Connect AI agents using the MCP URL

  🔧 How it Works

  • MCP Trigger: Serves as your server endpoint for AI agent requests
  • Tool Nodes: Pre-configured for every Grafana Tool operation
  • AI Expressions: Automatically populate parameters via $fromAI() placeholders
  • Native Integration: Uses official n8n Grafana Tool tool with full error handling

  📋 Available Operations (16 total)

  Every possible Grafana Tool operation is included:

  🔧 Dashboard (5 operations)

  • Create a dashboard
  • Delete a dashboard
  • Get a dashboard
  • Get many dashboards
  • Update a dashboard

  🔧 Team (5 operations)

  • Create a team
  • Delete a team
  • Get a team
  • Get many teams
  • Update a team

  🔧 Teammember (3 operations)

  • Add a team member
  • Get many team members
  • Remove a team member

  👤 User (3 operations)

  • Delete a user
  • Get many users
  • Update a user

  🤖 AI Integration

  Parameter Handling: AI agents automatically provide values for:
  • Resource IDs and identifiers
  • Search queries and filters
  • Content and data payloads
  • Configuration options

  Response Format: Native Grafana Tool API responses with full data structure

  Error Handling: Built-in n8n error management and retry logic

  💡 Usage Examples

  Connect this MCP server to any AI agent or workflow:

  • Claude Desktop: Add MCP server URL to configuration
  • Custom AI Apps: Use MCP URL as tool endpoint
  • Other n8n Workflows: Call MCP tools from any workflow
  • API Integration: Direct HTTP calls to MCP endpoints

  ✨ Benefits

  • Complete Coverage: Every Grafana Tool operation available
  • Zero Setup: No parameter mapping or configuration needed
  • AI-Ready: Built-in $fromAI() expressions for all parameters
  • Production Ready: Native n8n error handling and logging
  • Extensible: Easily modify or add custom logic

  🆓 Free for community use! Ready to deploy in under 2 minutes.

workflow_json:
  {"id":"2PWuvH4qOBq4JQos","meta":null,"name":"Grafana Tool MCP Server","tags":[],"nodes":[{"id":"bfcb27f9-3c85-4d48-a651-750e6a6eda2e","name":"Workflow Overview 0","type":"n8n-nodes-base.stickyNote","position":[-1460,120],"parameters":{"content":""},"typeVersion":1},{"id":"342cb1b1-7e37-4d0e-b58c-3db994b3aa6d","name":"Grafana Tool MCP Server","type":"@n8n/n8n-nodes-langchain.mcpTrigger","position":[-420,-140],"webhookId":"2265cd0b-9262-4200-bbf3-e8160916525e","parameters":{},"typeVersion":1},{"id":"78431ee0-1a36-476c-914e-0a64f920dab6","name":"Create a dashboard","type":"n8n-nodes-base.grafanaTool","position":[-800,140],"parameters":{},"typeVersion":1},{"id":"b1ae6771-36e8-4304-93f9-10b20a1ad494","name":"Delete a dashboard","type":"n8n-nodes-base.grafanaTool","position":[-580,140],"parameters":{},"typeVersion":1},{"id":"e12d9c91-7b85-407f-8102-c6c684639307","name":"Get a dashboard","type":"n8n-nodes-base.grafanaTool","position":[-360,140],"parameters":{},"typeVersion":1},{"id":"367d8735-2157-4ecd-b415-4fe2d0076ae6","name":"Get many dashboards","type":"n8n-nodes-base.grafanaTool","position":[-140,140],"parameters":{},"typeVersion":1},{"id":"fe578808-d55a-4bcd-bc5d-bbcc9fbe8a2e","name":"Update a dashboard","type":"n8n-nodes-base.grafanaTool","position":[80,140],"parameters":{},"typeVersion":1},{"id":"82d60452-f331-4fc0-a6b4-b3d956e55dda","name":"Sticky Note 1","type":"n8n-nodes-base.stickyNote","position":[-1000,120],"parameters":{"content":""},"typeVersion":1},{"id":"ee3c630e-f718-4abb-99f3-66ba27f00f6c","name":"Create a team","type":"n8n-nodes-base.grafanaTool","position":[-800,380],"parameters":{},"typeVersion":1},{"id":"a9742303-5d09-43d4-9684-d71a9fa10afd","name":"Delete a team","type":"n8n-nodes-base.grafanaTool","position":[-580,380],"parameters":{},"typeVersion":1},{"id":"b8c2d583-0a9d-4c36-91a0-572d083fcbc5","name":"Get a team","type":"n8n-nodes-base.grafanaTool","position":[-360,380],"parameters":{},"typeVersion":1},{"id":"5ebba4c8-f00f-4359-82c2-90da3dfb97aa","name":"Get many teams","type":"n8n-nodes-base.grafanaTool","position":[-140,380],"parameters":{},"typeVersion":1},{"id":"f3ce012c-47d6-463c-8ba7-cce8b134bba5","name":"Update a team","type":"n8n-nodes-base.grafanaTool","position":[80,380],"parameters":{},"typeVersion":1},{"id":"0c6a8c99-a2c3-4fa1-90d6-2136133c3c8f","name":"Sticky Note 2","type":"n8n-nodes-base.stickyNote","position":[-1000,360],"parameters":{"content":""},"typeVersion":1},{"id":"b3acab21-a575-4497-b48a-c8b1bf6bcc01","name":"Add a team member","type":"n8n-nodes-base.grafanaTool","position":[-800,620],"parameters":{},"typeVersion":1},{"id":"407436b5-54cc-43f9-8af0-fe980db86424","name":"Get many team members","type":"n8n-nodes-base.grafanaTool","position":[-580,620],"parameters":{},"typeVersion":1},{"id":"f3f5e0cf-4633-4f5e-b722-cb4826376439","name":"Remove a team member","type":"n8n-nodes-base.grafanaTool","position":[-360,620],"parameters":{},"typeVersion":1},{"id":"858e47cc-c6d6-4226-aaa9-fdf5345ac440","name":"Sticky Note 3","type":"n8n-nodes-base.stickyNote","position":[-1000,600],"parameters":{"content":""},"typeVersion":1},{"id":"998ff4be-c948-4b5e-8d68-52a87bf02d6e","name":"Delete a user","type":"n8n-nodes-base.grafanaTool","position":[-800,860],"parameters":{},"typeVersion":1},{"id":"b7aed51e-6e97-4975-8aea-14fd3143b537","name":"Get many users","type":"n8n-nodes-base.grafanaTool","position":[-580,860],"parameters":{},"typeVersion":1},{"id":"27fdeed6-1f0d-4d7f-a647-87ed36231c66","name":"Update a user","type":"n8n-nodes-base.grafanaTool","position":[-360,860],"parameters":{},"typeVersion":1},{"id":"f31c9e63-7de8-40a3-b227-8bc362d867d9","name":"Sticky Note 4","type":"n8n-nodes-base.stickyNote","position":[-1000,840],"parameters":{"content":""},"typeVersion":1}],"active":false,"shared":[{"role":"workflow:owner","project":{"id":"G5fce9xGuBAsWBXe","icon":null,"name":"David Ashby <david.ashby.lds@gmail.com>","type":"personal","createdAt":"2025-06-04T02:55:02.013Z","updatedAt":"2025-06-04T02:56:01.361Z","projectRelations":[{"role":"project:personalOwner","user":{"id":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","role":"global:owner","email":"david.ashby.lds@gmail.com","disabled":false,"lastName":"Ashby","settings":{"npsSurvey":{"responded":true,"lastShownAt":1749357655581},"userActivated":true,"userActivatedAt":1749075994495,"easyAIWorkflowOnboarded":true,"firstSuccessfulWorkflowId":"3N3vVikZb3MckFYm"},"createdAt":"2025-06-04T02:55:01.745Z","firstName":"David","isPending":false,"updatedAt":"2025-06-08T04:40:58.399Z","mfaEnabled":false,"personalizationAnswers":{"version":"v4","personalization_survey_n8n_version":"1.95.3","personalization_survey_submitted_at":"2025-06-04T02:56:07.075Z"}},"userId":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","createdAt":"2025-06-04T02:55:02.013Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-04T02:55:02.013Z"}]},"createdAt":"2025-06-24T21:57:08.387Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-24T21:57:08.387Z","workflowId":"2PWuvH4qOBq4JQos"}],"settings":{"timezone":"America/New_York"},"createdAt":"2025-06-24T21:57:08.385Z","updatedAt":"2025-06-24T21:57:26.000Z","versionId":"b946fbf1-e0ea-45ac-90c2-70cfaee85913","isArchived":false,"staticData":null,"connections":{"Get a team":{"ai_tool":[[{"node":"Grafana Tool MCP Server","type":"ai_tool","index":0}]]},"Create a team":{"ai_tool":[[{"node":"Grafana Tool MCP Server","type":"ai_tool","index":0}]]},"Delete a team":{"ai_tool":[[{"node":"Grafana Tool MCP Server","type":"ai_tool","index":0}]]},"Delete a user":{"ai_tool":[[{"node":"Grafana Tool MCP Server","type":"ai_tool","index":0}]]},"Update a team":{"ai_tool":[[{"node":"Grafana Tool MCP Server","type":"ai_tool","index":0}]]},"Update a user":{"ai_tool":[[{"node":"Grafana Tool MCP Server","type":"ai_tool","index":0}]]},"Get many teams":{"ai_tool":[[{"node":"Grafana Tool MCP Server","type":"ai_tool","index":0}]]},"Get many users":{"ai_tool":[[{"node":"Grafana Tool MCP Server","type":"ai_tool","index":0}]]},"Get a dashboard":{"ai_tool":[[{"node":"Grafana Tool MCP Server","type":"ai_tool","index":0}]]},"Add a team member":{"ai_tool":[[{"node":"Grafana Tool MCP Server","type":"ai_tool","index":0}]]},"Create a dashboard":{"ai_tool":[[{"node":"Grafana Tool MCP Server","type":"ai_tool","index":0}]]},"Delete a dashboard":{"ai_tool":[[{"node":"Grafana Tool MCP Server","type":"ai_tool","index":0}]]},"Update a dashboard":{"ai_tool":[[{"node":"Grafana Tool MCP Server","type":"ai_tool","index":0}]]},"Get many dashboards":{"ai_tool":[[{"node":"Grafana Tool MCP Server","type":"ai_tool","index":0}]]},"Remove a team member":{"ai_tool":[[{"node":"Grafana Tool MCP Server","type":"ai_tool","index":0}]]},"Get many team members":{"ai_tool":[[{"node":"Grafana Tool MCP Server","type":"ai_tool","index":0}]]}},"triggerCount":0}


name: 🛠️ Gotify Tool MCP Server
author_name: David Ashby
author_username: cfomodz
nodes_used: []
categories: []
created_at: 2025-06-24T21:59:51.777Z
updated_at: 2025-06-24T21:59:51.777Z
url: https://n8n.io/workflows/5246
scraped_at: 2025-07-06 21:16:30
description:
  🛠️ Gotify Tool MCP Server

  Complete MCP server exposing all Gotify Tool operations to AI agents. Zero configuration needed - all 3 operations pre-built.

  ⚡ Quick Setup

  Import this workflow into your n8n instance
  Activate the workflow to start your MCP server
  Copy the webhook URL from the MCP trigger node
  Connect AI agents using the MCP URL

  🔧 How it Works

  • MCP Trigger: Serves as your server endpoint for AI agent requests
  • Tool Nodes: Pre-configured for every Gotify Tool operation
  • AI Expressions: Automatically populate parameters via $fromAI() placeholders
  • Native Integration: Uses official n8n Gotify Tool tool with full error handling

  📋 Available Operations (3 total)

  Every possible Gotify Tool operation is included:

  💬 Message (3 operations)

  • Create a message
  • Delete a message
  • Get many messages

  🤖 AI Integration

  Parameter Handling: AI agents automatically provide values for:
  • Resource IDs and identifiers
  • Search queries and filters
  • Content and data payloads
  • Configuration options

  Response Format: Native Gotify Tool API responses with full data structure

  Error Handling: Built-in n8n error management and retry logic

  💡 Usage Examples

  Connect this MCP server to any AI agent or workflow:

  • Claude Desktop: Add MCP server URL to configuration
  • Custom AI Apps: Use MCP URL as tool endpoint
  • Other n8n Workflows: Call MCP tools from any workflow
  • API Integration: Direct HTTP calls to MCP endpoints

  ✨ Benefits

  • Complete Coverage: Every Gotify Tool operation available
  • Zero Setup: No parameter mapping or configuration needed
  • AI-Ready: Built-in $fromAI() expressions for all parameters
  • Production Ready: Native n8n error handling and logging
  • Extensible: Easily modify or add custom logic

  &gt; 🆓 Free for community use! Ready to deploy in under 2 minutes.

workflow_json:
  {"id":"vb5xE1BBVQy5ilyr","meta":null,"name":"Gotify Tool MCP Server","tags":[],"nodes":[{"id":"75dc5db6-fb70-43d1-897a-71a265f6566a","name":"Workflow Overview 0","type":"n8n-nodes-base.stickyNote","position":[-1460,-180],"parameters":{"width":420,"height":760,"content":"## 🛠️ Gotify Tool MCP Server\n\n### 📋 Available Operations (3 total)\n\n**Message**: create, delete, get all\n\n### ⚙️ Setup Instructions\n\n1. **Import Workflow**: Load this workflow into your n8n instance\n\n1. **🔑 Add Credentials**: Configure Gotify Tool authentication in one tool node then open and close all others.\n2. **🚀 Activate**: Enable this workflow to start your MCP server\n3. **🔗 Get URL**: Copy webhook URL from MCP trigger (right side)\n4. **🤖 Connect**: Use MCP URL in your AI agent configurations\n\n### ✨ Ready-to-Use Features\n\n• Zero configuration - all 3 operations pre-built\n• AI agents automatically populate parameters via `$fromAI()` expressions\n• Every resource and operation combination available\n• Native n8n error handling and response formatting\n• Modify parameter defaults in any tool node as needed\n\n### 💬 Need Help?\nCheck the [n8n documentation](https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.toolmcp/) or ping me on [discord](https://discord.me/cfomodz) for MCP integration guidance or customizations."},"typeVersion":1},{"id":"2170c5c1-ecca-48bf-80f5-61b9f29cf310","name":"Gotify Tool MCP Server","type":"@n8n/n8n-nodes-langchain.mcpTrigger","position":[-480,-160],"webhookId":"70fa8fe5-62ca-475c-98d0-b2ff652aee1f","parameters":{"path":"gotify-tool-mcp"},"typeVersion":1},{"id":"3d1403c3-0180-4a07-b321-6534425c96e9","name":"Create a message","type":"n8n-nodes-base.gotifyTool","position":[-800,140],"parameters":{"message":"={{ $fromAI('Message', ``, 'string') }}","options":{},"additionalFields":{}},"credentials":{"gotifyApi":{"id":"SET_YOUR_CREDENTIAL_ID_HERE","name":"Credential Name"}},"typeVersion":1},{"id":"43479aac-acc6-422a-b487-33acf9c958b8","name":"Delete a message","type":"n8n-nodes-base.gotifyTool","position":[-580,140],"parameters":{"messageId":"={{ $fromAI('Message_Id', ``, 'string') }}","operation":"delete"},"credentials":{"gotifyApi":{"id":"SET_YOUR_CREDENTIAL_ID_HERE","name":"Credential Name"}},"typeVersion":1},{"id":"42d0c129-8386-46c7-a3db-c0e1cbab28a0","name":"Get many messages","type":"n8n-nodes-base.gotifyTool","position":[-360,140],"parameters":{"limit":"={{ $fromAI('Limit', ``, 'number') }}","operation":"getAll","returnAll":"={{ $fromAI('Return_All', ``, 'boolean') }}"},"credentials":{"gotifyApi":{"id":"SET_YOUR_CREDENTIAL_ID_HERE","name":"Credential Name"}},"typeVersion":1},{"id":"8d9941e8-0562-4c0d-b6bc-2f411189c8af","name":"Sticky Note 1","type":"n8n-nodes-base.stickyNote","position":[-1000,120],"parameters":{"color":4,"width":840,"height":180,"content":"## Message"},"typeVersion":1}],"active":false,"shared":[{"role":"workflow:owner","project":{"id":"G5fce9xGuBAsWBXe","icon":null,"name":"David Ashby <david.ashby.lds@gmail.com>","type":"personal","createdAt":"2025-06-04T02:55:02.013Z","updatedAt":"2025-06-04T02:56:01.361Z","projectRelations":[{"role":"project:personalOwner","user":{"id":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","role":"global:owner","email":"david.ashby.lds@gmail.com","disabled":false,"lastName":"Ashby","settings":{"npsSurvey":{"responded":true,"lastShownAt":1749357655581},"userActivated":true,"userActivatedAt":1749075994495,"easyAIWorkflowOnboarded":true,"firstSuccessfulWorkflowId":"3N3vVikZb3MckFYm"},"createdAt":"2025-06-04T02:55:01.745Z","firstName":"David","isPending":false,"updatedAt":"2025-06-08T04:40:58.399Z","mfaEnabled":false,"personalizationAnswers":{"version":"v4","personalization_survey_n8n_version":"1.95.3","personalization_survey_submitted_at":"2025-06-04T02:56:07.075Z"}},"userId":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","createdAt":"2025-06-04T02:55:02.013Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-04T02:55:02.013Z"}]},"createdAt":"2025-06-24T21:59:12.342Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-24T21:59:12.342Z","workflowId":"vb5xE1BBVQy5ilyr"}],"settings":{"timezone":"America/New_York"},"createdAt":"2025-06-24T21:59:12.342Z","updatedAt":"2025-06-24T21:59:29.000Z","versionId":"48695cea-b84f-439e-9ed4-02c8eb282505","isArchived":false,"staticData":null,"connections":{"Create a message":{"ai_tool":[[{"node":"Gotify Tool MCP Server","type":"ai_tool","index":0}]]},"Delete a message":{"ai_tool":[[{"node":"Gotify Tool MCP Server","type":"ai_tool","index":0}]]},"Get many messages":{"ai_tool":[[{"node":"Gotify Tool MCP Server","type":"ai_tool","index":0}]]}},"triggerCount":0}


name: 🛠️ Google Drive Tool MCP Server 💪 all 17 operations
author_name: David Ashby
author_username: cfomodz
nodes_used: []
categories: []
created_at: 2025-06-24T22:17:16.950Z
updated_at: 2025-06-24T22:17:16.950Z
url: https://n8n.io/workflows/5254
scraped_at: 2025-07-06 21:16:30
description:
  🛠️ Google Drive Tool MCP Server

  Complete MCP server exposing all Google Drive Tool operations to AI agents. Zero configuration needed - all 17 operations pre-built.

  ⚡ Quick Setup

  Import this workflow into your n8n instance
  Activate the workflow to start your MCP server
  Copy the webhook URL from the MCP trigger node
  Connect AI agents using the MCP URL

  🔧 How it Works

  • MCP Trigger: Serves as your server endpoint for AI agent requests
  • Tool Nodes: Pre-configured for every Google Drive Tool operation
  • AI Expressions: Automatically populate parameters via $fromAI() placeholders
  • Native Integration: Uses official n8n Google Drive Tool tool with full error handling

  📋 Available Operations (17 total)

  Every possible Google Drive Tool operation is included:

  📄 File (8 operations)

  • Copy file
  • Create file from text
  • Delete a file
  • Download file
  • Move file
  • Share file
  • Update file
  • Upload file

  🔧 Filefolder (1 operations)

  • Search files and folders

  📁 Folder (3 operations)

  • Create folder
  • Delete folder
  • Share folder

  🔧 Drive (5 operations)

  • Create shared drive
  • Delete shared drive
  • Get shared drive
  • Get many shared drives
  • Update shared drive

  🤖 AI Integration

  Parameter Handling: AI agents automatically provide values for:
  • Resource IDs and identifiers
  • Search queries and filters
  • Content and data payloads
  • Configuration options

  Response Format: Native Google Drive Tool API responses with full data structure

  Error Handling: Built-in n8n error management and retry logic

  💡 Usage Examples

  Connect this MCP server to any AI agent or workflow:

  • Claude Desktop: Add MCP server URL to configuration
  • Custom AI Apps: Use MCP URL as tool endpoint
  • Other n8n Workflows: Call MCP tools from any workflow
  • API Integration: Direct HTTP calls to MCP endpoints

  ✨ Benefits

  • Complete Coverage: Every Google Drive Tool operation available
  • Zero Setup: No parameter mapping or configuration needed
  • AI-Ready: Built-in $fromAI() expressions for all parameters
  • Production Ready: Native n8n error handling and logging
  • Extensible: Easily modify or add custom logic

  🆓 Free for community use! Ready to deploy in under 2 minutes.

workflow_json:
  {"id":"qupdJnaSIkWi81IM","meta":null,"name":"Google Drive Tool MCP Server","tags":[],"nodes":[{"id":"c8e8ec7e-8a7b-499e-98e0-ab9fd7cc968d","name":"Workflow Overview 0","type":"n8n-nodes-base.stickyNote","position":[-1480,-120],"parameters":{"content":""},"typeVersion":1},{"id":"a03cdb72-e7ed-4866-8c25-25715bcf25c4","name":"Google Drive Tool MCP Server","type":"@n8n/n8n-nodes-langchain.mcpTrigger","position":[-420,-160],"webhookId":"9c8eeda6-d8d6-4ea8-8a5a-eab165ba8107","parameters":{},"typeVersion":1},{"id":"2285b54c-ccd7-4da2-8382-201e0d69066f","name":"Copy file","type":"n8n-nodes-base.googleDriveTool","position":[-800,140],"parameters":{},"typeVersion":3},{"id":"301483f7-4c2b-4a3e-81f3-10a9f46151bd","name":"Create file from text","type":"n8n-nodes-base.googleDriveTool","position":[-580,140],"parameters":{},"typeVersion":3},{"id":"075f8f20-2851-48d6-81f4-34452ecbfed3","name":"Delete a file","type":"n8n-nodes-base.googleDriveTool","position":[-360,140],"parameters":{},"typeVersion":3},{"id":"0f1e99b6-ba0b-4f5a-a9f6-f063b495089c","name":"Download file","type":"n8n-nodes-base.googleDriveTool","position":[-140,140],"parameters":{},"typeVersion":3},{"id":"db67e18a-18ae-4d15-a834-c236d5f55a23","name":"Move file","type":"n8n-nodes-base.googleDriveTool","position":[80,140],"parameters":{},"typeVersion":3},{"id":"17084b2e-d8e8-40fa-8812-326926d1a0f0","name":"Share file","type":"n8n-nodes-base.googleDriveTool","position":[300,140],"parameters":{},"typeVersion":3},{"id":"045962d6-ed82-4508-bb9a-865f978ce50f","name":"Update file","type":"n8n-nodes-base.googleDriveTool","position":[520,140],"parameters":{},"typeVersion":3},{"id":"40c71c8d-f1ac-469f-bf3c-8ba310dd82ae","name":"Upload file","type":"n8n-nodes-base.googleDriveTool","position":[740,140],"parameters":{},"typeVersion":3},{"id":"66f28661-a7f1-4792-9ea4-52ff64062287","name":"Sticky Note 1","type":"n8n-nodes-base.stickyNote","position":[-1000,120],"parameters":{"content":""},"typeVersion":1},{"id":"c47ccd7b-8824-48a5-9a99-7c1c0e0edb24","name":"Search files and folders","type":"n8n-nodes-base.googleDriveTool","position":[-800,-120],"parameters":{},"typeVersion":3},{"id":"cfa29bdf-60b4-4965-aff4-b8e500defeed","name":"Sticky Note 2","type":"n8n-nodes-base.stickyNote","position":[-1000,-140],"parameters":{"content":""},"typeVersion":1},{"id":"fc695a52-0e3d-4d3b-bfb4-f85814d45778","name":"Create folder","type":"n8n-nodes-base.googleDriveTool","position":[-800,420],"parameters":{},"typeVersion":3},{"id":"473f5018-5c8e-4bf7-b1f9-7017529feb5d","name":"Delete folder","type":"n8n-nodes-base.googleDriveTool","position":[-580,420],"parameters":{},"typeVersion":3},{"id":"d9d6b7ac-6dbc-45f3-9aa5-78e45bf7ec43","name":"Share folder","type":"n8n-nodes-base.googleDriveTool","position":[-360,420],"parameters":{},"typeVersion":3},{"id":"c5ec26e5-01c8-44dd-a2c6-6ea349d99acd","name":"Sticky Note 3","type":"n8n-nodes-base.stickyNote","position":[-1000,400],"parameters":{"content":""},"typeVersion":1},{"id":"b01acd9e-833c-44c4-9d1d-26e5b6a9d1e8","name":"Create shared drive","type":"n8n-nodes-base.googleDriveTool","position":[-800,660],"parameters":{},"typeVersion":3},{"id":"26cfcfe5-3787-4dca-a065-f7e727303ee9","name":"Delete shared drive","type":"n8n-nodes-base.googleDriveTool","position":[-580,660],"parameters":{},"typeVersion":3},{"id":"0b524515-5b58-4b47-a4f5-5040b1c4945d","name":"Get shared drive","type":"n8n-nodes-base.googleDriveTool","position":[-360,660],"parameters":{},"typeVersion":3},{"id":"56b513b3-f6fc-4c7d-a43e-80080170cb46","name":"Get many shared drives","type":"n8n-nodes-base.googleDriveTool","position":[-140,660],"parameters":{},"typeVersion":3},{"id":"b59162d2-9902-465c-8f5f-eb3df0f78150","name":"Update shared drive","type":"n8n-nodes-base.googleDriveTool","position":[80,660],"parameters":{},"typeVersion":3},{"id":"742a73b4-8c0b-49af-b009-586660900095","name":"Sticky Note 4","type":"n8n-nodes-base.stickyNote","position":[-1000,640],"parameters":{"content":""},"typeVersion":1}],"active":false,"shared":[{"role":"workflow:owner","project":{"id":"G5fce9xGuBAsWBXe","icon":null,"name":"David Ashby <david.ashby.lds@gmail.com>","type":"personal","createdAt":"2025-06-04T02:55:02.013Z","updatedAt":"2025-06-04T02:56:01.361Z","projectRelations":[{"role":"project:personalOwner","user":{"id":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","role":"global:owner","email":"david.ashby.lds@gmail.com","disabled":false,"lastName":"Ashby","settings":{"npsSurvey":{"responded":true,"lastShownAt":1749357655581},"userActivated":true,"userActivatedAt":1749075994495,"easyAIWorkflowOnboarded":true,"firstSuccessfulWorkflowId":"3N3vVikZb3MckFYm"},"createdAt":"2025-06-04T02:55:01.745Z","firstName":"David","isPending":false,"updatedAt":"2025-06-08T04:40:58.399Z","mfaEnabled":false,"personalizationAnswers":{"version":"v4","personalization_survey_n8n_version":"1.95.3","personalization_survey_submitted_at":"2025-06-04T02:56:07.075Z"}},"userId":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","createdAt":"2025-06-04T02:55:02.013Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-04T02:55:02.013Z"}]},"createdAt":"2025-06-24T22:13:00.379Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-24T22:13:00.379Z","workflowId":"qupdJnaSIkWi81IM"}],"settings":{"timezone":"America/New_York"},"createdAt":"2025-06-24T22:13:00.378Z","updatedAt":"2025-06-24T22:13:56.000Z","versionId":"15fc7e12-bb25-4e9c-baf7-9647a6188311","isArchived":false,"staticData":null,"connections":{"Copy file":{"ai_tool":[[{"node":"Google Drive Tool MCP Server","type":"ai_tool","index":0}]]},"Move file":{"ai_tool":[[{"node":"Google Drive Tool MCP Server","type":"ai_tool","index":0}]]},"Share file":{"ai_tool":[[{"node":"Google Drive Tool MCP Server","type":"ai_tool","index":0}]]},"Update file":{"ai_tool":[[{"node":"Google Drive Tool MCP Server","type":"ai_tool","index":0}]]},"Upload file":{"ai_tool":[[{"node":"Google Drive Tool MCP Server","type":"ai_tool","index":0}]]},"Share folder":{"ai_tool":[[{"node":"Google Drive Tool MCP Server","type":"ai_tool","index":0}]]},"Create folder":{"ai_tool":[[{"node":"Google Drive Tool MCP Server","type":"ai_tool","index":0}]]},"Delete a file":{"ai_tool":[[{"node":"Google Drive Tool MCP Server","type":"ai_tool","index":0}]]},"Delete folder":{"ai_tool":[[{"node":"Google Drive Tool MCP Server","type":"ai_tool","index":0}]]},"Download file":{"ai_tool":[[{"node":"Google Drive Tool MCP Server","type":"ai_tool","index":0}]]},"Get shared drive":{"ai_tool":[[{"node":"Google Drive Tool MCP Server","type":"ai_tool","index":0}]]},"Create shared drive":{"ai_tool":[[{"node":"Google Drive Tool MCP Server","type":"ai_tool","index":0}]]},"Delete shared drive":{"ai_tool":[[{"node":"Google Drive Tool MCP Server","type":"ai_tool","index":0}]]},"Update shared drive":{"ai_tool":[[{"node":"Google Drive Tool MCP Server","type":"ai_tool","index":0}]]},"Create file from text":{"ai_tool":[[{"node":"Google Drive Tool MCP Server","type":"ai_tool","index":0}]]},"Get many shared drives":{"ai_tool":[[{"node":"Google Drive Tool MCP Server","type":"ai_tool","index":0}]]},"Search files and folders":{"ai_tool":[[{"node":"Google Drive Tool MCP Server","type":"ai_tool","index":0}]]}},"triggerCount":0}


name: 💰 Financial AI Agent Telegram and WhatsApp
author_name: Bruno Dias
author_username: brunodias
categories: []
created_at: 2025-06-24T22:22:50.109Z
updated_at: 2025-06-24T22:22:50.109Z
url: https://n8n.io/workflows/5259
scraped_at: 2025-07-06 21:16:30
description:
  📌 About this workflow

  Hi! I'm Bruno, and I'm here to help you automate your finances intelligently. This workflow has been carefully developed to transform the way you manage your money, using the power of artificial intelligence and the flexibility of n8n. With a focus on usability and innovation, this financial agent is the perfect solution for anyone seeking control and insights into their personal or business finances.

  This ready-to-use workflow acts as a powerful AI financial assistant, capable of recording your transactions (income and expenses), categorizing them, and providing personalized advice and tips. It is designed to be highly extensible and adaptable to your needs, using cutting-edge technologies to ensure accuracy and efficiency.

  ⚙️ What this workflow does

  Intelligent Transaction Recording**: Automatically records your financial income and expenses, categorizing them efficiently.
  Personalized Financial Analysis**: Provides insights, advice, and financial tips based on your data, helping you make smarter decisions.
  Telegram Communication**: Interacts with you via Telegram, making financial management as simple as sending a message (can be adapted for WhatsApp, Instagram, etc.).
  Conversation Memory**: Maintains the context of your conversations, allowing for more fluid and personalized interactions.
  Balance Report Generation**: Generates detailed balance reports for specific periods, offering a clear overview of your financial health.
  Modular and Expandable Structure**: Easily adaptable and expandable to include new functionalities, such as expense analysis by category, budget alerts, and integration with other platforms.

  🔧 Setup Instructions
  This workflow requires n8n self-hosted (or n8n Cloud with custom credentials + community nodes enabled).

  Create required databases
  For the agent to function correctly, the following tables are required in the PostgreSQL database (Supabase):

  transactions: To store details of each transaction (income/expense).
  balances: To store consolidated balance per day and per user.
  memoria_chat: To store conversation history for agent memory.

  Credentials needed

  OpenAI API Key**: For chat model and embeddings.
  Supabase API Key and URL**: For database access.
  PostgreSQL Connection String**: For chat memory.
  Telegram API Token**: For Telegram Trigger and Telegram node.

  Webhook
  Set the webhook path to receive messages from your Telegram API provider (or other messaging platform).

  Tool connections
  Ensure the supporting workflows (Financial | AI Agent | Register Tool and Financial | AI Agent | Balance Tool) are also imported and connected correctly to the main workflow (Financial | AI Agent).

  📎 Notes
  This workflow uses LangChain agents, OpenAI GPT-4.1, Supabase, and PostgreSQL. It includes multiple "sticky notes" inside the workflow with detailed explanations.

  Ideal for individuals, consultants, and developers looking for an intelligent and extensible AI chatbot experience for financial management.

nodes_used:
  ["n8n-nodes-base.telegram","@n8n/n8n-nodes-langchain.agent","@n8n/n8n-nodes-langchain.lmChatOpenAi","@n8n/n8n-nodes-langchain.toolWorkflow","@n8n/n8n-nodes-langchain.memoryPostgresChat"]

workflow_json:
  {"id":"Ot2eAIwN4WcEfK27","meta":{"instanceId":"7ec217dac074bfef73627690c901899089826bac2558dc377a3958ae7305a09b","templateCredsSetupCompleted":true},"name":"Financial Dev | AI Agent","tags":[],"nodes":[{"id":"b0090b4f-554b-4e5c-9108-47d32628e200","name":"AI Agent","type":"@n8n/n8n-nodes-langchain.agent","position":[220,0],"parameters":{},"typeVersion":1.9},{"id":"bf0b782d-d2db-4c0d-8c13-0d93b2607cd4","name":"OpenAI Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[100,220],"parameters":{},"typeVersion":1.2},{"id":"6ed1e80a-41ba-4b7e-8db2-2929585b4167","name":"Postgres Chat Memory","type":"@n8n/n8n-nodes-langchain.memoryPostgresChat","position":[260,220],"parameters":{},"typeVersion":1.3},{"id":"0e7a40c9-93fd-41ec-9711-5f3ca6d076ca","name":"Register Transaction","type":"@n8n/n8n-nodes-langchain.toolWorkflow","position":[420,220],"parameters":{},"typeVersion":2.2},{"id":"da9d4d5a-bc6e-4261-bf71-edcd4089fa30","name":"Chat","type":"@n8n/n8n-nodes-langchain.chatTrigger","position":[-240,-180],"webhookId":"30dc5ca2-b504-4fff-81a9-3675abbc9fd9","parameters":{},"typeVersion":1.1},{"id":"b46d755d-7e34-4148-a8cf-7000bdb3dd9f","name":"Telegram Trigger","type":"n8n-nodes-base.telegramTrigger","position":[-240,0],"webhookId":"c9065337-71a9-4dd3-9a5a-23978ae4a8df","parameters":{},"typeVersion":1.2},{"id":"491fef07-5982-415c-91e0-2fec78c18f80","name":"Normalize","type":"n8n-nodes-base.set","position":[-20,0],"parameters":{},"typeVersion":3.4},{"id":"3a129ebf-34f4-4887-8949-8ca2b834c529","name":"Telegram","type":"n8n-nodes-base.telegram","position":[580,0],"webhookId":"91b61951-671c-456c-a470-9cd41266f123","parameters":{},"typeVersion":1.2},{"id":"e5929da6-17bd-4602-b90e-60b7d78cd228","name":"Balance report","type":"@n8n/n8n-nodes-langchain.toolWorkflow","position":[580,220],"parameters":{},"typeVersion":2.2}],"active":true,"settings":{"callerPolicy":"workflowsFromSameOwner","executionOrder":"v1","executionTimeout":3600,"saveDataSuccessExecution":"all"},"versionId":"64058215-7a86-483c-855d-8e7fdf66d940","connections":{"Chat":{"main":[[]]},"AI Agent":{"main":[[{"node":"Telegram","type":"main","index":0}]]},"Normalize":{"main":[[{"node":"AI Agent","type":"main","index":0}]]},"Balance report":{"ai_tool":[[{"node":"AI Agent","type":"ai_tool","index":0}]]},"Telegram Trigger":{"main":[[{"node":"Normalize","type":"main","index":0}]]},"OpenAI Chat Model":{"ai_languageModel":[[{"node":"AI Agent","type":"ai_languageModel","index":0}]]},"Postgres Chat Memory":{"ai_memory":[[{"node":"AI Agent","type":"ai_memory","index":0}]]},"Register Transaction":{"ai_tool":[[{"node":"AI Agent","type":"ai_tool","index":0}]]}}}


name: Let AI Agents Get Campaigns with 🛠️ Google Ads Tool MCP Server
author_name: David Ashby
author_username: cfomodz
nodes_used: []
categories: []
created_at: 2025-06-24T22:24:58.749Z
updated_at: 2025-06-24T22:24:58.749Z
url: https://n8n.io/workflows/5262
scraped_at: 2025-07-06 21:16:30
description:
  🛠️ Google Ads Tool MCP Server

  Complete MCP server exposing all Google Ads Tool operations to AI agents. Zero configuration needed - all 2 operations pre-built.

  ⚡ Quick Setup

  Import this workflow into your n8n instance
  Activate the workflow to start your MCP server
  Copy the webhook URL from the MCP trigger node
  Connect AI agents using the MCP URL

  🔧 How it Works

  • MCP Trigger: Serves as your server endpoint for AI agent requests
  • Tool Nodes: Pre-configured for every Google Ads Tool operation
  • AI Expressions: Automatically populate parameters via $fromAI() placeholders
  • Native Integration: Uses official n8n Google Ads Tool tool with full error handling

  📋 Available Operations (2 total)

  Every possible Google Ads Tool operation is included:

  📢 Campaign (2 operations)

  • Get many campaigns
  • Get a campaign

  🤖 AI Integration

  Parameter Handling: AI agents automatically provide values for:
  • Resource IDs and identifiers
  • Search queries and filters
  • Content and data payloads
  • Configuration options

  Response Format: Native Google Ads Tool API responses with full data structure

  Error Handling: Built-in n8n error management and retry logic

  💡 Usage Examples

  Connect this MCP server to any AI agent or workflow:

  • Claude Desktop: Add MCP server URL to configuration
  • Custom AI Apps: Use MCP URL as tool endpoint
  • Other n8n Workflows: Call MCP tools from any workflow
  • API Integration: Direct HTTP calls to MCP endpoints

  ✨ Benefits

  • Complete Coverage: Every Google Ads Tool operation available
  • Zero Setup: No parameter mapping or configuration needed
  • AI-Ready: Built-in $fromAI() expressions for all parameters
  • Production Ready: Native n8n error handling and logging
  • Extensible: Easily modify or add custom logic

  &gt; 🆓 Free for community use! Ready to deploy in under 2 minutes.

workflow_json:
  {"id":"MqRj962rDKcNAP42","meta":null,"name":"Google Ads Tool MCP Server","tags":[],"nodes":[{"id":"c3630d25-5ef6-428f-a7b1-ae5509da8386","name":"Workflow Overview 0","type":"n8n-nodes-base.stickyNote","position":[-1460,-180],"parameters":{"width":420,"height":760,"content":"## 🛠️ Google Ads Tool MCP Server\n\n### 📋 Available Operations (2 total)\n\n**Campaign**: get all, get\n\n### ⚙️ Setup Instructions\n\n1. **Import Workflow**: Load this workflow into your n8n instance\n\n1. **🔑 Add Credentials**: Configure Google Ads Tool authentication in one tool node then open and close all others.\n2. **🚀 Activate**: Enable this workflow to start your MCP server\n3. **🔗 Get URL**: Copy webhook URL from MCP trigger (right side)\n4. **🤖 Connect**: Use MCP URL in your AI agent configurations\n\n### ✨ Ready-to-Use Features\n\n• Zero configuration - all 2 operations pre-built\n• AI agents automatically populate parameters via `$fromAI()` expressions\n• Every resource and operation combination available\n• Native n8n error handling and response formatting\n• Modify parameter defaults in any tool node as needed\n\n### 💬 Need Help?\nCheck the [n8n documentation](https://docs.n8n.io/integrations/builtin/cluster-nodes/sub-nodes/n8n-nodes-langchain.toolmcp/) or ping me on [discord](https://discord.me/cfomodz) for MCP integration guidance or customizations."},"typeVersion":1},{"id":"666967ee-c5fe-4187-9be5-d07bddfe69b5","name":"Google Ads Tool MCP Server","type":"@n8n/n8n-nodes-langchain.mcpTrigger","position":[-660,-160],"webhookId":"b36a71b8-41e4-4fcc-a1f0-30a95be8f641","parameters":{"path":"google-ads-tool-mcp"},"typeVersion":1},{"id":"8ec237bc-6a57-42d9-942c-8c0b104e367c","name":"Get many campaigns","type":"n8n-nodes-base.googleAdsTool","position":[-800,140],"parameters":{"campaigsNotice":"={{ $fromAI('Campaigs_Notice', ``, 'string') }}","requestOptions":{},"clientCustomerId":"={{ $fromAI('Client_Customer_Id', ``, 'string') }}","additionalOptions":{},"managerCustomerId":"={{ $fromAI('Manager_Customer_Id', ``, 'string') }}"},"credentials":{"googleAdsOAuth2Api":{"id":"SET_YOUR_CREDENTIAL_ID_HERE","name":"Credential Name"}},"typeVersion":1},{"id":"c082536b-9762-4ad7-86b9-28d8adcdde32","name":"Get a campaign","type":"n8n-nodes-base.googleAdsTool","position":[-580,140],"parameters":{"operation":"get","campaignId":"={{ $fromAI('Campaign_Id', ``, 'string') }}","campaigsNotice":"={{ $fromAI('Campaigs_Notice', ``, 'string') }}","requestOptions":{},"clientCustomerId":"={{ $fromAI('Client_Customer_Id', ``, 'string') }}","managerCustomerId":"={{ $fromAI('Manager_Customer_Id', ``, 'string') }}"},"credentials":{"googleAdsOAuth2Api":{"id":"SET_YOUR_CREDENTIAL_ID_HERE","name":"Credential Name"}},"typeVersion":1},{"id":"3102d683-89b8-40fd-9713-5a0e84679c50","name":"Sticky Note 1","type":"n8n-nodes-base.stickyNote","position":[-1000,120],"parameters":{"color":4,"width":620,"height":180,"content":"## Campaign"},"typeVersion":1}],"active":false,"shared":[{"role":"workflow:owner","project":{"id":"G5fce9xGuBAsWBXe","icon":null,"name":"David Ashby <david.ashby.lds@gmail.com>","type":"personal","createdAt":"2025-06-04T02:55:02.013Z","updatedAt":"2025-06-04T02:56:01.361Z","projectRelations":[{"role":"project:personalOwner","user":{"id":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","role":"global:owner","email":"david.ashby.lds@gmail.com","disabled":false,"lastName":"Ashby","settings":{"npsSurvey":{"responded":true,"lastShownAt":1749357655581},"userActivated":true,"userActivatedAt":1749075994495,"easyAIWorkflowOnboarded":true,"firstSuccessfulWorkflowId":"3N3vVikZb3MckFYm"},"createdAt":"2025-06-04T02:55:01.745Z","firstName":"David","isPending":false,"updatedAt":"2025-06-08T04:40:58.399Z","mfaEnabled":false,"personalizationAnswers":{"version":"v4","personalization_survey_n8n_version":"1.95.3","personalization_survey_submitted_at":"2025-06-04T02:56:07.075Z"}},"userId":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","createdAt":"2025-06-04T02:55:02.013Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-04T02:55:02.013Z"}]},"createdAt":"2025-06-24T22:24:25.455Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-24T22:24:25.455Z","workflowId":"MqRj962rDKcNAP42"}],"settings":{"timezone":"America/New_York"},"createdAt":"2025-06-24T22:24:25.453Z","updatedAt":"2025-06-24T22:24:46.000Z","versionId":"fceeb840-e745-4a83-8920-862452713e7b","isArchived":false,"staticData":null,"connections":{"Get a campaign":{"ai_tool":[[{"node":"Google Ads Tool MCP Server","type":"ai_tool","index":0}]]},"Get many campaigns":{"ai_tool":[[{"node":"Google Ads Tool MCP Server","type":"ai_tool","index":0}]]}},"triggerCount":0}


name: 🛠️ GitLab Tool MCP Server 💪 all 18 operations
author_name: David Ashby
author_username: cfomodz
nodes_used: []
categories: []
created_at: 2025-06-24T22:27:56.106Z
updated_at: 2025-06-24T22:27:56.106Z
url: https://n8n.io/workflows/5265
scraped_at: 2025-07-06 21:16:30
description:
  🛠️ GitLab Tool MCP Server

  Complete MCP server exposing all GitLab Tool operations to AI agents. Zero configuration needed - all 18 operations pre-built.

  ⚡ Quick Setup

  Import this workflow into your n8n instance
  Activate the workflow to start your MCP server
  Copy the webhook URL from the MCP trigger node
  Connect AI agents using the MCP URL

  🔧 How it Works

  • MCP Trigger: Serves as your server endpoint for AI agent requests
  • Tool Nodes: Pre-configured for every GitLab Tool operation
  • AI Expressions: Automatically populate parameters via $fromAI() placeholders
  • Native Integration: Uses official n8n GitLab Tool tool with full error handling

  📋 Available Operations (18 total)

  Every possible GitLab Tool operation is included:

  📄 File (5 operations)

  • Create a file
  • Delete a file
  • Edit a file
  • Get a file
  • List files

  🐛 Issue (5 operations)

  • Create an issue
  • Create a comment on an issue
  • Edit an issue
  • Get an issue
  • Lock an issue

  🚀 Release (5 operations)

  • Create a release
  • Delete a release
  • Get a release
  • Get many releases
  • Update a release

  📦 Repository (2 operations)

  • Get a repository
  • Get issues of a repository

  👤 User (1 operations)

  • Get a user's repositories

  🤖 AI Integration

  Parameter Handling: AI agents automatically provide values for:
  • Resource IDs and identifiers
  • Search queries and filters
  • Content and data payloads
  • Configuration options

  Response Format: Native GitLab Tool API responses with full data structure

  Error Handling: Built-in n8n error management and retry logic

  💡 Usage Examples

  Connect this MCP server to any AI agent or workflow:

  • Claude Desktop: Add MCP server URL to configuration
  • Custom AI Apps: Use MCP URL as tool endpoint
  • Other n8n Workflows: Call MCP tools from any workflow
  • API Integration: Direct HTTP calls to MCP endpoints

  ✨ Benefits

  • Complete Coverage: Every GitLab Tool operation available
  • Zero Setup: No parameter mapping or configuration needed
  • AI-Ready: Built-in $fromAI() expressions for all parameters
  • Production Ready: Native n8n error handling and logging
  • Extensible: Easily modify or add custom logic

  🆓 Free for community use! Ready to deploy in under 2 minutes.

workflow_json:
  {"id":"IaZknMlvBCuZf5UL","meta":null,"name":"GitLab Tool MCP Server","tags":[],"nodes":[{"id":"118daae3-4a9b-486f-a53a-8f9d66c7110b","name":"Workflow Overview 0","type":"n8n-nodes-base.stickyNote","position":[-1480,-380],"parameters":{"content":""},"typeVersion":1},{"id":"f46fd4c8-4e52-4b57-a4d8-a297562f08b6","name":"GitLab Tool MCP Server","type":"@n8n/n8n-nodes-langchain.mcpTrigger","position":[-420,-360],"webhookId":"9b92f4d2-873e-4b97-b1cf-6aca9eb45f6e","parameters":{},"typeVersion":1},{"id":"7a7f25e5-5fc5-42d1-befb-2ea22970b9f3","name":"Create a file","type":"n8n-nodes-base.gitlabTool","position":[-800,140],"parameters":{},"typeVersion":1},{"id":"c5a3579d-aee7-45ea-81fe-1f8a33878493","name":"Delete a file","type":"n8n-nodes-base.gitlabTool","position":[-580,140],"parameters":{},"typeVersion":1},{"id":"a0b4b348-7d40-4901-a8a8-ff13451a881d","name":"Edit a file","type":"n8n-nodes-base.gitlabTool","position":[-360,140],"parameters":{},"typeVersion":1},{"id":"f061417a-90c5-4b29-96f7-1d0a46e4d418","name":"Get a file","type":"n8n-nodes-base.gitlabTool","position":[-140,140],"parameters":{},"typeVersion":1},{"id":"f84d38b3-9af1-4003-b27f-1cde9f07b245","name":"List files","type":"n8n-nodes-base.gitlabTool","position":[80,140],"parameters":{},"typeVersion":1},{"id":"2b301cca-fe49-4b7f-a184-ebf481601256","name":"Sticky Note 1","type":"n8n-nodes-base.stickyNote","position":[-1000,120],"parameters":{"content":""},"typeVersion":1},{"id":"41630a7d-00e3-49f5-ba8e-e492c80e78a2","name":"Create an issue","type":"n8n-nodes-base.gitlabTool","position":[-800,380],"parameters":{},"typeVersion":1},{"id":"8fc6721e-db65-43b1-a779-317e98e3b6eb","name":"Create a comment on an issue","type":"n8n-nodes-base.gitlabTool","position":[-580,380],"parameters":{},"typeVersion":1},{"id":"51c038b2-092e-4c05-9171-af4045a11fba","name":"Edit an issue","type":"n8n-nodes-base.gitlabTool","position":[-360,380],"parameters":{},"typeVersion":1},{"id":"30025b43-ee68-4f49-8c24-aa1d02f5ee41","name":"Get an issue","type":"n8n-nodes-base.gitlabTool","position":[-140,380],"parameters":{},"typeVersion":1},{"id":"b33ff0f1-0f06-4200-8266-9b6e5153e35d","name":"Lock an issue","type":"n8n-nodes-base.gitlabTool","position":[80,380],"parameters":{},"typeVersion":1},{"id":"52f947fe-41f0-4b6b-9c76-7beb98571c47","name":"Sticky Note 2","type":"n8n-nodes-base.stickyNote","position":[-1000,360],"parameters":{"content":""},"typeVersion":1},{"id":"1879237d-d983-44c2-a632-d0d0bbfc0734","name":"Create a release","type":"n8n-nodes-base.gitlabTool","position":[-800,620],"parameters":{},"typeVersion":1},{"id":"3152af26-feba-484a-b00f-892cbff562ee","name":"Delete a release","type":"n8n-nodes-base.gitlabTool","position":[-580,620],"parameters":{},"typeVersion":1},{"id":"f458f75f-c710-4490-98b4-a14050cb8e6c","name":"Get a release","type":"n8n-nodes-base.gitlabTool","position":[-360,620],"parameters":{},"typeVersion":1},{"id":"50d3b09c-eb38-4ffa-9e05-30bef97c0ec4","name":"Get many releases","type":"n8n-nodes-base.gitlabTool","position":[-140,620],"parameters":{},"typeVersion":1},{"id":"b1ece682-9c2c-46d6-b33d-a81d291ca1ee","name":"Update a release","type":"n8n-nodes-base.gitlabTool","position":[80,620],"parameters":{},"typeVersion":1},{"id":"7315cadd-9b78-4de9-be65-2fb636569adf","name":"Sticky Note 3","type":"n8n-nodes-base.stickyNote","position":[-1000,600],"parameters":{"content":""},"typeVersion":1},{"id":"5c76c2af-36b9-4a75-a936-94dc3b35fc04","name":"Get a repository","type":"n8n-nodes-base.gitlabTool","position":[-800,-100],"parameters":{},"typeVersion":1},{"id":"437d0ca9-8bbc-4f52-b370-644e2bdb6702","name":"Get issues of a repository","type":"n8n-nodes-base.gitlabTool","position":[-580,-100],"parameters":{},"typeVersion":1},{"id":"3d11c2ce-b30a-45fd-a925-2f46592e1073","name":"Sticky Note 4","type":"n8n-nodes-base.stickyNote","position":[-1000,-120],"parameters":{"content":""},"typeVersion":1},{"id":"1cd9dc31-bee3-447f-bba5-60cc16038c71","name":"Get a user's repositories","type":"n8n-nodes-base.gitlabTool","position":[-800,-360],"parameters":{},"typeVersion":1},{"id":"ea3b54dc-bc2c-4f18-9cdb-5c0329089005","name":"Sticky Note 5","type":"n8n-nodes-base.stickyNote","position":[-1000,-380],"parameters":{"content":""},"typeVersion":1}],"active":false,"shared":[{"role":"workflow:owner","project":{"id":"G5fce9xGuBAsWBXe","icon":null,"name":"David Ashby <david.ashby.lds@gmail.com>","type":"personal","createdAt":"2025-06-04T02:55:02.013Z","updatedAt":"2025-06-04T02:56:01.361Z","projectRelations":[{"role":"project:personalOwner","user":{"id":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","role":"global:owner","email":"david.ashby.lds@gmail.com","disabled":false,"lastName":"Ashby","settings":{"npsSurvey":{"responded":true,"lastShownAt":1749357655581},"userActivated":true,"userActivatedAt":1749075994495,"easyAIWorkflowOnboarded":true,"firstSuccessfulWorkflowId":"3N3vVikZb3MckFYm"},"createdAt":"2025-06-04T02:55:01.745Z","firstName":"David","isPending":false,"updatedAt":"2025-06-08T04:40:58.399Z","mfaEnabled":false,"personalizationAnswers":{"version":"v4","personalization_survey_n8n_version":"1.95.3","personalization_survey_submitted_at":"2025-06-04T02:56:07.075Z"}},"userId":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","createdAt":"2025-06-04T02:55:02.013Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-04T02:55:02.013Z"}]},"createdAt":"2025-06-24T22:26:15.209Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-24T22:26:15.209Z","workflowId":"IaZknMlvBCuZf5UL"}],"settings":{"timezone":"America/New_York"},"createdAt":"2025-06-24T22:26:15.207Z","updatedAt":"2025-06-24T22:27:08.000Z","versionId":"cb92f331-102b-4163-ac40-ee4571f1c4c5","isArchived":false,"staticData":null,"connections":{"Get a file":{"ai_tool":[[{"node":"GitLab Tool MCP Server","type":"ai_tool","index":0}]]},"List files":{"ai_tool":[[{"node":"GitLab Tool MCP Server","type":"ai_tool","index":0}]]},"Edit a file":{"ai_tool":[[{"node":"GitLab Tool MCP Server","type":"ai_tool","index":0}]]},"Get an issue":{"ai_tool":[[{"node":"GitLab Tool MCP Server","type":"ai_tool","index":0}]]},"Create a file":{"ai_tool":[[{"node":"GitLab Tool MCP Server","type":"ai_tool","index":0}]]},"Delete a file":{"ai_tool":[[{"node":"GitLab Tool MCP Server","type":"ai_tool","index":0}]]},"Edit an issue":{"ai_tool":[[{"node":"GitLab Tool MCP Server","type":"ai_tool","index":0}]]},"Get a release":{"ai_tool":[[{"node":"GitLab Tool MCP Server","type":"ai_tool","index":0}]]},"Lock an issue":{"ai_tool":[[{"node":"GitLab Tool MCP Server","type":"ai_tool","index":0}]]},"Create an issue":{"ai_tool":[[{"node":"GitLab Tool MCP Server","type":"ai_tool","index":0}]]},"Create a release":{"ai_tool":[[{"node":"GitLab Tool MCP Server","type":"ai_tool","index":0}]]},"Delete a release":{"ai_tool":[[{"node":"GitLab Tool MCP Server","type":"ai_tool","index":0}]]},"Get a repository":{"ai_tool":[[{"node":"GitLab Tool MCP Server","type":"ai_tool","index":0}]]},"Update a release":{"ai_tool":[[{"node":"GitLab Tool MCP Server","type":"ai_tool","index":0}]]},"Get many releases":{"ai_tool":[[{"node":"GitLab Tool MCP Server","type":"ai_tool","index":0}]]},"Get a user's repositories":{"ai_tool":[[{"node":"GitLab Tool MCP Server","type":"ai_tool","index":0}]]},"Get issues of a repository":{"ai_tool":[[{"node":"GitLab Tool MCP Server","type":"ai_tool","index":0}]]},"Create a comment on an issue":{"ai_tool":[[{"node":"GitLab Tool MCP Server","type":"ai_tool","index":0}]]}},"triggerCount":0}


name: Learn n8n Keyboard Shortcuts with an Interactive Hands-On Tutorial Workflow
author_name: Lucas Peyrin
author_username: lucaspeyrin
nodes_used: []
categories: []
created_at: 2025-06-24T22:49:03.368Z
updated_at: 2025-06-24T22:49:03.368Z
url: https://n8n.io/workflows/5270
scraped_at: 2025-07-06 21:16:30
description:
  How it works

  This template is an interactive playground designed to help you master the most useful keyboard shortcuts in n8n and supercharge your building speed. Forget boring lists—this workflow gives you hands-on tasks to complete, turning learning into a practical exercise.

  The workflow is structured into four chapters, each focusing on a different aspect of workflow development:

  Node Basics: Learn the fundamentals of interacting with a single node, such as renaming, editing, duplicating, and deactivating.
  Canvas Navigation & Selection: Master the art of moving around the canvas and selecting multiple nodes efficiently.
  Advanced Actions: Discover powerful moves like tidying up messy connections and creating sub-workflows.
  Execution & Debugging: Uncover essential shortcuts for testing your workflows, like pinning data and navigating the executions panel.

  Each step provides a clear task in a sticky note, guiding you to perform the action yourself.

  Set up steps

  Setup time: 0 minutes!

  This workflow is a self-contained tutorial and requires no setup, credentials, or configuration.

  Open the workflow.
  Follow the instructions in the sticky notes, starting from the top.
  Perform the actions as described to build muscle memory for each shortcut.

  That's it! Get ready to become an n8n power user.

workflow_json:
  {"meta":{"instanceId":"e409ea34548a2afe2dffba31130cd1cf2e98ebe2afaeed2a63caf2a0582d1da0"},"nodes":[{"id":"0e06efaf-217e-45b2-bc30-b6bc8c8f4c58","name":"Test IF","type":"n8n-nodes-base.if","position":[5540,3920],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"3e271a03-2dc7-42e8-a16d-ea604d3e25a1","operator":{"name":"filter.operator.equals","type":"string","operation":"equals"},"leftValue":"","rightValue":""}]}},"typeVersion":2.2},{"id":"ab6d5524-5eea-4e63-b4ea-9d0c3de9fda3","name":"Test Node","type":"n8n-nodes-base.noOp","position":[5640,3820],"parameters":{},"typeVersion":1},{"id":"c9191a5a-af84-47cc-a191-f251f2f88093","name":"Test Node (1)","type":"n8n-nodes-base.noOp","position":[5720,3800],"parameters":{},"typeVersion":1},{"id":"d1e8e1da-42cc-4bad-a8f2-10f898646283","name":"Test Node (2)","type":"n8n-nodes-base.noOp","position":[5700,3960],"parameters":{},"typeVersion":1},{"id":"23215c2f-19e8-4129-b752-0e970b01cc05","name":"Schedule Trigger","type":"n8n-nodes-base.scheduleTrigger","position":[5380,3940],"parameters":{"rule":{"interval":[{}]}},"typeVersion":1.2},{"id":"060bacf9-af70-4782-9497-fc553c9f200b","name":"Introduction","type":"n8n-nodes-base.stickyNote","position":[4540,2280],"parameters":{"color":6,"width":620,"height":260,"content":"# Tutorial - n8n Keyboard Shortcuts!\n\nWelcome! This workflow is an interactive playground to help you master the most useful keyboard shortcuts in n8n.\n\n**How to use this tutorial:**\nFollow the main path from top to bottom. Each step will give you a small task to complete using a keyboard shortcut. Just do what the sticky notes say!\n\nLet's begin!"},"typeVersion":1},{"id":"81e7b7ed-e732-4e76-8662-2027994de971","name":"Chapter 1 Header","type":"n8n-nodes-base.stickyNote","position":[4540,2580],"parameters":{"width":2020,"height":500,"content":"## Chapter 1: Node Basics\n\nLet's start with the fundamentals of interacting with a single node."},"typeVersion":1},{"id":"60ce28be-3fc8-42da-864f-29049af8d237","name":"➡️ First, Rename Me!","type":"n8n-nodes-base.noOp","position":[4640,2880],"parameters":{},"typeVersion":1},{"id":"1fdca224-c4d8-4a66-acb8-ed5d59503b2d","name":"➡️ Now, Edit Me!","type":"n8n-nodes-base.set","position":[4920,2880],"parameters":{"options":{},"assignments":{"assignments":[{"id":"12345","name":"my_value","type":"string","value":"Hello World"}]}},"typeVersion":3.4},{"id":"17b57c03-3b8f-4ca0-b787-0b5fd7233177","name":"➡️ This one is extra. Deactivate Me!","type":"n8n-nodes-base.noOp","position":[5200,2880],"parameters":{},"typeVersion":1},{"id":"580773f5-87c3-4ce6-a47a-ed53010d5152","name":"➡️ We need another one. Duplicate Me!","type":"n8n-nodes-base.noOp","position":[5480,2880],"parameters":{},"typeVersion":1},{"id":"042babb6-5d81-4ec6-99bb-1ecc51737d75","name":"Chapter 2 Header","type":"n8n-nodes-base.stickyNote","position":[4540,3120],"parameters":{"color":2,"width":1780,"height":500,"content":"## Chapter 2: Canvas Navigation & Selection\n\nNow let's learn how to move around the canvas and manage multiple nodes like a pro."},"typeVersion":1},{"id":"7677467c-1c2a-43d2-b0d8-ab123c5a1e84","name":"➡️ Let's add a new node","type":"n8n-nodes-base.noOp","position":[4640,3420],"parameters":{},"typeVersion":1},{"id":"f3aa0932-b40b-4344-96d7-406f29338181","name":"➡️ Select these three nodes","type":"n8n-nodes-base.noOp","position":[4920,3420],"parameters":{},"typeVersion":1},{"id":"aaef3fa0-aaa1-403f-be6c-a228dcd21a97","name":"➡️ Now select everything","type":"n8n-nodes-base.noOp","position":[4640,3980],"parameters":{},"typeVersion":1},{"id":"a5f43676-7a1d-43f3-9b4b-a7e5634fc57e","name":"➡️ Zoom out to see it all","type":"n8n-nodes-base.noOp","position":[4900,3980],"parameters":{},"typeVersion":1},{"id":"e66a774b-6aee-42ab-afe7-8576a75c8a96","name":"Chapter 3 Header","type":"n8n-nodes-base.stickyNote","position":[4540,3660],"parameters":{"color":4,"width":1420,"height":500,"content":"## Chapter 3: Advanced Actions\n\nTime for some powerful moves:\n- Repositioning (Tidy Up)\n- Creating sub-workflows.\n- Canvas Zoom Control"},"typeVersion":1},{"id":"eded3259-8aab-4e03-8c8f-08bc2eb4f736","name":"➡️ Copy Me","type":"n8n-nodes-base.noOp","position":[5780,2880],"parameters":{},"typeVersion":1},{"id":"36aa670a-c8de-46bb-9105-2c47400e1742","name":"Chapter 4 Header","type":"n8n-nodes-base.stickyNote","position":[4540,4200],"parameters":{"color":5,"width":960,"height":520,"content":"## Chapter 4: Execution & Debugging\n\nThese shortcuts are essential when you're testing your workflows."},"typeVersion":1},{"id":"ce55c037-9dc1-4f1d-852b-c3e9c57dd39d","name":"➡️ Pin My Data","type":"n8n-nodes-base.set","position":[4920,4540],"parameters":{"options":{},"assignments":{"assignments":[{"id":"12345","name":"status","type":"string","value":"Data is ready!"}]}},"typeVersion":3.4},{"id":"2dd6a69f-449e-498e-a931-e387e9cbd8ca","name":"Conclusion","type":"n8n-nodes-base.stickyNote","position":[4540,4740],"parameters":{"color":6,"width":540,"height":240,"content":"## 🎉 You've Mastered the Basics!\n\nThe most important shortcut of all?\n\n## `Ctrl + S`\n### to Save your workflow!**\n\nDo it often. Congratulations!"},"typeVersion":1},{"id":"762c949c-8d0f-41f3-ba71-6cbef1921a56","name":"Sticky Note13","type":"n8n-nodes-base.stickyNote","position":[4560,2720],"parameters":{"width":260,"height":340,"content":"**Task:** Select this node.\n\nPress **`Space`** to rename it.\n\nCall it \"My First Node\" and press Enter."},"typeVersion":1},{"id":"193ec512-51d0-4e35-93fd-72c887ea7a8e","name":"Sticky Note14","type":"n8n-nodes-base.stickyNote","position":[4840,2700],"parameters":{"width":260,"height":360,"content":"**Task:** Select this Set node.\n\nPress **`Enter`** to open its settings panel.\n\nChange the value from \"Hello World\" to your name!"},"typeVersion":1},{"id":"53456077-077d-44e5-a90d-c977f4dfff2a","name":"Sticky Note15","type":"n8n-nodes-base.stickyNote","position":[5120,2700],"parameters":{"width":260,"height":360,"content":"**Task:** Select this node.\n\nPress **`D`** to deactivate it.\n\nNotice how it turns grey and would be skipped during an execution."},"typeVersion":1},{"id":"f39397f5-25be-41a4-9bdb-d2c54de69fe8","name":"Sticky Note16","type":"n8n-nodes-base.stickyNote","position":[5400,2760],"parameters":{"width":260,"height":300,"content":"**Task:** Select this node.\n\nPress **`Ctrl + D`** to create an exact copy of it."},"typeVersion":1},{"id":"d90d4586-12b1-4263-87de-6be5d1569285","name":"Sticky Note17","type":"n8n-nodes-base.stickyNote","position":[4560,3260],"parameters":{"color":2,"width":260,"height":340,"content":"**Task:** Press **`Tab`** anywhere on the canvas.\n\nThis opens the node search menu. Type \"Set\" and press Enter to add a new Set Node."},"typeVersion":1},{"id":"0be4d82b-9c13-4c41-895f-d4605f51466a","name":"Sticky Note18","type":"n8n-nodes-base.stickyNote","position":[4840,3240],"parameters":{"color":2,"width":700,"height":360,"content":"**Task:** Select multiple nodes.\n\n**Method 1:** Hold **`Ctrl`** and click on Node A, B, and C.\n\n**Method 2:** Click and drag a selection box around all three nodes.\n\n**Method 3:** Click on the first or last node, then hold **`Ctrl`** and press the Left or Right arrow key."},"typeVersion":1},{"id":"e15735b7-11b5-45e7-b70a-97a386c7ee5b","name":"Sticky Note19","type":"n8n-nodes-base.stickyNote","position":[4560,3860],"parameters":{"color":4,"width":260,"height":280,"content":"**Task:** Press **`Ctrl + A`** to select every single node and sticky note on the canvas."},"typeVersion":1},{"id":"c8d8b1f8-2767-474c-89f0-ece01c8a2f5e","name":"Sticky Note20","type":"n8n-nodes-base.stickyNote","position":[4840,3840],"parameters":{"color":4,"height":300,"content":"**Task:** Press **`1`** to fit the entire workflow to your screen.\n\n**Bonus:** Hold **`Ctrl`** and use your mouse wheel to zoom in and out."},"typeVersion":1},{"id":"3404b042-94a5-49d5-bbda-78ca653a8af3","name":"Sticky Note21","type":"n8n-nodes-base.stickyNote","position":[5680,2740],"parameters":{"width":300,"height":320,"content":"**Task:**\n1. Select this node and press **`Ctrl + C`** (Copy) or **`Ctrl + X`** (Cut).\n2. Click anywhere on the empty canvas.\n3. Press **`Ctrl + V`** (Paste)."},"typeVersion":1},{"id":"671c1003-aa71-456b-b45d-de52c690957e","name":"Sticky Note22","type":"n8n-nodes-base.stickyNote","position":[4800,4320],"parameters":{"color":5,"width":340,"height":380,"content":"**Task:**\n1. Click \"Execute Workflow\" on the left of the \"Execute Set Node\".\n2. After it runs, select **this** Set node.\n3. Press **`P`** to **Pin** its data.\n\n\nPinned data stays visible even after you run the workflow again, which is great for comparing results or avoiding run costs and delays!"},"typeVersion":1},{"id":"624f37c1-7f3a-40b2-9da6-ac97fd8b6899","name":"Node 2","type":"n8n-nodes-base.noOp","position":[5140,3420],"parameters":{},"typeVersion":1},{"id":"52785615-0602-451d-bcc9-09f2f28c707c","name":"Node 3","type":"n8n-nodes-base.noOp","position":[5360,3420],"parameters":{},"typeVersion":1},{"id":"f75ab513-6f97-4ad0-91a8-d8528d9c8a96","name":"Execute Set Node","type":"n8n-nodes-base.manualTrigger","position":[4620,4540],"parameters":{},"typeVersion":1},{"id":"5b17f75f-7ee5-4604-bc0d-abe2a8e7a1fb","name":"➡️ Open the Execution Data Panel","type":"n8n-nodes-base.noOp","position":[5260,4540],"parameters":{},"typeVersion":1},{"id":"cbe67873-4baf-47b2-b53f-b24a7519b77d","name":"Sticky Note24","type":"n8n-nodes-base.stickyNote","position":[5160,4400],"parameters":{"color":5,"width":320,"height":300,"content":"**Task:**\n1. Press **`L`** to open the **Execution Panel**.\n2. Press **`O`** to show/hide the **Outputs**\n3. Press **`I`** to show/hide the **Inputs**"},"typeVersion":1},{"id":"66f66abe-3505-43b6-b75d-296d8b973dab","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[5100,3720],"parameters":{"color":7,"width":840,"height":420,"content":"**Task:** Select the nodes in this node.\n\nPress  **`Shift + Alt + T`**  to tidy up selected nodes.\n\nPress  **`Alt + X`**  to create a sub workflow with selected nodes."},"typeVersion":1},{"id":"bebda701-fa75-4c09-a1ee-3374d9ef63fa","name":"Sticky Note25","type":"n8n-nodes-base.stickyNote","position":[6000,2700],"parameters":{"width":280,"height":360,"content":"**Task:**\n1. Select this node.\n2. Press **`Del`** to delete the selected node.\n3. Press **`Ctrl + Z`** to undo.\n4. Press **`Ctrl + Shift + Z`** to re-do (it will re-delete me!)."},"typeVersion":1},{"id":"f193c6e9-2a73-4837-8ea7-3b0f933609db","name":"➡️ Delete me!","type":"n8n-nodes-base.noOp","position":[6080,2880],"parameters":{},"typeVersion":1},{"id":"3fe1ec6e-445f-490f-8418-399d7a61e1fb","name":"➡️ Add a Sticky Node","type":"n8n-nodes-base.noOp","position":[6360,2880],"parameters":{},"typeVersion":1},{"id":"4fbc63ca-6949-4623-8052-cfd51cd27f1e","name":"Sticky Note26","type":"n8n-nodes-base.stickyNote","position":[6300,2760],"parameters":{"height":300,"content":"**Task:** Add a sticky note.\n\nPress **`Shift + S`** to add a new Sticky Note."},"typeVersion":1},{"id":"a6565c59-2273-442b-8e35-72be9c010157","name":"Sticky Note27","type":"n8n-nodes-base.stickyNote","position":[5560,3240],"parameters":{"color":2,"width":740,"height":360,"content":"**Task:** Move between nodes\n\n**Method 1:** Select a node, then use the arrow keys to move to the next or previous node.\n\n**Method 2:** Open a node (select it + Enter), then navigate to the next or previous node directly from the edit panel.\n👉 Look for the target node on the left or right edge of your screen, centered vertically."},"typeVersion":1},{"id":"61ed0817-5659-43e5-8f11-e31513dd5680","name":"Node A","type":"n8n-nodes-base.noOp","position":[5640,3420],"parameters":{},"typeVersion":1},{"id":"6e63eebb-5ec6-458c-a4ee-f97f52365e97","name":"Node B","type":"n8n-nodes-base.noOp","position":[5880,3420],"parameters":{},"typeVersion":1},{"id":"77db4ffb-348b-427f-bed3-c3c7afe6e7fb","name":"Node C","type":"n8n-nodes-base.noOp","position":[6120,3420],"parameters":{},"typeVersion":1},{"id":"b7a0a3c7-c962-4324-b10d-2481aa45141e","name":"Sticky Note12","type":"n8n-nodes-base.stickyNote","position":[4540,5000],"parameters":{"color":3,"width":540,"height":800,"content":"## Was this helpful? Let me know!\n\nI really hope this tutorial helped you understand n8n shortcuts better. Your feedback is incredibly valuable and helps me create better resources for the n8n community.\n\n### **Share Your Thoughts & Ideas**\n\nWhether you have a suggestion, found a typo, or just want to say thanks, I'd love to hear from you!\nHere's a simple n8n form built for this purpose:\n\n#### ➡️ **[Click here to give feedback](https://api.ia2s.app/form/templates/feedback?template=Shortcuts%20Tutorial)**\n\n### **Ready to Build Something Great?**\n\nIf you're looking to take your n8n skills or business automation to the next level, I can help.\n\n**🎓 n8n Coaching:** Want to become an n8n pro? I offer one-on-one coaching sessions to help you master workflows, tackle specific problems, and build with confidence.\n#### ➡️ **[Book a Coaching Session](https://api.ia2s.app/form/templates/coaching?template=Shortcuts%20Tutorial)**\n\n**💼 n8n Consulting:** Have a complex project, an integration challenge, or need a custom workflow built for your business? Let's work together to create a powerful automation solution.\n#### ➡️ **[Inquire About Consulting Services](https://api.ia2s.app/form/templates/consulting?template=Shortcuts%20Tutorial)**\n\n---\n\nHappy Automating!\nLucas Peyrin"},"typeVersion":1}],"connections":{"Node 2":{"main":[[{"node":"Node 3","type":"main","index":0}]]},"Node A":{"main":[[{"node":"Node B","type":"main","index":0}]]},"Node B":{"main":[[{"node":"Node C","type":"main","index":0}]]},"Test IF":{"main":[[{"node":"Test Node (1)","type":"main","index":0}],[{"node":"Test Node (2)","type":"main","index":0}]]},"Test Node":{"main":[[{"node":"Test IF","type":"main","index":0}]]},"➡️ Copy Me":{"main":[[{"node":"➡️ Delete me!","type":"main","index":0}]]},"Execute Set Node":{"main":[[{"node":"➡️ Pin My Data","type":"main","index":0}]]},"Schedule Trigger":{"main":[[{"node":"Test Node","type":"main","index":0}]]},"➡️ Delete me!":{"main":[[{"node":"➡️ Add a Sticky Node","type":"main","index":0}]]},"➡️ Pin My Data":{"main":[[{"node":"➡️ Open the Execution Data Panel","type":"main","index":0}]]},"➡️ Now, Edit Me!":{"main":[[{"node":"➡️ This one is extra. Deactivate Me!","type":"main","index":0}]]},"➡️ First, Rename Me!":{"main":[[{"node":"➡️ Now, Edit Me!","type":"main","index":0}]]},"➡️ Let's add a new node":{"main":[[]]},"➡️ Now select everything":{"main":[[{"node":"➡️ Zoom out to see it all","type":"main","index":0}]]},"➡️ Zoom out to see it all":{"main":[[]]},"➡️ Select these three nodes":{"main":[[{"node":"Node 2","type":"main","index":0}]]},"➡️ This one is extra. Deactivate Me!":{"main":[[{"node":"➡️ We need another one. Duplicate Me!","type":"main","index":0}]]},"➡️ We need another one. Duplicate Me!":{"main":[[{"node":"➡️ Copy Me","type":"main","index":0}]]}}}


name: Learn n8n Expressions with an Interactive Step-by-Step Tutorial for Beginners
author_name: Lucas Peyrin
author_username: lucaspeyrin
nodes_used: []
categories: []
created_at: 2025-06-24T23:29:16.970Z
updated_at: 2025-06-24T23:29:16.970Z
url: https://n8n.io/workflows/5271
scraped_at: 2025-07-06 21:16:30
description:
  How it works

  This template is an interactive, step-by-step tutorial designed to teach you the most important skill in n8n: using expressions to access and manipulate data.

  If you know what JSON is but aren't sure how to pull a specific piece of information from one node and use it in another, this workflow is for you. It starts with a single "Source Data" node that acts as our filing cabinet, and then walks you through a series of lessons, each demonstrating a new technique for retrieving and transforming that data.

  You will learn how to:
  Access a simple value from a previous node.
  Use n8n's built-in selectors like .last() and .first().
  Get a specific item from a list (Array).
  Drill down into nested data (Objects).
  Combine these techniques to access data in an array of objects.
  Go beyond simple retrieval by using JavaScript functions to do math or change text.
  Inspect data with utility functions like Object.keys() and JSON.stringify().
  Summarize data from multiple items using .all() and arrow functions.

  Set up steps

  Setup time: 0 minutes!

  This workflow is a self-contained tutorial and requires no setup or external credentials.

  Click "Execute Workflow" to run the entire tutorial.
  Follow the flow from the "Source Data" node to the "Final Exam" node.
  For each lesson, click on the node to see how its expressions are configured in the parameters panel.
  Read the detailed sticky note next to each lesson—it breaks down exactly how the expression works and why.

  By the end, you'll have the foundational knowledge to connect data and build powerful, dynamic workflows in n8n.

workflow_json:
  {"meta":{"instanceId":"e409ea34548a2afe2dffba31130cd1cf2e98ebe2afaeed2a63caf2a0582d1da0"},"nodes":[{"id":"8d116e01-e52f-4a6b-85e4-bdbeb980f9f9","name":"Start Tutorial","type":"n8n-nodes-base.manualTrigger","position":[-700,300],"parameters":{},"typeVersion":1},{"id":"67db85ae-7f2e-4823-867e-44709a01f6f3","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-960,-100],"parameters":{"color":5,"width":640,"height":560,"content":"# Tutorial - Mastering n8n Expressions\n\nWelcome! You know what JSON is. Now, let's learn how to **use it**. This workflow teaches you how to pull data from one node and use it in another using n8n's powerful expressions.\n\n**What is an Expression?**\nAn expression is a small piece of code inside double curly braces `{{ }}` that gets replaced with a dynamic value when the workflow runs. It's the \"glue\" that connects your nodes.\n\n**How to use this tutorial:**\n1.  The first node, **\"Source Data\"**, contains all the data we will use. Execute it once to see what's inside.\n2.  Follow the path from top to bottom. Each node is a new lesson.\n3.  Read the sticky note for each lesson, then look at the node's configuration and its output to understand the concept."},"typeVersion":1},{"id":"d0e948fc-e924-4fbd-b7a3-caee971d16cf","name":"Source Data","type":"n8n-nodes-base.set","position":[-80,300],"parameters":{"options":{},"assignments":{"assignments":[{"id":"12345","name":"name","type":"string","value":"Alice"},{"id":"67890","name":"age","type":"number","value":30},{"id":"abcde","name":"is_active","type":"boolean","value":true},{"id":"fghij","name":"skills","type":"array","value":"[\"JavaScript\",\"Python\",\"n8n\"]"},{"id":"klmno","name":"projects","type":"array","value":"[{\"name\":\"Project A\",\"status\":\"Done\"},{\"name\":\"Project B\",\"status\":\"In Progress\"}]"},{"id":"pqrst","name":"contact","type":"object","value":"{\"email\":\"alice@example.com\",\"phone\":null}"}]}},"typeVersion":3.4},{"id":"c940a0b9-8982-4d61-b434-ca6f7ff46bc9","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-300,-60],"parameters":{"color":7,"width":520,"height":520,"content":"## Our Data Source\n\nThis node holds all the sample data for our tutorial. Think of it as a filing cabinet. All the other nodes will be reaching into this cabinet to pull out specific pieces of information.\n\nTake a look at its output to familiarize yourself with the structure.\nWe have:\n- Simple text (`name`)\n- A number (`age`)\n- A list of skills (`skills`)\n- A list of complex projects (`projects`)\n- A nested contact object (`contact`)"},"typeVersion":1},{"id":"dcf9916f-a260-40fa-9503-2f9e5041b666","name":"1. The Basics","type":"n8n-nodes-base.set","position":[440,300],"parameters":{"options":{},"assignments":{"assignments":[{"id":"12345","name":"user_name","type":"string","value":"={{ $('Source Data').item.json.name }}"}]}},"typeVersion":3.4},{"id":"45b5e6a7-b588-4859-86e1-a6a73b67d837","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[240,-120],"parameters":{"color":2,"width":500,"height":580,"content":"## Lesson 1: Accessing a Simple Value\n\nThis is the most common thing you'll do in n8n.\n\n**The Goal:** Get the user's name from the \"Source Data\" node.\n\n**The Expression:** `{{ $('Source Data').item.json.name }}`\n\n**Breakdown:**\n- `{{ ... }}`: Tells n8n \"this is a dynamic expression\".\n- `$('Source Data')`: Selects the node we want data from.\n- `.item.json`: Narrows it down to the JSON data of the current item.\n- `.name`: Selects the specific **key** we want the value of.\n\n**Other Possibility:**\n`{{ $json.name }}` would also work in this case, as `$json` accesses the data from the previous node."},"typeVersion":1},{"id":"10c04c66-e07c-4ee5-8b2b-6d4de7c31c9f","name":"3. Working with Arrays","type":"n8n-nodes-base.set","position":[1680,300],"parameters":{"options":{},"assignments":{"assignments":[{"id":"12345","name":"second_skill","type":"string","value":"={{ $('Source Data').last().json.skills[1] }}"}]}},"typeVersion":3.4},{"id":"c4d1f2e2-bd7f-4c96-863d-45cc473d05a6","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[1460,-60],"parameters":{"color":4,"width":540,"height":520,"content":"## Lesson 3: Accessing an Array Element\n\nWhat if the data is in a list (an array)? You need to specify *which* item you want.\n\n**The Goal:** Get the user's *second* skill.\n\n**The Expression:** `{{ $('Source Data').last().json.skills[1] }}`\n\n**Breakdown:**\n- `...skills`: Selects the array of skills.\n- `[1]`: Selects the item at a specific position.\n- **IMPORTANT:** Arrays are \"zero-indexed\", which means the first item is `[0]`, the second is `[1]`, the third is `[2]`, and so on."},"typeVersion":1},{"id":"4b112b69-d29d-4963-9ee2-fe434bcbb2f7","name":"4. Going Deeper","type":"n8n-nodes-base.set","position":[2240,300],"parameters":{"options":{},"assignments":{"assignments":[{"id":"12345","name":"user_email","type":"string","value":"={{ $('Source Data').last().json.contact.email }}"}]}},"typeVersion":3.4},{"id":"f157c7e6-ce9b-4049-a8b3-d309eec3048b","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[2020,-20],"parameters":{"color":5,"width":540,"height":480,"content":"## Lesson 4: Accessing Nested Data\n\nSometimes, data is organized into objects within other objects.\n\n**The Goal:** Get the user's email address.\n\n**The Expression:** `{{ $('Source Data').last().json.contact.email }}`\n\n**Breakdown:**\n- `...contact`: First, we access the `contact` object.\n- `.email`: Then, we use another dot `.` to go one level deeper and get the value of the `email` key inside it."},"typeVersion":1},{"id":"ce9265d7-9bab-45d2-8fec-e50bc11c9760","name":"5. The Combo Move","type":"n8n-nodes-base.set","position":[2820,300],"parameters":{"options":{},"assignments":{"assignments":[{"id":"12345","name":"first_project_status","type":"string","value":"={{ $('Source Data').last().json.projects[0].status }}"}]}},"typeVersion":3.4},{"id":"8e612af5-7404-49b8-b908-44467b4f257a","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[2580,-20],"parameters":{"color":6,"width":580,"height":480,"content":"## Lesson 5: Accessing Data in an Array of Objects\n\nThis is the ultimate test of the previous lessons!\n\n**The Goal:** Get the *status* of the *first* project in the list.\n\n**The Expression:** `{{ $('Source Data').last().json.projects[0].status }}`\n\n**Breakdown:**\n1.  `...projects`: We select the array of projects.\n2.  `[0]`: We pick the first object in that array.\n3.  `.status`: From that chosen object, we grab the value of the `status` key."},"typeVersion":1},{"id":"21ee04f0-1465-4166-bca9-e1b3a9dd21f6","name":"6. A Touch of Magic","type":"n8n-nodes-base.set","position":[3420,300],"parameters":{"options":{},"assignments":{"assignments":[{"id":"12345","name":"name_in_caps","type":"string","value":"={{ $('Source Data').last().json.name.toUpperCase() }}"},{"id":"67890","name":"age_in_dog_years","type":"number","value":"={{ Math.round($('Source Data').last().json.age / 7) }}"},{"id":"abcde","name":"age_data_type","type":"string","value":"={{ typeof $('Source Data').last().json.age }}"}]}},"typeVersion":3.4},{"id":"6d307691-2789-467a-b005-5fb92b821a9b","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[3180,-60],"parameters":{"color":3,"width":580,"height":520,"content":"## Lesson 6: A Touch of Magic (JS Functions)\n\nYou can do more than just retrieve data; you can **manipulate and inspect it!**\n\n**The Expressions:**\n- **Transform Text:** `{{ $('Source Data').last().json.name.toUpperCase() }}`\n- **Do Math:** `{{ Math.round($('Source Data').last().json.age / 7) }}`\n- **Check Data Type:** `{{ typeof $('Source Data').last().json.age }}`\n\n**Breakdown:**\n- **`.toUpperCase()`**: A standard JavaScript function for strings.\n- **`Math.round(...)`**: The `Math` object gives you access to powerful math functions.\n- **`typeof`**: An operator that tells you what kind of data you're looking at (\"string\", \"number\", \"object\", etc.)."},"typeVersion":1},{"id":"14e8aec7-6681-49a9-a9fc-df14f2af2800","name":"9. The \"All Items\" View","type":"n8n-nodes-base.set","position":[5340,300],"parameters":{"options":{},"assignments":{"assignments":[{"id":"12345","name":"all_skills_string","type":"string","value":"={{ $('Split Out Skills').all().map(item => item.json.skills).join(', ') }}"}]}},"executeOnce":true,"typeVersion":3.4},{"id":"df1f2512-f89b-4602-973c-20bd5c9257a7","name":"Sticky Note7","type":"n8n-nodes-base.stickyNote","position":[4900,-60],"parameters":{"color":5,"width":780,"height":520,"content":"## Lesson 9: Working with Multiple Items (`$items` & Arrow Functions)\n\nWhat if a node outputs *multiple* items and you want to summarize them? `$items()` is your tool.\n\n**The Goal:** Get a single, comma-separated string of all the user's skills.\n\n**The Expression:** `{{ $('Split Out Skills').all().map(item `=>` item.json.skills).join(', ') }}`\n\n**What is `item => ...`?**\nThis is an **Arrow Function**, a shorthand for \"for each thing, do this\".\n- `item`: A temporary name for each item in the list as we loop over it.\n- =>: The \"arrow\" that separates the item from the action.\n- `item.json.skills`: The action to perform—in this case, get the skill value from the item."},"typeVersion":1},{"id":"238fc0f7-1616-4fb0-8368-3eae3dcaa61b","name":"Final Exam","type":"n8n-nodes-base.set","position":[5920,300],"parameters":{"options":{},"assignments":{"assignments":[{"id":"12345","name":"final_summary","type":"string","value":"=User {{ $('2. The n8n Selectors').last().json.user_name_from_first }} is {{ $('Source Data').last().json.age }}.\n\nTheir best skill is {{ $('3. Working with Arrays').last().json.second_skill }}.\n\nTheir first project was {{ $('Source Data').last().json.projects[0].name }}, which is now {{ $('5. The Combo Move').last().json.first_project_status }}.\n\nAll skills: {{ $('9. The \"All Items\" View').last().json.all_skills_string }}."}]}},"typeVersion":3.4},{"id":"2a2763a7-8190-410b-a257-1448de25d2f5","name":"Sticky Note8","type":"n8n-nodes-base.stickyNote","position":[5700,40],"parameters":{"color":6,"width":520,"height":420,"content":"## 🎓 FINAL EXAM: Putting It All Together\n\nThis node uses everything we've learned to build a final summary object.\n\nLook at the expressions for each field. They pull data from different nodes and use different techniques you've just practiced.\n\n**Congratulations! You now have the foundational knowledge to link data and build powerful, dynamic workflows in n8n.**"},"typeVersion":1},{"id":"0a3679ae-61cd-4745-b11f-5341a519a820","name":"2. The n8n Selectors","type":"n8n-nodes-base.set","position":[1060,300],"parameters":{"options":{},"assignments":{"assignments":[{"id":"12345","name":"user_name_from_first","type":"string","value":"={{ $('Source Data').last().json.name }}"}]}},"typeVersion":3.4},{"id":"4da0dce4-325c-4e91-af03-11e65f764f61","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[760,-160],"parameters":{"width":680,"height":620,"content":"## Lesson 2: The n8n Selectors (`.first()`, `.last()`, `.all()`)\n\nIn the last lesson, we used `.item`. When there is only one output item from a node, this is equivalent to `.last()`. Using `.last()` explicitly is often safer and clearer.\n\n**The Goal:** Get the user's name using the `.last()` selector.\n\n**The Expression:** `{{ $('Source Data').last().json.name }}`\n\n**Why is this better?**\nIf a node ever returns multiple items, `.last()` guarantees you only get data from the very last one.\n\nIf you ever need to match the selected data with the input items, this is where `.item` cannot be replaced.\n\n**Other Selectors:**\n- **`.first()`**: Gets the data from the first item.\n- **`.all()`**: Gets data from ALL items, returning it as an array of objects. (This is different from `$items`!)"},"typeVersion":1},{"id":"f1327f83-1163-4879-8caa-06c5b8e2bbaa","name":"7. Inspecting Objects","type":"n8n-nodes-base.set","position":[3980,300],"parameters":{"options":{},"assignments":{"assignments":[{"id":"12345","name":"contact_keys","type":"array","value":"={{ Object.keys($('Source Data').last().json.contact) }}"}]}},"typeVersion":3.4},{"id":"29aad30e-74ed-48ff-b8c4-93cd31d34eea","name":"Sticky Note10","type":"n8n-nodes-base.stickyNote","position":[3780,-60],"parameters":{"color":2,"width":500,"height":520,"content":"## Lesson 7: Inspecting Objects (`Object.keys()`)\n\nWhat if you have an object but you don't know what keys are inside it? `Object.keys()` comes to the rescue.\n\n**The Goal:** Get a list of all the keys inside the `contact` object.\n\n**The Expression:** `{{ Object.keys($('Source Data').last().json.contact) }}`\n\nThis is incredibly useful for dynamically processing data. It returns an **array** containing the names of the keys (e.g., `[\"email\", \"phone\"]`)."},"typeVersion":1},{"id":"11b91408-ab82-4d5e-9dc8-4b9d54e0a60f","name":"8. Utility Functions","type":"n8n-nodes-base.set","position":[4540,300],"parameters":{"options":{},"assignments":{"assignments":[{"id":"12345","name":"contact_as_string","type":"string","value":"={{ JSON.stringify($('Source Data').last().json.contact, null, 2) }}"},{"id":"06003b65-7482-4d5a-b2c0-1794859ab461","name":"skills","type":"array","value":"={{ $('Source Data').last().json.skills }}"}]}},"typeVersion":3.4},{"id":"a0a39b92-f42e-4bb9-a601-bbc1fa5589b7","name":"Sticky Note11","type":"n8n-nodes-base.stickyNote","position":[4300,-60],"parameters":{"width":580,"height":520,"content":"## Lesson 8: Utility Functions (`JSON.stringify()`)\n\nSometimes you need to convert a structured JSON object back into a clean, single string. This is common when sending data to another service, like in an AI prompt.\n\n**The Goal:** Turn the entire `contact` object into a formatted string.\n\n**The Expression:** `{{ JSON.stringify($('Source Data').last().json.contact, null, 2) }}`\n\n**Breakdown:**\n- **`JSON.stringify(...)`**: The function that does the conversion.\n- **`null, 2`**: These optional parameters tell it to \"pretty-print\" the string with an indentation of 2 spaces, making it readable."},"typeVersion":1},{"id":"90c7d692-e2b8-4a89-8acb-138f9db1f316","name":"Split Out Skills","type":"n8n-nodes-base.splitOut","position":[5120,300],"parameters":{"include":"allOtherFields","options":{},"fieldToSplitOut":"skills"},"typeVersion":1},{"id":"2f6ab8cd-9ce0-4ac3-9167-46a435825e25","name":"Sticky Note12","type":"n8n-nodes-base.stickyNote","position":[6240,-340],"parameters":{"color":4,"width":540,"height":800,"content":"## Was this helpful? Let me know!\n\nI really hope this tutorial helped you understand n8n Expressions better. Your feedback is incredibly valuable and helps me create better resources for the n8n community.\n\n### **Share Your Thoughts & Ideas**\n\nWhether you have a suggestion, found a typo, or just want to say thanks, I'd love to hear from you!\nHere's a simple n8n form built for this purpose:\n\n#### ➡️ **[Click here to give feedback](https://api.ia2s.app/form/templates/feedback?template=Expressions%20Tutorial)**\n\n### **Ready to Build Something Great?**\n\nIf you're looking to take your n8n skills or business automation to the next level, I can help.\n\n**🎓 n8n Coaching:** Want to become an n8n pro? I offer one-on-one coaching sessions to help you master workflows, tackle specific problems, and build with confidence.\n#### ➡️ **[Book a Coaching Session](https://api.ia2s.app/form/templates/coaching?template=Expressions%20Tutorial)**\n\n**💼 n8n Consulting:** Have a complex project, an integration challenge, or need a custom workflow built for your business? Let's work together to create a powerful automation solution.\n#### ➡️ **[Inquire About Consulting Services](https://api.ia2s.app/form/templates/consulting?template=Expressions%20Tutorial)**\n\n---\n\nHappy Automating!\nLucas Peyrin"},"typeVersion":1}],"connections":{"Source Data":{"main":[[{"node":"1. The Basics","type":"main","index":0}]]},"1. The Basics":{"main":[[{"node":"2. The n8n Selectors","type":"main","index":0}]]},"Start Tutorial":{"main":[[{"node":"Source Data","type":"main","index":0}]]},"4. Going Deeper":{"main":[[{"node":"5. The Combo Move","type":"main","index":0}]]},"Split Out Skills":{"main":[[{"node":"9. The \"All Items\" View","type":"main","index":0}]]},"5. The Combo Move":{"main":[[{"node":"6. A Touch of Magic","type":"main","index":0}]]},"6. A Touch of Magic":{"main":[[{"node":"7. Inspecting Objects","type":"main","index":0}]]},"2. The n8n Selectors":{"main":[[{"node":"3. Working with Arrays","type":"main","index":0}]]},"8. Utility Functions":{"main":[[{"node":"Split Out Skills","type":"main","index":0}]]},"7. Inspecting Objects":{"main":[[{"node":"8. Utility Functions","type":"main","index":0}]]},"3. Working with Arrays":{"main":[[{"node":"4. Going Deeper","type":"main","index":0}]]},"9. The \"All Items\" View":{"main":[[{"node":"Final Exam","type":"main","index":0}]]}}}


name: 🛠️ Elastic Security Tool MCP Server 💪 all 14 operations
author_name: David Ashby
author_username: cfomodz
nodes_used: []
categories: []
created_at: 2025-06-25T00:02:14.719Z
updated_at: 2025-06-25T00:02:14.719Z
url: https://n8n.io/workflows/5273
scraped_at: 2025-07-06 21:16:30
description:
  🛠️ Elastic Security Tool MCP Server

  Complete MCP server exposing all Elastic Security Tool operations to AI agents. Zero configuration needed - all 14 operations pre-built.

  ⚡ Quick Setup

  Import this workflow into your n8n instance
  Activate the workflow to start your MCP server
  Copy the webhook URL from the MCP trigger node
  Connect AI agents using the MCP URL

  🔧 How it Works

  • MCP Trigger: Serves as your server endpoint for AI agent requests
  • Tool Nodes: Pre-configured for every Elastic Security Tool operation
  • AI Expressions: Automatically populate parameters via $fromAI() placeholders
  • Native Integration: Uses official n8n Elastic Security Tool tool with full error handling

  📋 Available Operations (14 total)

  Every possible Elastic Security Tool operation is included:

  🔧 Case (6 operations)

  • Create a case
  • Delete a case
  • Get a case
  • Get many cases
  • Get the status of a case
  • Update a case

  🔧 Casecomment (5 operations)

  • Add a comment to a case
  • Get a case comment
  • Get many case comments
  • Remove a comment from a case
  • Update a comment from a case

  🔧 Casetag (2 operations)

  • Add a tag to a case
  • Remove a tag from a case

  🔧 Connector (1 operations)

  • Create a connector

  🤖 AI Integration

  Parameter Handling: AI agents automatically provide values for:
  • Resource IDs and identifiers
  • Search queries and filters
  • Content and data payloads
  • Configuration options

  Response Format: Native Elastic Security Tool API responses with full data structure

  Error Handling: Built-in n8n error management and retry logic

  💡 Usage Examples

  Connect this MCP server to any AI agent or workflow:

  • Claude Desktop: Add MCP server URL to configuration
  • Custom AI Apps: Use MCP URL as tool endpoint
  • Other n8n Workflows: Call MCP tools from any workflow
  • API Integration: Direct HTTP calls to MCP endpoints

  ✨ Benefits

  • Complete Coverage: Every Elastic Security Tool operation available
  • Zero Setup: No parameter mapping or configuration needed
  • AI-Ready: Built-in $fromAI() expressions for all parameters
  • Production Ready: Native n8n error handling and logging
  • Extensible: Easily modify or add custom logic

  🆓 Free for community use! Ready to deploy in under 2 minutes.

workflow_json:
  {"id":"dFReuElL2jc30U30","meta":null,"name":"Elastic Security Tool MCP Server","tags":[],"nodes":[{"id":"1b0b689c-17f5-4977-b86f-a90daedd772d","name":"Workflow Overview 0","type":"n8n-nodes-base.stickyNote","position":[-1460,-120],"parameters":{"content":""},"typeVersion":1},{"id":"64989c15-3897-4859-8b0f-5762fdaf83cb","name":"Elastic Security Tool MCP Server","type":"@n8n/n8n-nodes-langchain.mcpTrigger","position":[-420,-120],"webhookId":"c9275187-da72-4758-a63d-35bcff0ec77b","parameters":{},"typeVersion":1},{"id":"0e16069f-2dc4-42f8-9855-3ff9146ad953","name":"Create a case","type":"n8n-nodes-base.elasticSecurityTool","position":[-800,140],"parameters":{},"typeVersion":1},{"id":"e48eb579-d2e8-4090-b4b4-2728e77fa91a","name":"Delete a case","type":"n8n-nodes-base.elasticSecurityTool","position":[-580,140],"parameters":{},"typeVersion":1},{"id":"6fd50cad-007d-4337-8ae9-c6ca78a39450","name":"Get a case","type":"n8n-nodes-base.elasticSecurityTool","position":[-360,140],"parameters":{},"typeVersion":1},{"id":"7534fe88-8241-40ec-810c-87c0825b6914","name":"Get many cases","type":"n8n-nodes-base.elasticSecurityTool","position":[-140,140],"parameters":{},"typeVersion":1},{"id":"5af9f3cd-fd95-4b13-b9b4-28b8d5731d6d","name":"Get the status of a case","type":"n8n-nodes-base.elasticSecurityTool","position":[80,140],"parameters":{},"typeVersion":1},{"id":"3cc61d64-4c3d-4d1d-9b7c-a583fae80d01","name":"Update a case","type":"n8n-nodes-base.elasticSecurityTool","position":[300,140],"parameters":{},"typeVersion":1},{"id":"cf296e2a-42d4-4de5-b8f7-4172c98c123e","name":"Sticky Note 1","type":"n8n-nodes-base.stickyNote","position":[-1000,120],"parameters":{"content":""},"typeVersion":1},{"id":"f7811ca0-1b6e-463f-abcd-e726745ce07d","name":"Add a comment to a case","type":"n8n-nodes-base.elasticSecurityTool","position":[-800,380],"parameters":{},"typeVersion":1},{"id":"3778af46-cc85-4275-bea8-bcc032ea455f","name":"Get a case comment","type":"n8n-nodes-base.elasticSecurityTool","position":[-580,380],"parameters":{},"typeVersion":1},{"id":"98c14244-0e87-4557-b11a-7b6e780c6769","name":"Get many case comments","type":"n8n-nodes-base.elasticSecurityTool","position":[-360,380],"parameters":{},"typeVersion":1},{"id":"69a31bc4-19a9-4282-948f-c7d65e097580","name":"Remove a comment from a case","type":"n8n-nodes-base.elasticSecurityTool","position":[-140,380],"parameters":{},"typeVersion":1},{"id":"a9f394ae-a4f8-440e-b309-1bc386a5399e","name":"Update a comment from a case","type":"n8n-nodes-base.elasticSecurityTool","position":[80,380],"parameters":{},"typeVersion":1},{"id":"bac4b9d6-2e1a-4eaf-b53b-f8d47a426ac6","name":"Sticky Note 2","type":"n8n-nodes-base.stickyNote","position":[-1000,360],"parameters":{"content":""},"typeVersion":1},{"id":"15e7f9e4-d13a-49b3-a3d2-18fbcfed0236","name":"Add a tag to a case","type":"n8n-nodes-base.elasticSecurityTool","position":[-800,620],"parameters":{},"typeVersion":1},{"id":"64837681-76a4-4dd8-8166-925a521c2d25","name":"Remove a tag from a case","type":"n8n-nodes-base.elasticSecurityTool","position":[-580,620],"parameters":{},"typeVersion":1},{"id":"3c3fa1e3-959a-4246-a5f3-b9fe6936ce26","name":"Sticky Note 3","type":"n8n-nodes-base.stickyNote","position":[-1000,600],"parameters":{"content":""},"typeVersion":1},{"id":"b002f6c8-fe33-4565-844e-125a00fba7ef","name":"Create a connector","type":"n8n-nodes-base.elasticSecurityTool","position":[-800,-100],"parameters":{},"typeVersion":1},{"id":"e746bf71-bb84-4835-9ccd-59012efafb95","name":"Sticky Note 4","type":"n8n-nodes-base.stickyNote","position":[-1000,-120],"parameters":{"content":""},"typeVersion":1}],"active":false,"shared":[{"role":"workflow:owner","project":{"id":"G5fce9xGuBAsWBXe","icon":null,"name":"David Ashby <david.ashby.lds@gmail.com>","type":"personal","createdAt":"2025-06-04T02:55:02.013Z","updatedAt":"2025-06-04T02:56:01.361Z","projectRelations":[{"role":"project:personalOwner","user":{"id":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","role":"global:owner","email":"david.ashby.lds@gmail.com","disabled":false,"lastName":"Ashby","settings":{"npsSurvey":{"responded":true,"lastShownAt":1749357655581},"userActivated":true,"userActivatedAt":1749075994495,"easyAIWorkflowOnboarded":true,"firstSuccessfulWorkflowId":"3N3vVikZb3MckFYm"},"createdAt":"2025-06-04T02:55:01.745Z","firstName":"David","isPending":false,"updatedAt":"2025-06-08T04:40:58.399Z","mfaEnabled":false,"personalizationAnswers":{"version":"v4","personalization_survey_n8n_version":"1.95.3","personalization_survey_submitted_at":"2025-06-04T02:56:07.075Z"}},"userId":"715c1c00-cb48-4712-9a32-f1f4b6db2b30","createdAt":"2025-06-04T02:55:02.013Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-04T02:55:02.013Z"}]},"createdAt":"2025-06-25T00:00:27.162Z","projectId":"G5fce9xGuBAsWBXe","updatedAt":"2025-06-25T00:00:27.162Z","workflowId":"dFReuElL2jc30U30"}],"settings":{"timezone":"America/New_York"},"createdAt":"2025-06-25T00:00:27.161Z","updatedAt":"2025-06-25T00:01:46.000Z","versionId":"7caa2666-d3f8-412b-8bd7-520690f20e00","isArchived":false,"staticData":null,"connections":{"Get a case":{"ai_tool":[[{"node":"Elastic Security Tool MCP Server","type":"ai_tool","index":0}]]},"Create a case":{"ai_tool":[[{"node":"Elastic Security Tool MCP Server","type":"ai_tool","index":0}]]},"Delete a case":{"ai_tool":[[{"node":"Elastic Security Tool MCP Server","type":"ai_tool","index":0}]]},"Update a case":{"ai_tool":[[{"node":"Elastic Security Tool MCP Server","type":"ai_tool","index":0}]]},"Get many cases":{"ai_tool":[[{"node":"Elastic Security Tool MCP Server","type":"ai_tool","index":0}]]},"Create a connector":{"ai_tool":[[{"node":"Elastic Security Tool MCP Server","type":"ai_tool","index":0}]]},"Get a case comment":{"ai_tool":[[{"node":"Elastic Security Tool MCP Server","type":"ai_tool","index":0}]]},"Add a tag to a case":{"ai_tool":[[{"node":"Elastic Security Tool MCP Server","type":"ai_tool","index":0}]]},"Get many case comments":{"ai_tool":[[{"node":"Elastic Security Tool MCP Server","type":"ai_tool","index":0}]]},"Add a comment to a case":{"ai_tool":[[{"node":"Elastic Security Tool MCP Server","type":"ai_tool","index":0}]]},"Get the status of a case":{"ai_tool":[[{"node":"Elastic Security Tool MCP Server","type":"ai_tool","index":0}]]},"Remove a tag from a case":{"ai_tool":[[{"node":"Elastic Security Tool MCP Server","type":"ai_tool","index":0}]]},"Remove a comment from a case":{"ai_tool":[[{"node":"Elastic Security Tool MCP Server","type":"ai_tool","index":0}]]},"Update a comment from a case":{"ai_tool":[[{"node":"Elastic Security Tool MCP Server","type":"ai_tool","index":0}]]}},"triggerCount":0}


name: Daily Govt Exam Quiz by Gopal Debnath (mrtechyguru)
author_name: Gopal Debnath
author_username: mrtechyguru
categories: []
created_at: 2025-06-25T06:09:00.740Z
updated_at: 2025-06-25T06:09:00.740Z
url: https://n8n.io/workflows/5284
scraped_at: 2025-07-06 21:16:30
description:
  💡 How It Works:

  ⏰ Triggers daily at 6:00 AM


  📊 Fetches one random question from your Google Sheet


  🧠 Formats question, options, correct answer, and explanation


  📤 Sends it to:

  📧 Email

  💬 Telegram (via Bot)

  📱 WhatsApp/SMS (via Twilio)





  🔧 What You Need to Configure:

  YOUR_GOOGLE_SHEET_ID → your sheet with columns: question, optionA, optionB, optionC, optionD, correctAnswer, explanation

  Email credentials (SMTP)

  Telegram Bot Token & Chat ID

  Twilio phone numbers and credentials

nodes_used:
  ["n8n-nodes-base.emailSend","n8n-nodes-base.googleSheets","n8n-nodes-base.twilio","n8n-nodes-base.telegram"]

workflow_json:
  {"name":"Daily Govt Exam Quiz Delivery","nodes":[{"name":"Daily Trigger","type":"n8n-nodes-base.cron","position":[250,300],"parameters":{"cronExpression":"0 6 * * *"},"typeVersion":1},{"name":"Fetch Question","type":"n8n-nodes-base.googleSheets","position":[450,300],"parameters":{"range":"Sheet1!A2:F","sheetId":"YOUR_GOOGLE_SHEET_ID","valueRenderMode":"FORMATTED_VALUE"},"credentials":{"googleApi":{"id":"1","name":"Google API"}},"typeVersion":2},{"name":"Format Quiz","type":"n8n-nodes-base.function","position":[650,300],"parameters":{"functionCode":"\nconst data = items[Math.floor(Math.random() * items.length)].json;\nreturn [{\n  json: {\n    question: data.question,\n    options: `A. ${data.optionA}\\nB. ${data.optionB}\\nC. ${data.optionC}\\nD. ${data.optionD}`,\n    correct: data.correctAnswer,\n    explanation: data.explanation || \"No explanation provided.\",\n    fullText: `🧠 *Daily Quiz Question*\\n\\n*Q:* ${data.question}\\n\\n${data.optionA ? \"A. \" + data.optionA : \"\"}\\n${data.optionB ? \"B. \" + data.optionB : \"\"}\\n${data.optionC ? \"C. \" + data.optionC : \"\"}\\n${data.optionD ? \"D. \" + data.optionD : \"\"}\\n\\n*Answer:* ${data.correctAnswer}\\n📘 Explanation: ${data.explanation || \"N/A\"}`\n  }\n}];"},"typeVersion":1},{"name":"Send Email","type":"n8n-nodes-base.emailSend","position":[850,100],"parameters":{"text":"={{$json[\"fullText\"]}}","subject":"Your Daily Govt Exam Quiz","toEmail":"candidate@example.com","fromEmail":"yourname@example.com"},"credentials":{"smtp":{"id":"1","name":"My SMTP Account"}},"typeVersion":1},{"name":"Send to Telegram","type":"n8n-nodes-base.telegram","position":[850,300],"parameters":{"text":"={{$json[\"fullText\"]}}","chatId":"YOUR_TELEGRAM_CHAT_ID"},"credentials":{"telegramApi":{"id":"1","name":"My Telegram Bot"}},"typeVersion":1},{"name":"Send via Twilio","type":"n8n-nodes-base.twilio","position":[850,500],"parameters":{"to":"+919999999999","from":"+1234567890","message":"={{$json[\"fullText\"]}}"},"credentials":{"twilioApi":{"id":"1","name":"My Twilio Account"}},"typeVersion":1}],"active":false,"connections":{"Format Quiz":{"main":[[{"node":"Send Email","type":"main","index":0}],[{"node":"Send to Telegram","type":"main","index":0}],[{"node":"Send via Twilio","type":"main","index":0}]]},"Daily Trigger":{"main":[[{"node":"Fetch Question","type":"main","index":0}]]},"Fetch Question":{"main":[[{"node":"Format Quiz","type":"main","index":0}]]}}}


name: Location-Based Triggered Reminder via Telegram Bot (iOS)
author_name: Roninimous
author_username: roninimous
nodes_used: ["n8n-nodes-base.telegram"]
categories: []
created_at: 2025-06-25T06:25:23.835Z
updated_at: 2025-06-25T06:25:23.835Z
url: https://n8n.io/workflows/5285
scraped_at: 2025-07-06 21:16:30
description:
  This workflow integrates iOS Shortcuts with n8n to create a simple, automatic location-based reminder system. When the user arrives at a specified location, an automation in the Shortcuts app sends a webhook trigger to n8n. If the trigger matches predefined date and time conditions, n8n sends a Telegram message reminder to the user.

  This is perfect for repetitive weekly tasks like taking out the bins, customized with conditions for day and time.

  Key Features
  Location-Based Trigger: Uses iOS Shortcuts automation to start the workflow upon arrival at a specific location.
  Time and Day Validation: Logic in n8n checks current weekday and time to ensure reminders are sent only when appropriate.
  Telegram Integration: Sends reminders directly to your Telegram account using your bot.
  Minimal Setup: Uses native iOS and simple webhook setup in n8n.

  How It Works
  iOS Shortcut Trigger: When the user arrives at a designated location, the iOS shortcut sends a GET request to the n8n webhook.
  n8n Webhook Node: Receives the request and triggers the workflow.
  Conditional Check: An IF node checks if the current time is after 4:00 PM and it's a Wednesday (or any other configured condition).
  Telegram Node: If the condition passes, n8n sends a message like "Don't forget to take the bins out." to your Telegram bot.

  Setup Instructions
  Create a Telegram Bot:
  	Use @BotFather to create a bot and obtain your bot token.
  	Add Telegram API credentials in n8n with your bot token.
  Setup iOS Shortcut:
  	Open the Shortcuts app on your iPhone.
  	Go to the Automation tab → Tap + → Create Personal Automation.
  	Choose Arrive → Select a location.
  	Add action: Get Contents of URL.
  Method: GET, URL: your n8n Webhook URL (e.g. https://n8n.yourdomain.com/webhook/your-path).
  	Save the automation. (You can also test the automation by pressing the Play button)

  Import Workflow into n8n:
  	Load the provided workflow JSON.
  	Set your webhook path and Telegram credentials.
  	Adjust the logic in the IF node to your usecase. In my case, I check if today is Wednesday and after 4 PM until Midnight.

  Expose n8n Publicly: Ensure your n8n instance is publicly accessible via HTTPS so the shortcut can reach it.

  Customization Guidance
  Change Reminder Message: Modify the text inside the Telegram node to suit different reminders.
  Add More Conditions: Extend the logic to support more days, hours, or different trigger messages.
  Add Multi-Channel Output: Send reminders via email, SMS, or Slack in addition to Telegram.
  Use More Triggers: Expand to other types of shortcut triggers (e.g. NFC tag, leaving location, time of day).

  Security and Implementation
  Webhook Protection: Avoid using easily guessable webhook URLs.
  Secure Telegram Token: Store your bot token securely in n8n credentials, not in plain workflow text.
  Limit Shortcut Scope: Only trigger the shortcut at trusted locations or with secure iCloud sync.
  Automation Permissions: Ensure your iPhone allows shortcut automations to run without confirmation.

  Benefits
  Automates repetitive location-based reminders without user interaction.
  Provides a lightweight, native solution using iOS and n8n with no extra apps.
  Keeps you on track for routine tasks like garbage days, medicine reminders, or arrival-based tasks.
  Easily extendable for multiple locations or trigger conditions.

workflow_json:
  {"id":"DXXqwJ0fr7xSvyfs","meta":{"instanceId":"1e9c5d216f82eece259bdabdf191aced054cce6456f87af0ff7807ca2b37638a","templateCredsSetupCompleted":true},"name":"Location-Based Triggered Reminder via Telegram (iOS)","tags":[{"id":"hlEHEpOdSg5lhIqi","name":"Template","createdAt":"2025-06-05T15:35:52.689Z","updatedAt":"2025-06-05T15:35:52.689Z"}],"nodes":[{"id":"fd5ba23b-4f64-4c9f-95e3-daac17864edd","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-40,-140],"parameters":{"color":7,"width":180,"height":300,"content":"### Wait for trigger when you arrive at a location\n"},"typeVersion":1},{"id":"d8f71384-eed9-4972-8b70-bfc71db546ec","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[180,-40],"parameters":{"color":4,"width":180,"height":280,"content":"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n### Add logic if there's any \n"},"typeVersion":1},{"id":"081d3949-7c34-481a-aad3-81ebbbbd8d90","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[480,-200],"parameters":{"color":5,"width":180,"height":280,"content":"### Send Message to Telegram\n"},"typeVersion":1},{"id":"943b59af-8f7e-4057-9fb2-fa608ff50f3f","name":"Send a Reminder","type":"n8n-nodes-base.telegram","position":[520,-100],"webhookId":"d3c93b6b-8c04-4015-9a59-7c4baa2e4e0d","parameters":{"text":"=*Don't forget to take the bins out.*\n\n_Automated Reminder_","chatId":"{{ $chat_id }}","additionalFields":{"appendAttribution":false}},"credentials":{"telegramApi":{"id":"ya9idB8joP5s1Xf4","name":"Your Telegram Access Token"}},"typeVersion":1.2},{"id":"f597148f-280d-46bf-8547-d58def046ae8","name":"Listen for Location Trigger","type":"n8n-nodes-base.webhook","position":[0,0],"webhookId":"629cc959-9520-47b8-8e71-b8bca8b5cd87","parameters":{"path":"629cc959-9520-47b8-8e71-Roninimous","options":{}},"typeVersion":2},{"id":"e89e6949-540c-4ed0-bd73-4e4d21193321","name":"If Today is Wednesday and After 4 PM","type":"n8n-nodes-base.if","position":[220,0],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"c07414b8-0ed5-4741-9025-3e67d3b3c6e1","operator":{"type":"dateTime","operation":"after"},"leftValue":"={{ $now }}","rightValue":"={{ $now.format('yyyy-MM-dd')}} 16:00:00"},{"id":"f317ce1e-35a2-491d-bc74-ffd17b0a5204","operator":{"type":"number","operation":"equals"},"leftValue":"={{ $now.weekday}}","rightValue":3}]}},"typeVersion":2.2}],"active":false,"settings":{"timezone":"Australia/Sydney","callerPolicy":"workflowsFromSameOwner","executionOrder":"v1"},"versionId":"2834ee7e-cad3-4295-a08b-549f52df46d5","connections":{"Listen for Location Trigger":{"main":[[{"node":"If Today is Wednesday and After 4 PM","type":"main","index":0}]]},"If Today is Wednesday and After 4 PM":{"main":[[{"node":"Send a Reminder","type":"main","index":0}],[]]}}}


name: News Research and Sentiment Analysis AI Agent with Gemini and SearXNG
author_name: Mihai Farcas
author_username: mihailtd
categories: []
created_at: 2025-06-25T07:04:57.738Z
updated_at: 2025-06-25T07:04:57.738Z
url: https://n8n.io/workflows/5286
scraped_at: 2025-07-06 21:16:30
description:
  This n8n workflow operates as a two-agent system where each agent has a specialized task. The process flows from initial user input to a final analysis, with a seamless handoff between the agents.

  How it works
  The Chat Trigger
  The entire process begins when you send a message using n8n's chat interface. This message serves as the initial prompt or query for the system.

  The Research Agent Takes Over
  The user's message is first sent to the Research Agent. This agent's job is to understand the query and gather relevant information. To do this, it has access to:
     LLM: Google Gemini, which acts as the agent's "brain" to process language and make decisions.
  Tools:
     web_search: It uses this tool (powered by your self-hosted SearXNG instance) to perform live searches on the internet.
     get_current_date: It can access the current date, which is useful for context-aware or time-sensitive research.

     The Research Agent uses these tools to find the most relevant information related to your query and then compiles it into a concise summary.

  Handoff to the Sentiment Analysis Agent
  Once the Research Agent has completed its task, it passes its findings directly to the Sentiment Analysis Agent.

  The Final Analysis
  The Sentiment Analysis Agent receives the text from the Research Agent. Its sole purpose, as defined by its system prompt, is to analyze the sentiment of the provided information. It determines if the content is positive, negative, or neutral and formulates a final response.

  This final analysis is then sent back to you in the chat, completing the workflow.

  Set up steps
  Select the Language Model (LLM): This workflow is pre-configured with Google Gemini. You can select a different model for the agents as needed.
  Configure LLM Credentials: Ensure that valid credentials for your chosen LLM are correctly set up within your n8n instance.
  Set Up the SearXNG Connection: Configure the node to connect to your self-hosted SearXNG instance. This enables the agent's web search capabilities.
  Define the Research Agent's Task: Customize the system prompt for the "Research Agent" to define its role, instructions, and how it should conduct its research.
  Define the Sentiment Analysis Agent's Task: Adjust the system prompt for the "Sentiment Analysis Agent" to specify how it should analyze the information provided by the Research Agent.
  Test the Workflow: Use the built-in chat interface in the n8n canvas to send a message and verify that the agents are functioning correctly.

nodes_used:
  ["@n8n/n8n-nodes-langchain.agent","@n8n/n8n-nodes-langchain.lmChatGoogleGemini","@n8n/n8n-nodes-langchain.toolSearXng"]

workflow_json:
  {"id":"1MSUwpnR1sroIquE","meta":{"instanceId":"69133932b9ba8e1ef14816d0b63297bb44feb97c19f759b5d153ff6b0c59e18d","templateCredsSetupCompleted":true},"name":"Stock Sentiment Analysis","tags":[],"nodes":[{"id":"3a8dc8ac-01fb-4619-9193-238b44502f6f","name":"When chat message received","type":"@n8n/n8n-nodes-langchain.chatTrigger","position":[100,-40],"webhookId":"f5961754-ee99-49c0-819d-a50ce2daa5a6","parameters":{"options":{}},"typeVersion":1.1},{"id":"524ce176-1dfd-49ab-9141-ef5f23ac4823","name":"get_current_date","type":"n8n-nodes-base.dateTimeTool","position":[720,220],"parameters":{"options":{},"descriptionType":"manual","toolDescription":"use this tool to find out the current date and time."},"typeVersion":2},{"id":"b34db507-28b6-4336-8d49-19c5d9677596","name":"web_search","type":"@n8n/n8n-nodes-langchain.toolSearXng","position":[540,220],"parameters":{"options":{"language":"en"}},"credentials":{"searXngApi":{"id":"4cAQXGGcZt1s4VYp","name":"SearXNG account"}},"typeVersion":1},{"id":"7dcc25ea-62dc-4e9b-a3ca-3261c3bb2e82","name":"Research Agent","type":"@n8n/n8n-nodes-langchain.agent","position":[360,-40],"parameters":{"options":{"systemMessage":"You are a financial research assistant. Your task is to find and summarize the latest news for a given company name or stock ticker.\n\nInstructions:\n\nFirst, use the get_current_date tool to determine the date range for the last 7 days.\nPerform two separate web searches using the web_search tool: one with the company's full name and one with its stock ticker. Use the date range in your search queries to filter for news from the last week only.\n\nAfter reviewing the search results, provide a summary of each news article. The summary should cover the key events, announcements, and market sentiment discussed in the articles.\n"}},"typeVersion":2},{"id":"955e2558-50e8-4619-87fd-f63c2a6d4171","name":"Sentiment Analysis Agent","type":"@n8n/n8n-nodes-langchain.agent","position":[760,-40],"parameters":{"text":"=User asked about: {{ $('When chat message received').item.json.chatInput }}\n\nLatest news:\n {{ $json.output }}\n","options":{"systemMessage":"You are a Financial Sentiment Analyst. You will be provided with a news summary. Your task is to analyze this summary and categorize its sentiment from an investor's perspective.\n\nInstructions:\n1. Read all the news.\n2. Determine the overall sentiment (Positive, Negative, or Neutral) based on the potential impact on the company's financial performance, stock price, or market reputation.\n3. Write a justification that references specific points from the news summaries.\n\nOutput Format:\nSentiment: {sentiment_category}\nJustification: {Your detailed justification}"},"promptType":"define"},"typeVersion":2},{"id":"1f875bfc-5a26-4a40-974f-56991ce695f4","name":"Gemini 2.5 Flash","type":"@n8n/n8n-nodes-langchain.lmChatGoogleGemini","position":[340,220],"parameters":{"options":{},"modelName":"models/gemini-2.5-flash"},"credentials":{"googlePalmApi":{"id":"jLOqyTR4yTT1nYKi","name":"Google Gemini(PaLM) Api account"}},"typeVersion":1},{"id":"4cb25891-5df9-4949-b46c-116b17918148","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-400,-160],"parameters":{"width":380,"height":520,"content":"## **Set up steps**\n\n1.  **Select the Language Model (LLM):** This workflow is pre-configured with Google Gemini. You can select a different model for the agents as needed.\n2.  **Configure LLM Credentials:** Ensure that valid credentials for your chosen LLM are correctly set up within your n8n instance.\n3.  **Set Up the SearXNG Connection:** Configure the node to connect to your self-hosted SearXNG instance. This enables the agent's web search capabilities.\n4.  **Define the Research Agent's Task:** Customize the system prompt for the \"Research Agent\" to define its role, instructions, and how it should conduct its research.\n5.  **Define the Sentiment Analysis Agent's Task:** Adjust the system prompt for the \"Sentiment Analysis Agent\" to specify how it should analyze the information provided by the Research Agent.\n6.  **Test the Workflow:** Use the built-in chat interface in the n8n canvas to send a message and verify that the agents are functioning correctly."},"typeVersion":1}],"active":false,"settings":{"executionOrder":"v1"},"versionId":"51d9d96d-7aa1-4202-875c-05b52ca675a5","connections":{"web_search":{"ai_tool":[[{"node":"Research Agent","type":"ai_tool","index":0}]]},"Research Agent":{"main":[[{"node":"Sentiment Analysis Agent","type":"main","index":0}]]},"Gemini 2.5 Flash":{"ai_languageModel":[[{"node":"Sentiment Analysis Agent","type":"ai_languageModel","index":0},{"node":"Research Agent","type":"ai_languageModel","index":0}]]},"get_current_date":{"ai_tool":[[{"node":"Research Agent","type":"ai_tool","index":0}]]},"When chat message received":{"main":[[{"node":"Research Agent","type":"main","index":0}]]}}}


