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 Roger Campos · 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_markdownover 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.
{
"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).
{
"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
- 1The model asks for
read_pagewith a URL. - 2Your tool posts it to
/markdownwithsync: true, so the Markdown comes back in the response body. - 3A sync call waits up to 60 seconds. A page slower than that returns
504with atoken, and the work keeps going: collect it fromGET /result/:token, which answers202until it is ready. - 4The tool returns the Markdown — or a short error sentence the model can act on — as the tool result.
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.textconst API = "https://urlpipe.dev";
const headers = {
Authorization: `Bearer ${process.env.URLPIPE_API_KEY}`,
"Content-Type": "application/json",
};
const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
export async function readPage(url) {
let res = await fetch(`${API}/markdown`, {
method: "POST",
headers,
body: JSON.stringify({ url, sync: true }),
});
// Slower than the sync window: the work continues; collect it by token.
if (res.status === 504) {
const { token } = await res.json();
do {
await sleep(2000);
res = await fetch(`${API}/result/${token}`, { headers });
} while (res.status === 202);
}
if (!res.ok) {
const { error } = await res.json().catch(() => ({}));
return `Could not read ${url}: ${error ?? res.status}`;
}
return res.text();
}# Read a page as Markdown, waiting for the result
curl -X POST https://urlpipe.dev/markdown \
-H "Authorization: Bearer $URLPIPE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/pricing", "sync": true}'
# On a 504, the body carries a token: collect the result when it lands
curl https://urlpipe.dev/result/TOKEN_FROM_THE_504 \
-H "Authorization: Bearer $URLPIPE_API_KEY"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:
| What | A month | Credits each | Credits |
|---|---|---|---|
| Pages read as Markdown | 9,000 | 1 | 9,000 |
| Screenshots, when layout matters | 1,000 | 1 | 1,000 |
| Lighthouse audits on request | 200 | 2 | 400 |
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.
localhostand 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.
Endpoints
The endpoints on this page
- Turn any URL into clean Markdown
Paste a link and get the page's main content as tidy Markdown — headings, lists, links and code kept, navigation and cookie banners stripped. The format LLMs and RAG pipelines work best with.
Try it free - Screenshot any website from its URL
Paste a link and get a full-page PNG of the rendered page — JavaScript executed, exactly as a real browser would draw it. Great for previews, monitoring and visual QA.
Try it free
FAQ
Frequently asked questions
Why not use the reference fetch MCP server?
Does the agent wait for results, or get a token?
Can I stop an agent from spending credits?
Does it cost more to call URLpipe through MCP?
Can the agent read pages that block bots?
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.