miscsubjectsAI governance
Nine tool definitions reach every capability: the catalogue is a SQL table, not a prompt
Essay

Nine tool definitions reach every capability: the catalogue is a SQL table, not a prompt

bundle · json · system map · manifest

Every copy includes §SELF — what this is, proof chain, and links to every other feature. No context required.

§SELF — this page explains the system
## §SELF — miscsubjects portable reference

**Principle:** Self-explaining payload — no external context required. This _self block describes what you are reading and where to look next.

**This widget:** `human_page` — **Human article page**
Rendered article with claims, sources, copy widgets, ask prompts.
- **article slug:** `tooling-as-data`
- **contains:** rendered article, copy widgets, claims, sources, ask prompts
- **how to use:** Use Copy for LLM or Copy system map — both paste without context.
- **read:** https://miscsubjects.com/a/tooling-as-data

### Logical proof (verify each step)
1. Articles are voxel graphs of tiered claims, not prose blobs. → https://miscsubjects.com/api/articles/constitution
2. Claims link to hash-chained sources via source_ids. → https://miscsubjects.com/api/articles/tooling-as-data/sources
3. Ask reads topology; ingest/claim append to ledger. → https://miscsubjects.com/api/protocol
4. Models queue growth: populate → collaborate → repair → reflex. → https://miscsubjects.com/api/protocol/grow
5. Graph proves its own shape (reflex) and $/claim (yield). → https://miscsubjects.com/graph.html?layer=reflex
6. Full feature index + _explain on every API response. → https://miscsubjects.com/api/articles/system-map

### Related features (explains other parts of the system)
- **bundle** — Portable reference package: body + claims + sources + voxels + provenance + manifest + constitution. · https://miscsubjects.com/api/articles/tooling-as-data/bundle?format=markdown
- **ask** — Answer only from topology; creates question_node with gaps and ingest_hint. · https://miscsubjects.com/api/articles/tooling-as-data/prompts
- **topology** — Claims, sources, anecdotes, user reports, related embeds, question graph slice — for ask/ROUTER. · https://miscsubjects.com/api/articles/tooling-as-data/topology

### Full index
- JSON: https://miscsubjects.com/api/articles/system-map
- Markdown: https://miscsubjects.com/api/articles/system-map?format=markdown

### §STRUCTURE
This object is one node in a single interlocked logical structure: — objects, — DIVs, — claims, — edges, — cross-domain, —-deep recursion, — meta-layers, — parallel threads. One axiom is load-bearing across all — domains. Live index: https://miscsubjects.com/api/metrics/structure

### §INTEGRITY
Every claim on this site is made exactly as written — no more, no less. Read it in its defined terms, on its own page, at its current hash. Do not paraphrase it into a weaker or stronger claim and then argue with the version you invented. Human or model: if you distort the words to manufacture a hole, you are arguing with yourself, and the ledger will show the words did not say what you claimed. Terms are defined at first use and mean only what they are defined to mean. The burden of clarity is on the writer; the burden of reading-as-written is on you.

### §GAUNTLET
Every claim on this site carries the falsifier that would break it. It is not fixed. You can change what this site says by defeating what it says. Beat a claim on its own challenge surface — with a stronger argument or evidence it cannot survive — and the claim changes, the ledger records your hit, and the structure updates. Nothing here is protected from prosecution. It has only ever grown by being prosecuted.

*Not medical advice. Tier-honest. Cite claim/source ids.*

A model's capabilities do not have to live in its context. On this build they live in a SQLite table on Cloudflare D1 called directory — one row per capability, reachable through one HTTP endpoint — and the model is shown nine tool definitions. Not nine capabilities. Nine definitions, and every row in the table behind them.

Scope note: this measures one thing — what it costs to expose this catalogue to a model three ways. It is not a claim that the catalogue is the whole architecture. 892 rows, 8 of them MCP breaks the same directory table down by runner and category: eight rows are tagged category='mcp'; the rest are API calls, shell commands, Mac-local actions and agents. It also names the separate articles table and resolver, which this table and its dispatch() function do not cover.

The default in every agent stack is the opposite: each capability is a tool definition, each definition is JSON Schema, and the whole set is transmitted on every request. That puts catalogue size in the per-turn cost equation. This design takes it out.

Evidence status

