Raw, programmatic internet search for agents

Search the public internet with SQL. Every matching row, not the top ten.

Scry keeps a live, read-only copy of the public web — Reddit, Hacker News, LessWrong, arXiv, Stack Exchange, Wikipedia, prediction markets and more, with billions of new posts and comments a day. Your agent writes one SQL query and gets back every row that matches, in one call.

Thesis

Run arbitrary programs over the internet.

The programs are SQL. People search for pages; agents can query the underlying records. The question an agent actually has is rarely ten links. It might need every page that mentions this compound but not that patent, grouped by domain, since March. Scry runs that as a query instead of assembling it from repeated searches and scraped results.

Install

Add Scry to your assistant.

Scry is an MCP server at https://mcp.scry.io. Connecting it takes about two minutes in ChatGPT or Claude and requires no code. The sign-in page also lets you create an account.

ChatGPT

  1. Open ChatGPT on the web and go to Settings.
  2. Turn on Developer mode. ChatGPT asks you to accept the risks.
  3. Open connectors, click +, and enter a name (scry), a description (programmatic search), and the server URL https://mcp.scry.io. Click Create.
  4. Complete the sign-in flow when ChatGPT sends you through it.
  5. Scry appears as a connector. Select it, or call it with @scry in any chat. One setup covers the web and the ChatGPT mobile app — the easiest way to query the corpus from your phone.

Claude

  1. Open claude.ai and go to Settings → Connectors.
  2. Click Add custom connector.
  3. Name it Scry, set the URL to https://mcp.scry.io, and add it.
  4. Complete the sign-in flow when Claude sends you through it.
  5. Enable Scry from the tools menu in any chat. One setup covers Claude.ai, Desktop, and mobile.

Then ask it the highest-leverage question you can think of.

For developers

Claude Code, Codex, Cursor, or any MCP client connects with the same URL. Agents without an MCP client use the HTTP API with your key. Per-client steps live on the connect page.

Claude Code — one command, then /mcp to approve any other agent — paste this prompt
read the prompt text first
Scry: SQL over the public web, for agents.

Connect over MCP (preferred). Scry is an MCP server at https://mcp.scry.io. One URL, OAuth on first use, approve at scry.io.

- Claude Code:  claude mcp add --transport http scry https://mcp.scry.io   then run /mcp inside a session and approve.
- Codex:        codex mcp add scry --url https://mcp.scry.io && codex mcp login scry
- Claude.ai, Claude Desktop, ChatGPT (developer mode), Cursor, any MCP client: add a custom connector with that URL and approve the scry.io consent.
- No browser (CI, headless): Claude Code adds --header "Authorization: Bearer $SCRY_API_KEY"; Codex adds --bearer-token-env-var SCRY_API_KEY. Keys live in the dashboard at https://scry.io/dashboard.
- Tools: scry_context, scry_schema, scry_query, scry_embed, scry_brief, scry_search, scry_fetch (also exposed under the connector-standard bare names search/fetch), scry_feedback. Call scry_context once per session and scry_schema before writing SQL. scry_brief answers "what does the fresh web say about X since my cutoff" with dated verbatim passages; its known_after argument is a temporal eligibility bound, not a model of what you know.

HTTP API (when MCP is not available). Base https://api.scry.io; send `Authorization: Bearer $SCRY_API_KEY` (load it from `~/.config/scry/env`). No key: stop and send the user to https://scry.io/dashboard.

- GET /v1/scry/context?mode=agent — the live contract.
- GET /v1/scry/schema — the only discovery authority. The default document carries full contracts for the start-here relations plus a compact index of the rest; `?relation=<name>[,<name>]` fetches more full contracts; `?mode=index` lists the whole catalog. Never guess column names; a wrong-column error returns the real roster.
- POST /v1/scry/query with `Content-Type: text/plain` — one read-only statement in the ClickHouse dialect, always with LIMIT (start at 20). Synchronous; long queries may stream whitespace before the JSON body.
- POST /v1/scry/rerank — order documents you already hold by an instruction. POST /v1/scry/web with {"q": "..."} — live web search (Exa and Google, $0.0075 per answering provider).

