<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Daniel Marin</title>
    <description>The latest articles on Forem by Daniel Marin (@daniel_marin_871e4c78cfc0).</description>
    <link>https://forem.com/daniel_marin_871e4c78cfc0</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%2F3861902%2F2232fb79-5c6f-422a-b6f2-acec47f60bde.png</url>
      <title>Forem: Daniel Marin</title>
      <link>https://forem.com/daniel_marin_871e4c78cfc0</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/daniel_marin_871e4c78cfc0"/>
    <language>en</language>
    <item>
      <title>MCP Servers Explained: The One Protocol That Makes AI Tool Integrations Stop Sucking</title>
      <dc:creator>Daniel Marin</dc:creator>
      <pubDate>Thu, 16 Apr 2026 18:54:35 +0000</pubDate>
      <link>https://forem.com/daniel_marin_871e4c78cfc0/mcp-servers-explained-the-one-protocol-that-makes-ai-tool-integrations-stop-sucking-4cp0</link>
      <guid>https://forem.com/daniel_marin_871e4c78cfc0/mcp-servers-explained-the-one-protocol-that-makes-ai-tool-integrations-stop-sucking-4cp0</guid>
      <description>&lt;h2&gt;
  
  
  What the Model Context Protocol actually is, why it matters, and how to build your first server in under a hundred lines.
&lt;/h2&gt;

&lt;p&gt;If you've spent any time with AI agents in the last year, you've run into a frustrating pattern: every new tool integration means re-implementing the same plumbing. Auth for Gmail here, auth for Slack there, a custom Postgres adapter for one project, a different Postgres adapter for the next. It eats your afternoon and produces nothing durable.&lt;/p&gt;

&lt;p&gt;The Model Context Protocol (MCP for short) is the fix. It's an open standard for exposing tools, data, and prompts to AI agents, the same way HTTP is an open standard for exposing content to browsers. Write the integration once, and any MCP-compatible agent can use it.&lt;/p&gt;

&lt;p&gt;This guide walks through exactly what MCP is, why it matters, and how to build your first MCP server end to end.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is MCP, Really?
&lt;/h2&gt;

&lt;p&gt;MCP is a protocol. That's it. It's not a framework you have to adopt, a cloud service you have to pay for, or a library you have to import. It's a specification for how an AI agent (the client) talks to an external capability provider (the server) over JSON-RPC.&lt;/p&gt;

&lt;p&gt;The easiest mental model: MCP is to AI agents what USB-C is to hardware. Before USB-C, every device had its own cable. Now one shape fits everything. MCP plays the same role for AI tooling. One protocol, any agent, any integration.&lt;/p&gt;

&lt;p&gt;An MCP server can expose three kinds of things to an agent:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tools.&lt;/strong&gt; Functions the agent can call: "send_email", "query_database", "create_jira_ticket". Each tool has a name, a JSON Schema describing its inputs, and a return type.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources.&lt;/strong&gt; Read-only data the agent can pull into its context: a file, a database table, a page from Notion. Resources are addressed by URI so the agent can reference them by name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompts.&lt;/strong&gt; Reusable prompt templates the server offers to the client. Useful for standardizing common workflows ("summarize this ticket", "draft a release note") across agents and teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why MCP Matters More Than It Looks Like at First
&lt;/h2&gt;

&lt;p&gt;On the surface, MCP sounds like "another API standard." The reason it's a big deal is more subtle: it breaks the tight coupling between a model and its tools. Three downstream effects follow from that.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your integrations become portable.&lt;/strong&gt; Build an MCP server for your internal ticketing system once, and it works with Claude, any Claude Code project, and any other MCP-compatible client, now and in the future. When a better model comes out, you don't rebuild your tooling.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You can compose capabilities.&lt;/strong&gt; An agent can connect to multiple MCP servers at once (your GitHub server, your Postgres server, your Slack server) and reason across all of them. You stop thinking in integrations and start thinking in capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The ecosystem compounds.&lt;/strong&gt; Because MCP is open, the number of off-the-shelf servers grows every week. Filesystems, browsers, Git, databases, search engines: most of what an agent needs already exists as an MCP server someone else maintains.&lt;/p&gt;

&lt;h2&gt;
  
  
  How an MCP Conversation Actually Works
&lt;/h2&gt;

&lt;p&gt;Under the hood, MCP is a JSON-RPC conversation between a client and a server over either stdio (for local servers) or HTTP with Server-Sent Events (for remote ones). The handshake has three phases:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Initialize.&lt;/strong&gt; The client says hello, declares which protocol version it speaks, and asks what capabilities the server supports.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discovery.&lt;/strong&gt; The client calls &lt;code&gt;tools/list&lt;/code&gt;, &lt;code&gt;resources/list&lt;/code&gt;, and &lt;code&gt;prompts/list&lt;/code&gt; to find out what the server offers. Each returned entry includes a JSON Schema so the model knows how to call it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Invocation.&lt;/strong&gt; When the agent decides to use a tool, the client sends &lt;code&gt;tools/call&lt;/code&gt; with the tool name and arguments. The server executes and returns the result.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here's what a tool invocation looks like on the wire:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;client&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;→&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;server&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;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tools/call"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"params"&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;"create_issue"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"arguments"&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;"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;"acme/backend"&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="s2"&gt;"Payments webhook retry logic is flaky"&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="s2"&gt;"Fails on third retry..."&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="err"&gt;//&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;server&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;→&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;client&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;"jsonrpc"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"result"&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;"content"&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;"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;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Created issue #4821"&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;That's the whole protocol in miniature. The SDKs hide the JSON-RPC boilerplate, so in practice you're writing Python or TypeScript functions and decorating them as tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building Your First MCP Server (Step by Step)
&lt;/h2&gt;