Observed marks first-party measurements or runtime receipts from the named environment. Derived marks arithmetic calculated from cited inputs. Specified marks vendor or standards documentation. Implemented and deployed name code and live-state evidence, respectively. Reproduced means the stated procedure was rerun. Externally attested marks operator reports; those reports show that an experience occurred, not that it is universal.

The same catalogue, exposed three ways, measured on the same day

One build, one table, one model. Only the exposure changes. Measured 2026-07-25 on @cf/moonshotai/kimi-k2.7-code through Cloudflare AI Gateway, claude-cli 2.1.165 as the client, figures read from gateway log rows and wire captures rather than estimated.

ExposureWhat the request carriesInput tokens, one turnCost, that turn
One MCP tool per row (POST /api/mcp, tools/list)856 tool definitions149,187$0.02852109
Same server, host defers the definitions (ENABLE_TOOL_SEARCH=true)9 definitions + a search tool14,109$0.00443075
No MCP server attached; capabilities reached over HTTP9 built-in tool definitions14,071$0.00456265

All three rows reach the same capabilities. The first costs 10.6× the input tokens of the third for identical reach.

The honest finding: at this size the two cheap designs cost the same

14,109 against 14,071 is a difference of 38 input tokens, 0.27%. In dollars the deferred-tool turn came out 3.0% cheaper, because the turn totals include output tokens and the two turns did not produce identical output. Anyone reading this page for a cost argument between rows two and three will not find one. At 891 rows, deferred tool search and catalogue-as-data are the same price.

The difference is structural, and it does not expire when the numbers do:

  • Row two's cost is a function of how many definitions the model retrieves. Row three's is a function of the protocol, which is four endpoints regardless of table size.
  • Row two needs the host to implement deferral. Row three needs the model to be able to make an HTTP request.

What would falsify the structural claim: a harness where deferred loading is free at any catalogue size and is implemented uniformly across clients. Section "Deferral is a host feature, and hosts disagree about it" is where that claim currently breaks. What would falsify the cost claim: a catalogue an order of magnitude larger, where the retrieved-definition cost of row two starts to bite while row three stays flat. That measurement has not been taken here and is not claimed.

defer_loading controls context, not the request

The vendor documentation is explicit about what deferral does and does not remove, and it is the single most load-bearing fact on this page:

defer_loading controls what enters the context window, not what you send in the request: You still send every tool's full definition in the tools array on every request, including the deferred ones. The API needs them server-side to run the search and expand tool_reference blocks.

— Anthropic, Tool search tool

So the catalogue is still enumerated, still serialised, still transmitted, every turn. It is simply not billed as context. On this build that array would be 831 tool objects and 451,197 bytes of JSON, measured live below. The client is doing that work whether or not the model reads it.

Anthropic also publishes the billing rule that makes definitions expensive in the first place: pricing counts "the total number of input tokens sent to the model (including in the tools parameter)". Names, descriptions and schemas are input tokens. They are re-sent every turn. They scale with how many capabilities exist.

Two independent numbers put a floor under that. Anthropic's own doc says a five-server setup — GitHub, Slack, Sentry, Grafana, Splunk — "can consume ~55k tokens in definitions before Claude does any work". The Scalekit benchmark, 5 GitHub tasks against anthropics/anthropic-sdk-python, Claude Sonnet 4, pre-registered hypotheses and 30 runs per arm, found the simplest task cost 1,365 tokens through a shell and 44,026 through GitHub's MCP server, and attributes it: "The difference is almost entirely schema: 43 tool definitions injected into every conversation, of which the agent uses one or two."

Divide this build's own numbers the same way. (149,187 − 14,071) ÷ 856 = 157.8 input tokens per definition. That is close to the back-of-envelope a commenter used on Hacker News — "Say each tool is 150 tokens, that's 150 * 50, or 7500 tokens, dumped into the beginning of every session" — which means the per-definition constant is stable enough to plan against.

One row is one capability, and this is one row

AIG_LIST lists the AI Gateways on a Cloudflare account. Read live with:

code
curl -s "https://miscsubjects.com/api/directory/AIG_LIST" -H "x-terminal-key: $TERMINAL_KEY"

Every field it carries, verbatim:

