extract_structured_content
Extracts structured content from a web page using CSS selectors
Render web pages through your own Cloudflare Worker — fetch a page as clean context, pull fields out with CSS selectors, summarise, or take a screenshot.
LABSCO SUMMARY
Because the Worker is deployed to your own Cloudflare account, page loads are billed and rate-limited by you rather than by a third-party scraping service, and a page that needs JavaScript to render actually renders. The cost is the setup: nothing works until the Worker is deployed with both bindings in place, and the two most common failures — no browser binding, no SCREENSHOTS KV namespace — are both fixed in the Cloudflare dashboard, not here. CSS-selector extraction is the tool worth reaching for first; it returns a fraction of the tokens a full page fetch does.
An MCP server that talks to a Cloudflare Worker you deploy, using Cloudflare's Browser Rendering API. Pages are loaded in a real browser on Cloudflare's edge and come back processed for use as model context, which means JavaScript-rendered sites work and the traffic originates from your own Cloudflare account rather than from your machine.
fetch_pageextract_structured_contentsummarize_contenttake_screenshotsearch_documentationA Cloudflare account with Browser Rendering API access, and the included puppeteer-worker.js deployed to Cloudflare Workers with npx wrangler deploy. That Worker needs two bindings: a Browser Rendering binding named browser, and a KV namespace binding named SCREENSHOTS — screenshots fail without the second. Put the deployed Worker's URL in BROWSER_RENDERING_API. Node.js v18 or higher; the npm package name is cloudflare-browser-rendering (1.0.0), built from a clone with npm install and npm run build, or installed through Smithery.
Build from source — git clone https://github.com/amotivv/cloudflare-browser-rendering-mcp.git
USE CASES
Load it through the Worker's real browser so client-side rendering completes, and get usable text back rather than an empty shell.
Name the CSS selector for the element and get just that value, instead of fetching the whole page and hoping the model finds it.
Summarise it to a set length before it enters the conversation, so a reference costs a paragraph rather than a page.
Capture the full page at a viewport width you choose, for a visual check that text extraction cannot give you.
Search Cloudflare's documentation from the same session and read the relevant page through the same renderer.
Counted once with only startup setup. Other versions, modes or optional credentials may expose a different list.
extract_structured_contentExtracts structured content from a web page using CSS selectors
fetch_pageFetches and processes a web page for LLM context
search_documentationSearches Cloudflare documentation and returns relevant content
summarize_contentSummarizes web content for more concise LLM context
take_screenshotTakes a screenshot of a web page and returns it as an image
BEFORE YOU INSTALL
5 tools when we connected.
CONTEXT COST
Rated by the size of the 5 tool definitions that ride along on every turn, not by how many there are
INSTALLATION
You clone and build this one yourself.
git clone https://github.com/amotivv/cloudflare-browser-rendering-mcp.git
cd cloudflare-browser-rendering-mcp
npm install
npm run buildBefore deploying, open wrangler.toml: it already declares the browser binding and the SCREENSHOTS KV binding, but the KV namespace id it ships is the author's. Set that id (under kv_namespaces) to the id of a KV namespace in your own Cloudflare account
npx wrangler deployIn the Cloudflare dashboard, give the deployed Worker a Browser Rendering binding named browser and a KV namespace binding named SCREENSHOTS
In the client block, <YOUR_WORKER_URL> is the deployed Worker's URL and <YOUR_PATH_TO_CLOUDFLARE_BROWSER_RENDERING_MCP> the full path of your clone (npm run build creates dist/index.js there)
{
"mcpServers": {
"cloudflare-browser-rendering": {
"command": "node",
"args": [
"<YOUR_PATH_TO_CLOUDFLARE_BROWSER_RENDERING_MCP>/dist/index.js"
],
"env": {
"BROWSER_RENDERING_API": "https://<YOUR_WORKER_URL>.workers.dev"
}
}
}
}