<?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 Shashko</title>
    <description>The latest articles on Forem by Daniel Shashko (@danishashko).</description>
    <link>https://forem.com/danishashko</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%2F3583862%2F71facdf4-157f-4166-aa75-a3ad606a6409.png</url>
      <title>Forem: Daniel Shashko</title>
      <link>https://forem.com/danishashko</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/danishashko"/>
    <language>en</language>
    <item>
      <title>🤖 Build Make.com Automation Scenarios with AI Using MCP</title>
      <dc:creator>Daniel Shashko</dc:creator>
      <pubDate>Tue, 10 Feb 2026 17:57:51 +0000</pubDate>
      <link>https://forem.com/danishashko/build-makecom-automation-scenarios-with-ai-using-mcp-57gl</link>
      <guid>https://forem.com/danishashko/build-makecom-automation-scenarios-with-ai-using-mcp-57gl</guid>
      <description>&lt;p&gt;Have you ever wanted to build complex &lt;a href="https://www.make.com" rel="noopener noreferrer"&gt;Make.com&lt;/a&gt; automation scenarios using natural language? What if your AI assistant could understand Make.com's 200+ base modules and help you create, validate, and deploy scenarios in seconds?&lt;/p&gt;

&lt;p&gt;Enter &lt;strong&gt;make-mcp-server&lt;/strong&gt; - an unofficial Model Context Protocol (MCP) server that brings Make.com's powerful automation platform directly into your AI workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  🎯 What is MCP?
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;Model Context Protocol&lt;/a&gt; is a standardized way for AI assistants (like Claude Desktop, Cursor, or any MCP-compatible client) to interact with external tools and services. Think of it as a universal adapter that lets your AI assistant "talk" to different platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 What Can You Do?
&lt;/h2&gt;

&lt;p&gt;With &lt;strong&gt;make-mcp-server&lt;/strong&gt;, you can:&lt;/p&gt;

&lt;h3&gt;
  
  
  ✅ Search 200+ Make.com Modules
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Find modules for sending Slack notifications"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns comprehensive information about Slack modules with parameters, examples, and documentation.&lt;/p&gt;

&lt;h3&gt;
  
  
  🔍 Get Detailed Module Information
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Show me how to use the Google Sheets Add Row module"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get parameter schemas, configuration examples, and best practices.&lt;/p&gt;

&lt;h3&gt;
  
  
  🧠 Validate Scenarios Before Deployment
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Check if this scenario is valid: [blueprint JSON]"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Auto-healing validation that catches errors, suggests fixes, and validates data flow.&lt;/p&gt;

&lt;h3&gt;
  
  
  🚢 Deploy Directly to Make.com
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Create this scenario in my Make.com account"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One command deploys your AI-generated scenario to production.&lt;/p&gt;

&lt;h2&gt;
  
  
  📦 Quick Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node.js 18+&lt;/li&gt;
