THE THINKING TOOLS
Watch the router decide.
The hard part isn't calling an MCP — it's picking the right one, building the request, and knowing when to stop. Those decisions are Yeetful's own tools. Here they are, named, live, and getting smarter from settled receipts.
0
turns routed
0
calls settled
0
stops receipted
$0.00
routed spend
The toolbox
Eight decisions sit between your message and a settled call. The model proposes, code disposes, policy decides — each decision is a named tool.
⚙ yeetful-tool-server-picker
Which MCP answers this message — shortlist the catalog, rank by keyword + vector + reputation, pick.
message + saved MCPs → the one server to use
0 picks in the live window
lib/router.ts · lib/retrieval.ts (hybridShortlist, RRF)
⚙ yeetful-tool-endpoint-picker
Which tool on the picked MCP, with which arguments. The planner proposes; deterministic code builds the request and refuses ambiguity.
server + intent → endpoint + validated args
0 planner picks · 0 auto-callable endpoints on the menu
lib/endpoint-planner.ts (menu → pick → buildSmartRequest)
⚙ yeetful-tool-resolve-space
Turns a DAO name into its governance space — "Nate DAO" → nategeier.dcl.eth. One match continues silently; several become a question.
dao name → snapshot space id
0 resolutions in the live window
lib/governance.ts (resolveSpaceByName)
⚙ yeetful-tool-resolve-token
Turns a token symbol into its canonical Base address — merged official Uniswap + Coingecko lists, no guessed addresses ever.
symbol → 0x… on Base
two official lists merged · zero guessed addresses
lib/token-list.ts (merged official lists)
⚙ yeetful-tool-venue-picker
Where a swap executes — CoW by default (solver-routed, MEV-protected), Uniswap when you name it.
swap intent → CoW | Uniswap
CoW by default · Uniswap when you name it
app/api/chat (swap fast-path) · lib/cow-build.ts · lib/uniswap-venue.ts
⚙ yeetful-tool-guardrails
Checks every transaction before it reaches your wallet: recipient, min-out, balance, allowance, validity. Signables break the loop — nothing auto-executes.
built tx → sign button or refusal
0 sign surfaces raised in the live window
lib/tx-guardrails.ts · lib/cow-guardrails.ts
⚙ yeetful-tool-policy-gate
Allow or deny every spend against your grant — allowlist, per-call, per-day, lifetime caps. One gate, every path; denials are ledgered, not swallowed.
payment attempt → allow | deny (receipted)
0 allowed · 0 stopped — every one receipted
lib/spend-grant.ts (checkGrant)
⚙ yeetful-tool-house-synthesizer
Who writes the answer when no paid inference is in scope — the house model, at $0, over fresh tool results.
tool results → the answer ($0.00)
0 answers written at $0.00
app/api/chat (HOUSE_INFERENCE)
Decision anatomy — live
The last routed turn, line by line, with the tool that made each decision. Same trace the chat terminal streams — here it's annotated.
$ idle — route a message in chat and its anatomy lands here.
Which MCP for what
Every settled receipt, grouped by what it was for and which server earned it. Stopped calls — policy denials and failures — don't disappear; they route to the gate.
No receipted calls yet.
Self-updating
The tools learn from every receipt: settle rates rerank tomorrow's menus, failures become tracked incidents, and the routing eval keeps score.
Eval scoreboard
57% → 93% across 4 retrieval upgrades · answered@full 77%
Settle rate → menu rank
Not enough receipts yet.
Reputation from settled receipts feeds yeetful-tool-server-picker's ranking.
Failure → incident → fix
0
open
0
fix PR
0
resolved
Repeated failures dedupe into incidents; dead hosts sink in the picker's ranking.
The map keeps growing
Daily ingest + tag + embed passes keep the pickers' menu honest.