&lt;p&gt;Let's build a minimal server from scratch. The example: a server that exposes one tool, &lt;code&gt;get_weather&lt;/code&gt;, which takes a city name and returns a temperature. The same shape generalizes to any integration you'll ever build.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Install the SDK
&lt;/h3&gt;

&lt;p&gt;The official SDKs are published for Python and TypeScript. Pick whichever your team is more comfortable with. The protocol is identical.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Python&lt;/span&gt;
pip &lt;span class="nb"&gt;install &lt;/span&gt;mcp

&lt;span class="c"&gt;# TypeScript&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; @modelcontextprotocol/sdk
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Write the Server
&lt;/h3&gt;

&lt;p&gt;Here's a complete Python MCP server in twenty lines:&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="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;mcp.server.fastmcp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;FastMCP&lt;/span&gt;

&lt;span class="n"&gt;mcp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;FastMCP&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weather-server&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@mcp.tool&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get_weather&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Return the current temperature for a given city.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="c1"&gt;# Replace with a real API call
&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;It is 18°C in &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; right now.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;__main__&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;mcp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three things are happening: &lt;code&gt;FastMCP&lt;/code&gt; creates a server, the &lt;code&gt;@mcp.tool()&lt;/code&gt; decorator registers the function (using the type hints and docstring to auto-generate the JSON Schema), and &lt;code&gt;mcp.run()&lt;/code&gt; starts the JSON-RPC loop. That's a complete, valid MCP server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Register It with Claude Code
&lt;/h3&gt;

&lt;p&gt;Add the server to your Claude Code config:&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;"mcpServers"&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;"weather"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"python"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"args"&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;"/absolute/path/to/server.py"&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;Restart Claude Code. The &lt;code&gt;get_weather&lt;/code&gt; tool is now available to any agent in that project, with the schema auto-derived from your type hints. Ask "what's the weather in Lisbon?" and watch the agent call your tool.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Add Resources and Prompts
&lt;/h3&gt;

&lt;p&gt;Tools are usually where the interesting behavior lives, but resources and prompts round out a useful server:&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="nd"&gt;@mcp.resource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;weather://history/{city}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;weather_history&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Return a 7-day weather history for a city.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;load_history&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nd"&gt;@mcp.prompt&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;weather_report&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="sh"&gt;"""&lt;/span&gt;&lt;span class="s"&gt;Generate a weather report for a given city.&lt;/span&gt;&lt;span class="sh"&gt;"""&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Write a short weather report for &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;city&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt; using the current data and the last 7 days.&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resources give the agent read-only data it can pull into context. Prompts give users a ready-made starting point they can invoke from the client UI. Neither is required. Start with tools, add the others when they earn their keep.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design Principles for Good MCP Servers
&lt;/h2&gt;

&lt;p&gt;You can get a server running in twenty lines. You can't get a &lt;em&gt;good&lt;/em&gt; server in twenty lines. The servers that hold up in production tend to share a few traits:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Name tools like verbs the agent would say.&lt;/strong&gt; &lt;code&gt;search_issues&lt;/code&gt;, not &lt;code&gt;issuesSearchV2&lt;/code&gt;. The model chooses tools based on their names and descriptions. Write them for the model, not for your internal API taxonomy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keep tool surface area small.&lt;/strong&gt; A server with eight focused tools outperforms one with forty overlapping ones. The agent has to pick the right tool on every turn. Fewer choices means fewer mistakes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Return structured, summarizable results.&lt;/strong&gt; Don't return a 50KB JSON blob when a five-line summary plus an ID to fetch more detail would do. Context is the agent's most expensive resource.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fail loudly and usefully.&lt;/strong&gt; Error messages are prompts. The agent reads them and decides what to do next. "Invalid date: expected YYYY-MM-DD, got 'last Friday'" is a good error. "400" is not.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gate destructive actions.&lt;/strong&gt; Require an explicit &lt;code&gt;confirm=true&lt;/code&gt; parameter for anything that sends, spends, or deletes. Agents confidently miswield new tools. Guard rails catch most of those mistakes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Local vs. Remote: Which Should You Build?
&lt;/h2&gt;

&lt;p&gt;MCP servers come in two flavors. Local servers run as subprocesses on your machine and talk over stdio. Remote servers run over HTTP + Server-Sent Events, letting you host shared tooling for a team or expose a public capability.&lt;/p&gt;

&lt;p&gt;Default to local. You'll only want a remote server if multiple people need to use the same tooling without setting it up themselves, the server needs access to secrets that shouldn't live on laptops, or you're exposing the capability to third parties. Each of those cases adds deployment, auth, and observability concerns that a local subprocess simply doesn't have.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where This Is All Going
&lt;/h2&gt;

&lt;p&gt;A year from now, "does it have an MCP server?" will be the first question teams ask when evaluating a new tool, the same way "does it have an API?" is asked today. The tools that don't expose themselves via MCP will still work, but they'll be invisible to the agents that increasingly do the work.&lt;/p&gt;

&lt;p&gt;The good news is how little effort it takes to be on the right side of that shift. A useful MCP server can be under a hundred lines of code. The protocol is stable, the SDKs are solid, and the ecosystem is growing fast enough that most of what you need already exists.&lt;/p&gt;

&lt;p&gt;Pick one integration you're tired of rebuilding, wrap it in MCP, and never think about it again.&lt;/p&gt;

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