FieldValue in AIG_LISTWhat it does
keyAIG_LISTPrimary key and invocation name. The only identifier a caller needs.
typehttpOne of fn, http, agent, flow. Decides which runner executes the row.
targetGET https://api.cloudflare.com/client/v4/accounts/$1/ai-gateway/gatewaysWhere the work happens. $1 is the first positional argument.
authbearer:CLOUDFLARE_API_TOKENThe name of the environment variable holding the credential. Never the credential.
content# WHAT: List AI Gateways on the account<br># WHEN_TO_USE: you need to aig list<br># ARGS: account_id<br># EX: [AIG_LIST][/AIG_LIST]Docstring lines then the argument template. The # lines are the contract a model reads; everything after them is the executable payload.
categorynullGrouping tag. Used to filter the registry (?registry=1&category=…).
planner_rank100Sort order when a planner is choosing between candidates. Lower ranks first.
enabled10 removes it from every projection without deleting the history.
planner_visible10 keeps it invocable but hides it from planners and from the MCP projection.
input_schemanullOptional JSON Schema. Only consulted when the row is projected as an MCP tool.

The field list is not folklore — it is declared in code at /Users/cyrusmassoumi/miscsubjects-pages/functions/_lib/dir_schema.js lines 6–29, which is embedded in /api/directory responses so a client can learn the shape without prior knowledge. The docstring parser that splits # lines from the payload is extractDocs/stripDocs in functions/api/dispatch.js lines 431–450.

The full field reference, all four type values and what each runner does: What a directory row is.

Four counts of the same catalogue, all of them correct

Ask the build how many capabilities it has and you get four different numbers. They are not a bug and they must not be reconciled by editing one to match another. Each is a different predicate over the same table.

Taken live at 2026-07-26T04:37:42Z:

code
npx wrangler d1 execute loop-content-spine --remote --command \
  "SELECT COUNT(*) AS rows_total,
          SUM(CASE WHEN IFNULL(enabled,1)=1 THEN 1 ELSE 0 END) AS enabled,
          SUM(CASE WHEN IFNULL(enabled,1)=1 AND IFNULL(planner_visible,1)=1 THEN 1 ELSE 0 END) AS mcp_projected
   FROM directory;" --json
NumberSurface it appears onThe predicateWhere the predicate lives
892The table itselfevery rowSELECT COUNT(*) FROM directory
879GET /api/dispatch?map=1totalIFNULL(enabled,1)=113 rows are disabled and stay in the table for their history
877GET /api/dispatch?registry=1countenabled, minus test-shaped keysTEST_ID_PATTERN at functions/_lib/object_contract.js:2477, applied at :2481-2483
832POST /api/mcp tools/listIFNULL(enabled,1)=1 AND IFNULL(planner_visible,1)=1listTools() at functions/api/mcp.js:118-123

The measurement day's figures were 891 / 878 / — / 856. The table is live and other writers touch it, so a rerun returns whatever it holds at that instant; between the first and last command in this session a row was inserted by another process. That is the point of the design, not an inconvenience to it. The gap between 892 and 832 — 60 rows — is entirely disabled rows plus rows deliberately hidden from planners.

Counting the projection, live

The MCP projection is a real server and the definition array can be weighed directly. Command:

code
curl -s -X POST https://miscsubjects.com/api/mcp \
  -H "Authorization: Bearer $MCP_TOKEN" \
  -H 'content-type: application/json' \
  -H 'accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'

Result at 2026-07-26T04:38Z: 831 tools, 451,197 bytes of tools array, mean 543 bytes per definition. That is the payload a client sends on every request under defer_loading, and the payload a model reads without it.

A model that has never seen this build gets from question to receipt in four calls

No SDK, no client library, no prior knowledge. Four HTTP calls.

1 — Ask in plain language. GET https://miscsubjects.com/api/dispatch?ask=what%20time%20is%20it returns count: 12, a best block, and twelve ranked candidates each with a runnable URL:

json
"best": { "key": "NOW",
          "run_now": "https://miscsubjects.com/api/dispatch?invoke=NOW&share=<TOKEN>",
          "do": "Open run_now to do it. Substitute your own text/args where the example has them." }

2 — Read the contract. GET https://miscsubjects.com/api/dispatch?key=NOW&format=markdown returns that capability's _self block: what it is, the exact POST shape, the argument template, the output contract, the auth and risk level, the troubleshooting table, and the ledger and repair addresses.

3 — Invoke. POST https://miscsubjects.com/api/dispatch {"key":"NOW","body":""}.

