<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Yurii</title>
    <description>The latest articles on DEV Community by Yurii (@yurii_712f8a68cce15201545).</description>
    <link>https://dev.to/yurii_712f8a68cce15201545</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3987914%2F6a67bb36-9ce2-4640-9742-e126c67d0a2b.png</url>
      <title>DEV Community: Yurii</title>
      <link>https://dev.to/yurii_712f8a68cce15201545</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/yurii_712f8a68cce15201545"/>
    <language>en</language>
    <item>
      <title>I gave Claude Desktop an MCP server — it automated my Shopify store by itself</title>
      <dc:creator>Yurii</dc:creator>
      <pubDate>Tue, 16 Jun 2026 20:34:18 +0000</pubDate>
      <link>https://dev.to/yurii_712f8a68cce15201545/i-gave-claude-desktop-an-mcp-server-it-automated-my-shopify-store-by-itself-2f0b</link>
      <guid>https://dev.to/yurii_712f8a68cce15201545/i-gave-claude-desktop-an-mcp-server-it-automated-my-shopify-store-by-itself-2f0b</guid>
      <description>&lt;p&gt;I've been building &lt;strong&gt;FlowNet&lt;/strong&gt; — a workflow automation SaaS for Shopify merchants, like n8n but embedded inside the Shopify admin.&lt;/p&gt;

&lt;p&gt;Last week I finished the MCP server. So I ran an experiment: open Claude Desktop, give it one natural language prompt, and see if it can build a real workflow without me touching the UI.&lt;/p&gt;

&lt;p&gt;Here's what happened.&lt;/p&gt;




&lt;h2&gt;
  
  
  The prompt
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;I have a Shopify store. I need the following automation in FlowNet:

When a product runs out of stock (all variants = 0) → hide it from the store (set to DRAFT) and tag it as "auto-hidden".

When it comes back in stock → publish it again (set to ACTIVE) and remove the "auto-hidden" tag.

Only if the product has a price &amp;gt; 0.

Please build this workflow in FlowNet.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. No JSON. No drag-and-drop. Just text.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Claude did
&lt;/h2&gt;

&lt;p&gt;Claude called 6 MCP tools in sequence:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;[Shopify: inventory_levels/update]&lt;br&gt;
         │&lt;br&gt;
         ▼&lt;br&gt;
[1] Fetch Product &amp;amp; Variants (GraphQL)&lt;br&gt;
    → Gets product ID, status, tags, all variant prices &amp;amp; quantities&lt;br&gt;
         │&lt;br&gt;
         ▼&lt;br&gt;
[2] Evaluate Stock &amp;amp; Price Logic (Lua)&lt;br&gt;
    → Returns: action ("hide" | "publish" | "skip"), product_id,&lt;br&gt;
      current_tags, total_inventory, etc.&lt;br&gt;
         │&lt;br&gt;
         ▼&lt;br&gt;
[3] Should We Act? (Condition)&lt;br&gt;
    action != "skip"&lt;br&gt;
    ├── FALSE → workflow ends (no-op)&lt;br&gt;
    └── TRUE&lt;br&gt;
            │&lt;br&gt;
            ▼&lt;br&gt;
       [4] Hide or Publish? (Condition)&lt;br&gt;
           action == "hide"&lt;br&gt;
           ├── TRUE → [5] Set DRAFT + Tag "auto-hidden"  (GraphQL mutation)&lt;br&gt;
           └── FALSE → [6] Set ACTIVE + Remove "auto-hidden" tag  (GraphQL mutation)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Two minutes. The workflow was live and ready to execute.&lt;/p&gt;


&lt;h2&gt;
  
  
  How the MCP server works
&lt;/h2&gt;

&lt;p&gt;FlowNet is built on &lt;strong&gt;Elixir/Phoenix&lt;/strong&gt;. The MCP server runs on top of &lt;a href="https://github.com/sevenshores/anubis_mcp" rel="noopener noreferrer"&gt;&lt;code&gt;anubis-mcp&lt;/code&gt;&lt;/a&gt; with Streamable HTTP transport.&lt;/p&gt;

&lt;p&gt;18 tools across 5 domains:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Domain&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Workflows&lt;/td&gt;
&lt;td&gt;create, list, get, delete, activate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Steps&lt;/td&gt;
&lt;td&gt;add, configure, remove, get&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Triggers&lt;/td&gt;
&lt;td&gt;add, configure, get&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Edges&lt;/td&gt;
&lt;td&gt;add, remove&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Executions&lt;/td&gt;
&lt;td&gt;list, get&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Auth is via &lt;code&gt;x-api-key&lt;/code&gt; header — a long-lived MCP key stored per-tenant.&lt;/p&gt;

&lt;p&gt;Claude Desktop connects through &lt;code&gt;mcp-proxy&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;"flownet"&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;"uvx"&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;"mcp-proxy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--transport"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"streamablehttp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"--headers"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"x-api-key YOUR_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;"https://your-ngrok-url/mcp"&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;
  
  
  Why MCP changes the product
&lt;/h2&gt;

&lt;p&gt;I originally built FlowNet as a visual builder — drag steps, configure parameters, connect edges. It works, but the onboarding friction is real. Users need to understand the data model before they can build anything useful.&lt;/p&gt;

&lt;p&gt;With MCP, the AI handles all of that. The user just describes the outcome.&lt;/p&gt;

&lt;p&gt;This shifted my thinking: &lt;strong&gt;the visual UI is secondary&lt;/strong&gt;. MCP + Claude is the primary interface. The builder is for inspection and fine-tuning.&lt;/p&gt;




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

&lt;p&gt;FlowNet is pre-launch. I'm publishing weekly videos of the build process, including live MCP demos like this one.&lt;/p&gt;

&lt;p&gt;🎥 Full demo video: &lt;a href="https://youtu.be/rJzt3Peh6jM" rel="noopener noreferrer"&gt;https://youtu.be/rJzt3Peh6jM&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Stack: Elixir/Phoenix · Broadway/Kafka · Oban · React Flow · TypeScript · Tailwind&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Tags: elixir, shopify, mcp, buildinpublic&lt;/em&gt;&lt;/p&gt;

</description>
      <category>automation</category>
      <category>claude</category>
      <category>mcp</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
