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.

latest turn

$ 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

93%recall@shortlist

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

endpoints in the catalog0
with param schemas (auto-callable)0
vector-embedded for retrieval0
trace lines, live 2-day window0

Daily ingest + tag + embed passes keep the pickers' menu honest.