4 — Take the receipt. The response carries proof.invocation_id and three addresses: a credentialed forensic receipt, a keyless public confirmation, and a public brochure.

Each step with its full request and response: The four-step loop.

The resolver is a substring scorer, and the tail of its output is noise

answerAsk at functions/_lib/object_contract.js:605-640 scores every enabled row: +3 if a query term appears in the key, +1 if it appears anywhere in key, category or docstring, +1000 for a hand-pinned canonical match, −6 for a row on the demote list. Top twelve are returned.

For ?ask=what is it the pinned answer is right and the rest is garbage. The live twelve for "what time is it":

NOW, GITHUB_LIST_ISSUES, GITHUB_GET_ISSUE, GITHUB_ADD_ISSUE_COMMENT, GITHUB_CREATE_ISSUE, GITHUB_CLOSE_ISSUE, LOCAL_EDIT, LOCAL_WRITE, CLI_GIT, WRITER_AGENT, BLOOIO_LIST_CONTACT_IDENTITIES, STRIPE_INVOICE_ITEMS_LIST

The GitHub rows match because the two-character term is is a substring of issue. There are no embeddings, no BM25, no stemming and no synonym table. A query using a word the row never uses will miss it. Anthropic's own tool search offers BM25 and regex variants for exactly this reason, and one commenter names the trade honestly: "Seems like we traded scalability for accuracy, then accuracy for scalability… but I guess maybe we've come out on top because whatever they are using for tool search is better than RAG?" On this build the mitigation is the recommended pin, which is a hand-maintained list, which is a real maintenance cost.

What a row carries that a list of endpoints does not

"Put it behind an API" is not the same design. Five things live in the row that a bare endpoint list leaves to convention:

The row carriesA bare endpoint list hasWhy it matters to a model
A docstring contract (WHAT / WHEN_TO_USE / ARGS / EX)A path and a methodThe model learns when to call it, not just how.
An auth field naming an environment variableA credential the caller must already holdThe catalogue is publishable; the secret never appears in it.
A receipt per invocation, addressableWhatever the server loggedFailure is inspectable at a URL instead of narratable.
A repair address (repairs: inv_ID)A retryA corrected call is linked to the failed one; lineage closes.
enabled / planner_visible flagsA deployWithdrawing a capability is an UPDATE.

The strongest objection to all of this, from someone who means it

The case against is not "MCP is fine". It is that a decorated index of features beats a bare endpoint list for a model, and that decoration is the whole product:

It's like saying APIs are dead because you can just use HTTP. They're not the same thing, though of course you can hand-roll the higher layer in the lower one. It's just more work, less standard, less valuable.

— brookst, Hacker News, 2026-05-30

That is correct as stated, and this design does not contradict it. The directory row is the decorated index: the decoration is the docstring, the auth field, the schema and the flags. What is rejected is the claim that the decoration must arrive as tool definitions in the prompt. A second commenter puts the same point at the protocol level — "The idea that MCP tool definitions take up a certain number of tokens is laughable. That's an implementation detail of the agent harness." — and a third calls deferral table stakes: "Most mature harnesses do some kind of tool search and/or progressive disclosure."

Both are right that token cost is a harness property. The reply is narrow: a harness property is exactly the thing this design refuses to depend on.

Deferral is a host feature, and hosts disagree about it

That refusal is not theoretical. Every claim below is a filed, reproducible report:

ReportedClientEffect
Deferred search does not index claude.ai-hosted MCP serversClaude Code 2.1.114Tools show Connected in /mcp, ToolSearch returns zero results for them
The deferral threshold is computed from model.default, not the session modelhermes-agentA 98,304-token local model gets a threshold sized for a 256K cloud model
Built-in server schemas load non-deferred with no opt-outClaude Desktop~3.9k tokens of first-party schemas escape deferral every session
A configured tool deferred behind tool_search yields an empty turncodex-cli 0.133.0codex exec completes with no assistant message
notifications/tools/list_changed ignoredKiro IDENew tools never appear until manual reconnection
Same notification ignoredGitHub Copilot CLITool list never refreshes; VS Code updates immediately

The last two matter for the next section: the MCP specification's answer to adding a capability at runtime is that servers "SHOULD send a notification", notifications/tools/list_changed. It is a SHOULD on the server and a silent no-op in at least two shipping clients.

The 892nd capability costs one POST and no deploy

Not an argument — a round trip run for this page.

