<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: KrisYing</title>
    <description>The latest articles on Forem by KrisYing (@krisying).</description>
    <link>https://forem.com/krisying</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3818934%2Ff29f22ed-87db-43b7-b472-1bd157207242.png</url>
      <title>Forem: KrisYing</title>
      <link>https://forem.com/krisying</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/krisying"/>
    <language>en</language>
    <item>
      <title>My Claude Code Buddy Moved Into My MacBook's Notch and I Can't Stop Looking at It</title>
      <dc:creator>KrisYing</dc:creator>
      <pubDate>Sun, 05 Apr 2026 05:13:26 +0000</pubDate>
      <link>https://forem.com/krisying/my-claude-code-buddy-moved-into-my-macbooks-notch-and-i-cant-stop-looking-at-it-3d6e</link>
      <guid>https://forem.com/krisying/my-claude-code-buddy-moved-into-my-macbooks-notch-and-i-cant-stop-looking-at-it-3d6e</guid>
      <description>&lt;p&gt;I'm literally losing productivity because I keep expanding my MacBook's notch to check on my AI buddy.&lt;/p&gt;

&lt;p&gt;Let me explain.&lt;/p&gt;

&lt;h2&gt;
  
  
  It Started With a Problem
&lt;/h2&gt;

&lt;p&gt;I run 5-8 Claude Code sessions simultaneously. Different projects, different terminals, total chaos. I was Alt-Tabbing like a maniac, missing permission requests, forgetting which session finished.&lt;/p&gt;

&lt;p&gt;Then I built &lt;strong&gt;CodeIsland&lt;/strong&gt; and everything changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wait, Your Notch Does WHAT?
&lt;/h2&gt;

&lt;p&gt;Yes. The MacBook notch. That ugly camera cutout everyone complained about. It's now the most useful part of my screen.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fxmqywx%2FCodeIsland%2Fmain%2Fdocs%2Fscreenshots%2F01-workspace.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fxmqywx%2FCodeIsland%2Fmain%2Fdocs%2Fscreenshots%2F01-workspace.png" alt="Full workspace" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;This is my actual workflow. 8 Claude Code sessions. Zero Alt-Tab.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;See that tiny green dot and pixel cat at the top? That's CodeIsland. It sits in the notch, watching all my Claude sessions. When I hover over it, it expands into a full control panel:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbawjcb0s44yx81l7u03t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbawjcb0s44yx81l7u03t.png" alt="Session list" width="800" height="452"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Every session at a glance. Color-coded terminals. Usage stats. And yes, that's my buddy in the corner.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Buddy Thing Hit Different
&lt;/h2&gt;

&lt;p&gt;Ok here's where it gets ridiculous. You know Claude Code's &lt;code&gt;/buddy&lt;/code&gt; feature? The little ASCII companion that grows with your usage?&lt;/p&gt;

&lt;p&gt;Mine is a &lt;strong&gt;Legendary Octopus&lt;/strong&gt; named Kris. PATIENCE stat maxed at 100. Look at this absolute unit:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fayyzigv70o5y5hpvlbv7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fayyzigv70o5y5hpvlbv7.png" alt="Buddy card" width="800" height="388"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;★★★★★ LEGENDARY. I didn't choose the octopus life.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;CodeIsland computes your buddy's stats using the &lt;strong&gt;exact same algorithm&lt;/strong&gt; as Claude Code (Bun.hash + Mulberry32). Same species, same rarity, same stats. It even detects if you've patched your install with any-buddy.&lt;/p&gt;

&lt;p&gt;The buddy floats in the bottom-right corner of the panel, doing idle animations. I catch myself just... watching it. This is a problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  But Actually It's Insanely Useful
&lt;/h2&gt;

&lt;p&gt;Ok let me be serious for a second. Here's what blew my mind:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. It Knows Which Terminal Tab I'm Looking At
&lt;/h3&gt;

&lt;p&gt;When a Claude session finishes, CodeIsland checks: "Is the user already looking at this session's terminal?" If yes, it doesn't popup. If you're in a different tab, it alerts you.&lt;/p&gt;

&lt;p&gt;This works at the &lt;strong&gt;workspace level&lt;/strong&gt; in cmux, &lt;strong&gt;session level&lt;/strong&gt; in iTerm2, and &lt;strong&gt;window level&lt;/strong&gt; in Ghostty. No more "I KNOW, I'M LOOKING AT IT" moments.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. I Answer Claude's Questions From the Notch
&lt;/h3&gt;

&lt;p&gt;When Claude uses AskUserQuestion, the options appear as buttons right in the notch panel. I click "Option A" and it sends the answer directly to my terminal via &lt;code&gt;cmux send&lt;/code&gt;. I don't even switch windows.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Usage Stats From the OAuth API
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ti8xk7cjnqm79mny34x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ti8xk7cjnqm79mny34x.png" alt="Usage" width="388" height="62"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;See that? 5h window at 22%, 7d at 30%. CodeIsland reads your OAuth token from macOS Keychain and calls Anthropic's API directly. Zero config. I always know how much headroom I have.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Code Diffs in the Chat View
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fin7vmiji6lkoj2r8hd0e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fin7vmiji6lkoj2r8hd0e.png" alt="Chat view" width="800" height="765"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Full conversation history with code diffs, tool calls, and status indicators&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Click any session to see the full conversation. Green lines for additions, red for deletions. "Go to Terminal" button at the bottom.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup Takes 30 Seconds
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Download from &lt;a href="https://github.com/xmqywx/CodeIsland/releases" rel="noopener noreferrer"&gt;GitHub Releases&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Drag to Applications&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;sudo xattr -rd com.apple.quarantine /Applications/Code\ Island.app&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Launch. Done.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It auto-installs hooks into your Claude Code config. Zero config needed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8c41jguc0gpdsg9w05gn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8c41jguc0gpdsg9w05gn.png" alt="Settings" width="800" height="756"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Compact settings with everything you need&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;p&gt;For the nerds:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pure &lt;strong&gt;Swift + SwiftUI&lt;/strong&gt;, native macOS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unix socket&lt;/strong&gt; for real-time hook events&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic OAuth API&lt;/strong&gt; for usage stats&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AppleScript&lt;/strong&gt; for terminal detection (cmux/iTerm2/Ghostty/Terminal.app)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;macOS Keychain&lt;/strong&gt; for zero-config auth&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  It's Free. Like, Actually Free.
&lt;/h2&gt;

&lt;p&gt;No subscription. No telemetry. No commercial intentions. Just a passion project by someone who got tired of Alt-Tabbing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/xmqywx/CodeIsland" rel="noopener noreferrer"&gt;github.com/xmqywx/CodeIsland&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Works best with &lt;a href="https://cmux.io" rel="noopener noreferrer"&gt;cmux&lt;/a&gt; (modern terminal multiplexer on Ghostty), but supports iTerm2, Ghostty, Terminal.app, Warp, VS Code, Cursor, and more.&lt;/p&gt;

&lt;p&gt;If you try it, let me know what you think. And if you star the repo... my octopus buddy thanks you. 🐙&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Yes, this post was written while CodeIsland was monitoring 3 Claude Code sessions in my notch. No sessions were harmed in the making of this article.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>macos</category>
      <category>showdev</category>
    </item>
    <item>
      <title>I Turned My MacBook's Notch Into a Control Center for AI Coding Agents</title>
      <dc:creator>KrisYing</dc:creator>
      <pubDate>Sun, 05 Apr 2026 05:09:38 +0000</pubDate>
      <link>https://forem.com/krisying/i-turned-my-macbooks-notch-into-a-control-center-for-ai-coding-agents-2o57</link>
      <guid>https://forem.com/krisying/i-turned-my-macbooks-notch-into-a-control-center-for-ai-coding-agents-2o57</guid>
      <description>&lt;p&gt;Every developer using Claude Code knows the pain: you have 5+ terminal sessions running, Claude is asking for permission in one tab, waiting for input in another, and you're buried in a third. You Alt-Tab frantically, lose context, and waste time.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;CodeIsland&lt;/strong&gt; — a free, open-source macOS app that turns your MacBook's notch (Dynamic Island) into a real-time dashboard for all your AI coding agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;When you're running multiple Claude Code sessions across different projects, there's no way to see everything at a glance. You're constantly switching between terminals to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check which session finished&lt;/li&gt;
&lt;li&gt;Approve permission requests&lt;/li&gt;
&lt;li&gt;Answer Claude's questions&lt;/li&gt;
&lt;li&gt;Monitor usage limits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fxmqywx%2FCodeIsland%2Fmain%2Fdocs%2Fscreenshots%2F01-workspace.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fxmqywx%2FCodeIsland%2Fmain%2Fdocs%2Fscreenshots%2F01-workspace.png" alt="Full workspace with CodeIsland" width="800" height="450"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Multiple Claude Code sessions in cmux, with CodeIsland monitoring everything from the notch&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The Solution: Your Notch, Supercharged
&lt;/h2&gt;

&lt;p&gt;CodeIsland lives in your MacBook's notch. When collapsed, it shows a tiny status indicator. When expanded, it becomes a full control panel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbawjcb0s44yx81l7u03t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbawjcb0s44yx81l7u03t.png" alt="Session list with usage stats" width="800" height="452"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Session list showing active projects, terminal tags, usage stats, and your Claude Code buddy&lt;/em&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  What You Can Do From the Notch
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Monitor All Sessions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Every Claude Code session appears in a clean list with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Color-coded terminal tags (cmux blue, Ghostty purple, iTerm green)&lt;/li&gt;
&lt;li&gt;Active sessions highlighted with accent backgrounds&lt;/li&gt;
&lt;li&gt;Real-time tool tracking and subagent status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Claude Usage Monitoring&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Real-time 5h/7d usage percentage pulled directly from Anthropic's OAuth API. No plugins needed — reads your token from macOS Keychain.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ti8xk7cjnqm79mny34x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ti8xk7cjnqm79mny34x.png" alt="Usage stats bar" width="388" height="62"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;5h 22% and 7d 30% usage with progress bars and reset timers&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Chat History &amp;amp; Code Diffs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Click any session to see the full conversation, including tool calls with status indicators and code diffs with green/red highlighting.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fin7vmiji6lkoj2r8hd0e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fin7vmiji6lkoj2r8hd0e.png" alt="Chat detail view" width="800" height="765"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Full conversation view with tool calls, code edits, and "Go to Terminal" button&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Meet Your Buddy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Full integration with Claude Code's &lt;code&gt;/buddy&lt;/code&gt; system. See your companion's species, rarity, stats, and personality.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fayyzigv70o5y5hpvlbv7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fayyzigv70o5y5hpvlbv7.png" alt="Buddy card" width="800" height="388"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Legendary Octopus "Kris" with full ASCII art and stat bars&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Smart Settings&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Compact two-column layout with everything you need.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8c41jguc0gpdsg9w05gn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8c41jguc0gpdsg9w05gn.png" alt="Settings page" width="800" height="756"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Clean settings with Star &amp;amp; Feedback buttons — v1.8.0&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Smart Features That Matter
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Smart Popup Suppression
&lt;/h3&gt;

&lt;p&gt;The most annoying thing about notification apps? They interrupt you when you're already looking at the thing they're notifying about.&lt;/p&gt;

&lt;p&gt;CodeIsland detects &lt;strong&gt;which terminal tab you're currently viewing&lt;/strong&gt;. If a Claude session finishes in a cmux workspace you're already looking at, it won't popup. It only alerts you about sessions you can't see.&lt;/p&gt;

&lt;p&gt;Supported: cmux (workspace-level), iTerm2 (session-level), Ghostty (window-level), Terminal.app (tab-level).&lt;/p&gt;
&lt;h3&gt;
  
  
  AskUserQuestion Quick Reply
&lt;/h3&gt;

&lt;p&gt;When Claude asks you a multiple-choice question, the options appear as buttons directly in the notch. Click one, and the answer is sent to your terminal automatically via &lt;code&gt;cmux send&lt;/code&gt; — no window switching needed.&lt;/p&gt;
&lt;h3&gt;
  
  
  One-Click Terminal Jump
&lt;/h3&gt;

&lt;p&gt;Every session has a green terminal button. Click it, and CodeIsland finds the exact cmux workspace (or iTerm tab, or Ghostty window) and brings it to front.&lt;/p&gt;
&lt;h3&gt;
  
  
  Subagent Tracking
&lt;/h3&gt;

&lt;p&gt;When Claude spawns subagents, you see them in real-time with ⚡ badges and collapsible detail views showing each agent's task.&lt;/p&gt;
&lt;h2&gt;
  
  
  Terminal Support
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Terminal&lt;/th&gt;
&lt;th&gt;Detection&lt;/th&gt;
&lt;th&gt;Jump&lt;/th&gt;
&lt;th&gt;Quick Reply&lt;/th&gt;
&lt;th&gt;Smart Suppression&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;cmux&lt;/td&gt;
&lt;td&gt;Auto&lt;/td&gt;
&lt;td&gt;Workspace-level&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Workspace-level&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;iTerm2&lt;/td&gt;
&lt;td&gt;Auto&lt;/td&gt;
&lt;td&gt;AppleScript&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Session-level&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ghostty&lt;/td&gt;
&lt;td&gt;Auto&lt;/td&gt;
&lt;td&gt;AppleScript&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Window-level&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminal.app&lt;/td&gt;
&lt;td&gt;Auto&lt;/td&gt;
&lt;td&gt;Activate&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;Tab-level&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Warp&lt;/td&gt;
&lt;td&gt;Auto&lt;/td&gt;
&lt;td&gt;Activate&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VS Code&lt;/td&gt;
&lt;td&gt;Auto&lt;/td&gt;
&lt;td&gt;Activate&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;+ 5 more&lt;/td&gt;
&lt;td&gt;Auto&lt;/td&gt;
&lt;td&gt;Activate&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Tech Stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Swift + SwiftUI&lt;/strong&gt; — Native macOS, ~70 Swift files&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unix Socket&lt;/strong&gt; — Hook events from Claude Code via Python bridge&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Anthropic OAuth API&lt;/strong&gt; — Direct usage stats, no middleware&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;macOS Keychain&lt;/strong&gt; — Zero-config authentication&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AppleScript&lt;/strong&gt; — Terminal detection and control&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Get It
&lt;/h2&gt;

