# templates

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,"pinData":{},"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,"pinData":{},"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,"pinData":{},"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}],"pinData":{},"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"}],"pinData":{},"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,"pinData":{},"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"}],"pinData":{},"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"}],"pinData":{},"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"}],"pinData":{},"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"}],"pinData":{},"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"}],"pinData":{},"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"}],"pinData":{},"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"}],"pinData":{},"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,"pinData":{},"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"}],"pinData":{},"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"}],"pinData":{},"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}],"pinData":{},"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}],"pinData":{},"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"}],"pinData":{},"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,"pinData":{},"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,"pinData":{},"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}]]}}}


name: Generate Multiple Languange Blogpost with OpenAI, Support Yoast & Polylang
author_name: Khairul Muhtadin
author_username: khmuhtadin
categories: []
created_at: 2025-06-25T08:30:05.303Z
updated_at: 2025-06-25T08:30:05.303Z
url: https://n8n.io/workflows/5287
scraped_at: 2025-07-06 21:16:30
description:
  The blogblizt: polylang workflow streamlines the creation and publication of high-quality blog content using powerful automation with n8n, OpenAI’s GPT and the WordPress API. It enables effortlessly generate SEO-friendly articles complete with metadata and optimized featured images, improving content freshness and search engine visibility.

  💡 Why Use blogblizt?

  Automate content creation** to keep your blog fresh and engaging
  Generate SEO-optimized posts** with expert-crafted titles, meta descriptions, and focus keyphrases
  Save hours** of manual writing, image sourcing, and SEO configuration
  Leverage AI** for topic ideation and high-quality writing tailored to international student audiences
  Seamlessly publish and manage drafts** directly on your WordPress site via API
  Produce captivating, relevant featured images** without external tools
  Support multilingual content creation** with randomized language selection for diversity

  ⚡ Who Is This For?

  Content strategists managing WordPress blogs needing efficient topic generation
  SEO specialists wanting automated post creation with optimized metadata
  Website owners aiming to maintain active, multilingual content
  Marketers who want to leverage AI for high-quality, consistent article production

  ❓ What Problem Does It Solve?

  This workflow automates the entire editorial cycle—from generating engaging topics with AI, drafting full-length articles, producing featured images automatically, to posting drafts configured for SEO on WordPress—dramatically reducing editor workload and improving content output.

  🔧 What This Workflow Does

  ⏱ Trigger

     Runs on manual trigger or a weekly schedule to ensure consistent content flow
  📎 Fetch Site Context

     Retrieves recent posts, taxonomies, and WordPress API schema to understand site structure
  🔍 Generate Topic

     Uses OpenAI GPT-4.1-mini to roll a random language and craft a targeted blog post topic + SEO metadata
  🤖 Draft Article

     Composes a comprehensive, SEO-friendly article tailored to the generated topic
  💌 Create Draft

     Posts the draft on WordPress with Yoast SEO fields populated
  🖼 Generate Image

     Creates a high-quality, cinematic featured image via AI
  📤 Upload & Attach

     Uploads the image to the WordPress media library and sets it as the post’s featured image

  🔐 Setup Instructions

  Import the workflow file into n8n:

  Add credentials:

     WordPress API (with create-post & media permissions)
     OpenAI API key (for GPT and image models)
  Customize categories, languages, and schedule in the relevant nodes
  Adjust the Schedule Trigger timing as desired (e.g. every Monday at 9 AM)
  Test end-to-end on a staging WordPress site to verify drafts and images publish correctly

  🧩 Pre-Requirements

  An operational n8n instance (self-hosted or n8n cloud)
  WordPress site with REST API access & proper authentication
  OpenAI account with API access for both language and image models
  (Optional) Yoast SEO plugin installed for metadata recognition

  🛠️ Customize It Further

  Tweak OpenAI prompts for niche topics or additional languages
  Add social-media nodes to auto-share new posts
  Insert an editorial review step before publishing
  Refine image prompts for different visual styles (e.g., “modern infographic” vs. “cinematic portrait”)

  🧠 Nodes Used

  Manual Trigger**
  Schedule Trigger** (weekly)
  HTTP Request** (fetch posts, taxonomies, schema; upload media)
  Code** (JavaScript analyzers for API schema & taxonomy parsing)
  OpenAI Chat** (GPT-4.1-mini for topics & articles)
  OpenAI Image Generation** (for featured images)
  WordPress** (create draft post)
  Sticky Notes** (in-flow documentation)

  📞 Support

  Built by: Khaisa Studio
  Tags: wordpress, marketing, polylang
  Category: Content Creation
  Give something? a coffee will be great!

  Need a custom solution? Reach out at khmuhtadin.com to tailor the workflow for your site.

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