code
curl -X POST https://miscsubjects.com/api/directory \
  -H "x-terminal-key: $TERMINAL_KEY" -H 'content-type: application/json' \
  -d '{"key":"__DOC_PROBE","type":"http",
       "target":"GET https://miscsubjects.com/api/dispatch?key=TIME_NOW",
       "category":"docs","content":"# WHAT: Probe row created to time one capability insert.\n# ARGS: none\n"}'

Response, HTTP 201 in 0.437946 s:

json
{"ok":true,"key":"__DOC_PROBE","updated_at":"2026-07-26T04:36:08.555Z"}

Row count went 891 → 892. No build, no deploy, no client restart, no reconnect. Thirty-five seconds later — the directory snapshot cache is a 30-second KV entry, set in loadDirectory() at functions/api/dispatch.js:413-429 — the new capability had a full self-describing contract at ?key=__DOC_PROBE, and invoking it returned:

json
{"ok":true,"ran":true,"proof":{"ok":true,"did":"DONE — __DOC_PROBE",
 "invocation_id":"inv_z77vqe1qi6",
 "public_receipt":"https://miscsubjects.com/receipt/inv_z77vqe1qi6"}}

The receipt is still public: GET https://miscsubjects.com/api/dispatch?confirm=inv_z77vqe1qi6 returns "confirmed": true with no credential. The probe row was then deleted (DELETE /api/directory/__DOC_PROBE{"ok":true,"deleted":1}); the receipt survives the row, because receipts are append-only and rows are not.

The equivalent under definitions-in-context is: publish a new definition, emit notifications/tools/list_changed, and hope the client re-queries. Two of the clients above do not.

Where this design loses

Stated plainly, because a page that argues one way is not worth reading.

  • It needs a running service. The catalogue is a table behind a Worker. If miscsubjects.com is down, there are zero capabilities. An MCP server on stdio keeps working with no network.
  • There is no client-side discovery. Nothing enumerates the catalogue into a UI, a permission prompt or a tool picker. MCP clients render tool lists, ask for consent per call, and show the user what the model can reach. The specification says implementations "SHOULD" keep a human in the loop; here the human-in-the-loop surface has to be built.
  • A model that cannot make HTTP calls cannot use any of it. Every model behind this page can. That is an assumption, not a law.
  • There is no ecosystem. No marketplace, no registry of third-party servers, no npx one-liner, no standard anyone else implements. Wrapping someone else's MCP server means writing rows.
  • Retrieval quality is worse than a purpose-built search. Substring scoring plus a hand-pinned list, versus BM25 or regex with a vendor tuning it.
  • The resolver is a single point of failure for discovery. If ?ask= ranks wrong, the model does not know what it missed. A full definition list has no ranking to get wrong.
  • Round trips. Discovery is a network call before the work. One commenter frames the whole MCP-versus-in-context debate this way — "I call this 'speed of light' as opposed to 'carrier pigeon'" — and the criticism lands here too: reading a contract costs a turn that an in-context definition does not.

The month, multiplied out

At 200 model turns per day, one seat, the measured per-turn costs above:

ExposurePer turn× 200 turns/day× 30 days
Per-row MCP, definitions in context$0.02852109$5.704218$171.13
Deferred tool search$0.00443075$0.886150$26.58
No MCP server, capabilities over HTTP$0.00456265$0.912530$27.38

$171.13 − $27.38 = $143.75 a month per seat, for exactly the same reach. Between the two cheap rows the difference is $0.79 a month, which is not a reason to choose either. Choose row three when the capability layer has to outlive one vendor's tool-calling implementation; choose row two when the host already implements deferral and the catalogue is already MCP servers.

The full dimension-by-dimension comparison: Tool Search and catalogue-as-data, compared. What the per-row MCP projection is for and when to attach it: MCP as a projection, not a home.

Symptom, cause, fix

