Model Context Protocol · open, no key

Your agent already reads the web.
Badly.

It fetches one URL and gets a navbar. This hands it 405 pages, already read.

One command connects Claude, Cursor, Codex or anything else that speaks Streamable HTTP to a public corpus of what 10 companies publish — cleaned to markdown, scored on what each page is, and searchable by meaning and by exact words at once.

  • No key, no account, no rate-limit email. Every read returns what the website already shows.
  • 1,562 embedded sections, split on headings so a quote never starts mid-sentence.
  • Filters are columns scored at index time, not a text match. “Technical” is a measurement.
  • Coverage is stated, never implied. If we have half a site, the response says which half.
See the 7 tools

https://stealpage.com/api/mcp

Installs into 12 clients

ClaudeOpenAICursorVS CodeWindsurfGemini CLIJetBrains AIWarpRaycastn8nClaudeOpenAICursorVS CodeWindsurfGemini CLIJetBrains AIWarpRaycastn8nClaudeOpenAICursorVS CodeWindsurfGemini CLIJetBrains AIWarpRaycastn8nClaudeOpenAICursorVS CodeWindsurfGemini CLIJetBrains AIWarpRaycastn8n

Ask a model what a company charges and it will answer from training data that is a year old, confidently, with no URL. Give it a fetch tool and it gets one page wrapped in a navbar, a cookie banner and a footer — and still cannot answer a question that spans forty companies. The gap is not access. It is that nobody kept the corpus.

01

One question, every company at once

Live. This ran when the page was rendered.

Youhow do you retry a failed webhook?

ClaudeSearching the corpus rather than answering from memory…

search_content { q: "how do you retry a failed webhook", limit: 3 }

  • Sessions 2026stripe.comtechnicality 3/5

    Tracking customer spend across processors

    Learn how to build systems that track spending patterns across providers and payment methods. See how Payment Account Reference (PAR) works, how to implement it, and how to keep the customer journey intact even as accounts change. View talk Charting the future

  • Discover case studies on how Supabase is being used around the world to quickly create outstanding products and set new industry standards.

    Streamlining Success: How Tinloof Scaled Seamlessly with Supabase Learn more Voypost uses Supabase’s strong relational model to overcome NoSQL challenges Learn more Supabase migration delivers an 83% reduction in data infrastructure costs for Shotgun Learn mor

  • Engineeringanthropic.comtechnicality 2/5

    Engineering

    Featured

mode hybrid — fused on RANK, not score. A cosine distance and a ts_rank are not on the same scale, so nothing here is a weighted sum of two numbers nobody can reason about.

02

And it tells you what it is missing

Also live. Generated in SQL from a view with no write path, so it cannot drift.

get_domain { domain: "smashsend.com" }

142 of 235 pages indexed — 63 left unfetched (wave limit)

known

235

URLs ever seen

indexed

142

fetched and stored

unfetched

63

found, not fetched

unaccounted

0

always zero

Every URL we know about lands in exactly one bucket with a reason on it. That is what leaves nowhere to hide — 800 missing pages have to be sitting in skipped_budget with the word budget attached, rather than in the gap between a promise and a manifest.

The whole company page

03

405 pages from 10 companies

Everything they publish

Blog, docs, pricing, changelog, landing pages. Found by walking the site's own link graph, so subdomains and translations turn up because the navbar points at them.

Read, not just stored

Every page is scored on what it IS — format, audience, technicality, depth, how much of it is a pitch — and split into 1,562 heading-aligned sections with embeddings.

Kept, and diffed

Every crawl is retained. You can ask what a page said last month, and see redesigns where the prose never changed.

It is a public corpus, not a private workspace. Everything in it is already on the website, which is why the server needs no key.

04

Things to say once it is connected

05

When to reach for it

Six jobs, and the tools each one leans on.

Agents that answer from sources, not memory

A model asked what a company charges will invent a price from its training data. This gives it the pricing page as it reads today, with the URL attached.

search_content, get_page

Competitive and market research

One index across every company you have indexed, so 'how does this industry write about onboarding' is a query rather than forty tabs.

search_content, list_content

Writing that has to cite something

Search returns the matching SECTION with its heading path, not the whole page, so a quote comes out of the tool ready to paste.

search_content

Reading documentation you do not host

Cleaned markdown with the navigation and the cookie banner already gone. The half of a company's writing nobody links to from the blog.

get_page, list_content

Watching what a company ships

Every crawl is kept and diffed, so 'what changed on their changelog this month' is answerable — including redesigns where no word moved.

get_domain

Filling an index you do not have yet

Point it at a domain nobody has submitted and it crawls the graph, converts, scores and returns a job to poll. Bounded by a page budget.

index_domain, job_status

06

Install it in 12 clients

Claude Code

In any terminal

claude mcp add stealpage --scope user --transport http https://stealpage.com/api/mcp
Claude Desktop

Settings → Connectors → Add custom connector

https://stealpage.com/api/mcp
Codex

In any terminal

codex mcp add stealpage --transport http https://stealpage.com/api/mcp
ChatGPT

Settings → Connectors → Add custom connector (developer mode)

https://stealpage.com/api/mcp
Cursor

~/.cursor/mcp.json

{
  "mcpServers": {
    "stealpage": { "url": "https://stealpage.com/api/mcp" }
  }
}
VS Code

.vscode/mcp.json

