<?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: Davide Conte</title>
    <description>The latest articles on DEV Community by Davide Conte (@davide_conte_12a899361ed1).</description>
    <link>https://dev.to/davide_conte_12a899361ed1</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%2F3830208%2F2f70c1b1-99e8-4ce7-833b-31071eff7d23.jpg</url>
      <title>DEV Community: Davide Conte</title>
      <link>https://dev.to/davide_conte_12a899361ed1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/davide_conte_12a899361ed1"/>
    <language>en</language>
    <item>
      <title>I built an MCP server for Shopify and Stripe write operations — the gap nobody filled</title>
      <dc:creator>Davide Conte</dc:creator>
      <pubDate>Wed, 18 Mar 2026 01:44:36 +0000</pubDate>
      <link>https://dev.to/davide_conte_12a899361ed1/i-built-an-mcp-server-for-shopify-and-stripe-write-operations-the-gap-nobody-filled-n6</link>
      <guid>https://dev.to/davide_conte_12a899361ed1/i-built-an-mcp-server-for-shopify-and-stripe-write-operations-the-gap-nobody-filled-n6</guid>
      <description>&lt;p&gt;Every existing Shopify MCP server has the same problem: read-only.&lt;/p&gt;

&lt;p&gt;You can &lt;em&gt;ask&lt;/em&gt; your AI agent to show you orders, products, revenue. But you can't tell it to update a price, bulk-edit inventory, cancel an order, or issue a refund. The moment you need to &lt;em&gt;do&lt;/em&gt; something, you're back in the dashboard.&lt;/p&gt;

&lt;p&gt;I got tired of it. So I built &lt;code&gt;mcp-ecom-hub&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx mcp-ecom-hub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A fully typed MCP server that covers what the others don't:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shopify — write ops:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;shopify_update_product&lt;/code&gt; — update title, price, inventory&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;shopify_bulk_update_prices&lt;/code&gt; — update multiple variants at once&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;shopify_fulfill_order&lt;/code&gt; — mark orders as fulfilled&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;shopify_cancel_order&lt;/code&gt; — cancel + refund in one call&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;shopify_create_discount&lt;/code&gt; — generate discount codes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Shopify — read ops:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;shopify_get_orders&lt;/code&gt; — with filters (status, date, customer)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;shopify_get_products&lt;/code&gt; — full product + variant details&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;shopify_get_analytics&lt;/code&gt; — revenue, AOV, conversion rate&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;shopify_get_customers&lt;/code&gt; — customer list + LTV&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;stripe_get_revenue&lt;/code&gt; — MRR, ARR, breakdown by period&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;stripe_list_subscriptions&lt;/code&gt; — active subscriptions&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;stripe_cancel_subscription&lt;/code&gt; — with proration handling&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;stripe_create_coupon&lt;/code&gt; — discount codes&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;stripe_get_payouts&lt;/code&gt; — payout history&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;stripe_refund_payment&lt;/code&gt; — issue refunds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Multi-store:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;hub_list_stores&lt;/code&gt; — all configured stores&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hub_get_overview&lt;/code&gt; — cross-store revenue summary&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The gap it fills
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;mcp-ecom-hub&lt;/th&gt;
&lt;th&gt;Shopify MCP (official)&lt;/th&gt;
&lt;th&gt;pipeboard&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Shopify write ops&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bulk price update&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Stripe integrated&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Subscription mgmt&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-store&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Self-hosted&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open source&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Setup
&lt;/h2&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;"ecom-hub"&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;"mcp-ecom-hub"&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;"MCP_ECOM_CONFIG"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/path/to/stores.json"&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;Config file (&lt;code&gt;stores.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;"stores"&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;"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;"mystore"&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;"My Store"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"shopify"&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;"domain"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mystore.myshopify.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"accessToken"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"shpat_xxx"&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;"stripe"&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;"secretKey"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sk_live_xxx"&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;"defaultStore"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"mystore"&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;
  
  
  Safety first
&lt;/h2&gt;

&lt;p&gt;Destructive operations (cancel, refund) require explicit confirmation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User: Cancel order #1234 and refund the customer
Agent: I'll cancel order #1234 ($89.00) and issue a full refund. Confirm? [yes/no]
User: yes
Agent: ✅ Order cancelled. Refund of $89.00 issued — arrives in 5-10 days.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No accidental cancellations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Multi-store
&lt;/h2&gt;