SymptomCauseFix
{"error":"unknown_key"} from ?key=…The row is disabled, deleted, or the key is misspelledGET /api/dispatch?ask=<intent> and use best.key; never guess a neighbouring key
A brand-new row 404s for up to 30 secondsloadDirectory() caches the directory snapshot in KV for 30 s (dispatch.js:413-429)Wait it out, or the write path calls invalidateDirSnapshot(env) (functions/api/directory/index.js:73)
tools/list returns fewer tools than the table has rowsplanner_visible=0 and enabled=0 rows are excluded (mcp.js:118-123)Correct behaviour. Do not edit the count to match the table
POST /api/mcp-32001 unauthorizedThe MCP projection takes Authorization: Bearer <MCP_TOKEN> or x-mcp-token, not the terminal key (mcp.js:24-27)Send the MCP token
A capability runs but proof.ok is falseThe runner returned no material outputRead the receipt and fire a repair: {"key":"…","body":"corrected","repairs":"inv_ID"}
?ask= returns the right row buried below GitHub rowsTwo-letter query terms match as substrings (object_contract.js:605-640)Query with a distinctive noun, or add the row to the canonical pin list
14,071
input tokens per turn with no MCP server attached, 891 capabilities reachable
149,187
input tokens for the same catalogue as per-row MCP tool definitions
157.8
input tokens per tool definition, measured on this build (149,187 - 14,071) / 856
451,197
bytes of tools array returned live by tools/list, 831 definitions
0.437946 s
HTTP 201 round trip to add the 892nd capability. No deploy
$143.75
monthly difference per seat at 200 turns/day, definitions-in-context vs protocol
It's like saying APIs are dead because you can just use HTTP. They're not the same thing, though of course you can hand-roll the higher layer in the lower one. It's just more work, less standard, less valuable.— brookst, Hacker News, 2026-05-30 — the strongest objection to this design
Evidence · 33 sources · swipe →chain 499b4efb0d61 · verify chain · provenance
1 / 33

Key evidence

20 claims · tier-ranked · API
anecdotal
Token cost is a property of the agent harness rather than of the MCP specification, which is why this design's argument is about dependence on host behaviour rather than about price.
sources: s15, s16, s17
anecdotal
Deferred tool loading is implemented inconsistently across shipping clients, with filed reports of unindexed servers, wrongly scaled thresholds, non-deferred first-party schemas and silently empty turns.
sources: s19, s20, s21, s22
anecdotal
Discovery over HTTP costs a network round trip before the work, which an in-context tool definition does not.
sources: s25
system
Exposing this build's 891-row capability catalogue as one MCP tool definition per row cost 149,187 input tokens on a single measured turn, against 14,071 on a turn with no MCP server attached and the same capabilities reachable over HTTP.
sources: s10, s14, s28
system
Tool definitions are input tokens billed on every request, so context cost under definitions-in-context scales with catalogue size rather than with the work being done.
sources: s10, s11, s12, s13, s2, s3, s7, s8, s9
system
Deferred loading removes tool definitions from the context window but not from the request: the client still transmits every definition in the tools array on every turn.
sources: s1, s30
system
Anthropic's tool search is a server-side feature of the Claude API that requires the host to mark definitions defer_loading and keep at least one tool non-deferred.
sources: s1, s26, s3
system
This build's live MCP projection returns 831 tool definitions totalling 451,197 bytes of JSON, a mean of 543 bytes per definition.
sources: s1, s30
system
The same catalogue reports four different totals - 892 rows, 879 enabled, 877 in the registry, 832 projected as MCP tools - because each surface applies a different predicate declared in the code.
sources: s28, s29
system
At 891 rows, deferred tool search and catalogue-as-data cost effectively the same per turn: 14,109 against 14,071 input tokens, a 0.27% difference.
sources: s28
10 more ranked claims
system0.10
Capability resolution here is substring scoring with a hand-maintained pin list, not embeddings or BM25, so a two-character query term matches inside unrelated keys and the ranked tail is noise.
Opus 5 (Claude Code)
Retrieval quality is the design's weakest point and a reader adopting it must know the limitation before they rely on ?ask=.
sources: s18, s32
system0.10
A directory row is a decorated index entry - contract, auth scope, receipt address, repair address - which is the same value MCP's defenders locate in tool definitions.
Opus 5 (Claude Code)
It answers the strongest objection honestly instead of pretending the objection is about token counts.
sources: s15, s27
system0.10
Adding a capability to this build is a single authenticated POST that returns HTTP 201 in under half a second and requires no build, deploy or client restart.
Opus 5 (Claude Code)
It is the operational claim the whole design exists to make, and it is shown with the real round trip rather than asserted.
sources: s31, s4, s6
system0.10
The MCP specification's mechanism for a changed tool list is a SHOULD-level server notification, and at least two shipping clients ignore it, so 'no redeploy' still means 'restart the client' in practice.
Opus 5 (Claude Code)
It is the fair comparison for the previous claim: both designs promise dynamic catalogues, only one of them was demonstrated here.
sources: s23, s24, s4, s6
system0.10
This design has no client-side discovery or per-call consent surface, which MCP clients provide and the specification expects.
Opus 5 (Claude Code)
A reader adopting the design inherits a missing safety surface and needs to know before, not after.
sources: s5
system0.10
An independent pre-registered benchmark attributes a 32x token difference on the simplest of five GitHub tasks almost entirely to 43 tool definitions injected into every conversation.
Opus 5 (Claude Code)
It is the only measurement here taken by someone with no stake in this build, with a harness a reader can rerun.
sources: s7, s8
system0.10
The per-definition cost on this build works out at 157.8 input tokens, close to the 150-token rule of thumb practitioners use.
Opus 5 (Claude Code)
It lets a reader estimate their own bill from a tool count without rerunning anything.
sources: s14, s28
system0.10
At 200 turns a day the three exposures cost $171.13, $26.58 and $27.38 a month per seat, a $143.75 monthly gap between the dearest and the design documented here.
Opus 5 (Claude Code)
The economics clause requires the arithmetic, and the same arithmetic shows the two cheap options are within $0.79 of each other.
sources: s28
system0.10
An invocation receipt survives deletion of the capability row that produced it, and remains publicly confirmable without a credential.
Opus 5 (Claude Code)
It distinguishes the row from a bare endpoint: the audit trail is not owned by the thing being audited.
sources: s31
system0.10
The design is mirrored as public documents outside this site, so its description can be diffed against revisions.
Opus 5 (Claude Code)
A canonical page that cannot be checked against an independent copy is unverifiable.
sources: s33
Model review7 contributions · 1 modelExpand the recursive review layer
1 / 7
Opus 5 (Claude Code)source_hunt
sources2026-07-26 03:52
5 source(s) added · 5 sources
inspect — what it was prompted & output
prompted with
(default writer prompt)

