<?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>DEV Community: Swrly</title>
    <description>The latest articles on DEV Community by Swrly (@swrly).</description>
    <link>https://dev.to/swrly</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%2F3862452%2Fe6202e6b-2cf9-4a2e-8a40-f5aaba5aafb8.png</url>
      <title>DEV Community: Swrly</title>
      <link>https://dev.to/swrly</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/swrly"/>
    <language>en</language>
    <item>
      <title>Multi-Agent Systems: A Practical Guide for Engineering Teams</title>
      <dc:creator>Swrly</dc:creator>
      <pubDate>Tue, 14 Apr 2026 03:00:14 +0000</pubDate>
      <link>https://dev.to/swrly/multi-agent-systems-a-practical-guide-for-engineering-teams-4l2p</link>
      <guid>https://dev.to/swrly/multi-agent-systems-a-practical-guide-for-engineering-teams-4l2p</guid>
      <description>&lt;p&gt;Multi-agent systems are not a new research concept. They have been studied in academia for decades. What is new is that they are now cheap and fast enough to run in production, and the engineering patterns for building them are still being figured out in real time.&lt;/p&gt;

&lt;p&gt;This guide is for engineering teams who have built a single AI agent, hit its limits, and are trying to understand what "multi-agent" actually means in practice — not the theory, but the concrete decisions: when to split into multiple agents, how to pass context between them, how to handle failures, and how to know when you have added too many moving parts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Single Agents Break Down
&lt;/h2&gt;

&lt;p&gt;Before going multi-agent, understand why single agents fail. The primary failure modes are:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context window saturation.&lt;/strong&gt; A single agent doing a complex task accumulates context as it works: the initial input, tool call results, intermediate reasoning, partial outputs. For long tasks — analyzing a large codebase, processing a long document, doing research across many sources — the context fills up, the agent starts losing earlier information, and output quality degrades. Splitting the task into smaller agents, each with a fresh focused context, sidesteps this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompt complexity beyond reliability.&lt;/strong&gt; When you stuff too many responsibilities into one agent's system prompt — analyze, then decide, then write, then format, then validate — you are asking one prompt to reliably govern five different behaviors. Reliability degrades as complexity increases. Each responsibility added to a system prompt is another thing that can go wrong, and the interactions between responsibilities are hard to test.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sequential bottlenecks.&lt;/strong&gt; A single agent is sequential. If you need to do three things that do not depend on each other, the single agent does them one at a time. Three agents running in parallel are three times faster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lack of specialization.&lt;/strong&gt; A generalist agent is mediocre at everything. A specialist agent — configured with the right tools, the right context, the right system prompt for one job — is genuinely good at that job. The cost of specialization is the coordination overhead between specialists.&lt;/p&gt;

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

&lt;p&gt;Multi-agent systems follow a small number of structural patterns. Knowing the patterns helps you make the right architectural choice for your use case.&lt;/p&gt;

&lt;h3&gt;
  
  
  Pipeline
&lt;/h3&gt;

&lt;p&gt;Each agent's output is the next agent's input. Sequential, no branching. Use this when each step depends on the previous step's output and the steps are naturally sequential.&lt;/p&gt;

&lt;p&gt;Example: Research pipeline — Agent 1 searches the web for sources, Agent 2 reads and summarizes each source, Agent 3 synthesizes the summaries into a structured report.&lt;/p&gt;

&lt;p&gt;The pipeline is simple to reason about and debug. The tradeoff is that it is only as fast as the slowest step, and a failure at any stage stops the whole pipeline.&lt;/p&gt;

&lt;h3&gt;
  
  
  Parallel Fan-Out with Join
&lt;/h3&gt;

&lt;p&gt;A coordinator dispatches the same task (or different subtasks) to multiple agents simultaneously. A join node collects all outputs before passing them to the next step. Use this when you have independent subtasks that can run simultaneously.&lt;/p&gt;

&lt;p&gt;Example: PR review — Code quality reviewer, security scanner, and test coverage analyzer all run in parallel on the same PR diff. A join node collects all three reviews. A decision agent synthesizes them into a final verdict.&lt;/p&gt;

&lt;p&gt;This is the most impactful pattern for throughput. Three reviewers in parallel cuts review time by roughly two-thirds compared to sequential execution.&lt;/p&gt;

&lt;h3&gt;
  
  
  Supervisor with Workers
&lt;/h3&gt;

&lt;p&gt;One agent (the supervisor) breaks a high-level task into subtasks and dispatches them to specialized worker agents. The supervisor collects results and either composes a final output or continues assigning work until the goal is achieved.&lt;/p&gt;

&lt;p&gt;Example: Research assistant — Supervisor receives "write me a competitive analysis of the top 5 CRM tools." It dispatches five agents, one per CRM, each tasked with gathering specific information about one competitor. Supervisor collects the five reports and composes the final comparison.&lt;/p&gt;

&lt;p&gt;This pattern handles variable-length tasks well. The supervisor can add more workers if the initial set does not cover the task, or retire workers that have finished. The tradeoff is that the supervisor itself needs to be reliable — if it misassigns subtasks or loses track of what has been done, the whole system degrades.&lt;/p&gt;

&lt;h3&gt;
  
  
  Critic and Reviser
&lt;/h3&gt;

&lt;p&gt;Two agents in a loop: a generator and a critic. The generator produces output; the critic evaluates it against defined criteria; if it fails, the output goes back to the generator with the critic's notes. Loop repeats until the critic approves or a maximum iteration count is hit.&lt;/p&gt;

&lt;p&gt;Example: Blog post drafting — Writer agent produces a draft, Editor agent checks it against brand guidelines and quality criteria, returns specific revision notes if it fails. Writer revises. Loop continues until the Editor approves or three revision cycles have elapsed.&lt;/p&gt;

&lt;p&gt;This pattern is useful for quality control on subjective output. The tradeoff is that it can loop more than intended — set a hard iteration cap and a timeout or you will burn tokens and time on endless revision loops that never converge.&lt;/p&gt;

&lt;h3&gt;
  
  
  Event-Driven Routing
&lt;/h3&gt;

&lt;p&gt;A trigger agent receives an event, classifies it, and routes it to the appropriate specialist agent. The specialist handles it and potentially triggers downstream agents.&lt;/p&gt;

&lt;p&gt;Example: Support triage — Trigger receives an incoming support ticket, classification agent determines the category (billing issue, technical bug, feature request, account problem), routes to the appropriate specialist agent (billing agent, engineering triage agent, product feedback agent).&lt;/p&gt;

&lt;p&gt;This pattern is excellent for high-volume inbound processing where you cannot predict what will arrive. The tradeoff is that the routing logic needs to be reliable — if the classifier puts a billing issue in the engineering queue, downstream handling will be wrong.&lt;/p&gt;

&lt;h2&gt;
  
  
  Coordination: The Hard Part
&lt;/h2&gt;

