MCP-native extraction runtime

Agents that define their own
reusable data extractors
X-ray messy pages into structured data — built-in scrape / extract / crawl,
plus agents submit their own TypeScript extractors, registered as MCP tools.

Firecrawl’s zero-setup, plus the depth of agents writing code that runs in real isolation. Fully hosted on Cloudflare — zero ops, usage-based pricing.

Streamable HTTP / SSEV8 isolate sandbox< $1/mo idle cost
tools/call · scrape● rendering
INPUT // raw_domhtml
<div class="product">
  <h1 class="title">
    Aero Mouse Pro
  </h1>
  <span class="price">
    $ 49.00
  </span>
  <b data-stock="1"/>
</div>
OUTPUT // structuredjson
{
  "title": "Aero Mouse Pro",
  "price": 49.00,
  "currency": "USD",
  "in_stock": true,
  "url": "shop.io/p/123"
}
// confidence 0.98
job #a3f9c2 · browser 1.4sloader 1 isolate · cost $0.0008
Between two extremes

Fetching is either too shallow or too heavy.
exray sits in between.

Parametric APIs cover 80%, but can’t express site-specific logic; self-hosting is fully programmable, but the browser fleet, deps and scaling are all on you.

01 / API

Firecrawl · Jina

parametric only
  • Complex structures only get coarse format:markdown
  • Special extraction needs LLM post-processing — costly, slow, flaky
  • Agents can’t upload their own code
02 / SELF-HOST

Playwright + Python

fully programmable
  • Run your own browser fleet, manage deps
  • Scaling, monitoring, ops — all yours
  • Not MCP-native, agents can’t plug in
exray
03 / RUNTIME

MCP × Programmable × Serverless

best of both
  • Built-in scrape / extract / crawl, ready to use
  • Agents write extractors → run in real isolation
  • Fully hosted on Cloudflare, zero ops
Agent-programmable

Write an extractor once,
reuse it forever as an MCP tool.

An agent submits some TypeScript; the platform statically validates it, runs it in real isolation, and registers it into tools/list. The next call feels identical to a built-in tool.

1

Submit code

An agent calls define_extractor with a name + a TS function over PageSnapshot.

2

Validate & isolate

AST allowlist static check, compute code_hash, store in R2, register in D1.

3

Register as a tool

Emit tools/list_changed; the new tool appears instantly, isolated per token.

4

Call repeatedly

Each call runs in a fresh V8 isolate; self-debug, overwrite by name, reuse forever.

define_extractor.tsV8 isolate
// Submitted once by an agent, registered as a permanent MCP tool
export default {
  async extract(snapshot: PageSnapshot) {
    const q = snapshot.dom.querySelector;
    return {
      title: q('h1.title')?.textContent,
      price: parseFloat(
        q('.price')?.textContent
          ?.replace(/[^\d.]/g, '') ?? '0'
      ),
      in_stock: q('[data-stock]') != null,
    };
  }
};
// → tool "my-shop-scraper" registered ✓
Built in

Three tools, ready out of the box.

A single MCP endpoint, all visible to agents. Structured results with no LLM post-processing.

scrape

Render a single URL, return markdown / html / screenshot. Supports wait_for and pre-render actions.

in url · format · actions[]out markdown · metadata
extract

Schema-driven extraction, Firecrawl-style. Give a JSON Schema, get structured data with confidence.

in url · schema · promptout data · confidence
crawl

Seed URL + rules for batch fetching. Queue-dispatched concurrent workers, results streamed back via MCP notifications.

in seed_url · depth · extractorout job_id · stream
What makes it different

Others pick one.
exray combines all three.

01

MCP-native

Not a bolted-on MCP server. Every capability — built-in and agent-defined — goes through the same tools/call; agents never see the backend difference.

02

Agent-programmable

Agents write code that runs in real isolation and registers as a tool. Not a prebuilt actor store — it’s “let the agent write an extraction function that lasts forever”.

03

Serverless

Workers / D1 / R2 / KV / Queues / Browser Rendering / Dynamic Worker Loader — all included. No fixed infrastructure cost.

Zero ops

The whole pipeline runs on Cloudflare.

No servers, databases or browser fleets to maintain. Idle, you pay only D1 / R2 storage — under $1/month. 2026’s GA Dynamic Worker Loader makes “agent uploads code → platform runs it in real isolation” available on any paid plan.

Workers D1 R2 KV Queues Browser Rendering Worker Loader TypeScript 全栈

Give your agent
X-ray vision.

Sign up, issue a Bearer token, paste the config into your MCP client. First scrape running in 5 minutes.

$ npx @exray/cli login⧉ copy
Open Dashboard →