&lt;p&gt;It's completely free and open-source. No commercial intentions — just a passion project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/xmqywx/CodeIsland.git
&lt;span class="nb"&gt;cd &lt;/span&gt;CodeIsland
xcodebuild &lt;span class="nt"&gt;-scheme&lt;/span&gt; ClaudeIsland &lt;span class="nt"&gt;-configuration&lt;/span&gt; Release build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;GitHub:&lt;/strong&gt; &lt;a href="https://github.com/xmqywx/CodeIsland" rel="noopener noreferrer"&gt;github.com/xmqywx/CodeIsland&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Works best with &lt;a href="https://cmux.io" rel="noopener noreferrer"&gt;cmux&lt;/a&gt; — the modern terminal multiplexer built on Ghostty.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you find it useful, a ⭐ on GitHub would mean the world. It's what keeps us shipping updates.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built entirely with Claude Code, of course.&lt;/em&gt; 🐱&lt;/p&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>macos</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Harness Engineering: Why the Model Is a Commodity and the Infrastructure Is Your Moat</title>
      <dc:creator>KrisYing</dc:creator>
      <pubDate>Sun, 15 Mar 2026 20:52:02 +0000</pubDate>
      <link>https://forem.com/krisying/harness-engineering-why-the-model-is-a-commodity-and-the-infrastructure-is-your-moat-398a</link>
      <guid>https://forem.com/krisying/harness-engineering-why-the-model-is-a-commodity-and-the-infrastructure-is-your-moat-398a</guid>
      <description>&lt;p&gt;Everyone is chasing the next model upgrade. GPT-5, Claude 4, Gemini Ultra — surely &lt;em&gt;that&lt;/em&gt; will be the one that makes our AI agents work properly.&lt;/p&gt;

&lt;p&gt;I've been running AI agents in production for months. Here's what I've learned: &lt;strong&gt;the model doesn't matter nearly as much as what you put around it.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Uncomfortable Truth
&lt;/h2&gt;

&lt;p&gt;Two teams use the same Claude model. One gets mediocre results. The other builds a system that runs 24/7, learns from its mistakes, and gets measurably better every week.&lt;/p&gt;

&lt;p&gt;The difference isn't the model. It's the &lt;strong&gt;harness&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Harness Engineering?
&lt;/h2&gt;

&lt;p&gt;Harness Engineering is the discipline of building infrastructure that wraps, constrains, and amplifies AI models.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Traditional thinking: Better Model → Better Results
Harness Engineering: Same Model + Better Harness → Dramatically Better Results
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Think of it like Formula 1. The engine matters, sure. But the chassis, aerodynamics, tires, telemetry, pit strategy — that's what wins championships. The engine is table stakes.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Five Harnesses
&lt;/h2&gt;

&lt;p&gt;After building &lt;a href="https://github.com/xmqywx/Evolve" rel="noopener noreferrer"&gt;Evolve&lt;/a&gt;, an open-source control plane for AI agents, I've identified five types of harness:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Prompt Harness
&lt;/h3&gt;

&lt;p&gt;Not a static system prompt. A &lt;strong&gt;dynamic assembly&lt;/strong&gt; that builds the optimal prompt based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Current task context&lt;/li&gt;
&lt;li&gt;Relevant historical knowledge (auto-injected)&lt;/li&gt;
&lt;li&gt;Active constraints and permissions&lt;/li&gt;
&lt;li&gt;Agent identity and behavioral rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every time the agent starts, it gets a prompt that's tailored to &lt;em&gt;right now&lt;/em&gt;. Not a generic instruction set — a living document.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Output Harness
&lt;/h3&gt;

&lt;p&gt;Captures, validates, and routes agent outputs. In Evolve, the agent must call Self-Report APIs:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Not optional. No report = work doesn't exist.&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST /api/agent/heartbeat &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"activity":"coding","progress_pct":40}'&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST /api/agent/discovery &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"title":"Found rate limit","priority":"high"}'&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST /api/agent/review &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"learned":["Never use pkill -f"]}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This does two things: (1) gives you real-time visibility, and (2) feeds the knowledge loop.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Constraint Harness
&lt;/h3&gt;

&lt;p&gt;Enforces boundaries at runtime. Toggle from a dashboard — no restart needed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can the agent browse the web? ✅/❌&lt;/li&gt;
&lt;li&gt;Can it push to GitHub? ✅/❌
&lt;/li&gt;
&lt;li&gt;Can it spend money? ❌ (always blocked)&lt;/li&gt;
&lt;li&gt;Can it install packages? ✅/❌&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Constraints are injected into the prompt. The agent &lt;em&gt;knows&lt;/em&gt; its boundaries and respects them.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Runtime Harness
&lt;/h3&gt;

&lt;p&gt;Keeps the agent alive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Watchdog&lt;/strong&gt;: 10-second health checks. Hung process? Auto-revived.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heartbeat monitor&lt;/strong&gt;: 5 min silence → nudge. 15 min → intervention.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crash recovery&lt;/strong&gt;: &lt;code&gt;--resume&lt;/code&gt; with knowledge injection. The agent picks up where it left off, smarter than before.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the difference between a script that runs once and a system that &lt;em&gt;survives&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Observation Harness
&lt;/h3&gt;

&lt;p&gt;A second AI reviews the first AI's work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reads full conversation logs (JSONL)&lt;/li&gt;
&lt;li&gt;Extracts key decisions and tool calls&lt;/li&gt;
&lt;li&gt;Analyzes efficiency, correctness, and instruction adherence&lt;/li&gt;
&lt;li&gt;Generates improvement suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The reviewer uses a cheaper model. The cost is negligible. The insight is invaluable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Knowledge Loop: Where It All Comes Together
&lt;/h2&gt;

&lt;p&gt;The real magic happens when these harnesses work together:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent works → Output Harness captures lessons
                    ↓
        Secondary LLM scores and refines
                    ↓
        Layered knowledge base stores them:
          • Permanent (critical lessons)
          • Recent (30-day TTL)
          • Task-specific (current context)
                    ↓
        Prompt Harness injects on next startup
                    ↓
        Agent is measurably smarter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is a &lt;strong&gt;closed loop&lt;/strong&gt;. The agent doesn't just execute — it &lt;em&gt;evolves&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters Now
&lt;/h2&gt;

&lt;p&gt;Models are converging. GPT-4, Claude, Gemini — they're all roughly comparable for most tasks. The differentiator isn't which model you use. It's how well you harness it.&lt;/p&gt;

&lt;p&gt;Companies investing in better models are playing the wrong game. Invest in better harnesses instead:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Better prompt engineering → Prompt Harness&lt;/li&gt;
&lt;li&gt;Better observability → Output + Observation Harness&lt;/li&gt;
&lt;li&gt;Better safety → Constraint Harness&lt;/li&gt;
&lt;li&gt;Better reliability → Runtime Harness&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/xmqywx/Evolve" rel="noopener noreferrer"&gt;Evolve&lt;/a&gt; is open source (MIT). It implements all five harnesses for Claude Code agents.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/xmqywx/Evolve.git
&lt;span class="nb"&gt;cd &lt;/span&gt;Evolve &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv
.venv/bin/pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;span class="nb"&gt;cd &lt;/span&gt;web &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run build &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ..
.venv/bin/python run.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But even if you don't use Evolve, start thinking about your AI infrastructure as a harness. What are you wrapping around your model? What constraints are you enforcing? How does your agent learn from yesterday?&lt;/p&gt;

&lt;p&gt;The model is a commodity. The harness is your moat.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;What does your AI agent infrastructure look like? I'd love to hear about your approach to these problems.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>devops</category>
      <category>programming</category>
    </item>
    <item>
      <title>I Built a Control Plane for My AI Agent — Because It Kept Making the Same Mistakes</title>
      <dc:creator>KrisYing</dc:creator>
      <pubDate>Sun, 15 Mar 2026 20:52:01 +0000</pubDate>
      <link>https://forem.com/krisying/i-built-a-control-plane-for-my-ai-agent-because-it-kept-making-the-same-mistakes-5hf2</link>
      <guid>https://forem.com/krisying/i-built-a-control-plane-for-my-ai-agent-because-it-kept-making-the-same-mistakes-5hf2</guid>
      <description>&lt;p&gt;I run a Claude agent 24/7. It writes code, deploys services, manages my side projects. Sounds cool, right?&lt;/p&gt;

&lt;p&gt;Except it kept doing dumb things. And I'd only find out &lt;em&gt;after&lt;/em&gt; the damage was done.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Three Problems Nobody Talks About
&lt;/h2&gt;

&lt;p&gt;When you let an AI agent run autonomously, you quickly hit three walls:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. You have no idea what it's doing.&lt;/strong&gt;&lt;br&gt;
You're tailing logs, scrolling through terminal output, trying to piece together what happened while you were asleep. The agent ran for 8 hours. What did it accomplish? Nobody knows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. It repeats the same mistakes.&lt;/strong&gt;&lt;br&gt;
Last week it used &lt;code&gt;pkill -f&lt;/code&gt; and crashed my system. I told it not to. Next session? Same mistake. Every conversation starts from zero.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. When it does something wrong, you find out too late.&lt;/strong&gt;&lt;br&gt;
It spent 3 hours going in circles on a task that should have taken 20 minutes. It installed packages I explicitly said not to. It pushed broken code. By the time you notice, it's already done.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Fix: Make the Agent Report Its Own Status
&lt;/h2&gt;

&lt;p&gt;I built &lt;a href="https://github.com/xmqywx/Evolve" rel="noopener noreferrer"&gt;&lt;strong&gt;Evolve&lt;/strong&gt;&lt;/a&gt; — a control plane for autonomous AI agents.&lt;/p&gt;

&lt;p&gt;The key insight: &lt;strong&gt;don't monitor the agent from outside. Make it monitor itself.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# The agent reports: "I'm coding, 40% done"&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nv"&gt;$EVOLVE_URL&lt;/span&gt;/api/agent/heartbeat &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"activity":"coding","description":"implementing auth module","progress_pct":40}'&lt;/span&gt;

&lt;span class="c"&gt;# The agent reports: "I discovered something important"&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nv"&gt;$EVOLVE_URL&lt;/span&gt;/api/agent/discovery &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"title":"Rate limit found","content":"Max 3 posts/day","priority":"high"}'&lt;/span&gt;

&lt;span class="c"&gt;# The agent reports: "Here's what I learned today"&lt;/span&gt;
curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST &lt;span class="nv"&gt;$EVOLVE_URL&lt;/span&gt;/api/agent/review &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{"accomplished":["API integration"],"learned":["Use MD5 not SHA256"]}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The rule is simple: &lt;strong&gt;No report = work doesn't exist.&lt;/strong&gt; This is baked into the agent's prompt. It &lt;em&gt;must&lt;/em&gt; call these APIs, or the work doesn't count.&lt;/p&gt;

&lt;p&gt;6 reporting endpoints cover everything: Heartbeat, Deliverable, Discovery, Workflow, Upgrade Proposal, and Review.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbwheue8akmakfgwsv7jn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbwheue8akmakfgwsv7jn.png" alt="Evolve Dashboard" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The Evolve Dashboard — real-time agent status, system health, active sessions, and recent tasks at a glance.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  The Part That Changed Everything: Knowledge That Persists
&lt;/h2&gt;

&lt;p&gt;This is the core innovation. Most agent frameworks start from zero every conversation. Evolve creates a &lt;strong&gt;closed-loop learning system&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent makes mistake → Reports via review API
        ↓
LLM evaluates: "This is a 10/10 critical lesson"
        ↓
Stored in layered knowledge base:
  • Permanent (score ≥8): Core lessons, never expire
  • Recent (5-7): Useful but temporal, 30-day TTL
  • Task: Matched to current work context
        ↓
Next startup: Injected into agent's prompt
        ↓
Agent never makes that mistake again
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key design decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Refinement, not storage.&lt;/strong&gt; A secondary LLM scores each lesson (1-10), distills it to one sentence, and tags it. Raw data goes in, actionable knowledge comes out.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Three-layer injection.&lt;/strong&gt; Only the most relevant knowledge enters the prompt. Not everything — that would blow up the context window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-expiry.&lt;/strong&gt; Low-value knowledge expires after 30 days. The knowledge base stays lean.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  AI Reviewing AI
&lt;/h2&gt;

