The tools
What an agent connected to Walletguide can actually call, how the tools are named, and which ones are marked destructive.
One tool per API route, generated from the same OpenAPI document as the endpoint reference. A tool takes the parameters its route takes.
Naming
<resource>_<action>, from the URL shape:
| Route | Tool |
|---|---|
GET /wallets | wallets_list |
GET /wallets/{walletId}/assets | assets_list |
GET /wallets/{walletId}/assets/{id} | assets_get |
POST /wallets/{walletId}/transactions/search | transactions_search |
POST /wallets/{walletId}/data/netWorthTimeSeries | data_netWorthTimeSeries |
How many
47 read-only. With writes enabled, 149.
That gap is the argument for leaving writes off unless you need them: the read-only catalogue is roughly 12k tokens of context against 40k, spent before the model has read a single number of yours.
A grant without write access is not shown the mutating tools. They are absent from the catalogue rather than present and refused, so an agent never plans around a tool it cannot use.
Annotations
Every tool carries the three MCP hints, always set:
readOnlyHint— true for the 47destructiveHint— true for deletes, bulk deletes, and mergesopenWorldHint— always false; everything is scoped to one wallet
A merge is marked destructive even though it is a POST, because folding one thing into another deletes the original. A client that asks before running a destructive tool will ask for those.
The ones worth reaching for
data_*— the seventeen slices. Any question about a total, an average or a series belongs here.transactions_search— a POST that only reads; its filters are too structured for a query string. It is available to read-only grants for exactly that reason.wallets_list— the first call an OAuth-connected agent should make, since a grant can reach several wallets and tools need to be told which.
Results
Every tool answers { result: … }, with the route's response inside, unchanged. The envelope is declared in the output schema and the contents are not — describing every response shape put outputSchema at nearly half of the whole catalogue payload, which is context better spent on the inputs that tell a model what to send.