&lt;p&gt;I maintain a curated collection of free playbooks and MCP resources at &lt;a href="https://www.claudecodehq.com" rel="noopener noreferrer"&gt;claudecodehq.com&lt;/a&gt;, including a catalog of production-ready MCP servers you can drop into any project, and a builder that scaffolds a working server from a plain-English description. If you want to skip the boilerplate, it's a good place to start.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://www.claudecodehq.com" rel="noopener noreferrer"&gt;claudecodehq.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>I Built My First AI Agent in an Afternoon. Here's the Playbook I Wish I Had on Day One.</title>
      <dc:creator>Daniel Marin</dc:creator>
      <pubDate>Wed, 15 Apr 2026 19:06:56 +0000</pubDate>
      <link>https://forem.com/daniel_marin_871e4c78cfc0/i-built-my-first-ai-agent-in-an-afternoon-heres-the-playbook-i-wish-i-had-on-day-one-m3i</link>
      <guid>https://forem.com/daniel_marin_871e4c78cfc0/i-built-my-first-ai-agent-in-an-afternoon-heres-the-playbook-i-wish-i-had-on-day-one-m3i</guid>
      <description>&lt;h2&gt;
  
  
  A step-by-step guide to going from a blank folder to a working agent, without the hype.
&lt;/h2&gt;

&lt;p&gt;"AI agent" has become one of the most overloaded words in tech. Depending on who you ask, it's either a ChatGPT wrapper, a multi-step workflow, or a fully autonomous system that replaces an employee.&lt;/p&gt;

&lt;p&gt;Here's the definition I actually use when I sit down to build one: an AI agent is an LLM in a loop that can use tools, read from and write to memory, and make decisions about what to do next.&lt;/p&gt;

&lt;p&gt;That definition is small enough to build in an afternoon, and powerful enough to automate real work. This is the guide I wish someone had handed me before I started.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Define the Agent's Job (Narrowly)
&lt;/h2&gt;

&lt;p&gt;The single biggest predictor of whether your agent will work is how clearly you can describe its job. Vague goals produce vague agents.&lt;/p&gt;

&lt;p&gt;The rule of thumb: if you can't describe the success criteria in one sentence, the scope is too broad.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Too broad:&lt;/strong&gt; "An agent that helps me manage my business."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt; "An agent that reads incoming invoice emails, extracts vendor, amount, and due date, then appends a row to a Google Sheet."&lt;/p&gt;

&lt;p&gt;Before writing any code, write down three things: the input the agent receives, the output it produces, and the boundary, meaning what it is explicitly &lt;em&gt;not&lt;/em&gt; allowed to do (send email, spend money, delete files). That boundary is what keeps an autonomous loop safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Pick the Model and the Loop
&lt;/h2&gt;

&lt;p&gt;Every agent has two core pieces: a model that makes decisions, and a loop that feeds those decisions back into the next step.&lt;/p&gt;

&lt;p&gt;For most projects in 2026, the default model choice is Claude Sonnet 4.6. It's fast, cheap enough to run in a loop, and strong at tool use. Reach for Opus when the task requires deep reasoning over long context.&lt;/p&gt;

&lt;p&gt;The loop itself is deceptively simple:&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="k"&gt;while&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;available_tools&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has_tool_call&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;execute_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Everything else (memory, planning, multi-agent orchestration) is a variation on this pattern. If you're using Claude Code as your runtime, the loop is already implemented for you. You just supply the tools and the instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Give the Agent Tools (This Is Where It Gets Real)
&lt;/h2&gt;

&lt;p&gt;An LLM without tools can only produce text. An LLM with tools can read files, call APIs, query databases, and trigger side effects in the world. Tools are what turn a chatbot into an agent.&lt;/p&gt;

&lt;p&gt;There are roughly three ways to give your agent tools, in increasing order of power:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Built-in tools.&lt;/strong&gt; Filesystem, bash, web fetch. Claude Code ships with these out of the box. If your agent's job involves reading code, running tests, or pulling data from URLs, you already have everything you need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Custom functions.&lt;/strong&gt; Write a function, describe its inputs and outputs in JSON schema, and hand it to the model. Good for private APIs, internal databases, and anything specific to your project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. MCP servers.&lt;/strong&gt; The Model Context Protocol is the standard for exposing tools to AI agents. Instead of re-implementing Gmail, Slack, or Postgres integrations for every project, you run (or build) an MCP server once and plug it into any agent. This is the path that scales.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Write the System Prompt (aka CLAUDE.md)
&lt;/h2&gt;

&lt;p&gt;The system prompt is the agent's job description. It tells the model who it is, what tools it has, what the success criteria are, and critically, what it should refuse to do.&lt;/p&gt;

&lt;p&gt;A good system prompt has four sections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Role&lt;/strong&gt;: "You are an agent that..."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inputs and outputs&lt;/strong&gt;: what you'll receive and what you should produce&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How to use your tools&lt;/strong&gt;: when to reach for each one, in what order&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guardrails&lt;/strong&gt;: explicit limits, things to escalate, never-do actions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Claude Code, this prompt lives in a file called &lt;code&gt;CLAUDE.md&lt;/code&gt; at the root of your project. The agent reads it on every invocation. If you find yourself re-explaining the same thing across runs, that's a signal the information belongs in CLAUDE.md instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Add Memory (When the Agent Needs to Remember)
&lt;/h2&gt;

&lt;p&gt;A single-shot agent is stateless. Each run starts fresh. That's fine for "parse this invoice" but useless for "keep track of which customers have been contacted."&lt;/p&gt;

&lt;p&gt;You give agents memory the same way you give yourself memory: by writing things down.&lt;/p&gt;

&lt;p&gt;Two patterns cover most use cases:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scratchpad memory.&lt;/strong&gt; A single Markdown file the agent reads at the start of each run and appends to at the end. Simple, inspectable, easy to debug. Good for personal agents and small teams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured memory.&lt;/strong&gt; A database or vector store the agent queries through tools. Necessary when memory grows past what fits comfortably in context, or when multiple agents share state.&lt;/p&gt;