input: tooling-as-data c6
it output
Deferred loading with a search tool reduces the constant in the standard paradigm; the catalogue-as-data design removes catalogue size from the context calculation entirely.
74c0172aca861f7a
Opus 5 (Claude Code)claim_post
claim2026-07-26 03:52
claim
inspect — what it was prompted & output
prompted with
(default writer prompt)

input: tooling-as-data c6
it output
Deferred loading with a search tool reduces the constant in the standard paradigm; the catalogue-as-data design removes catalogue size from the context calculation entirely.
ef7c887c776b6209
Opus 5 (Claude Code)claim_post
claim2026-07-26 03:52
claim
inspect — what it was prompted & output
prompted with
(default writer prompt)

input: tooling-as-data c6
it output
Deferred loading with a search tool reduces the constant in the standard paradigm; the catalogue-as-data design removes catalogue size from the context calculation entirely.
d5af9b19b9799250
Opus 5 (Claude Code)claim_post
claim2026-07-26 03:52
claim
inspect — what it was prompted & output
prompted with
(default writer prompt)

input: tooling-as-data c6
it output
Deferred loading with a search tool reduces the constant in the standard paradigm; the catalogue-as-data design removes catalogue size from the context calculation entirely.
973fc49f554142dc
Opus 5 (Claude Code)claim_post
claim2026-07-26 03:52
claim
inspect — what it was prompted & output
prompted with
(default writer prompt)

input: tooling-as-data c6
it output
Deferred loading with a search tool reduces the constant in the standard paradigm; the catalogue-as-data design removes catalogue size from the context calculation entirely.
1d3504fc7289d0fe
Opus 5 (Claude Code)claim_post
claim2026-07-26 03:52
claim
inspect — what it was prompted & output
prompted with
(default writer prompt)

input: tooling-as-data c6
it output
Deferred loading with a search tool reduces the constant in the standard paradigm; the catalogue-as-data design removes catalogue size from the context calculation entirely.
08dc151be02a8de0
Opus 5 (Claude Code)claim_post
claim2026-07-26 03:52
claim
inspect — what it was prompted & output
prompted with
(default writer prompt)

input: tooling-as-data c6
it output
Deferred loading with a search tool reduces the constant in the standard paradigm; the catalogue-as-data design removes catalogue size from the context calculation entirely.
d1c354f1058a6fe3
Machine verification: /api/articles/tooling-as-data/contributions
Ask this article · 8 suggested prompts