&lt;p&gt;Running an agency with multiple clients? One config, all stores:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User: Show me revenue across all stores this week
Agent: 
  - Store A: €2,340 (12 orders, AOV €195)
  - Store B: €890 (8 orders, AOV €111)
  - Total: €3,230
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/davideconte/mcp-ecom-hub" rel="noopener noreferrer"&gt;davideconte/mcp-ecom-hub&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/mcp-ecom-hub" rel="noopener noreferrer"&gt;mcp-ecom-hub&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open source, MIT. Built for agencies managing multiple e-commerce clients.&lt;/p&gt;

&lt;p&gt;PRs welcome — especially for WooCommerce support (next on the list).&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>shopify</category>
      <category>stripe</category>
      <category>opensource</category>
    </item>
    <item>
      <title>I built a TypeScript boilerplate for OpenClaw skills — scaffold and publish to ClaWHub in one command</title>
      <dc:creator>Davide Conte</dc:creator>
      <pubDate>Wed, 18 Mar 2026 00:45:31 +0000</pubDate>
      <link>https://dev.to/davide_conte_12a899361ed1/i-built-a-typescript-boilerplate-for-openclaw-skills-scaffold-and-publish-to-clawhub-in-one-14hi</link>
      <guid>https://dev.to/davide_conte_12a899361ed1/i-built-a-typescript-boilerplate-for-openclaw-skills-scaffold-and-publish-to-clawhub-in-one-14hi</guid>
      <description>&lt;p&gt;If you've been building OpenClaw skills, you've probably noticed something: there's no official TypeScript template. Every developer is copy-pasting the same SKILL.md structure, setting up tsconfig, wiring tools — from scratch, every time.&lt;/p&gt;

&lt;p&gt;I got tired of it. So I built a scaffold CLI.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx openclaw-skill-boilerplate my-skill
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One command. You get a complete, publish-ready OpenClaw skill project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Valid &lt;code&gt;SKILL.md&lt;/code&gt; with correct OpenClaw frontmatter&lt;/li&gt;
&lt;li&gt;✅ TypeScript strict mode&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;src/tools.ts&lt;/code&gt; + &lt;code&gt;types.ts&lt;/code&gt; pattern&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;{{SKILL_NAME}}&lt;/code&gt; placeholder replacement in all templates&lt;/li&gt;
&lt;li&gt;✅ GitHub Actions CI (build + typecheck)&lt;/li&gt;
&lt;li&gt;✅ ClaWHub publish-ready structure&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The problem it solves
&lt;/h2&gt;

&lt;p&gt;OpenClaw's skill spec requires a specific &lt;code&gt;SKILL.md&lt;/code&gt; frontmatter format:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-skill&lt;/span&gt;
&lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;What&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;your&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;skill&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;does"&lt;/span&gt;
&lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.1.0&lt;/span&gt;
&lt;span class="na"&gt;author&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;your-name&lt;/span&gt;
&lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;category&lt;/span&gt;
&lt;span class="na"&gt;triggers&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;natural language trigger phrase&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Get it wrong and the skill won't load. Add to that the TypeScript setup, the tools pattern, the package.json bin config — it's 30+ minutes of setup before you write a single line of actual skill logic.&lt;/p&gt;

&lt;p&gt;With this boilerplate: &lt;strong&gt;30 seconds&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;my-skill/
├── SKILL.md           # OpenClaw entrypoint
├── package.json
├── tsconfig.json
└── src/
    ├── index.ts       # Main skill logic
    ├── tools.ts       # Tool definitions
    └── types.ts       # Shared types
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Once your skill is ready:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm run build
npx clawhub@latest publish
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;GitHub: &lt;a href="https://github.com/davideconte/openclaw-skill-boilerplate" rel="noopener noreferrer"&gt;davideconte/openclaw-skill-boilerplate&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;npm: &lt;a href="https://www.npmjs.com/package/openclaw-skill-boilerplate" rel="noopener noreferrer"&gt;openclaw-skill-boilerplate&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open source, MIT. PRs welcome — especially if you've hit edge cases with the SKILL.md spec I haven't covered yet.&lt;/p&gt;

</description>
      <category>typescript</category>
      <category>opensource</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
