ScarAI · web3ctx

The last mile before
your agent signs.

Human-validated, chain-run integration recipes for web3 — served version-true, with citations you can re-fetch and receipts you can check on-chain. The corpus exists to make the recipes reachable and version-scoped.

One question, two true answers

Both of these are real. Only one is yours.

A developer asks an agent to connect a wallet with wagmi. Two hooks answer to that description, both live in the vendor's own repository, both fetchable at a commit. A retrieval layer that does not carry the version hands over whichever ranked higher — and every citation check passes.

useAccount — wagmi@2

What an unlabelled layer may hand you

pinned at d26063717aaf… — the vendor's own repository, at a commit that cannot move.

useConnection — wagmi@3

What web3ctx returns, labelled

pinned at e1994e2eb7ee… — the vendor's own repository, at a commit that cannot move.

The difference

Version identity resolves to a SQL predicate before any search runs, so the off-version hook cannot enter the payload unlabelled. When both are relevant, both are returned and both are named.

Captured live from the authless endpoint on 2026-08-28. This is T4 of the six verified traps, frozen in the benchmark pre-registration before any tool ran — the full matrix, every arm, including our own failing row →
Install

It's a URL, not a package.

No local process, nothing to update, no key, no signup. Add the endpoint and go.

Claude Code

claude mcp add --transport http web3ctx \
  https://mcp.scarai.xyz/mcp

Cursor / any mcp.json client

{ "mcpServers": { "web3ctx": { "url":
  "https://mcp.scarai.xyz/mcp" } } }

Claude Desktop / claude.ai

Settings → Connectors → Add custom connector → paste the URL.

stdio-only clients:

npx mcp-remote \
  https://mcp.scarai.xyz/mcp
Free, forever, on the open route. Higher limits: connect to /mcp/oauth instead and sign in with GitHub — free, 10× the daily budget.
The surface

Five tools, deliberately terse

toolwhat it does
web3_searchranked, version-scoped units — plus the human-validated recipe when the question earns one
web3_grepexact identifier lookup across the corpus
web3_fetchfull bodies by stable selector, cursor paging for long content
web3_depsdependency closure, stepped by depth
web3_lookuptyped records — deployment addresses, ABIs, EIPs — or an honest NOT_FOUND
A real answer

Not an example. The bytes it returned.

web3_search · query only · authless — no key, no signup, the route a stranger uses · 2026-08-28

“how do I bridge USDC with CCTP”

{
  "intent": "lookup",
  "recipe": {
    "project_id": "cctp",
    "version": "2",
    "recipe_type": "usdc-bridge-send",
    "last_validated": "2026-08-07",
    "validated_by": "farseen (github: FarseenSh)",
    "receipts": {
      "validated_on": "2026-08-07",
      "validated_by": "farseen (github: FarseenSh)",
      "checks": [
        "attest",
        "test"
      ],
      "chains_exercised": [
        "base-sepolia",
        "arbitrum-sepolia"
      ],
      "on_chain": [
        {
          "kind": "txHash",
          "hash": "0xd4b4e6395f52ad726dd6062e7a7ec47a2d3a7875d36f20fbb154cde756a3d0f5",
          "role": "approve",
  … 57 lines omitted — the rest of the receipts and the validated recipe body

  "hits": [
    {
      "selector": "circle-fin-provider-cctp-v2@latest::index.d::ChainDefinitionWithCCTPv2",
      "source_url": "https://unpkg.com/@circle-fin/provider-cctp-v2@1.11.0/index.d.cts#L318-L355",
      "snippet": "/**\n* Chain definition with CCTPv2 configuration.\n* @alias ChainDefinitionWithCCTPv2\n* @extends ChainDefinition\n* @category Types\n* @description Represents a chain definition that includes CCTPv2 configuration. This is useful for typescript consumers to narrow down the type of chain definition to…",
      "project": "circle-fin-provider-cctp-v2",
      "version": "latest",
      "version_defaulted": false,
      "last_validated": "2026-08-22T03:06:37Z",
      "as_of": "2026-08-20T23:25:41.820Z",
      "provenance_kind": "artifact",
      "pin_ref": "@circle-fin/provider-cctp-v2@1.11.0"
    },
    {
      "selector": "circle-fin-provider-cctp-v2@latest::index.d::ActionMap",
  … 135 lines omitted — nine more citations, each with its own pin

  Full payload, byte-for-byte, as the public endpoint returned it on 2026-08-28:
  evidence/showcase/cctp-search.json
39 of 231 lines, in two verbatim windows — nothing re-ordered, and every skip states its size. The whole response is 26,191 bytes, sha256 bc58a9feba1f6309…, published in the evidence set so you can diff it against your own call.
Why this exists

Every claim from a real document — about the wrong version.

The failure, named

Retrieval layers serve superseded APIs beside current ones, unlabelled. The literature calls it deceptive grounding: every citation check passes; the user loses.

The fix, structural

Version identity resolves to a SQL predicate before any search runs, so off-version content cannot enter the payload. When evidence is missing, the server abstains and says what would resolve it — it never guesses.

The moat, human

Integration recipes run by a person against live chains, stamped with who ran them and when, served with on-chain receipts. The footguns that live in NatSpec, revert strings and peer ranges — not in any docs site.

What's inside

Numbers injected at build time, never typed.

Corpus
632 integration projects + 1,193 specification ids (609 ERC + 583 core EIP + 1 in both repos) = 1,825 total
the pair, always — a bare total does not publish
Units
1,346,624
each labelled project@version with a pinned, re-fetchable source
Recipes
26
validated on-chain by a person, served with checkable receipts
The evidence

Every measurement, including the ones we lost.

Pre-registered benchmarks against five other tools, immutable-citation counts, the precision run, and every experiment that failed its own gate. Our own failing rows publish beside everyone else's, and the competitor comparison lives there rather than here — a landing page is not where a measurement should be read.