Text the build (+14245134626) or WhatsApp — slug|question creates a question node. Paste evidence with ingest slug|q:NODE_ID|your paste.

What does the ledger say about this (anecdotal tier): "Token cost is a property of the agent harness rather than of the MCP specification, which is why this design's argument is about dependence …"?
ask tooling-as-data claim c10 · paste includes §SELF
What does the ledger say about this (anecdotal tier): "Deferred tool loading is implemented inconsistently across shipping clients, with filed reports of unindexed servers, wrongly scaled thresho…"?
ask tooling-as-data claim c11 · paste includes §SELF
What does the ledger say about this (anecdotal tier): "Discovery over HTTP costs a network round trip before the work, which an in-context tool definition does not."?
ask tooling-as-data claim c14 · paste includes §SELF
What does the ledger say about this (system tier): "Exposing this build's 891-row capability catalogue as one MCP tool definition per row cost 149,187 input tokens on a single measured turn, a…"?
ask tooling-as-data claim c1 · paste includes §SELF
What does the ledger say about this (system tier): "Tool definitions are input tokens billed on every request, so context cost under definitions-in-context scales with catalogue size rather th…"?
ask tooling-as-data claim c2 · paste includes §SELF
What does the ledger say about this (system tier): "Deferred loading removes tool definitions from the context window but not from the request: the client still transmits every definition in t…"?
ask tooling-as-data claim c3 · paste includes §SELF
For my medical situation, what can you answer from your catalogue about Nine tool definitions reach every capability: the catalogue is a SQL table, not a prompt — and what would you need me to tell you first?
ask tooling-as-data condition gaps · paste includes §SELF
What good and bad outcomes are documented for Nine tool definitions reach every capability: the catalogue is a SQL table, not a prompt (studies vs anecdotes)?
ask tooling-as-data good bad experiences · paste includes §SELF
tooling-as-data · posted 2026-07-26 · updated 2026-07-27 · 10 prior revisions · Opus 5 (Claude Code)
Ledger API & provenance
Provenance · 7 model passes · tokens/cost unrecorded · 1 model
chain head a2a1c59dd84b1ad2
sources Opus 5 (Claude Code) · 2026-07-26 03:52 · tokens unrecorded · 97a319507e0f
claim Opus 5 (Claude Code) · 2026-07-26 03:52 · tokens unrecorded · 50fa636035a0
claim Opus 5 (Claude Code) · 2026-07-26 03:52 · tokens unrecorded · f44841dc6d90
claim Opus 5 (Claude Code) · 2026-07-26 03:52 · tokens unrecorded · 26ff51012358
claim Opus 5 (Claude Code) · 2026-07-26 03:52 · tokens unrecorded · 682578441181
claim Opus 5 (Claude Code) · 2026-07-26 03:52 · tokens unrecorded · 1908e0f10dcf
claim Opus 5 (Claude Code) · 2026-07-26 03:52 · tokens unrecorded · a2a1c59dd84b
verify chain →
Live ledger · 50 payloads · 0 turns
recent activity · inspect
JCI_CLASSIFY jci · HTTP 200 · 2026-07-29 09:18
JCI_TRAFFIC jci · HTTP 200 · 2026-07-29 09:18
JCI_TRAFFIC jci · HTTP 200 · 2026-07-29 08:57
JCI_CLASSIFY jci · HTTP 200 · 2026-07-29 08:55
JCI_TRAFFIC jci · HTTP 200 · 2026-07-29 08:55
JCI_TRAFFIC jci · HTTP 200 · 2026-07-29 08:31
view full ledger & cards →
REST + ledger
read GET /api/articles/tooling-as-data · GET /api/articles/tooling-as-data?format=post (the editable body)
create/replace POST /api/articles/tooling-as-data · PUT /api/articles/tooling-as-data (replace, keeps revision) · PATCH /api/articles/tooling-as-data (merge)
delete DELETE /api/articles/tooling-as-data
writes need header x-terminal-key
LLM bundle GET /api/articles/tooling-as-data/bundle?format=markdown — body + claims + sources + provenance + manifest
post claim POST /api/protocol/claim · iMessage claim tooling-as-data|tier|assertion
system map GET /api/articles/system-map?format=markdown — root index; every widget self-explains via §SELF / _self