Contracts
The Contract & Hook Studio's preset catalogue, with each preset's parameters, defaults, and audit label.
The Contracts category is one tool, contract_presets: the catalogue of every
contract the studio can generate, with each preset's parameters in
constructor order, their types and defaults, the OpenZeppelin files it is built
on, its licence, its wizard feature flags, and its audit label.
It takes no arguments, is public, and is free. Call it before generating
anything — params is per-preset, so the catalogue is the only place to read a
preset's shape from. A required parameter that is missing is refused naming it; an
optional one falls back to its declared default.
audit is the label the deploy path will enforce for a clean generation of
that preset. It is a label on putty's own template, not an external audit of
anything a user has written.
Generation is not here, on purpose
POST /contracts/generate debits the caller's credits for the generate, the
compile, and the tests together. It is not exposed as an MCP tool, and the
omission is a decision:
Putty's only gate for work that spends money is the run approval path — a step
the plan marks as cost does not run until a person says yes. A direct MCP tool
call has no run and therefore no approval to ask through. Exposing generation here
would mean one of two wrong things: charge without asking, or silently not charge
and hand out metered work for free.
A missing tool is the honest third option. Ask the person to run the deploy path, which prices the whole thing together.
community_verify_wallet
Check a wallet against a community's token: read its `balanceOf` and answer with the balance and the holder census. Free — it spends no credits, takes no signature, and posts nothing to any chat. **A wallet with a balance of zero is an error, not a `verified: false`.** That refusal is the product here, so it comes back as an `isError` carrying the sentence the chat would have shown, rather than a 200 the caller has to parse. A chain read that could not answer is a SECOND, different error, and the two are deliberately distinguishable: 'you are not a holder' is an answer and 'we could not check' is a failure, and collapsing them would show a member an error where they should have seen a refusal. `holders` is `null` when the census needs an indexed transfer log this deployment does not own — that is NOT the same as `"0"`, which is counted-and-none. The answer is stored against the caller, so a repeated check of the same wallet is not a fresh chain read on every keystroke. This tool does NOT post to Discord or Telegram: running a bot's command dispatcher, posting a countdown, or auto-posting a receipts update all speak to a third party's service on the user's behalf, and those are not actions a tool call may take unasked.
Studio
The Studio MCP tools: `contract_presets`.