2
1 Comment

I shipped an MCP server for DTC competitor intelligence in 14 hours and learned three expensive lessons

The pitch is short: ShopSignal lets you ask Claude "what's on sale at Glossier this week" and get an actual answer with prices, discount %, and buy links. Not a web search summary — a real tool call returning structured JSON. It works across 84 verified Shopify-powered DTC brands (Glossier, Rhode, Cuyana, Kith, Allbirds, etc.), all snapshotted daily.

If you've ever tried to feed competitor pricing data into an agent workflow, you know the gap. Prisync, Particl, Price2Spy — all dashboards. Nobody exposes an API that an AI agent can call directly. So I built one.

The interesting part isn't really the product. It's what went wrong building it.

Lesson 1: the seed list is the product.

I started with a list of 200 DTC stores. Spent a full day just validating that list before writing tool logic. The casualties:

  • 30+ migrated off Shopify entirely (Reformation went to SFCC, Drunk Elephant went to Demandware, etc.)
  • 10+ run aggressive Cloudflare bot protection (Aritzia, Lululemon — even residential proxies bounce)
  • Several Shopify Plus brands deliberately restrict their public /products.json endpoint as a competitive moat (Skims is the famous one)
  • Around 20 were just typos in my list — I'd written merit.com instead of meritbeauty.com, etc.

Final reliable count: 84 stores. The store list is genuinely as much "the product" as the code.

Lesson 2: cross-actor storage on Apify is silently broken by default.

The architecture: one Apify actor runs the MCP server (live, standby mode). A second actor runs a daily cron that snapshots all 84 stores and writes to a Key-Value store. The MCP server reads from the same KV store. Standard.

Except every Apify actor defaults to LIMITED_PERMISSIONS, which silently blocks cross-actor storage access. The cron actor would run, write zero data, exit successfully, no error in the logs. The MCP server would query and find nothing. Looks like everything is working. Nothing is working.

The fix: set actorPermissionLevel: FULL_PERMISSIONS on the cron actor (requires a one-click approval in the console), pass the target store ID as an env var, open with forceCloud: true. None of this is in the docs in any obvious place. Cost me a couple of hours.

Lesson 3: don't go down memory rabbit holes when you have $500 in compute credit.

The cron started OOMing at 178 seconds on a 1024MB container. I spent two hours diagnosing it: Node.js RSS vs heap, axios buffer pool slab retention, forced GC calls, shared HTTP agents to control connection pooling. Technically fascinating. The diagnosis was even correct — Node retains buffer slabs in its allocator cache and never returns them to the OS, so RSS climbs even when heap stays bounded.

I had a working solution at hour 1 and kept optimizing. The fix that actually shipped: bump the memory limit to 2048MB. Run now completes in 86 seconds at 608MB peak. Cost: about $0.04 per run, $1.20/month, out of $500 in Apify Creator credit.

Premature optimization will get you every time, especially when "how do I diagnose this leak" feels more interesting than "is this leak actually a problem yet."

The numbers

84 stores in the seed list. 36,080 products captured on the first cron run. 4 tools at $0.05 / $0.05 / $0.20 / $0.50 per call. Pay per successful call, no subscription.

Link: https://apify.com/kodek/shopsignal-mcp

If you're building MCP servers on Apify, happy to answer questions about the standby-mode + cross-actor + per-request transport pattern. The deployment model is weird enough that the docs leave a lot of edge cases uncovered.

on May 5, 2026
  1. 1

    The useful part here is not the scraper.

    It’s that you turned competitor monitoring from “dashboard someone checks later” into something an agent can query inside a workflow.

    That’s the real product shift.

    Most pricing intel tools are still built like analyst software.
    You turned it into infrastructure.

    That’s why ShopSignal is directionally right, but still undersells what this becomes if it works.

    It already feels less like “competitor tracking”
    and more like live market intelligence for agent workflows.

    That’s where the current name starts feeling a little too narrow / retail.

    If this expands beyond Shopify price checks into broader agent-facing market intelligence, something like Exirra.com would carry the category better than ShopSignal.

Trending on Indie Hackers
30 days ago I posted here with $0 revenue. Here's what actually happened next. User Avatar 147 comments I used $30,983 of AI tokens last month in Claude code on $200/mo plan User Avatar 90 comments my reddit post got 600K+ views. here's exactly what i did User Avatar 58 comments How to spot high-intent customers in 5 minutes, for free. User Avatar 44 comments Fixing broken scrapers instead of working on my actual product. So I made it my problem. User Avatar 37 comments I Built a Habit Tracker SaaS Alone in 6 Weeks (No CS Degree, No Team). Here's Exactly How User Avatar 37 comments