One endpoint. Thirteen tools.
Streamable HTTP MCP at https://faaast.ereneksi.com/mcp. OAuth 2.1 with PKCE, dynamic client registration, and API keys. Protocol versions: 2025-06-18, 2025-03-26, 2024-11-05.
Authentication
OAuth (recommended)
Point your client at the endpoint. It discovers authorization metadata from the 401 response and walks the full flow: dynamic registration → consent → authorization code + PKCE → rotating refresh tokens.
WWW-Authenticate: Bearer realm="faaast", resource_metadata="https://faaast.ereneksi.com/.well-known/oauth-protected-resource"
API key
Create a key in the dashboard and send it directly. Keys are prefixed faa_sk_, hashed at rest, and revocable instantly (cached up to 30s per edge location).
curl -s https://faaast.ereneksi.com/mcp \
-H "Authorization: Bearer faa_sk_…" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Client setup
Claude Code
claude mcp add --transport http faaast \ https://faaast.ereneksi.com/mcp
Cursor / VS Code / any JSON config
{
"mcpServers": {
"faaast": {
"url": "https://faaast.ereneksi.com/mcp"
}
}
}
MCP Inspector
npx @modelcontextprotocol/inspector \ --transport http \ https://faaast.ereneksi.com/mcp
Raw JSON-RPC
{"jsonrpc":"2.0","id":1,"method":"initialize",
"params":{"protocolVersion":"2025-06-18",
"capabilities":{},
"clientInfo":{"name":"curl","version":"1"}}}
Tools
Every tool returns content[0].text (compact, model-ready) plus structuredContent (JSON). Usage counters ride along in _meta.usage. All tools are read-only.
| Tool | Arguments | What it does |
|---|---|---|
web_searchcost 1 |
query string requiredcount integer = 6freshness string: day|week|month|yearsites arrayexclude arraysafe boolean = truedeep boolean = falseverbosity string: terse|normal = terse |
Search the live web. Returns titles, canonical URLs, snippets and dates, fused across search backends and ranked for accuracy (not SEO). Use this first for factual questions, then fetch_url on the best source. Terse output by default. |
researchcost 3 |
query string requiredsources integer = 4max_chars_per_source integer = 4000freshness string: day|week|month|yeardeep boolean = false |
One call: search, read the best sources in parallel, and return only the passages that answer the question, with citations. This is the highest-accuracy tool for factual questions and comparisons. Cite the URLs it returns. |
fetch_urlcost 1 |
url string requiredmax_chars integer = 12000include_links boolean = falseallow_pdf boolean = falseverbosity string: terse|normal = terse |
Fetch one page and return clean, readable markdown (boilerplate, nav, scripts and ads removed). Respects robots.txt and AI opt-outs; never bypasses paywalls. Use after web_search to read the best source, or directly when you have a URL. |
batch_fetchcost 1 |
urls array requiredmax_chars integer = 6000include_links boolean = false |
Fetch up to 8 URLs in parallel and return clean markdown for each. Cheaper and faster than calling fetch_url repeatedly. Failures are reported per URL without aborting the batch. |
newscost 1 |
query string requiredcount integer = 8freshness string: day|week|month = weekverbosity string: terse|normal = terse |
Recent news and announcements, ranked by recency and relevance. Use for anything time-sensitive: releases, outages, funding, elections, prices. |
extractcost 1 |
url string requiredfields objectjson_ld boolean = false |
Pull exact fields out of a page with CSS selectors (title, price, author, links, table cells) or JSON-LD. Deterministic: no model, no guessing. Returns JSON. |
sitemapcost 2 |
url string requiredfilter stringlimit integer = 100 |
Discover a site's URLs from its robots.txt and XML sitemaps (handles sitemap indexes). Use to find the right page on docs sites, blogs and shops before fetching. |
wikipediacost 1 |
query string requiredlang string = enfull boolean = falsemax_chars integer = 4000 |
Authoritative encyclopedia summaries from Wikipedia's API. Fastest reliable answer for definitions, people, places, history and science. Supports 300+ languages. |
github_searchcost 1 |
query string requiredtype string: repos|issues|code|users = reposlimit integer = 6sort string: stars|updated|relevance = stars |
Search GitHub repositories, issues/PRs, code and users via the official API. Best for finding libraries, checking whether a bug is known, or locating real-world implementations. |
hackernewscost 1 |
query stringsort string: relevance|date = relevancelimit integer = 8 |
Search Hacker News stories and discussion via the Algolia API. Sharp signal on developer tools, launches and technical debates. No query returns the front page. |
arxivcost 1 |
query string requiredlimit integer = 5sort string: relevance|submitted = relevance |
Search arXiv preprints by title, abstract or author. Returns the paper ID, authors and abstract — the right source for ML, physics and math claims. |
package_infocost 1 |
name string requiredecosystem string: auto|npm|pypi = auto |
Exact metadata for an npm or PyPI package: latest version, license, description, repo, dependency count, release date. Use instead of guessing versions. |
account_usagecost 0 |
Current fair-use counters for this account: calls used today, per-minute headroom, reset time. Free to call. Use it to self-throttle before a large batch. |
Examples
Search and read the best source
{"jsonrpc":"2.0","id":2,"method":"tools/call",
"params":{
"name":"web_search",
"arguments":{"query":"cloudflare workers cpu limits",
"count":5}}}
Grounded research with citations
{"jsonrpc":"2.0","id":3,"method":"tools/call",
"params":{
"name":"research",
"arguments":{"query":"does deno support npm packages?",
"sources":4}}}
Fair use & limits
research3 unitsbatch_fetch1 unit per URLaccount_usagefreeWhen a limit is hit the tool returns isError: true with the exact reset time. Nothing is silently dropped or slowed.
Why units, not tokens
A call costs the same whether the page is 2 KB or 40 KB. The meter lives in a Durable Object, so counting is atomic across the whole edge and adds ~1 ms — not a database round-trip.
What we will not do
No paywall bypass, no login walls, no CAPTCHA solving, no Google/Bing HTML scraping. Faaast obeys robots.txt, Content-Signal and X-Robots-Tag: noai, and identifies itself with a truthful user agent.
Errors
result.isError = true + plain-English textisError with the offending field-32601 / -32602WWW-Authenticate403 with the exact rule that blocked itSource, schema and deployment notes live in the repository. Questions: open an issue.
Ready?
Free account, 2,000 calls a day.