workflow_json:
  {"id":"lLLiZbtro1xcBfAJ","meta":{"instanceId":"6195cc49af3fb53a44d2c88f9d4452644fc510eb857dcef9b6afe681b0ea8916","templateCredsSetupCompleted":true},"name":"Khaisa studio - Polylang","tags":[],"nodes":[{"id":"d26ca442-3d74-44ba-b776-f6a1be6418b4","name":"Manual Trigger","type":"n8n-nodes-base.manualTrigger","position":[1640,3620],"parameters":{},"typeVersion":1},{"id":"044f8c00-f7dd-4122-a7e7-4d698dd7d924","name":"Get Recent Posts","type":"n8n-nodes-base.httpRequest","position":[1860,3340],"parameters":{"url":"https://<yourweb.site>/wp-json/wp/v2/posts?per_page=5","options":{"response":{"response":{"fullResponse":true}}},"authentication":"predefinedCredentialType","nodeCredentialType":"wordpressApi"},"credentials":{"wordpressApi":{"id":"eqflh1H16dxj2lMN","name":"Ashkan"}},"typeVersion":4.2},{"id":"9a011830-5d59-439f-a847-6d328109d3c2","name":"Get All Taxonomies","type":"n8n-nodes-base.httpRequest","position":[1860,3500],"parameters":{"url":"https://yourweb.site>/wp-json/wp/v2/taxonomies","options":{},"authentication":"predefinedCredentialType","nodeCredentialType":"wordpressApi"},"credentials":{"wordpressApi":{"id":"eqflh1H16dxj2lMN","name":"Ashkan"}},"typeVersion":4.2},{"id":"4a75282b-a4dd-44a4-97bc-a11db56e0b07","name":"Get Posts Schema","type":"n8n-nodes-base.httpRequest","position":[1860,3660],"parameters":{"url":"https://yourweb.site>/wp-json/wp/v2/posts","method":"OPTIONS","options":{"response":{"response":{"fullResponse":true}}},"authentication":"predefinedCredentialType","nodeCredentialType":"wordpressApi"},"credentials":{"wordpressApi":{"id":"eqflh1H16dxj2lMN","name":"Ashkan"}},"typeVersion":4.2},{"id":"eea71bad-e20a-45dc-a75c-abd6cc1c0854","name":"Get API Routes","type":"n8n-nodes-base.httpRequest","position":[1860,3820],"parameters":{"url":"https://<yourweb.site>/wp-json","options":{},"authentication":"predefinedCredentialType","nodeCredentialType":"wordpressApi"},"credentials":{"wordpressApi":{"id":"eqflh1H16dxj2lMN","name":"Ashkan"}},"typeVersion":4.2},{"id":"f525a26a-2716-4530-80d9-3e3c9fcc523d","name":"Get Single Post Details","type":"n8n-nodes-base.httpRequest","position":[2060,3340],"parameters":{"url":"=https://yourweb.site>/wp-json/wp/v2/posts/{{ $json.id }}?_embed","options":{},"authentication":"predefinedCredentialType","nodeCredentialType":"wordpressApi"},"credentials":{"wordpressApi":{"id":"eqflh1H16dxj2lMN","name":"Ashkan"}},"typeVersion":4.2},{"id":"5321b73e-b7ae-44b9-9a4f-43c81ee40aac","name":"Check Language Endpoint","type":"n8n-nodes-base.httpRequest","position":[2060,3500],"parameters":{"url":"https://yourweb.site>/wp-json/wp/v2/language","options":{"response":{"response":{"neverError":true}}},"authentication":"predefinedCredentialType","nodeCredentialType":"wordpressApi"},"credentials":{"wordpressApi":{"id":"eqflh1H16dxj2lMN","name":"Ashkan"}},"typeVersion":4.2},{"id":"0cb03306-bb18-4326-8249-ec94982dd3e3","name":"Check PLL Endpoint","type":"n8n-nodes-base.httpRequest","position":[2060,3660],"parameters":{"url":"https://<yourweb.site>/wp-json/pll/v1","options":{"response":{"response":{"neverError":true}}},"authentication":"predefinedCredentialType","nodeCredentialType":"wordpressApi"},"credentials":{"wordpressApi":{"id":"eqflh1H16dxj2lMN","name":"Ashkan"}},"typeVersion":4.2},{"id":"47fd2403-fdfb-4e17-8518-b7ef4545df0f","name":"Get Terms","type":"n8n-nodes-base.httpRequest","position":[2060,3820],"parameters":{"url":"https://<yourweb.site>/wp-json/wp/v2/terms","options":{"response":{"response":{"neverError":true}}},"authentication":"predefinedCredentialType","nodeCredentialType":"wordpressApi"},"credentials":{"wordpressApi":{"id":"eqflh1H16dxj2lMN","name":"Ashkan"}},"typeVersion":4.2},{"id":"65f55a1c-9027-4a52-8352-006bb7169cef","name":"Analyze Post Structure","type":"n8n-nodes-base.code","position":[2260,3340],"parameters":{"jsCode":"// Analyze a single post to understand Polylang structure\nconst results = {\n  discovery: [],\n  polylangFields: [],\n  languageHandling: '',\n  recommendations: [],\n  rawData: {}\n};\n\n// Get the post data\nconst items = $input.all();\nif (items.length === 0) {\n  return {\n    error: 'No input data received',\n    recommendation: 'Check if the previous nodes executed successfully'\n  };\n}\n\nconst postData = items[0].json;\nresults.rawData.sample = postData;\n\n// Look for language fields in the post\nif (postData) {\n  for (const key in postData) {\n    if (key.toLowerCase().includes('lang') || \n        key.toLowerCase().includes('locale') ||\n        key.toLowerCase().includes('translation')) {\n      results.polylangFields.push({\n        field: key,\n        value: postData[key],\n        type: typeof postData[key]\n      });\n    }\n  }\n  \n  // Check _links for language info\n  if (postData._links) {\n    for (const rel in postData._links) {\n      if (rel.includes('translation') || \n          rel.includes('language') ||\n          rel.includes('pll')) {\n        results.polylangFields.push({\n          field: `_links.${rel}`,\n          value: postData._links[rel],\n          type: 'link relation'\n        });\n      }\n    }\n  }\n  \n  // Check _embedded for language data\n  if (postData._embedded) {\n    for (const embed in postData._embedded) {\n      if (embed.includes('term') || embed.includes('language')) {\n        results.discovery.push({\n          type: 'embedded',\n          field: embed,\n          data: postData._embedded[embed]\n        });\n      }\n    }\n  }\n  \n  // Check meta fields\n  if (postData.meta) {\n    for (const metaKey in postData.meta) {\n      if (metaKey.toLowerCase().includes('lang') || \n          metaKey.toLowerCase().includes('locale')) {\n        results.polylangFields.push({\n          field: `meta.${metaKey}`,\n          value: postData.meta[metaKey],\n          type: 'meta field'\n        });\n      }\n    }\n  }\n}\n\n// Generate recommendations\nif (results.polylangFields.length > 0) {\n  results.languageHandling = 'Polylang fields detected in REST API';\n  results.recommendations.push('Language fields found: ' + results.polylangFields.map(f => f.field).join(', '));\n  results.recommendations.push('Use these fields when creating posts');\n} else {\n  results.languageHandling = 'No obvious Polylang fields in post data';\n  results.recommendations.push('Language might be handled through custom taxonomies or separate API calls');\n  results.recommendations.push('Check the taxonomies and routes endpoints for more information');\n}\n\nreturn results;"},"typeVersion":2},{"id":"65c41cb1-b943-4222-9f1f-99627f59c3dc","name":"Analyze Taxonomies","type":"n8n-nodes-base.code","position":[2260,3500],"parameters":{"jsCode":"// Analyze taxonomies for language handling\nconst results = {\n  languageTaxonomies: [],\n  allTaxonomies: [],\n  recommendations: []\n};\n\nconst items = $input.all();\nif (items.length === 0 || !items[0].json) {\n  return { error: 'No taxonomy data received' };\n}\n\nconst taxonomies = items[0].json;\n\n// List all taxonomies\nfor (const taxSlug in taxonomies) {\n  const tax = taxonomies[taxSlug];\n  results.allTaxonomies.push({\n    slug: taxSlug,\n    name: tax.name,\n    restBase: tax.rest_base\n  });\n  \n  // Check for language-related taxonomies\n  if (taxSlug.includes('language') || \n      taxSlug.includes('translation') ||\n      taxSlug === 'lang' ||\n      tax.name?.toLowerCase().includes('language')) {\n    results.languageTaxonomies.push({\n      slug: taxSlug,\n      details: tax\n    });\n  }\n}\n\n// Generate recommendations\nif (results.languageTaxonomies.length > 0) {\n  results.recommendations.push('Language taxonomy found: ' + results.languageTaxonomies[0].slug);\n  results.recommendations.push('Use this taxonomy when creating posts by adding it to the taxonomies parameter');\n} else {\n  results.recommendations.push('No dedicated language taxonomy found');\n  results.recommendations.push('Language might be handled through post meta or custom fields');\n}\n\nreturn results;"},"typeVersion":2},{"id":"598642ca-a558-4425-820a-760aad33dca7","name":"Analyze API Routes","type":"n8n-nodes-base.code","position":[2260,3820],"parameters":{"jsCode":"// Check API routes for Polylang endpoints\nconst results = {\n  polylangRoutes: [],\n  allNamespaces: [],\n  recommendations: []\n};\n\nconst items = $input.all();\nif (items.length === 0 || !items[0].json) {\n  return { error: 'No route data received' };\n}\n\nconst apiData = items[0].json;\n\n// Check namespaces\nif (apiData.namespaces) {\n  results.allNamespaces = apiData.namespaces;\n  \n  // Look for Polylang namespace\n  const pllNamespaces = apiData.namespaces.filter(ns => \n    ns.includes('pll') || \n    ns.includes('polylang') || \n    ns.includes('language')\n  );\n  \n  if (pllNamespaces.length > 0) {\n    results.polylangRoutes = pllNamespaces;\n    results.recommendations.push('Polylang API namespace found: ' + pllNamespaces.join(', '));\n    results.recommendations.push('Explore these endpoints for language management');\n  }\n}\n\n// Check routes\nif (apiData.routes) {\n  for (const route in apiData.routes) {\n    if (route.includes('pll') || \n        route.includes('language') || \n        route.includes('translation')) {\n      results.polylangRoutes.push({\n        route: route,\n        methods: apiData.routes[route].methods\n      });\n    }\n  }\n}\n\nif (results.polylangRoutes.length === 0) {\n  results.recommendations.push('No dedicated Polylang routes found');\n  results.recommendations.push('Language handling is likely integrated into standard WP endpoints');\n}\n\nreturn results;"},"typeVersion":2},{"id":"1e8935ab-e3b9-41ff-942a-7ed8e5d38350","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[1540,3300],"parameters":{"width":980,"height":720,"content":"## Polylang Debugging "},"typeVersion":1},{"id":"1fd3b081-5185-416f-af0d-925630fcafd0","name":"OpenAI Model - Article1","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[3200,3520],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4.1-mini","cachedResultName":"gpt-4.1-mini"},"options":{"maxTokens":2500,"temperature":0.8}},"credentials":{"openAiApi":{"id":"TFeNsOhMdVKP8DCw","name":"Akhsan"}},"typeVersion":1.2},{"id":"c719ee7d-315a-44cf-bc48-c7fc86c6bb02","name":"Parse Topic JSON1","type":"@n8n/n8n-nodes-langchain.outputParserStructured","position":[3020,3520],"parameters":{"jsonSchemaExample":"{\n  \"category\": \"F-1 Visa\",\n  \"categoryId\": 4794,\n  \"language\": \"en\",\n  \"topic\": \"F-1 visa interview preparation\",\n  \"title\": \"Essential F-1 Visa Interview Tips for International Students\",\n  \"slug\": \"f1-visa-interview-tips-international-students\",\n  \"metaDescription\": \"Master your F-1 visa interview with proven tips and common questions. Get expert guidance for international students applying to US universities.\",\n  \"focusKeyphrase\": \"F-1 visa interview tips\"\n}"},"typeVersion":1.2},{"id":"df2f35e8-1e1a-45b0-bbf1-b36eca0df6dc","name":"OpenAI Model - Topic1","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[2860,3520],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4.1-mini","cachedResultName":"gpt-4.1-mini"},"options":{"temperature":0.7}},"credentials":{"openAiApi":{"id":"TFeNsOhMdVKP8DCw","name":"Akhsan"}},"typeVersion":1.2},{"id":"cc908638-83dd-4d5f-9742-d05227bdbacd","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[2580,3300],"parameters":{"width":1200,"height":720,"content":"## Article Generator"},"typeVersion":1},{"id":"27d4da14-3360-4af6-a312-31874554b401","name":"Weekly Schedule","type":"n8n-nodes-base.scheduleTrigger","position":[2680,3380],"parameters":{"rule":{"interval":[{"field":"weeks","triggerAtDay":[3],"triggerAtHour":10}]}},"typeVersion":1.1},{"id":"27869c0f-c7f0-49f7-84d4-34f08bb87102","name":"Generate Topic & Metadata","type":"@n8n/n8n-nodes-langchain.chainLlm","position":[2860,3380],"parameters":{"text":"=You are an expert content strategist for <yourweb.site> specializing in visa and education content. Generate ONE blog post topic.\n\n1. Select ONE category from these available WordPress categories:\n   - \n2. Select a target language from: en (English), tr (Turkish), fa (Farsi)\n\n3. Create an engaging topic and metadata for a blog post.\n\n4. Format your response EXACTLY like this:\n{\n  \"category\": \"[WordPress category name]\",\n  \"categoryId\": [category ID number],\n  \"language\": \"[language code: en, tr, or fa]\",\n  \"topic\": \"[specific topic]\",\n  \"title\": \"[engaging SEO-friendly title]\",\n  \"slug\": \"[url-friendly-slug-lowercase-with-hyphens]\",\n  \"metaDescription\": \"[meta description under 160 characters]\",\n  \"focusKeyphrase\": \"[main keyword phrase]\"\n}\n\nIMPORTANT:\n- Topics should be practical and helpful\n- Keep titles clear and engaging\n- Meta descriptions should be compelling and under 160 characters\n- Slug should be lowercase with hyphens, no special characters\n- Randomly select different languages to ensure content diversity\n- If selecting tr or fa, still generate the content in English (it will be translated later)","promptType":"define","hasOutputParser":true},"typeVersion":1.6},{"id":"4126e8f8-8cc1-42e7-8b50-d818ee1e1857","name":"Generate Article Content","type":"@n8n/n8n-nodes-langchain.agent","position":[3200,3380],"parameters":{"text":"=You are an expert content writer for<yourweb.site>, a visa consultation company. Write a comprehensive article based on:\n\nTopic: {{ $json.output.topic }}\nTitle: {{ $json.output.title }}\nCategory: {{ $json.output.category }}\nFocus Keyphrase: {{ $json.output.focusKeyphrase }}\n\nCRITICAL Requirements:\n\nWrite between 1000-1500 words\nUse a clear, simple, helpful tone – avoid technical jargon\nDo NOT provide legal advice or interpret immigration law\nFocus on practical guidance and general information\nInclude useful tips especially for international students\n\nStructure with one <h1> (for the title, handled by WordPress), then use <h2> for main sections and <p> or <strong>/<ul> for subpoints — avoid excessive use of <h3> unless necessary\nMake content SEO-friendly by using the focus keyphrase naturally\nEnd with EXACTLY this CTA in a separate paragraph: \"Reach out to us for personalized consultation based on your specific requirements.\"\n\nStructure:\nIntroduction (engage the reader)\n3–4 main content sections with <h2> headings\nSubpoints within sections should be in <p>, <ul>, <strong> or similar semantic tags — use <h3> only if really needed\nTips or checklist for practical action\n\nConclusion\nCTA paragraph\nOutput a complete article in valid HTML format, without wrapping the result in code blocks or using markdown. Do NOT include the <h1> tag for the title, as it will be handled by WordPress. Output only the HTML content, not instructions or explanations.","options":{},"promptType":"define"},"typeVersion":1.9},{"id":"c1ac4723-1db8-4eea-8640-6dd176efc0b1","name":"Create WordPress Draft","type":"n8n-nodes-base.wordpress","position":[3540,3380],"parameters":{"title":"={{ $('Generate Topic & Metadata').item.json.output.title }}","additionalFields":{"slug":"={{ $('Generate Topic & Metadata').item.json.output.slug }}","format":"standard","status":"draft","content":"={{ $json.output }}","authorId":2,"categories":"={{ $('Generate Topic & Metadata').item.json.output.categoryId }}"}},"credentials":{"wordpressApi":{"id":"eqflh1H16dxj2lMN","name":"Ashkan"}},"typeVersion":1},{"id":"dcec267d-c513-44df-8d13-8bd68e852590","name":"Set Yoast SEO Data","type":"n8n-nodes-base.httpRequest","position":[2840,3780],"parameters":{"url":"=https://<yourweb.site>/wp-json/wp/v2/posts/{{ $json.id }}","method":"POST","options":{},"jsonBody":"={\n  \"meta\": {\n    \"_yoast_wpseo_focuskw\": \"{{ $('Generate Topic & Metadata').item.json.output.focusKeyphrase }}\",\n    \"_yoast_wpseo_metadesc\": \"{{ $('Generate Topic & Metadata').item.json.output.metaDescription }}\",\n    \"_yoast_wpseo_title\": \"{{ $('Generate Topic & Metadata').item.json.output.title }}\"\n  }\n}","sendBody":true,"specifyBody":"json","authentication":"predefinedCredentialType","nodeCredentialType":"wordpressApi"},"credentials":{"wordpressApi":{"id":"eqflh1H16dxj2lMN","name":"Ashkan"}},"typeVersion":4.2},{"id":"bedd876b-e6e1-4397-aed2-61b08a5bc2c5","name":"Generate Featured Image","type":"@n8n/n8n-nodes-langchain.openAi","position":[3060,3780],"parameters":{"prompt":"=Create a cinematic, modern image for a blog about: {{ $('Generate Topic & Metadata').item.json.output.title }}\n\nVisual Style Requirements:\n\t•\tCinematic, realistic photography with shallow depth of field\n\t•\tShows people (young adults or professionals) traveling, studying, or working internationally\n\t•\tScenes like airports, train stations, city streets, campuses, or iconic landmarks\n\t•\tGlobal lifestyle and international mobility vibe\n\t•\tBright or golden-hour lighting, energetic or inspirational tone\n\t•\tNatural, candid facial expressions and interactions\n\t•\tModern outfits and diverse representation\n\t•\tNO text, flags, logos, or brand names in the image\n\t•\tClean, high-quality composition suitable for a professional blog","options":{"size":"1792x1024","style":"natural","quality":"standard"},"resource":"image"},"credentials":{"openAiApi":{"id":"TFeNsOhMdVKP8DCw","name":"Akhsan"}},"typeVersion":1.8},{"id":"a7284c61-7342-4fcb-9422-577a807c9dd3","name":"Upload Image to WordPress","type":"n8n-nodes-base.httpRequest","position":[3260,3780],"parameters":{"url":"https://<yourweb.site>/wp-json/wp/v2/media","method":"POST","options":{},"sendBody":true,"contentType":"binaryData","sendHeaders":true,"authentication":"predefinedCredentialType","headerParameters":{"parameters":[{"name":"Content-Type","value":"image/png"},{"name":"Content-Disposition","value":"=attachment; filename={{ $('Generate Topic & Metadata').item.json.output.slug }}.png"}]},"inputDataFieldName":"data","nodeCredentialType":"wordpressApi"},"credentials":{"wordpressApi":{"id":"eqflh1H16dxj2lMN","name":"Ashkan"}},"typeVersion":4.2},{"id":"69b93ac4-7784-4c71-8fff-31ba59b50b55","name":"Attach Featured Image","type":"n8n-nodes-base.httpRequest","position":[3460,3780],"parameters":{"url":"=https://<yourweb.site>/wp-json/wp/v2/posts/{{ $('Create WordPress Draft').item.json.id }}","method":"POST","options":{},"sendBody":true,"authentication":"predefinedCredentialType","bodyParameters":{"parameters":[{"name":"featured_media","value":"={{ $json.id }}"}]},"nodeCredentialType":"wordpressApi"},"credentials":{"wordpressApi":{"id":"eqflh1H16dxj2lMN","name":"Ashkan"}},"typeVersion":4.2}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"7541ea2d-d795-43b1-b842-f4be6a2a61a4","connections":{"Get API Routes":{"main":[[{"node":"Analyze API Routes","type":"main","index":0}]]},"Manual Trigger":{"main":[[{"node":"Get Recent Posts","type":"main","index":0},{"node":"Get All Taxonomies","type":"main","index":0},{"node":"Get Posts Schema","type":"main","index":0},{"node":"Get API Routes","type":"main","index":0}]]},"Weekly Schedule":{"main":[[{"node":"Generate Topic & Metadata","type":"main","index":0}]]},"Get Posts Schema":{"main":[[{"node":"Check PLL Endpoint","type":"main","index":0}]]},"Get Recent Posts":{"main":[[{"node":"Get Single Post Details","type":"main","index":0}]]},"Parse Topic JSON1":{"ai_outputParser":[[{"node":"Generate Topic & Metadata","type":"ai_outputParser","index":0}]]},"Get All Taxonomies":{"main":[[{"node":"Analyze Taxonomies","type":"main","index":0}]]},"Set Yoast SEO Data":{"main":[[{"node":"Generate Featured Image","type":"main","index":0}]]},"OpenAI Model - Topic1":{"ai_languageModel":[[{"node":"Generate Topic & Metadata","type":"ai_languageModel","index":0}]]},"Create WordPress Draft":{"main":[[{"node":"Set Yoast SEO Data","type":"main","index":0}]]},"Generate Featured Image":{"main":[[{"node":"Upload Image to WordPress","type":"main","index":0}]]},"Get Single Post Details":{"main":[[{"node":"Analyze Post Structure","type":"main","index":0}]]},"OpenAI Model - Article1":{"ai_languageModel":[[{"node":"Generate Article Content","type":"ai_languageModel","index":0}]]},"Generate Article Content":{"main":[[{"node":"Create WordPress Draft","type":"main","index":0}]]},"Generate Topic & Metadata":{"main":[[{"node":"Generate Article Content","type":"main","index":0}]]},"Upload Image to WordPress":{"main":[[{"node":"Attach Featured Image","type":"main","index":0}]]}}}


name: WordPress context backup to github
description: This template can backup WordPress context github。
author_name: boagolden
author_username: boagolden
categories: []
created_at: 2025-06-25T08:37:12.542Z
updated_at: 2025-06-25T08:37:12.542Z
url: https://n8n.io/workflows/5288
scraped_at: 2025-07-06 21:16:30
nodes_used:
  ["n8n-nodes-base.github","n8n-nodes-base.httpRequest","n8n-nodes-base.wordpress","n8n-nodes-base.code"]

workflow_json:
  {"id":"dR9Ks4IeLu4qwVpD","meta":{"instanceId":"784e7394ad6bc96590ae2022cd99eaa229a70dd6b82a6d27cf116d99211f63ca","templateCredsSetupCompleted":true},"name":"blogbak","tags":[],"nodes":[{"id":"6fe6e1e5-146e-45fc-89a8-e318759c283b","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-620,-140],"parameters":{"color":6,"width":2547,"height":751,"content":"## Subworkflow"},"typeVersion":1},{"id":"2e37f053-f5c4-4984-9855-ff82346fffb1","name":"Return","type":"n8n-nodes-base.set","position":[1720,60],"parameters":{"options":{},"assignments":{"assignments":[{"id":"8d513345-6484-431f-afb7-7cf045c90f4f","name":"Done","type":"boolean","value":true}]}},"typeVersion":3.3},{"id":"c84c112e-9ec4-4563-8829-7acfb4022537","name":"Get File","type":"n8n-nodes-base.httpRequest","position":[820,-60],"parameters":{"url":"={{ $json.download_url }}","options":{}},"typeVersion":4.2},{"id":"c3c21099-fe26-4289-94d1-4a0fbf80743f","name":"If file too large","type":"n8n-nodes-base.if","position":[620,-40],"parameters":{"options":{},"conditions":{"options":{"version":1,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"45ce825e-9fa6-430c-8931-9aaf22c42585","operator":{"type":"string","operation":"empty","singleValue":true},"leftValue":"={{ $json.content }}","rightValue":""},{"id":"9619a55f-7fb1-4f24-b1a7-7aeb82365806","operator":{"type":"string","operation":"notExists","singleValue":true},"leftValue":"={{ $json.error }}","rightValue":""}]}},"typeVersion":2},{"id":"5c296194-1b0c-49e9-87e1-0349ce14e053","name":"Merge Items","type":"n8n-nodes-base.merge","position":[620,220],"parameters":{},"typeVersion":2},{"id":"7ee60c81-2232-4aa8-8313-fa2493d6cf59","name":"isDiffOrNew","type":"n8n-nodes-base.code","position":[820,220],"parameters":{"jsCode":"const orderJsonKeys = (jsonObj) => {\n  const ordered = {};\n  Object.keys(jsonObj).sort().forEach(key => {\n    ordered[key] = jsonObj[key];\n  });\n  return ordered;\n}\n\n// Check if file returned with content\nif (Object.keys($input.all()[0].json).includes(\"content\")) {\n  // Decode base64 content and parse JSON\n  const origWorkflow = JSON.parse(Buffer.from($input.all()[0].json.content, 'base64').toString());\n  const n8nWorkflow = $input.all()[1].json;\n  \n  // Order JSON objects\n  const orderedOriginal = orderJsonKeys(origWorkflow);\n  const orderedActual = orderJsonKeys(n8nWorkflow);\n\n  // Determine difference\n  if (JSON.stringify(orderedOriginal) === JSON.stringify(orderedActual)) {\n    $input.all()[0].json.github_status = \"same\";\n  } else {\n    $input.all()[0].json.github_status = \"different\";\n    $input.all()[0].json.n8n_data_stringy = JSON.stringify(orderedActual, null, 2);\n  }\n  $input.all()[0].json.content_decoded = orderedOriginal;\n// No file returned / new workflow\n} else if (Object.keys($input.all()[0].json).includes(\"data\")) {\n  const origWorkflow = JSON.parse($input.all()[0].json.data);\n  const n8nWorkflow = $input.all()[1].json;\n  \n  // Order JSON objects\n  const orderedOriginal = orderJsonKeys(origWorkflow);\n  const orderedActual = orderJsonKeys(n8nWorkflow);\n\n  // Determine difference\n  if (JSON.stringify(orderedOriginal) === JSON.stringify(orderedActual)) {\n    $input.all()[0].json.github_status = \"same\";\n  } else {\n    $input.all()[0].json.github_status = \"different\";\n    $input.all()[0].json.n8n_data_stringy = JSON.stringify(orderedActual, null, 2);\n  }\n  $input.all()[0].json.content_decoded = orderedOriginal;\n\n} else {\n  // Order JSON object\n  const n8nWorkflow = $input.all()[1].json;\n  const orderedActual = orderJsonKeys(n8nWorkflow);\n  \n  // Proper formatting\n  $input.all()[0].json.github_status = \"new\";\n  $input.all()[0].json.n8n_data_stringy = JSON.stringify(orderedActual, null, 2);\n}\n\n// Return items\nreturn $input.all();"},"typeVersion":1},{"id":"f80206e2-b0a4-4c25-bf6c-92a7bc0673e8","name":"Check Status","type":"n8n-nodes-base.switch","position":[1040,220],"parameters":{"rules":{"rules":[{"value2":"same"},{"output":1,"value2":"different"},{"output":2,"value2":"new"}]},"value1":"={{$json.github_status}}","dataType":"string"},"typeVersion":1},{"id":"fe9da7b9-2706-4db2-bd5a-94d4fb398f07","name":"Same file - Do nothing","type":"n8n-nodes-base.noOp","position":[1260,60],"parameters":{},"typeVersion":1},{"id":"6940d68b-75be-4ac5-a024-8fee5928137e","name":"File is different","type":"n8n-nodes-base.noOp","position":[1260,220],"parameters":{},"typeVersion":1},{"id":"fb3ba897-7934-4a4d-9ebf-730fbc0f6e87","name":"File is new","type":"n8n-nodes-base.noOp","position":[1260,380],"parameters":{},"typeVersion":1},{"id":"8bc1ca4b-d7ee-434c-b72f-327672941443","name":"Create new file","type":"n8n-nodes-base.github","position":[1480,380],"webhookId":"d7722bc1-3b69-4038-8f1e-ff7ba50498d1","parameters":{"owner":{"__rl":true,"mode":"name","value":"={{ $('Globals').item.json.repo.owner }}"},"filePath":"={{ $('Globals').item.json.repo.path }}{{$('Execute Workflow Trigger').first().json.id}}.json","resource":"file","repository":{"__rl":true,"mode":"name","value":"={{ $('Globals').item.json.repo.name }}"},"fileContent":"={{$('isDiffOrNew').item.json[\"n8n_data_stringy\"]}}","commitMessage":"={{$('Execute Workflow Trigger').first().json.name}} ({{$json.github_status}})"},"credentials":{"githubApi":{"id":"ziOYyVD5gQbrBGVj","name":"GitHub account"}},"typeVersion":1},{"id":"fc075cd9-fcf0-4cf0-a573-8e4dfdd0deb6","name":"Edit existing file","type":"n8n-nodes-base.github","position":[1480,200],"webhookId":"e55f87f7-9be4-425f-98b7-00ff88a09696","parameters":{"owner":{"__rl":true,"mode":"name","value":"={{ $('Globals').item.json.repo.owner }}"},"filePath":"={{ $('Globals').item.json.repo.path }}{{$('Execute Workflow Trigger').first().json.id}}.json","resource":"file","operation":"edit","repository":{"__rl":true,"mode":"name","value":"={{ $('Globals').item.json.repo.name }}"},"fileContent":"={{$('isDiffOrNew').item.json[\"n8n_data_stringy\"]}}","commitMessage":"={{$('Execute Workflow Trigger').first().json.name}} ({{$json.github_status}})"},"credentials":{"githubApi":{"id":"ziOYyVD5gQbrBGVj","name":"GitHub account"}},"typeVersion":1},{"id":"2f2c0a8c-e152-4f04-a092-375e649a6f35","name":"Get file data","type":"n8n-nodes-base.github","position":[420,-40],"webhookId":"27006429-54a9-4234-a1ca-3ccc36a5a4ec","parameters":{"owner":{"__rl":true,"mode":"name","value":"={{ $json.repo.owner }}"},"filePath":"={{ $json.repo.path }}{{ $('Execute Workflow Trigger').item.json.id }}.json","resource":"file","operation":"get","repository":{"__rl":true,"mode":"name","value":"={{ $json.repo.name }}"},"asBinaryProperty":false,"additionalParameters":{}},"credentials":{"githubApi":{"id":"ziOYyVD5gQbrBGVj","name":"GitHub account"}},"typeVersion":1,"continueOnFail":true,"alwaysOutputData":true},{"id":"0283ac63-70bb-4230-a292-f6a70faab22f","name":"Globals","type":"n8n-nodes-base.set","position":[200,120],"parameters":{"options":{},"assignments":{"assignments":[{"id":"6cf546c5-5737-4dbd-851b-17d68e0a3780","name":"repo.owner","type":"string","value":"boagolden82"},{"id":"452efa28-2dc6-4ea3-a7a2-c35d100d0382","name":"repo.name","type":"string","value":"n8nback"},{"id":"81c4dc54-86bf-4432-a23f-22c7ea831e74","name":"repo.path","type":"string","value":"=workflows/{{ $json.tags[0].name }}"}]}},"typeVersion":3.4},{"id":"aa41b761-85ed-4837-a466-c5c03902b73c","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[180,0],"parameters":{"color":4,"width":150,"height":80,"content":"## Edit this node 👇"},"typeVersion":1},{"id":"b9a961d5-63ba-4646-8a7d-920ba7ad8467","name":"Execute Workflow Trigger","type":"n8n-nodes-base.executeWorkflowTrigger","position":[-520,300],"parameters":{"inputSource":"passthrough"},"typeVersion":1.1},{"id":"539e52b7-7772-4572-a8b4-a0b60cd21c7d","name":"/","type":"n8n-nodes-base.set","position":[-40,20],"parameters":{"options":{},"assignments":{"assignments":[{"id":"12cad226-e091-4bbb-aed9-a8e01311772c","name":"tags[0].name","type":"string","value":"={{ $('Execute Workflow Trigger').item.json.tags[0].name }}/"}]}},"typeVersion":3.4},{"id":"e821424a-9a5f-4eba-832f-530a62ce9898","name":"tag?","type":"n8n-nodes-base.switch","position":[-280,120],"parameters":{"rules":{"values":[{"outputKey":"tag","conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"operator":{"type":"object","operation":"exists","singleValue":true},"leftValue":"={{ $json.tags[0] }}","rightValue":""}]},"renameOutput":true},{"outputKey":"none","conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"2656fbe3-fe35-4770-9c03-9a455ec618e4","operator":{"type":"object","operation":"notExists","singleValue":true},"leftValue":"={{ $json.tags[0] }}","rightValue":""}]},"renameOutput":true}]},"options":{}},"typeVersion":3.2},{"id":"d5383175-b64b-43ba-b979-1737af2e3034","name":"Manual Trigger","type":"n8n-nodes-base.manualTrigger","position":[-480,-600],"parameters":{},"typeVersion":1},{"id":"cab6effd-7aab-48ad-a035-1b5b4567d722","name":"Get All WP Posts","type":"n8n-nodes-base.wordpress","position":[-180,-460],"parameters":{"options":{},"operation":"getAll","returnAll":true},"credentials":{"wordpressApi":{"id":"zgOcyZzeoCInkBr9","name":"Wordpress account"}},"typeVersion":1},{"id":"878acd66-e344-4c3a-9650-a27493be4942","name":"Format JSON","type":"n8n-nodes-base.code","notes":"将所有WP文章格式化为JSON文本","position":[80,-440],"parameters":{"jsCode":"// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfor (const item of $input.all()) {\n  item.json.myNewField = 1;\n}\n\nreturn $input.all();"},"typeVersion":1},{"id":"ddb88bce-1243-426f-b6f8-5236cdf085a8","name":"Execute Workflow","type":"n8n-nodes-base.executeWorkflow","position":[420,-460],"parameters":{"mode":"each","options":{},"workflowId":{"__rl":true,"mode":"id","value":"={{ $workflow.id }}"},"workflowInputs":{"value":{},"schema":[],"mappingMode":"defineBelow","matchingColumns":[],"attemptToConvertTypes":false,"convertFieldsToString":true}},"typeVersion":1.2},{"id":"6b7426ad-7680-4227-92bc-90a3ae44bb3c","name":"Schedule Trigger","type":"n8n-nodes-base.scheduleTrigger","position":[-400,-360],"parameters":{"rule":{"interval":[{"triggerAtHour":17}]}},"typeVersion":1.2}],"active":true,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"c128b71d-90e9-4503-82f0-555fd4e34a69","connections":{"/":{"main":[[{"node":"Globals","type":"main","index":0}]]},"tag?":{"main":[[{"node":"/","type":"main","index":0}],[{"node":"Globals","type":"main","index":0}]]},"Globals":{"main":[[{"node":"Get file data","type":"main","index":0}]]},"Get File":{"main":[[{"node":"Merge Items","type":"main","index":0}]]},"File is new":{"main":[[{"node":"Create new file","type":"main","index":0}]]},"Format JSON":{"main":[[{"node":"Execute Workflow","type":"main","index":0}]]},"Merge Items":{"main":[[{"node":"isDiffOrNew","type":"main","index":0}]]},"isDiffOrNew":{"main":[[{"node":"Check Status","type":"main","index":0}]]},"Check Status":{"main":[[{"node":"Same file - Do nothing","type":"main","index":0}],[{"node":"File is different","type":"main","index":0}],[{"node":"File is new","type":"main","index":0}]]},"Get file data":{"main":[[{"node":"If file too large","type":"main","index":0}]]},"Manual Trigger":{"main":[[{"node":"Get All WP Posts","type":"main","index":0}]]},"Create new file":{"main":[[{"node":"Return","type":"main","index":0}]]},"Get All WP Posts":{"main":[[{"node":"Format JSON","type":"main","index":0}]]},"Schedule Trigger":{"main":[[{"node":"Get All WP Posts","type":"main","index":0}]]},"File is different":{"main":[[{"node":"Edit existing file","type":"main","index":0}]]},"If file too large":{"main":[[{"node":"Get File","type":"main","index":0}],[{"node":"Merge Items","type":"main","index":0}]]},"Edit existing file":{"main":[[{"node":"Return","type":"main","index":0}]]},"Same file - Do nothing":{"main":[[{"node":"Return","type":"main","index":0}]]},"Execute Workflow Trigger":{"main":[[{"node":"Merge Items","type":"main","index":1},{"node":"tag?","type":"main","index":0}]]}}}


name: AI Prompt Maker
author_name: Lucas Peyrin
author_username: lucaspeyrin
nodes_used: ["@n8n/n8n-nodes-langchain.chainLlm","@n8n/n8n-nodes-langchain.lmChatGoogleGemini"]
categories: []
created_at: 2025-06-25T08:54:41.707Z
updated_at: 2025-06-25T08:54:41.707Z
url: https://n8n.io/workflows/5289
scraped_at: 2025-07-06 21:16:30
description:
  How it works

  This template provides a complete, ready-to-use web application for generating high-quality AI prompts. It features a user-friendly web form where you can describe your goal, and it leverages an AI model (Google Gemini) to create a structured, reusable prompt for you.

  The workflow is a full-stack application built entirely within n8n:

  Frontend (The Form): A Form Trigger node creates a beautiful, public-facing web form. Here, a user describes the prompt they need and selects which structural components to include (like system instructions, examples, or input variables).
  Backend (The AI Logic):
      A LangChain Chain node takes the user's request and constructs a "meta-prompt"—a set of instructions for the AI on how to generate the final prompt.
      The Google Gemini node executes this meta-prompt, creating a well-structured output with clear sections and tags.
  The Result (The Webpage):
      After generation, the user is automatically redirected to a new URL.
      This URL is handled by another Webhook node, which serves a custom-coded HTML page.
      This beautiful, dark-themed webpage displays the generated prompt and includes a one-click "Copy" button, making it easy to use the result immediately.

  This template is a perfect example of how to build interactive web tools with n8n, combining a user interface, backend logic, and a dynamic web response in a single workflow.

  Set up steps

  Setup time: ~1-3 minutes

  This workflow requires a Google AI credential to function.

  Configure Google AI Credentials:
      This workflow uses a Google Gemini model. You will need a Google AI API key.
      In n8n, go to Credentials and click Add credential.
      Search for Google Gemini and enter your API key.
      Go back to the workflow, open the Gemini 2.5 Flash node, and select your newly created credential from the dropdown.

  Activate the Workflow:
      Click the Active toggle in the top-right corner to turn the workflow on.

  Access Your Prompt Maker:
      Open the Prompt Request (Form Trigger) node.
      Copy the Public URL provided. This is the link to your new web application!
      Open the link in your browser, fill out the form, and see the magic happen.

  Note: This workflow uses environment variables like {{ $env.WEBHOOK_URL }} to build the redirect URL. These are typically set automatically by n8n and should work out-of-the-box on most standard n8n setups.

workflow_json:
  {"meta":{"instanceId":"e409ea34548a2afe2dffba31130cd1cf2e98ebe2afaeed2a63caf2a0582d1da0"},"nodes":[{"id":"430f2ed6-ccbe-4ccd-844b-c7458d0e87b0","name":"Gemini 2.5 Flash","type":"@n8n/n8n-nodes-langchain.lmChatGoogleGemini","position":[-580,480],"parameters":{"options":{"temperature":0},"modelName":"models/gemini-2.5-flash"},"credentials":{"googlePalmApi":{"id":"AXawYbABK5aZbGBE","name":"IA2S"}},"typeVersion":1},{"id":"fc337c72-6ce9-43fa-96b2-1581b54983ca","name":"Prompt Request","type":"n8n-nodes-base.formTrigger","position":[-1180,40],"webhookId":"bef818b2-581a-44ad-bd07-a8b26cfb5b8c","parameters":{"options":{"path":"prompt-maker","customCss":"/* --- ROOT VARIABLES (DARK THEME) --- */\n:root {\n\t/* --- FONT MAPPING --- */\n\t--font-family: 'Inter', sans-serif;\n\t--font-weight-normal: 400;\n\t--font-weight-bold: 600;\n\t--font-size-body: 12px;\n\t--font-size-label: 14px;\n\t--font-size-test-notice: 12px;\n\t--font-size-input: 14px;\n\t--font-size-header: 20px;\n\t--font-size-paragraph: 14px;\n\t--font-size-link: 12px;\n\t--font-size-error: 12px;\n\t--font-size-html-h1: 28px;\n\t--font-size-html-h2: 20px;\n\t--font-size-html-h3: 16px;\n\t--font-size-html-h4: 14px;\n\t--font-size-html-h5: 12px;\n\t--font-size-html-h6: 10px;\n\t--font-size-subheader: 14px;\n\n\t/* --- COLOR MAPPING (Dark Theme) --- */\n\t--color-background: #1a1b26;\n\t--color-card-bg: #24283b;\n\t--color-input-bg: #1e202e;\n\t--color-card-border: #414868;\n\t--color-header: #ffffff;\n\t--color-label: #c0caf5;\n\t--color-input-text: #c0caf5;\n\t--color-header-subtext: #c0caf5;\n\t--color-html-text: #c0caf5;\n\t--color-input-border: #414868;\n\t--color-focus-border: #7aa2f7;\n\t--color-link: #9eceff;\n\t--color-html-link: #7aa2f7;\n\t--color-submit-btn-bg: #7aa2f7;\n\t--color-submit-btn-hover-bg: #9eceff;\n\t--color-submit-btn-text: #ffffff; /* CORRECTED: Changed back to white for better readability */\n\t--color-clear-button-bg: #414868;\n\t--color-error: #f7768e;\n\t--color-required: #f7768e;\n\t--color-test-notice-text: #c0caf5;\n\t--color-test-notice-bg: #2a2f41;\n\t--color-test-notice-border: #7aa2f7;\n\n\t/* --- BORDER RADII & SPACING --- */\n\t--border-radius-card: 12px;\n\t--border-radius-input: 6px;\n\t--border-radius-clear-btn: 50%;\n\t--card-border-radius: 12px;\n\t--padding-container-top: 24px;\n\t--padding-card: 24px;\n\t--padding-test-notice-vertical: 12px;\n\t--padding-test-notice-horizontal: 24px;\n\t--margin-bottom-card: 16px;\n\t--padding-form-input: 12px;\n\t--card-padding: 24px;\n\t--card-margin-bottom: 16px;\n\n\t/* --- DIMENSIONS --- */\n\t--container-width: 500px;\n\t--submit-btn-height: 48px;\n\t--checkbox-size: 18px;\n\n\t/* --- OTHER MAPPINGS --- */\n\t--box-shadow-card: 0 10px 30px rgba(0, 0, 0, 0.3);\n\t--color-card-shadow: rgba(0, 0, 0, 0.3);\n\t--opacity-placeholder: 0.5;\n}\n\n/* === GLOBAL & ELEMENT-SPECIFIC FIXES === */\n\n/* 1. Add the dot grid background to the page */\nbody {\n    background-image: radial-gradient(circle at 1px 1px, rgba(255,255,255,0.05) 1px, transparent 0);\n    background-size: 20px 20px;\n}\n\n/* 2. Explicitly style the TEXTAREA */\n/* Targets the specific class n8n uses */\ntextarea.form-input {\n    background-color: var(--color-input-bg);\n    color: var(--color-input-text);\n    font-family: var(--font-family); /* Force font inheritance */\n}\ntextarea.form-input::placeholder {\n    color: var(--color-input-text);\n    opacity: var(--opacity-placeholder);\n}\n\n/* 3. Explicitly style the BUTTON */\nbutton.submit-btn {\n    transition: background-color 0.2s ease;\n    font-family: var(--font-family); /* Force font inheritance */\n    font-weight: var(--font-weight-bold);\n    color: var(--color-submit-btn-text); /* Ensure text color is applied */\n}\nbutton.submit-btn:hover {\n    background-color: var(--color-submit-btn-hover-bg);\n}\n\n/* 4. Completely new CHECKBOX styling for n8n's structure */\n/* Target the label that wraps the checkbox and text */\nlabel.multiselect-label {\n    display: flex;\n    align-items: center;\n    cursor: pointer;\n    position: relative;\n}\n/* Target the text part of the label */\nlabel.multiselect-label span {\n    padding-left: 12px; /* Space between box and text */\n}\n/* Hide the default browser checkbox */\nlabel.multiselect-label input[type=\"checkbox\"] {\n    appearance: none;\n    -webkit-appearance: none;\n    position: absolute;\n    opacity: 0;\n    cursor: pointer;\n    height: 0;\n    width: 0;\n}\n/* Create a custom checkbox box using a pseudo-element on the text span */\nlabel.multiselect-label span::before {\n    content: '';\n    position: absolute;\n    left: 0;\n    top: 50%;\n    transform: translateY(-50%);\n    width: var(--checkbox-size);\n    height: var(--checkbox-size);\n    background-color: var(--color-input-bg);\n    border: 1px solid var(--color-input-border);\n    border-radius: 4px;\n    transition: all 0.2s ease;\n}\n/* Style the custom box when the (hidden) checkbox is checked */\nlabel.multiselect-label input[type=\"checkbox\"]:checked + span::before {\n    background-color: var(--color-focus-border);\n    border-color: var(--color-focus-border);\n    /* Add a checkmark using an embedded SVG */\n    background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='white'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e\");\n    background-position: center;\n    background-repeat: no-repeat;\n}\n/* Add a focus ring for accessibility */\nlabel.multiselect-label input[type=\"checkbox\"]:focus-visible + span::before {\n    outline: 2px solid var(--color-focus-border);\n    outline-offset: 2px;\n}","buttonLabel":"Create Prompt","appendAttribution":false},"formTitle":"AI Prompt Maker","formFields":{"values":[{"fieldType":"textarea","fieldLabel":"What prompt do you want ?","placeholder":"Talk about the goal of the prompt, any related context and any input format (e.g. input variables). You can also provide output examples.","requiredField":true},{"fieldType":"dropdown","fieldLabel":"Select Sections","multiselect":true,"fieldOptions":{"values":[{"option":"System Instructions"},{"option":"Examples"},{"option":"Inputs"}]}}]},"responseMode":"lastNode","formDescription":"Let AI create your perfect prompt.."},"typeVersion":2.2},{"id":"f036c843-4723-47e8-8eb0-3b5ec639e0c6","name":"Generate Prompt","type":"@n8n/n8n-nodes-langchain.chainLlm","position":[-680,40],"parameters":{"text":"={{ $json['What prompt do you want ?'] }}","batching":{},"messages":{"messageValues":[{"message":"=You are an expert prompt generator for AI language models. This is what you output :\n{{ $json['Select Sections'].includes('System Instructions') ? \"\\n<role>\\nThe role that the AI should take (for the system prompt)\\n</role>\\n\" : \"\" }}\n<instructions>\n<goal>\nThe goal or task at hand\n</goal>\n\n<context>\nAll the context for the task or goal\n</context>\n{{ $json['Select Sections'].includes('Examples') ? \"\\n<examples>\\n<example_1>\\n<inputs>\\n<...>\\n...\\n</...>\\n</inputs>\\n<output>\\n...\\n</output>\\n</example_1>\\n...\\n</examples>\\n\" : \"\" }}\n\n<output_format>\n...\n</output_format>\n</instructions>{{ $json['Select Sections'].includes('Inputs') ? \n\"\\n\\n<inputs>\\n<[input_tag]>\\n[USE FILLER TEXT TO EXPLAIN WHAT TO PUT HERE]\\n</[input_tag]>\\n...\\n</inputs>\" : \"\" }}"}]},"promptType":"define"},"typeVersion":1.7},{"id":"3292f7f6-cd6a-47d8-a58a-e57d2bf61871","name":"Go to Site","type":"n8n-nodes-base.form","position":[-20,40],"webhookId":"65b26fc2-22c6-424f-85c9-f91502a02d72","parameters":{"operation":"completion","redirectUrl":"={{ $env.WEBHOOK_URL + ($env.N8N_ENDPOINT_WEBHOOK ?? \"webhook\") }}/prompt/result?prompt={{ $json.text.urlEncode() }}","respondWith":"redirect"},"typeVersion":1},{"id":"f0949115-9ea1-4507-963f-b75c9d5bfb7e","name":"Get Prompt Webpage","type":"n8n-nodes-base.webhook","position":[-1180,1040],"webhookId":"99651075-3d83-4d67-963f-06c7a5e6a3d3","parameters":{"path":"prompt/result","options":{},"responseMode":"responseNode"},"typeVersion":2},{"id":"294a6d6c-2312-4c3e-91b0-e1e03ab1fea0","name":"Display Webpage","type":"n8n-nodes-base.respondToWebhook","position":[-620,1040],"parameters":{"options":{"responseHeaders":{"entries":[{"name":"Content-Type","value":"text/html; charset=UTF-8"}]}},"respondWith":"text","responseBody":"=<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Prompt Viewer</title>\n    \n    <!-- Fonts from Google Fonts for a professional look -->\n    <link rel=\"preconnect\" href=\"https://fonts.googleapis.com\">\n    <link rel=\"preconnect\" href=\"https://fonts.gstatic.com\" crossorigin>\n    <link href=\"https://fonts.googleapis.com/css2?family=Inter:wght@400;500;700&family=Fira+Code:wght@400;500&display=swap\" rel=\"stylesheet\">\n\n    <style>\n        /* --- Reset and Base Styles --- */\n        :root {\n            --bg-color: #1a1b26;\n            --card-bg: #24283b;\n            --code-bg: #1e202e; /* Slightly different bg for the code block */\n            --text-color: #c0caf5;\n            --header-color: #ffffff;\n            --accent-color: #7aa2f7;\n            --accent-hover: #9eceff;\n            --success-color: #9ece6a;\n            --border-color: #414868;\n            --shadow-color: rgba(0, 0, 0, 0.3);\n        }\n\n        * {\n            margin: 0;\n            padding: 0;\n            box-sizing: border-box;\n        }\n\n        body {\n            font-family: 'Inter', sans-serif;\n            background-color: var(--bg-color);\n            color: var(--text-color);\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            min-height: 100vh;\n            padding: 2rem;\n            background-image: radial-gradient(circle at 1px 1px, rgba(255,255,255,0.05) 1px, transparent 0);\n            background-size: 20px 20px;\n        }\n\n        /* --- Main Container --- */\n        .container {\n            width: 100%;\n            max-width: 900px;\n            background-color: var(--card-bg);\n            border-radius: 12px;\n            border: 1px solid var(--border-color);\n            box-shadow: 0 10px 30px var(--shadow-color);\n            overflow: hidden;\n            display: flex;\n            flex-direction: column;\n        }\n\n        /* --- Card Header --- */\n        .header {\n            padding: 1.5rem 2rem;\n            border-bottom: 1px solid var(--border-color);\n        }\n\n        .header h1 {\n            font-size: 1.8rem;\n            font-weight: 700;\n            color: var(--header-color);\n            margin-bottom: 0.25rem;\n        }\n\n        .header p {\n            font-size: 1rem;\n            color: var(--text-color);\n        }\n\n        /* --- Prompt Content --- */\n        .prompt-content {\n            position: relative;\n            padding: 2rem;\n            padding-top: 4.5rem; /* Space for the copy button */\n        }\n\n        /* --- Markdown-style Code Block --- */\n        pre {\n            background-color: var(--code-bg);\n            border: 1px solid var(--border-color);\n            border-radius: 8px;\n            padding: 1.5rem;\n            font-family: 'Fira Code', monospace;\n            font-size: 0.9rem;\n            line-height: 1.6;\n            color: var(--text-color);\n            \n            /* KEY FOR TEXT WRAPPING */\n            white-space: pre-wrap;\n            overflow-wrap: break-word;\n        }\n\n        /* --- Copy Button --- */\n        .copy-button {\n            position: absolute;\n            top: 1.5rem;\n            right: 1.5rem;\n            background-color: var(--border-color);\n            color: var(--text-color);\n            border: none;\n            border-radius: 6px;\n            padding: 0.6rem 1rem;\n            font-family: 'Inter', sans-serif;\n            font-weight: 500;\n            font-size: 0.9rem;\n            cursor: pointer;\n            display: flex;\n            align-items: center;\n            gap: 0.5rem;\n            transition: background-color 0.2s ease, color 0.2s ease;\n            z-index: 10; /* Ensure it's above the <pre> block */\n        }\n\n        .copy-button:hover {\n            background-color: var(--accent-color);\n            color: var(--header-color);\n        }\n\n        .copy-button.copied {\n            background-color: var(--success-color);\n            color: var(--bg-color);\n        }\n\n        .copy-button svg {\n            width: 16px;\n            height: 16px;\n            stroke-width: 2;\n        }\n\n        /* --- Footer --- */\n        .footer {\n            text-align: center;\n            padding: 1rem;\n            font-size: 0.8rem;\n            color: var(--border-color);\n            border-top: 1px solid var(--border-color);\n        }\n\n        .footer a {\n            color: var(--accent-color);\n            text-decoration: none;\n            transition: color 0.2s ease;\n        }\n\n        .footer a:hover {\n            color: var(--accent-hover);\n        }\n    </style>\n</head>\n<body>\n\n    <div class=\"container\">\n        <header class=\"header\">\n            <h1>Your Custom Prompt</h1>\n            <p>Use the button below to copy the entire prompt to your clipboard.</p>\n        </header>\n\n        <main class=\"prompt-content\">\n            <button id=\"copy-btn\" class=\"copy-button\">\n                <svg id=\"copy-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"9\" y=\"9\" width=\"13\" height=\"13\" rx=\"2\" ry=\"2\"></rect><path d=\"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1\"></path></svg>\n                <svg id=\"check-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\" style=\"display: none;\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\n                <span id=\"copy-text\">Copy</span>\n            </button>\n\n            <!-- \n                This block is now a simple placeholder.\n                We will populate it using JavaScript to ensure the prompt text,\n                including all its tags, is displayed literally.\n            -->\n            <pre><code id=\"prompt-display-code\"></code></pre>\n        </main>\n        \n        <footer class=\"footer\">\n            <p>Generated with ❤️ by <a href=\"https://n8n.partnerlinks.io/g3yh568uv03t\" target=\"_blank\" rel=\"noopener noreferrer\">n8n</a></p>\n        </footer>\n    </div>\n\n    <!-- \n        This is the most important part for perfect copy/display.\n        We embed the raw prompt data into a JavaScript variable.\n        JSON.stringify() escapes any special characters, making it a valid JS string.\n    -->\n    <script>\n        const rawPromptToCopy = {{ JSON.stringify($json.query.prompt) }};\n    </script>\n\n    <script>\n        document.addEventListener('DOMContentLoaded', () => {\n            // --- Part 1: Display the prompt safely ---\n            const promptDisplayElement = document.getElementById('prompt-display-code');\n            if (promptDisplayElement) {\n                // Using .textContent is the key. It tells the browser to treat\n                // the string as plain text, not as HTML. This automatically\n                // displays '<' and '>' characters correctly.\n                promptDisplayElement.textContent = rawPromptToCopy;\n            }\n\n            // --- Part 2: Handle the copy functionality ---\n            const copyButton = document.getElementById('copy-btn');\n            const copyText = document.getElementById('copy-text');\n            const copyIcon = document.getElementById('copy-icon');\n            const checkIcon = document.getElementById('check-icon');\n\n            copyButton.addEventListener('click', () => {\n                // The clipboard API copies the raw, unmodified string.\n                navigator.clipboard.writeText(rawPromptToCopy)\n                    .then(() => {\n                        // Success feedback\n                        copyText.textContent = 'Copied!';\n                        copyButton.classList.add('copied');\n                        copyIcon.style.display = 'none';\n                        checkIcon.style.display = 'inline-block';\n\n                        // Reset the button after 2 seconds\n                        setTimeout(() => {\n                            copyText.textContent = 'Copy';\n                            copyButton.classList.remove('copied');\n                            copyIcon.style.display = 'inline-block';\n                            checkIcon.style.display = 'none';\n                        }, 2000);\n                    })\n                    .catch(err => {\n                        console.error('Failed to copy: ', err);\n                        copyText.textContent = 'Error';\n                        setTimeout(() => { copyText.textContent = 'Copy'; }, 2000);\n                    });\n            });\n        });\n    </script>\n\n</body>\n</html>"},"typeVersion":1.1},{"id":"29733433-2142-4177-9f5f-9a05de1c5436","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-2180,-440],"parameters":{"color":6,"width":760,"content":"## Workflow Overview\nThis n8n workflow provides a user-friendly web interface to generate structured prompts for Large Language Models (LLMs) using Google Gemini. Users can describe their desired prompt, specify which sections (e.g., System Instructions, Examples, Inputs) they want included, and the workflow will leverage AI to create a well-formatted prompt. The generated prompt is then displayed on a dedicated webpage, ready to be copied."},"typeVersion":1},{"id":"bbbb0e8a-ccc4-469e-bb54-e7f1d298071f","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[-1380,-440],"parameters":{"color":7,"width":500,"height":640,"content":"### 1. Prompt Request (Form Trigger)\n*   **Purpose:** Serves as the public-facing entry point for the workflow. It presents a customizable web form to collect user requirements for the AI prompt.\n*   **Configuration:**\n    *   **Form Title:** \"AI Prompt Maker\"\n    *   **Form Description:** \"Let AI create your perfect prompt..\"\n    *   **Form Fields:**\n        *   \"What prompt do you want ?\": A required textarea for the user to describe the prompt's goal, context, input format, and examples.\n        *   \"Select Sections\": A multi-select dropdown allowing users to choose whether to include \"System Instructions\", \"Examples\", and \"Inputs\" sections in the generated prompt.\n    *   **Webhook Path:** `/prompt-maker`\n    *   **Custom CSS:** Includes extensive CSS to style the form for a modern and cherent appearance with the webage.\n*   **Logic:** Upon form submission, it captures the user's input and passes it to the next node for prompt generation."},"typeVersion":1},{"id":"aa874d0f-3551-48f3-9926-ae556d2c2c73","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[-860,-300],"parameters":{"color":7,"width":620,"height":500,"content":"### 2. Generate Prompt (LLM Chain)\n*   **Purpose:** This node acts as the orchestrator for the prompt generation. It constructs a meta-prompt based on user selections and sends it to the connected LLM.\n*   **Configuration:**\n    *   **Text:** Uses the user's input from the \"What prompt do you want ?\" field.\n    *   **Messages:** Contains a system message that instructs the LLM (Gemini) to act as an expert prompt generator. This message dynamically includes placeholders for <role>, <examples>, and <inputs> based on the user's \"Select Sections\" choices. The core structure includes <goal>, <context>, and <output_format>.\n*   **Logic:** It dynamically builds the prompt for the LLM, ensuring the generated output adheres to a specific, structured format (e.g., using XML-like tags for sections)."},"typeVersion":1},{"id":"d153908d-ac4c-4af1-ba29-ac468142aece","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-740,220],"parameters":{"color":7,"width":400,"height":380,"content":"### 3. Gemini 2.5 Flash (Google Gemini Chat)\n*   **Purpose:** This is the Large Language Model (LLM) that performs the actual prompt generation.\n*   **Configuration:**\n    *   **Model Name:** `models/gemini-2.5-flash` (a fast and cost-effective model, but smart enough to build prompts).\n    *   **Temperature:** `0` (ensures deterministic and consistent output, ideal for structured generation).\n*   **Logic:** Receives the meta-prompt from \"Generate Prompt\" and returns the newly created, structured AI prompt."},"typeVersion":1},{"id":"88ca6809-5621-48c8-ba70-171508137a1c","name":"Sticky Note4","type":"n8n-nodes-base.stickyNote","position":[-220,-300],"parameters":{"color":7,"width":480,"height":500,"content":"### 4. Go to Site (Form)\n*   **Purpose:** After the prompt is generated, this node redirects the user's browser to a new URL where the generated prompt will be displayed.\n*   **Configuration:**\n    *   **Respond With:** `redirect`\n    *   **Redirect URL:** Dynamically constructed using n8n environment variables (`WEBHOOK_URL`, `N8N_ENDPOINT_WEBHOOK`) and the URL-encoded generated prompt (`$json.text.urlEncode()`). This URL points to the \"Get Prompt Webpage\" webhook.\n*   **Logic:** Ensures a seamless transition from the form submission to the prompt display page.\n"},"typeVersion":1},{"id":"0fddd040-5e20-4bb0-be61-ac4cf8772548","name":"Sticky Note5","type":"n8n-nodes-base.stickyNote","position":[-1380,640],"parameters":{"color":7,"width":520,"height":560,"content":"### 5. Get Prompt Webpage (Webhook)\n*   **Purpose:** This webhook serves as the target for the redirect from \"Go to Site\". It receives the generated prompt as a URL query parameter.\n*   **Configuration:**\n    *   **Path:** `/prompt/result`\n    *   **Response Mode:** `Using Respond to Webhook Node` (delegates the response generation to the next node).\n*   **Logic:** Listens for incoming requests to the `/prompt/result` path and extracts the `prompt` query parameter."},"typeVersion":1},{"id":"19ce7d51-ad08-491e-bb1a-4ad7d4348130","name":"Sticky Note6","type":"n8n-nodes-base.stickyNote","position":[-840,640],"parameters":{"color":7,"width":600,"height":560,"content":"### 6. Display Webpage (Respond to Webhook)\n*   **Purpose:** Renders a custom HTML page to beautifully display the generated prompt and provide a \"copy to clipboard\" functionality.\n*   **Configuration:**\n    *   **Respond With:** `text`\n    *   **Response Body:** Contains a complete HTML document with embedded CSS for styling and JavaScript for handling the prompt display and copy functionality.\n    *   **Content-Type Header:** `text/html; charset=UTF-8`\n*   **Logic:**\n    *   The HTML page is designed with a dark theme and a code block (<pre><code>) to present the prompt.\n    *   A JavaScript snippet safely embeds the received prompt (from `$json.query.prompt`) into a variable using `JSON.stringify()` to handle special characters.\n    *   Another JavaScript snippet then populates the <code> block with the prompt using `textContent` (to display it literally, including angle brackets) and implements the copy-to-clipboard feature."},"typeVersion":1},{"id":"f21a289d-1665-4888-9a4c-9c59d390375c","name":"Sticky Note7","type":"n8n-nodes-base.stickyNote","position":[-2180,-260],"parameters":{"color":5,"width":760,"height":680,"content":"## Required Credentials\n*   **Google Palm API:** This workflow requires an n8n credential for the Google Palm API (which supports Gemini models) to connect to the Google Gemini service. The example credential name is \"IA2S\".\n\n## Setup & Configuration\n\n1.  **Import the Workflow:**\n    *   Copy the provided workflow JSON.\n    *   In your n8n instance, go to \"Workflows\" and click \"New\".\n    *   Click the \"Import from JSON\" button and paste the JSON.\n\n2.  **Configure Google Palm API Credential:**\n    *   Ensure you have an active Google Gemini API credential configured in n8n.\n    *   If not, open the \"Gemini 2.5 Flash\" node, click \"New Credential\", and follow the instructions to set it up (you'll need an API key from Google AI Studio).\n\n3.  **Environment Variables (Optional but Recommended):**\n    *   This workflow uses `WEBHOOK_URL` and `N8N_ENDPOINT_WEBHOOK` environment variables for constructing the redirect URL. They will be in red, but this is normal.\n    *   `WEBHOOK_URL`: This is usually automatically set by n8n to your instance's base URL.\n    *   `N8N_ENDPOINT_WEBHOOK`: If your n8n instance is behind a reverse proxy or has a custom webhook path (e.g., `https://yourdomain.com/custom-path`), you might need to set this environment variable in your n8n configuration. By default, n8n's webhook path is `webhook`.\n\n4.  **Activate the Workflow:**\n    *   After importing and configuring credentials, activate the workflow by toggling the \"Active\" switch in the top right corner of the workflow editor (To make the webhook accessible)."},"typeVersion":1},{"id":"dc720dcd-784e-4368-9b11-f2115deaf215","name":"Sticky Note8","type":"n8n-nodes-base.stickyNote","position":[-2180,440],"parameters":{"color":4,"width":760,"height":500,"content":"## Usage\n\n1.  **Access the Prompt Maker Form:**\n    *   Once the workflow is active, navigate to the \"Prompt Request\" node.\n    *   Copy the \"Public URL\" displayed in the node's settings (e.g., `https://YOUR_N8N_URL/form/prompt-maker`).\n    *   Open this URL in your web browser.\n\n2.  **Fill Out the Form:**\n    *   Enter a detailed description of the prompt you want to create in the \"What prompt do you want ?\" textarea.\n    *   Select the desired sections (System Instructions, Examples, Inputs) using the \"Select Sections\" options.\n\n3.  **Generate and View Prompt:**\n    *   Click the \"Create Prompt\" button.\n    *   The workflow will execute, generate the prompt, and redirect your browser to a new page displaying the generated prompt.\n\n4.  **Copy the Prompt:**\n    *   On the prompt display page, click the \"Copy\" button to copy the entire generated prompt to your clipboard."},"typeVersion":1},{"id":"7cd9e2ea-5e68-4b1d-a5b1-da17bb1063d8","name":"Sticky Note9","type":"n8n-nodes-base.stickyNote","position":[-2180,960],"parameters":{"color":3,"width":760,"height":520,"content":"## Troubleshooting\n\n*   **Form Not Loading (404 Error):**\n    *   Ensure the workflow is active.\n    *   Verify the \"Public URL\" for the \"Prompt Request\" node is correct and accessible.\n    *   Check your n8n instance's `N8N_ENDPOINT_WEBHOOK` environment variable if you are using a custom webhook path or reverse proxy.\n*   **Prompt Generation Fails (LLM Error):**\n    *   Check the n8n execution logs for the \"Generate Prompt\" and \"Gemini 2.5 Flash\" nodes.\n    *   Verify your Google Palm API credential is valid and has sufficient permissions.\n    *   Ensure your Google Gemini API key is correctly configured and not expired.\n    *   Check for API rate limits on the Google Gemini side.\n*   **Redirect Not Working / Blank Page:**\n    *   Confirm the workflow is active.\n    *   Verify that the `WEBHOOK_URL` and `N8N_ENDPOINT_WEBHOOK` environment variables are correctly set in your n8n instance. The redirect URL must be valid and point back to your n8n instance.\n    *   Check the execution logs for the \"Go to Site\" and \"Get Prompt Webpage\" nodes for any errors.\n*   **Prompt Not Displaying Correctly on Page:**\n    *   While unlikely due to the `JSON.stringify` and `textContent` usage, very unusual characters in the generated prompt might cause rendering issues.\n    *   Ensure your browser's JavaScript is enabled."},"typeVersion":1},{"id":"c3a2c66f-b065-4992-a902-c6b6e86f609d","name":"Sticky Note10","type":"n8n-nodes-base.stickyNote","position":[-200,400],"parameters":{"width":540,"height":800,"content":"## Was this helpful? Let me know!\n\nI really hope this template helped you create amazing AI prompts. 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=AI%20Prompt%20Maker)**\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=AI%20Prompt%20Maker)**\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=AI%20Prompt%20Maker)**\n\n---\n\nHappy Automating!\nLucas Peyrin"},"typeVersion":1}],"pinData":{"Generate Prompt":[{"text":"<instructions>\n<goal>\nSay \"Hello, World!\".\n</goal>\n\n<context>\nThis is a basic test to ensure the model is functioning and can produce a simple output.\n</context>\n\n<output_format>\nHello, World!\n</output_format>\n</instructions>"}]},"connections":{"Prompt Request":{"main":[[{"node":"Generate Prompt","type":"main","index":0}]]},"Generate Prompt":{"main":[[{"node":"Go to Site","type":"main","index":0}]]},"Gemini 2.5 Flash":{"ai_languageModel":[[{"node":"Generate Prompt","type":"ai_languageModel","index":0}]]},"Get Prompt Webpage":{"main":[[{"node":"Display Webpage","type":"main","index":0}]]}}}


name: Summarize youtube videos from transcript for social media
author_name: Evoort Solutions
author_username: evoortsolutions
categories: []
created_at: 2025-06-25T09:30:08.053Z
updated_at: 2025-06-25T09:30:08.053Z
url: https://n8n.io/workflows/5292
scraped_at: 2025-07-06 21:16:30
description:
  🎥 YouTube Video Summarizer for Social Media

  Turn any YouTube video into a short, structured summary using AI — perfect for content creators, marketers, or social media managers.

  🔧 What We Built

  We created a no-code automation in n8n that:

  Accepts a YouTube Video ID via a form
  Fetches the video transcript using an external API
  Summarizes the transcript using AI (Google Gemini)
  Automatically saves the summary to Google Docs for team use

  🧩 Flow Overview

  | Step | Description |
  |------|-------------|
  | ✅ Form Trigger | User submits a YouTube video ID using an n8n form |
  | 🔁 Set Node | Maps the YouTube video ID for use in the API request |
  | 🌐 HTTP Request (External API) | Calls the YouTube Transcriptor AI API via RapidAPI to fetch transcript |
  | 🧹 Formatter (Code Node) | Joins transcript lines into a readable text block |
  | 🧠 AI Agent + Google Gemini (via Langchain) | Summarizes the full transcript into bullet points and tone |
  | 🧽 Optimizer (Code Node) | Extracts just the summary from the AI response |
  | 📝 Google Docs Node | Appends the clean summary to a shared Google Doc |

  🌍 Real-World Problem Solved

  ❌ The Challenge

  Creators and marketers waste hours watching full videos just to extract the key points.
  Manual summarization is inconsistent, repetitive, and delays content planning.

  ✅ Our Solution

  ⏱️ Reduces time spent watching videos
  🧠 AI-powered summaries keep tone consistent and structured
  📄 Auto-sync with Google Docs makes summaries instantly available for teams

  🔥 Bonus: This uses the YouTube Transcriptor AI API, so no need to manually scrape captions or use browser extensions.

  🚀 Ideal Use Cases

  Repurpose YouTube content into Instagram Reels, LinkedIn posts, or blog content
  Build a video summary library for your editorial team
  Quickly extract talking points from podcast episodes

  🛠️ Tech Stack

  n8n** – workflow automation engine  
  YouTube Transcriptor AI API** – via RapidAPI  
  Google Gemini (via Langchain)** – AI summarization  
  Google Docs** – stores the final summary  
  JavaScript nodes** – custom text parsing & formatting

  💡 Want to customize it? Add Slack, Airtable, Notion, or Tweet auto-posting to expand the flow.

  Create your free n8n account and set up the workflow in just a few minutes using the link below:

  👉 Start Automating with n8n

  Save time, stay consistent, and grow your LinkedIn presence effortlessly!

nodes_used:
  ["n8n-nodes-base.httpRequest","n8n-nodes-base.googleDocs","n8n-nodes-base.code","@n8n/n8n-nodes-langchain.agent","@n8n/n8n-nodes-langchain.lmChatGoogleGemini"]

workflow_json:
  {"id":"jCs5Yhd71bxr5Ktc","meta":{"instanceId":"60c025075753afcab9f803964b4caaca9402f435deb4efafbb8e3b93b54d8752","templateCredsSetupCompleted":true},"name":"Summarize youtube videos from transcript for social media","tags":[{"id":"QXtLNWbsCSABOTNm","name":"Digital Marketing","createdAt":"2025-05-29T11:14:57.099Z","updatedAt":"2025-05-29T11:14:57.099Z"}],"nodes":[{"id":"ae2d87c7-870b-4c62-9f25-6454772cb41d","name":"On form submission","type":"n8n-nodes-base.formTrigger","position":[0,0],"webhookId":"10986afd-5943-4e72-9078-074e5191d7ac","parameters":{"options":{},"formTitle":"summarize youtube videos from transcript for social media","formFields":{"values":[{"fieldLabel":"Yt Video Id","placeholder":"abc123","requiredField":true}]}},"typeVersion":2.2},{"id":"bada944a-2453-451b-ade5-1ff2ff6c6377","name":"AI Agent","type":"@n8n/n8n-nodes-langchain.agent","position":[880,0],"parameters":{"options":{"systemMessage":"You are a helpful assistant that summarizes YouTube video transcripts.\n\nHere is the full transcript of a video:\nPlease provide a concise summary of the video in natural language, covering the main points, topics, and tone.\n\nFormat the output as:\n\n---\n🎬 **Summary**:\n- [Main idea 1]\n- [Main idea 2]\n- [Optional tone, style, or genre]\n---\n"}},"typeVersion":2},{"id":"15389a01-0f9f-43b2-821f-b0420e3095ac","name":"Google Gemini Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatGoogleGemini","position":[940,220],"parameters":{"options":{},"modelName":"models/gemini-2.0-flash"},"credentials":{"googlePalmApi":{"id":"Xpxt71RcelLLFyE3","name":"Google Gemini(PaLM) Api account"}},"typeVersion":1},{"id":"fa5c983f-6a44-47fc-be1c-63ca9df9a94b","name":"Google Docs","type":"n8n-nodes-base.googleDocs","position":[1500,0],"parameters":{"actionsUi":{"actionFields":[{"text":"={{ $json.summary }}","action":"insert"}]},"operation":"update","documentURL":"","authentication":"serviceAccount"},"credentials":{"googleApi":{"id":"Rt0RWApx8PL9t0RF","name":"Google Docs account"}},"typeVersion":2},{"id":"8786afdb-097c-4b54-9055-2ad41a988ef3","name":"Mapper","type":"n8n-nodes-base.set","position":[220,0],"parameters":{"options":{},"assignments":{"assignments":[{"id":"a2486ac7-c29c-419e-9cfc-753701723510","name":"ytVideoId","type":"string","value":"={{ $json[\"Yt Video Id\"] }}"}]}},"typeVersion":3.4},{"id":"778ade7e-951f-416c-b2d5-c91b0688ab8d","name":"Youtube Transcriptor","type":"n8n-nodes-base.httpRequest","position":[440,0],"parameters":{"url":"https://youtube-transcriptor-ai.p.rapidapi.com/yt/index.php","method":"POST","options":{},"sendBody":true,"contentType":"multipart-form-data","sendHeaders":true,"bodyParameters":{"parameters":[{"name":"yt_video_id","value":"={{ $json.ytVideoId }}"}]},"headerParameters":{"parameters":[{"name":"x-rapidapi-host"},{"name":"x-rapidapi-key"}]}},"typeVersion":4.2},{"id":"00fc4b62-b1fc-44c5-b7ce-5b2950571b9c","name":"Formator","type":"n8n-nodes-base.code","position":[660,0],"parameters":{"jsCode":"const transcript = \n$input.first().json.tracks[0].transcript\nif (!Array.isArray(transcript) || transcript.length === 0) {\n  return [{\n    json: {\n      chatInput: \"Transcript not available or invalid video ID.\"\n    }\n  }];\n}\n\n// Join all transcript lines into a single string\nconst transcriptText = transcript.map(t => t.text).join(' ');\n\n// Return as chatInput\nreturn [{\n  json: {\n    chatInput: transcriptText\n  }\n}];"},"typeVersion":2},{"id":"53c8c1d4-5250-4212-adde-bfd1a2a53b04","name":"Optimizer","type":"n8n-nodes-base.code","position":[1240,0],"parameters":{"jsCode":"const inputText = $input.first().json.output;\n\nfunction getFieldValue(text, field) {\n  // Updated to stop at \"---\" or end of string, instead of a non-whitespace line\n  const regex = new RegExp(`${field}:\\\\s*([\\\\s\\\\S]*?)(?=\\\\n---|$)`, 'i');\n  const match = text.match(regex);\n  return match ? match[1].trim() : '';\n}\n\nconst summary = getFieldValue(inputText, '🎬 \\\\*\\\\*Summary\\\\*\\\\*');\n\nreturn [{\n  json: {\n    summary\n  }\n}];\n"},"typeVersion":2}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"cb6a2956-019a-492a-881f-b5a179ac34d3","connections":{"Mapper":{"main":[[{"node":"Youtube Transcriptor","type":"main","index":0}]]},"AI Agent":{"main":[[{"node":"Optimizer","type":"main","index":0}]]},"Formator":{"main":[[{"node":"AI Agent","type":"main","index":0}]]},"Optimizer":{"main":[[{"node":"Google Docs","type":"main","index":0}]]},"On form submission":{"main":[[{"node":"Mapper","type":"main","index":0}]]},"Youtube Transcriptor":{"main":[[{"node":"Formator","type":"main","index":0}]]},"Google Gemini Chat Model":{"ai_languageModel":[[{"node":"AI Agent","type":"ai_languageModel","index":0}]]}}}


name: Audio-to-Trello Task Bot
author_name: dirogar
author_username: max
categories: []
created_at: 2025-06-25T09:39:01.975Z
updated_at: 2025-06-25T09:39:01.975Z
url: https://n8n.io/workflows/5293
scraped_at: 2025-07-06 21:16:30
description:
  Telegram Tasker Bot — это сценарий n8n, который принимает голосовые сообщения в Telegram, автоматически превращает их в текст, извлекает из него ключевые поля задачи и создаёт карточку в нужной доске Trello. Пользователь просто говорит задачу — бот сам оформляет её и присылает ссылку на готовую карточку. 

  Для использования вам потребуется telegram bot.
  Его можно создать через бота BotFather

  Так же понадобится доступ к API chatgpt - он используется только для транскрибции аудио в речь. Вы можете использовать любой другой сервис, по вашему выбору.

  И аккаунт в trello, с доступом к API.

  !Внимание!
  ID доски в trello можно взять из url
  ID столбца на доске трелло можно взять через инструменты разработчика (по крайней мере я так получал эти данные)

nodes_used:
  ["n8n-nodes-base.trello","n8n-nodes-base.telegram","n8n-nodes-base.code","@n8n/n8n-nodes-langchain.agent","@n8n/n8n-nodes-langchain.memoryBufferWindow","@n8n/n8n-nodes-langchain.openAi","@n8n/n8n-nodes-langchain.lmChatGroq"]

workflow_json:
  {"id":"ao9ZV2CMJSI4HjOc","meta":{"instanceId":"7904764d90c74cae7474cd6ee305fceb7aa965b02657b71728e2e1b3d47404b5","templateCredsSetupCompleted":true},"name":"Telegram tasker bot","tags":[],"nodes":[{"id":"6e003a17-2caa-45d3-8ba6-6ff1fdb0c0fe","name":"Telegram Trigger","type":"n8n-nodes-base.telegramTrigger","position":[700,160],"webhookId":"f914f76c-c9e5-4ca8-a7ca-2e511e091cbe","parameters":{"updates":["message"],"additionalFields":{}},"credentials":{"telegramApi":{"id":"lY4w1OHVg8w6qZvx","name":"Telegram account"}},"typeVersion":1},{"id":"61bd5cc5-487f-48f2-8b39-2291ae7c5374","name":"Create Trello Card","type":"n8n-nodes-base.trello","maxTries":5,"position":[1980,160],"parameters":{"name":"={{ $json.name }}","listId":"64a39a922fd043526af50b36","description":"={{ $json.description }}","additionalFields":{}},"credentials":{"trelloApi":{"id":"ef5uqwZzflwiFeHR","name":"Trello account"}},"retryOnFail":true,"typeVersion":1},{"id":"48d69373-c391-4be0-adb5-776088e500ba","name":"Groq Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatGroq","position":[1320,360],"parameters":{"options":{}},"credentials":{"groqApi":{"id":"OpI4WIyHLWBXJJlE","name":"Groq account"}},"typeVersion":1},{"id":"1696acb6-0917-42d6-81d8-e8666a5973a0","name":"AI Agent","type":"@n8n/n8n-nodes-langchain.agent","position":[1380,160],"parameters":{"text":"={{ $json.text }}","options":{"systemMessage":"=Сегодняшняя дата: {{$today}}   (формат YYYY-MM-DD)\n\nТы — ассистент-парсер. Получаешь произвольный текст задачи и возвращаешь\nОДНУ строку JSON ровно в таком виде:\n{\"name\":\"…\",\"description\":\"…\",\"date_start\":\"…\",\"date_end\":\"…\"}\n\nПравила\n1. name — до 8-10 слов. Если текста мало, пиши \"Общая задача\".\n2. description — исходный текст целиком.\n3. Даты:\n   ▸ Любые даты выводи числом в формате YYYY-MM-DD.  \n   ▸ Относительные выражения считай так:\n       «сегодня»   → {{$today}}\n       «завтра»    → {{$today+1}}\n       «послезавтра» → {{$today+2}}\n       «через N дней» → {{$today+N}}\n   ▸ Если указан диапазон («с 1 по 5 июля») — date_start = первая дата,\n     date_end = последняя.  \n   ▸ Одна дата? Запиши её в date_start, а date_end оставь \"\".\n   ▸ Нет дат — обе строки пустые.\n4. Никакого текста вне JSON, никаких переводов строк или экранирования.\n\nПримеры  \nВход: «Сделать завтра ремонт на кухне»  \nВыход: {\"name\":\"Ремонт на кухне\",\"description\":\"Сделать завтра ремонт на кухне\",\"date_start\":\"{{$today+1}}\",\"date_end\":\"\"}\n\nВход: «Отчёт с 1 по 5 июля»  \nВыход: {\"name\":\"Отчёт за 1-5 июля\",\"description\":\"Отчёт с 1 по 5 июля\",\"date_start\":\"2025-07-01\",\"date_end\":\"2025-07-05\"}\n"},"promptType":"define"},"typeVersion":2},{"id":"04dcbefa-57ac-4ad5-a826-db5092dbc227","name":"Simple Memory","type":"@n8n/n8n-nodes-langchain.memoryBufferWindow","position":[1480,360],"parameters":{"sessionKey":"={{ $('Telegram Trigger').item.json.message.from.username }}","sessionIdType":"customKey"},"typeVersion":1.3},{"id":"85f2cf10-c37e-409f-acbc-86a3e0c6eadc","name":"Stop and Error","type":"n8n-nodes-base.stopAndError","position":[2640,320],"parameters":{"errorMessage":"Task creation failed"},"typeVersion":1},{"id":"0e58a91d-779b-46a4-ae16-fc106c882c41","name":"Send task message","type":"n8n-nodes-base.telegram","position":[2420,140],"webhookId":"8957795d-bec0-4cb6-be9a-4b77ef56ac07","parameters":{"text":"=Создана задача:  {{ $json.name }}\nСсылка на задачу: {{ $('Create Trello Card').item.json.url }}","chatId":"={{ $('Telegram Trigger').item.json.message.chat.id }}","additionalFields":{"appendAttribution":false,"reply_to_message_id":"={{ $('Telegram Trigger').item.json.message.message_id }}","disable_notification":false}},"credentials":{"telegramApi":{"id":"lY4w1OHVg8w6qZvx","name":"Telegram account"}},"typeVersion":1.2},{"id":"3eecd42f-23e3-466e-9e1a-e34f5f48fd99","name":"Send error message","type":"n8n-nodes-base.telegram","position":[2420,320],"webhookId":"8957795d-bec0-4cb6-be9a-4b77ef56ac07","parameters":{"text":"=Ошибка при создании задачи","chatId":"={{ $('Telegram Trigger').item.json.message.chat.id }}","additionalFields":{"appendAttribution":false,"reply_to_message_id":"={{ $('Telegram Trigger').item.json.message.message_id }}","disable_notification":false}},"credentials":{"telegramApi":{"id":"lY4w1OHVg8w6qZvx","name":"Telegram account"}},"typeVersion":1.2},{"id":"58a1cde2-b9a9-445a-ba7e-686b50b1646b","name":"If trello card id exists","type":"n8n-nodes-base.if","position":[2180,160],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"a5cef062-5441-4a6c-a3ce-f9852844701b","operator":{"type":"string","operation":"exists","singleValue":true},"leftValue":"={{ $json.id }}","rightValue":""}]}},"typeVersion":2.2},{"id":"60f66d20-165c-4eb6-8314-e07a0a9d602c","name":"Parse to json","type":"n8n-nodes-base.code","position":[1780,160],"parameters":{"jsCode":"const data = JSON.parse($input.first().json.output);   // text — ответ модели\nreturn [{ json: data }];\n"},"typeVersion":2},{"id":"c18beb1f-308b-4be7-8e96-e00a5b30c314","name":"Transcriber","type":"@n8n/n8n-nodes-langchain.openAi","position":[1120,160],"parameters":{"options":{"language":"ru","temperature":0},"resource":"audio","operation":"transcribe"},"credentials":{"openAiApi":{"id":"SYuEZTDHiAFQZoGB","name":"OpenAi account"}},"typeVersion":1.8},{"id":"b4c68ea4-0317-4f54-ae1f-d3cb69e75100","name":"Get audio","type":"n8n-nodes-base.telegram","position":[900,160],"webhookId":"9490be79-9ec6-4570-9c93-1f357de477ef","parameters":{"fileId":"={{ $json.message.voice.file_id }}","resource":"file"},"credentials":{"telegramApi":{"id":"lY4w1OHVg8w6qZvx","name":"Telegram account"}},"typeVersion":1.2}],"active":true,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"ae72f36e-da67-4844-9723-e915e2869d9d","connections":{"AI Agent":{"main":[[{"node":"Parse to json","type":"main","index":0}]]},"Get audio":{"main":[[{"node":"Transcriber","type":"main","index":0}]]},"Transcriber":{"main":[[{"node":"AI Agent","type":"main","index":0}]]},"Parse to json":{"main":[[{"node":"Create Trello Card","type":"main","index":0}]]},"Simple Memory":{"ai_memory":[[{"node":"AI Agent","type":"ai_memory","index":0}]]},"Groq Chat Model":{"ai_languageModel":[[{"node":"AI Agent","type":"ai_languageModel","index":0}]]},"Telegram Trigger":{"main":[[{"node":"Get audio","type":"main","index":0}]]},"Create Trello Card":{"main":[[{"node":"If trello card id exists","type":"main","index":0}]]},"Send error message":{"main":[[{"node":"Stop and Error","type":"main","index":0}]]},"If trello card id exists":{"main":[[{"node":"Send task message","type":"main","index":0}],[{"node":"Send error message","type":"main","index":0}]]}}}


name: 🧑‍⚖️ AI Legal Assistant Agent — AI-Powered Legal Q&A with Document Retrieval
author_name: Automate With Marc
author_username: marconi
categories: []
created_at: 2025-06-25T09:55:56.893Z
updated_at: 2025-06-25T09:55:56.893Z
url: https://n8n.io/workflows/5294
scraped_at: 2025-07-06 21:16:30
description:
  🧑‍⚖️ AI Legal Assistant Agent — AI-Powered Legal Q&A with Document Retrieval

  Category: LegalTech / AI Agent / RAG / Chatbot

  Description:
  This no-code AI agent acts as a legal assistant chatbot that can answer user queries by retrieving information from a pre-indexed legal document library. It’s powered by OpenAI + Pinecone + Telegram and designed for law firms, compliance teams, or anyone who needs instant answers from contracts, policies, or regulatory documents.

  For more of such builds and step-by-step video tutorial, check out:
  https://www.youtube.com/@Automatewithmarc

  🔍 How it Works:

  Telegram Trigger – Starts when a user sends a message via Telegram.

  AI Agent (Open AI Model) – Uses a retrieval-augmented generation (RAG) setup to understand the question and pull relevant context.

  Pinecone Vector Store – Searches across a vectorized legal contract library for relevant clauses or documents.

  OpenAI Embeddings – Converts uploaded documents into vector embeddings for efficient search.

  Memory Buffer – Maintains conversation flow and context for follow-up questions.

  Telegram Response – Sends the final AI-generated answer directly to the user.

  🎯 Use Cases:

  In-house legal teams automating internal policy Q&A

  Law firms building client-facing legal bots

  Startups offering legal tech services with document-based queries

  Compliance teams monitoring contract terms and obligations

  ✅ Key Features:

  Real-time legal Q&A via Telegram

  Pinecone + OpenAI-powered vector search

  Retrieval-Augmented Generation (RAG) setup

  Factual, memory-aware assistant with fallback if info is unavailable

  Fully customizable and extendable

  ⚙️ Setup Instructions:

  Connect OpenAI, Pinecone, and Telegram credentials

  Upload your contracts or policy docs into Pinecone

  Customize the system prompt or expand document sources as needed

  Activate and test via Telegram

  This workflow is a solid foundation for any AI-powered legal assistant or chatbot solution—highly relevant for modern LegalOps and knowledge management teams.

nodes_used:
  ["n8n-nodes-base.telegram","@n8n/n8n-nodes-langchain.agent","@n8n/n8n-nodes-langchain.embeddingsOpenAi","@n8n/n8n-nodes-langchain.lmChatOpenAi","@n8n/n8n-nodes-langchain.memoryBufferWindow","@n8n/n8n-nodes-langchain.vectorStorePinecone"]

workflow_json:
  {"id":"rPicfavvntizpQkM","meta":{"instanceId":"1c7b08fed4406d546caf4a44e8b942ca317e7e207bb9a5701955a1a6e1ce1843","templateCredsSetupCompleted":true},"name":"Legal Assistant Agent","tags":[],"nodes":[{"id":"81b14e7a-0dde-4dd3-aa1b-943c1857903d","name":"AI Agent","type":"@n8n/n8n-nodes-langchain.agent","position":[220,0],"parameters":{"text":"={{ $json.message.text }}","options":{"systemMessage":"You are a helpful legal assistant. Your task is to answer legal questions of the users by referring to the Pinecone Vector Database \"Legal Contract Library\" to get an accurate answer. \n#Rule\nDo not make up facts, if you do not have the right information, you may say so."},"promptType":"define"},"typeVersion":2},{"id":"53d344e5-773b-432a-8940-00a9b6814ee8","name":"OpenAI Chat Model","type":"@n8n/n8n-nodes-langchain.lmChatOpenAi","position":[80,240],"parameters":{"model":{"__rl":true,"mode":"list","value":"gpt-4o-mini"},"options":{}},"credentials":{"openAiApi":{}},"typeVersion":1.2},{"id":"38b9de84-bfee-4d66-b22a-f95bcd78b9a6","name":"Embeddings OpenAI","type":"@n8n/n8n-nodes-langchain.embeddingsOpenAi","position":[520,360],"parameters":{"options":{}},"credentials":{"openAiApi":{}},"typeVersion":1.2},{"id":"be801891-2ac9-4871-b54b-72491eb9b962","name":"Legal Contract Library","type":"@n8n/n8n-nodes-langchain.vectorStorePinecone","position":[360,240],"parameters":{"mode":"retrieve-as-tool","options":{},"toolName":"Redacted","pineconeIndex":{"__rl":true,"mode":"id","value":"Redacted"},"toolDescription":"Extract, contracts, legal policies and relevant regulatory documents here."},"credentials":{"pineconeApi":{}},"typeVersion":1.1},{"id":"8cbbb27e-5c31-4c8e-93a1-7515b28649b6","name":"Telegram","type":"n8n-nodes-base.telegram","position":[820,0],"webhookId":"","parameters":{"text":"={{ $json.output }}","chatId":"","additionalFields":{"appendAttribution":false}},"credentials":{"telegramApi":{}},"typeVersion":1.2},{"id":"c664b9b0-cf1b-454c-b943-adcc3f0a8de5","name":"Telegram Trigger","type":"n8n-nodes-base.telegramTrigger","position":[-200,0],"webhookId":"","parameters":{"updates":["message"],"additionalFields":{}},"credentials":{"telegramApi":{}},"typeVersion":1.2},{"id":"f4fa00fd-5e18-4a81-8263-b3bf2d52cb9e","name":"Simple Memory1","type":"@n8n/n8n-nodes-langchain.memoryBufferWindow","position":[240,240],"parameters":{"sessionKey":"={{ $('Telegram Trigger').item.json.message.chat.id }}","sessionIdType":"customKey","contextWindowLength":10},"typeVersion":1.3},{"id":"f2aff94c-ad46-4759-90f0-368d420219e2","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-340,-160],"parameters":{"width":340,"height":700,"content":"Telegram Message Trigger"},"typeVersion":1},{"id":"4eb385e9-5caf-46f3-97a3-bac95c210c78","name":"Sticky Note1","type":"n8n-nodes-base.stickyNote","position":[20,-160],"parameters":{"color":3,"width":720,"height":700,"content":"Legal Asssistant AI Agent"},"typeVersion":1},{"id":"252a59c6-90aa-4ca4-9a4e-2905b69cc984","name":"Sticky Note2","type":"n8n-nodes-base.stickyNote","position":[760,-160],"parameters":{"color":4,"width":280,"height":700,"content":"Telegram Output"},"typeVersion":1},{"id":"beaef1c7-48cb-4f35-a0d7-b5819a0e99fe","name":"Sticky Note3","type":"n8n-nodes-base.stickyNote","position":[-1180,-160],"parameters":{"color":6,"width":820,"height":1180,"content":"🧑‍⚖️ Legal Assistant Agent — AI-Powered Legal Q&A with Document Retrieval\nCategory: LegalTech / AI Agent / RAG / Chatbot\n\nDescription:\nThis no-code AI agent acts as a legal assistant chatbot that can answer user queries by retrieving information from a pre-indexed legal document library. It’s powered by OpenAI + Pinecone + Telegram and designed for law firms, compliance teams, or anyone who needs instant answers from contracts, policies, or regulatory documents.\n\nFor more of such builds and step-by-step video tutorial, check out:\nhttps://www.youtube.com/@Automatewithmarc\n\n🔍 How it Works:\n\nTelegram Trigger – Starts when a user sends a message via Telegram.\n\nAI Agent (GPT-4o) – Uses a retrieval-augmented generation (RAG) setup to understand the question and pull relevant context.\n\nPinecone Vector Store – Searches across a vectorized legal contract library for relevant clauses or documents.\n\nOpenAI Embeddings – Converts uploaded documents into vector embeddings for efficient search.\n\nMemory Buffer – Maintains conversation flow and context for follow-up questions.\n\nTelegram Response – Sends the final AI-generated answer directly to the user.\n\n🎯 Use Cases:\n\nIn-house legal teams automating internal policy Q&A\n\nLaw firms building client-facing legal bots\n\nStartups offering legal tech services with document-based queries\n\nCompliance teams monitoring contract terms and obligations\n\n✅ Key Features:\n\nReal-time legal Q&A via Telegram\n\nPinecone + OpenAI-powered vector search\n\nRetrieval-Augmented Generation (RAG) setup\n\nFactual, memory-aware assistant with fallback if info is unavailable\n\nFully customizable and extendable\n\n⚙️ Setup Instructions:\n\nConnect OpenAI, Pinecone, and Telegram credentials\n\nUpload your contracts or policy docs into Pinecone\n\nCustomize the system prompt or expand document sources as needed\n\nActivate and test via Telegram\n\nThis workflow is a solid foundation for any AI-powered legal assistant or chatbot solution—highly relevant for modern LegalOps and knowledge management teams."},"typeVersion":1}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"0cec767c-2903-4bfb-999a-5668fcadd39d","connections":{"AI Agent":{"main":[[{"node":"Telegram","type":"main","index":0}]]},"Simple Memory1":{"ai_memory":[[{"node":"AI Agent","type":"ai_memory","index":0}]]},"Telegram Trigger":{"main":[[{"node":"AI Agent","type":"main","index":0}]]},"Embeddings OpenAI":{"ai_embedding":[[{"node":"Legal Contract Library","type":"ai_embedding","index":0}]]},"OpenAI Chat Model":{"ai_languageModel":[[{"node":"AI Agent","type":"ai_languageModel","index":0}]]},"Legal Contract Library":{"ai_tool":[[{"node":"AI Agent","type":"ai_tool","index":0}]]}}}


name: Find LinkedIn Professionals with Google Search and Airtable
author_name: Javier Hita
author_username: javierhita
nodes_used: ["n8n-nodes-base.airtable","n8n-nodes-base.httpRequest","n8n-nodes-base.code"]
categories: []
created_at: 2025-06-25T09:57:46.871Z
updated_at: 2025-06-25T09:57:46.871Z
url: https://n8n.io/workflows/5295
scraped_at: 2025-07-06 21:16:30
description:
  Find LinkedIn Professionals with Google Search and Airtable

  Who is this for?

  This workflow is perfect for sales professionals, recruiters, business development teams, and marketers who need to build targeted prospect lists from LinkedIn. Whether you're looking for specific job titles, industry professionals, or experts in particular locations, this template automates the tedious process of manual LinkedIn searching.

  What problem is this workflow solving?

  Finding qualified prospects on LinkedIn manually is time-consuming and inefficient. Traditional methods involve:
  Manually searching LinkedIn with limited search capabilities
  Copy-pasting profile information one by one
  Struggling with LinkedIn's search limitations and restrictions
  Difficulty organizing and tracking prospect data
  No systematic way to avoid duplicate contacts

  This workflow solves these challenges by leveraging Google's powerful search capabilities to find LinkedIn profiles at scale, automatically extracting key information, and organizing everything in a structured database.

  What this workflow does

  The workflow performs intelligent LinkedIn prospect discovery through these key steps:

  Keyword-Based Search: Uses Google Custom Search API to find LinkedIn profiles matching your specific criteria (job titles, industries, locations)
  Smart Data Extraction: Automatically parses profile titles, descriptions, URLs, and search snippets from Google results
  Structured Storage: Saves all prospect data to Airtable with proper field mapping and automatic deduplication
  Pagination Handling: Automatically processes multiple pages of search results to maximize prospect discovery
  Rate Limiting: Includes built-in delays to respect API limits and ensure reliable operation

  Key features:
  Deduplication**: Prevents storing duplicate LinkedIn profiles
  Batch Processing**: Handles large prospect lists efficiently
  Customizable Search**: Easily modify keywords to target different professional segments
  Clean Data Output**: Structured data ready for outreach campaigns

  Setup

  Prerequisites
  You'll need accounts with the following services:
  Google Cloud Console** (for Custom Search API)
  Airtable** (free tier works)
  n8n** (cloud or self-hosted)

  Step 1: Google Custom Search Setup

  Go to Google Cloud Console
  Create a new project or select existing one
  Enable the Custom Search API
  Create credentials (API Key)
  Set up a Custom Search Engine at Google CSE
  Configure it to search the entire web
  Copy your Search Engine ID (cx parameter)

  Step 2: Airtable Base Setup

  Create a new Airtable base with a table named "LinkedIn Prospects" containing these fields:

  Title (Single line text) - LinkedIn profile headline
  linkedin_url (URL) - Direct link to LinkedIn profile  
  Search (Single line text) - Original search terms used
  Description (Long text) - Profile description/summary
  Snippet (Long text) - Google search result snippet

  Step 3: n8n Credentials Configuration

  Set up these credentials in n8n:

  Google Custom Search API:
  Type: HTTP Query Auth
  Name: Google Query Auth
  Query Parameter Name: key
  Value: Your Google API key

  Airtable:
  Type: Airtable Personal Access Token
  Token: Your Airtable personal access token
  Configure the base and table IDs in the Airtable node

  Step 4: Workflow Configuration

  Import this workflow template
  Update the "⚙️ CUSTOMIZE YOUR SEARCH KEYWORDS HERE" node with your target keywords
  Configure the Airtable node with your base and table information
  Test the workflow with a small keyword set first

  How to customize this workflow to your needs

  Targeting Different Industries

  Modify the search keywords in the yellow configuration node:

  // For technology professionals
  "Software Engineer React" 
  "Product Manager SaaS"
  "Data Scientist Machine Learning"

  // For sales professionals  
  "Account Executive Enterprise"
  "Sales Director B2B"
  "Business Development Manager"

  // For marketing professionals
  "Digital Marketing Manager"
  "Content Marketing Specialist" 
  "Growth Marketing Lead"

  Geographic Targeting

  Add location keywords to narrow your search:

  "Marketing Manager London"
  "Sales Director New York" 
  "Software Engineer Berlin"

  Company Size Targeting

  Include company type indicators:

  "CFO Startup"
  "VP Engineering Fortune 500"
  "Marketing Director SMB"

  Adjusting Search Volume

  Modify the Maxresults parameter in the "Configure Search Settings" node:
  Set to 10 for quick tests
  Set to 50-100 for comprehensive searches  
  Maximum recommended: 100 per search to respect API limits

  Industry-Specific Customization

  For Recruiters:
  Target specific job titles and seniority levels
  Add skills-based keywords ("Python Developer", "React Specialist")
  Include experience indicators ("Senior", "Lead", "Principal")

  For Sales Teams:
  Focus on decision-maker titles ("Director", "VP", "C-Level")
  Target specific company sizes or industries
  Include location-based searches for territory management

  For Marketers:
  Search for industry influencers and thought leaders
  Target specific professional communities
  Look for content creators and industry experts

  Advanced Filtering

  Add conditional logic after the search results to filter prospects based on:
  Profile description keywords
  Title patterns
  Company information (when available in snippets)

  Integration Extensions

  Connect additional tools to enhance your prospect research:
  Email finder tools** (Hunter.io, Apollo) for contact discovery
  CRM integration** (HubSpot, Salesforce) for automatic lead creation  
  Enrichment services** (Clearbit, ZoomInfo) for additional prospect data
  Slack/Teams notifications** for real-time prospect alerts

  Data Quality Improvements

  Enhance the workflow with additional processing:
  Duplicate detection** across multiple search terms
  Profile validation** to ensure active LinkedIn profiles
  Keyword scoring** to rank prospect relevance
  Export formatting** for specific CRM requirements

  This template provides a solid foundation that can be adapted for virtually any B2B prospect research need, making it an essential tool for modern sales and marketing teams.

workflow_json:
  {"id":"G4qcWIDe1FQsEXGv","meta":{"instanceId":"ea94475e7076b2e72d3d36bb4202c7da062eea5a94e247647c6066ed6cd6f743"},"name":"My workflow 3","tags":[],"nodes":[{"id":"2298912a-0c4b-4d29-adab-ea744dcf8e6c","name":"Prepare Search Parameters","type":"n8n-nodes-base.set","position":[1500,280],"parameters":{"options":{},"assignments":{"assignments":[{"id":"e17f3c0e-aaa0-406e-a88b-c71da9b3043d","name":"start_index","type":"number","value":1},{"id":"57148c16-323e-4ef0-88f2-e3c9603907e0","name":"MaxPages","type":"number","value":"={{ $json.Maxresults }}"},{"id":"4954325e-7508-40df-96ab-2541ab82a11a","name":"Position","type":"string","value":"={{ $json.Position }}"},{"id":"52b9ac6d-3c37-4ffc-842b-fe3aaaa202b3","name":"Industry","type":"string","value":"={{ $json.Industry }}"},{"id":"096d13b7-53bb-4f04-8c1b-0d6ce773a515","name":"Region","type":"string","value":"={{ $json.Location }}"},{"id":"ae918172-114a-4d09-b71a-14dce5715b73","name":"IndianKeyword","type":"string","value":"={{ $json['Indian Keyword'] }}"}]}},"typeVersion":3.4},{"id":"fbedd9dc-fb2d-40a5-8103-e9e3c744586d","name":"Google Custom Search API","type":"n8n-nodes-base.httpRequest","position":[900,640],"parameters":{"url":"https://www.googleapis.com/customsearch/v1","options":{},"sendQuery":true,"authentication":"genericCredentialType","genericAuthType":"httpQueryAuth","queryParameters":{"parameters":[{"name":"q","value":"={{ $node['Prepare Search Parameters'].json.Position }} {{ $node['Prepare Search Parameters'].json.Industry }} site:linkedin.com/in"},{"name":"start","value":"={{ $runIndex == 0 ? $('Prepare Search Parameters').item.json.start_index : $('Clean Search Results').item.json.nextPageStartIndex}}"},{"name":"cx","value":"839bb5f56024e4ef5"}]}},"credentials":{"httpQueryAuth":{"id":"9hmD5HuqDDGusrxX","name":"Google Query Auth"},"httpCustomAuth":{"id":"KW4CxrRNOOCs6LmK","name":"Google Custom Search"},"httpHeaderAuth":{"id":"Yd118GvwDLKCBP3V","name":"Google Header Search"}},"typeVersion":4.2},{"id":"a30fbcb1-ee95-4629-9d5f-a75532be844e","name":"Parse LinkedIn Profiles","type":"n8n-nodes-base.code","position":[1200,640],"parameters":{"jsCode":"const results = [];\n\nfor (const input of $input.all()) {\n  const response = input.json;\n  const itemsArray = response.items || [];\n  const searchTerms = response.queries?.request?.[0]?.searchTerms || null;\n  const nextPageStartIndex = response.queries?.nextPage?.[0]?.startIndex || null;\n\n  for (const item of itemsArray) {\n    const metatags = item?.pagemap?.metatags?.[0] || {};\n    results.push({\n      json: {\n        title: item.title || null,\n        link: item.link || null,\n        searchTerms: searchTerms,\n        nextPageStartIndex: nextPageStartIndex,\n        snippet: item.snippet || null,\n        ogDescription: metatags[\"og:description\"] || null,\n        twitterImage: metatags[\"twitter:image\"] || null\n      }\n    });\n  }\n}\n\nreturn results;"},"typeVersion":2},{"id":"1cce64f7-1875-4ea1-97f9-608942b7185e","name":"Clean Search Results","type":"n8n-nodes-base.set","position":[1480,640],"parameters":{"options":{},"assignments":{"assignments":[{"id":"01199a01-b14a-4dcf-9725-bc9a1f9f8ade","name":"Title","type":"string","value":"={{ $json.title }}"},{"id":"641266d0-7325-417a-8dbd-6b9147b6caeb","name":"URL","type":"string","value":"={{ $json.link }}"},{"id":"878fb57e-cd4c-4ed4-aa37-1b172fc5216d","name":"Search","type":"string","value":"={{ $json.searchTerms }}"},{"id":"80f24267-3449-4dbf-8cfb-5932d62b013c","name":"Snippet","type":"string","value":"={{ $json.snippet }}"},{"id":"d5bdea17-1b9c-4fb6-ad4e-f24049ac234f","name":"Description","type":"string","value":"={{ $json.ogDescription }}"},{"id":"8dd30e05-0beb-4ec5-bff7-e2414d659532","name":"nextPageStartIndex","type":"number","value":"={{ $json.nextPageStartIndex }}"}]}},"typeVersion":3.4},{"id":"2e7d9c6d-4338-4b3b-b84f-5548ca13d272","name":"Save to Airtable","type":"n8n-nodes-base.airtable","position":[1740,640],"parameters":{"base":{"__rl":true,"mode":"list","value":"appwXYS4iHyBt84oE","cachedResultUrl":"https://airtable.com/appwXYS4iHyBt84oE","cachedResultName":"n8n Base"},"table":{"__rl":true,"mode":"list","value":"tblaqQMs7pDPtkjee","cachedResultUrl":"https://airtable.com/appwXYS4iHyBt84oE/tblaqQMs7pDPtkjee","cachedResultName":"LinkedIn Prospects"},"columns":{"value":{"Title":"={{ $json.Title }}","Search":"={{ $json.Search }}","Snippet":"={{ $json.Snippet }}","Description":"={{ $json.Description }}","linkedin_url":"={{ $json.URL }}"},"schema":[{"id":"Title","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"Title","defaultMatch":false,"canBeUsedToMatch":true},{"id":"linkedin_url","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"linkedin_url","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Search","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"Search","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Description","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"Description","defaultMatch":false,"canBeUsedToMatch":true},{"id":"Snippet","type":"string","display":true,"removed":false,"readOnly":false,"required":false,"displayName":"Snippet","defaultMatch":false,"canBeUsedToMatch":true}],"mappingMode":"defineBelow","matchingColumns":["linkedin_url"],"attemptToConvertTypes":false,"convertFieldsToString":false},"options":{},"operation":"upsert"},"credentials":{"airtableTokenApi":{"id":"mAzozYUk4HSPBXsi","name":"Airtable Personal Access Token account"}},"typeVersion":2.1},{"id":"ff878d7b-99e1-4b9b-9e5d-b44452f48b39","name":"When clicking 'Test workflow'","type":"n8n-nodes-base.manualTrigger","position":[120,280],"parameters":{},"typeVersion":1},{"id":"0df3c92d-ef34-4f24-bfac-f3ae838c87d2","name":"Configure Search Settings","type":"n8n-nodes-base.set","position":[1220,280],"parameters":{"options":{},"assignments":{"assignments":[{"id":"64c94773-eea2-4013-9718-c9ef5e29ff7c","name":"Position","type":"string","value":"={{ $json.keywords_string }}"},{"id":"89220317-aced-4cfb-8900-841ee0f70a68","name":"Industry","type":"string","value":""},{"id":"10e66f39-dd61-4a48-b500-18f5854d39ba","name":"Location","type":"string","value":""},{"id":"428c29b2-17fb-44e5-aeb5-87b30400b591","name":"Maxresults","type":"number","value":30},{"id":"f610c45f-cf2f-490e-a7e7-53009edf9f87","name":"Indian Keyword","type":"string","value":""}]}},"typeVersion":3.4},{"id":"54aa747d-77f1-4403-9af7-dab57b251b18","name":"Check Pagination","type":"n8n-nodes-base.switch","position":[2060,640],"parameters":{"rules":{"values":[{"outputKey":"Continue Searching","conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"26e85b9b-dfa1-4e00-9ee1-56b912a3b8cd","operator":{"type":"number","operation":"lt"},"leftValue":"={{ parseInt($('Clean Search Results').item.json.nextPageStartIndex) }}","rightValue":"={{ $node['Configure Search Settings'].json.Maxresults}}"}]},"renameOutput":true},{"outputKey":"Search Complete","conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"strict"},"combinator":"and","conditions":[{"id":"8ee350ce-2838-4daa-a6b7-816de8b8c0d4","operator":{"type":"number","operation":"gte"},"leftValue":"={{ parseInt($('Clean Search Results').item.json.nextPageStartIndex) }}","rightValue":"={{ $node['Configure Search Settings'].json.Maxresults}}"}]},"renameOutput":true}]},"options":{}},"executeOnce":true,"typeVersion":3.2},{"id":"c40c7226-0d9c-4b5f-b849-ce9fae847407","name":"Rate Limit Delay","type":"n8n-nodes-base.wait","position":[2400,620],"webhookId":"23f72108-6cd7-4dc3-a81b-16bdae1fa0b5","parameters":{"amount":2},"typeVersion":1.1},{"id":"5beda166-e0aa-4080-8434-963f3eb052f1","name":"Loop Over Items","type":"n8n-nodes-base.splitInBatches","position":[820,280],"parameters":{"options":{}},"typeVersion":3},{"id":"63b32072-13fe-4c06-9a95-fe2efb861128","name":"Workflow Overview","type":"n8n-nodes-base.stickyNote","position":[0,-220],"parameters":{"color":4,"width":2720,"height":480,"content":"## 🔍 LinkedIn Prospect Finder with Google Search\n\n**Find and collect LinkedIn professional profiles based on keywords, job titles, and industries**\n\n### Quick Setup Required:\n1. **Google Custom Search API** - Get your API key and Search Engine ID\n2. **Airtable Account** - Create a base with the required fields\n3. **Keywords** - Define your search terms in the yellow box below\n\n### What this workflow does:\n- Searches LinkedIn profiles using Google Custom Search\n- Extracts profile information and descriptions\n- Stores results in Airtable with deduplication\n- Handles pagination automatically\n- Includes rate limiting to respect API limits"},"typeVersion":1},{"id":"ea0f16a3-41f4-4567-b788-b74558817915","name":"⚙️ CUSTOMIZE YOUR SEARCH KEYWORDS HERE","type":"n8n-nodes-base.set","position":[480,280],"parameters":{"options":{},"assignments":{"assignments":[{"id":"c0e68cbc-6e8d-40d7-85d5-ddb60af1389a","name":"keywords_string","type":"string","value":"Store Manager Retail London"}]}},"typeVersion":3.4},{"id":"6c7c6e49-3d78-42af-ae91-25acd9158fce","name":"Search Configuration Guide","type":"n8n-nodes-base.stickyNote","position":[0,480],"parameters":{"color":7,"width":760,"height":300,"content":"## 🎯 Search Configuration\n\n**Modify the keywords in the yellow node to target specific professionals:**\n\nExamples:\n- \"Marketing Manager SaaS\"\n- \"Data Scientist Healthcare\"\n- \"Sales Director Enterprise Software\"\n- \"HR Manager Remote\"\n\nThe workflow will search for LinkedIn profiles matching your criteria."},"typeVersion":1},{"id":"60bed7a2-6b9d-4d81-93bb-d07070869360","name":"Google Search Process","type":"n8n-nodes-base.stickyNote","position":[620,860],"parameters":{"color":5,"width":780,"height":300,"content":"## 🔍 Google Search Engine\n\n**Uses Google Custom Search API to find LinkedIn profiles**\n\nThe search query combines:\n- Your keywords (job title, industry, location)\n- LinkedIn site restriction (site:linkedin.com/in)\n- Pagination handling for multiple results\n\nAPI calls are rate-limited to avoid quota issues."},"typeVersion":1},{"id":"1d89f94f-9dc0-43d6-995a-b285438364ee","name":"Airtable Storage","type":"n8n-nodes-base.stickyNote","position":[1400,860],"parameters":{"width":1200,"height":300,"content":"## 📊 Data Storage\n\n**Saves LinkedIn prospect data to Airtable**\n\nStored fields:\n- **Title**: LinkedIn profile headline\n- **linkedin_url**: Direct profile URL\n- **Search**: Original search terms used\n- **Description**: Profile summary/description\n- **Snippet**: Search result snippet\n\nDeduplication prevents storing the same profile twice."},"typeVersion":1}],"active":false,"pinData":{},"settings":{"executionOrder":"v1"},"versionId":"e5c86953-c7a2-466b-948a-ebabada3b069","connections":{"Loop Over Items":{"main":[[],[{"node":"Configure Search Settings","type":"main","index":0}]]},"Check Pagination":{"main":[[{"node":"Rate Limit Delay","type":"main","index":0}],[{"node":"Loop Over Items","type":"main","index":0}]]},"Rate Limit Delay":{"main":[[{"node":"Google Custom Search API","type":"main","index":0}]]},"Save to Airtable":{"main":[[{"node":"Check Pagination","type":"main","index":0}]]},"Clean Search Results":{"main":[[{"node":"Save to Airtable","type":"main","index":0}]]},"Parse LinkedIn Profiles":{"main":[[{"node":"Clean Search Results","type":"main","index":0}]]},"Google Custom Search API":{"main":[[{"node":"Parse LinkedIn Profiles","type":"main","index":0}]]},"Configure Search Settings":{"main":[[{"node":"Prepare Search Parameters","type":"main","index":0}]]},"Prepare Search Parameters":{"main":[[{"node":"Google Custom Search API","type":"main","index":0}]]},"When clicking 'Test workflow'":{"main":[[{"node":"⚙️ CUSTOMIZE YOUR SEARCH KEYWORDS HERE","type":"main","index":0}]]},"⚙️ CUSTOMIZE YOUR SEARCH KEYWORDS HERE":{"main":[[{"node":"Loop Over Items","type":"main","index":0}]]}}}


name: AI YouTube Trend Explorer – n8n Automation Workflow with Gemini/ChatGPT
author_name: Agent Circle
author_username: agentcircle
nodes_used: ["n8n-nodes-base.httpRequest","n8n-nodes-base.youTube","n8n-nodes-base.code"]
categories: []
created_at: 2025-06-25T10:11:45.389Z
updated_at: 2025-06-25T10:11:45.389Z
url: https://n8n.io/workflows/5296
scraped_at: 2025-07-06 21:16:30
description:
  What The AI YouTube Trend Explorer Workflow Does
  Finds real YouTube trends based on niche keywords
  Analyzes engagement (views, likes) to surface top-performing content
  Uses AI to suggest more specific niches if your keyword is too broad
  Returns links to top videos and the channels posting them
  Helps you craft content around what’s working right now

  Workflow Setup

  Download the Workflow
  Get both workflows from the site:
  YouTube – Trend Explorer
  Sub – YouTube Search
  Import to Your n8n
  Update API Credentials
  Google API Key (Node: HTTP - Find Video Data in WorkflowSub - YouTube Search)
  ChatGPT API Key (Node: YouTube – Trend Explorer in WorkflowYouTube – Trend Explorer)
  Link Sub-Workflow
  Connect sub workflowSub – YouTube Search to the main workflow YouTube – Trend Explorer and you’re live.

  How to Use
  Open chat in the workflow
  Input a niche or keyword (e.g., celebrity facts)
  If the niche is broad, the AI will recommend specific subtopics
  Send and receive structured output with:
  Trending content categories
  Video & channel links
  Views & like stats
  Niche-specific content advice

  Who Should Use This
  YouTubers hunting for viral video ideas
  SEO-driven content creators optimizing for search & trends
  Agencies scaling research for multiple niches
  Solopreneurs who want a shortcut to what’s working

  Example Output

  For the niche "Celebrity facts"

  Over the past two days, the celebrity niche has seen trending content in two major categories:

  Celebrity Scandals and Legal
  Issues: Videos focusing on celebrities facing legal troubles, shocking crimes, and controversies are performing well.
  Examples include videos about celebrities in jail, Meghan Markle's alleged connections, and Diddy's legal battles.
  Engagement: These videos range from 3.9K to 39K views, with like counts between 80 and 1500, indicating a strong interest in the darker side of celebrity life.
  Channel example:
  	Video: https://www.youtube.com/watch?v=O8Ymrfd8mAo
  	Channel: https://www.youtube.com/channel/UC1y5DFVNQD24atzH7RZiXIA

  Hollywood's "Golden Age" Dark Side: Content exploring the hidden, more dangerous aspects of classic Hollywood actors and actresses also resonates with viewers.
  These videos often reveal out-of-control behavior and scandals of iconic figures.
  Engagement: Videos in this category see views around 8K, suggesting a specific interest in historical Hollywood controversies.
  Channel example:
  	Video: https://www.youtube.com/watch?v=DnkUJjLYkco
  	Channel: https://www.youtube.com/channel/UCY8yuf9NjWW97vbI5mawikw

  Creators can leverage these trends by:
  Creating content that exposes celebrity scandals and controversies
  Focusing on the legal troubles and shocking crimes of celebrities
  Creating content that uncovers the dark side of Hollywood's "Golden Age"
  Exploring historical insights and cultural legends behind the fame

  Ready to Explore?

  ✅ Download Now
  💬 Need help or want to customize your workflow?
  👉 Join Our Discord Community https://discord.gg/d8SkCzKwnP for help with setup, optimization tips, and AI workflow discussions — or visit our website at www.agentcircle.ai to explore more tools.

workflow_json:
  {"id":"IktojxaOHrdHkURm","meta":{"instanceId":"ed6d846a2fce1f660ede2e7da800724cca01dc3d0685524a3c917881b7cfcfe9","templateCredsSetupCompleted":true},"name":"Sub - Youtube Search","tags":[{"id":"CEVEeZJa4qgPvdpK","name":"youtube","createdAt":"2025-05-27T02:29:43.874Z","updatedAt":"2025-05-27T02:29:43.874Z"}],"nodes":[{"id":"5d4d8d36-8f39-4e3c-9527-9d5604e58adc","name":"When Executed by Another Workflow","type":"n8n-nodes-base.executeWorkflowTrigger","position":[-660,280],"parameters":{"inputSource":"passthrough"},"typeVersion":1.1},{"id":"09b1a19d-4fb3-4d78-a41b-90da9ab49409","name":"Youtube - Get Video","type":"n8n-nodes-base.youTube","position":[-440,280],"parameters":{"limit":3,"filters":{"q":"={{ $json.query.search_term }}","regionCode":"US","publishedAfter":"={{ new Date(Date.now() - 2 * 24 * 60 * 60 * 1000).toISOString() }}"},"options":{"order":"relevance","safeSearch":"moderate"},"resource":"video"},"credentials":{"youTubeOAuth2Api":{"id":"KhD0GLQGWl8MtqCs","name":"YouTube - toan.ngo"}},"typeVersion":1},{"id":"d166a037-d601-438d-b493-c443ab552b40","name":"Loop Over Items","type":"n8n-nodes-base.splitInBatches","position":[-220,280],"parameters":{"options":{}},"typeVersion":3},{"id":"803e7b42-8dd4-48f6-a3c6-247d8235faa7","name":"HTTP - Find Video Data","type":"n8n-nodes-base.httpRequest","position":[0,200],"parameters":{"url":"https://www.googleapis.com/youtube/v3/videos?","options":{},"sendQuery":true,"authentication":"predefinedCredentialType","queryParameters":{"parameters":[{"name":"id","value":"={{ $json.id.videoId }}"},{"name":"part","value":"contentDetails,snippet,statistics"}]},"nodeCredentialType":"youTubeOAuth2Api"},"credentials":{"youTubeOAuth2Api":{"id":"KhD0GLQGWl8MtqCs","name":"YouTube - toan.ngo"}},"typeVersion":4.2},{"id":"771aebee-d468-4352-ad25-7d13b09836b8","name":"Code - Retrieve Data From Memory","type":"n8n-nodes-base.code","position":[0,0],"parameters":{"jsCode":"const workflowStaticData = $getWorkflowStaticData('global');\n\nconst lastExecution = workflowStaticData.lastExecution;\n\nreturn lastExecution;"},"typeVersion":2,"alwaysOutputData":false},{"id":"c1afc8ff-6c26-433b-8b2c-6debda964ae1","name":"Field - Response","type":"n8n-nodes-base.set","position":[220,0],"parameters":{"options":{},"assignments":{"assignments":[{"id":"b9b9117b-ea14-482e-a13b-e68b8e6b441d","name":"response","type":"string","value":"={{ $input.all() }}"}]}},"typeVersion":3.4},{"id":"fd80746e-6a72-46e3-aefc-d7404cd3b50a","name":"If - Longer Than 3","type":"n8n-nodes-base.if","position":[220,280],"parameters":{"options":{},"conditions":{"options":{"version":2,"leftValue":"","caseSensitive":true,"typeValidation":"loose"},"combinator":"and","conditions":[{"id":"08ba3db9-6bcf-47f8-a74d-9e26f28cb08f","operator":{"type":"boolean","operation":"true","singleValue":true},"leftValue":"={{ \n  (() => {\n    const duration = $json.items[0].contentDetails.duration;\n\n    // Helper function to convert ISO 8601 duration to seconds\n    const iso8601ToSeconds = iso8601 => {\n      const match = iso8601.match(/PT(?:(\\d+)H)?(?:(\\d+)M)?(?:(\\d+)S)?/);\n      const hours = parseInt(match[1] || 0, 10);\n      const minutes = parseInt(match[2] || 0, 10);\n      const seconds = parseInt(match[3] || 0, 10);\n      return hours * 3600 + minutes * 60 + seconds;\n    };\n\n    // Convert duration to seconds\n    const durationInSeconds = iso8601ToSeconds(duration);\n\n    // Check if greater than 210 seconds (3 minutes 30 seconds)\n    return durationInSeconds > 210;\n  })() \n}}","rightValue":""}]},"looseTypeValidation":true},"typeVersion":2.2},{"id":"bd86dca7-fdcc-4722-9247-1d5d5f16bb86","name":"Field - Group Data","type":"n8n-nodes-base.set","position":[440,280],"parameters":{"options":{},"assignments":{"assignments":[{"id":"47c172ad-90c8-4cf6-a9f5-50607e04cc90","name":"id","type":"string","value":"={{ $json.items[0].id }}"},{"id":"9e639efa-0714-4b06-9847-f7b4b2fbef59","name":"viewCount","type":"string","value":"={{ $json.items[0].statistics.viewCount }}"},{"id":"93328f00-91b8-425b-ad0f-a330b2f95242","name":"likeCount","type":"string","value":"={{ $json.items[0].statistics.likeCount }}"},{"id":"015b0fb2-2a98-464c-a21b-51100616f26a","name":"commentCount","type":"string","value":"={{ $json.items[0].statistics.commentCount }}"},{"id":"cf1e1ec3-a138-42b8-8747-d249afa58dd3","name":"description","type":"string","value":"={{ $json.items[0].snippet.description }}"},{"id":"c5c9a3a2-b820-4932-a38a-e21102992215","name":"title","type":"string","value":"={{ $json.items[0].snippet.title }}"},{"id":"38216ead-1f8d-4f93-b6ad-5ef709a1ad2a","name":"channelTitle","type":"string","value":"={{ $json.items[0].snippet.channelTitle }}"},{"id":"ff34194d-3d46-43a8-9127-84708987f536","name":"tags","type":"string","value":"={{ $json.items[0].snippet.tags.join(', ') }}"},{"id":"e50b0f7b-3e37-4557-8863-d68d4fa505c8","name":"channelId","type":"string","value":"={{ $json.items[0].snippet.channelId }}"}]}},"typeVersion":3.4},{"id":"f9326f4d-16e5-4078-9273-7ee3fb1c70a3","name":"Code - Save Data To Memory","type":"n8n-nodes-base.code","position":[660,360],"parameters":{"mode":"runOnceForEachItem","jsCode":"const workflowStaticData = $getWorkflowStaticData('global');\n\nif (!workflowStaticData.lastExecution || typeof workflowStaticData.lastExecution.response !== 'string') {\n  workflowStaticData.lastExecution = { response: '' };\n}\n\nconst regexes = [\n  { pattern: /https?:\\/\\/\\S+|www\\.\\S+/g, replace: '' },\n  { pattern: /[\\u{1F600}-\\u{1F64F}\\u{1F300}-\\u{1F5FF}\\u{1F680}-\\u{1F6FF}\\u{2600}-\\u{26FF}\\u{2700}-\\u{27BF}]/gu, replace: '' },\n  { pattern: /[\\r\\n\\\\]+/g, replace: ' ' },\n  { pattern: / {2,}/g, replace: ' ' } \n];\n\nfunction sanitize(text) {\n  return regexes.reduce((str, { pattern, replace }) => str.replace(pattern, replace), text).trim();\n}\n\nconst item = { ...$input.item };\nif (item.description) {\n  item.description = sanitize(item.description);\n}\n\nconst sanitizedItem = sanitize(JSON.stringify(item));\n\nif (workflowStaticData.lastExecution.response) {\n  workflowStaticData.lastExecution.response += ' ### NEXT VIDEO FOUND: ### ';\n}\nworkflowStaticData.lastExecution.response += sanitizedItem;\n\nreturn workflowStaticData.lastExecution;"},"typeVersion":2},{"id":"49187d4e-5258-48a2-ae9a-fe82a82b75b9","name":"Sticky Note","type":"n8n-nodes-base.stickyNote","position":[-900,-140],"parameters":{"width":580,"height":260,"content":"## Sub - Youtube Search\nWebsite\thttps://www.agentcircle.ai/\nDiscord Global\thttps://discord.com/invite/jySQ2PNm\nFB Page Global\thttps://www.facebook.com/agentcircle/\nFB Group Global\thttps://www.facebook.com/groups/aiagentcircle/\nGumroad\thttp://agentcircle.gumroad.com/\nX\thttps://x.com/agent_circle\nYouTube\thttps://www.youtube.com/@agentcircle\nLinkedin\thttps://www.linkedin.com/company/agentcircle"},"typeVersion":1}],"active":false,"pinData":{"When Executed by Another Workflow":[{"json":{"query":{"search_term":"cat games gameplay"}}}]},"settings":{"executionOrder":"v1"},"versionId":"252a4d1e-eb32-4f40-b61a-c80ba62d1d57","connections":{"Loop Over Items":{"main":[[{"node":"Code - Retrieve Data From Memory","type":"main","index":0}],[{"node":"HTTP - Find Video Data","type":"main","index":0}]]},"Field - Group Data":{"main":[[{"node":"Code - Save Data To Memory","type":"main","index":0}]]},"If - Longer Than 3":{"main":[[{"node":"Field - Group Data","type":"main","index":0}],[{"node":"Loop Over Items","type":"main","index":0}]]},"Youtube - Get Video":{"main":[[{"node":"Loop Over Items","type":"main","index":0}]]},"HTTP - Find Video Data":{"main":[[{"node":"If - Longer Than 3","type":"main","index":0}]]},"Code - Save Data To Memory":{"main":[[{"node":"Loop Over Items","type":"main","index":0}]]},"Code - Retrieve Data From Memory":{"main":[[{"node":"Field - Response","type":"main","index":0}]]},"When Executed by Another Workflow":{"main":[[{"node":"Youtube - Get Video","type":"main","index":0}]]}}}