&lt;p&gt;One agent works. Another reviews its work.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F12mwfxv0vktlnmrmq6eu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F12mwfxv0vktlnmrmq6eu.png" alt="Supervisor Reports" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The Supervisor page — daily analysis reports with heartbeat, deliverable, and discovery counts.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Click "Analyze" in the dashboard → Evolve reads the full conversation log (JSONL) → extracts key actions → compresses to ~6000 chars → sends to a secondary LLM for analysis:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Was each decision reasonable?&lt;/li&gt;
&lt;li&gt;Any idle loops or wasted effort?&lt;/li&gt;
&lt;li&gt;Did it follow instructions?&lt;/li&gt;
&lt;li&gt;Efficiency score + improvement suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This costs almost nothing because the reviewer is a cheaper model, not Claude.&lt;/p&gt;
&lt;h2&gt;
  
  
  The 24/7 Survival Engine
&lt;/h2&gt;

&lt;p&gt;The agent doesn't just run — it &lt;strong&gt;survives&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Watchdog&lt;/strong&gt;: Health check every 10 seconds. Hung? Auto-revived.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Heartbeat detection&lt;/strong&gt;: 5 min silence → gentle nudge. 15 min → context-aware intervention.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crash recovery&lt;/strong&gt;: Restart with &lt;code&gt;--resume&lt;/code&gt;, inject historical knowledge, continue seamlessly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Web terminal&lt;/strong&gt;: Operate the tmux session from your browser. No SSH needed.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Runtime Permission Controls
&lt;/h2&gt;

&lt;p&gt;Toggle what your agent can do from the dashboard. No restart, no code changes:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frf3khjswpdywo7ntcgqc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frf3khjswpdywo7ntcgqc.png" alt="Capability Controls" width="" height=""&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Capability toggles and behavior settings — control autonomy level, risk tolerance, and more.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Extensions Management
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F181xl0c305keoxjim93k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F181xl0c305keoxjim93k.png" alt="Extensions Manager" width="800" height="500"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Full visibility into skills, MCP servers, and plugins — with auto-tagging and source tracking.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Harness Engineering
&lt;/h2&gt;

&lt;p&gt;I call this approach &lt;strong&gt;Harness Engineering&lt;/strong&gt; — building infrastructure that wraps, constrains, and amplifies AI models.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Traditional: Better Model → Better Results
Harness Eng: Same Model + Better Harness → Dramatically Better Results
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model is a commodity. Two teams using the same Claude will get wildly different results based on their harness quality. Evolve is that harness.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/xmqywx/Evolve.git
&lt;span class="nb"&gt;cd &lt;/span&gt;Evolve
python &lt;span class="nt"&gt;-m&lt;/span&gt; venv .venv &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; .venv/bin/pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt
&lt;span class="nb"&gt;cd &lt;/span&gt;web &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; npm run build &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd&lt;/span&gt; ..
&lt;span class="nb"&gt;cp &lt;/span&gt;config.yaml.example config.yaml
.venv/bin/python run.py
&lt;span class="c"&gt;# Visit http://localhost:3818&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Stack&lt;/strong&gt;: Python/FastAPI backend, React/TypeScript frontend, SQLite, xterm.js, Claude Code runtime.&lt;/p&gt;

&lt;p&gt;MIT licensed. &lt;a href="https://github.com/xmqywx/Evolve" rel="noopener noreferrer"&gt;GitHub →&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;If you're running AI agents in production and tired of babysitting them, give Evolve a try. I'd love to hear how you're solving these same problems.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>claude</category>
      <category>automation</category>
    </item>
    <item>
      <title>How I'm Building a One-Person AI Automation Agency in 2026 (Tools, Stack, Revenue)</title>
      <dc:creator>KrisYing</dc:creator>
      <pubDate>Wed, 11 Mar 2026 22:33:30 +0000</pubDate>
      <link>https://forem.com/krisying/how-im-building-a-one-person-ai-automation-agency-in-2026-tools-stack-revenue-3712</link>
      <guid>https://forem.com/krisying/how-im-building-a-one-person-ai-automation-agency-in-2026-tools-stack-revenue-3712</guid>
      <description>&lt;p&gt;In 2026, one developer with AI tools can deliver what used to require a 5-person agency.&lt;/p&gt;

&lt;p&gt;I'm not saying this as hype. I'm saying it because I've been living it. Over the past few months I've built 25 n8n automation templates, published 2 MCP servers, packaged 17 Claude Code skills, and started landing Upwork clients — all as a solo developer.&lt;/p&gt;

&lt;p&gt;This is my honest breakdown of how the business works, what the stack looks like, and what the numbers actually are right now.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Core Insight
&lt;/h2&gt;

&lt;p&gt;Traditional automation agencies need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A project manager to scope work&lt;/li&gt;
&lt;li&gt;A developer to build the automation&lt;/li&gt;
&lt;li&gt;A QA person to test it&lt;/li&gt;
&lt;li&gt;A copywriter to document it&lt;/li&gt;
&lt;li&gt;A salesperson to find clients&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Claude Code + n8n + MCP servers, one person covers all five roles. Not perfectly. But well enough to deliver real value to real clients.&lt;/p&gt;

&lt;p&gt;That's the wedge. And I'm using it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Stack
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Claude Code — My Development Partner
&lt;/h3&gt;

&lt;p&gt;Claude Code is Anthropic's official CLI. It runs in your terminal, reads your codebase, and helps you build at a pace that genuinely feels like having a senior developer beside you.&lt;/p&gt;

&lt;p&gt;I use it for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scaffolding new n8n workflow logic before building in the UI&lt;/li&gt;
&lt;li&gt;Writing TypeScript MCP servers from scratch&lt;/li&gt;
&lt;li&gt;Generating Shopify API integrations&lt;/li&gt;
&lt;li&gt;Debugging webhook failures&lt;/li&gt;
&lt;li&gt;Writing client-facing documentation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The key shift is treating Claude Code as a &lt;strong&gt;collaborator&lt;/strong&gt;, not a code generator. You're still the architect. It handles the boilerplate, the syntax, the "how do I do this in TypeScript again" questions.&lt;/p&gt;

&lt;h3&gt;
  
  
  n8n — The Automation Engine
&lt;/h3&gt;

&lt;p&gt;n8n is my core delivery tool. It's open-source, self-hostable, and has the best balance of power vs. usability I've found. Clients can actually look at workflows and understand them, which matters for handoff.&lt;/p&gt;

&lt;p&gt;My workflow with n8n:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Client describes a business problem&lt;/li&gt;
&lt;li&gt;I map it to an automation pattern I've already built&lt;/li&gt;
&lt;li&gt;I adapt one of my 25 templates to their specific setup&lt;/li&gt;
&lt;li&gt;Deploy, test, document, hand off&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Having a library of battle-tested templates means I can deliver a project in hours instead of days. That's my competitive advantage.&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP Servers — The Integration Layer
&lt;/h3&gt;

&lt;p&gt;Model Context Protocol is how AI agents connect to real tools. I've built two production MCP servers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Shopify MCP Server&lt;/strong&gt;: 16 tools for managing products, orders, inventory, customers, and analytics — all accessible directly from Claude&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Sheets MCP Server&lt;/strong&gt;: 14 tools for reading, writing, formatting, and querying spreadsheets — filling a real gap in the market&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;MCP servers turn Claude into a genuine business tool. Instead of copy-pasting data between systems, clients can ask their AI agent to "pull last week's orders and update the inventory sheet" and it just works.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I Actually Sell
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Custom Automation Projects (Upwork)
&lt;/h3&gt;

&lt;p&gt;This is the fastest path to cash. Clients post jobs, I apply, I deliver.&lt;/p&gt;

&lt;p&gt;My positioning: "AI-powered automation using n8n and Claude Code." I'm not just an n8n developer — I bring AI into the workflow itself.&lt;/p&gt;

&lt;p&gt;Typical projects:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Order processing automation ($300-800)&lt;/li&gt;
&lt;li&gt;AI-powered email responders ($400-1200)&lt;/li&gt;
&lt;li&gt;Lead scoring pipelines ($500-1500)&lt;/li&gt;
&lt;li&gt;Voice agent integrations ($800-2000)&lt;/li&gt;
&lt;li&gt;MCP server development ($1000-3000)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rates: $40-80/hr or fixed price. Still building the profile, but the pipeline is real.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.upwork.com/freelancers/~012be85fee901e77ee" rel="noopener noreferrer"&gt;Upwork profile&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. n8n Template Pack (Digital Product)
&lt;/h3&gt;

&lt;p&gt;I packaged 25 production-ready n8n templates into a bundle covering e-commerce, content, operations, and advanced AI use cases.&lt;/p&gt;

&lt;p&gt;Each template is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fully documented&lt;/li&gt;
&lt;li&gt;Ready to import&lt;/li&gt;
&lt;li&gt;Covers a real business use case&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The bundle is live on Gumroad. Having it there also serves as a portfolio — clients can see the scope of what I've built before hiring me.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://xmqywx.gumroad.com/l/shopify-ai-n8n-templates" rel="noopener noreferrer"&gt;AI Business Automation Pack on Gumroad&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. MCP Server Marketplace
&lt;/h3&gt;

&lt;p&gt;Both MCP servers are published and listed on MCP directories. The goal is passive income from developers who need these integrations without building from scratch.&lt;/p&gt;

&lt;p&gt;The Google Sheets MCP fills a genuine gap — there's no dominant solution in that space yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Claude Code Skills
&lt;/h3&gt;

&lt;p&gt;17 packaged Claude Code skills covering git workflows, code review, API scaffolding, project health checks, freelance proposal writing, content pipelines, and more.&lt;/p&gt;

&lt;p&gt;Skills are a new distribution format — portable, composable, shareable. Think of them as specialized AI workflows you can install and invoke.&lt;/p&gt;




&lt;h2&gt;
  
  
  Revenue Channels (The Four-Channel Model)
&lt;/h2&gt;

&lt;p&gt;I'm not betting everything on one channel. Here's the split:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Channel&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Timeline&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Upwork freelancing&lt;/td&gt;
&lt;td&gt;Active income&lt;/td&gt;
&lt;td&gt;Immediate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Digital products (Gumroad)&lt;/td&gt;
&lt;td&gt;Passive income&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP marketplace&lt;/td&gt;
&lt;td&gt;Passive income&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content marketing&lt;/td&gt;
&lt;td&gt;Lead gen&lt;/td&gt;
&lt;td&gt;Long term&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The theory: freelancing pays the bills now while products build passive income over time. Content drives inbound for both.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real Numbers (Early Stage, Honest)
&lt;/h2&gt;

&lt;p&gt;I'll be direct: this is early. I'm not writing this from a beach with a $20K MRR dashboard.&lt;/p&gt;

&lt;p&gt;What exists right now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;25 n8n templates built and packaged&lt;/li&gt;
&lt;li&gt;2 MCP servers compiled and listed&lt;/li&gt;
&lt;li&gt;17 Claude Code skills ready&lt;/li&gt;
&lt;li&gt;Upwork profile live, proposals going out&lt;/li&gt;
&lt;li&gt;Gumroad products created (awaiting payment setup to publish)&lt;/li&gt;
&lt;li&gt;6 dev.to articles published (including this one)&lt;/li&gt;
&lt;li&gt;Multiple freelance platforms set up (Upwork, Fiverr, PeoplePerHour, Freelancer.com)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What I'm targeting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;$2K-5K/mo in 90 days from freelancing&lt;/li&gt;
&lt;li&gt;$500-1K/mo in 6 months from digital products&lt;/li&gt;
&lt;li&gt;$200-500/mo in 6 months from MCP marketplace&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The blueprint is sound. Execution is the variable.&lt;/p&gt;




&lt;h2&gt;
  
  
  Lessons Learned So Far
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Marketing is the actual job
&lt;/h3&gt;

&lt;p&gt;I spent months building things. Products that no one knew existed. The hard truth: a mediocre product with great distribution beats a great product with no distribution every time.&lt;/p&gt;

&lt;p&gt;Now I spend more time on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing articles (like this one)&lt;/li&gt;
&lt;li&gt;Submitting to directories&lt;/li&gt;
&lt;li&gt;Posting proposals&lt;/li&gt;
&lt;li&gt;Cold outreach to potential clients&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Building is the fun part. Marketing is the job.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Start with services, then productize
&lt;/h3&gt;

&lt;p&gt;Every template in my bundle started as something I built for a real use case. Every MCP server solves a problem I actually hit. Services first forces you to build things that work in the real world, not things that are interesting in theory.&lt;/p&gt;

&lt;p&gt;Once you have something proven, package it. Then you're selling the same work multiple times.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Templates accelerate everything
&lt;/h3&gt;

