Documentation

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.

ToolArgumentsWhat it does
web_search
cost 1
query string required
count integer = 6
freshness string: day|week|month|year
sites array
exclude array
safe boolean = true
deep boolean = false
verbosity 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.
research
cost 3
query string required
sources integer = 4
max_chars_per_source integer = 4000
freshness string: day|week|month|year
deep 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_url
cost 1
url string required
max_chars integer = 12000
include_links boolean = false
allow_pdf boolean = false
verbosity 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_fetch
cost 1
urls array required
max_chars integer = 6000
include_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.
news
cost 1
query string required
count integer = 8
freshness string: day|week|month = week
verbosity string: terse|normal = terse
Recent news and announcements, ranked by recency and relevance. Use for anything time-sensitive: releases, outages, funding, elections, prices.
extract
cost 1
url string required
fields object
json_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.
sitemap
cost 2
url string required
filter string
limit 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.
wikipedia
cost 1
query string required
lang string = en
full boolean = false
max_chars integer = 4000
Authoritative encyclopedia summaries from Wikipedia's API. Fastest reliable answer for definitions, people, places, history and science. Supports 300+ languages.
github_search
cost 1
query string required
type string: repos|issues|code|users = repos
limit integer = 6
sort 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.
hackernews
cost 1
query string
sort string: relevance|date = relevance
limit 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.
arxiv
cost 1
query string required
limit integer = 5
sort 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_info
cost 1
name string required
ecosystem 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_usage
cost 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

Free2,000/day · 60/min · 12/s
Pro40,000/day · 400/min · 80/s
research3 units
batch_fetch1 unit per URL
account_usagefree

When 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

Tool-level failureresult.isError = true + plain-English text
Bad argumentsisError with the offending field
Unknown method/toolJSON-RPC -32601 / -32602
Missing or expired tokenHTTP 401 + WWW-Authenticate
robots.txt / AI opt-out403 with the exact rule that blocked it

Source, schema and deployment notes live in the repository. Questions: open an issue.

Ready?

Free account, 2,000 calls a day.