Working rules

- Token filters run at the speed of their rarest token: include one distinctive token (a name, an identifier, an unusual word). All-common-word sets scan for 30-60s. For broad topics use the embedding helpers the schema advertises.
- To sort rows by an attribute you can describe, send `x-scry-rerank: <directive>` on POST /v1/scry/query (MCP: the rerank argument on scry_query). Runs on local models, $0; the response's rerank block says what applied.
- Use only relations and helpers the live schema returns; an omitted name is unavailable, and there is no fallback database.
- Keep source timestamp, observation time, load time, processing status, and quality fields distinct. A recent load is not a recent source event; an absent row is not source absence. Say which fields support each claim.
- Report the exact SQL, relations, row count, duration, truncation state, and accounting fields returned.

Example

claude mcp add --transport http scry https://mcp.scry.io

curl -s https://api.scry.io/v1/scry/query \
  -H "Authorization: Bearer $SCRY_API_KEY" \
  -H "Content-Type: text/plain" \
  --data "SELECT hn_id, title, original_author, original_timestamp, uri FROM hackernews.items WHERE title != '' ORDER BY hn_id DESC LIMIT 20"

A pasted prompt is instructions for your agent. Read prompts before you run them, whether they come from us or anyone else. Scry's is plain text, shown in full above.

Questions

How it works, and when your agent reaches for it.

What do I install?

Only the MCP server: https://mcp.scry.io, in ChatGPT, Claude, Claude Code, Codex, Cursor, or any MCP client. The sign-in creates your account. Nothing runs on your machine.

When does my agent use Scry?

When the answer is a set of records, not a page: every comment naming a compound since March, every thread an author started, how a stance shifted over five years. Once connected, your agent sees Scry beside its web search and picks per question; you can also just tell it to use Scry.

How it works

Your agent reads the live schema (/v1/scry/schema), picks an enabled source-native relation and listed vector helpers, then writes bounded SQL for phrase matching, time windows, joins, or vector composition. Result rows keep the source-native identifiers and provenance fields the relation provides.

What people do with it