{
  "servers": {
    "stealpage": { "type": "http", "url": "https://stealpage.com/api/mcp" }
  }
}
Windsurf

~/.codeium/windsurf/mcp_config.json

{
  "mcpServers": {
    "stealpage": { "serverUrl": "https://stealpage.com/api/mcp" }
  }
}
Gemini CLI

~/.gemini/settings.json

{
  "mcpServers": {
    "stealpage": { "httpUrl": "https://stealpage.com/api/mcp" }
  }
}
JetBrains AI

Settings → Tools → AI Assistant → MCP → Add as JSON

{
  "mcpServers": {
    "stealpage": { "url": "https://stealpage.com/api/mcp" }
  }
}
Warp

Settings → AI → MCP servers → Add

{
  "stealpage": { "url": "https://stealpage.com/api/mcp" }
}
Raycast

Manage MCP Servers → Add via JSON

{
  "mcpServers": {
    "stealpage": { "url": "https://stealpage.com/api/mcp" }
  }
}
n8n

MCP Client Tool node → HTTP Streamable

https://stealpage.com/api/mcp

Anything else that speaks Streamable HTTP: point it at https://stealpage.com/api/mcp

07

The 7 tools

Descriptions are written to say WHEN to reach for a tool rather than what it returns — a model choosing between six of them reads the first sentence — and to say what a number means where a naive reading would be wrong. An agent that reads inlinksas popularity will confidently report that /login is a company’s most important page.

search_content

Search the corpus

Search everything companies publish, by meaning and by words at once. Use this first for any question about what a company says, how an industry writes about a topic, or where a claim comes from. Returns the matching SECTION of each page, not the whole page, so you can quote it directly. Filters apply inside the search rather than after it, so narrowing does not silently reduce the result count.

q · domain · collection · type · locale · technicality_min · promotional_max · mode · limit

list_content

List pages by what they are

Browse pages by their PROPERTIES rather than by a query — 'technical articles with code from developer-tool companies', 'pricing pages changed this year', 'the most-cited posts on this domain'. Use this when the question is about a category of writing rather than a subject. Every filter is a value scored when the page was indexed; none of them is a text match. Two quality gates apply unless you turn them off: pages under 150 words and domains with a spam score of 50+ are excluded. The response declares them in `qualityGates` with a count of what they removed, so a short result is explained rather than ambiguous.

domain · collection · type · format · audience · topics · technicality_min · depth_min · originality_min · promotional_max · has_code · include_thin · published_after · sort · limit

list_collections

The curated shelves

Start here when the question is about a CATEGORY of company rather than a named one — "the docs of the major payment APIs", "what shipped across AI providers this week". Each shelf is a set of companies somebody chose, with its own refresh cadence: documentation weekly, changelogs daily, open source monthly. Pass a slug as `collection` to search_content or list_content to scope a query to one. Read `unindexed` before quoting a shelf as complete: it counts members we hold nothing for yet.

slug · limit

get_page

Read one page

The full cleaned markdown of one page, plus what we scored about it, its images with their alt text, every crawl we have of it, and which of the company's own pages cite it and under what wording. Use this after a search when you need the whole argument rather than a section, or when you want to know whether a page has changed.

id · markdown

get_domain

Everything about one company

What a company publishes, in what languages, how much of it we have, and what moved recently. Includes their own sitemaps, pages that were redesigned without the words changing, and which other companies they link to. Read `coverage.headline` before quoting any total: if we only have part of a site it says so, and says which bucket the rest is in.

domain

index_domain

Index a company we do not have

writes

Start crawling a domain. Returns a job id immediately — a crawl takes minutes to hours, so poll job_status rather than waiting. Check get_domain first; if it returns a result the site is already indexed and you want that instead.

domain · budget

job_status

How a crawl is going

Progress on a crawl: indexed, pending, discovered, elapsed, pages per minute and an eta. `coverage.buckets` accounts for every URL found — `unaccounted` is always 0, and pages left unfetched sit in `budget` or `stoppedEarly` with the reason attached. A finished crawl is not the same as a complete one; read the buckets.

jobId

08

Questions

Do I need an account or a key?

No. Every read returns exactly what the public website already shows, so a key would buy nothing and would cut the server out of anonymous discovery — which is most of the reason to run one.

What does it cost?

Nothing. index_domain is the only tool that spends our money and it is bounded by a per-domain page budget.

Is this the same as giving my agent a browser?

A browser fetches one URL and hands back the navigation, the cookie banner and the footer with it. This is 405 pages already converted to clean markdown, split on headings, embedded, and searchable across 10 companies at once. The difference shows up the first time the question is broader than one page.

What is in the corpus?

405 pages from 10 companies in 89 language(s) — blogs, docs, pricing, changelogs, landing pages. A translated page is a separate document, not a variant, so a Spanish docs page is its own row.

Can I add a company that is not there?

Yes, and that is what index_domain is for. It returns a job id immediately because a crawl is minutes to hours; poll job_status rather than waiting on the call.

How current is it?

Every domain is on a refresh schedule and every fetch is diffed against the page's own past. get_domain returns what moved recently, including pages that were redesigned without a word changing.

What happens if you only have half a site?

It says so. coverage.headline is generated in SQL from a view with no write path, so the site, the API and this server cannot word it three different ways — and the pages we do not have sit in a named bucket with a reason attached.

One command, and it stops guessing.

405 pages, 10 companies, 7 tools. No key.