Skip to main content

Confirm

Are you sure?

Use cases

Give your agent a browser it can read

One tool call turns a URL into Markdown the model can reason over — after the page's JavaScript has run.

By · Last updated: September 2026

TL;DR

To give an AI agent web access, hand it a tool that loads the page in a real browser and returns text a model can read. URLpipe does this two ways: a hosted MCP server that any MCP client connects to with one bearer token, and an HTTP API you wrap as a tool in your own agent loop. Reading a page as Markdown costs 1 credit.

Free plan, no credit card. 1,000 credits a month.

The job

What an agent needs from the web

An agent that browses has one recurring problem: it has a URL and needs the page's content in a form a model can use. A plain HTTP GET works on a static blog and returns an empty <div id="root"> on a single-page app. The page has to be loaded in a browser, its scripts run, and the result turned into compact text.

That is three jobs, and each maps to one call:

  • Read the page — /markdown (fetch_markdown over MCP). The rendered page as Markdown, links absolute, navigation and chrome dropped. 1 credit.
  • See the page — /screenshot (capture_screenshot). Over MCP it comes back as an image content block, so a model with vision looks at it directly. 1 credit.
  • Check the page — /console and /lighthouse, for an agent that debugs or reviews sites rather than reads them.

Everything else — deciding which URL to open, what to do with the text — stays in your agent.

Setup

Two ways to connect

Through MCP, with nothing to install

If the agent runs in an MCP client — Claude, Cursor, VS Code, Zed and the rest — point it at the hosted server. It speaks streamable HTTP at https://urlpipe.dev/mcp and authenticates with an organization token in an Authorization header. Most clients take a JSON entry of this shape; the integration pages have the exact form for each one.

MCP client configuration
{
  "mcpServers": {
    "urlpipe": {
      "type": "http",
      "url": "https://urlpipe.dev/mcp",
      "headers": { "Authorization": "Bearer YOUR_TOKEN" }
    }
  }
}

The agent gets fourteen tools: the nine endpoints plus get_result, get_request, list_requests, list_projects and get_usage. It starts with list_projects, because every other tool takes a project_id. See the MCP docs for every argument.

As a tool in your own agent loop

If you run the loop yourself — the Anthropic or OpenAI SDK, LangGraph, a hand-written planner — define a read_page tool and implement it with one HTTP call. The JSON Schema is the same for every SDK; each puts it under its own key (input_schema, parameters).

Tool definition
{
  "name": "read_page",
  "description": "Read a web page as Markdown. The page is loaded in a real browser first, so JavaScript-rendered content is included. Use it whenever you need what a URL says.",
  "input_schema": {
    "type": "object",
    "properties": {
      "url": { "type": "string", "description": "The absolute http(s) URL to read." }
    },
    "required": ["url"]
  }
}

Flow

The request, end to end

  1. 1
    The model asks for read_page with a URL.
  2. 2
    Your tool posts it to /markdown with sync: true, so the Markdown comes back in the response body.
  3. 3
    A sync call waits up to 60 seconds. A page slower than that returns 504 with a token, and the work keeps going: collect it from GET /result/:token, which answers 202 until it is ready.
  4. 4
    The tool returns the Markdown — or a short error sentence the model can act on — as the tool result.
read_page, implemented
import os, time, requests

API = "https://urlpipe.dev"
HEADERS = {"Authorization": f"Bearer {os.environ['URLPIPE_API_KEY']}"}

def read_page(url: str) -> str:
    res = requests.post(f"{API}/markdown", headers=HEADERS,
                        json={"url": url, "sync": True}, timeout=75)

    # Slower than the sync window: the work continues; collect it by token.
    if res.status_code == 504:
        token = res.json()["token"]
        while (res := requests.get(f"{API}/result/{token}",
                                   headers=HEADERS, timeout=30)).status_code == 202:
            time.sleep(2)

    if res.status_code != 200:
        return f"Could not read {url}: {res.json().get('error', res.status_code)}"
    return res.text

Want the agent to see the page too? Add a look_at_page tool that posts to /screenshot with "screenshot_options": {"full_page": false} for just the fold, and pass the Base64 body to the model as an image. A full-page capture of a long page is a very tall image; the fold is usually what a model needs.

Cheap by default

Tell the agent once that reading is the cheap operation. fetch_markdown costs 1 credit and summarize_page costs 17. A model that is going to reason over the page anyway gets a better input from the Markdown — the summary is for when the summary is the thing you are producing.

Credits

What it costs

A team assistant that reads about 300 pages a day, takes a screenshot when layout matters and runs the odd Lighthouse audit, at list price:

WhatA monthCredits eachCredits
Pages read as Markdown9,00019,000
Screenshots, when layout matters1,00011,000
Lighthouse audits on request2002400

That is 10,400 credits a month; the cheapest plan that covers it is Starter: $19 a month for 20,000 credits. Two things push the real number down. A page the agent reads again inside seven days is served from the cache for free — the default max_age — and a failed fetch is never billed. Had the same agent summarized every page instead of reading it, the first row alone would be 153,000 credits.

Pricing for every plan is on the pricing page; get_usage gives an agent the live numbers, so it can check what a run will cost before it starts.

Limits

What URLpipe does not do for an agent

  • Search. It fetches URLs you give it; it does not find them. Pair it with a search API if your agent needs discovery.
  • Crawl. One URL per call. It does not follow links or walk a site — your agent decides what to open next.
  • Click, type or log in. The page is loaded and read; there is no session to drive. Pages behind a login are out of reach.
  • Reach your machine. URLs must be public. localhost and private addresses are refused, so point it at a deployed preview, not your dev server.
  • Unlimited speed. The HTTP API allows 60 requests a minute and 15 per 10 seconds per project, on every plan; the MCP server allows 300 calls per 5 minutes per token. Your plan's parallel-request limit applies to both.

FAQ

Frequently asked questions

Why not use the reference fetch MCP server?
It makes a plain HTTP request, so it returns what the server sent before any JavaScript ran. On a client-rendered page that is little more than an empty container. URLpipe loads the page in real Chrome first, and also gives the agent screenshots, metadata and audits.
Does the agent wait for results, or get a token?
Async is the default over MCP and HTTP alike: a call returns a token and the agent collects the result with get_result. Pass sync: true to have the call wait and return the result directly, which is simpler for most agent loops.
Can I stop an agent from spending credits?
Yes. Create a read-only organization token: it can list projects, read usage and retrieve results already paid for, but cannot fetch a page. Tokens can also be limited to one project or given an expiry date.
Does it cost more to call URLpipe through MCP?
No. An MCP call spends exactly what the matching HTTP endpoint spends, from the same monthly allowance, and cache hits are free on both.
Can the agent read pages that block bots?
Pages are rendered by our own custom-built rendering engine in real Chrome, and an optional residential exit is available for sites that treat datacentre traffic differently. A bot check we could not clear is never billed. No tool gets through everything, and none should claim to.

Build it on the free plan.

Free plan, no card. Confirm your email and your API key is live — you'll be making real requests in minutes.