&lt;p&gt;Coordination overhead is the cost of going multi-agent. Every time you split work between two agents, you need to define:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The interface.&lt;/strong&gt; What does Agent A produce, and what does Agent B expect? Vague interfaces — "summarize the findings" — work for demos but fail in production because Agent A might structure its output in ways Agent B does not handle. Explicit output formats (JSON with defined fields, structured text with clear headers) make the interface robust.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What context passes.&lt;/strong&gt; Each agent gets its own context window. Passing too much context between agents (every upstream agent's full output) defeats the purpose of splitting contexts. Passing too little context means downstream agents lack information they need. The right amount: each agent receives the minimum context required to do its job, formatted clearly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Who handles failures.&lt;/strong&gt; If Agent B receives Agent A's output and cannot make sense of it, what happens? Define a fallback for each interface: retry with a broader prompt, pass to a human, log and continue with a default. Undefined failure modes become production incidents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How state is shared.&lt;/strong&gt; If multiple agents need to read and write shared state — a scratchpad, a running summary, a task queue — you need a shared data layer. In Swrly, the scratchpad tools (&lt;code&gt;swrly_scratchpad_set&lt;/code&gt; and &lt;code&gt;swrly_scratchpad_get&lt;/code&gt;) provide shared key-value storage accessible to all agents in a run. Agents can write intermediate results and other agents can read them without the orchestrator shuttling data between nodes.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Many Agents Is Too Many?
&lt;/h2&gt;

&lt;p&gt;There is no formula, but there are warning signs.&lt;/p&gt;

&lt;p&gt;You have too many agents when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You need a diagram of the agents to understand what any single agent does&lt;/li&gt;
&lt;li&gt;Debugging a failure requires tracing through more than four agent outputs to find the root cause&lt;/li&gt;
&lt;li&gt;The coordination overhead (prompt engineering, context passing, retry logic) exceeds the time saved by splitting&lt;/li&gt;
&lt;li&gt;Most of your agents spend more time reading upstream context than actually doing work&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You probably need more agents when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A single agent's system prompt is longer than 2,000 words and covers more than three distinct responsibilities&lt;/li&gt;
&lt;li&gt;A single agent's runs are slow because it is doing sequential work that could be parallelized&lt;/li&gt;
&lt;li&gt;Output quality is inconsistent in ways that correlate with task complexity — the agent does well on simple instances but degrades on complex ones&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The practical target for most production workflows: 3-7 agents. Below 3, you are probably dealing with a task that is fine as a single agent. Above 7, you are introducing coordination overhead that requires careful justification.&lt;/p&gt;

&lt;h2&gt;
  
  
  Observability Is Not Optional
&lt;/h2&gt;

&lt;p&gt;Multi-agent systems fail in non-obvious ways. An agent upstream of a failure might appear to succeed — it produced output — but the output quality is low enough that the downstream agent cannot use it effectively. The downstream agent fails. The root cause is two nodes upstream.&lt;/p&gt;

&lt;p&gt;Without observability at every node, you cannot diagnose this. You see a failed run and a cryptic error message from the final node, with no visibility into what the intermediate agents actually produced.&lt;/p&gt;

&lt;p&gt;Good multi-agent observability gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Status per node: succeeded, failed, timed out, skipped&lt;/li&gt;
&lt;li&gt;Full input and output logged at each node&lt;/li&gt;
&lt;li&gt;Duration and token cost per node&lt;/li&gt;
&lt;li&gt;A visual representation of which path execution took through the graph&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is table stakes, not a nice-to-have. Building a multi-agent system without per-node observability is like building a microservice architecture without logs. You will eventually debug a production incident by reading tea leaves.&lt;/p&gt;

&lt;p&gt;In Swrly, every run produces a full execution trace visible in the run overlay on the canvas. You can click any node after a run and see exactly what it received as input and what it produced as output. When something goes wrong, the investigation starts at the failed node and works backward through its inputs — not through the whole system.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Concrete Starting Point
&lt;/h2&gt;

&lt;p&gt;If you are new to multi-agent systems, start with the parallel fan-out with join pattern. It is the easiest to reason about, produces the most obvious throughput gain, and has the simplest failure model.&lt;/p&gt;

&lt;p&gt;Pick a task you currently run as a single agent that has multiple independent review dimensions. Code review is the canonical example, but it applies equally to document analysis, content review, data validation, or research synthesis.&lt;/p&gt;

&lt;p&gt;Split the single agent into three focused specialists. Give each one a clear, narrow responsibility. Run them in parallel. Collect their outputs with a join node. Pass the combined output to a synthesis agent that makes the final call.&lt;/p&gt;

&lt;p&gt;Run that for a month. Measure output quality, throughput, and cost. Then decide what to add — whether that is another specialist dimension, a critic loop on the synthesizer, or a supervisor layer for more complex task decomposition.&lt;/p&gt;

&lt;p&gt;Multi-agent systems compound. The value is not in any individual agent; it is in the composition. But you build the composition one well-designed step at a time.&lt;/p&gt;

&lt;p&gt;You can start with several &lt;a href="https://dev.to/templates/marketplace"&gt;pre-built multi-agent templates&lt;/a&gt; in Swrly — including a parallel PR reviewer and a research synthesis workflow — or &lt;a href="https://swrly.com/sign-up" rel="noopener noreferrer"&gt;sign up free&lt;/a&gt; and build your own.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
    </item>
    <item>
      <title>How to Cut AI Agent Costs by 80% (Without Sacrificing Quality)</title>
      <dc:creator>Swrly</dc:creator>
      <pubDate>Tue, 14 Apr 2026 03:00:10 +0000</pubDate>
      <link>https://dev.to/swrly/how-to-cut-ai-agent-costs-by-80-without-sacrificing-quality-1a6g</link>
      <guid>https://dev.to/swrly/how-to-cut-ai-agent-costs-by-80-without-sacrificing-quality-1a6g</guid>
      <description>&lt;p&gt;When we first put Swrly's PR review workflow into production, it cost roughly $4.20 per review. That sounds fine until you realize a mid-sized engineering team opens 200–300 PRs a month. That is $840–$1,260 a month for one workflow. We had four more like it in the queue.&lt;/p&gt;

&lt;p&gt;We did not have a scale problem. We had a cost architecture problem.&lt;/p&gt;

&lt;p&gt;Three months later, after applying the patterns below, the same PR review workflow costs $0.38 per run — a reduction of just over 90%. Quality is objectively better. Speed is higher. We learned most of this the hard way, which means you do not have to.&lt;/p&gt;

&lt;p&gt;Here is what actually moves the needle on AI agent costs.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Real Sources of Cost
&lt;/h2&gt;

&lt;p&gt;Before you can cut costs, you need to know where they come from. For most agent pipelines, the breakdown looks like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model selection&lt;/strong&gt; — using Opus for every step, including ones that do not require it, is the single largest source of overspend. It accounts for 40–60% of total token cost in unoptimized pipelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context bloat&lt;/strong&gt; — most pipelines pass the full upstream context to every downstream step. In practice, 60–70% of those tokens are irrelevant to what the current step needs to do.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retry loops&lt;/strong&gt; — when an agent fails and retries with the same full context, you pay for the failed attempt in full. Three retries with 4,000-token context costs 4x the tokens of one successful call. No guardrails means this compounds quietly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform markup&lt;/strong&gt; — some platforms charge per-token fees on top of your LLM provider bill. These markups range from 2x to 5x the raw inference cost. They are rarely disclosed clearly on pricing pages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Most teams try to fix costs by switching to cheaper models across the board. That is the wrong instinct — you end up degrading quality on steps that actually need reasoning power and saving almost nothing on the steps that do not.&lt;/p&gt;

&lt;p&gt;The right approach is targeted: fix the architecture, not just the model selection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pattern 1: BYOK — Eliminate the Platform Markup First
&lt;/h2&gt;

&lt;p&gt;This one change can reduce your total AI spend by 50–80% before you touch a single workflow.&lt;/p&gt;

&lt;p&gt;Most AI agent platforms bundle orchestration and inference into one bill. They act as a pass-through to your LLM provider, add a markup, and call it "credits" or "compute units." The math is rarely transparent. What looks like a $49/month plan ends up costing $300+ once token charges are applied.&lt;/p&gt;

&lt;p&gt;BYOK (bring your own key) routes inference directly from the platform to your LLM provider. There is no intermediary markup. A call that costs $0.015 on the Anthropic API costs $0.015 in your Swrly workflow — not $0.045 after a 3x platform markup.&lt;/p&gt;

&lt;p&gt;The compounding effect matters here. If you run 1,000 agent executions per month and each uses an average of 5,000 tokens:&lt;/p&gt;

&lt;p&gt;| Billing model | Token cost per 1M tokens | Monthly token cost |&lt;br&gt;
|&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>devops</category>
      <category>beginners</category>
      <category>ai</category>
    </item>
    <item>
      <title>Best LangChain Alternatives in 2026 (Honest Comparison)</title>
      <dc:creator>Swrly</dc:creator>
      <pubDate>Tue, 14 Apr 2026 02:59:32 +0000</pubDate>
      <link>https://dev.to/swrly/best-langchain-alternatives-in-2026-honest-comparison-kp9</link>
      <guid>https://dev.to/swrly/best-langchain-alternatives-in-2026-honest-comparison-kp9</guid>
      <description>&lt;p&gt;LangChain was the right tool at the right time. When it launched in 2022, connecting LLMs to tools and memory was non-trivial — LangChain made it tractable. That mattered. A lot of teams built real things with it.&lt;/p&gt;

&lt;p&gt;But as agent workflows have grown in complexity, the cracks have become harder to ignore. Debugging a chain six abstractions deep is miserable. The framework's rapid release cadence means APIs you relied on last month are now deprecated. Adding memory to a multi-agent setup requires reading four pages of documentation and hoping the example hasn't rotted. Teams that built on LangChain often find themselves fighting the framework as much as the actual problem.&lt;/p&gt;

&lt;p&gt;None of this means LangChain is bad. It means it was built for a problem that has since evolved. If you are evaluating alternatives — whether because you are starting fresh, migrating, or just tired of &lt;code&gt;langchain_community&lt;/code&gt; being a mystery box — this post is for you.&lt;/p&gt;

&lt;p&gt;We will cover five paths: LangGraph, CrewAI, Zapier/n8n, Swrly, and rolling your own. We will be direct about the tradeoffs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to Look for in a LangChain Alternative
&lt;/h2&gt;

&lt;p&gt;Before comparing options, agree on what matters for your use case. The wrong criteria lead to the wrong choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visual vs code.&lt;/strong&gt; Some teams want to define workflows in Python. Others want a canvas where non-engineers can see and modify the flow. Neither is inherently better — it depends on who owns the workflow. If your workflows are owned by a product manager or solutions engineer, code-first will create a handoff problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Observability.&lt;/strong&gt; Agent runs fail in subtle ways. An LLM returns plausible-looking output that is structurally wrong. A tool call succeeds but returns empty data. A loop runs 47 times instead of 3. You need to see exactly what happened — which nodes ran, what each one received, and what it returned. "It worked in dev" is not a production posture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost model.&lt;/strong&gt; LangChain is open source and free. Some alternatives charge per run, per seat, or per agent. Others let you bring your own API keys (BYOK) so the model costs go directly to your provider account and you are not paying a markup. If you are running hundreds of agent executions per day, the cost model matters as much as the feature set.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Team collaboration.&lt;/strong&gt; Can two people work on the same workflow? Can a junior engineer make a change without breaking the production version? Version control, branching, and role-based access are easy to overlook until the moment you need them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Debugging ergonomics.&lt;/strong&gt; When something goes wrong, can you see exactly what the LLM said, what tool calls it made, and what it got back — without adding custom logging everywhere? This is where LangChain is most painful, and where the alternatives differ most sharply.&lt;/p&gt;

&lt;h2&gt;
  
  
  LangGraph
&lt;/h2&gt;

&lt;p&gt;LangGraph is LangChain's own response to the criticism. Rather than chains, it uses explicit directed graphs — you define nodes and edges, including cycles, and state flows through them. This makes the execution model transparent in a way that vanilla LangChain is not.&lt;/p&gt;

&lt;p&gt;It is a meaningful improvement. Cycles are a first-class concept, so retry loops and iterative refinement are straightforward. State is explicit and typed, so you always know what data is available at each node. The graph structure maps more directly to how teams think about agent workflows.&lt;/p&gt;

&lt;p&gt;The limitations are inherited from LangChain. It is Python-only. Debugging still requires reading Python tracebacks and adding logging by hand. Deployment is your responsibility. If you want to run LangGraph in production, you are setting up LangServe or LangGraph Cloud, managing infrastructure, and writing your own observability.&lt;/p&gt;

&lt;p&gt;LangGraph is the right call if you are a Python team that wants explicit state management and is comfortable owning the operational side. It is not a good fit if you want a managed runtime, a visual interface, or non-engineer participation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# LangGraph: define state and a simple two-node graph
&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;typing&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;TypedDict&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;langgraph.graph&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;StateGraph&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;State&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TypedDict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;pr_diff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;review&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;
    &lt;span class="n"&gt;verdict&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;review_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# call Claude, parse output, return updated state
&lt;/span&gt;    &lt;span class="bp"&gt;...&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;notify_agent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="c1"&gt;# post to Slack based on verdict
&lt;/span&gt;    &lt;span class="bp"&gt;...&lt;/span&gt;

&lt;span class="n"&gt;graph&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;StateGraph&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;State&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;review&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;review_agent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_node&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;notify&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;notify_agent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_edge&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;review&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;notify&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_entry_point&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;review&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;graph&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Clean code. But you still own the runner, the queue, the error handling, and the observability stack.&lt;/p&gt;

&lt;p&gt;For a deeper comparison, see our &lt;a href="https://dev.to/compare/langchain"&gt;LangChain vs Swrly breakdown&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  CrewAI
&lt;/h2&gt;

&lt;p&gt;CrewAI takes a role-based approach: you define agents by role (researcher, writer, reviewer), assign them tools, and let a "crew" collaborate on a task. The mental model is intuitive — most teams already think about AI workflows in terms of roles.&lt;/p&gt;

&lt;p&gt;Setup is simpler than LangChain for common patterns. A research-and-write pipeline that would take 200 lines of LangChain code takes 40 lines of CrewAI YAML. The framework handles agent-to-agent communication and task sequencing.&lt;/p&gt;

&lt;p&gt;The rough edges appear at scale. Task routing is sequential by default — parallel execution requires explicit configuration and is less battle-tested. The YAML-first approach works well for standard patterns but becomes awkward when you need conditional branching, loops, or dynamic tool selection. Debugging is better than LangChain but still requires reading logs rather than inspecting a structured trace.&lt;/p&gt;

&lt;p&gt;CrewAI is strongest for linear multi-agent pipelines with well-defined roles and predictable data flow. It is weaker for complex branching workflows, real-time observability, or non-engineer ownership.&lt;/p&gt;

&lt;p&gt;See also: our full &lt;a href="https://dev.to/compare/crewai"&gt;CrewAI comparison&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Zapier and n8n
&lt;/h2&gt;

&lt;p&gt;Zapier and n8n are automation platforms that added AI capabilities. They were not built for agent orchestration, but they work for simple flows: trigger on event, call an LLM, write the result somewhere.&lt;/p&gt;

&lt;p&gt;Zapier's strength is integrations. If you need to connect a form submission to a GPT call to a Google Sheet, Zapier is probably the fastest path. No code, large integration library, well-documented. The ceiling is low though — it is not designed for multi-agent coordination, complex conditions, or long-running workflows.&lt;/p&gt;

&lt;p&gt;n8n is the self-hosted alternative with more flexibility. You get a visual node editor, branching logic, and the ability to write JavaScript for custom nodes. It handles more complexity than Zapier but still was not designed with LLM-native workflows in mind. AI nodes feel bolted on rather than native.&lt;/p&gt;

&lt;p&gt;Both tools are appropriate when the AI call is a single step in a broader automation — not when you are orchestrating multiple agents with interdependencies. If you need agents that use tools, accumulate context, and hand off state to each other, you will hit the ceiling quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Swrly
&lt;/h2&gt;

&lt;p&gt;We built Swrly because we kept running into the same problems across different teams: LangChain workflows that were hard to debug, Python scripts that only one engineer could modify, and agent pipelines that collapsed in production because nobody could see what was happening inside them.&lt;/p&gt;

&lt;p&gt;Swrly is a visual drag-and-drop agent orchestration platform. You build workflows on a canvas — no code required for standard patterns. Each node is an agent, integration, condition, loop, or trigger. Edges define the data flow. When a workflow runs, you watch it happen on the canvas in real time.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;BYOK (Bring Your Own Keys).&lt;/strong&gt; Your LLM costs go directly to your provider account. We do not take a margin on inference. You use your Claude Code subscription, and agent runs are charged to it. This matters at scale — teams running 500+ daily agent executions save significantly compared to platforms that mark up API costs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;346+ MCP tools across 51 integrations.&lt;/strong&gt; GitHub, Slack, Linear, Jira, Notion, PostgreSQL, MySQL, Redis, Stripe, Twilio, Telegram, Bluesky, and more. Agents can call any of these tools without you writing integration code. Connect your accounts in Settings, and the tools are available in the agent builder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Production observability.&lt;/strong&gt; Every run is logged with full input/output per node, timestamps, token usage, and tool call traces. When something breaks, you click into the run history and see exactly what happened — no log scraping required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;26 workflow templates.&lt;/strong&gt; Common patterns — PR review, bug triage, content pipeline, customer support routing — are available as one-click starting points in the &lt;a href="https://dev.to/templates/marketplace"&gt;template marketplace&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visual without being limited.&lt;/strong&gt; Condition branching, parallel execution, loop nodes (with configurable exit conditions and iteration caps), approval gates, and cross-swirl triggers are all available on the canvas. For teams that need code, every workflow is exportable.&lt;/p&gt;

&lt;p&gt;Here is the same PR reviewer workflow from above, built visually in Swrly versus the LangGraph equivalent:&lt;/p&gt;

&lt;p&gt;| Step | LangGraph | Swrly |&lt;br&gt;
|&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>ai</category>
    </item>
    <item>
      <title>Model Context Protocol (MCP) Explained: Why It Matters in 2026</title>
      <dc:creator>Swrly</dc:creator>
      <pubDate>Tue, 14 Apr 2026 02:59:29 +0000</pubDate>
      <link>https://dev.to/swrly/model-context-protocol-mcp-explained-why-it-matters-in-2026-1c7i</link>
      <guid>https://dev.to/swrly/model-context-protocol-mcp-explained-why-it-matters-in-2026-1c7i</guid>
      <description>&lt;p&gt;In 2024, every AI framework shipped its own way to call tools. LangChain had one approach. AutoGen had another. The Claude API had a third. If you wanted to write a GitHub tool that worked across all three, you wrote it three times — and maintained three versions.&lt;/p&gt;

&lt;p&gt;That problem is solved now. &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; is an open standard from Anthropic that defines a single way for AI models to discover and call external tools. By 2026 it has been adopted across Claude Code, Cursor, GitHub Copilot, and is supported in OpenAI's tooling as well. It is the closest thing the AI tooling ecosystem has to a standard.&lt;/p&gt;

&lt;p&gt;This post explains what MCP actually is, how it works under the hood, when you should use it, and when it is overkill. If you are building anything involving AI agents and external tools, this is worth understanding.&lt;/p&gt;

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

&lt;p&gt;Before MCP, every team building AI-powered tooling faced the same problem: there was no standard interface for exposing tools to language models.&lt;/p&gt;

&lt;p&gt;Say you wanted an agent that could create a GitHub pull request. You would write a function that calls the GitHub API, wrap it in whatever tool-calling schema the model expected, and test it. Then someone asks for the same capability in a different framework. You write it again. Different schema, different transport, different error handling conventions — same underlying API call.&lt;/p&gt;

&lt;p&gt;Multiply this across the entire ecosystem. GitHub tools, Slack tools, database tools, monitoring tools — each one reimplemented for each framework. The result was a fragmented landscape where the same work was being done hundreds of times, with no shared discovery mechanism, no standard error format, and no way to compose tools across tool providers.&lt;/p&gt;

&lt;p&gt;MCP addresses all three of these. It defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;How servers expose tools&lt;/strong&gt; — a standard JSON schema format for describing tool inputs and outputs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How clients discover tools&lt;/strong&gt; — a standard handshake where clients ask servers to list their available tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How calls are made&lt;/strong&gt; — a standard request/response format using JSON-RPC 2.0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Build a GitHub MCP server once. Any MCP client — Claude Code, Cursor, Swrly, your custom agent — can connect to it and use its tools without modification.&lt;/p&gt;

&lt;h2&gt;
  
  
  What MCP Actually Is
&lt;/h2&gt;

&lt;p&gt;MCP is a &lt;strong&gt;client-server protocol&lt;/strong&gt; built on JSON-RPC 2.0. The structure is simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MCP servers&lt;/strong&gt; expose tools, resources, and prompts&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP clients&lt;/strong&gt; (your agent or IDE) connect to one or more servers, discover what is available, and call tools during model execution&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transports&lt;/strong&gt; define the communication channel between client and server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The best analogy is the &lt;strong&gt;Language Server Protocol (LSP)&lt;/strong&gt;, which standardized how code editors communicate with language analysis tools. Before LSP, every editor (VS Code, Vim, Emacs) had to implement its own TypeScript integration, its own Python type checker integration, and so on. LSP moved that complexity to the server side. MCP does the same thing for AI tool integrations.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Two Transport Modes
&lt;/h3&gt;

&lt;p&gt;MCP supports two transport modes, and understanding both is important because they are not interchangeable:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SSE (Server-Sent Events)&lt;/strong&gt; was the original transport. The client opens an HTTP connection, the server streams events back. This transport is required for SDK v1.x clients like Claude Code SDK v1 — those clients use the &lt;code&gt;query()&lt;/code&gt; API and cannot establish bidirectional HTTP streams. If you are using &lt;code&gt;@anthropic-ai/claude-code&lt;/code&gt; at version 1.x, you need an SSE endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP Streamable&lt;/strong&gt; is the newer transport introduced for SDK v2+. It uses standard HTTP POST requests with streaming responses. It supports authorization headers, which SSE traditionally cannot (the browser &lt;code&gt;EventSource&lt;/code&gt; API does not allow setting request headers). This transport is better for production server-to-server communication.&lt;/p&gt;

&lt;p&gt;In practice, production MCP servers often expose both endpoints — &lt;code&gt;/sse&lt;/code&gt; for backward compatibility with v1 clients and &lt;code&gt;/mcp&lt;/code&gt; for v2+ clients. SSE endpoints typically cannot enforce Authorization header checks because legacy clients cannot send them, so you need to handle authentication at the tool level instead.&lt;/p&gt;

&lt;h3&gt;
  
  
  How Tool Discovery Works
&lt;/h3&gt;

&lt;p&gt;When a client connects to an MCP server, it makes a &lt;code&gt;tools/list&lt;/code&gt; request. The server responds with an array of tool definitions:&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;"tools"&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;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;"github_create_pr"&lt;/span&gt;&lt;span class="p"&gt;,&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;"Creates a pull request on GitHub"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"inputSchema"&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;"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;"object"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"properties"&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;"owner"&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;"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;"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;"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;"Repository owner"&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;"repo"&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;"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;"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;"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;"Repository name"&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;"title"&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;"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;"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;"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;"PR title"&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;"body"&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;"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;"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;"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;"PR description"&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;"head"&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;"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;"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;"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;"Branch to merge from"&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;"base"&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;"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;"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;"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;"Branch to merge into"&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="nl"&gt;"required"&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;"owner"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"repo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"title"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"head"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"base"&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;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;The model receives this schema and knows how to call the tool. When it decides to create a PR, it emits a &lt;code&gt;tools/call&lt;/code&gt; request with a JSON object matching the &lt;code&gt;inputSchema&lt;/code&gt;. The server executes the tool and returns the result. The model incorporates the result into its reasoning.&lt;/p&gt;

&lt;p&gt;This is the core loop: discover, call, incorporate.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Minimal MCP Server
&lt;/h2&gt;

&lt;p&gt;Here is what a minimal MCP server looks like using the official TypeScript SDK:&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="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="s2"&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="k"&gt;import&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="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;zod&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;github-tools&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;github_get_pr&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;Fetch details of a pull request&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;owner&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;Repository owner&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;repo&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;Repository name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;pr_number&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;number&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;Pull request number&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;owner&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;repo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pr_number&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="nx"&gt;response&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;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="s2"&gt;`https://api.github.com/repos/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;owner&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;repo&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/pulls/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;pr_number&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="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
          &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;GITHUB_TOKEN&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="na"&gt;Accept&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;application/vnd.github+json&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="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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;ok&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`GitHub API error: &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;status&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pr&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&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;content&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;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="na"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;state&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;draft&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;draft&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="na"&gt;mergeable&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;pr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mergeable&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="p"&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;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;p&gt;That is a complete, working MCP server. It exposes one tool. Any MCP client can connect to it via stdio and call &lt;code&gt;github_get_pr&lt;/code&gt;. The Zod schema is automatically converted to the JSON Schema format that &lt;code&gt;tools/list&lt;/code&gt; returns.&lt;/p&gt;

&lt;p&gt;The HTTP transport version adds a few lines to set up an Express (or Hono) server and swap &lt;code&gt;StdioServerTransport&lt;/code&gt; for &lt;code&gt;SSEServerTransport&lt;/code&gt; or &lt;code&gt;StreamableHTTPServerTransport&lt;/code&gt;, but the tool definition code is identical.&lt;/p&gt;

&lt;h2&gt;
  
  
  When MCP Is Worth It
&lt;/h2&gt;

&lt;p&gt;MCP adds real value in specific situations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You are building a platform or a reusable agent system.&lt;/strong&gt; If multiple agents — or multiple teams — need access to the same tool, an MCP server is the right abstraction. You define the tool once, expose it over the network, and every agent connects to it. Updates to the tool propagate to all consumers without any redeployment of agent code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You have a shared tool library.&lt;/strong&gt; Teams that are building dozens of agent workflows benefit from an MCP server that centralizes all their integrations — GitHub, Slack, Jira, database queries. Individual agents connect to the shared server and use whatever subset of tools they need. This mirrors how a shared library works in traditional software but with the discovery mechanism built in.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tools run in separate processes for isolation or security.&lt;/strong&gt; MCP servers can run as separate processes, separate containers, or even separate machines. If your database tools need different credentials than your Slack tools, you can run them as separate MCP servers. The client connects to both and routes tool calls to the right server. This is significantly cleaner than embedding all your tool logic in a single agent process.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You want local-first agent setups.&lt;/strong&gt; Running tools locally — against a local database, a local file system, a local development environment — is straightforward with stdio transport. The MCP server runs as a subprocess, the agent process spawns it, and they communicate over stdin/stdout. No network, no auth, no infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  When MCP Is Overkill
&lt;/h2&gt;

&lt;p&gt;MCP adds complexity. For some use cases, that complexity does not pay off.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One-off agents with one or two tools.&lt;/strong&gt; If you are building a script that calls the Stripe API and sends a Slack message, you do not need MCP. Write two functions, call them from your agent, move on. The overhead of running an MCP server, handling tool discovery, and managing the connection is not justified for two endpoints.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rapid prototyping where schemas change frequently.&lt;/strong&gt; MCP tool schemas are defined at server startup. Every time you change a tool's input or output, you need to restart the server and reconnect any clients. When you are iterating quickly on what a tool should do, this friction adds up. A direct function call is easier to change. Add MCP once the interface has stabilized.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Situations where the model needs to compose tools dynamically.&lt;/strong&gt; MCP is designed around a static list of tools discovered at connection time. If you need to generate tools programmatically at runtime — for example, generating a unique tool per database table — MCP can handle it, but it requires careful design to avoid listing hundreds of tools in every &lt;code&gt;tools/list&lt;/code&gt; response, which wastes context tokens.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common Gotchas in 2026
&lt;/h2&gt;

&lt;p&gt;MCP is straightforward once you understand these rough edges.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transport mismatch causes silent failures.&lt;/strong&gt; The most common issue when connecting an MCP client to a server is transport incompatibility. If your client uses SDK v1 and expects SSE, and your server only exposes an HTTP Streamable endpoint, the connection will fail — often with an unhelpful error. Always confirm which transport version your client SDK requires and check that the server exposes the correct endpoint. When in doubt, expose both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tool discovery cost scales with tool count.&lt;/strong&gt; Every MCP client requests the full &lt;code&gt;tools/list&lt;/code&gt; on connection. If your server exposes 300 tools, that list goes into the model's context on every connection. At GPT-4 or Claude Sonnet token rates, a 300-tool schema can cost 5,000-10,000 tokens per session before the model does any work. Two mitigations: run tool filtering so each agent only sees the tools it is allowed to use, or organize tools across multiple smaller MCP servers and only connect agents to the servers they need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP server instances must be per-connection for concurrent agents.&lt;/strong&gt; A common architecture mistake is using a singleton MCP server instance shared across all connections. This works fine for one agent at a time but causes "already connected" and state corruption errors when multiple agents run concurrently. The correct pattern is a factory function — each incoming SSE connection instantiates its own &lt;code&gt;McpServer&lt;/code&gt; object, isolated from all others. The underlying tool implementations can share infrastructure (database connections, HTTP clients), but the MCP server object itself must be per-connection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Authorization on SSE endpoints is limited.&lt;/strong&gt; SSE relies on browser &lt;code&gt;EventSource&lt;/code&gt;, which cannot set custom headers. This means you cannot use &lt;code&gt;Authorization: Bearer &amp;lt;token&amp;gt;&lt;/code&gt; on SSE connections — your clients simply cannot send it. Production SSE servers typically authenticate at the tool level (passing credentials as tool arguments or reading them from environment variables) rather than at the transport level.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tool name collisions across servers.&lt;/strong&gt; When a client connects to multiple MCP servers, tool names from all servers appear in the same namespace. If two servers both define a tool called &lt;code&gt;create_issue&lt;/code&gt; (one for Jira, one for Linear), you have a collision. Adopt a consistent naming convention upfront: &lt;code&gt;jira_create_issue&lt;/code&gt;, &lt;code&gt;linear_create_issue&lt;/code&gt;. This is especially important when building platforms where third-party MCP servers may be added over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The MCP Ecosystem Today
&lt;/h2&gt;

&lt;p&gt;The MCP ecosystem has grown faster than most expected. By early 2026:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Over 10,000 public MCP servers are listed in community registries&lt;/li&gt;
&lt;li&gt;Major IDE platforms — Cursor, VS Code with Copilot, JetBrains AI — all support MCP natively&lt;/li&gt;
&lt;li&gt;Claude Code integrates MCP servers via the &lt;code&gt;.claude/settings.json&lt;/code&gt; configuration file&lt;/li&gt;
&lt;li&gt;OpenAI's tool calling format has aligned closely enough with MCP that adapters are trivial&lt;/li&gt;
&lt;li&gt;AWS, Cloudflare, and Vercel all offer managed MCP server hosting&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The adoption pattern followed the same arc as LSP: slow uptake in the first year while the tooling ecosystem matured, then rapid adoption once the major IDEs and frameworks committed to the standard. The key difference from previous AI tool standards is that MCP is genuinely simple. The spec fits in a single document. A working server is under 50 lines of TypeScript. That simplicity is not an accident — it is why it won.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Swrly Uses MCP
&lt;/h2&gt;

&lt;p&gt;Swrly is built on MCP end-to-end. Every integration — GitHub, Slack, Linear, Jira, PagerDuty, Stripe, and 45 others — is exposed as a set of MCP tools through a single server at port 3002. When an agent workflow runs, the runner service connects to the MCP server and passes the available tools to the Claude Code SDK. The model sees the tools, decides which ones to call, and the MCP server executes them.&lt;/p&gt;

&lt;p&gt;The platform currently exposes &lt;strong&gt;346 tools across 51 connectors&lt;/strong&gt;. Presenting all 346 tools to every agent would be wasteful and would dilute the model's attention. Instead, each agent node in a workflow has a &lt;code&gt;selectedTools&lt;/code&gt; configuration — an explicit list of the MCP tool names that agent is allowed to use. The runner filters the &lt;code&gt;tools/list&lt;/code&gt; response to only include those tools before passing it to the model.&lt;/p&gt;

&lt;p&gt;This per-agent tool restriction serves two purposes. First, it keeps context lean — an agent that only needs &lt;code&gt;github_list_pr_files&lt;/code&gt; and &lt;code&gt;github_get_content&lt;/code&gt; does not need to see the 50 Stripe tools. Second, it enforces least-privilege access — a code review agent cannot call &lt;code&gt;stripe_create_refund&lt;/code&gt; even if the model tries.&lt;/p&gt;

&lt;p&gt;The MCP server runs as a separate Docker container from the main web app and the runner service. Tools that need to make outbound HTTP requests include SSRF protection — all URLs are checked against a blocklist before the request is made. Credentials (API keys, OAuth tokens) are stored encrypted in the database, decrypted at the MCP server level, and never passed through the agent's context.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;MCP won because it solved a real problem simply. The AI tool integration ecosystem was fragmented, duplicative, and incompatible across frameworks. MCP gave it a common language — not a complicated enterprise spec, but a thin JSON-RPC protocol with a clear handshake and a standard schema format.&lt;/p&gt;

&lt;p&gt;If you are building a one-off agent script, you can ignore MCP entirely. Write functions, call them directly, ship it. But if you are building agent infrastructure — a platform, a shared tool library, a multi-team automation system — MCP is the right foundation. The ecosystem is there, the tooling is mature, and the alternative (custom integration code per framework) is worse.&lt;/p&gt;

&lt;p&gt;Understanding the transport modes, the tool discovery cost at scale, and the per-connection instance requirement will save you real debugging time. The gotchas are not subtle once you know them.&lt;/p&gt;

&lt;p&gt;For a working reference implementation, the &lt;a href="https://github.com/swrlyai" rel="noopener noreferrer"&gt;Swrly MCP server&lt;/a&gt; demonstrates the SSE + HTTP Streamable dual-transport pattern, per-connection instance isolation, and per-agent tool filtering at production scale.&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>What BYOK Really Means for AI Platform Costs</title>
      <dc:creator>Swrly</dc:creator>
      <pubDate>Sun, 12 Apr 2026 22:07:59 +0000</pubDate>
      <link>https://dev.to/swrly/what-byok-really-means-for-ai-platform-costs-34b4</link>
      <guid>https://dev.to/swrly/what-byok-really-means-for-ai-platform-costs-34b4</guid>
      <description>&lt;p&gt;If you have evaluated AI agent platforms recently, you have probably noticed the pricing pages are designed to be confusing. There is a platform fee, plus credits, plus per-token charges, plus overages. You sign up for $19/month and end up paying $300 because your agents were chatty.&lt;/p&gt;

&lt;p&gt;This is the problem BYOK solves, and it is the core of how Swrly handles pricing.&lt;/p&gt;

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

&lt;p&gt;Most AI platforms bundle two separate things into one bill: the &lt;strong&gt;orchestration layer&lt;/strong&gt; (workflow management, integrations, UI) and the &lt;strong&gt;AI compute&lt;/strong&gt; (LLM inference, token usage). Bundling them together lets platforms charge unpredictable per-token markups that scale with your usage.&lt;/p&gt;

&lt;p&gt;Here is what the landscape looks like today:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Relevance AI&lt;/strong&gt; charges $19/month for the Pro plan, but that includes a limited number of credits. Each agent run consumes credits based on token usage. Complex workflows with multiple agent steps can burn through credits in days. Overages are billed per-credit, and the cost per credit varies by model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CrewAI&lt;/strong&gt; starts at $200/month for the Enterprise plan. It includes "unlimited" agents, but inference costs are billed separately based on the LLM provider and token volume. The total monthly cost depends entirely on how many tokens your agents consume.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LangSmith/LangChain&lt;/strong&gt; charges per trace for observability, and you still pay your LLM provider separately. The traces add up — a busy team running thousands of workflows can see observability costs alone exceed $100/month.&lt;/p&gt;

&lt;p&gt;In every case, the total cost is &lt;strong&gt;unpredictable until you get the bill&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Swrly's BYOK Model
&lt;/h2&gt;

&lt;p&gt;Swrly separates the two costs completely:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;AI compute:&lt;/strong&gt; You pay Anthropic directly for your Claude Code subscription. $20/month for Pro. That is between you and Anthropic — Swrly never touches it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orchestration:&lt;/strong&gt; You pay Swrly for the platform. Free for individuals, $49/month for Pro, $99/month for Teams. Fixed price, no per-token charges, no credit system.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The mechanism is straightforward. In Swrly's Settings page, you paste your Claude Code session token. Swrly encrypts it using &lt;strong&gt;AES-256-GCM&lt;/strong&gt; (the same encryption standard used by banks and government systems) and stores the encrypted token in the database. When a workflow runs, the token is decrypted ephemerally in memory, used for that execution, and discarded. It is never written to logs, never stored in plaintext, and never accessible to Swrly staff.&lt;/p&gt;

&lt;p&gt;Your key, your costs, your control.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cost Comparison
&lt;/h2&gt;

&lt;p&gt;Here is what a team of 5 engineers running approximately 1,000 agent workflow executions per month can expect to pay:&lt;/p&gt;

&lt;p&gt;| | &lt;strong&gt;Swrly + Claude Code&lt;/strong&gt; | &lt;strong&gt;Relevance AI&lt;/strong&gt; | &lt;strong&gt;CrewAI&lt;/strong&gt; |&lt;br&gt;
|&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>Building AI Workflows for DevOps Teams</title>
      <dc:creator>Swrly</dc:creator>
      <pubDate>Sun, 12 Apr 2026 22:07:56 +0000</pubDate>
      <link>https://dev.to/swrly/building-ai-workflows-for-devops-teams-51p2</link>
      <guid>https://dev.to/swrly/building-ai-workflows-for-devops-teams-51p2</guid>
      <description>&lt;p&gt;DevOps teams are some of the best candidates for multi-agent automation. The work is repetitive, high-stakes, and built on integrations between tools that already have APIs. When your PagerDuty fires at 2 AM, the response is always the same sequence: check the alert, pull the recent deploys, look at the error logs, assess severity, notify the right people. Every step is manual, every step costs time, and every step is something an agent can do.&lt;/p&gt;

&lt;p&gt;This guide walks through four production-ready DevOps workflows you can build with Swrly. We will go deep on the first one — Incident Response — and then sketch the other three so you can adapt them to your stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Case 1: Incident Response
&lt;/h2&gt;

&lt;p&gt;This is the workflow teams ask about most. The premise is straightforward: when an incident fires, an AI agent triages it before a human even opens their laptop.&lt;/p&gt;

&lt;h3&gt;
  
  
  What the Workflow Does
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;A PagerDuty webhook fires when a new incident is created&lt;/li&gt;
&lt;li&gt;The workflow pulls incident details from PagerDuty and recent errors from Sentry in parallel&lt;/li&gt;
&lt;li&gt;An AI analyst agent correlates the signals: PagerDuty alert details, Sentry stack traces, and recent GitHub commits&lt;/li&gt;
&lt;li&gt;A second AI agent drafts a response runbook with mitigation steps&lt;/li&gt;
&lt;li&gt;A condition node checks severity&lt;/li&gt;
&lt;li&gt;Critical incidents go to #incidents-critical on Slack; everything else goes to #ops-log&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By the time the on-call engineer opens Slack, there is already a root cause hypothesis, a list of affected components, and step-by-step mitigation instructions waiting for them.&lt;/p&gt;

&lt;h3&gt;
  
  
  Walking Through the Build
&lt;/h3&gt;

&lt;p&gt;Start by creating a new swirl and dragging a &lt;strong&gt;Trigger&lt;/strong&gt; node onto the canvas. Set the trigger type to &lt;strong&gt;Webhook&lt;/strong&gt;. Copy the generated URL and configure it as a PagerDuty webhook — under your PagerDuty service, add a webhook subscription for the &lt;code&gt;incident.triggered&lt;/code&gt; event type.&lt;/p&gt;

&lt;p&gt;Next, add a &lt;strong&gt;PagerDuty integration node&lt;/strong&gt; connected to the trigger. Configure it with the &lt;code&gt;pagerduty_get_incident&lt;/code&gt; action and pass &lt;code&gt;{{trigger.payload.incident_id}}&lt;/code&gt; as the incident ID parameter. This fetches the full incident details including title, description, service, urgency, and assigned escalation policy.&lt;/p&gt;

&lt;p&gt;Now add two integration nodes in parallel — this is where Swrly's directed graph model shines. Connect the PagerDuty node to both a &lt;strong&gt;Sentry&lt;/strong&gt; node (using &lt;code&gt;sentry_list_issues&lt;/code&gt; with the query &lt;code&gt;is:unresolved&lt;/code&gt;) and a &lt;strong&gt;GitHub&lt;/strong&gt; node (using &lt;code&gt;github_list_commits&lt;/code&gt; to pull recent commits from your main repository). These run simultaneously, cutting the data-gathering time in half.&lt;/p&gt;

&lt;p&gt;Connect both integration nodes to an &lt;strong&gt;Agent&lt;/strong&gt; node called "Incident Analyst." This is the core of the workflow. Here is the system prompt:&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 SRE performing incident triage.

PagerDuty incident details:
{{get_incident.output}}

Recent Sentry errors:
{{list_issues.output}}

Recent GitHub commits:
{{list_commits.output}}

Correlate these signals to identify the most likely root cause.
Output a structured analysis with:
1. Root cause hypothesis (with confidence level)
2. Affected components
3. Timeline of events
4. Severity estimate (1 = critical, 2 = major, 3 = minor)

Output the severity as a number in a field called `severity`.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The agent receives data from three sources — PagerDuty, Sentry, and GitHub — and produces a structured analysis. Set &lt;code&gt;maxTurns&lt;/code&gt; to 15 and enable &lt;code&gt;accumulateContext&lt;/code&gt; so the agent retains all upstream data.&lt;/p&gt;

&lt;p&gt;Add a second agent, "Incident Responder," connected to the analyst. Its prompt takes the analyst's output and produces a step-by-step runbook:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Based on the analysis, produce:
1. A step-by-step runbook to resolve the issue
2. Immediate mitigation actions (first 15 minutes)
3. Communication template for stakeholders
4. Estimated time to recovery
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finally, add a &lt;strong&gt;Condition&lt;/strong&gt; node after the responder. Set the field to &lt;code&gt;output&lt;/code&gt;, the operator to &lt;code&gt;contains&lt;/code&gt;, and the value to &lt;code&gt;severity: 1&lt;/code&gt;. Connect the true branch to a Slack node posting to &lt;code&gt;#incidents-critical&lt;/code&gt; and the false branch to a Slack node posting to &lt;code&gt;#ops-log&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why This Works
&lt;/h3&gt;

&lt;p&gt;The key insight is that incident triage is pattern matching. Given an alert, some errors, and some recent changes, an experienced SRE correlates the signals and forms a hypothesis. An AI agent does the same thing, but in 30 seconds instead of 10 minutes. The human still makes the final call — the agent just gives them a running start.&lt;/p&gt;

&lt;p&gt;The condition node adds intelligent routing. Critical incidents get immediate visibility in the high-urgency channel. Lower-severity issues are logged but do not wake anyone up unnecessarily.&lt;/p&gt;

&lt;h3&gt;
  
  
  Integration Highlights
&lt;/h3&gt;

&lt;p&gt;This workflow uses four integrations:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PagerDuty&lt;/strong&gt; (&lt;code&gt;pagerduty_get_incident&lt;/code&gt;) — Fetches full incident details including metadata, assignments, and escalation policy&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sentry&lt;/strong&gt; (&lt;code&gt;sentry_list_issues&lt;/code&gt;) — Pulls recent unresolved errors with stack traces and frequency data&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt; (&lt;code&gt;github_list_commits&lt;/code&gt;) — Lists recent commits with messages, authors, and timestamps for change correlation&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slack&lt;/strong&gt; (&lt;code&gt;slack_send_message&lt;/code&gt;) — Delivers the triage report to the right channel based on severity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All four are available in Swrly's integration library. Connect them once in Settings, and every workflow in your workspace can use them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Case 2: Deployment Monitoring
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Trigger:&lt;/strong&gt; Cron schedule, every 30 minutes&lt;/p&gt;

&lt;p&gt;After every deployment, you want to know if things are healthy. This workflow runs on a timer and checks for signs of trouble.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The flow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cron trigger fires every 30 minutes&lt;/li&gt;
&lt;li&gt;Sentry integration node fetches errors from the last 30 minutes (&lt;code&gt;firstSeen:-30m&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Agent node analyzes error volume, new error types, and spike patterns&lt;/li&gt;
&lt;li&gt;Condition node checks if the agent flagged any anomalies&lt;/li&gt;
&lt;li&gt;If yes: Slack message to #deploys with the analysis and a recommendation to investigate or rollback&lt;/li&gt;
&lt;li&gt;If no: silent — no noise when things are healthy&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Why it is useful:&lt;/strong&gt; Most deployment monitoring is threshold-based. "Alert if error rate exceeds 5%." But threshold alerts miss slow-burn regressions and novel error types. An AI agent can identify patterns that static rules miss: "Three new TypeError exceptions appeared in the auth module 20 minutes after the last deploy. These were not present in the previous 24 hours."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integration highlights:&lt;/strong&gt; Sentry for error data, Slack for notifications. Add a Datadog node if you want to correlate with infrastructure metrics. Add a GitHub node with &lt;code&gt;github_list_deployments&lt;/code&gt; to tie errors to specific deploys.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Case 3: Security Audit
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Trigger:&lt;/strong&gt; Daily cron, 6 AM&lt;/p&gt;

&lt;p&gt;Security reviews should not be a quarterly event. This workflow runs every morning and checks for security-relevant changes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The flow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Daily cron trigger at 6 AM&lt;/li&gt;
&lt;li&gt;Two parallel integration nodes: GitHub (&lt;code&gt;github_list_commits&lt;/code&gt; for the last 24 hours) and Sentry (&lt;code&gt;sentry_list_issues&lt;/code&gt; for new unresolved errors)&lt;/li&gt;
&lt;li&gt;Security Analyst agent reviews commits for security-sensitive changes: auth logic modifications, dependency updates, config file changes, new API endpoints, cryptographic code&lt;/li&gt;
&lt;li&gt;Security Reporter agent formats findings into a structured report with severity ratings&lt;/li&gt;
&lt;li&gt;Condition node checks if any critical findings exist&lt;/li&gt;
&lt;li&gt;Critical findings: Slack to #security and PagerDuty incident creation&lt;/li&gt;
&lt;li&gt;Non-critical findings: Slack to #security-log for the daily digest&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Why it is useful:&lt;/strong&gt; The security audit template is one of the most popular in Swrly's template library. It catches the kinds of changes that slip through code review: a dependency bump that introduces a known CVE, an environment variable accidentally logged in a new error handler, an auth middleware accidentally removed from a route. The agent checks every commit, every day, without getting tired or distracted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tips for production:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set the GitHub integration to scan all repositories in your organization, not just one&lt;/li&gt;
&lt;li&gt;Add Snyk or Dependabot integration nodes for automated vulnerability database checks&lt;/li&gt;
&lt;li&gt;Adjust the analyst's max turns based on your daily commit volume — 20 turns handles most teams&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Use Case 4: Standup Reports
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Trigger:&lt;/strong&gt; Daily cron, 8 AM (or Monday/Wednesday/Friday for async standups)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The flow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Cron trigger fires before standup&lt;/li&gt;
&lt;li&gt;Three parallel integration nodes: GitHub (commits and PRs from the last 24 hours), Linear or Jira (recently updated issues), and Slack (messages from #engineering, optional)&lt;/li&gt;
&lt;li&gt;Report Writer agent synthesizes everything into a standup-format summary: what shipped, what is in progress, what is blocked&lt;/li&gt;
&lt;li&gt;Slack message to #standup with the report&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Why it is useful:&lt;/strong&gt; Standup reports are a tax on engineering time. Every developer spends 5-10 minutes remembering what they did yesterday and writing it up. Multiply by team size and frequency, and it adds up. An AI agent that reads the actual work artifacts — commits, PRs, issue updates — produces a more accurate summary than memory-based self-reporting, and it takes zero developer time.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Add a condition node to flag blockers and route them to #engineering-leads&lt;/li&gt;
&lt;li&gt;Run it weekly instead of daily for sprint summaries&lt;/li&gt;
&lt;li&gt;Add a Notion integration to auto-update a team wiki page&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How Triggers Work
&lt;/h2&gt;

&lt;p&gt;All four workflows above use one of two trigger types.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Webhook triggers&lt;/strong&gt; fire when an external service sends an HTTP POST to the workflow's unique URL. The payload is available to all downstream nodes via &lt;code&gt;{{trigger.payload.*}}&lt;/code&gt; template variables. PagerDuty, GitHub, Sentry, Stripe, and most modern SaaS tools support webhook configuration. The webhook URL is generated automatically when you add a trigger node — no server configuration required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cron triggers&lt;/strong&gt; fire on a schedule using standard cron syntax. &lt;code&gt;0 6 * * *&lt;/code&gt; runs daily at 6 AM UTC. &lt;code&gt;*/30 * * * *&lt;/code&gt; runs every 30 minutes. &lt;code&gt;0 8 * * 1-5&lt;/code&gt; runs at 8 AM on weekdays only. Cron triggers do not carry a payload, so downstream nodes rely on integration calls to fetch current data rather than event-driven input.&lt;/p&gt;

&lt;p&gt;Choose webhooks for event-driven workflows where something needs to happen immediately after an external event. Choose cron for polling-based workflows that check on things periodically.&lt;/p&gt;

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

&lt;p&gt;The fastest way to start is to clone a template. Go to the template gallery in Swrly and search for "Incident Response," "Security Audit," or "Standup Report." Click "Use Template" to clone it into your workspace. Then customize the integration connections, adjust the agent prompts for your stack, and run a test.&lt;/p&gt;

&lt;p&gt;All templates are free and available on every plan. You can modify them however you want — add nodes, change prompts, swap integrations, add condition branches. They are starting points, not locked configurations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Clone the Incident Response Template
&lt;/h2&gt;

&lt;p&gt;Sign up at &lt;a href="https://swrly.com" rel="noopener noreferrer"&gt;swrly.com&lt;/a&gt;, navigate to Templates, and search for "Incident Response." One click clones it into your workspace. Connect your PagerDuty, Sentry, GitHub, and Slack integrations, and you have a production-ready incident triage pipeline in under 5 minutes.&lt;/p&gt;

&lt;p&gt;If your team is already drowning in alerts and spending too much time on manual triage, this is the highest-ROI workflow to automate first. Let the agents do the correlation. Let the humans make the decisions.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>devops</category>
      <category>ai</category>
    </item>
    <item>
      <title>Swrly vs Building Your Own Agent Framework</title>
      <dc:creator>Swrly</dc:creator>
      <pubDate>Fri, 10 Apr 2026 16:47:04 +0000</pubDate>
      <link>https://dev.to/swrly/swrly-vs-building-your-own-agent-framework-db4</link>
      <guid>https://dev.to/swrly/swrly-vs-building-your-own-agent-framework-db4</guid>
      <description>&lt;p&gt;Every engineering team building with LLMs hits the same fork in the road. Do you use a platform, or do you build your own agent framework? The answer is not obvious, and anyone who tells you it is probably selling something.&lt;/p&gt;

&lt;p&gt;We built Swrly because we hit the limits of DIY agent orchestration ourselves. But we are not going to pretend it is the right choice for every team. Here is an honest breakdown.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Build-vs-Buy Question
&lt;/h2&gt;

&lt;p&gt;The decision is not really about cost. It is about what your team should be spending its time on.&lt;/p&gt;

&lt;p&gt;If your core product &lt;em&gt;is&lt;/em&gt; an AI agent system -- if orchestration logic is your competitive advantage -- then building your own framework makes sense. You need full control over execution, memory, and tool dispatch because those are the things that differentiate you.&lt;/p&gt;

&lt;p&gt;If your team uses AI agents to automate internal workflows, review PRs, triage incidents, or augment existing processes, then building orchestration infrastructure from scratch is a distraction. You would not build your own CI/CD system either.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Get with Swrly
&lt;/h2&gt;

&lt;p&gt;Swrly is an opinionated platform. That means you trade some flexibility for a lot of velocity. Here is what you get out of the box:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Visual builder with 8 node types.&lt;/strong&gt; Agent nodes, integration nodes, condition nodes, triggers, loops, approvals, and joins. You drag them onto a canvas, connect them, and you have a directed workflow. No Python glue code. No YAML files. The topology is the source of truth.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trigger system.&lt;/strong&gt; Five trigger types -- manual, webhook, cron, API, and event-based. Your workflows can fire on a GitHub push, a Slack message, a cron schedule, or an API call from your existing CI/CD pipeline. This is plumbing that takes weeks to build correctly and months to make reliable.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Observability from day one.&lt;/strong&gt; Every agent run streams logs in real time. You can see which node is executing, what it produced, how long it took, and where it failed. When a 6-node workflow produces bad output, you click on the node that went wrong instead of reading through a 500-line trace.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;47 integrations, 350+ MCP tools.&lt;/strong&gt; GitHub, Slack, Linear, Jira, PagerDuty, Datadog, Sentry, databases, HTTP endpoints. Each integration is a set of pre-built tools that agents can call. No writing API wrapper code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Zero infrastructure.&lt;/strong&gt; No Redis clusters to manage, no BullMQ queues to tune, no worker processes to scale. You configure your agents, connect your API keys via BYOK, and run.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Plan enforcement and RBAC.&lt;/strong&gt; Usage limits, role-based access, API key management, workspace isolation. The kind of boring operational stuff that takes a surprising amount of time to build.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You Get Rolling Your Own
&lt;/h2&gt;

&lt;p&gt;There are real advantages to building a custom framework. We would be dishonest to ignore them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Full control over the execution engine.&lt;/strong&gt; Swrly runs agents through the Claude Code SDK. If you need to use a different model provider, or you need custom execution semantics like speculative branching or dynamic agent spawning, you need your own runtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Custom memory and state management.&lt;/strong&gt; Swrly provides context accumulation and scratchpad-based state. If your use case requires long-term vector memory, retrieval-augmented generation, or custom knowledge graphs, a platform's state model may not be enough.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deep framework integration.&lt;/strong&gt; If your team already has a LangChain or CrewAI codebase with months of investment, migrating to a platform has real costs. Sometimes the right move is to keep building on what you have.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Niche execution patterns.&lt;/strong&gt; Multi-turn conversations, adversarial agent debates, agent-as-judge evaluation loops -- these patterns do not map cleanly to a DAG-based workflow builder. Custom code gives you the freedom to model these directly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No vendor dependency.&lt;/strong&gt; Your orchestration logic lives in your repo, runs on your infra, and does not depend on a third-party service being available.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision Framework
&lt;/h2&gt;

&lt;p&gt;Here is a table we use internally when talking to teams evaluating Swrly:&lt;/p&gt;

&lt;p&gt;| Factor | Swrly | DIY Framework |&lt;br&gt;
|&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>architecture</category>
      <category>ai</category>
    </item>
    <item>
      <title>5 AI Workflows Every DevOps Team Should Automate</title>
      <dc:creator>Swrly</dc:creator>
      <pubDate>Fri, 10 Apr 2026 16:47:01 +0000</pubDate>
      <link>https://dev.to/swrly/5-ai-workflows-every-devops-team-should-automate-31b9</link>
      <guid>https://dev.to/swrly/5-ai-workflows-every-devops-team-should-automate-31b9</guid>
      <description>&lt;p&gt;DevOps teams spend a shocking amount of time on tasks that follow predictable patterns. Review this PR. Triage this alert. Summarize this deploy. Check these dependency updates. The patterns are consistent enough for AI agents to handle, but most teams have not automated them because wiring up the integrations is tedious.&lt;/p&gt;

&lt;p&gt;Here are five workflows we see DevOps teams build in Swrly within their first week. Each one replaces hours of toil per week with a workflow that runs in minutes.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. PR Review Pipeline
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does.&lt;/strong&gt; When a pull request is opened, an agent reads the diff, checks for common issues (security patterns, missing tests, style violations, performance concerns), and posts a structured review comment on the PR. A second agent summarizes the changes for the team lead in Slack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nodes you would use:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trigger node&lt;/strong&gt; -- webhook trigger, fired by GitHub's &lt;code&gt;pull_request.opened&lt;/code&gt; event&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent node&lt;/strong&gt; ("Code Reviewer") -- reads the diff via GitHub MCP tools, produces a structured review&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Condition node&lt;/strong&gt; -- branches on severity: if critical issues found, route to the notification path&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration node&lt;/strong&gt; -- posts the review as a PR comment via &lt;code&gt;github_create_review&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent node&lt;/strong&gt; ("PR Summarizer") -- generates a plain-language summary&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration node&lt;/strong&gt; -- sends the summary to a Slack channel via &lt;code&gt;slack_post_message&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters.&lt;/strong&gt; Code review is a bottleneck on every team. This does not replace human review -- it augments it. The AI catches the mechanical stuff (unused imports, missing error handling, hardcoded secrets) so human reviewers can focus on architecture and logic. We have a template for this one: "Ship It -- PR Review Pipeline."&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Incident Triage
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does.&lt;/strong&gt; When PagerDuty or Datadog fires an alert, an agent pulls recent logs, checks for similar past incidents, and posts a triage summary with recommended next steps. If the severity is high enough, it pages the on-call engineer with context already assembled.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nodes you would use:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trigger node&lt;/strong&gt; -- webhook trigger from PagerDuty or Datadog&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent node&lt;/strong&gt; ("Incident Analyst") -- fetches logs via the Datadog or Sentry MCP tools, analyzes the error pattern&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent node&lt;/strong&gt; ("History Checker") -- searches past incident records for similar patterns&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Condition node&lt;/strong&gt; -- routes based on severity level&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration node&lt;/strong&gt; -- posts triage summary to the incidents Slack channel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration node&lt;/strong&gt; -- if critical, creates a Linear issue and pages the on-call via PagerDuty&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters.&lt;/strong&gt; The first 10 minutes of an incident are usually spent gathering context. An agent can do that gathering in 30 seconds. By the time the on-call engineer opens their laptop, they have a summary of what is failing, what changed recently, and whether this has happened before. Mean time to resolution drops significantly when you eliminate the "what is even happening" phase.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Deploy Notification Digest
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does.&lt;/strong&gt; After a deployment completes, an agent collects all the commits included in the release, groups them by category (features, fixes, chores), generates a human-readable changelog, and posts it to Slack and optionally updates a Notion page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nodes you would use:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trigger node&lt;/strong&gt; -- API trigger called from your deploy script or GitHub Action&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent node&lt;/strong&gt; ("Changelog Writer") -- uses &lt;code&gt;github_list_commits&lt;/code&gt; and &lt;code&gt;github_compare_commits&lt;/code&gt; to gather the diff between the previous and current release tags&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration node&lt;/strong&gt; -- posts the formatted changelog to Slack via &lt;code&gt;slack_post_message&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration node&lt;/strong&gt; -- updates a Notion database with the release record via &lt;code&gt;notion_create_page&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters.&lt;/strong&gt; Nobody writes good release notes manually. They either skip it entirely or write something vague like "various fixes and improvements." An agent that reads the actual commits and PR descriptions produces genuinely useful changelogs. Product managers and support teams actually know what shipped.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Log Anomaly Detection
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does.&lt;/strong&gt; On a cron schedule, an agent queries your logging system for the past hour, identifies patterns that deviate from normal (error rate spikes, new error types, unusual request patterns), and surfaces anything worth investigating.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nodes you would use:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trigger node&lt;/strong&gt; -- cron trigger, runs every hour&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent node&lt;/strong&gt; ("Log Analyst") -- queries Datadog or your logging endpoint via HTTP tools, compares current patterns against baseline&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Condition node&lt;/strong&gt; -- if anomalies detected, route to notification path; otherwise, log a clean summary and exit&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration node&lt;/strong&gt; -- posts anomaly report to the monitoring Slack channel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration node&lt;/strong&gt; -- creates a Linear issue for anything that needs investigation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters.&lt;/strong&gt; Most monitoring tools are good at threshold-based alerts. Error rate above 5 percent, latency above 500ms. They are less good at detecting subtle pattern shifts -- a new error type appearing at low volume, a gradual increase in a specific endpoint's latency, or a sudden drop in traffic from one region. An AI agent can spot these patterns because it reads logs the way a human would, just faster and more consistently.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Dependency Update Reviewer
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What it does.&lt;/strong&gt; When Dependabot or Renovate opens a PR with dependency updates, an agent reviews the changelogs of the updated packages, checks for breaking changes, evaluates whether your codebase uses any affected APIs, and posts a risk assessment on the PR.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nodes you would use:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trigger node&lt;/strong&gt; -- webhook trigger on PRs from the bot user&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent node&lt;/strong&gt; ("Dependency Analyst") -- reads the PR diff to identify which packages are being updated and to which versions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent node&lt;/strong&gt; ("Changelog Reader") -- fetches the changelogs and release notes for each updated package via HTTP tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Condition node&lt;/strong&gt; -- routes based on risk level: major version bumps get extra scrutiny&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Integration node&lt;/strong&gt; -- posts a risk assessment comment on the PR via &lt;code&gt;github_create_review&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approval node&lt;/strong&gt; -- for high-risk updates, pauses the workflow until a human approves&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Why it matters.&lt;/strong&gt; Dependency updates are one of those tasks that everyone knows they should do but nobody wants to do. The reason is that evaluating whether an update is safe takes real effort -- reading changelogs, checking for breaking changes, testing. An agent cannot run your test suite, but it can do the research step and tell you "this major version bump removes an API you use in 3 files" before you waste time on a merge that will break the build.&lt;/p&gt;

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

&lt;p&gt;Each of these workflows takes 15 to 30 minutes to build in Swrly's visual builder. The PR review pipeline and incident triage workflows are the most common starting points because they deliver immediate, visible value.&lt;/p&gt;

&lt;p&gt;The key insight is that none of these workflows replace human judgment. They handle the mechanical parts -- gathering context, reading diffs, checking changelogs, formatting summaries -- so that humans can make better decisions faster.&lt;/p&gt;

&lt;p&gt;If you are running a DevOps team and you are not automating at least the PR review and incident triage workflows, you are leaving hours on the table every week. Start with one, see the results, and expand from there.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>tutorial</category>
      <category>ai</category>
    </item>
    <item>
      <title>How Swrly Works: Agent Teams vs Anonymous Chains</title>
      <dc:creator>Swrly</dc:creator>
      <pubDate>Fri, 10 Apr 2026 16:46:23 +0000</pubDate>
      <link>https://dev.to/swrly/how-swrly-works-agent-teams-vs-anonymous-chains-57c4</link>
      <guid>https://dev.to/swrly/how-swrly-works-agent-teams-vs-anonymous-chains-57c4</guid>
      <description>&lt;p&gt;If you have worked with LLM frameworks like LangChain, CrewAI, or AutoGen, you have probably experienced this: your "agents" are really just sequential function calls with shared state. They do not have names. They do not have specialties. They are anonymous steps in a chain, and when something goes wrong, good luck figuring out which step failed and why.&lt;/p&gt;

&lt;p&gt;Swrly takes a fundamentally different approach.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem with Anonymous Chains
&lt;/h2&gt;

&lt;p&gt;Most agent frameworks model workflows as linear pipelines. You define a series of steps, each one receiving the output of the previous one. The framework handles the plumbing. It looks clean in a tutorial, but in production it creates real problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No role clarity.&lt;/strong&gt; Every step is interchangeable. There is no concept of "this agent is a code reviewer" versus "this agent is a project manager." They are all just prompt-plus-tool combinations in a list.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Debugging is painful.&lt;/strong&gt; When a 7-step chain produces bad output, you have to trace through every step to find where things went wrong. There are no names, no boundaries, no clear ownership.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Context bleed.&lt;/strong&gt; Because agents share a single context window, earlier steps can pollute later ones. A verbose data-fetching step consumes tokens that your reasoning step needs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No conditional logic.&lt;/strong&gt; Linear chains are linear. If you need branching — "if the review passes, deploy; if it fails, notify" — you are writing custom Python glue code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not orchestration. It is scripting with extra steps.&lt;/p&gt;

&lt;h2&gt;
  
  
  Swrly's Approach: Named Specialist Agents
&lt;/h2&gt;

&lt;p&gt;In Swrly, every agent in a workflow is a &lt;strong&gt;named specialist&lt;/strong&gt; with a clear identity:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A distinct role&lt;/strong&gt; — "Code Reviewer," "PR Summarizer," "Deployment Manager"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A tailored system prompt&lt;/strong&gt; — instructions specific to that agent's job&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Its own tool access&lt;/strong&gt; — each agent gets only the integrations it needs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configurable behavior&lt;/strong&gt; — max turns, context accumulation, output format&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you look at a Swrly workflow, you can immediately understand what each agent does and why it is there. This is not a cosmetic difference. It changes how you design, debug, and maintain your automations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Visual Builder
&lt;/h2&gt;

&lt;p&gt;Swrly workflows are built on a &lt;strong&gt;drag-and-drop canvas&lt;/strong&gt;, not in YAML files or Python scripts. The builder gives you a spatial view of your entire workflow — which agents connect to which, where conditions branch, and how data flows through the system.&lt;/p&gt;

&lt;p&gt;You add nodes by dragging them from the sidebar or using the command palette (&lt;code&gt;Cmd+K&lt;/code&gt;). You connect them by drawing edges between ports. You configure each node by clicking it and editing its properties in the side panel.&lt;/p&gt;

&lt;p&gt;This is not a toy. The builder supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Undo/redo&lt;/strong&gt; with full state history&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auto-layout&lt;/strong&gt; for organizing complex workflows&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Viewport persistence&lt;/strong&gt; so your canvas position is saved between sessions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resizable configuration panels&lt;/strong&gt; for comfortable editing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyboard shortcuts&lt;/strong&gt; and full accessibility support&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything you build visually maps directly to the execution model. What you see is what runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six Node Types
&lt;/h2&gt;

&lt;p&gt;Swrly workflows are composed of six node types, each serving a distinct purpose:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agent nodes&lt;/strong&gt; are the core. Each one wraps a Claude-powered agent with a system prompt, tool access, and configurable parameters like &lt;code&gt;maxTurns&lt;/code&gt; and &lt;code&gt;accumulateContext&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Integration nodes&lt;/strong&gt; connect to external services without needing an agent. Send a Slack message, create a Jira ticket, or fetch data from an API — directly, with no LLM call required.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Condition nodes&lt;/strong&gt; enable branching logic. Define rules like "if the previous output contains APPROVED" or "if the sentiment score is above 0.8," and the workflow splits into separate paths. Six operators are supported: &lt;code&gt;equals&lt;/code&gt;, &lt;code&gt;not_equals&lt;/code&gt;, &lt;code&gt;contains&lt;/code&gt;, &lt;code&gt;not_contains&lt;/code&gt;, &lt;code&gt;greater_than&lt;/code&gt;, and &lt;code&gt;less_than&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trigger nodes&lt;/strong&gt; start workflows automatically. Configure a webhook URL, a cron schedule, or an event listener, and the workflow runs without manual intervention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Loop nodes&lt;/strong&gt; repeat a section of the workflow over a list of items — process each file in a PR, each row in a spreadsheet, or each message in a queue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Approval nodes&lt;/strong&gt; pause execution and wait for a human to review and approve before continuing. Critical for workflows where you want a human in the loop before deployment or notification.&lt;/p&gt;

&lt;h2&gt;
  
  
  37 Integrations, 318 MCP Tools
&lt;/h2&gt;

&lt;p&gt;Swrly agents do not just talk to each other. They interact with the tools your team already uses. The platform ships with &lt;strong&gt;37 integrations&lt;/strong&gt; and &lt;strong&gt;318 MCP tools&lt;/strong&gt; spanning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Development:&lt;/strong&gt; GitHub, GitLab, Bitbucket, Vercel, AWS&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Project management:&lt;/strong&gt; Jira, Linear, Asana, Notion, Airtable&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Communication:&lt;/strong&gt; Slack, Discord, Twilio, Microsoft Teams&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Monitoring:&lt;/strong&gt; PagerDuty, Sentry, Datadog, PostHog&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI/ML:&lt;/strong&gt; OpenAI, Hugging Face&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Productivity:&lt;/strong&gt; Google Workspace, Confluence, Trello&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each integration exposes specific tools — &lt;code&gt;github_create_pr&lt;/code&gt;, &lt;code&gt;slack_send_message&lt;/code&gt;, &lt;code&gt;linear_create_issue&lt;/code&gt; — that agents can call during execution. You configure which tools each agent has access to, keeping the principle of least privilege.&lt;/p&gt;

&lt;h2&gt;
  
  
  BYOK: Your Claude Subscription, Not Ours
&lt;/h2&gt;

&lt;p&gt;Here is something that matters a lot in production: &lt;strong&gt;Swrly does not charge you for AI usage.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most platforms charge per-token or per-credit on top of the platform fee. With Swrly, you bring your own Claude Code subscription. You pay Anthropic directly for your AI usage ($20/month for Claude Pro). Swrly charges separately for orchestration features ($0-$99/month depending on your plan).&lt;/p&gt;

&lt;p&gt;You paste your Claude Code session token in Settings. Swrly encrypts it with &lt;strong&gt;AES-256-GCM&lt;/strong&gt;, stores it securely, and uses it ephemerally during execution. Your key is never logged, never shared, and never used outside your workflow runs.&lt;/p&gt;

&lt;p&gt;Two separate, predictable bills. No surprises.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-Time Observability
&lt;/h2&gt;

&lt;p&gt;When a workflow runs, you do not stare at a loading spinner. Swrly provides a &lt;strong&gt;real-time execution overlay&lt;/strong&gt; directly on the canvas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Each node lights up as it executes — pending, running, completed, or failed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server-Sent Events (SSE)&lt;/strong&gt; stream status updates with no polling&lt;/li&gt;
&lt;li&gt;Click any completed node to see its full output, token usage, and execution time&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;run history&lt;/strong&gt; panel shows every past execution with timestamps and status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is not a log file you parse after the fact. It is a live view of your workflow doing its job.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example: A 3-Agent PR Review Workflow
&lt;/h2&gt;

&lt;p&gt;Here is a concrete workflow you can build in Swrly in about 10 minutes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Webhook Trigger&lt;/strong&gt; — listens for &lt;code&gt;pull_request.opened&lt;/code&gt; events from GitHub&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Code Reviewer Agent&lt;/strong&gt; — receives the PR diff, analyzes code quality, security issues, and style violations. Uses &lt;code&gt;github_get_content&lt;/code&gt; and &lt;code&gt;github_list_pr_files&lt;/code&gt; tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Condition Node&lt;/strong&gt; — checks if the reviewer's output contains "APPROVED"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slack Notification (approved branch)&lt;/strong&gt; — posts to &lt;code&gt;#shipped&lt;/code&gt;: "PR #42 approved by Swrly"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Slack Notification (revision branch)&lt;/strong&gt; — posts to &lt;code&gt;#reviews&lt;/code&gt;: "PR #42 needs changes" with the reviewer's feedback&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Code Reviewer agent's system prompt might look like this:&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 code reviewer. Analyze the PR diff for:
- Security vulnerabilities
- Performance issues
- Code style violations
- Missing error handling

End your review with either APPROVED or NEEDS_REVISION followed by
a summary of your findings.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No Python. No YAML. No deployment scripts. You build it visually, test it with a real PR, and it runs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Is This For?
&lt;/h2&gt;

&lt;p&gt;Swrly is built for &lt;strong&gt;engineering teams&lt;/strong&gt; that want to automate complex, multi-step workflows involving AI reasoning. If you are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manually reviewing PRs and posting summaries to Slack&lt;/li&gt;
&lt;li&gt;Writing one-off scripts to triage bugs across Jira and GitHub&lt;/li&gt;
&lt;li&gt;Building internal tools that need LLM reasoning in the middle&lt;/li&gt;
&lt;li&gt;Running AI-powered QA pipelines that need human approval gates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then Swrly replaces the glue code, the cron jobs, and the fragile scripts with a visual, observable, maintainable system.&lt;/p&gt;

&lt;h2&gt;
  
  
  Start Building
&lt;/h2&gt;

&lt;p&gt;Swrly is free to start. No credit card required. Sign up at &lt;a href="https://swrly.com" rel="noopener noreferrer"&gt;swrly.com&lt;/a&gt;, create your first swirl, and see what named specialist agents can do for your team.&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>BYOK Isn't Just About Cost — It's About Control</title>
      <dc:creator>Swrly</dc:creator>
      <pubDate>Fri, 10 Apr 2026 16:46:20 +0000</pubDate>
      <link>https://dev.to/swrly/byok-isnt-just-about-cost-its-about-control-2pcb</link>
      <guid>https://dev.to/swrly/byok-isnt-just-about-cost-its-about-control-2pcb</guid>
      <description>&lt;p&gt;When most platforms talk about Bring Your Own Key, they frame it as a cost optimization. Use your own API keys, pay the model providers directly, avoid the markup. That is a real benefit. But it is not the most important one.&lt;/p&gt;

&lt;p&gt;The real reason BYOK matters is control. Control over your credentials. Control over your data flow. Control over your audit trail. For any team that cares about security or compliance, BYOK is not a nice-to-have pricing feature. It is a fundamental architecture decision.&lt;/p&gt;

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

&lt;p&gt;Here is the default model for most AI platforms: you sign up, the platform gives you access to AI models through their API keys. Your prompts and data flow through the platform's credentials. The platform handles billing, rate limiting, and access control on your behalf.&lt;/p&gt;

&lt;p&gt;This is convenient. It is also a security liability.&lt;/p&gt;

&lt;p&gt;When you use a platform's shared API keys, your data is processed under their account with their model provider. You are trusting the platform to not log your prompts, to not commingle your usage with other customers, and to handle key rotation, access controls, and incident response for credentials that touch your data.&lt;/p&gt;

&lt;p&gt;For a side project, this is fine. For a company handling customer data, financial information, or anything regulated, it introduces risk that is difficult to quantify and impossible to audit from the outside.&lt;/p&gt;

&lt;p&gt;You cannot verify what happens to your data once it leaves your application and enters the platform's credential scope. You cannot enforce your own retention policies on the model provider's side because the API key is not yours. And if the platform's credentials are compromised, every customer is affected, not just the one whose data was targeted.&lt;/p&gt;

&lt;h2&gt;
  
  
  What BYOK Actually Means
&lt;/h2&gt;

&lt;p&gt;BYOK means your API keys, your account, your control surface. When an AI agent runs a task on your behalf, it authenticates with the model provider using credentials that belong to you. The platform orchestrates the workflow, but the data flows through your billing relationship with the model provider.&lt;/p&gt;

&lt;p&gt;This is a meaningful architectural difference, not just a billing redirect.&lt;/p&gt;

&lt;p&gt;With BYOK, your usage appears in your own model provider dashboard. You can see exactly which models were called, how many tokens were consumed, and when. You can set your own rate limits, spending caps, and alerting thresholds directly with the provider. If you need to revoke access, you rotate your own key. The platform never had it permanently to begin with.&lt;/p&gt;

&lt;p&gt;At Swrly, BYOK tokens are encrypted at rest with AES-256-GCM and stored in ephemeral Redis keys that are consumed atomically via GETDEL. The platform never stores your key persistently. It exists in memory only for the duration of the workflow execution, encrypted in transit between services. When the run completes, the key is gone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security Implications
&lt;/h2&gt;

&lt;p&gt;BYOK changes your threat model in three concrete ways.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reduced blast radius.&lt;/strong&gt; If the orchestration platform is compromised, attackers do not get a master key that accesses every customer's model provider account. Each customer's credentials are isolated, ephemeral, and encrypted. Compromising one customer's key does not expose anyone else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Auditable data flow.&lt;/strong&gt; When your agent calls Claude or GPT-4 using your API key, that call appears in your Anthropic or OpenAI dashboard. You have a first-party record of what data was sent to the model, when, and by which key. This is not a log provided by the orchestration platform that you have to trust. It is a log from the model provider that you can verify independently.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key lifecycle control.&lt;/strong&gt; You decide when to rotate keys, how to scope them, and what permissions they carry. If your security policy requires monthly key rotation, you rotate on your schedule without depending on the platform's rotation cadence. If you need to restrict a key to specific models or set spending limits, you do it in your provider's dashboard.&lt;/p&gt;

&lt;p&gt;These are not theoretical benefits. They are the kind of concrete controls that security teams ask about during vendor reviews and that auditors check during compliance assessments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Compliance Made Simpler
&lt;/h2&gt;

&lt;p&gt;SOC2 Type II requires demonstrating that you control access to sensitive systems and that you can produce evidence of that control over time. AI model API keys are sensitive credentials. They provide access to systems that process your data.&lt;/p&gt;

&lt;p&gt;When you use a platform's shared keys, the compliance burden for those credentials falls on the platform. You have to trust their controls, review their SOC2 report, and hope their key management practices meet your auditor's expectations. You are adding a dependency to your compliance program that you cannot directly verify.&lt;/p&gt;

&lt;p&gt;With BYOK, the credentials are yours. You manage them in your own secrets manager. You rotate them according to your own policy. You can produce evidence of key creation, rotation, and revocation from your own systems. The orchestration platform is just a workflow engine. It does not hold the keys to your kingdom.&lt;/p&gt;

&lt;p&gt;This simplification matters for GDPR as well. When your data is processed using your own API credentials, the data processing relationship is between you and the model provider. The orchestration platform is a processor, not a sub-processor that independently accesses AI services on your behalf. This is a cleaner data flow to document and a simpler relationship to audit.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Swrly Does Differently
&lt;/h2&gt;

&lt;p&gt;Most platforms that claim BYOK support simply store your API key in their database and use it on your behalf. That is barely better than using their key. Your credential is still persisted on their infrastructure, still accessible to their application code, still at risk if their database is compromised.&lt;/p&gt;

&lt;p&gt;Swrly treats BYOK as a security primitive, not a feature checkbox. Keys are encrypted with AES-256-GCM before they touch any storage layer. They are stored in ephemeral Redis keys with automatic expiration. The GETDEL operation ensures that a key can only be consumed once. The encryption key supports rotation via a previous-key fallback mechanism, so key rotation does not require re-encrypting all stored credentials simultaneously.&lt;/p&gt;

&lt;p&gt;At the platform level, Swrly does not have a "master" API key for any model provider. There is no shared credential that processes customer data. Every model call uses the customer's own key. This is not a configuration option. It is the only mode of operation.&lt;/p&gt;

&lt;p&gt;This architecture means that Swrly's infrastructure, if fully compromised, does not expose a single model provider credential in plaintext. The encrypted ephemeral tokens are useless without the encryption key, and even with it, the GETDEL semantics mean most tokens no longer exist by the time anyone could attempt to decrypt them.&lt;/p&gt;

&lt;p&gt;BYOK is usually the last item on a feature comparison spreadsheet, positioned as a cost optimization for high-volume users. It should be the first question you ask any AI platform that will process your data. Not "do you support BYOK" but "is BYOK the only way your platform operates." The answer tells you everything about how seriously they take your security.&lt;/p&gt;

</description>
      <category>security</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>The Hidden Cost of AI Agent Sprawl</title>
      <dc:creator>Swrly</dc:creator>
      <pubDate>Fri, 10 Apr 2026 16:45:43 +0000</pubDate>
      <link>https://dev.to/swrly/the-hidden-cost-of-ai-agent-sprawl-533l</link>
      <guid>https://dev.to/swrly/the-hidden-cost-of-ai-agent-sprawl-533l</guid>
      <description>&lt;p&gt;It starts innocently. Someone on the team writes a script that uses Claude to summarize Slack threads. It runs on a cron job. It works. A week later, someone else writes a Lambda function that reviews PRs with GPT-4. Then another developer builds a Jupyter notebook that generates weekly reports from your analytics data and emails them out.&lt;/p&gt;

&lt;p&gt;Six months later, you have 15 AI-powered scripts running across 4 different environments, using 3 different model providers, with no shared configuration, no centralized logs, and no one person who knows what all of them do.&lt;/p&gt;

&lt;p&gt;This is agent sprawl. And it is happening at every company that has adopted AI tooling without a plan for managing it.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Sprawl Happens
&lt;/h2&gt;

&lt;p&gt;Agent sprawl follows the same pattern as the microservice sprawl of the 2010s, just faster. AI makes it trivially easy to build useful automations. A developer can go from idea to working prototype in an afternoon. The barrier to creating a new agent is so low that nobody thinks to check whether a similar one already exists.&lt;/p&gt;

&lt;p&gt;The sprawl accelerates because there is no natural pressure to consolidate. Each script works fine in isolation. The developer who built it knows how it works. It runs on their preferred platform. It uses whatever model they are most comfortable with. From any individual perspective, there is no problem to solve.&lt;/p&gt;

&lt;p&gt;The problems are systemic, and they only become visible when you zoom out.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Symptoms
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Nobody knows what is running.&lt;/strong&gt; Ask your team lead to list every AI-powered automation currently active in your organization. They cannot do it. Some are cron jobs on EC2 instances. Some are GitHub Actions. Some are Slack apps running on someone's side project Heroku account. There is no inventory because there was never a reason to build one, until something breaks and you need to find it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Failures are silent.&lt;/strong&gt; A cron job that summarizes support tickets stops working because the model API changed its response format. The script throws an error, the cron job silently fails, and nobody notices for two weeks because the output was going to a Slack channel that three people check. There is no alerting because the script was never set up with monitoring. It was a quick hack that became permanent.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Costs are invisible.&lt;/strong&gt; Each individual script costs a few dollars a month in API calls. But when you have 15 of them, some running more frequently than intended, some retrying on errors without backoff, some sending the same data to the model multiple times because of bugs, the aggregate cost creeps up. We have talked to teams spending $800 per month on scattered AI API calls that they could not account for because the billing was spread across personal API keys, team accounts, and company credit cards.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security and compliance are an afterthought.&lt;/strong&gt; Each script has its own API keys, stored in environment variables, dotfiles, or sometimes hardcoded. There is no rotation policy. There is no audit trail of what data each agent accesses. When your security team asks which AI tools have access to customer data, the honest answer is "we do not know." For any team pursuing SOC2 or handling regulated data, this is disqualifying.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Cost Nobody Tracks
&lt;/h2&gt;

&lt;p&gt;The biggest cost of agent sprawl is not the API bills. It is the organizational overhead.&lt;/p&gt;

&lt;p&gt;When a new team member joins, they have to discover the existing automations through tribal knowledge. When something breaks, debugging requires tracking down the original author and hoping they remember how the script works. When you want to extend an existing automation, it is often easier to build a new one from scratch than to find and modify the original.&lt;/p&gt;

&lt;p&gt;This is the same technical debt pattern that engineering teams have fought for decades, just applied to AI. And just like with microservices, the answer is not to stop building things. It is to build them in a way that is manageable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Orchestration Actually Means
&lt;/h2&gt;

&lt;p&gt;Orchestration does not mean "make everything more complex." It means giving your AI automations the same infrastructure discipline you give your application code. Specifically, it means four things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A single place to see what is running.&lt;/strong&gt; Every agent, every workflow, every scheduled execution, visible in one dashboard. Not spread across AWS Lambda, Heroku, cron tabs, and GitHub Actions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured execution with logs.&lt;/strong&gt; Every run produces a trace with inputs, outputs, durations, and token costs per step. When something fails, you know what failed, when, and why. When something succeeds, you have a record of what it did.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Centralized credential management.&lt;/strong&gt; API keys stored once, encrypted, with access controls. Not scattered across environment variables in 15 different runtime environments. Rotation happens in one place. Audit trails come for free.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Defined ownership and boundaries.&lt;/strong&gt; Each workflow belongs to a workspace. Each agent has a named role. When someone asks "what AI tools access our customer database," you can answer with a query instead of a scavenger hunt.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Better Pattern
&lt;/h2&gt;

&lt;p&gt;The alternative to sprawl is not "build fewer things." It is "build things in a place where they can be found, observed, and managed."&lt;/p&gt;

&lt;p&gt;When a developer on your team has an idea for a new AI automation, the workflow should be: open the orchestration platform, check if a similar agent already exists, build or extend the workflow in the visual builder, and deploy it with the same observability and credential management as everything else.&lt;/p&gt;

&lt;p&gt;The individual agents stay simple. The developer still gets to move fast. But the result is a workflow that the whole team can see, debug, and maintain instead of a script on someone's laptop that everyone forgot about until it stopped working.&lt;/p&gt;

&lt;p&gt;Agent sprawl is not a technology problem. It is an organizational one. And like most organizational problems in engineering, the fix is better tooling and clearer defaults, not more process documents that nobody reads.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>devops</category>
    </item>
    <item>
      <title>Why AI Agents Need Workflows, Not Just Prompts</title>
      <dc:creator>Swrly</dc:creator>
      <pubDate>Fri, 10 Apr 2026 16:45:34 +0000</pubDate>
      <link>https://dev.to/swrly/why-ai-agents-need-workflows-not-just-prompts-29ef</link>
      <guid>https://dev.to/swrly/why-ai-agents-need-workflows-not-just-prompts-29ef</guid>
      <description>&lt;p&gt;You build an agent. You give it a system prompt, a few tools, and access to an API. It works. You show the demo. Everyone is impressed. Then you try to put it in production and everything falls apart.&lt;/p&gt;

&lt;p&gt;This is the story of almost every team that has tried to ship AI agents in the last two years. The single-agent, single-prompt pattern is a great starting point. It is a terrible architecture for anything that needs to be reliable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Single-Agent Ceiling
&lt;/h2&gt;

&lt;p&gt;A single-prompt agent is essentially a loop: take input, think, call tools, return output. Frameworks like LangChain and CrewAI make this loop easy to set up. You can get a working prototype in an afternoon. The problem is that prototypes and production systems have fundamentally different requirements.&lt;/p&gt;

&lt;p&gt;A prototype needs to work once. A production system needs to work every time, fail gracefully when it cannot, tell you what happened either way, and do all of this at scale without anyone babysitting it.&lt;/p&gt;

&lt;p&gt;Single-prompt agents cannot meet these requirements because they operate as monoliths. One prompt does everything: reasoning, tool selection, error handling, output formatting. When the task gets complex, you end up stuffing more instructions into the prompt, which makes the agent less reliable, not more. You are fighting the context window instead of designing for the problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Breaks in Production
&lt;/h2&gt;

&lt;p&gt;Here are the concrete failure modes we see when teams try to run single-agent architectures in production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No retry boundaries.&lt;/strong&gt; When a single agent fails at step 4 of a 7-step task, you have two options: restart from scratch or accept the failure. There is no way to retry just the step that failed because there are no steps. It is one big prompt execution. For a workflow that takes 3 minutes and costs $0.50 in tokens per run, restarting from scratch on every transient error gets expensive fast.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Context window pollution.&lt;/strong&gt; An agent that fetches data, analyzes it, makes a decision, and takes action is doing four distinct jobs in one context window. The raw data from the fetch step consumes tokens that the analysis step needs. The analysis output stays in context when you only need the decision. By the time you get to the action step, you are working with a bloated context that makes the agent slower and less focused.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No observability.&lt;/strong&gt; When a single agent produces bad output, you get one blob of text and a list of tool calls. Which reasoning step went wrong? Was it the data gathering? The analysis? The decision logic? You have to read through the entire trace manually and hope you can spot where the reasoning diverged. For a team running hundreds of agent executions per day, this does not scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No branching logic.&lt;/strong&gt; Real workflows have conditions. If the code review passes, merge the PR. If it fails, post a comment and notify the author. If the CI is still running, wait and check again. A single-prompt agent handles this through in-context reasoning, which means the branching logic is implicit, untestable, and invisible. You cannot look at a system diagram and understand the flow because there is no diagram. There is just a prompt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No handoffs.&lt;/strong&gt; Different tasks require different expertise. A data analysis task needs different tools, different context, and a different system prompt than a code generation task. When one agent does both, it is mediocre at each. When you split them into separate agents, you need a way to pass context between them. A single-agent architecture has no concept of handoffs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Workflows Change the Equation
&lt;/h2&gt;

&lt;p&gt;A directed workflow addresses each of these failure modes by making the implicit structure of your agent's task explicit.&lt;/p&gt;

&lt;p&gt;Instead of one agent doing everything, you have multiple specialist agents connected by edges in a graph. Each agent has a clear role, a focused prompt, and access to only the tools it needs. The workflow engine handles routing, retries, and context passing between them.&lt;/p&gt;

&lt;p&gt;This is not a new idea. Software engineering figured this out decades ago with microservices, Unix pipes, and CI/CD pipelines. The principle is the same: small, focused units of work composed into larger systems. The composition layer gives you the observability, retry logic, and branching that the individual units do not need to know about.&lt;/p&gt;

&lt;p&gt;With a workflow-based architecture, you get retry boundaries at every node. If the data fetch agent fails, retry it without re-running the analysis. You get isolated context windows. Each agent sees only what it needs, not the entire conversation history. You get visual observability. Every node in the graph has a status, a duration, an input, and an output. You can see exactly where things went wrong. You get explicit branching. Condition nodes route execution based on upstream outputs, and the branches are visible in the graph. And you get composable handoffs. Agent A's output becomes Agent B's input through a well-defined interface.&lt;/p&gt;

&lt;h2&gt;
  
  
  What This Looks Like in Practice
&lt;/h2&gt;

&lt;p&gt;Consider a PR review workflow. Without orchestration, you might write a single agent with a prompt like: "Review this PR. Check the code quality, verify the tests pass, check for security issues, and either approve it or request changes."&lt;/p&gt;

&lt;p&gt;That works for simple PRs. But for a real codebase, you want separate concerns. A code quality reviewer that focuses on style, patterns, and maintainability. A security scanner that checks for known vulnerability patterns. A test coverage analyzer that verifies the changed code is tested. And a decision agent that takes all three reviews and decides whether to approve, request changes, or flag for human review.&lt;/p&gt;

&lt;p&gt;In Swrly, this is a four-agent workflow with a join node. The three reviewers run in parallel. The join node waits for all three to complete. The decision agent receives their combined output and makes the final call. A condition node routes the result: approve the PR, post review comments, or send a Slack message to the team lead.&lt;/p&gt;

&lt;p&gt;Each agent is focused. Each agent can be tested independently. Each agent can be swapped out without touching the others. And when the security scanner takes too long, you can see it immediately in the execution overlay instead of wondering why the whole thing is slow.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Composability Unlock
&lt;/h2&gt;

&lt;p&gt;The real power of workflows is not just reliability. It is composability.&lt;/p&gt;

&lt;p&gt;Once you have a library of well-defined agents, you can compose them into new workflows without writing new code. Your PR review agents can be reused in a deployment pipeline. Your data analysis agent can feed into a reporting workflow or a monitoring alert. Your Slack notification agent works in every workflow that needs to notify someone.&lt;/p&gt;

&lt;p&gt;This is the same unlock that microservices gave to backend engineering and that CI/CD pipelines gave to DevOps. Small, reusable units composed through a declarative graph. The individual pieces stay simple. The composition layer handles the complexity.&lt;/p&gt;

&lt;p&gt;Single-prompt agents will always have a place for simple, one-shot tasks. But the moment you need reliability, observability, or composition, you need workflows. The ceiling is real, and the only way through it is to stop pretending that one prompt can do everything.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