&lt;li&gt;Make.com account (&lt;a href="https://www.make.com" rel="noopener noreferrer"&gt;sign up free&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;Make.com API token&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installation
&lt;/h3&gt;

&lt;h4&gt;
  
  
  For Claude Desktop:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Get your Make.com credentials:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Team ID: Found in your Make.com dashboard URL&lt;/li&gt;
&lt;li&gt;API Token: Settings → API → Generate Token&lt;/li&gt;
&lt;li&gt;Region: Check your Make.com URL (eu1, eu2, us1, us2)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configure Claude Desktop:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Edit your &lt;code&gt;claude_desktop_config.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"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;"make-mcp-server"&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;"npx"&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;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"make-mcp-server@latest"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&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;"MAKE_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-api-token"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"MAKE_TEAM_ID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-team-id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"MAKE_API_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://eu2.make.com/api/v2"&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;ol&gt;
&lt;li&gt;
&lt;strong&gt;Restart Claude Desktop&lt;/strong&gt; - The MCP server icon should appear.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  For Cursor IDE:
&lt;/h4&gt;

&lt;p&gt;Add to your Cursor settings (Ctrl+Shift+P → "MCP: Edit 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;"make-mcp-server"&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;"npx"&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;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"make-mcp-server@latest"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&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;"MAKE_API_KEY"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-api-token"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"MAKE_TEAM_ID"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"your-team-id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"MAKE_API_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://eu2.make.com/api/v2"&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;h2&gt;
  
  
  🎨 Real-World Examples
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Example 1: Slack → Notion Integration
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Prompt to Claude:&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Create a Make.com scenario that monitors a Slack channel for messages containing 'bug report', extracts the content, and creates a new page in Notion with the report details."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;What happens:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Searches for Slack and Notion modules&lt;/li&gt;
&lt;li&gt;Builds the scenario structure with proper routing&lt;/li&gt;
&lt;li&gt;Validates the blueprint for errors&lt;/li&gt;
&lt;li&gt;Deploys to your Make.com account&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Example 2: GitHub → Discord Notifications
&lt;/h3&gt;

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

&lt;blockquote&gt;
&lt;p&gt;"Build a scenario that watches GitHub for new pull requests and posts them to Discord with formatting."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; A working scenario with GitHub webhook trigger, data mapping, and Discord message formatting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example 3: Complex Multi-Step Workflow
&lt;/h3&gt;

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

&lt;blockquote&gt;
&lt;p&gt;"Create a scenario that: 1) Triggers daily at 9 AM, 2) Fetches data from Airtable, 3) Uses a router to split records by status, 4) Sends different email templates via Gmail, 5) Logs results to Google Sheets"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Result:&lt;/strong&gt; Complete scenario with scheduler, Airtable integration, router logic, conditional branching, and logging.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔧 Available Tools
&lt;/h2&gt;

&lt;p&gt;The MCP server exposes these tools:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_modules&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Search 200+ Make modules by keyword/app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;get_module&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Get detailed info about a specific module&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;list_apps&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Browse all available Make.com apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;search_templates&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Find pre-built scenario templates&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;validate_scenario&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Check blueprint validity with auto-healing&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;create_scenario&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Deploy scenario to Make.com&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  ⚡ Advanced Features
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Auto-Healing Validation
&lt;/h3&gt;

&lt;p&gt;The validator doesn't just find errors - it &lt;strong&gt;fixes them&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Invalid: Missing required parameters&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;module&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;google-sheets:addRow&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;parameters&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;spreadsheet&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;abc123&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="c1"&gt;// Missing 'sheetName' parameter&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Auto-healed:&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;module&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;google-sheets:addRow&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;parameters&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;spreadsheet&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;abc123&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;sheetName&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;Sheet1&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;  &lt;span class="c1"&gt;// ✅ Added with default&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Router Support
&lt;/h3&gt;

&lt;p&gt;Build complex conditional workflows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;modules&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;module&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;webhook:trigger&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;id&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;module&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;router&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;routes&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;filter&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;{{status}} = 'urgent'&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;modules&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="cm"&gt;/* urgent path */&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;filter&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;{{status}} = 'normal'&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;modules&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="cm"&gt;/* normal path */&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Template Discovery
&lt;/h3&gt;

&lt;p&gt;Browse 500+ pre-built templates:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Show me templates for e-commerce automation"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns categorized templates with difficulty ratings and module lists.&lt;/p&gt;

&lt;h2&gt;
  
  
  🔐 Security &amp;amp; Disclaimer
&lt;/h2&gt;

&lt;p&gt;⚠️ &lt;strong&gt;Important:&lt;/strong&gt; This is an &lt;strong&gt;unofficial, community-built&lt;/strong&gt; project. It is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ NOT affiliated with Make.com&lt;/li&gt;
&lt;li&gt;✅ NOT officially supported&lt;/li&gt;
&lt;li&gt;✅ Open source and transparent&lt;/li&gt;
&lt;li&gt;✅ Uses official Make.com APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Always review scenarios before deployment&lt;/strong&gt; - AI can make mistakes!&lt;/p&gt;

&lt;h2&gt;
  
  
  🌟 Why Use This?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  For Developers:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;10x faster&lt;/strong&gt; scenario creation&lt;/li&gt;
&lt;li&gt;Natural language → working automation&lt;/li&gt;
&lt;li&gt;Instant documentation lookup&lt;/li&gt;
&lt;li&gt;No more clicking through UI menus&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  For AI Enthusiasts:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;See MCP in action&lt;/li&gt;
&lt;li&gt;Learn how AI agents interact with external tools&lt;/li&gt;
&lt;li&gt;Build your own MCP servers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  For Make.com Users:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Rapid prototyping&lt;/li&gt;
&lt;li&gt;Complex scenario scaffolding&lt;/li&gt;
&lt;li&gt;Template discovery&lt;/li&gt;
&lt;li&gt;Validation before deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🛣️ Roadmap
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;[ ] Support for more Make.com features&lt;/li&gt;
&lt;li&gt;[ ] Visual scenario builder integration&lt;/li&gt;
&lt;li&gt;[ ] Scenario testing framework&lt;/li&gt;
&lt;li&gt;[ ] Community template sharing&lt;/li&gt;
&lt;li&gt;[ ] Improved error recovery&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🤝 Contributing
&lt;/h2&gt;

&lt;p&gt;This is an open-source project! Contributions welcome:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🐛 Report bugs: &lt;a href="https://github.com/danishashko/make-mcp/issues" rel="noopener noreferrer"&gt;GitHub Issues&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💡 Feature requests: &lt;a href="https://github.com/danishashko/make-mcp/discussions" rel="noopener noreferrer"&gt;GitHub Discussions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;🔧 Pull requests: &lt;a href="https://github.com/danishashko/make-mcp/blob/main/CONTRIBUTING.md" rel="noopener noreferrer"&gt;Contributing Guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub Repository:&lt;/strong&gt; &lt;a href="https://github.com/danishashko/make-mcp" rel="noopener noreferrer"&gt;danishashko/make-mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;npm Package:&lt;/strong&gt; &lt;a href="https://www.npmjs.com/package/make-mcp-server" rel="noopener noreferrer"&gt;make-mcp-server&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Registry:&lt;/strong&gt; &lt;a href="https://mcp.run/servers/io.github.danishashko/make-mcp" rel="noopener noreferrer"&gt;io.github.danishashko/make-mcp&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Make.com Docs:&lt;/strong&gt; &lt;a href="https://www.make.com/en/help" rel="noopener noreferrer"&gt;make.com/en/help&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP Documentation:&lt;/strong&gt; &lt;a href="https://modelcontextprotocol.io" rel="noopener noreferrer"&gt;modelcontextprotocol.io&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎓 Tutorial: Your First AI-Powered Scenario
&lt;/h2&gt;

&lt;p&gt;Let's build a simple RSS → Email notification scenario with Claude:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Set up the MCP server (see Installation above)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Prompt Claude:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"Create a Make.com scenario that:
- Checks an RSS feed every hour
- Filters for items with 'AI' in the title
- Sends me an email with the article link"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Step 3:&lt;/strong&gt; Claude will:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Search for RSS and Email modules&lt;/li&gt;
&lt;li&gt;Configure the schedule trigger&lt;/li&gt;
&lt;li&gt;Set up filtering logic&lt;/li&gt;
&lt;li&gt;Build the email template&lt;/li&gt;
&lt;li&gt;Ask if you want to deploy&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Review and deploy!&lt;/p&gt;

&lt;h2&gt;
  
  
  🔥 Hot Tips
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Be specific:&lt;/strong&gt; "Use Gmail" vs "Send email"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provide context:&lt;/strong&gt; Share your data structure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Iterate:&lt;/strong&gt; Ask Claude to refine the scenario&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test first:&lt;/strong&gt; Use Make.com's test mode&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Review always:&lt;/strong&gt; AI is powerful but not perfect&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🎉 Get Started Now!
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Quick test (no installation)&lt;/span&gt;
npx make-mcp-server &lt;span class="nt"&gt;--help&lt;/span&gt;

&lt;span class="c"&gt;# Install globally&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; make-mcp-server

&lt;span class="c"&gt;# Check version&lt;/span&gt;
make-mcp-server &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then configure your AI assistant and start building!&lt;/p&gt;




&lt;h2&gt;
  
  
  📈 Stats
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;⭐ &lt;strong&gt;200+ Make.com modules&lt;/strong&gt; supported&lt;/li&gt;
&lt;li&gt;🎯 &lt;strong&gt;500+ templates&lt;/strong&gt; searchable&lt;/li&gt;
&lt;li&gt;🔧 &lt;strong&gt;6 powerful tools&lt;/strong&gt; for AI agents&lt;/li&gt;
&lt;li&gt;💪 &lt;strong&gt;Auto-healing validation&lt;/strong&gt; with smart fixes&lt;/li&gt;
&lt;li&gt;🚀 &lt;strong&gt;1-command deployment&lt;/strong&gt; to production&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;⭐ Star the repo: &lt;a href="https://github.com/danishashko/make-mcp" rel="noopener noreferrer"&gt;github.com/danishashko/make-mcp&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📦 Try it now: &lt;code&gt;npx make-mcp-server&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with 🧡 by the community. Not affiliated with Make.com.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>ai</category>
      <category>mcp</category>
      <category>nocode</category>
    </item>
    <item>
      <title>Best AI Models for Agentic Vibe Coding in VS Code (March 2026)</title>
      <dc:creator>Daniel Shashko</dc:creator>
      <pubDate>Sat, 20 Dec 2025 13:37:42 +0000</pubDate>
      <link>https://forem.com/danishashko/best-ai-models-for-agentic-vibe-coding-in-vs-code-december-2025-3bkd</link>
      <guid>https://forem.com/danishashko/best-ai-models-for-agentic-vibe-coding-in-vs-code-december-2025-3bkd</guid>
      <description>&lt;p&gt;Hey everyone! In this short article, I’ll cover the AI models that worked best &lt;strong&gt;for me&lt;/strong&gt; when doing agentic coding in VS Code.&lt;/p&gt;

&lt;p&gt;Nothing here is backed by formal research. This is all based on hands-on, daily usage, real projects, and a lot of trial and error.&lt;/p&gt;

&lt;p&gt;Let’s go!&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Claude Opus 4.6
&lt;/h2&gt;

&lt;p&gt;This one was probably expected.&lt;/p&gt;

&lt;p&gt;I use &lt;a href="https://www.anthropic.com/news/claude-opus-4-5" rel="noopener noreferrer"&gt;Claude Opus 4.6&lt;/a&gt; mainly for &lt;strong&gt;multi-step execution&lt;/strong&gt;, combined with a custom &lt;strong&gt;“Beast Mode”&lt;/strong&gt; agent written by Burke Holland from the Copilot team at Microsoft. If you haven’t tried it yet, I strongly recommend it. You can find it &lt;a href="https://gist.github.com/burkeholland/88af0249c4b6aff3820bf37898c8bacf" rel="noopener noreferrer"&gt;here&lt;/a&gt; or read &lt;a href="https://www.linkedin.com/posts/daniel-shashko_githubcopilot-ai-productivity-activity-7364302815785103361-F-Qz" rel="noopener noreferrer"&gt;my LinkedIn post&lt;/a&gt; about it.&lt;/p&gt;

&lt;p&gt;In my experience, Opus 4.6 is the best model for working across &lt;strong&gt;multiple large files&lt;/strong&gt;. It’s currently the only model I trust to run without constant manual code review. The code is clean, focused, and avoids unnecessary boilerplate.&lt;/p&gt;

&lt;p&gt;The main downside is the quota cost, which is counted as x3.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best use case&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Large features&lt;/li&gt;
&lt;li&gt;Multi-file refactors&lt;/li&gt;
&lt;li&gt;End-to-end implementation with minimal supervision&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage quota:&lt;/strong&gt; x3&lt;/p&gt;

&lt;h2&gt;
  
  
  2. Claude Sonnet 4.6
&lt;/h2&gt;

&lt;p&gt;Need a quick review? A small UI tweak? Minor backend logic improvements? This is the model I choose for those.&lt;/p&gt;

&lt;p&gt;With only x1 quota usage, &lt;a href="https://www.anthropic.com/news/claude-sonnet-4-6" rel="noopener noreferrer"&gt;Sonnet 4.6&lt;/a&gt; gives the best balance of &lt;strong&gt;speed, quality, and cost&lt;/strong&gt; for smaller tasks.&lt;/p&gt;

&lt;p&gt;I usually use it right after a long Opus 4.6 session to polish things. It performs best with strong context, so I always test my app using &lt;a href="https://dev.to/nadiafedev/simple-browser-in-vs-code-my-coding-experience-just-leveled-up-51gm"&gt;Simple Browser&lt;/a&gt; and then point Sonnet to the exact elements I want to change.&lt;/p&gt;

&lt;p&gt;I also rely on it for changelog creation after long coding sessions and summarization.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo9ckj4ei0s1chfwn1c32.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo9ckj4ei0s1chfwn1c32.png" alt="Example of a changelog created by Sonnet 4.6" width="500" height="618"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best use case&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Small fixes after large coding sessions&lt;/li&gt;
&lt;li&gt;UI tweaks&lt;/li&gt;
&lt;li&gt;Code reviews&lt;/li&gt;
&lt;li&gt;Changelog and summary generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage quota:&lt;/strong&gt; x1&lt;/p&gt;

&lt;h2&gt;
  
  
  3. GPT-5.2
&lt;/h2&gt;

&lt;p&gt;I have mixed feelings about &lt;a href="https://openai.com/index/introducing-gpt-5-2/" rel="noopener noreferrer"&gt;GPT-5.2&lt;/a&gt;, but it clearly is very good in one specific area.&lt;/p&gt;

&lt;p&gt;I don’t enjoy using it for direct coding. Compared to Opus 4.6, I often see more boilerplate and more bugs. That said, where GPT-5.2 really stands out is &lt;strong&gt;planning and architecture&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It consistently produces excellent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;System architecture&lt;/li&gt;
&lt;li&gt;Stack decisions&lt;/li&gt;
&lt;li&gt;Data models&lt;/li&gt;
&lt;li&gt;Step-by-step development plans&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With a single, well-defined prompt, I often get a deeply structured plan with clear todos, many fetched relevant sources, and strong reasoning. Beast Mode helps a lot here. See this example:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffczaoivorowdsq4oohyl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffczaoivorowdsq4oohyl.png" alt="Full architecture and dev plan generated by GPT-5.2" width="800" height="795"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best use case&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Architecture planning&lt;/li&gt;
&lt;li&gt;System design&lt;/li&gt;
&lt;li&gt;Data modeling&lt;/li&gt;
&lt;li&gt;Breaking ideas into actionable steps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage quota:&lt;/strong&gt; x1&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Gemini 3 Pro
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://deepmind.google/models/gemini/pro/" rel="noopener noreferrer"&gt;Gemini 3 Pro&lt;/a&gt; is a strong backend-focused model in my experience, but is much weaker for complex UI work.&lt;/p&gt;

&lt;p&gt;I usually choose it for &lt;strong&gt;database logic and authentication&lt;/strong&gt; because it requires very little back-and-forth to reach a solid result (at least for me). It tends to “get it” quickly when it comes to structured backend problems.&lt;/p&gt;

&lt;p&gt;It’s also very good at writing documentation and general content.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft99kaedc7aa15yp4hkd7.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft99kaedc7aa15yp4hkd7.gif" alt="A GIF showing a detailed README.md generated by Gemini 3 Pro" width="720" height="515"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best use case&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Database implementation&lt;/li&gt;
&lt;li&gt;Auth flows&lt;/li&gt;
&lt;li&gt;Backend logic&lt;/li&gt;
&lt;li&gt;README and documentation generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage quota:&lt;/strong&gt; x1&lt;/p&gt;

&lt;h2&gt;
  
  
  5. GPT-5 Codex (Preview)
&lt;/h2&gt;

&lt;p&gt;This is my go-to model for &lt;strong&gt;smaller coding tasks&lt;/strong&gt; when I want precision and predictability.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://platform.openai.com/docs/models/gpt-5-codex" rel="noopener noreferrer"&gt;GPT-5 Codex&lt;/a&gt; is much less 'opinionated' than GPT-5.2 and stays very focused on the code. It’s not great for planning, but it’s very good at implementing exactly what you ask for, especially for backend coding and when the scope is clear (less of a UI star for me).&lt;/p&gt;

&lt;p&gt;I use it a lot for isolated features, functions, and clean implementations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best use case&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Writing specific backend functions&lt;/li&gt;
&lt;li&gt;Implementing clear specs&lt;/li&gt;
&lt;li&gt;Code-first tasks with minimal discussion&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage quota:&lt;/strong&gt; x1&lt;/p&gt;

&lt;h2&gt;
  
  
  6. Claude Haiku 4.5
&lt;/h2&gt;

&lt;p&gt;Claude Haiku 4.5 is my “fast response” model.&lt;/p&gt;

&lt;p&gt;It’s not meant for heavy logic or large features, but it’s extremely useful when I want a quick answer without wasting quota on stronger models. It’s responsive, clear, and surprisingly accurate for small tasks.&lt;/p&gt;

&lt;p&gt;I mostly use it as a helper during development, never as the execution model. I haven't even tried using it for execution, feel free to share your experience with it in the comments. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best use case&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Quick questions&lt;/li&gt;
&lt;li&gt;Small helpers&lt;/li&gt;
&lt;li&gt;Explaining existing code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Usage quota:&lt;/strong&gt; x0.33&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;No single model does everything perfectly.&lt;/p&gt;

&lt;p&gt;For me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Opus 4.6&lt;/strong&gt; is the heavy lifter&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sonnet 4.6&lt;/strong&gt; is the finisher&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT-5.2&lt;/strong&gt; is the architect&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 3 Pro&lt;/strong&gt; owns backend logic&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GPT-5 Codex&lt;/strong&gt; is the clean coder&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Haiku 4.5&lt;/strong&gt; is the fast assistant&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you combine them instead of sticking to one model, the results are on a completely different level (and your quota too 🫠).&lt;/p&gt;

</description>
      <category>programming</category>
      <category>ai</category>
      <category>python</category>
      <category>vscode</category>
    </item>
    <item>
      <title>10 AI Coding Patterns That'll Make You Look Like a Wizard 🧙‍♂️</title>
      <dc:creator>Daniel Shashko</dc:creator>
      <pubDate>Tue, 04 Nov 2025 21:58:37 +0000</pubDate>
      <link>https://forem.com/danishashko/10-ai-coding-patterns-thatll-make-you-look-like-a-wizard-56do</link>
      <guid>https://forem.com/danishashko/10-ai-coding-patterns-thatll-make-you-look-like-a-wizard-56do</guid>
      <description>&lt;p&gt;Most developers or technical marketers I see are either copying garbage code without thinking, or avoiding AI entirely because "it doesn't understand my problem 🤥". Both approaches miss the point. AI won't write your app for you, but it can handle the parts of coding that make you want to quit and cry.&lt;/p&gt;

&lt;p&gt;The ten techniques below work because they're based on how you actually build software and are tested by me and many others I learned from. &lt;/p&gt;

&lt;h2&gt;
  
  
  Make AI Explain Your Code Back to You
&lt;/h2&gt;

&lt;p&gt;This one changed everything for me. Instead of asking AI to fix broken code, I started explaining my code to it first and asking it to tell me what it does.&lt;/p&gt;

&lt;p&gt;It's &lt;a href="https://rubberduckdebugging.com/" rel="noopener noreferrer"&gt;rubber duck debugging&lt;/a&gt;, but the duck actually talks back 🤪&lt;/p&gt;

&lt;p&gt;When you hit a bug, write out what you're trying to accomplish and what your code actually does. Then ask AI to explain your logic back to you in plain language. Nine times out of ten, when the AI restates your code, you'll spot the flaw immediately.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Reverse Explanation Pattern:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I'm trying to calculate the total price with tax. Here's my function:

[paste your code]

Can you explain back to me, in plain English, what this function does step by step? Don't fix anything, just tell me what the code is actually doing.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the AI says "this function multiplies price by 0.08 then adds it to itself," you'll realize you forgot to add the original price. The bug becomes obvious because someone (or something) else is reading your intent.&lt;/p&gt;

&lt;p&gt;I use this for almost every bug now. It catches logic errors way faster than staring at the screen for an hour.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⏱️ Time Saved:&lt;/strong&gt; 30 minutes to 2 hours per bug&lt;/p&gt;

&lt;h2&gt;
  
  
  Generate Database Schemas That Actually Work
&lt;/h2&gt;

&lt;p&gt;Setting up databases is one of those things that's never creative but always takes forever (at least for me). You know what you need: tables, relationships, indexes, etc. It's just annoying to write it all out.&lt;/p&gt;

&lt;p&gt;AI can generate complete database schemas if you give it the full picture upfront. Don't just say "make me a user table." Describe your entire data model, how pieces relate, what needs to be fast, and what needs to be secure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Schema Generation Checklist:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📊 Entities: List every type of thing (users, posts, comments, etc.)
🔗 Relationships: One-to-many? Many-to-many? Be explicit
🔒 Constraints: Required fields, unique values, foreign keys
⚡ Performance: What queries will run most often?
🗂️ Indexing: Which columns need indexes for speed?
📝 Audit: Do you need created_at, updated_at, deleted_at?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a blog platform side project, I asked for tables for users, posts, comments, and tags. Told it users write posts, posts have comments, and posts can have multiple tags. Needed it optimized for showing recent posts by author since that's the main query. Asked for &lt;a href="https://www.postgresql.org/" rel="noopener noreferrer"&gt;PostgreSQL&lt;/a&gt; with proper relationships and timestamps on everything.&lt;/p&gt;

&lt;p&gt;I got back complete table definitions with all the connections set up correctly. Ran it, worked immediately. Saved hours of looking up syntax (especially for a newbie like me).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⏱️ Time Saved:&lt;/strong&gt; 2 to 4 hours&lt;/p&gt;

&lt;h2&gt;
  
  
  Ask AI to Break Down Your Approach First
&lt;/h2&gt;

&lt;p&gt;This is the opposite of what most people do. Instead of asking AI to solve your problem, ask it to help you plan your solution.&lt;/p&gt;

&lt;p&gt;Tell AI what you're building and ask it to question your approach. What edge cases might you be missing? What's a simpler way to do this? Where might this break at scale?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Interrogation Pattern:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I'm building [feature description]. My plan is to [your approach].

Before I start coding or working on this project, what questions should I be asking myself? What edge cases am I probably not thinking about? Is there a simpler architecture I'm overlooking?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I was planning to build a simple feature for handling file uploads on a personal project (the blog platform from before). Asked AI what could go wrong with my approach. It caught that I wasn't checking file size limits or validating file types. Would have been a security nightmare in production.&lt;/p&gt;

&lt;p&gt;Use this for any feature that feels like it might get complicated or if you always "forget" something. The AI won't always be right, but it'll force you to defend your choices, which often reveals flaws you didn't see.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⏱️ Time Saved:&lt;/strong&gt; 4 to 8 hours (by avoiding wrong implementations)&lt;/p&gt;

&lt;h2&gt;
  
  
  Generate Migration Scripts Without the Headache
&lt;/h2&gt;

&lt;p&gt;Database migrations are error-prone and boring. One typo in a migration and you're rolling back in production at 2am.&lt;/p&gt;

&lt;p&gt;AI is perfect for generating migration scripts because it can be paranoid about edge cases in ways humans forget to be.&lt;/p&gt;

&lt;p&gt;Give it your current schema and your target schema, and ask for migration scripts that handle existing data, add rollback commands, and preserve data integrity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Migration Request Template:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Current schema: [paste current tables]
Target schema: [describe changes]

Generate migration scripts that:
- Add new columns with appropriate defaults
- Migrate existing data safely
- Create rollback scripts
- Add necessary indexes
- Handle foreign key constraints
- Work with [your DB engine]

Include warnings for any data loss scenarios.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Needed to split a &lt;code&gt;users&lt;/code&gt; table into &lt;code&gt;users&lt;/code&gt; and &lt;code&gt;user_profiles&lt;/code&gt; to separate auth from profile data. Described the split and asked for both up and down migrations. AI generated scripts that created the new table, copied data over, set up foreign keys, added indexes, and included a rollback that would merge everything back. Even included warnings about potential data loss if email fields were longer than 255 characters. For best practices, see &lt;a href="https://www.harness.io/harness-devops-academy/database-rollback-strategies-in-devops" rel="noopener noreferrer"&gt;Database Rollback Strategies in DevOps&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Tested the migration on a copy of production data. Worked perfectly. Would have taken me all afternoon to write and test manually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⏱️ Time Saved:&lt;/strong&gt; 1 to 3 hours&lt;/p&gt;

&lt;h2&gt;
  
  
  Build Multi-Step Workflows in One Shot
&lt;/h2&gt;

&lt;p&gt;Once you understand individual prompting patterns, you can chain them together to generate entire features.&lt;/p&gt;

&lt;p&gt;The trick is structuring your prompt as a sequence: models first, then business logic, then API, then UI, then tests. Each piece builds on the previous one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Feature Blueprint Format:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build a [feature name] with the following stack: [technologies]

Step 1 - Data Model:
[describe your entities and relationships]

Step 2 - Business Logic:
[describe the core functionality]

Step 3 - API Endpoints:
[list endpoints with methods and requirements]

Step 4 - Frontend:
[describe the UI components needed]

Step 5 - Tests:
[what needs test coverage]

Generate code for each step that works together as a cohesive feature.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I needed a content translation system. Described the setup: Streamlit for the UI, Playwright to scrape web pages, AI models for translation, Bright Data's SERP API to find relevant links to add, and Pyppeteer for simple browser actions like screenshots.&lt;/p&gt;

&lt;p&gt;AI generated the &lt;strong&gt;complete&lt;/strong&gt; pipeline in about 30 minutes of back-and-forth. The scraping worked immediately, translation was solid, and the UI had all the controls I needed. Code wasn't perfect (had to fix some error handling and rate limiting), but it was ~90% done and properly structured.&lt;/p&gt;

&lt;p&gt;This works best for self-contained tools that don't need to integrate deeply with existing systems. For modifying production apps, it's better to do it piece by piece.&lt;/p&gt;

&lt;p&gt;My own example:&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;⏱️ Time Saved:&lt;/strong&gt; 4 hours to 2 days&lt;/p&gt;

&lt;h2&gt;
  
  
  Let AI Write Your Documentation
&lt;/h2&gt;

&lt;p&gt;Writing docs is important and nobody wants to do it. AI is actually pretty good at this if you give it the code and tell it who the audience is.&lt;/p&gt;

&lt;p&gt;Don't ask for generic documentation. Specify the audience, the format, what needs examples, and what needs warnings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Documentation Pattern:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create documentation for [code/API/component] targeted at [audience].

Include:
- Brief overview of what it does
- Setup/installation steps
- Usage examples (at least 3 realistic scenarios)
- Common pitfalls and how to avoid them
- API reference (if applicable)
- Links to related docs

Format: [Markdown/Docstring/JSDoc/etc.]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Built a custom event tracking system that sends user behavior data to our analytics stack. Needed a documentation so other marketers could add new events without breaking anything. Gave AI the code and asked for docs with examples of tracking button clicks, form submissions, and page views.&lt;/p&gt;

&lt;p&gt;Got back a documentation that actually made sense to non-developers. First time it's ever happened to me.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⏱️ Time Saved:&lt;/strong&gt; 1 to 3 hours&lt;/p&gt;

&lt;h2&gt;
  
  
  Use AI for "What's Wrong With This" Reviews
&lt;/h2&gt;

&lt;p&gt;When your code works but feels off, ask AI to review it like a senior engineer would. Not just for bugs, but for code smell, performance issues, security problems, and maintainability.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Review Prompts:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Review Type&lt;/th&gt;
&lt;th&gt;Prompt&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Security&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Review this code for security vulnerabilities. Look for &lt;a href="https://owasp.org/www-community/attacks/SQL_Injection_Bypassing_WAF" rel="noopener noreferrer"&gt;SQL injection&lt;/a&gt;, XSS, insecure dependencies, and auth bypass issues."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Analyze this code for performance problems. Identify &lt;a href="https://www.google.com/search?q=https://www.pingcap.com/article/how-to-efficiently-solve-the-n1-query-problem" rel="noopener noreferrer"&gt;N+1 queries&lt;/a&gt;, unnecessary loops, and expensive operations."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Maintainability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Review this code for maintainability. Point out complex logic, poor naming, missing error handling, and tight coupling."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Best Practices&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;"Review this against [language/framework] best practices. What patterns am I violating? What's going to confuse the next dev?"&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I had an API endpoint that worked fine in testing but felt slow. Asked AI to review it for performance and security. It caught that I was making 50 separate database calls inside a loop when I could do it in one query, spotted a missing rate limit, and found a security hole in how I was handling user input.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⏱️ Time Saved:&lt;/strong&gt; 2 to 6 hours (by catching issues early)&lt;/p&gt;

&lt;h2&gt;
  
  
  Generate Environment-Specific Configs
&lt;/h2&gt;

&lt;p&gt;Docker files, CI/CD configs, environment variable files, they're all important but boring. Each one has specific syntax that I often forget.&lt;/p&gt;

&lt;p&gt;AI can generate complete config files for your stack if you tell it what you're deploying and where.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Config Generation Needs:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🚀 Stack: Framework, database, services you're using
🌍 Environments: Development, staging, production requirements
🔧 Build process: Dependencies, build steps, optimization
🧪 Testing: How tests should run in CI
📦 Artifacts: What gets deployed, where it goes
🔒 Secrets: How environment variables get managed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I saw a LinkedIn post about someone needing a complete Docker setup for a Next.js app with PostgreSQL. Asked for a &lt;a href="https://docs.docker.com/build/building/multi-stage/" rel="noopener noreferrer"&gt;Dockerfile with multi-stage builds&lt;/a&gt; for production, docker-compose for local dev with hot reloading, and a &lt;a href="https://www.google.com/search?q=https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-nextjs" rel="noopener noreferrer"&gt;GitHub Actions workflow&lt;/a&gt; that runs tests, builds the image, and pushes to AWS ECR.&lt;/p&gt;

&lt;p&gt;And guess what? He got back everything he needed with comments explaining each step. The Dockerfile was optimized for layer caching, docker-compose had correct volume mounts, and the GitHub workflow included parallel test runs. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Disclaimer: The above section is based on someone else's story.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⏱️ Time Saved:&lt;/strong&gt; 2 to 4 hours&lt;/p&gt;

&lt;h2&gt;
  
  
  Ask AI to Generate Only The "Boring" Parts
&lt;/h2&gt;

&lt;p&gt;One of the best uses of AI is admitting which parts of your job are genuinely choking your soul.&lt;/p&gt;

&lt;p&gt;Form validation? Have AI write it. Type definitions? AI. &lt;a href="https://www.typescriptlang.org/docs/handbook/2/objects.html" rel="noopener noreferrer"&gt;Converting JSON to TypeScript interfaces&lt;/a&gt;? AI. Boilerplate CRUD endpoints? AI.&lt;/p&gt;

&lt;p&gt;Keep the interesting problems for yourself. Let AI handle the stuff that makes you zone out.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;High-Value Automation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;✓ Form validation with error messages
✓ TypeScript type definitions from JSON
✓ CRUD endpoints (basic create/read/update/delete)
✓ Data transformation utilities
✓ Mock data generators for testing
✓ Regex patterns for common validations
✓ Basic error handling wrappers
✓ Logging setup and configuration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is where AI really shines. Not replacing you, just doing the things you'd do anyway but faster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⏱️ Time Saved:&lt;/strong&gt; 15 minutes to 2 hours per task&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Reusable Code Patterns
&lt;/h2&gt;

&lt;p&gt;If you find yourself writing the same kind of code repeatedly, have AI generate a template you can reuse.&lt;/p&gt;

&lt;p&gt;This works great for things like API error handlers, database query wrappers, &lt;a href="https://srivastavayushmaan1347.medium.com/understanding-middlewares-a-comprehensive-guide-with-practical-examples-c80383f888d5" rel="noopener noreferrer"&gt;authentication middleware&lt;/a&gt;, logging, or anything else that follows the same pattern every time.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pattern Template Request:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a reusable template for [pattern type] that:

Base requirements:
- [list core functionality]

Must handle:
- [list edge cases]

Should be customizable by:
- [parameters/options]

Generate TypeScript/Python/etc. with inline comments explaining how to customize it for different use cases.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I kept writing the same code to connect to a &lt;a href="https://www.salesforce.com/eu/crm/what-is-crm/" rel="noopener noreferrer"&gt;CRM&lt;/a&gt; API every time we built a new automation. Asked AI to create a reusable connector that takes care of authentication, retries failed requests, and formats the data correctly. Said that I wanted detailed error messages during testing but simple ones in production.&lt;/p&gt;

&lt;p&gt;Got back a wrapper function I now use for all integrations. Changed a few field names to match our CRM structure, but the connection logic worked perfectly.&lt;/p&gt;

&lt;p&gt;Now whenever I need to pull CRM data, I copy the template and customize it in 2 minutes instead of fighting with API documentation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⏱️ Time Saved:&lt;/strong&gt; 30 minutes to 2 hours (accumulated over multiple uses)&lt;/p&gt;

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

&lt;p&gt;The pattern here is obvious: AI is best at structured, repetitive work with clear requirements. It's not good at creative problem-solving (yet).&lt;/p&gt;

&lt;p&gt;That means your job changes, no matter if you are a dev or a marketer. Instead of writing every line of code, you're making architectural decisions, explaining requirements, reviewing generated code, and solving the interesting problems.&lt;/p&gt;

&lt;p&gt;The boring parts (boilerplate, config files, CRUD, type definitions - you name it) happen faster. The creative parts (system design, user experience, performance optimization) get more of your time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Start This Week
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;When&lt;/th&gt;
&lt;th&gt;Do This&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Today&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Use the "explain back" technique on your current bug&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tomorrow&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Generate a database schema or migration script&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;This Week&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Try the multi-step workflow for a small feature&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Next Week&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Review what saved you the most time and do more of that&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You don't need to use AI for everything. Use it for the parts that make sense for your workflow. If something works better the old way, keep doing it the old way. Thanks for reading!&lt;/p&gt;

</description>
      <category>ai</category>
      <category>openai</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Connect Claude Desktop to Local MCP Servers</title>
      <dc:creator>Daniel Shashko</dc:creator>
      <pubDate>Mon, 03 Nov 2025 16:09:45 +0000</pubDate>
      <link>https://forem.com/danishashko/connect-claude-desktop-to-local-mcp-servers-2ia8</link>
      <guid>https://forem.com/danishashko/connect-claude-desktop-to-local-mcp-servers-2ia8</guid>
      <description>&lt;p&gt;MCP servers give &lt;a href="https://www.claude.com/download" rel="noopener noreferrer"&gt;Claude Desktop&lt;/a&gt; superpowers. They're programs that run on your computer and let Claude interact with your files, databases, and other local resources. It's like giving Claude hands to actually do things on your machine instead of just talking about them.&lt;/p&gt;

&lt;p&gt;This guide walks through setting up your first MCP server using Claude Desktop. We'll get Claude connected to your file system so it can read files, create documents, organize folders, and search through your directories. Every action requires your approval, so you stay in control.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You'll Need
&lt;/h2&gt;

&lt;p&gt;Before we start, make sure you have these installed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Desktop&lt;/strong&gt; - Download it from the official Claude website. If you already have it, check for updates by going to Claude &amp;gt; Check for Updates in the menu bar. You need the latest version for MCP support to work properly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Node.js&lt;/strong&gt; - Most MCP servers (including the filesystem one we're using) run on &lt;a href="https://nodejs.org/en" rel="noopener noreferrer"&gt;Node&lt;/a&gt;. Check if you have it by opening your terminal and running &lt;code&gt;node --version&lt;/code&gt;. If you don't see a version number, grab the LTS version from nodejs.org. The LTS version is more stable than the cutting edge releases.&lt;/p&gt;

&lt;h2&gt;
  
  
  How MCP Servers Actually Work
&lt;/h2&gt;

&lt;p&gt;Think of MCP servers as specialized assistants that run in the background. Each one provides specific tools that Claude can use. The filesystem server we're setting up gives Claude tools for reading files, creating directories, moving stuff around, and searching for files by name or content.&lt;/p&gt;

&lt;p&gt;The key thing is that Claude can't just go wild with these tools. Every single action needs your explicit approval. When Claude wants to create a file or move something, you'll see a prompt asking if it's okay. If something looks sketchy, just decline it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up the Filesystem Server
&lt;/h2&gt;

&lt;p&gt;Here's how to get Claude Desktop talking to your file system. The configuration happens through a JSON file that tells Claude which servers to start and what they can access.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open the Configuration File
&lt;/h3&gt;

&lt;p&gt;First, open Claude Desktop's settings. Not the settings inside a chat window, the actual app settings. On Mac, click Claude in the menu bar and select Settings. On Windows, you'll find it in the system tray menu.&lt;/p&gt;

&lt;p&gt;Once you're in settings, go to the Developer tab on the left sidebar. &lt;/p&gt;

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

&lt;p&gt;You'll see an "Edit Config" button. Click it. This either opens your existing config file or creates a new one. The file lives at &lt;code&gt;~/Library/Application Support/Claude/claude_desktop_config.json&lt;/code&gt; on Mac or &lt;code&gt;%APPDATA%\Claude\claude_desktop_config.json&lt;/code&gt; on Windows.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add the Filesystem Server Config
&lt;/h3&gt;

&lt;p&gt;Copy this configuration into your file. Make sure to replace &lt;code&gt;username&lt;/code&gt; with your actual computer username:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;macOS:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"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;"filesystem"&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;"npx"&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="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-filesystem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"/Users/username/Desktop"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"/Users/username/Downloads"&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;&lt;strong&gt;Windows:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"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;"filesystem"&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;"npx"&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="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-filesystem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Users&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;username&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Desktop"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Users&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;username&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Downloads"&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;Here's an example of my config file (&lt;a href="https://brightdata.com/" rel="noopener noreferrer"&gt;Bright Data&lt;/a&gt; is the only remote MCP server I am using):&lt;/p&gt;

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

&lt;p&gt;The paths in the &lt;code&gt;args&lt;/code&gt; array are the directories Claude can access. This example gives it Desktop and Downloads, but you can change these to whatever makes sense for you. Just be thoughtful about it. Only give access to folders you're genuinely comfortable with Claude reading and modifying.&lt;/p&gt;

&lt;p&gt;Here's what each piece of the config does. The &lt;code&gt;"filesystem"&lt;/code&gt; name is just a label that shows up in Claude Desktop. The &lt;code&gt;command&lt;/code&gt; tells it to use npx, which comes with Node.js. The &lt;code&gt;-y&lt;/code&gt; flag auto-confirms installing the server package. And &lt;code&gt;@modelcontextprotocol/server-filesystem&lt;/code&gt; is the actual package name. Everything after that is directories the server can touch.&lt;/p&gt;

&lt;p&gt;One thing to watch out for: the server runs with your user permissions. If you can delete or modify something, the server can too. So be selective about which directories you expose.&lt;/p&gt;

&lt;h3&gt;
  
  
  Restart Claude Desktop
&lt;/h3&gt;

&lt;p&gt;Save your config file and completely quit Claude Desktop. You need to fully restart it, not just close the window. Once it starts back up, look for a small hammer icon in the bottom-right corner of the chat input box. That's your MCP server indicator.&lt;/p&gt;

&lt;p&gt;Click the hammer icon to see what tools the filesystem server provides. You should see options for reading files, creating directories, moving files, and searching. If you don't see the hammer icon at all, something went wrong. Check the troubleshooting section below.&lt;/p&gt;

&lt;h2&gt;
  
  
  Actually Using It
&lt;/h2&gt;

&lt;p&gt;Now the fun part. Try asking Claude to do something with your files. Here are some examples that show off what's possible:&lt;/p&gt;

&lt;p&gt;"Can you write a short story and save it to my desktop?" Claude will write the story and create a new file for it. Before saving, you'll see an approval prompt showing exactly what file it wants to create and where.&lt;/p&gt;

&lt;p&gt;"What PDFs are in my downloads folder?" Claude will scan downloads and list any PDFs it finds. It can even summarize what they're about if you want.&lt;/p&gt;

&lt;p&gt;"Organize all the images on my desktop into a folder called 'Images'" Claude will create the folder and move image files into it. You'll approve each step.&lt;/p&gt;

&lt;p&gt;Every time Claude wants to do something with your files, it asks first. You'll see exactly what operation it wants to perform and on which files. Take a second to read these prompts. If something looks weird, deny it and ask Claude why it wanted to do that.&lt;/p&gt;

&lt;p&gt;Here's an example of how I use the &lt;a href="https://github.com/danishashko/yahoo-finance-mcp" rel="noopener noreferrer"&gt;Yahoo Finance MCP Server&lt;/a&gt;:&lt;/p&gt;

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

&lt;p&gt;And here's the final result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhulyi0vn35yimn1m0c1c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhulyi0vn35yimn1m0c1c.png" alt="Claude Desktop's reply to my prompt after finishing the analysis" width="800" height="811"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  When Things Don't Work
&lt;/h2&gt;

&lt;p&gt;If the filesystem server isn't showing up or tools are failing, here's how to fix it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server not connecting&lt;/strong&gt; - First, completely restart Claude Desktop. Not just closing the window, actually quit the app. Then check your &lt;code&gt;claude_desktop_config.json&lt;/code&gt; syntax. JSON is picky about commas and brackets. Make sure all your file paths are absolute, not relative. So &lt;code&gt;/Users/username/Desktop&lt;/code&gt;, not just &lt;code&gt;Desktop&lt;/code&gt;. Also verify the paths actually exist on your system.&lt;/p&gt;

&lt;p&gt;If it's still not working, check the logs. On Mac they're in &lt;code&gt;~/Library/Logs/Claude&lt;/code&gt;, on Windows in &lt;code&gt;%APPDATA%\Claude\logs&lt;/code&gt;. The &lt;code&gt;mcp.log&lt;/code&gt; file shows general connection info. Files named &lt;code&gt;mcp-server-filesystem.log&lt;/code&gt; show errors from the filesystem server specifically.&lt;/p&gt;

&lt;p&gt;You can tail the logs on Mac with:&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="nb"&gt;tail&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; 20 &lt;span class="nt"&gt;-f&lt;/span&gt; ~/Library/Logs/Claude/mcp&lt;span class="k"&gt;*&lt;/span&gt;.log
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Windows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="kr"&gt;type&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"%APPDATA%\Claude\logs\mcp*.log"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Try running the server manually to see if it throws any errors:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx &lt;span class="nt"&gt;-y&lt;/span&gt; @modelcontextprotocol/server-filesystem /Users/username/Desktop /Users/username/Downloads
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Tools failing silently&lt;/strong&gt; - If Claude tries to use tools but they fail without clear error messages, check the logs first. Then verify the server runs correctly when you start it manually. Sometimes restarting Claude Desktop fixes weird state issues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Windows path issues&lt;/strong&gt; - If you're on Windows and seeing errors about &lt;code&gt;${APPDATA}&lt;/code&gt; in paths, you might need to add the expanded value to your config's &lt;code&gt;env&lt;/code&gt; section:&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;"filesystem"&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;"npx"&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;"-y"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"@modelcontextprotocol/server-filesystem"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Users&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;username&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Desktop"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&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;"APPDATA"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"C:&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Users&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;username&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;AppData&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Roaming&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&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;Also make sure npm is installed globally. You should have a &lt;code&gt;%APPDATA%\npm&lt;/code&gt; directory. If not, run &lt;code&gt;npm install -g npm&lt;/code&gt; to install it globally.&lt;/p&gt;

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

&lt;p&gt;You've got Claude connected to your file system now. That's a solid start, but there's a lot more you can do with MCP.&lt;/p&gt;

&lt;p&gt;Check out the official MCP servers repository on GitHub to see what else is available. There are servers for databases, APIs, web scraping, and all sorts of other tools. The community has built some really interesting ones too.&lt;/p&gt;

&lt;p&gt;If you've got specific needs, you can build your own MCP server. It's not as hard as it sounds. The MCP documentation has guides for creating custom servers in Python or TypeScript.&lt;/p&gt;

&lt;p&gt;You can also connect Claude to &lt;a href="https://modelcontextprotocol.io/docs/develop/connect-remote-servers" rel="noopener noreferrer"&gt;remote servers&lt;/a&gt;, not just local ones. This opens up possibilities for cloud-based tools and services. Same concept, different connection method.&lt;/p&gt;

&lt;p&gt;And if you want to really understand what's happening under the hood, read through the MCP architecture docs. They explain the protocol design and how clients and servers communicate. It's genuinely interesting if you're into that kind of thing.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>programming</category>
      <category>json</category>
    </item>
    <item>
      <title>MCP Server Architecture: A Developer's Guide</title>
      <dc:creator>Daniel Shashko</dc:creator>
      <pubDate>Mon, 03 Nov 2025 15:56:11 +0000</pubDate>
      <link>https://forem.com/danishashko/mcp-server-architecture-a-developers-guide-3m28</link>
      <guid>https://forem.com/danishashko/mcp-server-architecture-a-developers-guide-3m28</guid>
      <description>&lt;p&gt;The Model Context Protocol lets AI applications like Claude Desktop pull in context from different data sources. Think of it as a way to connect your AI to databases, APIs, file systems, and other tools without writing custom integrations for each one.&lt;/p&gt;

&lt;p&gt;This guide focuses on how MCP actually works. If you want to start building, check out the language-specific SDK docs instead.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Actually in MCP
&lt;/h2&gt;

&lt;p&gt;MCP is really four things:&lt;/p&gt;

&lt;p&gt;First, there's the &lt;a href="https://modelcontextprotocol.io/specification/latest" rel="noopener noreferrer"&gt;specification&lt;/a&gt; that defines how clients and servers should talk to each other. Then you've got SDKs in different languages that handle the protocol details for you. The &lt;a href="https://github.com/modelcontextprotocol/inspector" rel="noopener noreferrer"&gt;MCP Inspector&lt;/a&gt; helps you test and debug your servers during development. And finally, there are &lt;a href="https://github.com/modelcontextprotocol/servers" rel="noopener noreferrer"&gt;reference server implementations&lt;/a&gt; you can learn from or use directly.&lt;/p&gt;

&lt;p&gt;One thing to understand upfront: MCP only handles context exchange. It doesn't care how your AI application uses that context or which language model you're running. That's your problem to solve.&lt;/p&gt;

&lt;h2&gt;
  
  
  How MCP Components Fit Together
&lt;/h2&gt;

&lt;p&gt;MCP uses a straightforward client-server setup. An AI application (the MCP host) creates separate client connections to each server it wants to talk to. Every connection is one-to-one, so if you connect to three servers, you're managing three separate client instances.&lt;/p&gt;

&lt;p&gt;The main players are:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP Host&lt;/strong&gt; - This is your AI application. It could be Claude Desktop, VS Code, or anything else that needs context from external sources. The host coordinates multiple client connections.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP Client&lt;/strong&gt; - Each client maintains one connection to one server. It's basically a messenger that fetches context and passes it back to the host.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MCP Server&lt;/strong&gt; - A program that serves up context. Could be running locally on your machine or hosted remotely somewhere.&lt;/p&gt;

&lt;p&gt;Here's a real example: VS Code is the host. When you connect it to the &lt;a href="https://docs.sentry.io/product/sentry-mcp/" rel="noopener noreferrer"&gt;Sentry MCP server&lt;/a&gt;, VS Code spins up a client object just for that connection. Connect to the &lt;a href="https://github.com/modelcontextprotocol/servers/tree/main/src/filesystem" rel="noopener noreferrer"&gt;filesystem server&lt;/a&gt; too, and you get a second client object. Two servers, two clients, clean separation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;graph TB
    subgraph "MCP Host (AI Application)"
        Client1["MCP Client 1"]
        Client2["MCP Client 2"]
        Client3["MCP Client 3"]
    end

    Server1["MCP Server 1&amp;lt;br/&amp;gt;(e.g., Sentry)"]
    Server2["MCP Server 2&amp;lt;br/&amp;gt;(e.g., Filesystem)"]
    Server3["MCP Server 3&amp;lt;br/&amp;gt;(e.g., Database)"]

    Client1 ---|"One-to-one&amp;lt;br/&amp;gt;connection"| Server1
    Client2 ---|"One-to-one&amp;lt;br/&amp;gt;connection"| Server2
    Client3 ---|"One-to-one&amp;lt;br/&amp;gt;connection"| Server3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quick terminology note: we call them MCP servers regardless of where they run. A server running on your laptop using standard input/output? That's a local server. A server running on Sentry's infrastructure using HTTP? That's a remote server. Both are just MCP servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Two Layers
&lt;/h2&gt;

&lt;p&gt;MCP splits responsibilities between two layers:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Layer&lt;/strong&gt; - This is the protocol itself, built on JSON-RPC 2.0. It defines the message formats for everything: initializing connections, discovering tools, reading resources, handling prompts, and pushing notifications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transport Layer&lt;/strong&gt; - This is how messages actually move between client and server. Could be stdio (standard input/output) for local processes or HTTP for remote servers. The transport handles connection setup, message framing, and authentication.&lt;/p&gt;

&lt;p&gt;Think of the data layer as what you're saying, and the transport layer as how you're saying it. The same JSON-RPC messages work across both transport types.&lt;/p&gt;

&lt;h3&gt;
  
  
  Transport Options
&lt;/h3&gt;

&lt;p&gt;You've got two ways to move data around:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stdio Transport&lt;/strong&gt; - Uses standard input and output streams. Perfect for local servers because there's no network overhead. When Claude Desktop launches the filesystem server, it uses stdio. Fast, simple, stays on your machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Streamable HTTP Transport&lt;/strong&gt; - Uses regular HTTP POST requests for client-to-server messages. Optionally adds Server-Sent Events for streaming updates from server to client. This is how remote servers work. Supports standard HTTP auth: bearer tokens, API keys, custom headers. MCP recommends OAuth for getting those tokens.&lt;/p&gt;

&lt;p&gt;The nice thing about having two transport options is you can use the same server code locally during development (stdio) and deploy it remotely in production (HTTP) without changing the core logic.&lt;/p&gt;

&lt;h3&gt;
  
  
  What You Actually Share: The Data Layer
&lt;/h3&gt;

&lt;p&gt;This is the interesting part. The data layer defines how servers share context with AI applications. It uses &lt;a href="https://www.jsonrpc.org/" rel="noopener noreferrer"&gt;JSON-RPC 2.0&lt;/a&gt; for all communication. Clients send requests, servers respond. If no response is needed, you send a notification instead.&lt;/p&gt;

&lt;p&gt;MCP is stateful (mostly - you can make parts of it stateless with HTTP). That means you need to manage the connection lifecycle. Both sides negotiate what features they support during initialization. We'll walk through a real example in a minute.&lt;/p&gt;

&lt;h3&gt;
  
  
  MCP Primitives: The Core Concepts
&lt;/h3&gt;

&lt;p&gt;Primitives are the heart of MCP. They define what clients and servers can offer each other. Three main types that servers expose:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tools&lt;/strong&gt; - Functions the AI can call to do things. Query a database, hit an API, write a file. Tools are actions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt; - Data the AI can read for context. File contents, database schemas, API responses. Resources are information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prompts&lt;/strong&gt; - Templates that structure how the AI interacts with everything. System prompts, few-shot examples, conversation starters. Prompts are guidance.&lt;/p&gt;

&lt;p&gt;Each primitive type has methods for listing (&lt;code&gt;*/list&lt;/code&gt;), getting details (&lt;code&gt;*/get&lt;/code&gt;), and sometimes executing (&lt;code&gt;tools/call&lt;/code&gt;). Clients use &lt;code&gt;*/list&lt;/code&gt; to discover what's available, and those lists can change dynamically. That's important - a database server might expose different tools depending on which database is connected.&lt;/p&gt;

&lt;p&gt;Here's a concrete example: you build an MCP server for Postgres. It exposes tools for running queries, resources containing your table schemas, and prompts with examples of good queries for your specific schema. The AI application can discover all of this through the list methods, then use it as needed.&lt;/p&gt;

&lt;p&gt;Servers can also use primitives that clients expose:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sampling&lt;/strong&gt; - Ask the client's AI to generate completions. Useful when you need language model access but don't want to bundle an LLM SDK in your server. Call &lt;code&gt;sampling/complete&lt;/code&gt; and let the client handle it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Elicitation&lt;/strong&gt; - Request more information from users. Need confirmation before deleting something? Want clarification on a query? Use &lt;code&gt;elicitation/request&lt;/code&gt; to ask.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Logging&lt;/strong&gt; - Send debug and monitoring messages back to the client. Helps you understand what's happening without cluttering the main data flow.&lt;/p&gt;

&lt;h3&gt;
  
  
  Real-Time Updates
&lt;/h3&gt;

&lt;p&gt;MCP supports push notifications so servers can tell clients when things change. Your available tools change? Send a notification. A monitored resource updates? Push it to the client. Notifications use JSON-RPC 2.0's notification format (no response expected) and keep everything synchronized without constant polling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Walking Through a Real Interaction
&lt;/h2&gt;

&lt;p&gt;Let's see how this actually works with a step-by-step example. We'll show the JSON-RPC messages going back and forth.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Initializing the Connection
&lt;/h3&gt;

&lt;p&gt;First, the client and server need to agree on what they can do. The client sends an initialize request:&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;"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;1&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;"initialize"&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;"protocolVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-06-18"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"capabilities"&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;"elicitation"&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;"clientInfo"&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;"example-client"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&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 server responds with its own capabilities:&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;"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;1&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;"protocolVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2025-06-18"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"capabilities"&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;"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="nl"&gt;"listChanged"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="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;"resources"&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;"serverInfo"&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;"example-server"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&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;What's happening here? The protocol version ensures compatibility. If they can't agree on a version, they should disconnect. The capabilities object is crucial - it's how each side declares what features it supports.&lt;/p&gt;

&lt;p&gt;In this exchange, the client says "I can handle elicitation requests" (meaning it can prompt users for input). The server says "I've got tools and they might change, plus I can serve resources." That &lt;code&gt;listChanged: true&lt;/code&gt; flag means the server will send notifications when its tool list updates.&lt;/p&gt;

&lt;p&gt;The info objects are mainly for debugging and logging. After this succeeds, the client sends a quick notification saying it's ready:&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;"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;"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;"notifications/initialized"&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;Behind the scenes in your AI application, this initialization happens for each server you connect to. The app stores those capabilities and uses them to route requests correctly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2: Discovering Tools
&lt;/h3&gt;

&lt;p&gt;Now the client wants to know what tools are available. It sends a simple list request:&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;"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;2&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/list"&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 server responds with detailed information about each tool:&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;"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;2&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;"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;"calculator_arithmetic"&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;"Calculator"&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;"Perform mathematical calculations including basic arithmetic, trigonometric functions, and algebraic operations"&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;"expression"&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;"Mathematical expression to evaluate (e.g., '2 + 3 * 4', 'sin(30)', 'sqrt(16)')"&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;"expression"&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="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;"weather_current"&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;"Weather Information"&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;"Get current weather information for any location worldwide"&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;"location"&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;"City name, address, or coordinates (latitude,longitude)"&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;"units"&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;"enum"&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;"metric"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"imperial"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"kelvin"&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;"Temperature units to use in response"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
              &lt;/span&gt;&lt;span class="nl"&gt;"default"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"metric"&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;"location"&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;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;Each tool includes everything the client needs to use it. The name is a unique identifier. The description explains what it does. The inputSchema uses JSON Schema to define exactly what parameters it expects, which ones are required, and what types they should be. This lets clients validate inputs before sending them and helps language models understand how to call the tools correctly.&lt;/p&gt;

&lt;p&gt;Your AI application fetches these tool lists from all connected servers and builds a unified registry. When the language model needs to do something, it can see all available tools and pick the right one.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Calling a Tool
&lt;/h3&gt;

&lt;p&gt;Let's actually use one of those tools. The client sends a call request with the tool name and arguments:&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;"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;3&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;"weather_current"&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;"location"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"San Francisco"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"units"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"imperial"&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 name has to match exactly what was in the discovery response. The arguments need to conform to that inputSchema we saw earlier. Here we're providing both the required location and the optional units parameter.&lt;/p&gt;

&lt;p&gt;The server executes the tool and returns results:&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;"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;3&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;"Current weather in San Francisco: 68°F, partly cloudy with light winds from the west at 8 mph. Humidity: 65%"&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 response uses a content array. This gives you flexibility - you could return text, images, or references to other resources. Each content object has a type field to identify what kind of data it contains. Here it's just text, but MCP supports richer response formats.&lt;/p&gt;

&lt;p&gt;When your language model decides to use a tool during a conversation, your AI app intercepts that call, routes it to the right MCP server, executes it, and feeds the results back to the LLM. This is how the AI can access real-time data and take actions in the real world.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Handling Real-Time Updates
&lt;/h3&gt;

&lt;p&gt;Remember how the server said &lt;code&gt;listChanged: true&lt;/code&gt; during initialization? That means it can send notifications when its tools change. Here's what that looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"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;"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;"notifications/tools/list_changed"&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;Notice there's no id field. That's because this is a notification - no response expected. The server is just saying "hey, my tools changed, you should check again."&lt;/p&gt;

&lt;p&gt;When the client gets this, it typically responds by requesting an updated tool list:&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;"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;4&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/list"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This notification pattern is really useful. Tools might appear or disappear based on server state, user permissions, or external dependencies. Instead of constantly polling for changes, clients get notified exactly when updates happen. Keeps everything in sync efficiently.&lt;/p&gt;

&lt;p&gt;This works for other primitives too, not just tools. You can get notifications about changed resources, updated prompts, anything that makes sense for your use case.&lt;/p&gt;

&lt;p&gt;Your AI application handles these notifications by refreshing its internal registry and updating what the language model can access. If a conversation is active, the LLM can immediately start using new tools as they become available.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;That's the core flow: initialize, discover, execute, stay synchronized. The actual protocol has more features (resources, prompts, sampling, elicitation), but this example covers the fundamental patterns you'll use most often.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>programming</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Getting Started with Claude Code (Super Easy!)</title>
      <dc:creator>Daniel Shashko</dc:creator>
      <pubDate>Mon, 03 Nov 2025 15:37:15 +0000</pubDate>
      <link>https://forem.com/danishashko/getting-started-with-claude-code-5elc</link>
      <guid>https://forem.com/danishashko/getting-started-with-claude-code-5elc</guid>
      <description>&lt;p&gt;Let's get you up and running with Claude Code in a few minutes. This AI-powered coding assistant will feel like having a smart colleague right in your terminal.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you'll need
&lt;/h2&gt;

&lt;p&gt;Before we start, make sure you've got:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A terminal or command prompt open&lt;/li&gt;
&lt;li&gt;A code project to work with (any project is fine)&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://claude.ai" rel="noopener noreferrer"&gt;Claude.ai&lt;/a&gt; or &lt;a href="https://console.anthropic.com/" rel="noopener noreferrer"&gt;Claude Console&lt;/a&gt; account&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Claude.ai is probably your best bet if you're just getting started since it has subscription plans that are easier to manage.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing Claude Code
&lt;/h2&gt;

&lt;p&gt;Pick the method that works for your system:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;macOS or Linux with Homebrew:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; claude-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;macOS, Linux, or WSL:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://claude.ai/install.sh | bash
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Windows PowerShell:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight powershell"&gt;&lt;code&gt;&lt;span class="n"&gt;irm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nx"&gt;https://claude.ai/install.ps1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;iex&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Windows Command Prompt:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -fsSL https://claude.ai/install.cmd -o install.cmd &amp;amp;&amp;amp; install.cmd &amp;amp;&amp;amp; del install.cmd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Logging in
&lt;/h2&gt;

&lt;p&gt;Once Claude Code is installed, you'll need to sign in. Start an interactive session and it'll walk you through the login process:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;claude
&lt;span class="c"&gt;# You'll get prompted to log in on first use&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you need to log in manually or switch accounts later, just use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can use either a Claude.ai account (the subscription one) or a Claude Console account (pay-per-use with API credits). Both work fine, and you can even have both under the same email if needed.&lt;/p&gt;

&lt;p&gt;When you first connect a Claude Console account, Claude automatically creates a workspace called "Claude Code" for tracking your usage and costs. Pretty handy for keeping tabs on what you're spending.&lt;/p&gt;

&lt;p&gt;Once you're logged in, your credentials get saved locally so you won't have to do this dance every time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your first session
&lt;/h2&gt;

&lt;p&gt;Navigate to any project directory and fire up Claude Code:&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="nb"&gt;cd&lt;/span&gt; /path/to/your/project
claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll see a welcome screen with your session info, recent conversations, and any updates. Type &lt;code&gt;/help&lt;/code&gt; to see what commands are available, or &lt;code&gt;/resume&lt;/code&gt; to pick up where you left off in a previous conversation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding your codebase
&lt;/h2&gt;

&lt;p&gt;Let's start by having Claude take a look at your project. Try asking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; what does this project do?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude will scan through your files and give you a summary. You can get more specific too:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; what technologies does this project use?
&amp;gt; where is the main entry point?
&amp;gt; explain the folder structure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can also ask Claude about itself:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; what can Claude Code do?
&amp;gt; how do I use slash commands in Claude Code?
&amp;gt; can Claude Code work with Docker?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The cool thing is that Claude reads your files automatically as it needs them. You don't have to manually feed it context like you would with some other AI tools. It also knows about its own documentation, so it can answer questions about its features.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making your first code change
&lt;/h2&gt;

&lt;p&gt;Time for the fun part. Let's have Claude actually write some code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; add a hello world function to the main file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here's what happens next:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Claude finds the right file to modify&lt;/li&gt;
&lt;li&gt;Shows you exactly what it wants to change&lt;/li&gt;
&lt;li&gt;Asks for your permission&lt;/li&gt;
&lt;li&gt;Makes the edit once you approve&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Claude always asks before touching your files. You can approve changes one by one, or if you're feeling confident, enable "Accept all" mode for the session.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working with Git
&lt;/h2&gt;

&lt;p&gt;Claude makes Git operations feel natural. Instead of remembering commands, just describe what you want:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; what files have I changed?
&amp;gt; commit my changes with a descriptive message
&amp;gt; create a new branch called feature/quickstart
&amp;gt; show me the last 5 commits
&amp;gt; help me resolve merge conflicts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's like having a Git expert sitting next to you who actually pays attention to what you're working on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fixing bugs and adding features
&lt;/h2&gt;

&lt;p&gt;This is where Claude really shines. Describe what you want in plain English:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; add input validation to the user registration form
&amp;gt; there's a bug where users can submit empty forms - fix it
&amp;gt; refactor the authentication module to use async/await instead of callbacks
&amp;gt; write unit tests for the calculator functions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claude will figure out where the relevant code lives, understand the context, implement a solution, and even run tests if you have them set up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Other useful workflows
&lt;/h2&gt;

&lt;p&gt;Here are some other things you can try:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code review:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; review my changes and suggest improvements
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Documentation:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; update the README with installation instructions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Testing:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; write integration tests for the API endpoints
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The key is to talk to Claude like you would a helpful colleague. Be conversational and describe what you're trying to achieve.&lt;/p&gt;

&lt;h2&gt;
  
  
  Essential commands you'll use daily
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Start interactive mode&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude "task"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run a one-time task and exit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude -p "query"&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Ask a quick question and exit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude -c&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Continue your most recent conversation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;claude commit&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Create a Git commit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;/help&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show available commands&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;exit&lt;/code&gt; or Ctrl+C&lt;/td&gt;
&lt;td&gt;Exit Claude Code&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Tips that'll save you time
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Be specific with your requests.&lt;/strong&gt; Instead of "fix the bug," try "fix the login bug where users see a blank screen after entering wrong credentials." The more context you give Claude, the better it can help.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Break complex tasks into steps.&lt;/strong&gt; Don't try to do everything at once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; 1. create a new database table for user profiles
&amp;gt; 2. create an API endpoint to get and update user profiles  
&amp;gt; 3. build a webpage that allows users to see and edit their information
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Let Claude explore before making changes.&lt;/strong&gt; Have it understand your codebase first:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; analyze the database schema
&amp;gt; build a dashboard showing products that are most frequently returned by our UK customers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Learn the shortcuts.&lt;/strong&gt; Press &lt;code&gt;?&lt;/code&gt; to see keyboard shortcuts, use Tab for command completion, press ↑ for command history, and type &lt;code&gt;/&lt;/code&gt; to see all slash commands.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next?
&lt;/h2&gt;

&lt;p&gt;Now that you've got the basics down, you can explore more advanced features in the documentation. The CLI reference has all the commands, the configuration guide shows you how to customize things, and the common workflows section walks through more complex tasks.&lt;/p&gt;

&lt;p&gt;If you get stuck, just type &lt;code&gt;/help&lt;/code&gt; in Claude Code or ask "how do I..." Claude's pretty good at explaining its own features. You can also check out the community Discord for tips and support from other developers.&lt;/p&gt;

&lt;p&gt;The main thing to remember is that Claude Code is designed to be conversational. Don't overthink it - just describe what you want to accomplish and let it help you get there.&lt;/p&gt;

</description>
      <category>tooling</category>
      <category>ai</category>
      <category>cli</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Claude Code for Growth Marketing (Hell Yeah!)</title>
      <dc:creator>Daniel Shashko</dc:creator>
      <pubDate>Sun, 02 Nov 2025 20:31:14 +0000</pubDate>
      <link>https://forem.com/danishashko/claude-code-for-growth-marketing-hell-yeah-i7i</link>
      <guid>https://forem.com/danishashko/claude-code-for-growth-marketing-hell-yeah-i7i</guid>
      <description>&lt;p&gt;Below I’ll explain what they built, why it matters, and how you can copy the patterns without a big team (with only &lt;a href="https://www.claude.com/product/claude-code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt;). Who is they you are asking? Well, Anthrophic! Read their full document &lt;a href="https://www-cdn.anthropic.com/58284b19e702b49db9302d5b6f135ad8871e7658.pdf" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What they built and why it matters
&lt;/h2&gt;

&lt;p&gt;They focused on four practical automations: automatic Google Ads creative generation, a Figma plugin for mass creative production, a Meta Ads &lt;a href="https://modelcontextprotocol.io/" rel="noopener noreferrer"&gt;MCP (Model Context Protocol) server&lt;/a&gt; for campaign pull, and a simple memory system - I personally recommend &lt;a href="https://github.com/basicmachines-co/basic-memory" rel="noopener noreferrer"&gt;basic-memory&lt;/a&gt; for such use cases. Each automation handles a specific pain point.&lt;/p&gt;

&lt;p&gt;For Google Ads, the heavy lift is generating many compliant variations, then testing them. Ads have strict character limits, and manual creation is slow and error prone. The Claude Code workflow reads a CSV of past ads and metrics, flags underperformers, and spins up hundreds of new headline and description variations. Instead of a human spending hours or days, the system churns out candidates in minutes.&lt;/p&gt;

&lt;p&gt;For creative output on social, they automated what designers do manually. A Figma plugin finds frames and swaps text layers to produce batches of variations. That reduced a job that used to take hours of copy-pasting down to less than a second per batch.&lt;/p&gt;

&lt;p&gt;For measurement, they built a small MCP server that talks to the Meta Ads API and serves campaign performance directly into Claude Desktop. No more tab switching between platforms to pull numbers and form hypotheses.&lt;/p&gt;

&lt;p&gt;Finally, they added a lightweight memory system. It logs hypotheses, experiment parameters, and results so each new round of creative generation can reference past learnings. That makes the testing pipeline self-improving rather than starting from scratch every time.&lt;/p&gt;

&lt;p&gt;These are small, repeatable automations that buy hours per week and let a tiny team operate like a larger one.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the Google Ads automation works (practical details)
&lt;/h2&gt;

&lt;p&gt;They start with a CSV export that includes ad text and performance columns. Think columns like ad_id, headline, description, impressions, clicks, ctr, conversions, cost_per_conversion. The workflow first filters for ads that meet a "needs iteration" rule, for example CTR below a threshold with reasonable impressions. That keeps the system focused on ads that matter.&lt;/p&gt;

&lt;p&gt;Claude Code runs two focused sub-agents. One handles headlines and enforces the 30 character limit. The other handles descriptions and enforces the 90 character limit. Splitting the task makes each agent simpler to prompt and easier to debug. Each sub-agent is asked to produce N variants and to return both the copy and metadata like estimated tone and targeted audience hints. The workflow then writes the new variations back to a CSV, tags them for a staged rollout, and hands them off to the ad platform or human QA.&lt;/p&gt;

&lt;p&gt;Why split agents? Prompting one model to manage all constraints tends to create edge-case failures. Two small, single-responsibility agents give predictable outputs and make it simple to add more constraints later, like legal checks or localization.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Figma plugin for mass creative production
&lt;/h2&gt;

&lt;p&gt;Designers hate repetitive resizing and swapping. The plugin they wrote scans a Figma page for frames that match an ad template. It finds the text layers that contain headline and description, then programmatically replaces those with the generated copy. It can output up to 100 variations in one go. The plugin also exports image assets ready for upload to ad platforms.&lt;/p&gt;

&lt;p&gt;This approach does two useful things. First, it preserves layout and image composition, so designers don't lose control of the visual. Second, it scales testing by letting you attach many copy variants to a small set of visual templates. You end up testing more combinations without hiring more designers.&lt;/p&gt;

&lt;p&gt;A few practical tips here: keep text layers named consistently across templates, and bake in a fallback font size so long headlines truncate predictably. Also add a quick visual QA step. Even automated swaps can create weird line breaks or overlap.&lt;/p&gt;

&lt;h2&gt;
  
  
  Meta Ads MCP server and measurement flow
&lt;/h2&gt;

&lt;p&gt;The MCP server is small and focused. It pulls campaign-level metrics, spend data, and ad creative performance from the Meta Ads API. The server normalizes the data and serves endpoints Claude Desktop can query. That means the marketing workflow can ask for the latest stats, form hypotheses, and generate new creatives without switching tools.&lt;/p&gt;

&lt;p&gt;Rate limits and data freshness matter. They implemented simple caching and incremental pulls so the server doesn't hammer the API. They also added a lightweight schema that ties creative variants to experiment IDs so test results are easy to attribute back to individual variations.&lt;/p&gt;

&lt;p&gt;Why bother? Pulling data into the same environment where you generate copy closes the loop fast. You look at a bad ad, ask Claude to rewrite it using the last two months of learnings, and get candidate copy within the same session. That sort of tight loop speeds up meaningful iterations.&lt;/p&gt;

&lt;h2&gt;
  
  
  The memory system: keep experiments from getting lost
&lt;/h2&gt;

&lt;p&gt;Tracking hypotheses used to be a spreadsheet nightmare for them. They built a small memory layer that logs experiments, the hypothesis, the variants used, rollout dates, and results. When generating new creative, Claude can pull past experiment summaries and avoid repeating failed approaches. It can also suggest promising directions based on winning motifs from similar audiences.&lt;/p&gt;

&lt;p&gt;This is not a full-featured experiment platform. It’s a simple registry that prevents reinventing the wheel. Even a few structured fields and a consistent naming convention for experiments can save hours of duplicated effort and make A/B test attribution sane.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-world impact and trade-offs
&lt;/h2&gt;

&lt;p&gt;The concrete results were simple. Ad copy creation time dropped from roughly two hours to about 15 minutes for a campaign refresh. Creative output increased by about 10x, meaning many more variants get tested. The single-person team started running workflows that used to need engineering support.&lt;/p&gt;

&lt;p&gt;But there are trade-offs. Automated copy &lt;em&gt;still&lt;/em&gt; needs human QA for brand voice and legal compliance. Models can hallucinate metrics or fabricate claims, so you need checks that prevent false statements from going live. API rate limits and costs are practical constraints. And automated variants are only useful if your experiment and attribution setup is solid, otherwise you’ll collect noise instead of signal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical how-to and a short starter checklist
&lt;/h2&gt;

&lt;p&gt;If you want to try this in your team, start small and focus on one bottleneck. For most teams that will be either creative generation or measurement.&lt;/p&gt;

&lt;p&gt;Quick starter checklist:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pick one ad platform and export a CSV with ad text and at least three performance columns.
&lt;/li&gt;
&lt;li&gt;Build two simple Claude Code prompts: one for headlines, one for descriptions, each enforcing the exact character limits. Keep prompts short and strict.
&lt;/li&gt;
&lt;li&gt;Add a human QA step before anything goes live. Automate everything else once you trust the outputs.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After that, add a Figma export/import step if you want batch creative rendering. Then bring in a tiny MCP server for the platform you care about and connect it to the same workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common pitfalls and how to avoid them
&lt;/h2&gt;

&lt;p&gt;People tend to ask Claude for one-shot, complicated magic prompts. That fails. Break the job into small tasks. Validate outputs at each step. Log every experiment with IDs so you can map results back to variants. Beware overfitting to short-term metrics, and make sure you track the right goals, not just CTR.&lt;/p&gt;

&lt;p&gt;Also watch out for rate limits and edge-case text behavior. Long headlines that barely fit may break layouts on mobile. Automated QA should check character counts, line breaks, and legal tokens before upload.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thoughts
&lt;/h2&gt;

&lt;p&gt;The pattern here is simple: automate the repetitive, make the outputs predictable, and keep humans in the loop for judgment. Claude Code isn't a all magic, but it lowers the engineering bar so small marketing teams can move fast. &lt;/p&gt;

&lt;p&gt;If you keep prompts focused, split responsibilities across small agents, and make sure you can tie experiments back to results, you'll get a lot of mileage from this approach.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;P.S. I suggest always starting with this prompt: "Do not waste tokens on generating implementation guides and illustrations, focus on the producing quality codes, I am satisfied with only minimal explanation."&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>ai</category>
      <category>marketing</category>
    </item>
    <item>
      <title>How to Create and Publish Your First NPM Package</title>
      <dc:creator>Daniel Shashko</dc:creator>
      <pubDate>Sun, 02 Nov 2025 19:43:16 +0000</pubDate>
      <link>https://forem.com/danishashko/how-to-create-and-publish-your-first-npm-package-fil</link>
      <guid>https://forem.com/danishashko/how-to-create-and-publish-your-first-npm-package-fil</guid>
      <description>&lt;p&gt;Publishing your first NPM package feels like a rite of passage for JavaScript developers. Whether you've built a utility function you keep copying between projects or solved a problem that others might face, sharing it on NPM makes your code accessible to millions of developers worldwide.&lt;/p&gt;

&lt;p&gt;I'll walk you through the entire process, from choosing a name to seeing your package live on the registry. We'll build a simple example together so you can follow along.&lt;/p&gt;

&lt;h2&gt;
  
  
  Picking the Perfect Package Name
&lt;/h2&gt;

&lt;p&gt;Before you write a single line of code, you need a name. This is trickier than it sounds because NPM has over a million packages, and yours needs to be unique.&lt;/p&gt;

&lt;p&gt;Head over to &lt;a href="https://www.npmjs.com/" rel="noopener noreferrer"&gt;npmjs.com&lt;/a&gt; and search for your desired name. If you find something similar, NPM will likely reject your submission. For example, if there's already a package called &lt;code&gt;hellonpmpackage&lt;/code&gt;, you can't publish &lt;code&gt;hello-npm-package&lt;/code&gt; because they're too similar.&lt;/p&gt;

&lt;p&gt;Don't panic if your name is taken. You have two options: pick a different name or publish a scoped package (which I'll explain later). Scoped packages let you use &lt;code&gt;@yourusername/package-name&lt;/code&gt;, so you can still get the name you want.&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up Your Package
&lt;/h2&gt;

&lt;p&gt;Let's create a simple package together. I'll build one called &lt;code&gt;first-hello-npm&lt;/code&gt; that returns a greeting.&lt;/p&gt;

&lt;h3&gt;
  
  
  Getting Node.js Ready
&lt;/h3&gt;

&lt;p&gt;You'll need Node.js installed, which comes with NPM built-in. Grab it from &lt;a href="https://nodejs.org/en/download/" rel="noopener noreferrer"&gt;nodejs.org&lt;/a&gt; if you don't have it yet.&lt;/p&gt;

&lt;h3&gt;
  
  
  Initialize Your Project
&lt;/h3&gt;

&lt;p&gt;Create a new folder for your package and set up version control:&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="nb"&gt;mkdir &lt;/span&gt;my-npm-package
&lt;span class="nb"&gt;cd &lt;/span&gt;my-npm-package
git init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now initialize NPM:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This creates your &lt;code&gt;package.json&lt;/code&gt; file. You'll get prompted for details like package name, version, description, and entry point. Here's what each field means:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Package name&lt;/strong&gt;: Must be unique and lowercase. Hyphens are fine, underscores aren't recommended.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Version&lt;/strong&gt;: Starts at 1.0.0. Follow &lt;a href="https://semver.org/" rel="noopener noreferrer"&gt;semantic versioning&lt;/a&gt; when you update later.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;: Tell people what your package does. Be clear and concise.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Entry point&lt;/strong&gt;: Usually &lt;code&gt;index.js&lt;/code&gt;. This is the file that loads when someone requires your package.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Keywords&lt;/strong&gt;: Help people find your package when searching NPM.&lt;/p&gt;

&lt;p&gt;The rest is pretty self-explanatory. Don't worry about getting everything perfect - you can always edit &lt;code&gt;package.json&lt;/code&gt; later.&lt;/p&gt;

&lt;h3&gt;
  
  
  Writing Your Package Code
&lt;/h3&gt;

&lt;p&gt;Create your main file (probably &lt;code&gt;index.js&lt;/code&gt;) and add your functionality:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// index.js&lt;/span&gt;
&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;helloNpm&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Hello NPM!&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;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;helloNpm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it! The &lt;code&gt;module.exports&lt;/code&gt; line is crucial because it makes your function available when someone installs and requires your package.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing Before Publishing
&lt;/h2&gt;

&lt;p&gt;Always test your package before publishing. There's nothing worse than releasing broken code to the world. Here's a simple way to test locally.&lt;/p&gt;

&lt;p&gt;In your package directory, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;link&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes your package available globally on your machine. Now create a test folder somewhere else:&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="nb"&gt;mkdir &lt;/span&gt;test-my-package
&lt;span class="nb"&gt;cd &lt;/span&gt;test-my-package
npm &lt;span class="nb"&gt;link &lt;/span&gt;first-hello-npm  &lt;span class="c"&gt;# replace with your package name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create a &lt;code&gt;test.js&lt;/code&gt; file and try out your package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// test.js&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;helloNpm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;first-hello-npm&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;helloNpm&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// Should print "Hello NPM!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it with &lt;code&gt;node test.js&lt;/code&gt;. If everything works, you're ready to publish.&lt;/p&gt;

&lt;h2&gt;
  
  
  Publishing to NPM
&lt;/h2&gt;

&lt;p&gt;First, you need an NPM account. Sign up at &lt;a href="https://www.npmjs.com/signup" rel="noopener noreferrer"&gt;npmjs.com/signup&lt;/a&gt; if you haven't already.&lt;/p&gt;

&lt;p&gt;Back in your package directory, log in through the terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enter your credentials. You should see a confirmation message.&lt;/p&gt;

&lt;p&gt;Now for the moment of truth:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm publish
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If successful, you'll see output confirming your package is live. Congratulations! You can search for it on npmjs.com to see it in action.&lt;/p&gt;

&lt;h2&gt;
  
  
  Working with Scoped Packages
&lt;/h2&gt;

&lt;p&gt;Sometimes you want to publish under your username, either because your preferred name is taken or you want to organize your packages. Scoped packages use the format &lt;code&gt;@username/package-name&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Initialize a scoped package like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm init &lt;span class="nt"&gt;--scope&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;@yourusername
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When prompted for the package name, use the full scoped format: &lt;code&gt;@yourusername/package-name&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Publishing scoped packages requires an extra flag:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm publish &lt;span class="nt"&gt;--access&lt;/span&gt; public
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without &lt;code&gt;--access public&lt;/code&gt;, NPM assumes you want a private package, which requires a paid account for scoped packages.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Happens After Publishing
&lt;/h2&gt;

&lt;p&gt;Once your package is live, anyone can install it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install &lt;/span&gt;your-package-name
&lt;span class="c"&gt;# or for scoped packages&lt;/span&gt;
npm &lt;span class="nb"&gt;install&lt;/span&gt; @yourusername/package-name
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;They can then use it in their code just like any other NPM package. Pretty cool, right?&lt;/p&gt;

&lt;p&gt;Your package page on NPM will show download statistics, and if you've linked a GitHub repository, it'll display your README file automatically.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Few Final Tips
&lt;/h2&gt;

&lt;p&gt;Keep your package focused on solving one problem well. The most successful NPM packages do one thing excellently rather than many things poorly.&lt;/p&gt;

&lt;p&gt;Write a good README file. This becomes your package's homepage on NPM, so explain what it does, how to install it, and provide usage examples.&lt;/p&gt;

&lt;p&gt;Version your updates properly. Use semantic versioning: patch versions for bug fixes (1.0.1), minor versions for new features (1.1.0), and major versions for breaking changes (2.0.0).&lt;/p&gt;

&lt;p&gt;Consider setting up automated testing and continuous integration. As your package grows, you'll want confidence that updates don't break existing functionality.&lt;/p&gt;

&lt;p&gt;Publishing your first NPM package is exciting. It's your contribution to the massive ecosystem that powers modern JavaScript development. Whether it's a simple utility function or something more complex, you're helping other developers build better software faster.&lt;/p&gt;

&lt;p&gt;Now go build something useful and share it with the world. The JavaScript community is waiting for what you'll create next.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>npm</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
