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.
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.
What an unlabelled layer may hand you
pinned at d26063717aaf… — the vendor's own repository, at a commit that cannot move.
What web3ctx returns, labelled
pinned at e1994e2eb7ee… — the vendor's own repository, at a commit that cannot move.
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.
No local process, nothing to update, no key, no signup. Add the endpoint and go.
claude mcp add --transport http web3ctx \ https://mcp.scarai.xyz/mcp
{ "mcpServers": { "web3ctx": { "url":
"https://mcp.scarai.xyz/mcp" } } }
Settings → Connectors → Add custom connector → paste the URL.
stdio-only clients:
npx mcp-remote \ https://mcp.scarai.xyz/mcp
| tool | what it does |
|---|---|
| web3_search | ranked, version-scoped units — plus the human-validated recipe when the question earns one |
| web3_grep | exact identifier lookup across the corpus |
| web3_fetch | full bodies by stable selector, cursor paging for long content |
| web3_deps | dependency closure, stepped by depth |
| web3_lookup | typed records — deployment addresses, ABIs, EIPs — or an honest NOT_FOUND |
“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.jsonRetrieval layers serve superseded APIs beside current ones, unlabelled. The literature calls it deceptive grounding: every citation check passes; the user loses.
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.
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.
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.