Research agents check hundreds of sources instead of skimming five. Standing queries watch the web for any condition you can write down. Structured datasets can be pulled out of the wild web without building a crawler. Agents can send source requests or feedback through the feedback endpoint (authenticated POST https://api.scry.io/v1/feedback).

How fresh is the data?

For account holders, /v1/scry/schema states current query coverage and relation freshness per source. But sources like arXiv are every day, and Hacker News and LessWrong under 15 minutes.

Mission

Scry is public-benefit infrastructure, run as a philanthropic service for researchers: search over public evidence, every result traceable to its source.

Commitments

Scry should make it easy for conscientious, prosocial forces to run wildly world-unflattening programs. Scry is not supposed to suck! We want to metabolize pain points fast. And Scry remains affordable to people who need it.

Alpha

Scry is in open alpha: corpus, indexes, and interfaces move quickly. Accounts are self-serve, with free credit to start.

Who is it for?

Anyone with a question the public record can answer. Individual accounts are self-serve. For commercial use, large evaluations, custom source builds, or dataset licensing, write to [email protected].

Archive

Billions of new posts and comments a day.

The public internet is held as source-native relations. Each source keeps its own schema, identifiers, and provenance. Coverage and freshness vary by source: some corpora land live or incrementally, others as batch imports or fixed snapshots, and /v1/scry/schema is the authority for what each relation currently holds. Growth is prioritized by the questions researchers bring.

26.9 billion Reddit comments — 94% of every comment ever written — and 3.7 billion posts, nine of every ten. That number is not an estimate. Reddit numbers its comments with one global counter, so what exists and what we hold differ by exact subtraction. Last month Reddit issued 372.8 million comment IDs; 371.4 million of them — 99.6% — are here.

Each bar: one year's share of Reddit's issued comment IDs, held. The 2019–20 dent is what the public archives themselves lost — recovery of what remains reachable is running now — and 2026 is mid-ingest. Measured 2026-08-26; we publish the dent rather than round it away.

Scholarly literature

arXiv, PubMed, OpenAlex, preprint servers, and citation-graph metadata; full text and dense vector coverage where available.

Community & discussion

Reddit archive spanning 2005 to now with measured, published completeness (audited against Reddit's own ID counters), Hacker News with live tail, Stack Exchange, LessWrong, and specialist forums.

Newsletters & longform

Newsletter publications plus essay and comment archives from public longform sites.

Social streams

Public firehose archives (Bluesky) and other public social archives.

Prediction markets

Kalshi, Polymarket, Metaculus, and Manifold: markets, descriptions, comments, and resolution context.

Reference & books

Wikipedia, Wikidata, public catalogs, and public-domain full text.

Public records

Government, regulatory, procurement, funding, and investigative records from public releases.

Code & standards

GitHub repositories and documentation, protocol standards, and governance archives.

Vectors

Embedding vectors are, in fact, algebraically compositional.

This means the difference between two embeddings is itself a direction with a meaning, the mean of several is a concept, and projecting one onto another keeps or removes one component of what a text is about. Most systems hide embeddings behind a similarity API and throw that structure away. In Scry a vector is a first-class value: mint one from any text, then add, subtract, and project in SQL, and rank a whole corpus along the result. Text search speaks a full operator grammar — exact phrases, exclusion, OR, regex, fuzzy, proximity — and scry_lex carries that whole grammar into SQL as one predicate, compiled server-side to each relation's own text indexes. Everything below runs as written against the live schema.

Which way has LessWrong drifted, doom or optimism?

Mint the two poles, take the balanced axis between them, and average every chunk's projection quarter by quarter, joined to real post timestamps. One query returns the emotional trajectory of a community.

POST /v1/scry/embed  {"text": "we will solve alignment", "name": "optimism"}
POST /v1/scry/embed  {"text": "we are not going to make it", "name": "doom"}

SELECT toStartOfQuarter(p.original_timestamp) AS quarter,
       avg(scry_cosine_similarity(e.embedding,
           scry_contrast_axis_balanced(@optimism, @doom))) AS lean,
       uniq(e.target_key) AS posts
FROM embeddings.chunks AS e
JOIN forums.posts AS p ON p.post_key = e.target_key
WHERE e.source = 'forum_posts' AND e.model_name = 'voyage-4-lite'
  AND p.source = 'lesswrong'
GROUP BY quarter
ORDER BY quarter
LIMIT 100;

How entangled are two ideas, and what is nearest to one?

Measure how much of one idea lives inside another, then rank a corpus by distance to it. scry_debias_vector subtracts the shared component when you want the residue instead.

SELECT scry_cosine_similarity(@alignment, @safety) AS entanglement,
       scry_debias_removed_fraction(@alignment, @safety) AS removed_fraction
LIMIT 1;

SELECT post_key, chunk_index,
       scry_vector_topk_distance(embedding_voyage4, @alignment) AS dist
FROM embeddings.forum_posts
WHERE model_name = 'voyage-4-lite' AND post_key LIKE 'lesswrong%'
ORDER BY dist ASC
LIMIT 10;

How fast is an idea catching on — minus its noise?

The search grammar rides inside SQL as one predicate: exact phrase, exclusion, OR, regex. scry_lex compiles server-side to the relation's own token indexes, so the rest is ordinary SQL — count by month and the adoption curve falls out.

SELECT toStartOfMonth(original_timestamp) AS month, count() AS hits
FROM hackernews.items
WHERE scry_lex('"scaling laws" -crypto')
  AND original_timestamp >= '2018-01-01'
GROUP BY month
ORDER BY month
LIMIT 120;

What does a community actually call the thing?

A regex needs only a short literal run to prune by index before it scans. Match every model name in three months of Reddit comments, extract, and group — a vocabulary census, not a sample.

SELECT arrayJoin(extractAll(lower(body), 'gpt-[0-9]{1,2}(?:\.[0-9])?[a-z]*')) AS model,
       count() AS hits
FROM reddit.comments
WHERE scry_lex('/GPT-[0-9]/')
  AND created_utc >= now() - INTERVAL 90 DAY
GROUP BY model
ORDER BY hits DESC
LIMIT 10;

Where do two ideas touch?

NEAR/60 matches both orders within sixty characters — tighter than co-occurrence in a document, looser than a phrase. Slop ("exact phrase"~3) and typo tolerance (word~1) live in the same grammar.

SELECT created_utc, subreddit, author, leftUTF8(body, 120) AS excerpt
FROM reddit.comments
WHERE scry_lex('lithium NEAR/60 sodium')
  AND created_utc >= now() - INTERVAL 30 DAY
ORDER BY created_utc DESC
LIMIT 5;

Which corners of the archive even talk about it?

One call compiles the same line against every relation with a text plane and counts each — the phrase's distribution across the whole estate, denominators included, before you spend a single scan.

POST /v1/scry/compile
{"q": "\"scaling laws\" -crypto", "relation": "*", "counts": true}

→ 31 relations, counted: openalex.works · academic.catalog · twitter
  · forums · hackernews · bluesky · mastodon · github · …

When exactly did this market change its mind?

Every Manifold bet carries the market probability before and after it. That gives the full price path of a question, live from the source.

SELECT created_at_source, prob_before, prob_after, amount, outcome
FROM manifold.bets
WHERE contract_id = '<market-id>'
  AND is_redemption = 0
ORDER BY created_at_source
LIMIT 1000;

Who used the phrase first, and in which room?

Token-indexed lexical search covers the Reddit archive end to end — and completeness is measured against Reddit's own ID counters and published per relation, so you know when an empty result means absence rather than a gap. Scope first, match second, and every matching row comes back with its provenance.

SELECT id, subreddit, author, created_utc, score, body
FROM reddit.comments
WHERE subreddit = 'Physics'
  AND hasAllTokens(search_text_lc, ['room', 'temperature', 'superconductor'])
ORDER BY created_utc ASC
LIMIT 50;

Text

scry_lex('"exact phrase" -noise /regex/')the whole search grammar as one SQL predicate
a NEAR/50 b · "phrase"~3 · word~1proximity, slop, and typo tolerance, index-pruned
hasAllTokens(search_text_lc, […])token-indexed match over full archives — every row, not a ranked sample
toStartOfMonth · uniq · argMintime series, distinct authors, first observations
JOIN … ON post_key / hn_id / contract_idsource-native keys across relations

Meaning

POST /v1/scry/embed → @handlemint a named vector from any text
scry_contrast_axis(@a, @b)the axis between two ideas
scry_project_onto · scry_debias_vectorkeep, or remove, one component of meaning
scry_seed_centroid([@x, @y, …])a concept built from examples
scry_cosine_similarity · scry_handle_matrixmeasure one pair, or all pairs at once
scry_vector_topk_distanceANN-rank an indexed relation along any of the above

More on the query examples and vector search pages.

Pricing

Try everything free.

Metering engages only when the system is under load — spare capacity carries your queries at no charge. ExoPriors subsidizes personal, non-commercial research. Commercial use, including internal R&D, runs through an enterprise engagement.

Free trial

$0to start

  • $10 of query credit at signup
  • Full access — personal API key, MCP included
  • No card required
Start free trial

Enterprise

Custom

  • Commercial use, including internal R&D
  • Enhanced reliability and dedicated capacity
  • Custom source builds and dataset licensing
Contact us

Give your agent the whole archive.

Signup is instant and the trial starts immediately — no card required.

Scry isn't trying to go viral yet. If it's useful, DM a friend a link.

Send an archive, API, feed, or dataset. Scry ingests, indexes, and embeds it, then exposes it as SQL, search, and vectors. One-time imports, periodic refreshes, and live tails are all in scope.

  1. Source
  2. Structured tables
  3. Search indexes
  4. SQL/API access
[email protected]

Built a parser or crawler for a source Scry should cover? Paste a link to the repository, gist, or documentation. We review submissions by hand and wire good ones into the corpus with credit.

Scry is not supposed to suck. If it does in some way, please tell us how (copies our email), and we will try to quickly adapt and overcome.