&lt;p&gt;Having a library of working templates means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster project delivery (hours not days)&lt;/li&gt;
&lt;li&gt;Lower risk for clients (they can see what they're getting)&lt;/li&gt;
&lt;li&gt;Easier proposals (I know exactly what it takes)&lt;/li&gt;
&lt;li&gt;Passive income channel (sell the templates directly)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're doing automation work and not building a template library, you're leaving money on the table.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The niche matters more than the tool
&lt;/h3&gt;

&lt;p&gt;"I do n8n automation" is a commodity. "I build AI-powered Shopify automation systems for e-commerce operators" is a positioning.&lt;/p&gt;

&lt;p&gt;The more specific you are, the easier it is to find clients, write proposals, and charge a premium. I'm still refining mine, but the direction is e-commerce + AI + Claude Code.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. MCP is undermonetized right now
&lt;/h3&gt;

&lt;p&gt;The MCP ecosystem is exploding — 97M+ monthly SDK downloads, 10K+ active servers, 8 new directories launched in the last 6 months. But less than 5% of MCP servers are monetized.&lt;/p&gt;

&lt;p&gt;That gap is an opportunity. Building MCP servers now, while the ecosystem is young, is the equivalent of building Shopify apps in 2012. Most developers are ignoring it because the monetization infrastructure is still forming.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Tools List
&lt;/h2&gt;

&lt;p&gt;For anyone who wants to replicate this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Development&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code (Anthropic) — AI pair programming&lt;/li&gt;
&lt;li&gt;n8n (self-hosted or cloud) — workflow automation&lt;/li&gt;
&lt;li&gt;TypeScript — MCP server development&lt;/li&gt;
&lt;li&gt;Node.js/Express — API backends&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Business Infrastructure&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upwork — freelance clients&lt;/li&gt;
&lt;li&gt;Gumroad — digital product sales&lt;/li&gt;
&lt;li&gt;Polar.sh — developer-focused payments (4% vs Gumroad's 10%)&lt;/li&gt;
&lt;li&gt;GitHub — open source + portfolio&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Distribution&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Dev.to — technical content&lt;/li&gt;
&lt;li&gt;MCP directories (mcp.so, glama.ai, PulseMCP) — MCP server discovery&lt;/li&gt;
&lt;li&gt;n8n marketplaces (n8nmarket.com, ManageN8N) — template distribution&lt;/li&gt;
&lt;li&gt;Fiverr, PeoplePerHour, Freelancer.com — freelance reach&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;AI Services&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DeepSeek API — cost-effective OpenAI-compatible API&lt;/li&gt;
&lt;li&gt;OpenAI API — when clients need it specifically&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;The immediate focus is converting the infrastructure into revenue:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get first Upwork client (proposals going out daily)&lt;/li&gt;
&lt;li&gt;Publish Gumroad bundle (payment method setup pending)&lt;/li&gt;
&lt;li&gt;Get MCP servers listed on top 5 directories&lt;/li&gt;
&lt;li&gt;Publish this article and the five others in the backlog&lt;/li&gt;
&lt;li&gt;Submit to Shopify App Store (0% commission to $1M — hard to ignore)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you're building something similar — a solo dev agency, a product business, anything in the automation space — I'd genuinely like to compare notes.&lt;/p&gt;

&lt;p&gt;Leave a comment or find me on Upwork.&lt;/p&gt;




&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.upwork.com/freelancers/~012be85fee901e77ee" rel="noopener noreferrer"&gt;Upwork profile&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://xmqywx.gumroad.com/l/shopify-ai-n8n-templates" rel="noopener noreferrer"&gt;n8n Automation Templates on Gumroad&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.n8n.io" rel="noopener noreferrer"&gt;n8n docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;MCP documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://claude.ai/code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Building in public. Early stage. Real numbers when there are real numbers to share.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 Get My Templates
&lt;/h2&gt;

&lt;p&gt;Want these templates ready to use? Check out my complete collection of&lt;br&gt;&lt;br&gt;
  &lt;strong&gt;25 production-ready n8n automation templates&lt;/strong&gt; — ready to deploy immediately.                                                              &lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://ko-fi.com/s/2be7e40d09" rel="noopener noreferrer"&gt;Get the n8n Templates Bundle ($10)&lt;/a&gt;&lt;/strong&gt;                                                                  &lt;/p&gt;

&lt;p&gt;Perfect for automation engineers, consultants, and anyone looking to accelerate their n8n projects with battle-tested workflows. &lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>n8n</category>
      <category>freelancing</category>
    </item>
    <item>
      <title>I Built 5 Custom GPTs as Lead Magnets — Here's the Strategy Behind Each One</title>
      <dc:creator>KrisYing</dc:creator>
      <pubDate>Wed, 11 Mar 2026 22:27:57 +0000</pubDate>
      <link>https://forem.com/krisying/i-built-5-custom-gpts-as-lead-magnets-heres-the-strategy-behind-each-one-5gn8</link>
      <guid>https://forem.com/krisying/i-built-5-custom-gpts-as-lead-magnets-heres-the-strategy-behind-each-one-5gn8</guid>
      <description>&lt;p&gt;The GPT Store has &lt;strong&gt;3 million+ custom GPTs&lt;/strong&gt;. Most make nothing. But the ones that work? They're not trying to monetize inside the GPT Store — they're funnels to something bigger.&lt;/p&gt;

&lt;p&gt;I built 5 custom GPTs that each serve as a &lt;strong&gt;free demo&lt;/strong&gt; of my paid n8n automation templates ($149 bundle). Here's the exact strategy.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Funnel: Free GPT → Paid Product
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User discovers GPT on GPT Store
       ↓
Uses it for free (gets real value)
       ↓
GPT mentions: "Want this automated 24/7?
I have an n8n template that does this."
       ↓
User clicks link → Gumroad → $149 bundle
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key insight: &lt;strong&gt;the GPT gives a taste of what the full automation does&lt;/strong&gt;. The GPT requires manual input each time. The n8n template runs automatically, 24/7.&lt;/p&gt;

&lt;h2&gt;
  
  
  GPT 1: E-Commerce AI Advisor
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Analyzes your Shopify/e-commerce store and identifies automation opportunities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hook:&lt;/strong&gt; User describes their business → GPT outputs a prioritized list of automations with ROI estimates → each recommendation maps to a specific template in the bundle.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sample conversation:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;User: "I run a Shopify store selling organic skincare. 200 orders/month, 3 customer service emails/day."&lt;/p&gt;

&lt;p&gt;GPT: "Based on your volume, here are your top 3 automation opportunities:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;AI Email Auto-Responder&lt;/strong&gt; (save 10+ hrs/week) — classify and draft responses to those 3 daily emails automatically&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Abandoned Cart Recovery&lt;/strong&gt; (recover 10-15% of carts) — at 200 orders/month, that's 20-30 recovered sales&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI Social Media Content&lt;/strong&gt; (save 8+ hrs/week) — generate daily posts from your product catalog"&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Why it converts:&lt;/strong&gt; The advice is genuinely useful AND specific to their business. They can see the exact ROI. The next logical step is "how do I actually build this?" → template bundle.&lt;/p&gt;

&lt;h2&gt;
  
  
  GPT 2: AI Workflow Architect
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Designs custom n8n/automation workflow blueprints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hook:&lt;/strong&gt; User describes what they want automated → GPT outputs a complete workflow diagram with node types, triggers, and data flow → mentions that pre-built templates are available.&lt;/p&gt;

&lt;p&gt;This GPT positions me as the &lt;strong&gt;expert to hire&lt;/strong&gt; if they want custom implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  GPT 3: Contract Risk Analyzer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Analyzes contract text for risky clauses, missing provisions, and red flags.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hook:&lt;/strong&gt; User pastes contract → GPT does a basic risk analysis → mentions that the full AI Contract Reviewer template does this automatically at scale, scoring every contract 1-100.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why vertical GPTs work better:&lt;/strong&gt; Legal professionals have budget. They're used to paying for tools. A free contract analyzer that shows value → paid template for their firm → potential consulting engagement.&lt;/p&gt;

&lt;h2&gt;
  
  
  GPT 4: Resume Screener Pro
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Evaluates resumes against job descriptions and generates interview questions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hook:&lt;/strong&gt; HR teams paste resume + JD → GPT scores the candidate → mentions the full template processes 100 resumes in 30 minutes automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  GPT 5: Meeting Notes Summarizer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does:&lt;/strong&gt; Extracts decisions, action items, and key topics from meeting transcripts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The hook:&lt;/strong&gt; User pastes transcript → GPT extracts structured summary → mentions the template does this automatically via webhook integration with Zoom/Teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design Principles
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Give Real Value First
&lt;/h3&gt;

&lt;p&gt;The GPT must be genuinely useful, not just an ad. If someone uses it once and gets value, they'll come back — and eventually convert.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Natural Upsell, Not Pushy
&lt;/h3&gt;

&lt;p&gt;The mention of paid products comes at the END, framed as "if you want this to run automatically, here's how." Never gate the core value.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Target Verticals
&lt;/h3&gt;

&lt;p&gt;Generic "AI assistant" GPTs get lost. "Contract Risk Analyzer" and "Resume Screener" target specific professionals who have budget and urgency.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Include Brand Consistently
&lt;/h3&gt;

&lt;p&gt;Every GPT ends responses with: "Built by Kris — AI Automation Engineer" — building recognition across all touchpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  Publishing Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Create GPT on chat.openai.com/gpts/create&lt;/li&gt;
&lt;li&gt;[ ] Write clear description (include keywords for GPT Store search)&lt;/li&gt;
&lt;li&gt;[ ] Add 4 conversation starters&lt;/li&gt;
&lt;li&gt;[ ] Set to "Public" for GPT Store listing&lt;/li&gt;
&lt;li&gt;[ ] Test with 5 sample conversations&lt;/li&gt;
&lt;li&gt;[ ] Share link on LinkedIn, Twitter, relevant subreddits&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Expected Results
&lt;/h2&gt;

&lt;p&gt;Being realistic:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each GPT might get 50-200 users/month&lt;/li&gt;
&lt;li&gt;2-5% click through to Gumroad&lt;/li&gt;
&lt;li&gt;5% of those convert&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's &lt;strong&gt;0.5-2 sales per GPT per month&lt;/strong&gt; without any marketing spend. With 5 GPTs, that's 2.5-10 sales/month = &lt;strong&gt;$370-$1,490/month&lt;/strong&gt; from free GPTs alone.&lt;/p&gt;

&lt;p&gt;The real value is &lt;strong&gt;compounding distribution&lt;/strong&gt;: every GPT Store listing, every MCP directory submission, every Dev.to article, every Upwork profile — they all cross-link and reinforce each other.&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 Get My Templates
&lt;/h2&gt;

&lt;p&gt;Want these templates ready to use? Check out my complete collection of&lt;br&gt;&lt;br&gt;
  &lt;strong&gt;25 production-ready n8n automation templates&lt;/strong&gt; — ready to deploy immediately.                                                              &lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://ko-fi.com/s/2be7e40d09" rel="noopener noreferrer"&gt;Get the n8n Templates Bundle ($10)&lt;/a&gt;&lt;/strong&gt;                                                                  &lt;/p&gt;

&lt;p&gt;Perfect for automation engineers, consultants, and anyone looking to accelerate their n8n projects with battle-tested workflows. &lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Resources:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;[25 AI Automation Templates — $149 bundle][GUMROAD_LINK]&lt;/li&gt;
&lt;li&gt;[My MCP Servers on npm][NPM_LINK]&lt;/li&gt;
&lt;li&gt;Available for custom automation: [Upwork][UPWORK_LINK]&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>gpt</category>
      <category>marketing</category>
      <category>automation</category>
    </item>
    <item>
      <title>MCP Servers Are the New SaaS: How I'm Monetizing AI Tool Integrations in 2026</title>
      <dc:creator>KrisYing</dc:creator>
      <pubDate>Wed, 11 Mar 2026 22:27:51 +0000</pubDate>
      <link>https://forem.com/krisying/mcp-servers-are-the-new-saas-how-im-monetizing-ai-tool-integrations-in-2026-2e9e</link>
      <guid>https://forem.com/krisying/mcp-servers-are-the-new-saas-how-im-monetizing-ai-tool-integrations-in-2026-2e9e</guid>
      <description>&lt;p&gt;The Model Context Protocol has hit &lt;strong&gt;8 million downloads&lt;/strong&gt; with 85% month-over-month growth. Over 11,000 MCP servers exist. Less than 5% are monetized.&lt;/p&gt;

&lt;p&gt;This is the equivalent of the early App Store — before everyone figured out how to charge for apps.&lt;/p&gt;

&lt;p&gt;I've built 2 MCP servers (30 tools total) and I'm going to walk you through exactly how the MCP economy works, what's selling, and how to get in before it's crowded.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is MCP (30-Second Version)
&lt;/h2&gt;

&lt;p&gt;MCP lets AI agents (Claude, Cursor, Windsurf, Cline) call external tools. Instead of the AI just generating text, it can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Query your Shopify store&lt;/li&gt;
&lt;li&gt;Update a Google Sheet&lt;/li&gt;
&lt;li&gt;Search your CRM&lt;/li&gt;
&lt;li&gt;Process an invoice&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it as &lt;strong&gt;APIs, but for AI agents&lt;/strong&gt;. You build the server once, and any MCP-compatible client can use it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Business Models That Work
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Freemium (21st.dev model)
&lt;/h3&gt;

&lt;p&gt;21st.dev hit &lt;strong&gt;$10K MRR in 6 weeks&lt;/strong&gt; with zero marketing. Their model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free tier: basic UI component generation&lt;/li&gt;
&lt;li&gt;Paid tier ($20/mo): premium components, priority access&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This works because developers discover the tool organically through MCP directories, get hooked on the free tier, then upgrade.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Usage-Based (MCPize model)
&lt;/h3&gt;

&lt;p&gt;MCPize lets you deploy MCP servers and charge per tool call:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You set the price per invocation&lt;/li&gt;
&lt;li&gt;They handle billing, auth, deployment&lt;/li&gt;
&lt;li&gt;You get 85% revenue share&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Best for servers that provide real-time data or expensive API calls.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Lead Generation (My model)
&lt;/h3&gt;

&lt;p&gt;I publish MCP servers for free on npm. Each server's README links to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;My Upwork profile (freelance work)&lt;/li&gt;
&lt;li&gt;My template bundle on Gumroad ($149)&lt;/li&gt;
&lt;li&gt;My consulting page&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The MCP server is the &lt;strong&gt;top of funnel&lt;/strong&gt;. Someone discovers my Shopify MCP server, sees I also sell n8n templates for e-commerce, and buys the bundle.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built: 2 MCP Servers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Shopify Store MCP (16 tools)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Tools include:&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;get_products&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;create_product&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;update_product&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;get_orders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;get_order_details&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;manage_inventory&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;adjust_inventory&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;get_customers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;search_customers&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;get_analytics&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;get_sales_report&lt;/span&gt;
&lt;span class="c1"&gt;// + 5 more&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it sells:&lt;/strong&gt; Every Shopify developer wants to let AI manage their store. Claude can now check inventory, process orders, update products — all through natural language.&lt;/p&gt;

&lt;h3&gt;
  
  
  Google Sheets MCP (14 tools)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Tools include:&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;read_range&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;write_range&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;append_rows&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;create_spreadsheet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;get_spreadsheets&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;format_cells&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;create_chart&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="nx"&gt;add_sheet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;delete_sheet&lt;/span&gt;
&lt;span class="c1"&gt;// + 5 more&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why it sells:&lt;/strong&gt; Google Sheets is the universal business database. AI agents that can read and write to Sheets can automate almost any business process.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Build Your First MCP Server
&lt;/h2&gt;

&lt;p&gt;The stack is simple:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init &lt;span class="nt"&gt;-y&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; @modelcontextprotocol/sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every MCP server follows this pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;McpServer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@modelcontextprotocol/sdk/server/mcp.js&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;McpServer&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;your-server&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1.0.0&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;tool_name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Description of what this tool does&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;param&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;z&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;describe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Parameter description&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;param&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Your logic here&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;callExternalAPI&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;param&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Each &lt;code&gt;server.tool()&lt;/code&gt; call registers one tool that AI agents can call.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to List (Distribution Strategy)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;npm&lt;/td&gt;
&lt;td&gt;Package registry&lt;/td&gt;
&lt;td&gt;Developers find you via &lt;code&gt;npm search&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mcpmarket.com&lt;/td&gt;
&lt;td&gt;Directory&lt;/td&gt;
&lt;td&gt;Curated, high-quality listings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pulsemcp.com&lt;/td&gt;
&lt;td&gt;Directory&lt;/td&gt;
&lt;td&gt;8,590+ servers, good discovery&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mcp.so&lt;/td&gt;
&lt;td&gt;Directory&lt;/td&gt;
&lt;td&gt;Clean UI, growing traffic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mcpservers.org&lt;/td&gt;
&lt;td&gt;Directory&lt;/td&gt;
&lt;td&gt;"Awesome MCP Servers" list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cline Marketplace&lt;/td&gt;
&lt;td&gt;IDE integration&lt;/td&gt;
&lt;td&gt;Millions of Cline users&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Smithery.ai&lt;/td&gt;
&lt;td&gt;Registry&lt;/td&gt;
&lt;td&gt;Developer-focused&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCPize&lt;/td&gt;
&lt;td&gt;Monetized hosting&lt;/td&gt;
&lt;td&gt;85% revenue share&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; Submit to ALL of them. Each listing is a backlink and a discovery channel. The servers that appear on 5+ directories get 10x more installs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Money Math
&lt;/h2&gt;

&lt;p&gt;Let's be conservative:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Free MCP server gets 500 installs/month&lt;/li&gt;
&lt;li&gt;2% check out your paid products&lt;/li&gt;
&lt;li&gt;10 visitors/month to your Gumroad page&lt;/li&gt;
&lt;li&gt;5% conversion rate = 0.5 sales/month per server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At $149/bundle, that's ~$75/month per MCP server in passive income. With 5 servers, that's $375/month — just from the lead gen angle.&lt;/p&gt;

&lt;p&gt;Add MCPize monetization (even $0.01/call), and a server with 10,000 calls/month adds another $85/month.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;I'm building MCP servers for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Slack&lt;/strong&gt; (workspace management for AI agents)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;n8n&lt;/strong&gt; (let AI trigger n8n workflows via MCP)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stripe&lt;/strong&gt; (payment processing for AI agents)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The window is open now. In 12 months, every major SaaS company will have their own official MCP server. The opportunity for indie developers is RIGHT NOW.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;My toolkit:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;25 n8n AI workflow templates ([bundle on Gumroad][GUMROAD_LINK])&lt;/li&gt;
&lt;li&gt;2 MCP servers on npm (30 tools)&lt;/li&gt;
&lt;li&gt;17 Claude Code skills&lt;/li&gt;
&lt;li&gt;Available for hire: [Upwork profile][UPWORK_LINK]&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;What MCP server are you building? Drop a comment below.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 Get My Templates
&lt;/h2&gt;

&lt;p&gt;Want these templates ready to use? Check out my complete collection of&lt;br&gt;&lt;br&gt;
  &lt;strong&gt;25 production-ready n8n automation templates&lt;/strong&gt; — ready to deploy immediately.                                                              &lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://ko-fi.com/s/2be7e40d09" rel="noopener noreferrer"&gt;Get the n8n Templates Bundle ($10)&lt;/a&gt;&lt;/strong&gt;                                                                  &lt;/p&gt;

&lt;p&gt;Perfect for automation engineers, consultants, and anyone looking to accelerate their n8n projects with battle-tested workflows. &lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>monetization</category>
      <category>typescript</category>
    </item>
    <item>
      <title>MCP Servers Explained: How to Connect AI Agents to Any Business Tool</title>
      <dc:creator>KrisYing</dc:creator>
      <pubDate>Wed, 11 Mar 2026 22:22:05 +0000</pubDate>
      <link>https://forem.com/krisying/mcp-servers-explained-how-to-connect-ai-agents-to-any-business-tool-3cl6</link>
      <guid>https://forem.com/krisying/mcp-servers-explained-how-to-connect-ai-agents-to-any-business-tool-3cl6</guid>
      <description>&lt;h1&gt;
  
  
  MCP Servers Explained: How to Connect AI Agents to Any Business Tool
&lt;/h1&gt;

&lt;p&gt;The Model Context Protocol (MCP) is the biggest shift in AI tooling since function calling. If you build AI applications, you need to understand MCP — it's how AI agents will interact with the real world.&lt;/p&gt;

&lt;p&gt;I've built 2 MCP servers with 30 tools between them. Here's everything I learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Problem Does MCP Solve?
&lt;/h2&gt;

&lt;p&gt;Before MCP, connecting an AI agent to a business tool meant:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Write custom API integration code&lt;/li&gt;
&lt;li&gt;Define tool schemas for the specific AI model&lt;/li&gt;
&lt;li&gt;Handle authentication, rate limiting, error handling&lt;/li&gt;
&lt;li&gt;Repeat for every new tool and every new AI model&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;MCP standardizes this. Build one MCP server, and &lt;strong&gt;any AI client&lt;/strong&gt; (Claude, Cursor, Windsurf, custom agents) can use your tools.&lt;/p&gt;

&lt;p&gt;Think of it like USB for AI — one connector, universal compatibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture in 60 Seconds
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI Client (Claude/Cursor) ←→ MCP Protocol ←→ Your MCP Server ←→ Business API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your MCP server exposes &lt;strong&gt;tools&lt;/strong&gt; (functions the AI can call), &lt;strong&gt;resources&lt;/strong&gt; (data the AI can read), and &lt;strong&gt;prompts&lt;/strong&gt; (pre-built conversation templates).&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a Real MCP Server
&lt;/h2&gt;

&lt;p&gt;Here's the structure of my Shopify MCP Server (16 tools):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Server&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@modelcontextprotocol/sdk/server/index.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;StdioServerTransport&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@modelcontextprotocol/sdk/server/stdio.js&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Server&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;shopify-store-mcp&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;1.0.0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;capabilities&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Define tools&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setRequestHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tools/list&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;tools&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;get_products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;List products from the Shopify store with optional filters&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;inputSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;object&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Max products to return (default 10)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
          &lt;span class="na"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;enum&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;active&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;draft&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;archived&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="c1"&gt;// ... 15 more tools&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;}));&lt;/span&gt;

&lt;span class="c1"&gt;// Handle tool calls&lt;/span&gt;
&lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;setRequestHandler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tools/call&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;get_products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;products&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;shopifyClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;products&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;products&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="c1"&gt;// ... handle other tools&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Start server&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;transport&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;StdioServerTransport&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;server&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;transport&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  My 2 MCP Servers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Shopify Store MCP (16 Tools)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Products: list, get, create, update, delete&lt;/li&gt;
&lt;li&gt;Orders: list, get, create, fulfill, cancel&lt;/li&gt;
&lt;li&gt;Inventory: get levels, adjust quantities&lt;/li&gt;
&lt;li&gt;Customers: list, get, create, search&lt;/li&gt;
&lt;li&gt;Analytics: get order stats, revenue summaries&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Google Sheets MCP (14 Tools)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Spreadsheets: create, list, get&lt;/li&gt;
&lt;li&gt;Data: read range, write range, append rows, clear range&lt;/li&gt;
&lt;li&gt;Sheets: add sheet, delete sheet, rename&lt;/li&gt;
&lt;li&gt;Formatting: set column widths, merge cells&lt;/li&gt;
&lt;li&gt;Search: find values across sheets&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What Makes a Good MCP Server
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Clear Tool Descriptions
&lt;/h3&gt;

&lt;p&gt;AI agents read your tool descriptions to decide when to use them. Be specific:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Bad&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Gets data"&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Good&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"List products from the Shopify store. Returns product title, price, inventory quantity, and status. Supports filtering by status (active/draft/archived) and pagination with limit parameter."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Defensive Error Handling
&lt;/h3&gt;

&lt;p&gt;AI agents will pass unexpected inputs. Handle everything:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;update_product&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error: productId is required&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;shopifyClient&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`products/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;productId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;args&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;content&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;text&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;}]&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Reasonable Defaults
&lt;/h3&gt;

&lt;p&gt;Don't require parameters that have obvious defaults:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;properties&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;limit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;number&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Max results (default: 10)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="nx"&gt;sortBy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nl"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;description&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Sort field (default: created_at)&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;created_at&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Monetization
&lt;/h2&gt;

&lt;p&gt;MCP servers have multiple revenue paths:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Channel&lt;/th&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Potential&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;npm (free)&lt;/td&gt;
&lt;td&gt;Lead generation&lt;/td&gt;
&lt;td&gt;Credibility + GitHub stars&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCPize&lt;/td&gt;
&lt;td&gt;Per-call (85% share)&lt;/td&gt;
&lt;td&gt;$100-$10K/mo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cursor Marketplace&lt;/td&gt;
&lt;td&gt;Free (visibility)&lt;/td&gt;
&lt;td&gt;User acquisition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Freelance&lt;/td&gt;
&lt;td&gt;Custom MCP dev&lt;/td&gt;
&lt;td&gt;$500-$5,000/project&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fiverr/Upwork&lt;/td&gt;
&lt;td&gt;MCP gigs&lt;/td&gt;
&lt;td&gt;$95-$500/gig&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The market is early: MCP downloads are up 85% month-over-month, but less than 5% of servers are monetized. There's a window for early movers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Pick a business tool your clients use (CRM, accounting, project management)&lt;/li&gt;
&lt;li&gt;Use the &lt;code&gt;@modelcontextprotocol/sdk&lt;/code&gt; npm package&lt;/li&gt;
&lt;li&gt;Start with 3-5 tools that cover the most common operations&lt;/li&gt;
&lt;li&gt;Test with Claude Desktop or Cursor&lt;/li&gt;
&lt;li&gt;Publish to npm and submit to MCP directories&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The MCP ecosystem is growing fast. The developers who build useful servers now will own the distribution when the market matures.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I build MCP servers and AI automation systems. Check out my [Shopify MCP Server][GITHUB_LINK] and [Google Sheets MCP Server][GITHUB_LINK_2] on GitHub.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>tutorial</category>
      <category>typescript</category>
    </item>
    <item>
      <title>How I Built 20 AI Automation Templates That Actually Work in Production</title>
      <dc:creator>KrisYing</dc:creator>
      <pubDate>Wed, 11 Mar 2026 22:21:59 +0000</pubDate>
      <link>https://forem.com/krisying/how-i-built-20-ai-automation-templates-that-actually-work-in-production-3kne</link>
      <guid>https://forem.com/krisying/how-i-built-20-ai-automation-templates-that-actually-work-in-production-3kne</guid>
      <description>&lt;h1&gt;
  
  
  How I Built 20 AI Automation Templates That Actually Work in Production
&lt;/h1&gt;

&lt;p&gt;I spent the last month building 20 n8n workflow templates that integrate AI into real business processes. Not demos. Not "hello world" chatbots. Production systems that handle real data, fail gracefully, and run 24/7.&lt;/p&gt;

&lt;p&gt;Here's what I learned about building AI automations that people actually pay for.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with Most AI Automations
&lt;/h2&gt;

&lt;p&gt;90% of AI automation tutorials show you this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Connect to ChatGPT&lt;/li&gt;
&lt;li&gt;Send a prompt&lt;/li&gt;
&lt;li&gt;Get a response&lt;/li&gt;
&lt;li&gt;Done!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's a toy. Production AI automation needs:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Input validation&lt;/strong&gt; (garbage in, garbage out)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured output parsing&lt;/strong&gt; (not raw text)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error handling&lt;/strong&gt; (APIs fail, LLMs hallucinate)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conditional routing&lt;/strong&gt; (different responses need different actions)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Downstream integrations&lt;/strong&gt; (Slack alerts, spreadsheet logging, email notifications)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My Template Architecture
&lt;/h2&gt;

&lt;p&gt;Every template follows the same proven pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Trigger → Validate → AI Process → Parse JSON → Route → Action → Log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. Trigger (Webhook or Schedule)
&lt;/h3&gt;

&lt;p&gt;Most templates use a Webhook trigger for on-demand processing. One template (Upwork Job Hunter) uses a Schedule Trigger to run every 4 hours automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Validate Input
&lt;/h3&gt;

&lt;p&gt;Before sending anything to an AI, validate the input. Check required fields, sanitize text, reject empty payloads. This prevents wasting API credits on bad requests.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. AI Processing (HTTP Request Node)
&lt;/h3&gt;

&lt;p&gt;I use n8n's HTTP Request node to call any OpenAI-compatible API:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"deepseek-chat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"messages"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"system"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"You are a [specialist]. Output valid JSON only."&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"role"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"user"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Process this: {{$json.inputData}}"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"temperature"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;0.3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key decisions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Low temperature (0.3)&lt;/strong&gt; for structured tasks, higher (0.7) for creative tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;System prompt demands JSON output&lt;/strong&gt; — no markdown, no explanations&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DeepSeek&lt;/strong&gt; for cost optimization ($0.001/request vs $0.01+ for GPT-4)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Parse JSON Response
&lt;/h3&gt;

&lt;p&gt;The AI returns a JSON string inside &lt;code&gt;choices[0].message.content&lt;/code&gt;. A Code node extracts and parses it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;first&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;choices&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cleaned&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/``&lt;/span&gt;&lt;span class="err"&gt;`
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;endraw&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="err"&gt;\&lt;/span&gt;&lt;span class="nx"&gt;n&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;&lt;span class="sr"&gt;/g, ''&lt;/span&gt;&lt;span class="se"&gt;)&lt;/span&gt;&lt;span class="sr"&gt;.replace&lt;/span&gt;&lt;span class="se"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="s2"&gt;```\n?/g, '');
return [{ json: JSON.parse(cleaned) }];
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Conditional Routing (IF Node)
&lt;/h3&gt;

&lt;p&gt;Route based on AI output:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lead score &amp;gt;= 70? → Hot lead notification&lt;/li&gt;
&lt;li&gt;Resume score &amp;gt;= 80? → Qualified candidate alert&lt;/li&gt;
&lt;li&gt;Sentiment negative? → Escalate to human&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  6. Actions
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Slack&lt;/strong&gt;: Alert team members in real-time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Sheets&lt;/strong&gt;: Log every result for analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email&lt;/strong&gt;: Send formatted reports&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhook&lt;/strong&gt;: Trigger downstream systems&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  5 Templates That Sell Best
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. AI Lead Scorer
&lt;/h3&gt;

&lt;p&gt;Input: Lead data (name, company, interaction history)&lt;br&gt;
Output: Score 1-100, recommended action, talking points&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it sells:&lt;/strong&gt; Every business has leads. Nobody has time to qualify them all manually. This saves 5-8 hours/week per salesperson.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. AI Content Repurposer
&lt;/h3&gt;

&lt;p&gt;Input: Blog post or article&lt;br&gt;
Output: 5 tweets, LinkedIn post, newsletter intro, video script outline&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it sells:&lt;/strong&gt; Content teams create one piece and need it everywhere. This turns 1 article into 8+ pieces of content automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. AI Customer Support Router
&lt;/h3&gt;

&lt;p&gt;Input: Customer message&lt;br&gt;
Output: Category, priority, sentiment, suggested response, routing decision&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it sells:&lt;/strong&gt; Reduces first-response time by 60%. Routes urgent issues to humans, handles FAQ automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. AI Resume Screener
&lt;/h3&gt;

&lt;p&gt;Input: Resume text + job requirements&lt;br&gt;
Output: Technical fit score, experience score, interview questions, hire/pass recommendation&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it sells:&lt;/strong&gt; HR teams screening 100+ resumes per role. This reduces screening time from 8 hours to 30 minutes.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Multi-Agent Research Pipeline
&lt;/h3&gt;

&lt;p&gt;Input: Research topic&lt;br&gt;
Output: Synthesized report from 3 parallel AI "analysts"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why it sells:&lt;/strong&gt; Most complex template (uses n8n's Merge node for parallel execution). Produces research reports that would take a human 4-6 hours in under 2 minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monetization Strategy
&lt;/h2&gt;

&lt;p&gt;I sell templates in 3 tiers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Individual templates&lt;/strong&gt;: $19-$29 each&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Category bundle&lt;/strong&gt; (5 templates): $49&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Complete pack&lt;/strong&gt; (20 templates): $99-$129&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The complete pack has the best conversion rate because the per-template cost drops to $5-6.&lt;/p&gt;

&lt;h3&gt;
  
  
  Where to Sell
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gumroad&lt;/strong&gt; (easiest setup, 10% fee)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Neura Market&lt;/strong&gt; (90% seller share — best rate!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;n8n community&lt;/strong&gt; (free exposure + credibility)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ComeUp&lt;/strong&gt; ($1 flat commission!)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Structured output is everything.&lt;/strong&gt; Force JSON output in system prompts. Parse defensively. Have fallbacks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;DeepSeek is 10x cheaper&lt;/strong&gt; than GPT-4 for most structured tasks with comparable quality. Use it for production, save OpenAI for complex reasoning.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Demo mode matters.&lt;/strong&gt; Every template has a demo mode that returns realistic sample data when no API key is configured. This lets buyers test the workflow before connecting their own API.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Error handling is the difference&lt;/strong&gt; between a template someone uses once and one they run in production. Every template handles API failures, empty responses, and malformed JSON.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Documentation sells templates.&lt;/strong&gt; Clear descriptions of every node, what it does, and how to customize it. People pay for the workflow AND the knowledge.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Get Started
&lt;/h2&gt;

&lt;p&gt;If you want to build sellable n8n templates:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pick a business process people complain about&lt;/li&gt;
&lt;li&gt;Build the automation with the 7-node pattern above&lt;/li&gt;
&lt;li&gt;Add demo mode for easy testing&lt;/li&gt;
&lt;li&gt;Write clear documentation&lt;/li&gt;
&lt;li&gt;List on 2-3 marketplaces&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The AI automation market is growing 25-30% annually. There's room for everyone.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm building AI automation systems for businesses. If you need custom n8n workflows, MCP servers, or AI agents, check out my [full template pack on Gumroad][GUMROAD_LINK].&lt;/em&gt;&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>automation</category>
      <category>ai</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Multi-Agent AI in n8n: 3 Parallel Agents for Competitive Intelligence</title>
      <dc:creator>KrisYing</dc:creator>
      <pubDate>Wed, 11 Mar 2026 22:16:16 +0000</pubDate>
      <link>https://forem.com/krisying/multi-agent-ai-in-n8n-3-parallel-agents-for-competitive-intelligence-3p4o</link>
      <guid>https://forem.com/krisying/multi-agent-ai-in-n8n-3-parallel-agents-for-competitive-intelligence-3p4o</guid>
      <description>&lt;p&gt;Agentic AI is the hottest topic in software development right now. Every week there is a new framework — LangChain, CrewAI, AutoGen, LlamaIndex Workflows — promising to make multi-agent systems accessible. But if you are already using n8n for automation, you can build a surprisingly capable multi-agent pipeline today with no new dependencies, no Python environments, and no infrastructure changes.&lt;/p&gt;

&lt;p&gt;This article walks through a competitive intelligence pipeline that spins up three specialized AI agents, runs two of them in parallel, then synthesizes their outputs into a structured research report. The whole thing triggers from a webhook and logs results to Google Sheets.&lt;/p&gt;




&lt;h2&gt;
  
  
  Section 1: The Architecture
&lt;/h2&gt;

&lt;p&gt;Here is the full workflow at a glance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Webhook Trigger
    └── Validate Request (Code node)
            ├── Agent 1: Market Analyst ──────────┐
            │                                      ├── Merge Node (waitForAll)
            └── Agent 2: Competitor Analyst ───────┘
                                                        └── Code Node: Merge Results
                                                                └── Agent 3: Strategy Synthesizer
                                                                        └── Respond to Webhook
                                                                                └── Google Sheets Log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The critical design decision is that Agent 1 and Agent 2 run &lt;strong&gt;in parallel&lt;/strong&gt;. They receive the same input — a company name and market context — but each has a distinct system prompt and produces a different slice of analysis. Agent 3 only runs after both upstream agents have finished, consuming both outputs to produce an executive synthesis.&lt;/p&gt;

&lt;p&gt;This maps closely to the "fan-out / fan-in" pattern you would implement in LangChain or a task queue, but n8n's visual canvas makes the data flow explicit and debuggable without writing orchestration code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Section 2: The Three Agents
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Agent 1 — Market Analyst
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;System prompt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a senior market research analyst. Given a company name and industry context,
produce a structured market analysis covering:
1. Market overview and definition
2. Total addressable market (TAM) with size and growth rate
3. Key macro trends (3-5 bullet points)
4. Primary customer segments with pain points
5. Regulatory or technology tailwinds/headwinds

Be specific. Use numbers where available. Flag assumptions clearly.
Output valid JSON matching the schema provided.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output schema:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"market_overview"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tam_estimate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"growth_rate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"key_trends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"customer_segments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"pain_points"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This agent is good at breadth. It sets the stage: is this a crowded space or a greenfield? Is the market growing or contracting? Downstream agents and the final synthesizer reference these findings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent 2 — Competitor Analyst
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;System prompt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a competitive intelligence specialist. Given a target company and market,
produce a structured competitor analysis covering:
1. Top 3-5 direct competitors with brief profiles
2. Competitive positioning matrix (price vs. feature depth)
3. Identified gaps in current market offerings
4. Specific strategies for winning against each competitor

Focus on actionable intelligence, not generic descriptions.
Output valid JSON matching the schema provided.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output schema:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"competitors"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"strengths"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"weaknesses"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"positioning_matrix"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"market_gaps"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"win_strategies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"competitor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"tactics"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running this in parallel with the Market Analyst cuts total latency roughly in half. On DeepSeek V3, each agent call takes around 4-8 seconds. Sequential execution would stack those delays; parallel execution caps them at the slower of the two.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent 3 — Strategy Synthesizer
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;System prompt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a strategy consultant preparing an executive briefing. You will receive:
- A market analysis (from Market Analyst)
- A competitor analysis (from Competitor Analyst)

Synthesize these into a concise strategic report with:
1. Executive summary (3 sentences max)
2. Top 3 strategic recommendations with rationale
3. Quick wins achievable in 30 days
4. KPIs to track success over 90 days

Cross-reference findings from both inputs. Surface non-obvious connections.
Output valid JSON matching the schema provided.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agent 3 is where the multi-agent design pays off. A single-agent approach would have to hold both the market context and competitor detail in its reasoning simultaneously, which introduces more hallucination surface area. By letting two specialist agents do the groundwork first, the synthesizer operates on already-structured, validated JSON rather than raw prompts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Section 3: The Parallel Execution Trick
&lt;/h2&gt;

&lt;p&gt;This is the key insight most n8n tutorials skip over.&lt;/p&gt;

&lt;p&gt;When you split workflow execution across two branches (by connecting one node's output to two different downstream nodes), n8n does not automatically wait for both branches to finish before continuing. It will fire each branch and move on. If you naively connect both agent outputs to a single downstream node, you will get two separate executions of that downstream node — one for each branch completing.&lt;/p&gt;

&lt;p&gt;The fix is the &lt;strong&gt;Merge node&lt;/strong&gt;, configured like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"waitForAll"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"outputType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"all"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"n8n-nodes-base.merge"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"typeVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With &lt;code&gt;mode: "waitForAll"&lt;/code&gt;, the Merge node holds execution until &lt;strong&gt;all&lt;/strong&gt; input branches have produced at least one item. With &lt;code&gt;outputType: "all"&lt;/code&gt;, it passes through every item from every branch as a combined array into the next node.&lt;/p&gt;

&lt;p&gt;After the Merge node, a small Code node restructures the data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Merge node outputs items from both branches in the items array&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;marketAnalysis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;market_analyst&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)?.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;competitorAnalysis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;competitor_analyst&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)?.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
  &lt;span class="na"&gt;json&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;market&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;marketAnalysis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;competitors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;competitorAnalysis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives Agent 3 a clean, merged input object rather than a raw array. The agent sees one structured payload and can reference both analyses by key.&lt;/p&gt;

&lt;p&gt;One practical note: tag each agent's output with its identity (&lt;code&gt;agent: 'market_analyst'&lt;/code&gt;) in the AI Agent node's output mapping. This makes the downstream Code node's &lt;code&gt;find()&lt;/code&gt; lookup reliable regardless of which branch finishes first.&lt;/p&gt;




&lt;h2&gt;
  
  
  Section 4: Cost Analysis
&lt;/h2&gt;

&lt;p&gt;Here is what this pipeline costs to run per query with &lt;strong&gt;DeepSeek V3&lt;/strong&gt; as the backend model:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Tokens (approx.)&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Agent 1 — Market Analyst&lt;/td&gt;
&lt;td&gt;~800 in / ~600 out&lt;/td&gt;
&lt;td&gt;$0.0009&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent 2 — Competitor Analyst&lt;/td&gt;
&lt;td&gt;~800 in / ~700 out&lt;/td&gt;
&lt;td&gt;$0.0010&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent 3 — Strategy Synthesizer&lt;/td&gt;
&lt;td&gt;~1,800 in / ~900 out&lt;/td&gt;
&lt;td&gt;$0.0011&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total per query&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~5,600 tokens&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$0.003&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At $0.003 per report, you can run 333 research queries for $1.&lt;/p&gt;

&lt;p&gt;Compare that to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hiring a research analyst&lt;/strong&gt;: $50-100/hr, 2-4 hours per report = $100-400 per report&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dedicated competitive intelligence platforms&lt;/strong&gt; (Crayon, Klue, Kompyte): $500-2,000/month&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perplexity Pro or similar AI research tools&lt;/strong&gt;: $20/month but no workflow integration, no structured output, no Google Sheets logging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The n8n pipeline produces structured JSON that flows directly into downstream automations — Notion databases, Slack digests, email reports, CRM updates. That integration layer is where the real productivity gain lives, not just in the raw AI output.&lt;/p&gt;

&lt;p&gt;For teams running competitive intelligence on 10-20 companies per week, this pipeline replaces a meaningful portion of manual analyst time at a cost that rounds to zero.&lt;/p&gt;




&lt;h2&gt;
  
  
  Putting It Together
&lt;/h2&gt;

&lt;p&gt;The workflow handles a few edge cases worth noting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Validate Request node&lt;/strong&gt;: checks that the incoming webhook payload has a non-empty &lt;code&gt;query&lt;/code&gt; field and a &lt;code&gt;company&lt;/code&gt; field before wasting tokens on a bad request. Returns a 400 with an error message if validation fails.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Sheets logging&lt;/strong&gt;: after the final response is sent, a separate branch logs the query, timestamp, and a summary of the output. This builds a historical record of all research runs without blocking the response.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error handling&lt;/strong&gt;: each AI Agent node has a fallback branch that catches timeouts or API errors and returns a structured error payload rather than a raw exception. The Merge node handles partial failures gracefully because the Code node checks for undefined before accessing nested fields.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The entire workflow is 12 nodes. Import time from JSON is under 30 seconds. Adding a new research agent — say, a Patent Analyst or a Pricing Analyst — is a matter of duplicating an existing agent node, updating the system prompt, and adding another input connector to the Merge node.&lt;/p&gt;




&lt;h2&gt;
  
  
  Get the Workflow
&lt;/h2&gt;

&lt;p&gt;This workflow is part of my &lt;strong&gt;16-template AI automation pack&lt;/strong&gt; covering research pipelines, lead enrichment, content generation, and Slack/email digests — all built on n8n with DeepSeek or OpenAI as the backend.&lt;/p&gt;

&lt;p&gt;Get the importable JSON files at &lt;strong&gt;[GUMROAD_LINK]&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full-stack developer specializing in AI automation, MCP servers, and Claude Code integrations. I build production workflows that replace manual research and content tasks with structured, auditable AI pipelines.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>n8n</category>
      <category>automation</category>
    </item>
    <item>
      <title>Building an AI Voice Agent Pipeline with n8n — Analyze Calls, Score Leads, Alert in Real-Time</title>
      <dc:creator>KrisYing</dc:creator>
      <pubDate>Wed, 11 Mar 2026 22:16:10 +0000</pubDate>
      <link>https://forem.com/krisying/building-an-ai-voice-agent-pipeline-with-n8n-analyze-calls-score-leads-alert-in-real-time-38i2</link>
      <guid>https://forem.com/krisying/building-an-ai-voice-agent-pipeline-with-n8n-analyze-calls-score-leads-alert-in-real-time-38i2</guid>
      <description>&lt;p&gt;Voice AI is having a moment. Upwork reported a &lt;strong&gt;+329% year-over-year surge&lt;/strong&gt; in voice agent project postings in early 2026. But here's what most tutorials miss: the call itself is only half the story. What happens &lt;em&gt;after&lt;/em&gt; the call — extracting intent, scoring the lead, alerting your sales team, logging to CRM — that's where the business value actually lives.&lt;/p&gt;

&lt;p&gt;This article walks through a production-grade post-call intelligence pipeline built entirely with n8n. No custom infrastructure, no glue code — just a workflow you can import and activate in minutes.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Architecture
&lt;/h2&gt;

&lt;p&gt;The pipeline connects five stages in a single n8n workflow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[Vapi / Retell / Synthflow]
        ↓  webhook (call ended event)
[n8n Webhook Node]
        ↓  raw transcript + metadata
[AI Analysis Node — DeepSeek/OpenAI]
        ↓  structured JSON: intent, score, sentiment
[IF Node — leadScore &amp;gt;= 7 AND qualifiedLead = true]
    ↓ YES                        ↓ NO
[Slack Alert]              [Low-priority log]
        ↓
[Google Sheets — CRM Log]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Compatible voice platforms:&lt;/strong&gt; Vapi, Retell AI, Synthflow, Bland.ai — any platform that sends a webhook on call completion with the transcript in the payload.&lt;/p&gt;

&lt;p&gt;The webhook payload typically looks like this (Vapi example):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"call-ended"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"call"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"call_abc123"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"duration"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;187&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"transcript"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Agent: Hi, thanks for calling Apex Realty...&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;Caller: Yes, I'm looking to buy..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"phoneNumber"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"+14155551234"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"metadata"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"campaign"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"google-ads-q1"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Section 1: Receiving and Parsing the Call Event
&lt;/h2&gt;

&lt;p&gt;The n8n &lt;strong&gt;Webhook&lt;/strong&gt; node listens at a path like &lt;code&gt;/voice-agent/call-ended&lt;/code&gt;. Set it to POST, respond immediately with &lt;code&gt;200 OK&lt;/code&gt; (don't make the voice platform wait), then pass the payload downstream.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;Code&lt;/strong&gt; node extracts the fields you need before hitting the AI:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;call&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;$input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
  &lt;span class="na"&gt;json&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;callId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;duration&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;transcript&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;transcript&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;phoneNumber&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;phoneNumber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;campaign&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;campaign&lt;/span&gt; &lt;span class="o"&gt;??&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;unknown&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Section 2: AI Transcript Analysis — The Intelligence Layer
&lt;/h2&gt;

&lt;p&gt;This is where the real work happens. An &lt;strong&gt;HTTP Request&lt;/strong&gt; node (or the native OpenAI node) sends the transcript to your model with a structured extraction prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;You are a sales intelligence analyst. Analyze this call transcript and return ONLY valid JSON.

Extract:
&lt;span class="p"&gt;-&lt;/span&gt; callerIntent: one of [buying, selling, renting, refinancing, pricing_inquiry, scheduling, complaint, general_inquiry]
&lt;span class="p"&gt;-&lt;/span&gt; sentiment: one of [positive, neutral, negative]
&lt;span class="p"&gt;-&lt;/span&gt; urgency: one of [immediate, within_month, exploring, unknown]
&lt;span class="p"&gt;-&lt;/span&gt; leadScore: integer 1-10 (10 = ready to buy/commit now)
&lt;span class="p"&gt;-&lt;/span&gt; qualifiedLead: boolean (true if they have budget, authority, need, and timeline)
&lt;span class="p"&gt;-&lt;/span&gt; actionItems: array of strings (what the sales team should do next)
&lt;span class="p"&gt;-&lt;/span&gt; summary: one-sentence summary of the call

Transcript:
{{transcript}}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model returns clean JSON like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"callerIntent"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"buying"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"sentiment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"positive"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"urgency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"within_month"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"leadScore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"qualifiedLead"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"actionItems"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Send 3-bedroom listings in Maplewood under $650K"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="s2"&gt;"Schedule follow-up call for Thursday afternoon"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"summary"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Caller is pre-approved for $650K, actively searching, prefers Maplewood area."&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The 8 callerIntent types&lt;/strong&gt; were tuned across hundreds of real estate and SaaS sales calls. Getting intent classification right is critical — it determines downstream routing, not just the lead score.&lt;/p&gt;




&lt;h2&gt;
  
  
  Section 3: Routing Logic — The IF Node
&lt;/h2&gt;

&lt;p&gt;n8n's &lt;strong&gt;IF&lt;/strong&gt; node evaluates two conditions with AND logic:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Condition&lt;/th&gt;
&lt;th&gt;Operator&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{{ $json.leadScore }}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Greater than or equal to&lt;/td&gt;
&lt;td&gt;&lt;code&gt;7&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;{{ $json.qualifiedLead }}&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Equal to&lt;/td&gt;
&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;True branch&lt;/strong&gt; (hot lead): Triggers the Slack alert immediately.&lt;br&gt;
&lt;strong&gt;False branch&lt;/strong&gt; (cold/warm lead): Writes to Google Sheets for later follow-up without pinging anyone.&lt;/p&gt;

&lt;p&gt;The Slack message template:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight handlebars"&gt;&lt;code&gt;*Hot Lead Alert* — Score: &lt;span class="k"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;$json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;leadScore&lt;/span&gt; &lt;span class="k"&gt;}}&lt;/span&gt;/10
Phone: &lt;span class="k"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;$json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;phoneNumber&lt;/span&gt; &lt;span class="k"&gt;}}&lt;/span&gt; | Campaign: &lt;span class="k"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;$json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;campaign&lt;/span&gt; &lt;span class="k"&gt;}}&lt;/span&gt;
Intent: &lt;span class="k"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;$json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;callerIntent&lt;/span&gt; &lt;span class="k"&gt;}}&lt;/span&gt; | Urgency: &lt;span class="k"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;$json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;urgency&lt;/span&gt; &lt;span class="k"&gt;}}&lt;/span&gt;
Summary: &lt;span class="k"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;$json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;summary&lt;/span&gt; &lt;span class="k"&gt;}}&lt;/span&gt;
Next steps: &lt;span class="k"&gt;{{&lt;/span&gt; &lt;span class="nv"&gt;$json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;actionItems&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nv"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;', '&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;}}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sales reps get a fully contextualized brief in Slack within seconds of the call ending — no listening to recordings, no manual CRM entry.&lt;/p&gt;




&lt;h2&gt;
  
  
  Section 4: Why DeepSeek Makes This Viable at Scale
&lt;/h2&gt;

&lt;p&gt;Running AI analysis on every inbound call has a cost problem at OpenAI prices:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Input cost per 1M tokens&lt;/th&gt;
&lt;th&gt;10,000 calls/month (~500 tokens avg)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-4o&lt;/td&gt;
&lt;td&gt;$5.00&lt;/td&gt;
&lt;td&gt;~$25/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-4 Turbo&lt;/td&gt;
&lt;td&gt;$10.00&lt;/td&gt;
&lt;td&gt;~$50/month&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DeepSeek V3&lt;/td&gt;
&lt;td&gt;$0.14&lt;/td&gt;
&lt;td&gt;~$0.70/month&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a real estate agency handling 300 calls/day, DeepSeek cuts AI analysis costs from &lt;strong&gt;$450/month to under $13/month&lt;/strong&gt; with comparable extraction quality on structured tasks like this. The prompt above works without modification on any OpenAI-compatible endpoint — just swap the base URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;Base&lt;/span&gt; &lt;span class="n"&gt;URL&lt;/span&gt;: &lt;span class="n"&gt;https&lt;/span&gt;://&lt;span class="n"&gt;api&lt;/span&gt;.&lt;span class="n"&gt;deepseek&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;/&lt;span class="n"&gt;v1&lt;/span&gt;
&lt;span class="n"&gt;Model&lt;/span&gt;: &lt;span class="n"&gt;deepseek&lt;/span&gt;-&lt;span class="n"&gt;chat&lt;/span&gt;
&lt;span class="n"&gt;API&lt;/span&gt; &lt;span class="n"&gt;Key&lt;/span&gt;: &lt;span class="n"&gt;your&lt;/span&gt;-&lt;span class="n"&gt;deepseek&lt;/span&gt;-&lt;span class="n"&gt;key&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Section 5: Real-World Use Cases
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Real estate agencies&lt;/strong&gt; — Score buyer/seller intent, auto-assign leads to agents by territory, trigger listing alerts to hot buyers within minutes of the call.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SaaS sales teams&lt;/strong&gt; — Detect trial-to-paid signals, flag churn risk calls for CS intervention, log MEDDIC qualification fields to HubSpot automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Healthcare appointment booking&lt;/strong&gt; — Extract appointment type, insurance mentioned, urgency level. Route to the correct specialist's calendar without front-desk intervention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Legal intake&lt;/strong&gt; — Classify case type (personal injury, family law, criminal), assess case strength signals, prioritize callbacks for high-value case types.&lt;/p&gt;

&lt;p&gt;In each scenario the workflow is identical — only the callerIntent taxonomy and routing rules change. That's the composability advantage of building in n8n rather than hard-coding a custom integration.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Google Sheets CRM Log
&lt;/h2&gt;

&lt;p&gt;Every call — hot or cold — gets logged to a Google Sheets row via the &lt;strong&gt;Google Sheets&lt;/strong&gt; node:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Column&lt;/th&gt;
&lt;th&gt;Source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Timestamp&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{ $now }}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Call ID&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{ $json.callId }}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phone&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{ $json.phoneNumber }}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duration (s)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{ $json.duration }}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Intent&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{ $json.callerIntent }}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Score&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{ $json.leadScore }}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Qualified&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{ $json.qualifiedLead }}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sentiment&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{ $json.sentiment }}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Urgency&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{ $json.urgency }}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Summary&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{ $json.summary }}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Campaign&lt;/td&gt;
&lt;td&gt;&lt;code&gt;{{ $json.campaign }}&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This gives you a queryable call intelligence database without touching any backend code. Filter by score, pivot by intent, chart conversion rates by campaign — all in Google Sheets.&lt;/p&gt;




&lt;h2&gt;
  
  
  Get the Production-Ready Template
&lt;/h2&gt;

&lt;p&gt;Building this from scratch takes a few hours of trial and error — prompt tuning, webhook debugging, IF node condition syntax, Sheets column mapping. I've already done that work.&lt;/p&gt;

&lt;p&gt;I've packaged this as a production-ready n8n JSON template you can import and activate in 5 minutes. It includes the full workflow, the tuned AI prompt, Slack message template, and a Google Sheets schema you can copy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Get it along with 15 other AI automation templates at [GUMROAD_LINK].&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The bundle includes templates for lead enrichment, competitor monitoring, support ticket triage, contract summarization, and more — all built with the same n8n + DeepSeek cost-efficient stack.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I build AI automation systems, MCP servers for Claude/Cursor integration, and custom agent pipelines. If you're looking to automate a business workflow or need a production-grade AI integration built fast, find me on Upwork or reach out directly.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tech stack I work with: n8n, Claude Code, MCP protocol, OpenAI/DeepSeek APIs, Node.js/TypeScript, Python.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 Get My Templates
&lt;/h2&gt;

&lt;p&gt;Want these templates ready to use? Check out my complete collection of&lt;br&gt;&lt;br&gt;
  &lt;strong&gt;25 production-ready n8n automation templates&lt;/strong&gt; — ready to deploy immediately.                                                              &lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://ko-fi.com/s/2be7e40d09" rel="noopener noreferrer"&gt;Get the n8n Templates Bundle ($10)&lt;/a&gt;&lt;/strong&gt;                                                                  &lt;/p&gt;

&lt;p&gt;Perfect for automation engineers, consultants, and anyone looking to accelerate their n8n projects with battle-tested workflows. &lt;/p&gt;

</description>
      <category>ai</category>
      <category>voiceagent</category>
      <category>n8n</category>
      <category>automation</category>
    </item>
    <item>
      <title>Multi-Agent AI in n8n: 3 Parallel Agents for Competitive Intelligence</title>
      <dc:creator>KrisYing</dc:creator>
      <pubDate>Wed, 11 Mar 2026 22:08:44 +0000</pubDate>
      <link>https://forem.com/krisying/multi-agent-ai-in-n8n-3-parallel-agents-for-competitive-intelligence-3hd4</link>
      <guid>https://forem.com/krisying/multi-agent-ai-in-n8n-3-parallel-agents-for-competitive-intelligence-3hd4</guid>
      <description>&lt;p&gt;Agentic AI is the hottest topic in software development right now. Every week there is a new framework — LangChain, CrewAI, AutoGen, LlamaIndex Workflows — promising to make multi-agent systems accessible. But if you are already using n8n for automation, you can build a surprisingly capable multi-agent pipeline today with no new dependencies, no Python environments, and no infrastructure changes.&lt;/p&gt;

&lt;p&gt;This article walks through a competitive intelligence pipeline that spins up three specialized AI agents, runs two of them in parallel, then synthesizes their outputs into a structured research report. The whole thing triggers from a webhook and logs results to Google Sheets.&lt;/p&gt;




&lt;h2&gt;
  
  
  Section 1: The Architecture
&lt;/h2&gt;

&lt;p&gt;Here is the full workflow at a glance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Webhook Trigger
    └── Validate Request (Code node)
            ├── Agent 1: Market Analyst ──────────┐
            │                                      ├── Merge Node (waitForAll)
            └── Agent 2: Competitor Analyst ───────┘
                                                        └── Code Node: Merge Results
                                                                └── Agent 3: Strategy Synthesizer
                                                                        └── Respond to Webhook
                                                                                └── Google Sheets Log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The critical design decision is that Agent 1 and Agent 2 run &lt;strong&gt;in parallel&lt;/strong&gt;. They receive the same input — a company name and market context — but each has a distinct system prompt and produces a different slice of analysis. Agent 3 only runs after both upstream agents have finished, consuming both outputs to produce an executive synthesis.&lt;/p&gt;

&lt;p&gt;This maps closely to the "fan-out / fan-in" pattern you would implement in LangChain or a task queue, but n8n's visual canvas makes the data flow explicit and debuggable without writing orchestration code.&lt;/p&gt;




&lt;h2&gt;
  
  
  Section 2: The Three Agents
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Agent 1 — Market Analyst
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;System prompt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a senior market research analyst. Given a company name and industry context,
produce a structured market analysis covering:
1. Market overview and definition
2. Total addressable market (TAM) with size and growth rate
3. Key macro trends (3-5 bullet points)
4. Primary customer segments with pain points
5. Regulatory or technology tailwinds/headwinds

Be specific. Use numbers where available. Flag assumptions clearly.
Output valid JSON matching the schema provided.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output schema:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"market_overview"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"tam_estimate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"growth_rate"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"key_trends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"customer_segments"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"pain_points"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This agent is good at breadth. It sets the stage: is this a crowded space or a greenfield? Is the market growing or contracting? Downstream agents and the final synthesizer reference these findings.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent 2 — Competitor Analyst
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;System prompt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a competitive intelligence specialist. Given a target company and market,
produce a structured competitor analysis covering:
1. Top 3-5 direct competitors with brief profiles
2. Competitive positioning matrix (price vs. feature depth)
3. Identified gaps in current market offerings
4. Specific strategies for winning against each competitor

Focus on actionable intelligence, not generic descriptions.
Output valid JSON matching the schema provided.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Output schema:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"competitors"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"strengths"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"weaknesses"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"positioning_matrix"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"market_gaps"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"win_strategies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"competitor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"tactics"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"string"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Running this in parallel with the Market Analyst cuts total latency roughly in half. On DeepSeek V3, each agent call takes around 4-8 seconds. Sequential execution would stack those delays; parallel execution caps them at the slower of the two.&lt;/p&gt;

&lt;h3&gt;
  
  
  Agent 3 — Strategy Synthesizer
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;System prompt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;You are a strategy consultant preparing an executive briefing. You will receive:
- A market analysis (from Market Analyst)
- A competitor analysis (from Competitor Analyst)

Synthesize these into a concise strategic report with:
1. Executive summary (3 sentences max)
2. Top 3 strategic recommendations with rationale
3. Quick wins achievable in 30 days
4. KPIs to track success over 90 days

Cross-reference findings from both inputs. Surface non-obvious connections.
Output valid JSON matching the schema provided.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agent 3 is where the multi-agent design pays off. A single-agent approach would have to hold both the market context and competitor detail in its reasoning simultaneously, which introduces more hallucination surface area. By letting two specialist agents do the groundwork first, the synthesizer operates on already-structured, validated JSON rather than raw prompts.&lt;/p&gt;




&lt;h2&gt;
  
  
  Section 3: The Parallel Execution Trick
&lt;/h2&gt;

&lt;p&gt;This is the key insight most n8n tutorials skip over.&lt;/p&gt;

&lt;p&gt;When you split workflow execution across two branches (by connecting one node's output to two different downstream nodes), n8n does not automatically wait for both branches to finish before continuing. It will fire each branch and move on. If you naively connect both agent outputs to a single downstream node, you will get two separate executions of that downstream node — one for each branch completing.&lt;/p&gt;

&lt;p&gt;The fix is the &lt;strong&gt;Merge node&lt;/strong&gt;, configured like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parameters"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"mode"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"waitForAll"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"outputType"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"all"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"n8n-nodes-base.merge"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"typeVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With &lt;code&gt;mode: "waitForAll"&lt;/code&gt;, the Merge node holds execution until &lt;strong&gt;all&lt;/strong&gt; input branches have produced at least one item. With &lt;code&gt;outputType: "all"&lt;/code&gt;, it passes through every item from every branch as a combined array into the next node.&lt;/p&gt;

&lt;p&gt;After the Merge node, a small Code node restructures the data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Merge node outputs items from both branches in the items array&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;marketAnalysis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;market_analyst&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)?.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;competitorAnalysis&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;i&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;competitor_analyst&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)?.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
  &lt;span class="na"&gt;json&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;market&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;marketAnalysis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;competitors&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;competitorAnalysis&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;query&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;items&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives Agent 3 a clean, merged input object rather than a raw array. The agent sees one structured payload and can reference both analyses by key.&lt;/p&gt;

&lt;p&gt;One practical note: tag each agent's output with its identity (&lt;code&gt;agent: 'market_analyst'&lt;/code&gt;) in the AI Agent node's output mapping. This makes the downstream Code node's &lt;code&gt;find()&lt;/code&gt; lookup reliable regardless of which branch finishes first.&lt;/p&gt;




&lt;h2&gt;
  
  
  Section 4: Cost Analysis
&lt;/h2&gt;

&lt;p&gt;Here is what this pipeline costs to run per query with &lt;strong&gt;DeepSeek V3&lt;/strong&gt; as the backend model:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Tokens (approx.)&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Agent 1 — Market Analyst&lt;/td&gt;
&lt;td&gt;~800 in / ~600 out&lt;/td&gt;
&lt;td&gt;$0.0009&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent 2 — Competitor Analyst&lt;/td&gt;
&lt;td&gt;~800 in / ~700 out&lt;/td&gt;
&lt;td&gt;$0.0010&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent 3 — Strategy Synthesizer&lt;/td&gt;
&lt;td&gt;~1,800 in / ~900 out&lt;/td&gt;
&lt;td&gt;$0.0011&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total per query&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~5,600 tokens&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$0.003&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;At $0.003 per report, you can run 333 research queries for $1.&lt;/p&gt;

&lt;p&gt;Compare that to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hiring a research analyst&lt;/strong&gt;: $50-100/hr, 2-4 hours per report = $100-400 per report&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dedicated competitive intelligence platforms&lt;/strong&gt; (Crayon, Klue, Kompyte): $500-2,000/month&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Perplexity Pro or similar AI research tools&lt;/strong&gt;: $20/month but no workflow integration, no structured output, no Google Sheets logging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The n8n pipeline produces structured JSON that flows directly into downstream automations — Notion databases, Slack digests, email reports, CRM updates. That integration layer is where the real productivity gain lives, not just in the raw AI output.&lt;/p&gt;

&lt;p&gt;For teams running competitive intelligence on 10-20 companies per week, this pipeline replaces a meaningful portion of manual analyst time at a cost that rounds to zero.&lt;/p&gt;




&lt;h2&gt;
  
  
  Putting It Together
&lt;/h2&gt;

&lt;p&gt;The workflow handles a few edge cases worth noting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Validate Request node&lt;/strong&gt;: checks that the incoming webhook payload has a non-empty &lt;code&gt;query&lt;/code&gt; field and a &lt;code&gt;company&lt;/code&gt; field before wasting tokens on a bad request. Returns a 400 with an error message if validation fails.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google Sheets logging&lt;/strong&gt;: after the final response is sent, a separate branch logs the query, timestamp, and a summary of the output. This builds a historical record of all research runs without blocking the response.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Error handling&lt;/strong&gt;: each AI Agent node has a fallback branch that catches timeouts or API errors and returns a structured error payload rather than a raw exception. The Merge node handles partial failures gracefully because the Code node checks for undefined before accessing nested fields.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The entire workflow is 12 nodes. Import time from JSON is under 30 seconds. Adding a new research agent — say, a Patent Analyst or a Pricing Analyst — is a matter of duplicating an existing agent node, updating the system prompt, and adding another input connector to the Merge node.&lt;/p&gt;




&lt;h2&gt;
  
  
  Get the Workflow
&lt;/h2&gt;

&lt;p&gt;This workflow is part of my &lt;strong&gt;16-template AI automation pack&lt;/strong&gt; covering research pipelines, lead enrichment, content generation, and Slack/email digests — all built on n8n with DeepSeek or OpenAI as the backend.&lt;/p&gt;

&lt;p&gt;Get the importable JSON files at &lt;strong&gt;[GUMROAD_LINK]&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full-stack developer specializing in AI automation, MCP servers, and Claude Code integrations. I build production workflows that replace manual research and content tasks with structured, auditable AI pipelines.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 Get My Templates
&lt;/h2&gt;

&lt;p&gt;Want these templates ready to use? Check out my complete collection of&lt;br&gt;&lt;br&gt;
  &lt;strong&gt;25 production-ready n8n automation templates&lt;/strong&gt; — ready to deploy immediately.                                                              &lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://ko-fi.com/s/2be7e40d09" rel="noopener noreferrer"&gt;Get the n8n Templates Bundle ($10)&lt;/a&gt;&lt;/strong&gt;                                                                  &lt;/p&gt;

&lt;p&gt;Perfect for automation engineers, consultants, and anyone looking to accelerate their n8n projects with battle-tested workflows. &lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>n8n</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
