How I Built UnblockMCP in One Night
Dive into how I created UnblockMCP, a proxy-routing tool for AI agents, in just one night. A tale of late-night coding, problem-solving, and endless coffee.
Hey fellow night owls,
This is Jacobo, and I want to share a whirlwind coding adventure where I built UnblockMCP in just one night. It's raw, uncut, and I promise, no corporate jargon. So buckle up!
The Problem
We've all been there: working on AI agents that slam into Cloudflare walls like moths to a neon light. Frustrating, right? We've got these amazing AI models, and they're all brave faces until they run smack into a proxy issue or hit a "403 Forbidden" response. I wanted a way to let these AI models spread their digital wings without running into Cloudflare's gate because, let's face it, telling an AI to "just try another URL" doesn't work every time.
The Core Insight
The 'aha' moment hit while I was sipping on my nth cup of coffee. Why not create a simple way for AI agents to fetch content without bumping into these proxies? Enter UnblockMCP — a proxy-routing tool that acts as a middleman, guiding AI agents smoothly around these internet barriers. The mission was clear: create a one-call solution, fetch_unblocked(url), effortless yet effective.
Key Technical Decisions
**Stack Choice:** I went with a Node.js and TypeScript combo. TypeScript saves me from my klutzy type errors, and Node.js is great for non-blocking operations.
**Proxy Design:** I leveraged Express.js for the server because of its lightweight nature. For routing, http-proxy-middleware came in clutch — the right balance between performance and simplicity.
**Handling Cloudflare:** To manage infamous Cloudflare blocks, I implemented Puppeteer for headless browsing, which mimics genuine user interactions. Here's the heart of UnblockMCP:
import puppeteer from 'puppeteer';
async function fetchUnblocked(url: string): Promise<string> {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(url, { waitUntil: 'networkidle2' });
const content = await page.content();
await browser.close();
return content;
}**Developer Portal:** For the developer interface, I whipped up a portal using Next.js 15. The playground, pricing pages, and MCP configuration instructions are all housed there. User experience is key, even at 3 AM.
What Surprised Me
Two things caught me off guard. First, how quickly memory leaks appear with headless browsers operating in tandem. A quick fix: recycling instances and capping concurrent browsers. Second, realizing how many AI devs were suffering silently from similar issues. The community's response was overwhelmingly supportive — validating the hours spent punching keys.
What I'd Do Next
The scope for UnblockMCP is broad. Here's what's on the radar:
Try it
The energy from coding overnight wasn't just caffeine-induced — it's the vibrant hum of building something useful. Check out UnblockMCP and let your agents fetch anything, anywhere.
Keep building,
Jacobo
Ready to stop fighting Cloudflare in your agents?
Try UnblockMCP — it's free