An LLM is brilliant and blind. And the blindness is silent.
A normal scraper hands your agent a Cloudflare challenge page as if it were the article. The agent believes it, summarizes it, and acts on it. It doesn't throw an error. Nobody notices until a customer does.
Every read comes with a receipt.
render_quality scores how faithfully a page rendered before we read it. Challenge pages, empty SPA shells, partial lazy-loads and interstitials pull it down. It is the line between "my agent might be acting on garbage" and "my agent knows."
- Scored on every readNot a health check you wire up. Every perceive and convert response carries a render_quality field, 0.0 to 1.0.
- Flagged below 0.40A blocked or login-walled page still comes back in full, but with a low score and a warnings array naming what we detected. Your agent gets the content and the truth about it, so a challenge page is never mistaken for the real thing.
- Nobody else does thisNot the scraping APIs, not the conversion APIs, not the five vendors you would wire together. The score is the thing you cannot get anywhere else.
{
"render_quality": 0.12,
"status": "blocked",
"warnings": ["challenge_page"],
"markdown": "…" // full output, flagged
}We measured the silent failure.
The same set of hostile pages, read two ways. A naive fetch hands back a block page as if it were content, and never says so. Enconvert renders the real page where the naive fetch failed, and flags the few it can’t. The harness and the URL list are public, so you can run it yourself.
Real URLs tested: bot-gated, paywalled, JS-heavy
A naive fetch silently returned a block page as "content"
Of those, Enconvert rendered the real page instead (recovered)
Of pages it still couldn’t render, Enconvert flagged them, silently passing none
Watch it catch a page that lies.
An unedited screen recording: the founder runs the MCP inside a real agent, on a clean page and on a page that fights back. About 40 seconds.
- Your agent's scraper can't tell when it got blocked. Watch mine, live.
- One command: claude mcp add enconvert, paste a key. Done.
- Point it at a clean page: render_quality 0.96, clean Markdown comes back.
- Now a Cloudflare-walled page: render_quality 0.12, block flagged right in the response.
- Real product, a real page fighting back, a real honest score. Nothing staged.
The eyes are real today.
Everything that lets your agent read the outside world, files and the web, is live. Seven tools, one API key, one honest score on every read.
7 tools · all live- convertOpen 46 file types in one request.PDF · DOCX · HEIC · CSV · URLLive
- perceiveAny URL into clean Markdown, JSON, or a screenshot. Every read scored.URL → MD · PNG · JSONLive
- discoverMap every URL on a site without rendering a page.SITE → URL MAPLive
- lookupSearch the live web from inside the conversation.QUERY → RESULTSLive
- distillPass a schema, get structured data back from any page.SCHEMA → JSONLive
- ingestCrawl a whole site into RAG-ready chunks in one call.SITE → CHUNKSLive
- watchGet a webhook the moment a page you track changes.PAGE → DIFFLive
Hands are coming. We won't pretend they're here.
Real browser control is in active development for 2026, not yet callable. Founding users get hands first. We tell you exactly what is shipped and what is not, the same honesty we give every read.
You're about to depend on us. Here's why that's safe.
No logos to show yet. Instead, the things logos are a proxy for: an auditable, forkable integration layer, a real security posture, and a founder you can email.
Recent releases will appear here.
The MCP server and the Node SDK it wraps are MIT-licensed and public. Read them, fork them, self-host them. The conversion engine behind them is proprietary and stays ours, but your agent's I/O layer is auditable and can never be taken away.
Every URL is SSRF-screened before we fetch it: no private or link-local IPs, no metadata endpoints, no internal networks. Browser contexts are sandboxed with permissions disabled, and every operation is timeout-bounded.
The install reads your API key (from ENCONVERT_API_KEY or ~/.enconvert/config.json, chmod 600) and edits only the AI-client configs you pick. Each is backed up first, and your key is never copied into them. At runtime it calls the Enconvert API plus any file or URL you hand it. Redacted usage analytics (tool name, timing, a hashed key id — never your raw key; URLs, file paths, and emails are scrubbed) go to PostHog; set DO_NOT_TRACK=1 to turn them off.
A public status page tells you the truth about uptime the same way render_quality tells you the truth about a read. The changelog is on the way.
I got tired of gluing five vendors together every time an agent needed to read a file or a web page, then babysitting the scripts that held it up. The agent could reason. It just could not see. Worse, it could not tell when what it saw was a Cloudflare page instead of the real one. So I built one server that gives it honest eyes: it reads anything, and it scores every read. I answer email personally.
Replaces the stack you're duct-taping.
Giving an agent eyes today means stitching four or five vendors together and babysitting the seams. Now it is one dependency, with a score none of them give you.
- Firecrawlto scrape pages into markdown
- CloudConvertto convert the files
- Browserbaseto a headless-browser fleet
- an LLM-extract stepto pull out structured data
- cron + glue scriptsto keep it all alive
- One MCP server
- One API key
- One bill
One bill, no second AI-extraction subscription, and a render_quality score on every read.
Browser control (the Browserbase piece) is on the 2026 roadmap, not counted in "today".
Skip the glue code.
Same conversion engine as the REST API. None of the integration work.
Wrapping the REST API yourself
Your code owns all of this, forever:
- HTTP plumbing and multipart uploads
- Schema validation on every input
- Polling long-running jobs
- Retry and backoff logic
- Parsing presigned URLs out of responses
- Your own "did this page actually render?" check
Registering the MCP server
One entry in your client config:
npx @enconvert/mcp setupThe agent runtime owns polling, retries, auth, and output handling. Cursor, Windsurf, Zed, and JetBrains use the same JSON shape; the README has each one.
A raw fetch hands your agent bytes and a 200. Enconvert hands it clean Markdown, JSON, and a render_quality score, so the agent can reason about whether to trust what it just read. That honesty gate is the exact thing you would otherwise build and maintain yourself.
MCP server questions
Your agent is one install from seeing everything.
Free for a limited time. $29/mo when you scale. One bill, no surprises.