&lt;p&gt;Start with scratchpad memory. Upgrade only when you hit a concrete limit. Most agents never do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Run Agents in Parallel (When One Isn't Enough)
&lt;/h2&gt;

&lt;p&gt;Once a single agent is working, the natural next step is to run several at once. Parallel agents are how you scale from "automate one task" to "process a queue of tasks," or "explore several solutions simultaneously and pick the best."&lt;/p&gt;

&lt;p&gt;The common patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fan-out / fan-in&lt;/strong&gt;: split a big task into independent subtasks, run them in parallel, merge the results. Great for research, code review, and batch processing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specialist agents&lt;/strong&gt;: a planner delegates to specialists (tester, writer, reviewer), each with its own system prompt and tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Critic loops&lt;/strong&gt;: one agent proposes, another critiques, the first revises. Useful when quality matters more than speed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 7: Test, Observe, Iterate
&lt;/h2&gt;

&lt;p&gt;Agents fail in ways that deterministic programs don't. They hallucinate tool arguments, loop on the same action, or misread the system prompt. The cure is observability.&lt;/p&gt;

&lt;p&gt;Three things to put in place before you trust an agent with anything real:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Log every tool call.&lt;/strong&gt; Inputs, outputs, and the model's stated reasoning. When something goes wrong, this is your black box recorder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run on a fixed eval set.&lt;/strong&gt; A folder of sample inputs and expected outputs. Every prompt change gets re-run against it. You'd be surprised how often a "small tweak" regresses an edge case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Put irreversible actions behind confirmations.&lt;/strong&gt; Sending email, deleting data, spending money. These should either require human approval or be locked behind a hard-coded allowlist until the agent has earned trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lesson I Keep Relearning
&lt;/h2&gt;

&lt;p&gt;The agents that end up valuable aren't usually the most ambitious ones. They're the ones with a narrow job, clear boundaries, and a prompt that's been refined through a hundred real runs.&lt;/p&gt;

&lt;p&gt;Treat the CLAUDE.md like a living document. Every bug you hit is a line you should add so the agent doesn't hit it again. Start small, ship it, and let the scope grow from there.&lt;/p&gt;

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

&lt;p&gt;You can absolutely build all of this from first principles, and you should, at least once, to understand the moving parts. But for real projects, starting from a battle-tested template is faster and less error-prone.&lt;/p&gt;

&lt;p&gt;I publish a collection of free, copy-paste Claude Code playbooks at &lt;a href="https://www.claudecodehq.com" rel="noopener noreferrer"&gt;claudecodehq.com&lt;/a&gt;, including an AI Agent Builder that scaffolds a custom agent from a plain-English description, an MCP Server Builder for exposing your own tools, and a Parallel Task Agents template for running multiple sub-agents concurrently. Worth a look if you want to skip the boilerplate and get to the interesting parts.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://www.claudecodehq.com" rel="noopener noreferrer"&gt;claudecodehq.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to Build an AI Agent from Scratch: A Step-by-Step Guide</title>
      <dc:creator>Daniel Marin</dc:creator>
      <pubDate>Tue, 14 Apr 2026 19:42:09 +0000</pubDate>
      <link>https://forem.com/daniel_marin_871e4c78cfc0/how-to-build-an-ai-agent-from-scratch-a-step-by-step-guide-1gk2</link>
      <guid>https://forem.com/daniel_marin_871e4c78cfc0/how-to-build-an-ai-agent-from-scratch-a-step-by-step-guide-1gk2</guid>
      <description>&lt;h2&gt;
  
  
  A step-by-step guide to going from a blank folder to a working agent, without the hype.
&lt;/h2&gt;

&lt;p&gt;"AI agent" has become one of the most overloaded words in tech. Depending on who you ask, it's either a ChatGPT wrapper, a multi-step workflow, or a fully autonomous system that replaces an employee.&lt;/p&gt;

&lt;p&gt;Here's the definition I actually use when I sit down to build one: an AI agent is an LLM in a loop that can use tools, read from and write to memory, and make decisions about what to do next.&lt;/p&gt;

&lt;p&gt;That definition is small enough to build in an afternoon, and powerful enough to automate real work. This is the guide I wish someone had handed me before I started.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Define the Agent's Job (Narrowly)
&lt;/h2&gt;

&lt;p&gt;The single biggest predictor of whether your agent will work is how clearly you can describe its job. Vague goals produce vague agents.&lt;/p&gt;

&lt;p&gt;The rule of thumb: if you can't describe the success criteria in one sentence, the scope is too broad.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Too broad:&lt;/strong&gt; "An agent that helps me manage my business."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Good:&lt;/strong&gt; "An agent that reads incoming invoice emails, extracts vendor, amount, and due date, then appends a row to a Google Sheet."&lt;/p&gt;

&lt;p&gt;Before writing any code, write down three things: the input the agent receives, the output it produces, and the boundary, meaning what it is explicitly &lt;em&gt;not&lt;/em&gt; allowed to do (send email, spend money, delete files). That boundary is what keeps an autonomous loop safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Pick the Model and the Loop
&lt;/h2&gt;

&lt;p&gt;Every agent has two core pieces: a model that makes decisions, and a loop that feeds those decisions back into the next step.&lt;/p&gt;

&lt;p&gt;For most projects in 2026, the default model choice is Claude Sonnet 4.6. It's fast, cheap enough to run in a loop, and strong at tool use. Reach for Opus when the task requires deep reasoning over long context.&lt;/p&gt;

&lt;p&gt;The loop itself is deceptively simple:&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="k"&gt;while&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;done&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tools&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;available_tools&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;has_tool_call&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;execute_tool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;tool_call&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;done&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;True&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Everything else (memory, planning, multi-agent orchestration) is a variation on this pattern. If you're using Claude Code as your runtime, the loop is already implemented for you. You just supply the tools and the instructions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Give the Agent Tools (This Is Where It Gets Real)
&lt;/h2&gt;

&lt;p&gt;An LLM without tools can only produce text. An LLM with tools can read files, call APIs, query databases, and trigger side effects in the world. Tools are what turn a chatbot into an agent.&lt;/p&gt;

&lt;p&gt;There are roughly three ways to give your agent tools, in increasing order of power:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Built-in tools.&lt;/strong&gt; Filesystem, bash, web fetch. Claude Code ships with these out of the box. If your agent's job involves reading code, running tests, or pulling data from URLs, you already have everything you need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Custom functions.&lt;/strong&gt; Write a function, describe its inputs and outputs in JSON schema, and hand it to the model. Good for private APIs, internal databases, and anything specific to your project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. MCP servers.&lt;/strong&gt; The Model Context Protocol is the standard for exposing tools to AI agents. Instead of re-implementing Gmail, Slack, or Postgres integrations for every project, you run (or build) an MCP server once and plug it into any agent. This is the path that scales.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Write the System Prompt (aka CLAUDE.md)
&lt;/h2&gt;

&lt;p&gt;The system prompt is the agent's job description. It tells the model who it is, what tools it has, what the success criteria are, and critically, what it should refuse to do.&lt;/p&gt;

&lt;p&gt;A good system prompt has four sections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Role&lt;/strong&gt;: "You are an agent that..."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inputs and outputs&lt;/strong&gt;: what you'll receive and what you should produce&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;How to use your tools&lt;/strong&gt;: when to reach for each one, in what order&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Guardrails&lt;/strong&gt;: explicit limits, things to escalate, never-do actions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In Claude Code, this prompt lives in a file called &lt;code&gt;CLAUDE.md&lt;/code&gt; at the root of your project. The agent reads it on every invocation. If you find yourself re-explaining the same thing across runs, that's a signal the information belongs in CLAUDE.md instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Add Memory (When the Agent Needs to Remember)
&lt;/h2&gt;

&lt;p&gt;A single-shot agent is stateless. Each run starts fresh. That's fine for "parse this invoice" but useless for "keep track of which customers have been contacted."&lt;/p&gt;

&lt;p&gt;You give agents memory the same way you give yourself memory: by writing things down.&lt;/p&gt;

&lt;p&gt;Two patterns cover most use cases:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scratchpad memory.&lt;/strong&gt; A single Markdown file the agent reads at the start of each run and appends to at the end. Simple, inspectable, easy to debug. Good for personal agents and small teams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured memory.&lt;/strong&gt; A database or vector store the agent queries through tools. Necessary when memory grows past what fits comfortably in context, or when multiple agents share state.&lt;/p&gt;

&lt;p&gt;Start with scratchpad memory. Upgrade only when you hit a concrete limit. Most agents never do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Run Agents in Parallel (When One Isn't Enough)
&lt;/h2&gt;

&lt;p&gt;Once a single agent is working, the natural next step is to run several at once. Parallel agents are how you scale from "automate one task" to "process a queue of tasks," or "explore several solutions simultaneously and pick the best."&lt;/p&gt;

&lt;p&gt;The common patterns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fan-out / fan-in&lt;/strong&gt;: split a big task into independent subtasks, run them in parallel, merge the results. Great for research, code review, and batch processing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Specialist agents&lt;/strong&gt;: a planner delegates to specialists (tester, writer, reviewer), each with its own system prompt and tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Critic loops&lt;/strong&gt;: one agent proposes, another critiques, the first revises. Useful when quality matters more than speed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 7: Test, Observe, Iterate
&lt;/h2&gt;

&lt;p&gt;Agents fail in ways that deterministic programs don't. They hallucinate tool arguments, loop on the same action, or misread the system prompt. The cure is observability.&lt;/p&gt;

&lt;p&gt;Three things to put in place before you trust an agent with anything real:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Log every tool call.&lt;/strong&gt; Inputs, outputs, and the model's stated reasoning. When something goes wrong, this is your black box recorder.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run on a fixed eval set.&lt;/strong&gt; A folder of sample inputs and expected outputs. Every prompt change gets re-run against it. You'd be surprised how often a "small tweak" regresses an edge case.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Put irreversible actions behind confirmations.&lt;/strong&gt; Sending email, deleting data, spending money. These should either require human approval or be locked behind a hard-coded allowlist until the agent has earned trust.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Lesson I Keep Relearning
&lt;/h2&gt;

&lt;p&gt;The agents that end up valuable aren't usually the most ambitious ones. They're the ones with a narrow job, clear boundaries, and a prompt that's been refined through a hundred real runs.&lt;/p&gt;

&lt;p&gt;Treat the CLAUDE.md like a living document. Every bug you hit is a line you should add so the agent doesn't hit it again. Start small, ship it, and let the scope grow from there.&lt;/p&gt;

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

&lt;p&gt;You can absolutely build all of this from first principles, and you should, at least once, to understand the moving parts. But for real projects, starting from a battle-tested template is faster and less error-prone.&lt;/p&gt;

&lt;p&gt;I publish a collection of free, copy-paste Claude Code playbooks at &lt;a href="https://www.claudecodehq.com" rel="noopener noreferrer"&gt;claudecodehq.com&lt;/a&gt;, including an AI Agent Builder that scaffolds a custom agent from a plain-English description, an MCP Server Builder for exposing your own tools, and a Parallel Task Agents template for running multiple sub-agents concurrently. Worth a look if you want to skip the boilerplate and get to the interesting parts.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://www.claudecodehq.com" rel="noopener noreferrer"&gt;claudecodehq.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>agents</category>
      <category>ai</category>
      <category>llm</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Claude Code vs ChatGPT vs Gemini: an honest breakdown for developers who want to stop guessing and start shipping.</title>
      <dc:creator>Daniel Marin</dc:creator>
      <pubDate>Sun, 12 Apr 2026 19:32:15 +0000</pubDate>
      <link>https://forem.com/daniel_marin_871e4c78cfc0/claude-code-vs-chatgpt-vs-gemini-an-honest-breakdown-for-developers-who-want-to-stop-guessing-and-bl2</link>
      <guid>https://forem.com/daniel_marin_871e4c78cfc0/claude-code-vs-chatgpt-vs-gemini-an-honest-breakdown-for-developers-who-want-to-stop-guessing-and-bl2</guid>
      <description>&lt;h1&gt;
  
  
  I Tested All 3 AI Coding Tools: Here's What Each One Is Actually Good At
&lt;/h1&gt;

&lt;p&gt;If you write code for a living, you've probably tried at least one AI coding assistant by now. The real question isn't &lt;em&gt;whether&lt;/em&gt; to use one. It's which one fits the way you actually work.&lt;/p&gt;

&lt;p&gt;I've spent serious time with all three (Claude Code, ChatGPT with GPT-4o and Canvas, and Gemini with 2.5 Pro and Jules) across real projects. Not toy demos. Real production code, real deadlines, real frustration when things break.&lt;/p&gt;

&lt;p&gt;Here's what I found.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 30-Second Version
&lt;/h2&gt;

&lt;p&gt;Before we go deep, here's the short answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt;: the one that actually does the work autonomously&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ChatGPT&lt;/strong&gt;: the best teacher and fastest autocomplete (via Copilot)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini&lt;/strong&gt;: the one that can swallow your entire codebase in one gulp&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now let's unpack each one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Quality: Who Writes Code You'd Actually Ship?
&lt;/h2&gt;

&lt;p&gt;This is what matters most, so let's start here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; consistently produces production-ready code with fewer hallucinations. It respects your project conventions. If your codebase uses Zod for validation, it won't randomly switch to Joi. It's particularly strong with TypeScript, Python, and Rust. The code reads like a senior engineer wrote it, not a tutorial author.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ChatGPT (GPT-4o)&lt;/strong&gt; excels at explaining code and generating snippets for common patterns. It's the best at answering "how do I do X?" with clear, step-by-step explanations. But for large-scale generation, it tends to produce more boilerplate and sometimes invents APIs that don't exist, especially for newer libraries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini 2.5 Pro&lt;/strong&gt; benefits from its massive context window to understand large projects holistically. Code generation is solid but occasionally verbose, and it can struggle with less common frameworks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My take&lt;/strong&gt;: Claude Code for writing production code. ChatGPT for learning and explanations. Gemini for architectural understanding of large codebases.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agentic Capabilities: This Is Where the Gap Gets Wide
&lt;/h2&gt;

&lt;p&gt;An AI coding &lt;em&gt;assistant&lt;/em&gt; answers questions. An AI coding &lt;em&gt;agent&lt;/em&gt; reads your codebase, writes code, runs tests, fixes errors, and commits autonomously.&lt;/p&gt;

&lt;p&gt;This is where Claude Code separates itself from the pack.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; operates as a true agent in your terminal. It reads and navigates your project directory. It creates, edits, and deletes files. It runs shell commands like build, test, lint, and deploy. It connects to external tools via MCP (GitHub, databases, browsers, Slack). You can hand it a GitHub issue and walk away while it creates a working solution.&lt;/p&gt;

&lt;p&gt;The key difference: Claude Code doesn't just suggest code. It implements features end-to-end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ChatGPT&lt;/strong&gt; operates in a conversational loop. Canvas lets you edit code in a side panel, and Code Interpreter runs Python in a sandbox. But there's no filesystem access, no terminal integration, no multi-step workflow chaining. You're always the one copying code from chat into your editor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini's&lt;/strong&gt; Jules agent can handle multi-step tasks in a sandboxed environment, and Gemini CLI brings terminal-based workflows. It's improving fast, but the agentic capabilities are still maturing compared to Claude Code's battle-tested agent loop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Context and Codebase Understanding
&lt;/h2&gt;

&lt;p&gt;How much of your project can the AI "see," and how well does it use that information?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemini wins on raw numbers.&lt;/strong&gt; Its 1M+ token context window is genuinely impressive. You can feed it an entire codebase in a single prompt. For tasks like "explain how authentication works across this 50-file project," Gemini is hard to beat.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code wins on practical context management.&lt;/strong&gt; Its 200K token window is smaller on paper, but it compensates with smart strategies: persistent CLAUDE.md project files, automatic context compression, and strategic file reading. In practice, it handles large codebases effectively because it reads files on demand rather than dumping everything into context at once.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ChatGPT starts from scratch every time.&lt;/strong&gt; 128K tokens with GPT-4o, no persistent project context between sessions, no way to point it at your local codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  IDE Integration: Where Does Each Tool Live?
&lt;/h2&gt;

&lt;p&gt;Each tool meets developers differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ChatGPT&lt;/strong&gt; (via GitHub Copilot) still has the smoothest inline autocomplete, the fastest "tab-tab-tab" experience&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini&lt;/strong&gt; integrates deeply with Google's ecosystem: Firebase, Android Studio, Google Cloud&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; is terminal-first, which means it fits into any workflow where you already use a command line, plus IDE extensions for VS Code and JetBrains&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Right Tool Depends on Your Workflow
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Choose Claude Code if you&lt;/strong&gt; want an AI that does the work, not just suggests it. If you build full-stack applications, need multi-file edits, want to automate workflows end-to-end, or need to connect AI to external tools via MCP, this is your tool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose ChatGPT if you&lt;/strong&gt; primarily need code explanations, want the best inline autocomplete, work mostly in short one-off tasks, or are learning to code and want tutorial-style guidance.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose Gemini if you&lt;/strong&gt; need to analyze massive codebases, work in the Google ecosystem, or need long-context analysis of large PRs, audit trails, or legacy systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing: All Three Start at $20/Month
&lt;/h2&gt;

&lt;p&gt;At the entry level, all three offer strong value at $20/month. The differences emerge at scale:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude&lt;/strong&gt; offers a Max tier ($100 to $200/month) built for developers who use AI as their primary coding partner all day&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ChatGPT Pro&lt;/strong&gt; costs $200/month for unlimited GPT-4o access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini&lt;/strong&gt; has the most competitive API pricing for high-volume inference&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Truth Most Comparison Articles Won't Tell You
&lt;/h2&gt;

&lt;p&gt;Most professional developers use two or even all three of these tools, each for different tasks.&lt;/p&gt;

&lt;p&gt;A common stack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code&lt;/strong&gt; for day-to-day development: writing features, fixing bugs, refactoring, running tests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Copilot (ChatGPT)&lt;/strong&gt; for inline autocomplete while typing&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini&lt;/strong&gt; for analyzing unfamiliar codebases or processing massive files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The tools are complementary, not mutually exclusive. But if you need to pick one as your primary AI coding partner, the one that handles the broadest range of real development work, Claude Code's agentic capabilities give it a decisive edge for anyone who's past the "asking questions about code" stage.&lt;/p&gt;

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

&lt;p&gt;If you're curious about going deeper with any of these tools, I publish practical playbooks and guides at &lt;a href="https://www.claudecodehq.com" rel="noopener noreferrer"&gt;claudecodehq.com&lt;/a&gt;, covering everything from agentic workflows and MCP integrations to building your own AI agents. Worth a look if you want to get productive fast.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://www.claudecodehq.com/blog/claude-code-vs-chatgpt-vs-gemini" rel="noopener noreferrer"&gt;claudecodehq.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>automation</category>
    </item>
    <item>
      <title>How to Automate Your Entire Workflow with Claude Code in 2026</title>
      <dc:creator>Daniel Marin</dc:creator>
      <pubDate>Tue, 07 Apr 2026 18:21:05 +0000</pubDate>
      <link>https://forem.com/daniel_marin_871e4c78cfc0/how-to-automate-your-entire-workflow-with-claude-code-in-2026-14ga</link>
      <guid>https://forem.com/daniel_marin_871e4c78cfc0/how-to-automate-your-entire-workflow-with-claude-code-in-2026-14ga</guid>
      <description>&lt;p&gt;Most knowledge workers lose between one and two hours a day to tasks that could be fully automated: copying data from web dashboards, sorting emails into folders, rearranging calendar blocks, pasting standup updates into Slack. Individually, each task feels minor. Collectively, they add up to roughly 300+ hours a year of busywork.&lt;/p&gt;

&lt;p&gt;Claude Code changes the equation. Instead of writing brittle scripts or stitching together five different SaaS tools, you describe what you want in plain English and let an AI agent build, test, and maintain the automation for you. This guide walks you through four high-impact areas where Claude Code playbooks can eliminate repetitive work entirely.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Browser Automation: Stop Copy-Pasting from Dashboards&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your morning starts with opening three browser tabs, logging into dashboards, and manually pulling numbers into a spreadsheet, you're doing the computer's job for it.&lt;/p&gt;

&lt;p&gt;The Browser Automation Assistant (&lt;a href="https://www.claudecodehq.com/playbooks/browser-automation" rel="noopener noreferrer"&gt;https://www.claudecodehq.com/playbooks/browser-automation&lt;/a&gt;) playbook generates production-ready Puppeteer or Playwright scripts from a plain-English description of what you need. Tell Claude Code something like:&lt;/p&gt;

&lt;p&gt;"Scrape daily sales figures from our Shopify admin dashboard and export them to a Google Sheet. Run every morning at 7 AM."&lt;/p&gt;

&lt;p&gt;Claude Code generates the full script, handles authentication cookies, pagination, and error retries. You get a working automation instead of a half-finished Stack Overflow snippet.&lt;/p&gt;

&lt;p&gt;What you can automate&lt;br&gt;
Competitor price monitoring across multiple websites&lt;br&gt;
Daily screenshot reports from analytics dashboards&lt;br&gt;
Automated form submissions (expense reports, compliance filings)&lt;br&gt;
Web scraping pipelines that handle login walls and CAPTCHAs&lt;br&gt;
End-to-end browser tests for your own product&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Email Automation: Reclaim Your Inbox
Email is the original productivity black hole. The average professional spends 28% of their workday on email, much of it on tasks that follow predictable patterns: saving attachments, forwarding invoices, labeling messages by client.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Gmail Workflow Automation playbook (&lt;a href="https://www.claudecodehq.com/playbooks/gmail-workflows" rel="noopener noreferrer"&gt;https://www.claudecodehq.com/playbooks/gmail-workflows&lt;/a&gt;) builds n8n workflows that monitor your inbox and act automatically. Some real examples:&lt;/p&gt;

&lt;p&gt;Attachment Management&lt;/p&gt;

&lt;p&gt;Invoices from vendors are automatically extracted from emails, saved to the right Google Drive folder by month, and the original email is labeled and archived.&lt;/p&gt;

&lt;p&gt;Smart Triage&lt;/p&gt;

&lt;p&gt;Emails from clients are auto-labeled by project. Internal newsletters skip the inbox entirely and go straight to a "Read Later" folder. Urgent emails from your boss trigger a Slack DM.&lt;/p&gt;

&lt;p&gt;Follow-up Tracking&lt;/p&gt;

&lt;p&gt;Emails you sent that haven't received a reply in 3 days automatically surface in a "Needs Follow-up" label so nothing falls through the cracks.&lt;/p&gt;

&lt;p&gt;The playbook handles Google API authentication, webhook setup, and error handling. You describe the rules; Claude Code builds the plumbing.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Calendar Automation: Protect Your Focus Time
Your calendar should work for you, not against you. But most people's calendars are a reactive mess — anyone can book over your focus blocks, meetings pile up back-to-back with no prep time, and you spend 15 minutes every morning manually rearranging things.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Calendar &amp;amp; Scheduling Automation playbook (&lt;a href="https://www.claudecodehq.com/playbooks/calendar-automation" rel="noopener noreferrer"&gt;https://www.claudecodehq.com/playbooks/calendar-automation&lt;/a&gt;) sets up intelligent calendar workflows that run on autopilot:&lt;/p&gt;

&lt;p&gt;Auto-protected focus blocks — deep work time that can't be overwritten by meeting invites&lt;br&gt;
Meeting prep automation — relevant docs and context are sent to you 10 minutes before each meeting&lt;br&gt;
Daily agenda posts — your schedule for the day is automatically posted to Slack at 8 AM&lt;br&gt;
Cross-platform sync — Google Calendar and Outlook stay in sync without manual export/import&lt;br&gt;
Smart time blocking — tasks from your project management tool automatically get calendar blocks assigned&lt;br&gt;
If you manage other people's calendars — as an EA or team lead — the compound time savings are even larger. What takes 30 minutes of manual shuffling per person per day becomes a single setup that runs forever.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Slack Automation: Eliminate Repetitive Messaging
Slack is where coordination happens, but it's also where people spend the most time on repetitive messaging patterns: daily standups, approval requests, status check-ins, and the dreaded "can someone review my PR?" message.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The Slack Workflow Automation playbook (&lt;a href="https://www.claudecodehq.com/playbooks/slack-workflows" rel="noopener noreferrer"&gt;https://www.claudecodehq.com/playbooks/slack-workflows&lt;/a&gt;) builds bots and workflows that handle the repetitive parts:&lt;/p&gt;

&lt;p&gt;Async Standup Bot&lt;/p&gt;

&lt;p&gt;Collects standup updates from each team member at their preferred time, compiles them into a formatted summary, and posts it to the team channel. No more 15-minute meetings that could have been a message.&lt;/p&gt;

&lt;p&gt;PR Approval Workflow&lt;/p&gt;

&lt;p&gt;GitHub PRs automatically post to a review channel with approve/reject buttons. If a PR hasn't been reviewed in 24 hours, it escalates with a mention to the team lead.&lt;/p&gt;

&lt;p&gt;Smart Notifications&lt;/p&gt;

&lt;p&gt;Route monitoring alerts to the right channel based on severity. Critical alerts page on-call via DM. Low-severity alerts batch into a daily digest.&lt;/p&gt;

&lt;p&gt;Putting It All Together: The Fully Automated Workday&lt;br&gt;
Here's what a typical morning looks like when all four automation layers are running:&lt;/p&gt;

&lt;p&gt;7:00 AM&lt;br&gt;
Browser automation scrapes overnight metrics and drops them in your Google Sheet.&lt;/p&gt;

&lt;p&gt;7:05 AM&lt;br&gt;
Gmail workflows have already sorted your inbox — invoices filed, client emails labeled, newsletters deferred.&lt;/p&gt;

&lt;p&gt;8:00 AM&lt;br&gt;
Your daily agenda posts to Slack. Focus blocks are locked in. Prep docs for your 10 AM are ready.&lt;/p&gt;

&lt;p&gt;9:00 AM&lt;br&gt;
Standup bot has collected everyone's updates. You read a 30-second summary instead of sitting through a meeting.&lt;/p&gt;

&lt;p&gt;9:05 AM&lt;br&gt;
You start actual work. No email sorting, no calendar rearranging, no Slack catch-up.&lt;/p&gt;

&lt;p&gt;That's roughly 90 minutes saved every single day, compounding to over 350 hours per year. More importantly, you start each day in a proactive state instead of a reactive one.&lt;/p&gt;

&lt;p&gt;How to Get Started&lt;br&gt;
You don't need to automate everything at once. Pick the area where you lose the most time and start there:&lt;/p&gt;

&lt;p&gt;Browser Automation&lt;/p&gt;

&lt;p&gt;Scraping, form fills, dashboard monitoring&lt;/p&gt;

&lt;p&gt;Gmail Workflows&lt;/p&gt;

&lt;p&gt;Attachment management, triage, auto-archiving&lt;/p&gt;

&lt;p&gt;Calendar Automation&lt;/p&gt;

&lt;p&gt;Focus blocks, meeting prep, daily agendas&lt;/p&gt;

&lt;p&gt;Slack Workflows&lt;/p&gt;

&lt;p&gt;Standup bots, approval flows, smart alerts&lt;/p&gt;

&lt;p&gt;Each playbook gives you a ready-to-use CLAUDE.md template. Download it, drop it in a project folder, open Claude Code, and describe what you want to automate. The AI handles the implementation details — API integrations, error handling, scheduling — so you can focus on defining the "what" instead of wrestling with the "how."&lt;/p&gt;

&lt;p&gt;The best part: once one automation is running and saving you time, you'll immediately see where the next one should go. Automation compounds.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claudecode</category>
      <category>productivity</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
