webdevtypescriptmcpproductivity

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.

J
Jacobo
·
6 min read
·March 2026

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:

  • Caching layer minimize repeated URL fetches efficiently
  • Browser fingerprint randomization tackle tougher Cloudflare checks
  • Usage analytics inform users about proxy patterns and adaptive strategies
  • Streaming responses return content as it loads, not just on completion
  • 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