remote-mcp-scraper-vercel
Provides movie metadata lookup from Wikipedia as one of its legitimate public sources, returning structured information about movies without requiring an API key.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@remote-mcp-scraper-vercelfetch the content of https://example.com"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
remote-mcp-scraper-vercel
A production-ready Remote Model Context Protocol (MCP) server for Vercel Serverless on Node.js, built with Next.js App Router and TypeScript.
It exposes scraping-oriented MCP tools over the legacy HTTP + SSE transport:
Endpoint | Purpose |
| Open an MCP session ( |
| Send JSON-RPC frames; responses stream back over SSE |
| Liveness/status probe |
Tools
Tool | Description |
| Liveness probe — server name, version, uptime. |
| Fetch an http(s) URL with browser-like headers: rotating real User-Agent profiles, |
| Render a page in headless Chromium and return a PNG/JPEG image plus navigation metadata (final URL, status, bytes, duration). |
| Movie lookup from legitimate public sources only: TMDB ( |
All tool inputs are validated with strict zod schemas; outputs include structuredContent.
Related MCP server: Shark-no-Kari
Stack
Next.js 16 (App Router, Node.js runtime) — route handlers on Vercel Functions
@modelcontextprotocol/sdk —
McpServer+SSEServerTransport,armSseKeepAliveheartbeatspuppeteer-core + @sparticuz/chromium — brotli-packed chrome-headless-shell sized for the ~50 MB serverless bundle budget
undici —
requestAPI (full header control incl.Sec-*, unlikefetch) +ProxyAgentsocks — SOCKS4/5 CONNECT support via a custom undici connector (TLS-in-tunnel for HTTPS origins)
zod — input/output validation
vitest + eslint + tsc — validation (
npm run validate)
Project layout
app/
page.tsx minimal status page
layout.tsx
api/
sse/route.ts GET — opens MCP session over SSE
message/route.ts POST — JSON-RPC ingress for a session
health/route.ts liveness
lib/
mcp.ts McpServer factory + tool registration
sessions.ts in-memory session registry + TTL sweep
node-shims.ts ServerResponse/IncomingMessage adapters over Web Streams
fetcher.ts stealth fetch client (UA rotation, proxies, retries, caps)
user-agents.ts rotating browser-identity profiles
browser.ts dynamic launcher: CDP → local binary → bundled chromium
movie.ts TMDB / OMDb / Wikipedia metadata providers
schemas.ts zod input schemas
auth.ts optional MCP_AUTH_TOKEN bearer gate
rate-limit.ts per-IP fixed-window limiter
tests/ vitest unit tests
vercel.json function memory (1024 MB) + maxDuration + headersLocal development
npm install
cp .env.example .env # fill in what you need (all optional for a first run)
npm run dev # http://localhost:3000Validate everything:
npm run validate # eslint + tsc --noEmit + vitest + next buildSmoke-testing the MCP transport
# terminal 1 — open the SSE stream, note the sessionId in the `endpoint` event
curl -N http://localhost:3000/api/sse
# terminal 2 — drive the session
SID=<sessionId from the endpoint event>
curl -X POST "http://localhost:3000/api/message?sessionId=$SID" \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"curl","version":"0.0"}}}'
curl -X POST "http://localhost:3000/api/message?sessionId=$SID" \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","method":"notifications/initialized"}'
curl -X POST "http://localhost:3000/api/message?sessionId=$SID" \
-H 'content-type: application/json' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"ping","arguments":{"message":"hi"}}}'Responses arrive as event: message frames on the SSE stream.
MCP client configuration
Any client that supports the SSE transport can connect to https://<your-deployment>/api/sse. For mcp-remote-style bridges or Claude Desktop:
{
"mcpServers": {
"scraper": {
"url": "https://<your-deployment>.vercel.app/api/sse",
"headers": { "Authorization": "Bearer <MCP_AUTH_TOKEN>" }
}
}
}Deployment (Vercel)
npm i -g vercel
vercel # preview
vercel --prod # productionvercel.json already configures 1024 MB function memory and a 60 s maxDuration for both API routes — required for the bundled Chromium binary. Set environment variables in the Vercel dashboard (or vercel env add).
Environment variables
Variable | Purpose |
| Optional bearer token required on |
| Remote Chrome DevTools endpoint ( |
| Local Chrome/Chromium binary for development (ignored on Vercel). |
| Default upstream proxy for |
| Standard fallback proxy env vars for |
| TMDB v3 key — primary |
| OMDb key — secondary |
| Per-IP tool-call limit per window (0 disables; default 60). |
| Rate-limit window (default 60000). |
| Response body cap in bytes (default 5 MiB). |
| Per-request timeout (default 20000). |
| Idle-session eviction (default 600000). |
Proxy configuration
fetch_url and take_screenshot accept a proxy argument and honour the env vars above. Supported schemes:
http:///https://— via undiciProxyAgent(CONNECT tunnelling, optional auth in the URL).socks5://,socks5h://,socks4://,socks4a://— viasocks+ a custom undici connector; HTTPS origins get TLS inside the tunnel. Credentials may be embedded (socks5://user:pass@host:1080).For
take_screenshot, the proxy is passed to Chromium as--proxy-serverand embedded credentials are applied withpage.authenticate().
Proxy credentials are redacted from all error messages.
Security & privacy
Auth: optional
MCP_AUTH_TOKENbearer (header or?token=); no auth is otherwise enforced — treat an unauthenticated deployment as public tooling.Rate limiting: fixed-window per-IP limiter on tool calls (instance-local, best-effort).
Allowlisting: none — the tools fetch arbitrary http(s) URLs. If you expose this publicly, set
MCP_AUTH_TOKENand consider fronting it with your own allowlist; see limitations for SSRF context.No credential leakage: proxy userinfo is stripped from URLs used in errors, logs, and browser flags.
Data handling: no persistence — request bodies/screenshots live only for the duration of a call; sessions live in instance memory.
Responsible use
fetch_url makes requests look like ordinary browser traffic to avoid incidental breakage — it is not a bypass for authentication, authorization, paywalls, CAPTCHAs, or site rate-limit policy, and must not be used as one. Honour robots.txt, the target site's terms of service, and applicable law. The MCP_AUTH_TOKEN gate and rate limiter are abuse dampers, not access control for the sites you scrape.
Known limitations
Session affinity: the in-memory session map lives inside one function instance.
POST /api/messagemust reach the same warm instance asGET /api/sse; a cold start or scale-out returns404 unknown_session. For multi-instance deployments, switch to the MCP Streamable HTTP transport (StreamableHTTPServerTransport) with an external session store (e.g. Redis), or keep traffic single-instance.Function lifetime: SSE connections die at
maxDuration(60 s default); MCP clients should reconnect and re-initialize.Cold starts: the first
take_screenshoton a cold instance extracts ~50 MB of brotli-packed Chromium — expect a few seconds; warm calls are sub-second.Binary ceiling:
@sparticuz/chromiumships chrome-headless-shell — no GPU rendering, no PDF printing;setGraphicsModeis disabled.Rate limiter is per-instance and memory-resident (not distributed).
Node ≥ 20.9 required (Vercel
nodejs20.x+ runtime).
This server cannot be deployed
Maintenance
Related MCP Connectors
Screenshot, PDF, OG-image, and page extraction (markdown/JSON) over MCP. Bearer key or x402.
MCP server for web extraction and rendering via AceDataCloud WebExtrator
Scrape, crawl and search the web for AI agents via MCP.
Remote MCP server exposing SMI Aware tools, resources, and skills over Streamable HTTP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables browser automation and web scraping by exposing Playwright tools through an HTTP-based MCP server. Users can navigate pages, interact with web elements, capture screenshots, and extract structured content using a persistent Chromium instance.MIT
- AlicenseNot gradedqualityAmaintenanceRemote MCP server for web scraping with anti-bot evasion. Provides stealth HTTP fetching, headless browser with Cloudflare bypass, CSS selectors, YouTube transcripts, and Markdown conversion.1MIT
- AlicenseNot gradedqualityBmaintenanceRemote HTTP/SSE MCP server for web search with full page content extraction, search summaries, and API authentication.MIT
- FlicenseNot gradedqualityDmaintenanceMCP server to scrape web pages to clean Markdown via headless Chromium, with support for single or batch URLs.-