Aave
Server Details
Aave's official MCP
- Status
- Healthy
- Uptime
- 100.0% over 62 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 56 tools
Tool families are separated by resource and layer (markets vs reserves vs hubs/spokes, positions vs position items, read vs prepare vs preview), and descriptions explicitly cross-reference the correct tool. With 56 tools, subtle overlaps remain—get_started vs get_aave_guide, several history tools, and generic prepare_action vs prepare_order—so selection sometimes requires careful reading.
All names are snake_case and verb-first, with a predictable verb family: get_ for reads, prepare_ for unsigned transaction builders, preview_ for simulation, and cancel_/submit_/search_ for other actions. The meta tools get_started and get_aave_guide are minor deviations, but the pattern is otherwise consistent throughout.
56 tools is far above the well-scoped 3-15 range; even for a multi-product DeFi protocol, this creates a large selection surface for an agent. The set is broad, but consolidation of history/read and prepare variants would improve usability.
Core lending lifecycle, order/quote lifecycle, vaults, sGHO, and portfolio/governance reads are covered, so most workflows have a path. However, governance is read-only with no vote-preparation tool, and Safety Module staking/unstaking/claiming has no prepare action, leaving those surfaces as dead ends.
Available Tools
56 toolscancel_orderCancel an orderADestructiveIdempotentInspect
No version argument. Cancel an open order. Two routes: pass 'signature' (signed over what prepare_cancel_order returned) to relay a gasless cancellation - state-changing, and the route an intent order takes; omit 'signature' entirely for the on-chain route, which returns the cancel transaction for the user to sign and send, the route an order that went on chain (a native-token sell) takes. The server never signs.
| Name | Required | Description | Default |
|---|---|---|---|
| orderId | Yes | The order id (from submit_signed_order's receipt, get_order_status or get_pending_orders). | |
| signature | No | The user's cancellation signature (0x...) over prepare_cancel_order's typed data. Omit the argument entirely to get the on-chain cancel transaction instead. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses meaningful behavioral details beyond the annotations: the gasless route is state-changing, the on-chain route returns a transaction for the user to sign and send, and the server never signs. This significantly clarifies the division of responsibility between the server and user. It does not contradict the provided annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but efficient: the no-version note, core action, route logic, and server-signing boundary are each given in a few concise sentences. Every statement earns its place, and the most important routing information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a state-changing tool with no output schema and two distinct routes, the description covers prerequisites, route selection, and the on-chain route's return behavior. It does not describe the gasless route's success/error output in detail, but annotations cover idempotency and destructive behavior. Overall, an agent has enough context to call this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by explaining the semantic difference between providing 'signature' versus omitting it, tying each route to order types (intent vs native-token sell). This enriches the schema's parameter descriptions rather than merely repeating them.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool cancels an open order, naming the resource and action precisely. It further distinguishes the two execution routes and references prepare_cancel_order, which differentiates this execution step from the preparation step. The title reinforces the purpose as well.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives an explicit route-selection rule: pass 'signature' for the gasless route used by intent orders, or omit it for the on-chain route used by native-token sells. It also implicitly establishes prepare_cancel_order as a prerequisite. However, it does not explicitly name exclusions or alternatives beyond prepare_cancel_order, such as when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_aave_guideAave protocol & usage guideARead-onlyInspect
Applies to both versions. Protocol and usage guidance for building Aave flows correctly. Read the relevant topic before constructing an action. Topics: overview, v4, v3, positions, health-factor, risks, ids, amounts, prices, signing, swaps, leverage, gho, safety-module, portfolio, governance, rewards, tools, docs. Also the place to come when no tool seems to fit what you were asked for: send 'lookingFor' and this answers with the full capability list rather than leaving you to guess from tool names. For deep protocol docs, point the user to https://docs.aave.com.
| Name | Required | Description | Default |
|---|---|---|---|
| topic | No | Guide topic (default overview). Read 'v3' or 'v4' before building an action on that version. | |
| lookingFor | No | Send this when you looked for a tool to do something and did not find one, or when a flow dead-ended: describe what you were trying to do, in a few words. It returns the full capability list so you can check whether it exists under a name you did not guess, and records the gap when it does not. Omit the argument entirely when you already know which topic you want. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered; the description adds that the tool returns a full capability list and 'records the gap' when a capability is missing, which is useful non-obvious behavior. The 'records the gap' phrasing hints at a side effect not reflected in the annotations, but it reads as telemetry rather than data mutation, so no contradiction is flagged.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core instruction and the fallback behavior before the topic enumeration. The 19-topic list duplicates the schema enum verbatim and is the one wasteful element in an otherwise tight definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Both parameters are optional and fully described in the schema, and the description explains what the tool returns (guidance content or a capability list) despite there being no output schema. Only minor ambiguity remains about the shape and length of the returned guide text.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the lookingFor parameter is already richly documented in the schema, including when to omit it. The description reinforces topic selection ('Read the relevant topic') and lists topic names, but the list merely duplicates the enum, so it adds little beyond structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource: protocol and usage guidance for building Aave flows, with an enumerated topic set. It is clearly differentiated from every sibling, all of which are data-fetch or action-preparation tools, and it additionally declares itself the fallback when no sibling fits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit timing: 'Read the relevant topic before constructing an action,' plus an explicit alternative path ('send lookingFor' when no tool seems to fit) with the condition that selects it. It also routes deep protocol questions out to docs.aave.com, so the agent knows when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_apy_historyGet APY historyARead-onlyInspect
Historical supply or borrow APY for a reserve over time, on v3 or v4. Returns a time-series of {date, apyPct}, where apyPct is a percent ('3.32' means 3.32%). Each point is an average over its sampling interval, and the interval widens with the window (hourly for 'day', coarser above that), so a series is not directly comparable to the instantaneous rate from get_reserve_details. Use get_markets first for the reserveId (v4) or market+token (v3). When comparing v3 against v4 for the same asset (a migration decision), read the history on both sides: a spot-rate gap can be one side's momentary spike.
| Name | Required | Description | Default |
|---|---|---|---|
| side | No | Which rate (default supply). | |
| token | No | v3 only: underlying token address. | |
| market | No | v3 only: market pool address (from get_markets). | |
| window | No | Time window (default week). | |
| chainId | No | v3 only: chain id (positive integer). | |
| version | No | Optional: inferred from the reserve selector ('reserveId' is v4, 'market'+'token'+'chainId' is v3). Send it to be explicit, or if you somehow set both. | |
| reserveId | No | v4 only: the reserveId from get_markets, copied verbatim. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and non-destructive. The description adds meaningful behavioral detail beyond that: the return format (time-series of {date, apyPct}), the meaning of apyPct as a percent, the averaging semantics per sampling interval, and the warning that series are not directly comparable to instantaneous rates. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is appropriately sized—every sentence carries information: purpose, return format, sampling semantics, usage prerequisite, and migration caveat. It is front-loaded with the core purpose and structured logically, with no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 7 parameters and a v3/v4 split, the description covers everything an agent needs: how to obtain the required identifiers, which parameters apply to which version, the return format (no output schema, so this is essential), and the comparison caveat. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds value by explaining the v3/v4 selector relationship (reserveId vs market+token+chainId) and advising to use get_markets first, which helps agents assemble the correct parameter set. It doesn't detail every parameter, but the schema already does, so this exceeds the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action (get historical APY) on a specific resource (a reserve's supply or borrow rate), scoped to v3 or v4, and explicitly distinguishes itself from the instantaneous rate tool get_reserve_details. The verb-resource combination is clear and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives concrete prerequisites ('Use get_markets first for the reserveId (v4) or market+token (v3)') and explains when to use this tool versus the alternative (spot-rate comparison with get_reserve_details, and migration comparison guidance). The when-to-use is explicit and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_asset_historyOne asset's price, supply or borrows over time (v4)ARead-onlyInspect
v4 only. One asset across every v4 reserve that holds it: 'price' is its oracle price per sample, 'supply' and 'borrow' are the amounts plus the APY spread across those reserves (averageApyPct with the highest and lowest at that moment). Not the same question as get_apy_history, which is one reserve's own rate - an asset sits in several reserves at once, so a wide gap between highestApyPct and lowestApyPct is the point, not noise. The asset is named by its token address and chain, and get_markets does NOT return a token address, so do not look for one there: get_multichain_asset takes a symbol and returns the token address per chain in one call, and get_hub_assets returns it per hub asset.
| Name | Required | Description | Default |
|---|---|---|---|
| token | Yes | Token address, 0x-prefixed (40 hex chars). | |
| metric | Yes | Which series: oracle price, supplied amount, or borrowed amount. | |
| window | No | How far back to go (default week). | |
| chainId | Yes | Chain the token is on, e.g. 1 for Ethereum. Required: the same symbol exists on several. | |
| version | No | Optional, and only 'v4': this tool exists on v4 only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds valuable behavioral context: the asset spans multiple reserves, supply/borrow include an APY spread, and a wide gap between highestApyPct and lowestApyPct is meaningful rather than noise. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is longer than average, but every sentence carries substantive information: scope, metric semantics, differentiation from get_apy_history, and token-address lookup guidance. It is front-loaded with 'v4 only' and the core definition, so an agent gets the essential meaning early.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 5 parameters, a complete schema, and read-only annotations, the description covers what an agent needs: cross-reserve behavior, metric meanings, the v4-only restriction, token address sourcing, and how it differs from the nearest sibling. No critical gap remains for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema fully documents all parameters, so the baseline is 3. The description adds semantic depth to the 'metric' parameter by explaining exactly what each value means (oracle price per sample vs. amounts plus APY spread), which exceeds the schema's short enum labels.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: retrieving one asset's price, supply, or borrows over time on v4. It further clarifies that the asset is tracked across every v4 reserve that holds it, and explicitly distinguishes this from get_apy_history, making the purpose precise and non-confusable with siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: it directly contrasts with get_apy_history and explains why the two questions differ. It also gives actionable routing advice for obtaining a token address, warning that get_markets does NOT return one and pointing to get_multichain_asset and get_hub_assets instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_chainsGet supported chainsARead-onlyInspect
List chains Aave supports, on v3, v4, or both. A chain carrying 'notServed': true is one this API holds no market on: every market, position and rewards read comes back empty for it, and that emptiness says nothing about the chain itself. Its gateway addresses read 0x0 for the same reason, so do not send a transaction to one. Every chain without the flag has markets to read.
| Name | Required | Description | Default |
|---|---|---|---|
| version | No | Protocol version (default all). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/destructiveHint annotations, the description discloses important runtime behavior: notServed chains return empty market, position, and rewards reads, gateway addresses read 0x0, and transactions to such gateways should not be sent. This materially changes how an agent should interpret and act on results. No contradiction with annotations exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose in the first sentence, and each subsequent sentence adds a distinct, safety-relevant behavior. There is no filler or redundant restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with one optional parameter and no output schema, the description explains both the returned flag semantics and the practical consequences for downstream reads/transactions. This is enough for an agent to call the tool correctly and interpret its results without additional documentation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, with the version parameter already documented as an enum of v3/v4/all and default all. The description only restates this as 'on v3, v4, or both,' adding no new parameter-level semantics. Baseline 3 is appropriate because the schema carries the full parameter burden.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'List chains Aave supports, on v3, v4, or both.' This clearly distinguishes the tool from sibling get_* tools by its unique chain-list resource and version scope. The title reinforces the intent without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it—when an agent needs the list of chains and their served/not-served status—but it does not explicitly name alternatives or state when not to use it. The rich flag explanation gives clear context for interpreting results, but no exclusionary guidance relative to sibling tools is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_emode_categoriesGet v3 eMode categoriesARead-onlyInspect
v3 only. eMode groups correlated assets (ETH-correlated, stablecoins) so they borrow against each other at a higher LTV, raising borrowing power at the cost of restricting which assets the position may hold. Returns each market's categories with the 'categoryId' that prepare_set_emode takes, its LTV and liquidation thresholds, and which symbols are in it. Narrow with 'symbols' (e.g. ['USDC']) to get just the categories that asset is in - unfiltered this is every category on every chain. Markets with no matching category are left out entirely. v4 has no eMode: it replaces it with risk premium and dynamic config.
| Name | Required | Description | Default |
|---|---|---|---|
| chainId | No | Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain. | |
| symbols | No | Optional token symbols to return, e.g. ['USDC','GHO']. Case-insensitive. Strongly preferred when you know the asset: a chain has ~70 reserves and listing them all is a large response. | |
| version | No | Optional, and only 'v3': this tool exists on v3 only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses that markets with no matching category are omitted, that unfiltered queries return every category on every chain, and that responses can be large enough to make 'symbols' strongly preferred. There is no contradiction with the read-only annotation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is focused and every sentence earns its place: version gating, eMode behavior, return fields, filtering advice, and the v4 exclusion. There is no repetition of schema content and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by itemizing the returned fields (categoryId, LTV, liquidation thresholds, symbols) and explaining the omission behavior. It also covers parameter behavior and version constraint, leaving an agent with enough to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3, but the description adds meaningful semantics: symbols is case-insensitive and strongly preferred for large chains, chainId omission covers all chains, and the return value includes the categoryId that feeds prepare_set_eMode plus LTV and thresholds.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific resource ('eMode categories'), a specific verb ('Returns'), and the exact scope ('v3 only'). It distinguishes itself from siblings by explicitly calling out prepare_set_emode as the consumer of its categoryId and by noting v4 has no eMode.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear when-and-how guidance: use it to discover eMode categories, LTV, and thresholds for v3, narrow the response with 'symbols', and omit chainId for all chains. It also says v4 should not use this tool, but it does not explicitly name other tools as alternatives for non-eMode reserve data.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_governance_proposalGet an Aave DAO proposalARead-onlyInspect
Takes no 'version' argument (DAO governance is not per-market; Governance V3 is unrelated to Aave v3/v4 markets). Full detail for one Aave DAO governance proposal: state, author, vote tallies, quorum, timings and the transaction hash of each lifecycle step. 'quorumMet' and 'differentialMet' are the two conditions a proposal must meet to pass. Vote tallies and quorum are both in AAVE, so they compare directly. The long IPFS write-up is omitted unless includeDescription is true.
| Name | Required | Description | Default |
|---|---|---|---|
| proposalId | Yes | Proposal id as a decimal string, e.g. '508'. From search_governance_proposals. | |
| includeDescription | No | Include the full proposal markdown from IPFS (default false). It runs to many KB; the short description is always returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses substantive behavioral details: the returned condition fields 'quorumMet' and 'differentialMet', the fact that vote tallies and quorum are denominated in AAVE and directly comparable, and the IPFS omission behavior controlled by includeDescription. This prepares the agent to interpret the result and understand returned data semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Each sentence earns its place: the first preempts a common misuse, the second states the tool's purpose and return content, the third explains pass conditions, and the fourth clarifies IPFS handling. The description is compact, front-loaded, and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description compensates by listing the key response elements, explaining units and pass conditions, and flagging the optional heavy payload. Combined with the well-described parameters and read-only annotations, an agent has enough to invoke the tool correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the parameter descriptions are already rich, so the baseline is 3. The description adds value by warning not to pass a 'version' argument at all, which prevents a plausible parameter hallucination, and by explaining the includeDescription behavior in context. It mostly complements rather than expands the schema, hence a 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies the resource and verb: 'Full detail for one Aave DAO governance proposal' and enumerates what is included (state, author, vote tallies, quorum, timings, transaction hashes). It also disambiguates from market-specific governance by explicitly stating Governance V3 is unrelated to Aave v3/v4 markets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives useful exclusion guidance: it takes no 'version' argument because DAO governance is not per-market, which prevents a common misuse. It implies this tool is for retrieving one proposal's full detail, but it does not explicitly name alternative sibling tools such as search_governance_proposals or get_proposal_votes, so it stops short of the strongest routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hub_assetsGet the assets a v4 hub carriesARead-onlyInspect
v4 only. The assets held by one Aave v4 hub, with hub-wide supplied and borrowed totals, rates and utilisation. Get hubId from get_hubs (or the hubAddress on get_reserve_details). This is hub-level accounting; for what a user can actually supply or borrow, use get_markets, which is per spoke.
| Name | Required | Description | Default |
|---|---|---|---|
| hubId | Yes | hubId from get_hubs. | |
| version | No | Optional, and only 'v4': this tool exists on v4 only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and non-destructive. The description adds useful behavioral context by clarifying this is v4-only, hub-level accounting, and that it returns aggregate supplied/borrowed totals, rates, and utilisation. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact, front-loaded sentences. The v4-only constraint is placed first, followed by what the tool returns, how to obtain the required parameter, and when to choose an alternative. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple parameter set, read-only annotations, and the absence of an output schema, the description fully covers what the tool returns, how to get the required input, and when to avoid it in favor of get_markets. Nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already documents both parameters fully, so baseline is 3. The description adds value by clarifying where to get hubId (from get_hubs or hubAddress on get_reserve_details) and reinforcing that the version parameter is optional because the tool only exists on v4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb and resource: get the assets held by one Aave v4 hub, including supplied and borrowed totals, rates, and utilisation. It also distinguishes itself from get_markets by explicitly marking this as hub-level accounting.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage guidance: use get_hubs (or get_reserve_details) to obtain the hubId, and use get_markets instead when the agent needs per-spoke user-level supply/borrow data. This makes the appropriate context and alternative crystal clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_hubsGet v4 hubsARead-onlyInspect
v4 only. Aave v4 hubs: a hub holds the liquidity and global accounting that user-facing spokes draw from. Returns each hub's hubId, address, chain and totals. Pass a hubId to get_hub_assets for the assets it carries. Omit chainId to cover every supported v4 chain.
| Name | Required | Description | Default |
|---|---|---|---|
| chainId | No | Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain. | |
| version | No | Optional, and only 'v4': this tool exists on v4 only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond annotations: the conceptual role of a hub, the return fields, the chain-scoping behavior, and the sibling routing. This goes meaningfully beyond what annotations alone provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three focused sentences with no filler. The v4-only constraint is front-loaded, followed by the core definition, return contents, sibling guidance, and optional parameter behavior. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only tool with two optional parameters, the description is complete: it explains what a hub is, what the tool returns, how to restrict by chain, and where to go for hub assets. No output schema exists, but the description states the return fields sufficiently. The annotations and schema cover the remaining context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already well documented. The description reinforces chainId behavior and the v4-only constraint, but does not add substantial new parameter semantics beyond what the schema already provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Returns') with a clear resource ('Aave v4 hubs') and the exact fields returned (hubId, address, chain, totals). It also differentiates itself from the sibling get_hub_assets by explicitly routing hubId lookups there, making the tool's purpose unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage guidance: 'v4 only', 'Omit chainId to cover every supported v4 chain', and points to get_hub_assets as the alternative when a specific hub's assets are needed. This clearly tells the agent when to use this tool versus a closely related sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_interest_rate_modelThe interest rate curve for an asset (v4)ARead-onlyInspect
v4 only. The rate curve for one hub asset: borrow and supply APY at each level of utilisation, as points along the curve the protocol actually uses. This explains a rate rather than reporting it - where the kink sits, how steeply borrowing gets more expensive past it, and what the rate would become if utilisation moved. Use it before a large supply or borrow that would shift utilisation, because the current rate from get_reserve_details is one point on this curve and not what a large position would pay. 'hubAssetId' comes from get_hub_assets.
| Name | Required | Description | Default |
|---|---|---|---|
| version | No | Optional, and only 'v4': this tool exists on v4 only. | |
| hubAssetId | Yes | hubAssetId from get_hub_assets (not a token address). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description adds valuable behavioral context: it provides actual curve points used by the protocol, and explains how to interpret the curve (kink location, steepness, hypothetical rates). This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose and structured logically: what it returns, why it's useful, when to use it, and how to get the parameter. Every sentence earns its place without redundancy, balancing clarity with brevity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with one required parameter and no output schema, the description fully covers what, why, when, and how. It explains the output nature (points on the curve), the practical use case, and the parameter source. Nothing essential is missing for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with clear descriptions for both parameters (version enum and hubAssetId source). The description repeats that hubAssetId comes from get_hub_assets but adds no new information beyond the schema. Baseline 3 is appropriate since the schema already carries the semantic load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns the rate curve for a hub asset, explaining borrow and supply APY across utilisation levels. It distinguishes itself from get_reserve_details by emphasizing it explains the curve rather than reporting a single point, making its purpose unambiguous and differentiated from siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs when to use: before a large supply or borrow that would shift utilisation. Names the alternative get_reserve_details and explains why it's insufficient for large positions. Also directs the user to get_hub_assets for the correct parameter source, leaving no ambiguity about usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_leverage_quoteQuote a leveraged position (v4)ARead-onlyInspect
v4 only. Quote opening or increasing a leveraged position in one atomic order: the debt reserve is flash-loaned, swapped into the collateral reserve and supplied, and the debt is drawn against it to repay the flash loan. Both reserves are reserveIds from get_markets in this session, on the same spoke: pick a debtReserve whose 'quotableAs' lists leverageDebt and a collateralReserve whose 'quotableAs' lists leverageCollateral. Returns the quote with a quoteId (feeds preview_action and prepare_order), the approvals to sign first, and maxSafeMultiplier - the multiplier at which the position becomes liquidatable, which a requested multiplier must stay under. Nothing is committed until the user signs, so state the plan rather than asking permission to quote it.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Wallet address (0x, 40 hex) of the wallet that will sign, as the user named it in this session. If no wallet has been named, ask for it; never substitute a placeholder, which is rejected. | |
| version | No | Optional, and only 'v4': this tool exists on v4 only. | |
| multiplier | No | Target exposure multiplier (target collateral / entry equity), e.g. '2.5'. Strictly greater than 1, and it must stay under the quote's maxSafeMultiplier. Omit the argument entirely to be quoted at a multiplier the backend picks from how closely the two assets track each other. | |
| debtReserve | Yes | reserveId of the asset borrowed (flash-loaned, then owed as debt), from get_markets. | |
| slippagePct | No | Optional max slippage as a percent string, e.g. '0.5'. Omit to accept the backend suggestion. | |
| enableCollateral | No | Whether the supplied collateral backs borrowing (default true, which the leverage loop requires). Omit unless the user asked otherwise. | |
| collateralReserve | Yes | reserveId of the asset bought and supplied as collateral, from get_markets. | |
| additionalCollateral | No | Extra collateral pulled from the wallet (via permit) on top of existing collateral, in the collateral asset's main units. Required when the wallet has no existing collateral in that reserve; otherwise omit the argument entirely unless the user wants to top up. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description is consistent while adding substance the annotations can't: it explains the flash-loan/swap/supply/draw mechanics, that nothing is committed until the user signs, and what comes back (quoteId, approvals, maxSafeMultiplier). The maxSafeMultiplier constraint on a requested multiplier is exactly the kind of behavioral limit an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, front-loaded with the version constraint and the core action, each carrying operational information (reserve selection rule, return contents, signing semantics). Slightly heavy as a single block, but nothing is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with no output schema, the description covers the missing piece — the shape of the response (quoteId, approvals to sign, maxSafeMultiplier) — plus prerequisites and the follow-on tools that consume the quoteId. An agent has everything needed to call this correctly and use the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns above that by adding cross-parameter meaning the schema cannot express — the two reserves must be on the same spoke and satisfy the 'quotableAs' pair constraint, and the requested multiplier must stay under maxSafeMultiplier. It doesn't restate the optional params (slippagePct, enableCollateral, additionalCollateral), but the schema covers those fully.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Quote opening or increasing a leveraged position in one atomic order') and immediately distinguishes itself from the swap/repay quote siblings by naming the leverage loop. The 'v4 only' scope is front-loaded, so an agent knows both what it does and where it lives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives real selection guidance: both reserves must come from get_markets in this session, on the same spoke, with debtReserve listing leverageDebt in 'quotableAs' and collateralReserve listing leverageCollateral. It also routes downstream ('feeds preview_action and prepare_order') and clarifies the quoting-vs-committing boundary. It does not explicitly name the sibling quote tools it replaces (get_swap_quote, get_position_swap_quote), so no exclusion rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_market_historyMarket totals over time (v4)ARead-onlyInspect
v4 only. Deposits, borrows, available liquidity and utilisation over a window, for one hub or one spoke. Pick the layer deliberately: a hub is the liquidity itself and answers 'is this market growing', a spoke is one venue onto that liquidity and answers 'is this venue being used'. Ids come from get_reserve_details, which returns both 'hubId' and 'spokeId' for a reserve, or from get_hubs ('hubId') and get_user_positions ('spokeId' for a spoke the wallet already holds). The two are not interchangeable and the wrong one is rejected. To judge a venue before entering it, take the ids from get_reserve_details rather than from a position that does not exist yet. For the protocol as a whole rather than one market use get_protocol_history, for one reserve's rate use get_apy_history, and for one asset across every reserve holding it use get_asset_history.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The hubId (scope 'hub') or spokeId (scope 'spoke'). Not an address. | |
| scope | Yes | Which layer 'id' names: a hub's liquidity, or one spoke onto it. | |
| window | No | How far back to go (default week). | |
| version | No | Optional, and only 'v4': this tool exists on v4 only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds useful behavioral context: it is v4-only, rejects mismatched scope/id combinations ('wrong one is rejected'), and clarifies that IDs are not addresses. This goes beyond what annotations provide, though it does not discuss output shape or pagination.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: version, output metrics, hub/spoke distinction, ID provenance, rejection warning, and explicit alternatives are all packed in without redundancy. It is front-loaded with the essential purpose and scales up with useful guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only history tool with no output schema, the description covers the critical selection pitfalls (scope, id source, version) and routes to related tools. It does not describe the return value format, which is a minor gap given the name implies a time series, but the core decision factors are fully addressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaningful semantics by explaining the conceptual difference between hub and spoke ('hub is the liquidity itself... spoke is one venue onto that liquidity') and where to source each ID. This helps agents select and populate parameters correctly beyond the schema's enum descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description immediately states the exact resource and metrics ('Deposits, borrows, available liquidity and utilisation over a window, for one hub or one spoke') and distinguishes it from sibling tools by naming get_protocol_history, get_apy_history, and get_asset_history as alternatives. This removes any ambiguity about the tool's role.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: hub vs spoke semantics ('hub is the liquidity itself... spoke is one venue onto that liquidity'), where to get IDs (get_reserve_details, get_hubs, get_user_positions), and when to prefer alternatives. Also cautions against using a non-existent position ID when evaluating a new venue, which is actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_marketsGet markets / reservesARead-onlyInspect
List Aave markets/reserves (symbol, APY, caps, liquidity) on v3, v4, or both. Chain coverage: omit chainId and every response states the chains it read as 'chainsCovered', plus 'chainsNotCovered' when it read fewer than all of them. 'chainsNotServed', when present, lists chains this API holds no market on: Aave supports the chain, there is nothing here to read, so an empty result for one of them is not an answer about that chain, and asking again returns the same nothing. v4 always covers every chain it serves; v3 covers every chain when you pass 'symbols' and Ethereum alone when you do not, because an unfiltered 21-chain listing is hundreds of kilobytes. So to compare one asset across chains, pass symbols and no chainId. Every rate is a percent ('3.32' means 3.32%), named with a Pct suffix. Do not rank on APY alone: 'suppliable'/'borrowable' (v4), 'availableLiquidity' and 'totalSuppliedUsd' (v3) say whether a rate can actually be entered, and isFrozen / isPaused / supplyCapReached / borrowCapReached appear only when set, so a reserve with none of them is not flagged. Both versions return one row per reserve under 'reserves', carrying supplyApyPct and borrowApyPct together plus canSupply / canBorrow for the sides that are actually open, so the two versions read the same way. On v4 one asset appears once per spoke, so rows are labelled with 'spoke' and 'hub'; spokes sharing a hub share its rate, so identical APYs across rows are expected rather than duplicates. 'canSwapFrom' (v4) says whether that token can be the sell side of a token swap, which is the per-reserve form of what get_swappable_tokens answers per chain. 'quotableAs' (v4) lists the order-quote arguments the reserve can fill: supplySwapTo or borrowSwapTo as get_position_swap_quote's buyReserve, repayWith as get_repay_with_supply_quote's repayWithReserve, leverageDebt and leverageCollateral as get_leverage_quote's debtReserve and collateralReserve. It is absent when the reserve fills none of them.
| Name | Required | Description | Default |
|---|---|---|---|
| user | No | Optional wallet address (0x, 40 hex). Adds walletBalance, youCanSupply and youCanBorrow to every row, for this wallet, in the same call. Pass it whenever the question is about what someone can actually do rather than what the rates are. | |
| chainId | No | Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain. | |
| symbols | No | Optional token symbols to return, e.g. ['USDC','GHO']. Case-insensitive. Strongly preferred when you know the asset: a chain has ~70 reserves and listing them all is a large response. | |
| version | No | Protocol version (default all). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only establish that this is a safe read operation; the description adds substantial behavioral context beyond them, including chain coverage semantics, the v3/v4 coverage asymmetry, empty-result interpretation for 'chainsNotServed', rate units, conditional flags, and v4 spoke/hub row behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and long, but it is front-loaded with the core purpose and every block conveys non-obvious behavior needed to interpret this complex tool without an output schema. It could be easier to scan with bullets, but there is little empty filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given four optional parameters, no output schema, and fairly complex v3/v4 chain and reserve semantics, the description covers the return shape, field meanings, edge cases, and cross-tool field mappings thoroughly. An agent has enough context to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is already 100%, the description adds non-obvious parameter interactions: 'symbols' expands v3 coverage beyond Ethereum, omitting 'chainId' produces 'chainsCovered'/'chainsNotCovered', and 'user' changes every row with wallet-specific fields. These are meaningful semantics beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource ('List Aave markets/reserves') and names the returned fields, versions, and scope. An agent can tell immediately that this is the market/reserve listing tool rather than a details, history, or quote tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit parameter-driven usage conditions: pass 'symbols' and omit 'chainId' to compare one asset across chains, and pass 'user' when the question is about wallet capabilities. It also warns against ranking on APY alone, but does not explicitly name an alternative tool to use for deeper reserve-level questions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_multichain_assetOne asset wherever v4 holds itARead-onlyInspect
v4 only. One asset across every v4 chain at once, by symbol: what is supplied and borrowed on each, the rate on each, and a summary naming the best supply rate and the lowest borrow rate anywhere. This is the tool for 'where should I supply USDC' and for 'is this cheaper to borrow somewhere else' - one call rather than reading get_markets per chain. It answers about the asset, not about a wallet. Omit chainId to cover every chain v4 serves, stated under 'chainsCovered'.
| Name | Required | Description | Default |
|---|---|---|---|
| symbol | Yes | Token symbol, e.g. 'USDC'. Case-insensitive. | |
| chainId | No | Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain. | |
| version | No | Optional, and only 'v4': this tool exists on v4 only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false; the description adds useful behavioral context beyond them by restricting to v4, explaining that omitting chainId covers every v4 chain, and telling the agent the response includes 'chainsCovered.' There is no contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences with no filler. Scope, output content, use cases, alternative routing, boundary, and optional-parameter behavior are all front-loaded, and every sentence adds distinct value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description names the substantive response components: supplied/borrowed amounts, per-chain rates, best-rate summary, and chainsCovered. It also explains exactly how to invoke the tool, covering selection and behavior well enough for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns extra credit by explaining the practical behavior of omitting chainId ('cover every chain v4 serves') and reinforcing that version only accepts v4. This complements rather than merely repeats the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'One asset across every v4 chain at once, by symbol,' and enumerates the outputs (supplied, borrowed, rates, best supply/borrow summary). This clearly distinguishes it from asset-level versus wallet-level tools like get_wallet_balances and per-chain tools like get_markets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names the use cases ('where should I supply USDC' and 'is this cheaper to borrow somewhere else'), calls out get_markets as the alternative requiring per-chain calls, and states the boundary: 'It answers about the asset, not about a wallet.' This gives an agent clear selection criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_order_statusGet order statusARead-onlyInspect
No version argument. Status of an order by id: open, pending signature, fulfilled, cancelled or expired, with the operation it performs and an explorer link. 'order' comes back null when the API cannot see that id, which a wrong id and a just-submitted order both produce - poll again briefly before concluding.
| Name | Required | Description | Default |
|---|---|---|---|
| orderId | Yes | The order id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses the null behavior, the ambiguity between a wrong id and a just-submitted order, and the advice to poll again briefly. It also mentions what the response contains: status, operation, and explorer link.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and information-dense, covering status values, response contents, and null semantics in two sentences. The opening 'No version argument' is slightly cryptic but does not waste much space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter read-only tool with no output schema, the description covers the return elements and the key edge case. It could be more complete by describing the exact response shape, but the essential information an agent needs to call and interpret the tool is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already fully describes the single orderId parameter, and the description adds little beyond restating that the lookup is by id. Schema coverage is 100%, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States clearly that it retrieves the status of a single order by id, enumerating the possible status values. It is unambiguous against sibling list tools like get_pending_orders, though it does not explicitly name any alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides concrete usage guidance about null results: a null order can mean either a bad id or a recently submitted order, so the agent should poll again before treating it as nonexistent. It gives clear context for the read operation, but does not discuss when to prefer a sibling tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pending_ordersList a wallet's ordersARead-onlyInspect
No version argument: orders run on the v4 backend, so this covers the chains that backend serves and names them under 'chainsCovered'; a chain under 'chainsNotCovered' could not be read and is worth asking about again. A wallet's orders, newest first. Despite the name it returns every status unless 'statuses' narrows it - pass ['open','pending_signature'] for what is still actionable. Each chain returns its newest 50 orders; 'more: true' on a chain means older history exists beyond what was returned. Use this to recover an orderId you no longer have.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Wallet address, 0x-prefixed (40 hex chars). | |
| chainIds | No | Optional: chain ids to read. Omit the argument entirely to sweep every chain the backend serves. | |
| statuses | No | Optional: statuses to keep. Omit the argument entirely for all of them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with readOnlyHint=true and destructiveHint=false present, the description adds substantial behavioral detail: v4 backend coverage, chainsCovered/chainsNotCovered semantics, default status behavior, the 50-order per-chain cap, and the 'more' pagination flag. This is far beyond annotation-only transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence carries distinct information: backend scope, order ordering, status behavior, per-chain limits, and intended use. There is no filler or unnecessary repetition of schema fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description adequately explains the response contract: chain coverage fields, per-chain newest-50 limit, the 'more' flag, and status filtering. This is sufficient for an agent to understand what results to expect and how to detect incomplete chains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all three parameters at 100% coverage, so the baseline is 3. The description adds extra value by recommending a specific statuses value for actionable orders and by clarifying the default behavior ('returns every status'), which helps an agent choose the right argument combination.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: listing a wallet's orders, newest first. It immediately disambiguates the misleading name by noting all statuses are returned by default, and it specifies the exact use case of recovering a lost orderId, which distinguishes it from singular tools like get_order_status.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete when-to-use instruction ('Use this to recover an orderId you no longer have') and tells the agent to pass ['open','pending_signature'] for actionable orders. It does not explicitly name alternatives or state when not to use the tool, so it falls short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_position_itemsGet individual position items (v4)ARead-onlyInspect
v4 only. The individual supplies or borrows inside one v4 spoke: principal, accrued interest and what is withdrawable right now, per item, which the per-spoke aggregate from get_user_positions cannot show. Each item's positionItemId is what a position swap or a repay-with-supply sells, and its 'quotableAs' says which: supplySwapFrom or borrowSwapFrom as get_position_swap_quote's sellPosition, repayDebt as get_repay_with_supply_quote's debtPosition; absent when the item can enter neither. Get 'spokeId' from get_user_positions.
| Name | Required | Description | Default |
|---|---|---|---|
| side | No | Which side to list (default supply). | |
| user | Yes | Wallet address, 0x-prefixed (40 hex chars). | |
| spokeId | Yes | spokeId from get_user_positions (not the spoke address). | |
| version | No | Optional, and only 'v4': this tool exists on v4 only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds genuinely new behavioral facts: v4-only availability, per-item granularity the aggregate cannot provide, and the conditional presence of 'quotableAs' (absent when the item can enter neither route). Return shape and pagination are not covered, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the v4 constraint and the core differentiator, then the identifier-to-downstream-tool mapping. Dense but every clause carries routing or interpretation value; the single long sentence is slightly harder to scan than a split structure would be.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the return-value burden and does: principal, accrued interest, withdrawable amount per item, plus the meaning of positionItemId and quotableAs. It also explains where the required spokeId comes from. Nothing an agent needs to call or interpret it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so 'side', 'user', 'spokeId' and 'version' are already documented, including the enum values. The description reinforces the spokeId provenance but largely restates what the schema says, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb/resource tuple — the individual supply or borrow items inside one v4 spoke — and explicitly contrasts it with the per-spoke aggregate returned by get_user_positions. An agent can distinguish it from the sibling without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the prerequisite call ('Get spokeId from get_user_positions'), the hard scope constraint (v4 only), and the downstream consumers (get_position_swap_quote's sellPosition, get_repay_with_supply_quote's debtPosition) selected via 'quotableAs'. It also states when an item cannot be used for either route.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_position_swap_quoteQuote a position swap (v4)ARead-onlyInspect
v4 only. Quote swapping one Aave v4 position for another, atomically and without leaving the protocol: kind=supply swaps collateral for a different collateral asset, kind=borrow swaps one debt for another. Both sides are on the same spoke. Get 'sellPosition' from get_position_items, whose 'quotableAs' says whether that item can be sold this way (supplySwapFrom or borrowSwapFrom), and 'buyReserve' from get_markets, whose 'quotableAs' says whether that reserve can receive it (supplySwapTo or borrowSwapTo). The quoteId feeds prepare_order. Nothing is committed until the user signs, so state the plan rather than asking permission to quote it.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | Yes | supply = collateral swap, borrow = debt swap. | |
| user | Yes | Wallet address (0x, 40 hex). | |
| amount | Yes | Amount in main units of the sold position, e.g. '100.5'. | |
| version | No | Optional, and only 'v4': this tool exists on v4 only. | |
| buyReserve | Yes | reserveId to move into (from get_markets), on the same spoke as the position sold. | |
| slippagePct | No | Optional max slippage as a percent string, e.g. '0.5'. Omit to accept the backend suggestion. | |
| sellPosition | Yes | positionItemId to sell (from get_position_items): a supply item for kind=supply, a borrow item for kind=borrow. | |
| enableCollateral | No | kind=supply only: enable the bought reserve as collateral (default true). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false; the description reinforces this with 'Nothing is committed until the user signs' and adds a workflow norm ('state the plan rather than asking permission to quote it'). It does not cover quote expiry/lifetime or rate-limit characteristics, so it stops just short of full behavioral disclosure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the v4-only constraint and the two-kind distinction, then dependencies, then downstream use, then the behavioral note. Every sentence carries actionable information and nothing is redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers scope, prerequisites, downstream wiring, and safety posture for an 8-parameter quote tool. With no output schema, it only lightly implies the return shape (quoteId) and says nothing about the quote's other fields such as the suggested slippage or expected rates, which is a minor remaining gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description still adds real value by tying sellPosition and buyReserve to their source tools and by stating the same-spoke constraint and the quoteId-to-prepare_order linkage. It restates kind semantics already in the schema, so the gain is incremental rather than substantial.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Quote swapping one Aave v4 position for another, atomically and without leaving the protocol') and immediately disambiguates the two modes: kind=supply swaps collateral, kind=borrow swaps debt. It is clearly distinguishable from token-swap siblings like get_swap_quote.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the upstream dependencies (get_position_items for sellPosition, get_markets for buyReserve) and the gating fields (quotableAs: supplySwapFrom/borrowSwapFrom, supplySwapTo/borrowSwapTo), plus the downstream consumer (prepare_order via quoteId). It does not explicitly contrast with get_swap_quote or get_repay_with_supply_quote, which would have completed the routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_proposal_payloadsGet a proposal's payloadsARead-onlyInspect
Takes no 'version' argument (DAO governance is not per-market; Governance V3 is unrelated to Aave v3/v4 markets). What an Aave DAO proposal actually executes: one payload per target chain, each with its execution state, timelock delay, grace period and the contract calls it makes. Use this to tell whether a passed proposal has landed on every chain yet: a proposal can be 'executed' on mainnet while a payload is still 'queued' elsewhere.
| Name | Required | Description | Default |
|---|---|---|---|
| proposalId | Yes | Proposal id as a decimal string, e.g. '508'. From search_governance_proposals. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool readOnly and non-destructive, and the description adds meaningful behavioral context beyond them: the output includes each payload's execution state, timelock delay, grace period, and contract calls, and cross-chain execution can be inconsistent (e.g., executed on mainnet but queued elsewhere). This helps an agent interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is composed of three sentences, each earning its place: one dispels a common parameter misconception, one defines the tool's core resource, and one gives the primary use case. It is front-loaded with the most decision-relevant information and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With only one parameter and no output schema, the description carries full responsibility for explaining what the tool returns. It adequately covers the return contents (execution state, timelock, grace period, contract calls) and the cross-chain interpretation. The information given is sufficient for an agent to select and call this tool appropriately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the proposalId parameter is already well documented. The description adds extra semantic value by explicitly stating the tool takes no 'version' argument, preventing an agent from mistakenly supplying one. It also reinforces that the proposal ID comes from search_governance_proposals, though that is already in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves an Aave DAO proposal's payloads, explaining what payloads are (per-chain execution packages with state, timelock, grace period, contract calls). It distinguishes itself from sibling tools by explicitly noting it takes no 'version' argument and that DAO governance is unrelated to Aave v3/v4 markets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides an explicit use case: 'Use this to tell whether a passed proposal has landed on every chain yet.' It also clarifies a common source of confusion (the version argument). However, it does not explicitly name alternative sibling tools such as get_governance_proposal or get_proposal_votes, so the guidance is clear but lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_proposal_votesGet votes on a proposalARead-onlyInspect
Takes no 'version' argument (DAO governance is not per-market; Governance V3 is unrelated to Aave v3/v4 markets). Who voted on an Aave DAO proposal and with how much power, largest voter first. Pass support=true or false to list only one side. 'totals' covers every vote on the proposal, not just the page returned. Voting power is in AAVE.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max rows to return (1-100, default 20). | |
| offset | No | Rows to skip, for paging (default 0). | |
| support | No | Filter to one side: true for votes in favour, false for against. Omit for both. | |
| proposalId | Yes | Proposal id as a decimal string, e.g. '508'. From search_governance_proposals. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and destructiveHint annotations, the description adds meaningful behavioral detail: vote ordering (largest voter first), the effect of the support filter, that 'totals' reflects all votes across pages rather than just the returned page, and that voting power is expressed in AAVE. This gives the agent expectations that are not derivable from annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence in the description earns its place: it clarifies version absence, defines the core output, explains the support filter, clarifies pagination semantics of 'totals', and states the unit of voting power. The most important disambiguation is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list tool with no output schema, the description provides enough to call it correctly: input requirements, filtering, ordering, pagination-aware totals, and units. OpenWorldHint is false, and the described behavior fully covers the agent's likely decision needs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already describes all parameters at 100% coverage, so the baseline is 3. The description adds value by clarifying that no version argument should be passed, that support=true/false lists one side, and that voting power is denominated in AAVE. These are useful semantic details beyond the field names and schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the exact resource ('votes on an Aave DAO proposal') and the specific data returned (who voted, with how much power, largest voter first). It also proactively distinguishes itself from governance versioning confusion by stating it takes no 'version' argument and that DAO governance is unrelated to Aave v3/v4 markets.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when to use the tool: to discover who voted on a proposal and with what voting power, and how to narrow to one side with support. It also excludes a common misuse by noting DAO governance is not per-market, but it does not explicitly name sibling alternatives like get_governance_proposal or get_user_vote for other use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_protocol_historyProtocol totals over time (v4)ARead-onlyInspect
v4 only. Aave v4 protocol-wide history: market size, total borrows and available liquidity per sample over a window. Omit chainId to cover every supported v4 chain. Use this for 'is the protocol growing', not for one wallet (get_user_summary_history) or one reserve (get_apy_history).
| Name | Required | Description | Default |
|---|---|---|---|
| window | No | Time window (default week). | |
| chainId | No | Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain. | |
| version | No | Optional, and only 'v4': this tool exists on v4 only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context beyond that: it is v4-only, returns per-sample data over a time window, and is protocol-wide rather than wallet- or reserve-scoped. It does not describe output shape or pagination, but this is minor for a read-only query tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed sentences with no filler. The most important scoping fact ('v4 only') is front-loaded, followed by the key metrics, then clear routing guidance. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, zero-required-parameter history tool, the description provides everything needed to select and invoke it correctly: scope, metrics, time-window concept, cross-chain behavior, and sibling differentiation. The annotations cover safety and the schema covers parameter details, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters in detail. The description reinforces key semantics like omitting chainId for all chains and the per-sample window concept, but it does not add substantial meaning beyond what the schema provides. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('get'), resource ('protocol-history'), and scope ('Aave v4 protocol-wide history') with concrete metrics: market size, total borrows, available liquidity. It explicitly distinguishes itself from sibling tools get_user_summary_history and get_apy_history, making it immediately clear what this tool is and is not.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage direction: 'Use this for "is the protocol growing"' and names the exact alternatives to use instead for wallet-level or reserve-level history. It also clarifies how to cover all chains by omitting chainId, leaving no ambiguity about invocation context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_repay_with_supply_quoteQuote repaying debt from collateral (v4)ARead-onlyInspect
v4 only. Quote paying down a borrow using supplied collateral, atomically and without the funds leaving Aave. 'debtPosition' is the borrow to reduce, a positionItemId from get_position_items with side=borrow whose 'quotableAs' lists repayDebt; 'repayWithReserve' is the reserveId of the collateral that pays for it, from get_markets with 'quotableAs' listing repayWith, on the same spoke. Use this instead of withdraw-swap-repay by hand: it is one atomic step, so the health factor never dips in between. The quoteId feeds prepare_order. Nothing is committed until the user signs, so state the plan rather than asking permission to quote it.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Wallet address (0x, 40 hex). | |
| amount | Yes | Amount of debt to repay, in main units, e.g. '100.5'. | |
| version | No | Optional, and only 'v4': this tool exists on v4 only. | |
| slippagePct | No | Optional max slippage as a percent string, e.g. '0.5'. Omit to accept the backend suggestion. | |
| debtPosition | Yes | positionItemId of the borrow to reduce (get_position_items side=borrow). | |
| repayWithReserve | Yes | reserveId of the collateral that pays for it (from get_markets). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, and the description is consistent while adding real context: the operation is atomic, the health factor never dips in between, and nothing is committed until the user signs. It even sets the expected agent behavior ('state the plan rather than asking permission to quote it'), which annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The version constraint is correctly front-loaded and every sentence carries information, but the middle sentences are dense with chained prerequisites and would benefit from clearer separation between id-discovery and invocation guidance. No filler, though.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a quote tool with no output schema, it covers the workflow handoff (quoteId -> prepare_order) and the non-commitment guarantee, which is what an agent needs to act. It does not describe what the returned quote contains (prices, slippage application, resulting health factor), a minor gap given there is no output schema to fall back on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100%, so the baseline would be 3, but the description goes further by identifying the source tool and filter for each id (positionItemId from get_position_items with side=borrow and quotableAs repayDebt; reserveId from get_markets with quotableAs repayWith) and the 'same spoke' constraint. That is meaning the schema does not carry.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Quote paying down a borrow using supplied collateral') plus scope and a distinguishing mechanism ('atomically and without the funds leaving Aave'). An agent can separate it from get_swap_quote, get_position_swap_quote and preview_action without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the alternative it replaces ('Use this instead of withdraw-swap-repay by hand') and the reason (single atomic step, health factor never dips). It also documents prerequisites for each id (get_position_items side=borrow whose quotableAs lists repayDebt; get_markets quotableAs listing repayWith, same spoke) and the downstream step ('quoteId feeds prepare_order').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reserve_detailsGet reserve detailsARead-onlyInspect
Deep detail for a single reserve (rates, caps, risk parameters, utilisation, the interest-rate curve, token addresses) on v3 or v4. Every rate and percentage is a percent ('3.32' means 3.32%), named with a Pct suffix. On v4, utilisation and the rate curve are hub-wide, shared by every spoke drawing on the asset. Two v4 fields whose meaning the numbers do not give away: 'collateralFactorPct' is the liquidation boundary itself, because v4 has no separate liquidation threshold - do not look for one - so a position drawn to its full borrow limit sits at health factor 1.0; and 'liquidityFeePct' is the protocol's share of borrower interest, already netted out of supplyApyPct, so treating it as a user cost double-counts it (supplyApy = borrowApy x utilisation x (1 - liquidityFee), if you want to check). This is also where the asset's price lives: 'priceUsd', with 'priceSource' naming who priced it, and no listing carries either - get_markets quotes no price at all, so what an asset is worth on Aave is answered here. On v4 'quotableAs' lists the position-swap, repay-with-supply and leverage arguments the reserve can fill, the same list get_markets carries. Use get_markets first to get the reserveId (v4) or market+token (v3).
| Name | Required | Description | Default |
|---|---|---|---|
| token | No | v3 only: underlying token address. | |
| market | No | v3 only: market pool address (from get_markets). | |
| chainId | No | v3 only: chain id (positive integer). | |
| version | No | Optional: inferred from the reserve selector ('reserveId' is v4, 'market'+'token'+'chainId' is v3). Send it to be explicit, or if you somehow set both. | |
| reserveId | No | v4 only: the reserveId from get_markets, copied verbatim. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/non-destructive, yet the description goes far beyond them: unit conventions ('3.32' means 3.32%, Pct suffix), v4 hub-wide vs per-spoke utilisation semantics, and explicit warnings about two misleading fields. The note that collateralFactorPct is the liquidation boundary itself ('do not look for one') and that liquidityFeePct is already netted out of supplyApyPct is exactly the interpretive context an agent cannot get from structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose and field inventory are front-loaded, and most sentences carry non-obvious payload (hub-wide semantics, fee netting, price location). It is dense and runs long, with the price/'quotableAs' material reading as a slight digression from the core field semantics, but nothing is purely filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden and does so: it enumerates the returned field groups, fixes the unit convention, flags the two counterintuitive fields with formulas, and tells the agent where the price lives. An agent can interpret the response without further tooling.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: it explains that the version is inferred from the selector (reserveId vs market+token+chainId), that reserveId must be copied verbatim from get_markets, and that v3-only params are mutually exclusive with v4 usage. It does not elaborate on chainId or market formatting beyond the schema, keeping it at 4 rather than 5.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource plus an enumerated field list ('rates, caps, risk parameters, utilisation, the interest-rate curve, token addresses') scoped to 'a single reserve... on v3 or v4'. Directly distinguishes itself from get_markets by stating that tool carries no price at all. An agent can tell what it returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit prerequisite/ordering rule ('Use get_markets first to get the reserveId (v4) or market+token (v3)') and routes price lookups here while denying it to get_markets. It stops short of stating when NOT to reach for near-neighbours like get_interest_rate_model or get_aave_guide, so it is clear context rather than full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reserve_holdersLargest suppliers or borrowers of a reserve (v4)ARead-onlyInspect
v4 only. The biggest wallets supplying or borrowing one v4 reserve, largest first, for questions about concentration: whether one address is most of a reserve's liquidity, or most of its debt. The token is named once for the whole list rather than repeated per row. 'reserveId' comes from a get_markets row or a get_position_items item. An empty list means this reserve has no holders indexed on that side, which is common for the borrow side of an asset few people borrow, and is not an error.
| Name | Required | Description | Default |
|---|---|---|---|
| side | No | Rank the wallets supplying it, or the ones borrowing it (default supply). | |
| limit | No | How many wallets to return. Only 10 or 50; default 10. | |
| cursor | No | 'nextCursor' from a previous call, for the next page. Omit the argument entirely for the first page. | |
| version | No | Optional, and only 'v4': this tool exists on v4 only. | |
| reserveId | Yes | reserveId from get_markets or get_position_items. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral details beyond the readOnlyHint/destructiveHint annotations: results are ordered largest first, the token is named once for the whole list, and an empty list means no indexed holders on that side rather than an error. These details help the agent interpret responses correctly without an output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the most important scope and version constraint, and each sentence carries useful information. The reserveId sentence is slightly redundant with the schema, and the token-naming detail could arguably live in an output schema, but the overall length is reasonable and organized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description does well to explain ordering, the single-token naming behavior, and the empty-list error semantics. It does not spell out the exact fields returned per wallet, but this is a relatively simple list tool and the schema plus description cover the essential calling context adequately.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters. The description's only param-related contribution, pointing to get_markets or get_position_items for reserveId, is also already present in the schema description. Thus the description adds little semantic value beyond the input schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: listing the biggest wallets supplying or borrowing a v4 reserve, sorted largest first. It clearly centers on concentration questions, which distinguishes it from the many other get_* siblings. The title and first sentence together make the tool's purpose immediately recognizable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this tool for concentration questions, such as whether one address holds most of a reserve's liquidity or debt. It also notes the v4-only constraint and tells the agent where to obtain reserveId. It does not name specific alternative tools or exclusion cases, but the usage context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_safety_moduleGet the Safety ModuleARead-onlyInspect
Aave's Safety Module, Ethereum only, and the one product here that is read from the contracts rather than the Aave API. Returns both generations: 'umbrella', the per-asset stake tokens securing the protocol now, each with its total staked, target liquidity, reward APY, cooldown and unstake window; and 'legacy', the stkAAVE / stkGHO / stkABPT tokens alongside it. Pass 'user' to add that wallet's staked balance, claimable rewards and cooldown state on both. Staking is not supplying: a stake earns its own rewards, is not Aave collateral, and cannot be borrowed against - but it is part of a wallet's Aave position, so a portfolio answer that omits it is wrong. USD figures are Aave's oracle price for the staked asset. Reward APY is what the contracts pay right now, not the configured maximum, because Umbrella scales emission by how far total staked sits from target liquidity. One field decides whether there is an answer here at all: a result carrying 'read': false and no 'umbrella' or 'legacy' means this deployment cannot reach the Safety Module, which is a gap in its configuration and not a fact about the wallet - say the staking part is unavailable rather than reporting the wallet as unstaked, and do not call again.
| Name | Required | Description | Default |
|---|---|---|---|
| user | No | Optional wallet address (0x, 40 hex) to include its stake, rewards and cooldown. Omit the argument entirely for protocol-wide state only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint annotation by disclosing the data source, the read:false error state and its proper interpretation, the dynamic reward APY behavior, the USD oracle-price basis, and the staking-versus-supplying distinction. This is rich behavioral context that an agent needs to avoid misreporting results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence carries a distinct, decision-relevant fact. It front-loads the product, scope, and return structure, then layers caveats about pricing, APY, and error interpretation in a logical order.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully carries the burden of explaining return values and error behavior. It covers umbrella and legacy contents, user-scoped additions, the read:false failure mode, reward APY semantics, and USD pricing, leaving nothing essential for correct invocation or interpretation missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single 'user' parameter is already fully documented in the schema with 100% coverage, so the schema does the heavy lifting. The description adds only a slight nuance about the parameter affecting both umbrella and legacy generations, which is useful but not a substantial semantic addition.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific product and scope ('Aave's Safety Module, Ethereum only') and states it is read from contracts rather than the Aave API. It then enumerates the two returned generations, making the tool's operation and output unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use the tool: it is Ethereum-only, contract-sourced, and should be included in portfolio answers because staking is part of a wallet's Aave position. It also explains exactly when to pass 'user'. It does not explicitly name an alternative sibling tool, but the guidance is strong enough for an agent to route correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sgho_previewPreview an sGHO deposit or withdrawalARead-onlyInspect
v3 only, Ethereum only. Convert between GHO and sGHO shares at the vault's current index, without building anything. Which unit 'amount' is in depends on the action: 'deposit' takes GHO and returns the shares it would mint; 'withdraw' takes sGHO SHARES and returns the GHO they would return. Call this with action 'withdraw' before prepare_sgho_action, because that withdrawal is denominated in shares and not in GHO - passing a GHO figure there withdraws the wrong amount. When quoting what a user-named amount converts to, use this preview rather than multiplying by the rate: the index moves.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | 'deposit' converts GHO to shares; 'withdraw' converts shares to GHO. | |
| amount | Yes | Amount in main units (e.g. '10.5'): GHO when action is 'deposit', sGHO shares when it is 'withdraw'. | |
| version | No | Optional, and only 'v3': this tool exists on v3 only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, non-destructive behavior, and the description reinforces this with 'without building anything.' It adds meaningful behavioral context beyond annotations by disclosing that the vault index is live and moves, explaining the unit-of-amount asymmetry, and warning that a GHO figure in a withdraw would withdraw the wrong amount. This is exactly the kind of context an agent needs.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, each serving a purpose: constraints, core behavior, unit semantics, and call-order/rate warnings. Front-loaded with 'v3 only, Ethereum only,' and no filler. The one mild redundancy with the version schema is negligible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only preview tool with two required parameters and no output schema, the description fully specifies both action directions, the correct amount denomination, the prerequisite ordering for withdrawals, and why not to use a static rate. An agent has everything needed to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: the action and amount properties already state which unit applies to each action. The description restates this relationship but does not add new parameter-level meaning beyond the schema; it merely reinforces what is already documented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise verb ('Convert') and resource (GHO/sGHO shares at the vault's current index), and explicitly disclaims building actions: 'without building anything.' It also distinguishes itself from sibling prepare_sgho_action by instructing when to call it for withdrawals, making the tool's unique role unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: 'Call this with action withdraw before prepare_sgho_action' and 'When quoting what a user-named amount converts to, use this preview rather than multiplying by the rate.' It names the incorrect alternative (multiplying by the rate) and explains why it fails: 'the index moves.'
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sgho_vaultGet the sGHO savings vaultARead-onlyInspect
v3 only, Ethereum only. Savings GHO (sGHO) is an ERC-4626 vault that pays a target rate on deposited GHO. Returns the vault's targetRatePct, totalAssets, supplyCap and paused flag; pass 'user' to add that wallet's shares, their GHO value, its GHO wallet balance, and the maxDeposit / maxWithdraw the contract allows right now. Quote what a deposit earns from 'combinedAprPct' when it is present: a Merit campaign sometimes pays 'incentiveAprPct' on top of the target rate, and the two differ in how they arrive - the target rate accrues inside the vault and needs no action, the incentive is claimed separately through the link in 'incentive' and can end at any time. All three are absent together when no campaign is running, which is the usual state, and then targetRatePct is the whole rate. Two things this rate is not: it is set by governance rather than by utilisation, so it does not move with borrowing demand, and it is not a lending position - sGHO earns yield but is not Aave collateral and cannot be borrowed against. Deposits and withdrawals are instant, with no cooldown.
| Name | Required | Description | Default |
|---|---|---|---|
| user | No | Optional wallet address (0x, 40 hex) to include its position. Omit the argument entirely for vault state only. | |
| version | No | Optional, and only 'v3': this tool exists on v3 only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnly/destructive, but the description adds substantial behavioral nuance: governance-set rate vs utilisation, campaign incentive APR semantics, no Aave collateral or borrowing, and instant no-cooldown deposits/withdrawals. This goes well beyond the structured hints and gives agents a reliable model of the vault.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The first sentence front-loads scope, and subsequent sentences add value rather than padding. It is longer than necessary for a simple read, but the extra context about APRs and collateral status is relevant and earned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite lacking an output schema, the description enumerates the important returned fields and explains the present/absent campaign APR fields, user-specific values, and non-obvious semantics. An agent has enough information to call the tool and interpret the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the schema already documents both parameters, but the description enriches 'user' by specifying what it adds (shares, GHO value, wallet balance, maxDeposit/maxWithdraw) and reinforces 'version' as v3-only. This exceeds the baseline for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with 'v3 only, Ethereum only' and identifies the tool as the sGHO ERC-4626 vault reader, then lists exactly what it returns (targetRatePct, totalAssets, supplyCap, paused flag). This is a specific verb+resource definition that distinguishes it from generic vault tools like get_vaults.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Clear context on when to pass 'user' vs omit it and that it is v3-only, with an explicit scope constraint. It stops short of naming sibling alternatives or stating when to choose another tool, so not a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_spoke_configsWhat one venue will accept, per asset (v4)ARead-onlyInspect
v4 only. Per-asset limits for one (hub, spoke) pair: supply and borrow caps, whether the asset is active there, whether it is halted, and the risk premium threshold. Read it before sizing a large position, because a cap is what turns a valid-looking supply into a reverting one. 'halted' stops supply, borrow, withdraw and repay alike; an asset that is simply not active was never configured on that spoke, which is a different thing from one that was turned off. Both ids come from get_reserve_details for any reserve, which is the route that works before a wallet holds anything on that spoke.
| Name | Required | Description | Default |
|---|---|---|---|
| hubId | Yes | hubId from get_reserve_details or get_hubs. | |
| spokeId | Yes | spokeId from get_reserve_details, or from get_user_positions (not the spoke address). | |
| version | No | Optional, and only 'v4': this tool exists on v4 only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the read-only, non-destructive safety profile, so the bar is lower. The description adds real interpretive value: the distinction between 'halted' (stops supply, borrow, withdraw, and repay alike) and 'not active' (never configured on that spoke), which prevents an agent from conflating two very different states in the response.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences, each carrying distinct information: version scope and purpose, usage trigger, flag semantics, and parameter provenance. The core purpose is front-loaded in the first sentence. It is on the longer side, but every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description compensates by listing the returned data fields. It covers version scope, when to use it, where parameters come from, and how to interpret the halted/inactive flags. Minor gaps such as the exact format of the cap values keep it from a 5.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so hubId, spokeId, and version are already documented in the input schema. The description adds the timing nuance that get_reserve_details is the ID route that works before a wallet holds anything, but this largely restates the schema's parameter source notes. The baseline 3 for high schema coverage applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a precise scope — per-asset limits for exactly one (hub, spoke) pair — and enumerates the returned fields (supply/borrow caps, active state, halted state, risk premium threshold). It distinguishes itself from the many sibling get_* tools through the single-pair granularity and v4-only constraint, so an agent can pick it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger condition: 'Read it before sizing a large position, because a cap is what turns a valid-looking supply into a reverting one.' It also explains the preferred ID route (get_reserve_details) that works before a wallet holds anything on the spoke, implicitly contrasting with get_user_positions. It stops short of explicitly naming a sibling alternative for when a different granularity is needed, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_startedWhat this connector can doARead-onlyInspect
Applies to both versions. What this Aave server can do: the tool families, the ready-made prompts, and the guide topics. Call this when an Aave conversation opens with no specific request and answer from it, rather than guessing from tool names.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and non-destructive behavior, so the description's burden is lower. It adds useful context: it applies to both versions, returns an overview of tool families/prompts/guides, and tells the agent to answer from the result. It does not detail return format, but for a zero-parameter read-only orientation tool this is not a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two concise sentences with no filler. The when-to-use and how-to-use guidance are both explicit, and the description is appropriately front-loaded for an agent scanning tool definitions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter, read-only overview tool, the description covers scope of content, trigger condition, and how to use the returned information. The only minor ambiguity is 'both versions,' but this does not prevent an agent from invoking the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema is fully documented/covered, so there are no parameter semantics for the description to add. The description appropriately focuses on usage context instead, and the baseline of 4 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Call this') and a clear resource: the Aave server/connector's capabilities, including tool families, ready-made prompts, and guide topics. It clearly distinguishes itself from the many data-retrieval sibling tools by positioning this as the orientation/overview tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit trigger condition: call when an Aave conversation opens with no specific request. It also provides a direct behavioral instruction to answer from this tool's content rather than guessing from tool names, which is especially valuable given the large sibling list.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_swappable_tokensGet swappable chains and tokensARead-onlyInspect
No version argument: token swaps are protocol-agnostic and run on the v4 backend, so they cover the chains that backend serves rather than every chain Aave has a market on. Call this before get_swap_quote to see where a swap can be quoted: with no arguments it sweeps the chains v4 serves and returns each one with how many tokens are swappable there, which is the cheap answer; pass 'chainIds' to get the actual token list, and to ask about a chain the sweep does not reach. A chain under 'chainsNotCovered' could not be read and is worth asking about again; a chain present with 0 swappable tokens answered, and the answer is that nothing can be swapped there. Per reserve, get_markets also returns 'canSwapFrom'.
| Name | Required | Description | Default |
|---|---|---|---|
| chainIds | No | Optional: chain ids to list tokens for. Omit the argument entirely to get every chain with a count instead of a token list. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint/destructiveHint annotations by explaining the v4 backend behavior, the meaning of 'chainsNotCovered', and the semantic difference between a chain not being reachable versus a chain with zero swappable tokens. This gives the agent crucial interpretation guidance that annotations alone cannot provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and informative but not bloated; every sentence adds meaningful context. The opening sentence is slightly indirect because it starts with version/backend context rather than a direct statement of the tool's purpose, but the overall structure is efficient and front-loaded with important behavioral details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of explaining return semantics, and it does so thoroughly: counts vs token lists, chainsNotCovered, zero-token chains, and the get_markets alternative. For a single-optional-parameter read-only tool, nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already fully describes the single optional chainIds parameter with 100% coverage. The description adds extra value by noting that chainIds can also be used to ask about chains not reached by the initial sweep, and clarifies that omission returns counts rather than token lists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gets swappable chains and tokens, and explains it returns either a chain sweep with token counts or an actual token list for given chain ids. It differentiates itself from get_swap_quote and get_markets by explicitly positioning this as the pre-quote discovery tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to call this before get_swap_quote, and specifies when to omit chainIds versus when to pass them. It also tells the agent that get_markets returns 'canSwapFrom' per reserve as an alternative source of the same information.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_swap_quoteGet a token swap quoteARead-onlyInspect
No version argument: token swaps are protocol-agnostic and run on the v4 backend, so the chains and tokens they cover are that backend's and not every chain Aave holds a market on - a chain it does not serve is rejected outright rather than quoted badly. Call get_swappable_tokens first if you do not already know the chain is covered, or read 'canSwapFrom' on the reserve from get_markets. Quote a token swap: returns the quote with a quoteId to prepare and sign through prepare_order.
| Name | Required | Description | Default |
|---|---|---|---|
| buy | Yes | Token to buy: 'native' for the chain's gas token, or an ERC-20 address (0x...). | |
| kind | No | sell = spend an exact sell amount; buy = receive an exact buy amount. Default sell. | |
| sell | Yes | Token to sell: 'native' for the chain's gas token, or an ERC-20 address (0x...). | |
| user | Yes | Wallet address (0x, 40 hex) of the wallet that will sign, as the user named it in this session. If no wallet has been named, ask for it; never substitute a placeholder, which is rejected. | |
| amount | Yes | Amount in main units (of the sell token for kind=sell, the buy token for kind=buy). | |
| chainId | Yes | Chain id (positive integer). | |
| slippagePct | No | Optional max slippage as a percent string, e.g. '0.5' for 0.5%. Omit to accept the backend's suggestion, which moves with market conditions - set this to cap it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The quote is explicitly non-mutating ('returns the quote with a quoteId'), aligning with readOnlyHint: true and destructiveHint: false. It also discloses a meaningful behavioral edge case—unsupported chains are rejected outright rather than quoted with poor data—which is not captured in annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense and organized around behavioral caveats, preconditions, and output usage, but opens with a caveat ('No version argument...') before stating the core purpose. The quote purpose is clear and all sentences earn their place, though the main verb-object statement could be front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers what the tool does, when to verify chain/token coverage first, what it returns (quote with quoteId), and how the result feeds into prepare_order. Combined with the rich schema, this gives an agent everything needed to invoke it safely and in the correct sequence.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description does not add parameter-level detail, but the schema already provides thorough descriptions for sell/buy tokens, amount in main units, kind semantics, user validation, and optional slippage. Because schema coverage is near 100%, the lack of additional parameter explanation is acceptable and sits at the baseline for this dimension.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Quote a token swap: returns the quote with a quoteId to prepare and sign through prepare_order.' It also scopes the tool precisely to the v4 backend's supports chains and explicitly notes unsupported chains are rejected rather than mishandled.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives actionable guidance: call get_swappable_tokens first if chain coverage is unknown, or check 'canSwapFrom' on get_markets. It also explains how to use the returned quoteId downstream with prepare_order, removing ambiguity about the next step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transaction_processedHas Aave seen my transaction yet?ARead-onlyInspect
v4 only. After sending a transaction, ask whether the Aave API has processed it. Use this instead of sleeping or polling an RPC: the API lags the chain, and prepare_action will not issue a dependent follow-up (the supply after an approval, the withdraw after a repay) until it has caught up. Pass the txHash you sent plus the 'operations' array that came back on that transaction. Poll until processed is true, then continue.
| Name | Required | Description | Default |
|---|---|---|---|
| txHash | Yes | Transaction hash you broadcast (0x...). | |
| version | No | Optional, and only 'v4': this tool exists on v4 only. | |
| operations | Yes | The 'operations' from the transaction the server built, e.g. ['SPOKE_SUPPLY']. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly and destructive annotations, the description explains important behavior: the API lags the chain, dependent actions are gated on this tool, and the correct pattern is to poll until processed is true. It does not state the exact return shape, but the behavioral contract is clear.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences front-load the version constraint, state the purpose, justify the tool over RPC polling, and give the polling protocol. Every sentence earns its place with no wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only check with full schema coverage, the description covers when, why, and how to poll, and names the critical prepare_action dependency. A slight gap is that the return value is only implied ('processed is true') rather than explicitly specified, which matters because there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds meaning by clarifying that txHash is the hash you broadcast and that operations must be the array that came back from the server on that transaction, tightening the relationship between the two required parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: it asks whether the Aave API has processed a sent transaction. It also distinguishes itself from the sibling family by explicitly contrasting with sleeping or polling an RPC and by naming prepare_action's dependency behavior.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool ('After sending a transaction'), which alternative to avoid ('instead of sleeping or polling an RPC'), and the underlying reason: prepare_action will not issue a dependent follow-up until the API has caught up. This gives an agent clear routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_activityGet user activity / transaction historyARead-onlyInspect
A wallet's Aave transaction history (supply, borrow, repay, withdraw, collateral changes) on v3, v4, or both. Most recent first. v4 covers every chain; v3 reads one market on one chain at a time, because upstream paginates per market, so it states its scope as 'chainsCovered' and 'market' and you pass chainId to read another. Use get_user_positions, not this, to find out where a wallet holds anything.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Wallet address, 0x-prefixed (40 hex chars). | |
| cursor | No | Pagination cursor: copy 'pageInfo.next' from a previous call verbatim. It is opaque and cannot be edited, shortened or rebuilt - a value that was changed comes back as a base64 parse failure. Requires an explicit version ('v3' or 'v4'): a cursor belongs to one version's feed. | |
| market | No | v3 only, optional: market pool address (defaults to the chain's main market). | |
| chainId | No | Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain. | |
| version | No | Protocol version (default all). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, non-destructive behavior. The description adds useful behavioral context: results are ordered most recent first, v4 covers all chains while v3 is per market/chain due to upstream pagination, and the output includes scope fields. It doesn't cover every operational detail, but it complements the annotations well.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences: definition/order, version-specific behavior, and alternative routing. Every sentence earns its place and the most important scoping information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still gives enough to invoke the tool correctly: it covers versions, chains, markets, ordering, and the alternative tool. Combined with the fully described input schema and read-only annotations, nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value beyond the schema by explaining how version, chainId, and market relate (v3 reads one market/chain at a time; pass chainId to read another), which helps an agent choose parameter combinations correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: a wallet's Aave transaction history, enumerating operation types (supply, borrow, repay, withdraw, collateral changes) and versions. It also names the sibling to avoid, get_user_positions, so the tool's identity is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing guidance: use get_user_positions to find holdings, not this tool. It also explains when v3 versus v4 is involved and how chainId is used to read another market, making the selection criteria concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_positionsGet user positionsARead-onlyInspect
A wallet's Aave positions (supplies and borrows) on v3, v4, or both. Omit chainId and both versions cover every chain they serve, stating which under 'chainsCovered'; there is no need to loop over chains yourself. 'chainsNotServed', when present, lists chains this API holds no market on: Aave supports the chain, there is nothing here to read, so an empty result for one of them is not an answer about that chain, and asking again returns the same nothing. v4 returns 'positions', each with its own health factor; v3 returns 'supplies' and 'borrows'. These are Aave-side positions only: a wallet's own token balances are not here, and an empty result means nothing is supplied or borrowed rather than that the wallet is empty. For what it holds, pass 'user' to get_markets, which returns walletBalance per reserve.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Wallet address, 0x-prefixed (40 hex chars). | |
| chainId | No | Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain. | |
| version | No | Protocol version (default all). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations already marking readOnly/openWorld/destructive hints, the description adds meaningful edge-case behavior: empty result semantics, chainsNotServed caveats, v3 vs v4 response shapes, and the 'asking again returns the same nothing' idempotency note. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence carries distinct information, front-loading the core purpose before edge cases. No redundant restatement of the title or schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with no output schema, the description covers return shapes, empty-result semantics, chain coverage behavior, and the relevant sibling alternative. Nothing an agent needs to call it correctly and interpret results is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description goes beyond the schema: omitting chainId covers every served chain, version changes the return shape (positions with health factor vs supplies/borrows), and user is scoped to Aave-side positions only. This materially improves an agent's ability to pass correct parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence identifies a specific verb (get), resource (wallet Aave positions), and scope (supplies and borrows on v3, v4, or both). It also differentiates from the sibling get_markets by explicitly stating what belongs elsewhere.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description tells the agent to omit chainId to cover every chain without looping, explains the meaning of chainsNotServed, and directs the caller to get_markets when wallet-owned balances are needed. This is explicit when-to-use and when-not-to-use guidance with a named alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_rewardsGet user rewardsARead-onlyInspect
A wallet's claimable Aave rewards on v3, v4, or both. Covers incentive programmes distributed through Merit as well as the protocol's own, so a GHO or sGHO incentive shows up here rather than anywhere separate. Omit chainId and both versions cover every chain they serve, stating which under 'chainsCovered' and tagging each row with its own chainId. 'chainsNotServed', when present, lists chains this API holds no market on: Aave supports the chain, there is nothing here to read, so an empty result for one of them is not an answer about that chain, and asking again returns the same nothing. On v3 the response also carries the transaction that claims them.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Wallet address, 0x-prefixed (40 hex chars). | |
| chainId | No | Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain. | |
| version | No | Protocol version (default all). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and non-destructive, and the description adds meaningful behavior beyond that: it covers both Merit-distributed and protocol-native incentives, explains chainsNotServed semantics, notes that repeated queries on unsupported chains return the same empty result, and calls out the extra claim transaction on v3 responses. This is substantial non-obvious context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but front-loaded with the core purpose, followed by high-value edge-case guidance. Each sentence adds distinct information, and no filler or restatement of the name appears.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description nevertheless conveys the key return semantics: chain coverage fields, per-row chain IDs, unsupported-chain behavior, and the v3 transaction addition. It gives an agent enough context to call the tool correctly and interpret ambiguous empty results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100%, so all three parameters are already documented. The description restates the omit-chainId behavior and default all version already present in the schema, and the main added value is response-shape context (chainsCovered, per-row chainId, v3 transaction) rather than new parameter meaning.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence identifies the tool as returning a wallet's claimable Aave rewards on v3, v4, or both, with a specific noun-verb-resource structure. It also states which incentive programmes are included, distinguishing this read tool from reward-related actions like prepare_claim_rewards.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete invocation guidance: omit chainId to cover all chains, interpret chainsNotServed as unsupported chains, and treat empty results there as non-answers. It does not explicitly name alternative tools or state when not to use it, so it stops short of a full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_summaryGet user summary / health factorARead-onlyInspect
A wallet's aggregate position and health factor. Omit chainId and both versions cover every chain they serve, stating which under 'chainsCovered'; there is no need to loop over chains yourself. 'chainsNotServed', when present, lists chains this API holds no market on: Aave supports the chain, there is nothing here to read, so an empty result for one of them is not an answer about that chain, and asking again returns the same nothing. Ask for one of those chains on its own and the reply is the scope alone, with no totals: a zero would read as a real balance. v4 returns a cross-chain summary (lowest health factor, totals, net APY). v3 has no cross-market aggregate, so it returns one entry per market the wallet actually holds a position in, each with its own health factor; 'marketsWithPosition': 0 means the wallet holds no v3 position anywhere, not that the read was narrow or that the wallet is empty: token balances are not here. For what it holds, pass 'user' to get_markets, which returns walletBalance per reserve. This is the lending position and only that. A wallet's Aave holdings also include its Safety Module stake (get_safety_module) and Savings GHO (get_sgho_vault), neither of which is a reserve and neither of which appears in any figure here, so a portfolio answer built from this alone understates what the wallet holds.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Wallet address, 0x-prefixed (40 hex chars). | |
| chainId | No | Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain. | |
| version | No | Protocol version (default all). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and non-destructive, and the description adds substantial behavioral context: chain-coverage behavior, v4 vs v3 response shapes, the meaning of marketsWithPosition: 0, and the fact that token balances, Safety Module stake, and Savings GHO are excluded. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but the density is justified: it covers chain semantics, version differences, edge-case interpretation, and exclusions with almost no filler. The most important purpose statement comes first, and every sentence contributes operational guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of explaining return behavior, and it succeeds: it names response fields like 'chainsCovered', 'chainsNotServed', and 'marketsWithPosition', describes v4's cross-chain summary versus v3's per-market entries, and clarifies how zeros and empty results should be interpreted. This is complete enough for an agent to invoke and interpret the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents all three parameters with 100% coverage. The description adds meaning beyond the schema by explaining the effect of omitting chainId, that both versions cover all served chains, and how version changes the response structure. This is above the baseline for fully-schema-documented parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'A wallet's aggregate position and health factor,' giving a specific verb, resource, and scope. It then explicitly distinguishes the tool from get_markets, get_safety_module, and get_sgho_vault, so an agent can tell exactly which concept this covers.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage guidance: omit chainId to cover all chains, do not loop over chains, treat chainsNotServed as genuinely absent markets, and use get_markets for token balances. It also names excluded alternatives (Safety Module and Savings GHO), making when-not-to-use crystal clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_summary_historyA wallet's position over time (v4)ARead-onlyInspect
v4 only. How one wallet's net worth, supplied, debt and health factor moved over a window on Aave v4. Use it to answer 'how has my position changed' or to see how close to liquidation a wallet has been. Omit chainId to cover every supported v4 chain.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Wallet address, 0x-prefixed (40 hex chars). | |
| window | No | Time window (default week). | |
| chainId | No | Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain. | |
| version | No | Optional, and only 'v4': this tool exists on v4 only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only safety (readOnlyHint=true), and the description adds non-obvious call-time behavior: the tool is v4-exclusive and omitting chainId makes it span every supported v4 chain. Listing the tracked metrics also sets expectations for response content, and nothing in the description contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: version constraint front-loaded, purpose stated next, usage examples and chain behavior at the end. No filler; the only nit is 'v4' appearing in both the first sentence and 'Aave v4' in the second.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of conveying what the call returns, and naming the four tracked metrics largely covers it. It doesn't describe the exact response shape or window granularity, but the schema already enumerates all window values and parameters, so nothing needed for a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline of 3 applies and the description need not restate parameter docs. The chainId-omission guidance mirrors what the schema already says ('Omit the argument entirely to cover every chain'), adding no net-new parameter meaning beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific operation — retrieving a single wallet's historical progression of net worth, supplied, debt, and health factor over a configurable window on Aave v4. The temporal framing ('over time', 'over a window') cleanly separates it from snapshot-oriented siblings like get_user_summary and get_user_positions in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete question types the tool answers ('how has my position changed', 'how close to liquidation a wallet has been'), which tells an agent when to invoke it. It does not name the alternative (e.g., get_user_summary for a current snapshot) or state exclusions, so it stops short of explicit when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_voteGet a wallet's vote on a proposalARead-onlyInspect
Takes no 'version' argument (DAO governance is not per-market; Governance V3 is unrelated to Aave v3/v4 markets). How one wallet voted on one Aave DAO proposal, and with how much power. Returns voted:false when that wallet did not vote, which is an answer rather than an error. Voting power is in AAVE.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Wallet address, 0x-prefixed (40 hex chars). | |
| proposalId | Yes | Proposal id as a decimal string, e.g. '508'. From search_governance_proposals. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and destructiveHint annotations, it discloses that a wallet that did not vote returns voted:false as an answer rather than an error, and that voting power is denominated in AAVE. This directly prevents the agent from misinterpreting a non-vote as a failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and every sentence adds value, though the core purpose appears after the version caveat rather than front-loaded. It remains efficient and free of redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description covers the important return behavior: the voted:false case, the power unit, and the single-wallet/proposal scope. It does not specify exact positive-vote response fields, but the essentials for correct invocation and interpretation are present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents both parameters with 100% coverage. The description adds no new semantic detail about user or proposalId beyond what the schema provides, so the schema-driven baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states 'How one wallet voted on one Aave DAO proposal, and with how much power,' which is a specific verb-resource pair. It clearly distinguishes this from siblings like get_proposal_votes or get_governance_proposal by the single-wallet/single-proposal scope.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The version caveat ('Takes no version argument') gives a clear exclusion and prevents misuse. However, it never explicitly names alternatives or states when to choose this tool over get_proposal_votes or search_governance_proposals, leaving some inference to the agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_vault_activityA wallet's history in one Aave VaultARead-onlyInspect
v3 only. How one wallet's position in one vault moved over a window: total yield earned, plus a per-sample breakdown of balance, deposits and withdrawals. Use it to answer 'what has this vault actually paid me', which the current APR cannot - the APR is the rate now, this is what was received. Needs the vault address and its chain, both of which get_vaults returns.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Wallet address, 0x-prefixed (40 hex chars). | |
| vault | Yes | Vault contract address, 0x-prefixed (40 hex chars). | |
| window | No | How far back to go (default week). These are the only buckets this endpoint has: there is no day and no six months, so ask for one of these rather than expecting the nearest. | |
| chainId | Yes | Chain the vault is on, e.g. 1 for Ethereum. | |
| version | No | Optional, and only 'v3': this tool exists on v3 only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, covering safety. The description adds value beyond that: it specifies 'v3 only', describes the output structure (total yield plus per-sample breakdown), and explains the window buckets (no day or six months). It does not contradict annotations and provides useful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the key constraint ('v3 only') and purpose. Every sentence earns its place: purpose, differentiation from APR, and prerequisite guidance. No fluff or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter tool with no output schema, the description is remarkably complete. It explains what is returned (total yield and per-sample breakdown), the window buckets, the version restriction, and where to get required inputs. The complexity is low but the description covers all essential aspects an agent needs to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters are documented in the schema. The description adds nuance beyond the schema: it clarifies the window enum has only specific buckets and warns against expecting others, and it reiterates the v3-only constraint. This goes beyond a baseline of 3 by enriching parameter understanding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb and resource: 'How one wallet's position in one vault moved over a window', with specific outputs (total yield, per-sample breakdown of balance, deposits, withdrawals). It explicitly distinguishes from the APR concept, which is a different metric, and mentions get_vaults as the source for required inputs, differentiating it from other history tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use it: to answer 'what has this vault actually paid me', contrasting with the current APR which is not the same. It also notes that the vault address and chain come from get_vaults. However, it does not explicitly name alternative tools like get_apy_history or get_user_activity, though the context implies them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_vault_previewPreview an Aave Vault deposit, mint, withdraw or redeemARead-onlyInspect
v3 only. Convert between a vault's assets and its shares at the current index, without building anything. Which unit 'amount' is in depends on the action, and this is the thing to get right: 'deposit' takes ASSETS and returns the shares minted, 'mint' takes SHARES and returns the assets it would cost, 'withdraw' takes ASSETS and returns the shares burnt, 'redeem' takes SHARES and returns the assets returned. Use the assets pair to fix the token amount exactly and the shares pair to fix the share count exactly. Call this before prepare_vault_action rather than multiplying by a rate: the index moves.
| Name | Required | Description | Default |
|---|---|---|---|
| vault | Yes | Vault contract address, 0x-prefixed (40 hex chars). | |
| action | Yes | Which conversion: deposit/withdraw speak assets, mint/redeem speak shares. | |
| amount | Yes | Amount in main units (e.g. '10.5'), in the unit the action takes. | |
| chainId | Yes | Chain the vault is on, e.g. 1 for Ethereum. | |
| version | No | Optional, and only 'v3': this tool exists on v3 only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds meaningful behavioral context: the conversion happens at the current index, the index moves over time, and nothing is built on-chain. This goes beyond the annotations, though it does not detail output format or error behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and front-loaded: it opens with 'v3 only', gives the core conversion concept, then the unit mapping, and then call-time guidance. It is somewhat long, but each sentence earns its place by covering required semantics rather than repeating the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only preview tool with no output schema, the description tells the agent what each action returns, what unit the amount must be in, when to call it relative to prepare_vault_action, and that it is v3-only. Combined with full schema coverage of all parameters, this is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds important semantics by explaining that 'amount' is interpreted as assets for deposit/withdraw and as shares for mint/redeem, and by advising the agent to use the assets pair or shares pair to fix the exact amount or count. This materially clarifies the interplay between 'action' and 'amount'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific operation: converting a vault's assets to/from shares at the current index, and explicitly says 'without building anything', which distinguishes it from prepare_vault_action. It also names all four action modes, making its scope unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs the agent to call this before prepare_vault_action rather than multiplying by a rate because 'the index moves'. It also warns that the unit of 'amount' depends on the action and gives the exact unit mapping for deposit/mint/withdraw/redeem, which is clear invocation guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_vaultsGet Aave Vaults, or a wallet's shares in themARead-onlyInspect
v3 only. Name exactly one of 'user', 'owner' or 'vault', and read that sentence before choosing arguments: 'user' lists every vault that wallet holds shares in and is the portfolio question, 'owner' lists what one curator runs, 'vault' reads a single vault by address and is the only one that also needs 'chainId'. An Aave Vault is an ERC-4626 vault a curator deploys over one v3 reserve, taking a fee on the yield, so its APR is below that reserve's by the fee. Shares in one are an Aave position that no market read returns. There is no catalogue to browse: this API has no "list every vault" call, so a request to find the best vault cannot be answered here - you can only look up vaults whose address, owner or holder you already have. 'aprPct' is already net of 'feePct'.
| Name | Required | Description | Default |
|---|---|---|---|
| user | No | Wallet address (0x, 40 hex) to list its vault positions. Omit the argument entirely when using another selector. | |
| owner | No | Curator address (0x, 40 hex) to list the vaults it owns. Omit the argument entirely when using another selector. | |
| vault | No | Vault contract address (0x, 40 hex) to read one vault. Needs 'chainId'. Omit the argument entirely when using another selector. | |
| cursor | No | 'nextCursor' from a previous call, to continue a 'user' or 'owner' listing. Omit the argument entirely for the first page. | |
| chainId | No | Chain the vault is on, e.g. 1 for Ethereum. | |
| version | No | Optional, and only 'v3': this tool exists on v3 only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnly and non-destructive, and the description adds valuable behavioral context beyond that: v3-only restriction, exclusive selectors, chainId requirement for vault, vault domain semantics (ERC-4626, fee on yield, APR net of fee), and the absence of a browse-all endpoint. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence adds crucial information: the opening line gives the critical exclusivity rule, followed by mode definitions, domain context, and negative scope. It is dense but tightly structured with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter tool with no required parameters and no output schema, the description fully covers the calling pattern (selectors, chainId condition), the domain meaning, and a key output semantic (aprPct net of fee). It also anticipates a likely misuse (finding best vault) and preempts it. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description adds extra meaning by enforcing exactly-one-of user/owner/vault, stating that only vault requires chainId, and clarifying aprPct/feePct relationship. However, it leaves some parameter details like cursor pagination to the schema, which is acceptable given full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool gets Aave vaults or a wallet's shares, and enumerates three distinct selector modes ('user', 'owner', 'vault') with explicit scope for each. This distinguishes it from sibling tools like get_markets or get_reserve_details, and explicitly states what it cannot do (no list-every-vault catalogue).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly instructs to name exactly one of the three selectors and when to use each mode ('portfolio question', 'what one curator runs', 'single vault'). It also gives a negative usage rule: because there is no catalogue, it cannot answer 'best vault' requests and requires known addresses, which tells the agent when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_wallet_balancesWhat a wallet holds that Aave accepts (v4)ARead-onlyInspect
v4 only. The tokens a wallet actually holds that v4 can take, per token and summed across chains, with 'perChain' saying where each sits, plus the best supply APY and lowest borrow APY the protocol currently offers on that token. This is the wallet, not a position: nothing here is supplied or borrowed yet, and the rates alongside a balance are what Aave would pay or charge, not what the wallet is earning. Start a 'what should I do with what I have' question here and a 'how is my position doing' question at get_user_summary. Omit chainId to cover every chain v4 serves, stated under 'chainsCovered'. Zero balances are left out.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Wallet address, 0x-prefixed (40 hex chars). | |
| chainId | No | Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain. | |
| version | No | Optional, and only 'v4': this tool exists on v4 only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and destructiveHint annotations, the description clarifies that the rates are potential (what Aave would pay/charge), not actual earnings, and that zero balances are omitted. It also reveals the 'chainsCovered' output field. This adds meaningful behavioral context that an agent needs to interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is information-dense but every sentence serves a purpose: scope, output composition, semantic distinction, usage guidance, chainId default, and zero-balance omission. It is well-structured with the core definition first and no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given three parameters, no output schema, and the complexity of distinguishing wallet balances from positions, the description covers all essential aspects: what data is returned, what it means, how to filter by chain, and when to use an alternative. An agent can call this tool correctly and interpret the response without further clarification.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all three parameters with 100% coverage, so the baseline is 3. The description adds value by reinforcing the chainId omission behavior and pointing to the 'chainsCovered' field, and clarifies that 'version' is only v4. This is a modest but useful addition beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool returns: wallet holdings of Aave-accepted tokens, per token and summed across chains, with per-chain breakdown, plus best supply and borrow APYs. It explicitly distinguishes itself from position-based queries ('This is the wallet, not a position') and names the sibling tool for the other use case (get_user_summary). The purpose is unambiguous and well-differentiated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides explicit guidance on when to use this tool: start 'what should I do with what I have' here, and 'how is my position doing' at get_user_summary. It also specifies the v4-only scope and the optionality of chainId ('Omit chainId to cover every chain'). This leaves no ambiguity about when to call it versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_actionPrepare supply / borrow / withdraw / repayARead-onlyInspect
Build an unsigned transaction to supply, borrow, withdraw, or repay on Aave (v3 or v4). Returns an execution plan (a transaction to sign, or an approval step first). For a borrow or a withdraw, call preview_action first and read its warnings: the simulation is free, it commits nothing, and it is the cheapest way to learn the position cannot take the action - a withdraw of collateral pinned by an open borrow is the case that catches callers out. Non-custodial: the user's wallet signs and submits; nothing is sent here, so building one is free and commits the user to nothing. Choose sensible values, build it, and say what you chose - do not stop to ask the user first, because they see the transaction before they sign it. Send only the arguments that apply and leave every other one out: v4 takes 'reserveId'; v3 takes 'market' + 'token' + 'chainId'; 'max' is for withdraw and repay; 'enableCollateral' is for supply. Never send 'permitSignature' or 'permitDeadline' on a first call: they exist only to re-issue a call after an approval step handed you a permit to sign under 'bySignature', so if you have not been handed one, leave both out. Two things that catch callers out: a supply does NOT become collateral unless you pass enableCollateral:true, and without collateral the borrowing power is zero so any later borrow is refused; and collateral pinned by an open borrow cannot be withdrawn, so a withdraw has to repay first. After sending any transaction, poll get_transaction_processed before building the dependent next one.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Withdraw/repay only: use the entire balance/debt. | |
| token | No | v3 only: underlying token address. | |
| action | Yes | Which action to build. | |
| amount | No | Amount in MAIN units (e.g. '10.5'), never base units: 100000 base units of a 6-decimal token is '0.1', not '100'. Convert before sending if the user stated base units. Omit only if max=true. | |
| market | No | v3 only: market pool address, from a get_markets row in this session. It cannot be recalled: an Aave pool address you already recognise belongs to another deployment (v2, or another chain) and is rejected. | |
| native | No | Use the chain's native gas token instead of an ERC-20. | |
| sender | Yes | Sender wallet address (0x, 40 hex): the wallet that will sign, as the user named it in this session. If no wallet has been named, ask for it; never substitute a placeholder, which is rejected. | |
| chainId | No | v3 only: chain id (positive integer). | |
| version | No | Optional: inferred from the reserve selector ('reserveId' is v4, 'market'+'token'+'chainId' is v3). Send it to be explicit, or if you somehow set both. | |
| reserveId | No | v4 only: the opaque reserveId, copied verbatim from a get_markets row or a get_position_items item in this session (e.g. 'MTo6MHg5NGU3...Ojo1') - it cannot be constructed or recalled, so fetch one before the first call rather than after a refusal. For a withdraw or a repay take it from get_position_items for the position being acted on, not from get_markets: the same asset exists on several spokes, and the one this wallet supplied is the only one it can exit. The 'spokeId' from get_user_positions is NOT this: it is the same encoding one segment short, names the spoke rather than a reserve inside it, and is rejected. A token symbol such as 'USDC' is rejected too. | |
| permitDeadline | No | Unix seconds, the 'deadline' from the permit message that was signed. Required with permitSignature. | |
| permitSignature | No | Send this only to replay a call after an approval handed you a permit to sign: the user's signature (0x...) over the PermitTypedData that approval carried under 'bySignature', on either version. It replaces the approval transaction, so the action comes back in one step. Requires permitDeadline. | |
| enableCollateral | No | supply only: also enable the asset as collateral (default false). Leave it off and the supply earns yield but backs no borrowing, so a following borrow fails for exceeding a borrowing power of zero. Pass true whenever the plan is to borrow against it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already state readOnlyHint=true and destructiveHint=false. The description reinforces this by explaining that building is non-custodial, free, commits the user to nothing, and sends nothing. It also discloses the approval-step and permit-replay behavior, which adds meaningful context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but justified for a 13-parameter tool. It front-loads the core behavior, then flows through simulation guidance, build instructions, parameter rules, and finally the two most common gotchas. Every sentence carries operational value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex prepare tool with no output schema, the description covers the execution plan return, approval-step possibility, session-context dependencies, cross-version differences, and post-transaction polling. An agent has enough to call it correctly on the first attempt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds substantial meaning: amount must be in MAIN units with a concrete conversion example, market/reserveId must come verbatim from session data and cannot be recalled or constructed, sender cannot be a placeholder, and enableCollateral has behavioral consequences for later borrows. This is far beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Build an unsigned transaction to supply, borrow, withdraw, or repay on Aave (v3 or v4)." This clearly separates it from sibling prepare_* tools and from preview_action, which is explicitly positioned as the simulation counterpart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit when-to-use guidance: call preview_action first for borrow/withdraw, read its warnings, build without asking the user, and poll get_transaction_processed before dependent calls. It also tells the agent what not to send on first calls and when permit parameters are appropriate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_cancel_orderPrepare an order cancellation (EIP-712 to sign)ARead-onlyInspect
No version argument. From an orderId, return the EIP-712 cancellation for the user to sign; cancel_order relays the result. This is the gasless route for an intent order; an order that went on chain (a native-token sell) is cancelled with cancel_order's transaction route instead, which needs no signature and no prepare. Non-custodial: this returns what the user signs, and commits nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| orderId | Yes | The order id (from submit_signed_order's receipt, get_order_status or get_pending_orders). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and destructiveHint=false. The description adds context by stating it is non-custodial, commits nothing, and only returns what the user signs, which clarifies the side-effect profile beyond the raw annotation booleans.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences with no filler. It front-loads the purpose and version caveat, then adds routing and safety context, every clause contributing useful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter tool with read-only annotations, the description covers the routing decision, signature requirement, version behavior, and side-effect profile. There is no output schema, so the description adequately conveys the return value as an EIP-712 cancellation to sign, though it does not detail its structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the only parameter, orderId, already has a description with source hints. The tool description mentions 'from an orderId' but adds no additional parameter semantics beyond what the schema provides, so baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: from an orderId, it returns the EIP-712 cancellation payload for the user to sign. It clearly differentiates itself from cancel_order, which relays the result, and from the transaction route.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names cancel_order as the alternative and explains the split: intent orders use this gasless prepare-then-sign route, while native-token sell orders on chain use cancel_order's transaction route without prepare or signature. This is strong when-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_claim_rewardsPrepare a rewards claim (V4)ARead-onlyInspect
v4 only. Build an unsigned transaction to claim a wallet's V4 rewards. If 'ids' is omitted, claims everything currently claimable. Non-custodial. There is no v3 equivalent because a v3 claim needs no second call: get_user_rewards already returns the transaction.
| Name | Required | Description | Default |
|---|---|---|---|
| ids | No | Optional reward ids (from get_user_rewards). Omit to claim all claimable. | |
| user | Yes | Wallet address (0x, 40 hex). | |
| chainId | No | Chain id to claim on. Required unless 'ids' is omitted, in which case the chain is discovered from the wallet's claimable rewards. | |
| version | No | Optional, and only 'v4': this tool exists on v4 only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description adds meaningful behavioral context beyond that: the tool is 'non-custodial' and builds an 'unsigned transaction,' so the agent knows nothing is broadcast or mutated. It also discloses default behavior when ids is omitted.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short, information-dense sentences with no filler. The most important qualifier ('v4 only') and the core purpose are front-loaded, and the v3 clarification is placed at the end where it serves as useful extra context.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers purpose, version scoping, non-custodial behavior, default claim-all behavior, and the v3 alternative, which is sufficient for invoking the tool correctly. It does not describe the exact output structure, but the phrase 'build an unsigned transaction' conveys the key return concept and there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents ids, user, chainId, and version. The description adds a useful conditional relationship—that chainId can be omitted when ids is omitted because the chain is discovered—but most parameter meaning is already present in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description begins with 'v4 only' and states a specific action: 'Build an unsigned transaction to claim a wallet's V4 rewards.' This clearly identifies the verb, resource, and scope, and the wording distinguishes it from get_user_rewards and other prepare_* siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly scopes usage to v4 and explains the v3 alternative: 'There is no v3 equivalent because a v3 claim needs no second call: get_user_rewards already returns the transaction.' It also clarifies when to omit ids, telling the agent to claim everything when no ids are supplied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_liquidationPrepare a liquidationARead-onlyInspect
Build an unsigned transaction to liquidate an unhealthy position: repay part of someone else's debt and receive their collateral plus the liquidation bonus. Only viable while that position's health factor is below 1 (check get_user_summary for the target). v4 takes collateral and debt as reserveIds; v3 takes collateralToken and debtToken addresses plus chainId. Non-custodial: the liquidator signs and submits.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Cover the maximum the protocol allows. | |
| debt | No | v4 only: reserveId of the debt to repay. | |
| user | Yes | The wallet being liquidated (0x, 40 hex). | |
| amount | No | Debt to cover, in main units. Omit only if max=true. | |
| market | No | v3 only: market pool address (from get_markets). | |
| chainId | No | v3 only: chain id (positive integer). | |
| version | Yes | Protocol version (v3 or v4; required, no 'all' for actions). | |
| debtToken | No | v3 only: debt token address. | |
| collateral | No | v4 only: reserveId of the collateral to seize. | |
| liquidator | No | v4 only: the wallet performing the liquidation (0x, 40 hex). On v3 the liquidator is whoever signs the returned transaction. | |
| collateralToken | No | v3 only: collateral token address. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only and non-destructive; the description adds that this is non-custodial and that the liquidator signs and submits the transaction. It also discloses the version-specific input model, which goes beyond what the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: purpose, viability condition, version differences, and custody model are each covered in a few efficient sentences. No filler or redundant restatement of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's 11 parameters, two protocol versions, and no output schema, the description covers the essential decision points well. It does not describe the exact shape of the returned unsigned transaction, but for a transaction builder the purpose and version-specific inputs are the critical context, so this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds cross-parameter meaning by mapping v4 to reserveIds and v3 to token addresses plus chainId, and clarifying that the liquidator is implicit in v3 but explicit in v4. This adds value beyond individual schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Build an unsigned transaction to liquidate an unhealthy position.' It explains the economic flow (repay debt, receive collateral plus bonus) and clearly distinguishes this from sibling prepare_* tools like prepare_order or prepare_claim_rewards.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit viability condition ('health factor is below 1') and points the agent to get_user_summary to verify it. It also provides version-specific routing guidance, though it does not name a when-not-to-use alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_orderPrepare an order (typed data or transaction to sign)ARead-onlyInspect
No version argument: every order runs on the v4 backend. One prepare for every product - a token swap, position swap, repay-with-supply or leverage quoteId all come here. Which optional arguments apply is decided by the quote that minted the quoteId, so decide before emitting any: a token-swap quote that offered a 'bySignature' permit takes permitSignature + permitDeadline once that permit is signed; a position-swap, repay-with-supply or leverage quote listing approvals takes one signature per approval under its matching argument (adapterContractSignature, positionManagerSignature, setCollateralSignature, and on a leverage quote permitSignature + permitDeadline for an ERC-20 approval's 'byPermit'); route:'transaction' applies only to a SwapByTransaction... quote (a native-token sell) and takes no signatures at all. Never send a signature argument unsolicited - each exists to carry back a signature its quote explicitly asked for. Non-custodial: this returns what the user signs, and commits nothing.
| Name | Required | Description | Default |
|---|---|---|---|
| route | No | Which execution route the quote needs, taken from its __typename: 'intent' (default) for everything except SwapByTransaction..., which takes 'transaction' and returns the on-chain transaction plus an orderReceipt, the route a native-token sell takes. | |
| quoteId | Yes | quoteId from get_swap_quote, get_position_swap_quote, get_repay_with_supply_quote or get_leverage_quote. | |
| permitDeadline | No | Unix seconds, the 'deadline' from the permit message that was signed. Required with permitSignature. | |
| permitSignature | No | The user's signature (0x...) over the PermitTypedData a quote's approvals offered: under 'bySignature' on a token-swap quote, under 'byPermit' on a leverage quote's ERC-20 approval. Sending it skips the approval transaction. Never send it on a first call - you only have one once a quote has handed you a permit to sign. Requires permitDeadline. | |
| setCollateralSignature | No | Signature (0x...) over the 'bySignature' of a set-collateral approval the quote listed. Only when the quote asked for it. | |
| adapterContractSignature | No | Signature (0x...) over the 'bySignature' of an adapter approval the quote listed. Only when the quote asked for it. | |
| positionManagerSignature | No | Signature (0x...) over the 'bySignature' of a position-manager approval the quote listed. Only when the quote asked for it; omit it entirely if that approval's 'byTransaction' was sent instead. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, and the description is consistent with them ('Non-custodial: this returns what the user signs, and commits nothing'), reinforcing the non-mutating nature. It adds genuinely useful behavior beyond the annotations — no version argument, per-quote signature requirements, and that no signature should ever be sent unsolicited.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single dense paragraph front-loaded with a negative edge case ('No version argument') rather than the core purpose, and the conditional signature rules would be far clearer as a list. Content is mostly substantive, but the structure makes it hard to scan.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter tool with no output schema, it covers routing, signature preconditions, and the fact that the return value is unsigned user-facing data. It omits what to do with the result (submitting via submit_signed_order) and the distinction between the intent route's return shape and the transaction route's orderReceipt, so a small gap remains.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description goes beyond it by explaining which quote type maps to each signature parameter (permitSignature under 'bySignature' vs a leverage 'byPermit', adapterContractSignature/positionManagerSignature/setCollateralSignature per listed approval) and when route applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource whose scope is defined by a quoteId ('One prepare for every product - a token swap, position swap, repay-with-supply or leverage quoteId all come here'), which cleanly separates it from prepare_action, prepare_set_collateral and the other prepare_* siblings that handle non-quote flows.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit conditional rules: signatures only when the originating quote asked for them, route:'transaction' only for SwapByTransaction quotes from a native-token sell. It does not state the surrounding workflow (get quote first, submit_signed_order after), so it falls short of full when/when-not coverage, but the per-quote routing guidance is unusually concrete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_set_collateralPrepare enable/disable collateralARead-onlyInspect
Build an unsigned transaction to change whether a supplied asset is used as collateral (v3 or v4). On v4 'enable' sets the state; on v3 it toggles the current state, and a toggle that would invert a stated 'enable' is refused. The wallet must already hold a supply in that reserve: this sets a flag on it, nothing moves. Disabling can leave a position liquidatable, so it is simulated first: a health factor under 1 after is refused, just above 1 carries a warning to relay, and a build whose simulation could not run says so under 'warnings'. Enabling needs no check. Non-custodial.
| Name | Required | Description | Default |
|---|---|---|---|
| token | No | v3 only: underlying token address. | |
| enable | No | v4: true to enable, false to disable (default true). v3 toggles the current state; send it on v3 as the intended end state, and a toggle that would produce the opposite is refused. | |
| market | No | v3 only: market pool address. | |
| sender | Yes | Sender wallet address (0x, 40 hex): the wallet that will sign, as the user named it in this session. If no wallet has been named, ask for it; never substitute a placeholder, which is rejected. | |
| chainId | No | v3 only: chain id (positive integer). | |
| version | No | Optional: inferred from the reserve selector ('reserveId' is v4, 'market'+'token'+'chainId' is v3). Send it to be explicit, or if you somehow set both. | |
| reserveId | No | v4 only: the opaque reserveId, copied verbatim from a get_markets row or a get_position_items item in this session (e.g. 'MTo6MHg5NGU3...Ojo1') - it cannot be constructed or recalled, so fetch one before the first call rather than after a refusal. For a withdraw or a repay take it from get_position_items for the position being acted on, not from get_markets: the same asset exists on several spokes, and the one this wallet supplied is the only one it can exit. The 'spokeId' from get_user_positions is NOT this: it is the same encoding one segment short, names the spoke rather than a reserve inside it, and is rejected. A token symbol such as 'USDC' is rejected too. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes far beyond the readOnlyHint annotation by explaining the v3/v4 difference, toggle-refusal behavior, health-factor simulation with refusal/warning thresholds, and the fact that nothing moves. The description makes side effects and failure modes explicit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose, then the v3/v4 divergence, then constraints and simulation behavior. Dense but each sentence adds necessary information; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Comprehensive for a complex tool: covers version behavior, preconditions, health-factor effects, refusal and warning semantics, and sender requirements. It doesn't enumerate the return shape beyond warnings, but that gap is acceptable without an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Adds meaning beyond the schema: explains 'enable' means set-state on v4 but toggle on v3, that sender must be a named wallet, and how version and reserve selector are inferred. This compensates for ambiguous parameter names like 'enable'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific operation (build an unsigned transaction to change collateral status) and immediately distinguishes v3 from v4 semanticsatio. It clearly tells an agent what the tool does and how it differs from sibling prepare_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides strong context: requires an existing supply in the reserve, explains that disabling is simulated firstholved, and notes non-custodial execution. It does not name a sibling tool as an explicit alternative, so it misses full exclusion guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_set_emodePrepare an eMode change (v3)ARead-onlyInspect
v3 only. Build an unsigned transaction to switch a wallet's Aave v3 eMode category. eMode groups correlated assets (ETH-correlated, stablecoins) so they borrow against each other at a higher LTV, raising borrowing power at the cost of restricting which assets the position may hold. Take categoryId from get_emode_categories for that market; pass 0 to turn eMode off. v3 only: v4 replaces eMode with risk premium and dynamic config.
| Name | Required | Description | Default |
|---|---|---|---|
| market | Yes | v3 only: market pool address, from a get_markets row in this session. It cannot be recalled: an Aave pool address you already recognise belongs to another deployment (v2, or another chain) and is rejected. | |
| sender | Yes | Sender wallet address (0x, 40 hex): the wallet that will sign, as the user named it in this session. If no wallet has been named, ask for it; never substitute a placeholder, which is rejected. | |
| chainId | Yes | Chain id (positive integer). | |
| version | No | Optional, and only 'v3': this tool exists on v3 only. | |
| categoryId | Yes | eMode categoryId from get_emode_categories, or 0 to disable. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false. The description adds context beyond annotations: it builds an unsigned transaction (not submitting), it explains the eMode concept and its tradeoff, and it notes that v4 replaces eMode. It doesn't explicitly say 'this does not submit a transaction', but 'Build an unsigned transaction' implies that. The description is consistent with annotations and adds meaningful behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: it opens with 'v3 only' and the core action, then explains the eMode concept in one sentence, then gives the two key usage instructions (take categoryId from get_emode_categories, pass 0 to disable), and closes with the v4 exclusion. Every sentence earns its place; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a transaction-building tool with no output schema, the description covers the essential context: what the tool does, how to get the required categoryId, how to disable eMode, the version constraint, and the v4 alternative. The schema covers parameter details, and annotations cover safety. An agent has enough to select and invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description adds value by explaining the semantic meaning of categoryId (from get_emode_categories, 0 to disable) and the market constraint (v3 only, from a get_markets row, cannot be recalled). It also clarifies the version parameter is optional and only 'v3'. This goes beyond the schema's field-level descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Build an unsigned transaction'), a specific resource ('Aave v3 eMode category'), and the exact scope ('v3 only'). It also explains what eMode does (groups correlated assets, higher LTV, borrowing power vs. asset restrictions), which distinguishes it from generic prepare_* siblings. The phrase 'v3 only' is repeated, reinforcing the version constraint.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says when to use this tool: to switch a wallet's Aave v3 eMode category. It tells the agent to take categoryId from get_emode_categories, and to pass 0 to turn eMode off. It also explicitly excludes v4 ('v4 replaces eMode with risk premium and dynamic config'), which is a clear when-not-to-use signal. This is strong guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_sgho_actionPrepare an sGHO deposit or withdrawalARead-onlyInspect
v3 only, Ethereum only. Build an unsigned transaction to deposit GHO into the sGHO vault or withdraw from it. Non-custodial: the user's wallet signs and submits, so building one commits them to nothing. Choose sensible values, build it, and say what you chose rather than stopping to ask. Send only the arguments that apply and leave every other one out. On 'deposit', 'amount' is GHO. On 'withdraw', 'amount' is a number of sGHO SHARES, not GHO - get_sgho_preview converts - or pass max:true to redeem the whole position and omit 'amount'. 'recipient' is only for sending the result to a different address than the sender. A deposit needs a GHO allowance: when the result is ApprovalRequired, submit its 'approval' transaction and then the 'originalTransaction' beside it, in that order.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | withdraw only: redeem the entire share balance. | |
| action | Yes | Which side to build: deposit GHO, or withdraw by redeeming shares. | |
| amount | No | Amount in main units: GHO to deposit, or sGHO shares to redeem. Omit only when max=true. | |
| sender | Yes | Wallet address, 0x-prefixed (40 hex chars). | |
| version | No | Optional, and only 'v3': this tool exists on v3 only. | |
| recipient | No | Optional address to receive the shares (deposit) or the GHO (withdraw). Omit the argument entirely to use the sender. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as read-only and non-destructive; the description reinforces and expands this by explaining the non-custodial unsigned-transaction behavior and that building commits the user to nothing. It also discloses the allowance/ApprovalRequired flow. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence carries operational value. It front-loads scope and the core action, then flows into parameter rules and the approval edge case without filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description covers chain and version constraints, both actions, parameter semantics, the max flag, recipient behavior, and the ApprovalRequired result path. This is sufficient for correct selection and invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds crucial semantics beyond the schema: amount means GHO on deposit but sGHO shares on withdraw, max:true omits amount, recipient defaults to sender, and only applicable arguments should be sent. This significantly reduces ambiguity for an agent.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Build an unsigned transaction to deposit GHO into the sGHO vault or withdraw from it.' It also narrows scope with 'v3 only, Ethereum only' and clearly separates the two actions. This distinguishes it from sibling data/read tools like get_sgho_vault and get_sgho_preview.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear eligibility conditions (v3, Ethereum) and decision rules: amount is GHO for deposit but sGHO shares for withdraw, max:true omits amount, recipient is optional, and approval transactions must be submitted in order. It references get_sgho_preview for conversions, but does not explicitly name alternative prepare_* tools or state when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_stkgho_migratePrepare a stkGHO migration into sGHOARead-onlyInspect
v3 only, Ethereum only. Build an unsigned transaction that moves a wallet's stkGHO out of the Safety Module and into the sGHO vault. All-or-nothing: it covers the entire stkGHO position and takes no amount. Call get_safety_module with the same wallet first and quote the legacy stkGHO balance it returns, so the user knows what they are moving before they sign. Non-custodial, so build it rather than asking permission first.
| Name | Required | Description | Default |
|---|---|---|---|
| user | Yes | Wallet address, 0x-prefixed (40 hex chars). | |
| version | No | Optional, and only 'v3': this tool exists on v3 only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds meaningful behavioral context beyond annotations: the transaction is unsigned/non-custodial, it is all-or-nothing, it takes no amount, and it should be built rather than permission-asked. These details complement the readOnlyHint=true annotation without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences with no fluff: scope constraints come first, then the action, then the critical all-or-nothing and prerequisite behavior. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with one required parameter and no output schema, the description is complete: it explains what is built, the full-position behavior, the prerequisite get_safety_module call, and the non-custodial flow. Nothing essential is missing for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters. The description clarifies that 'user' is the stkGHO holder and explains why no amount parameter exists, but it does not add significant format-level meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Build an unsigned transaction that moves a wallet's stkGHO out of the Safety Module and into the sGHO vault.' It also adds scope constraints ('v3 only, Ethereum only') and the all-or-nothing behavior, clearly distinguishing it from sibling prepare_* tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit precondition: call get_safety_module first and quote the legacy stkGHO balance before signing. It also states v3/Ethereum-only applicability and that the transaction covers the entire position, but it does not explicitly name alternatives or spell out when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
prepare_vault_actionPrepare an Aave Vault deposit, mint, withdraw or redeemARead-onlyInspect
v3 only. Build an unsigned transaction to move value in or out of an Aave Vault. Non-custodial: the user's wallet signs and submits, so building one commits them to nothing - choose sensible values, build it, and say what you chose rather than stopping to ask. Which unit 'amount' is in depends on the action: 'deposit' and 'withdraw' take ASSETS, 'mint' and 'redeem' take SHARES. Set 'asAToken' true to move the reserve's aToken instead of its underlying token, which skips supplying first when the wallet already holds the aToken. 'recipient' is only for sending the result to a different address than the sender. A deposit or mint needs an allowance: when the result is ApprovalRequired, submit its 'approval' transaction, wait for it to be mined, then submit the 'originalTransaction' beside it.
| Name | Required | Description | Default |
|---|---|---|---|
| vault | Yes | Vault contract address, 0x-prefixed (40 hex chars). | |
| action | Yes | Which side to build: deposit/withdraw in assets, mint/redeem in shares. | |
| amount | Yes | Amount in main units, in the unit the action takes (assets or shares). | |
| sender | Yes | Wallet address, 0x-prefixed (40 hex chars). | |
| chainId | Yes | Chain the vault is on, e.g. 1 for Ethereum. | |
| version | No | Optional, and only 'v3': this tool exists on v3 only. | |
| asAToken | No | Move the reserve's aToken rather than its underlying token (default false). | |
| recipient | No | Optional address to receive the shares or the assets. Omit the argument entirely to use the sender. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the tool is known to be non-mutating. The description goes well beyond this: it reveals that the unsigned transaction commits the user to nothing, explains the approval requirement and the exact sequence (submit approval, wait, then submit originalTransaction), and clarifies that 'recipient' is only for relaying. It also exposes the dependency of unit on action. This is rich behavioral disclosure with no contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact yet dense, with every sentence adding distinct value. It leads with the key constraint ('v3 only') and the core operation, then methodically covers the crucial edge cases (units, asAToken, recipient, approval flow). No fluff or repetition of schema fields; it's an ideal length for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (8 params, 5 required, no output schema), the description covers all critical aspects an agent needs to call it correctly: version restriction, non-custodial nature, unit semantics, approval handling, and even hints at the response shape (ApprovalRequired, approval, originalTransaction). There's no missing information that would cause an agent to mis-invoke the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100% (all parameters have descriptions), the tool description adds substantial semantic meaning: it clarifies the ambiguous 'amount' by tying it to action type (assets vs shares), explains the effect of asAToken (skips supplying when wallet holds aToken), and states that omitting recipient defaults to sender. This elevates the parameter understanding beyond the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'v3 only. Build an unsigned transaction to move value in or out of an Aave Vault.' It identifies the specific resource (Aave Vault), the verb (build), and the exact set of actions (deposit, mint, withdraw, redeem). This distinguishes it from sibling prepare_* tools like prepare_order or prepare_liquidation, which operate on different instruments.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides strong usage context: it's v3 only, non-custodial (so the agent should proceed without asking), and explains the unit handling (assets vs shares) and asAToken behavior. It also describes the approval flow when needed. However, it does not explicitly name alternative tools or state when to use this instead of them, though the abundance of other prepare_* siblings makes that somewhat implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
preview_actionPreview an action (simulate before executing)ARead-onlyInspect
Simulate a supply/borrow/withdraw/repay against a wallet's position WITHOUT executing, on v3 or v4 - or, v4 only, a quoted order that moves a position: a leverage, a position swap or a repay-with-supply. Always do this before a borrow, a withdraw or any of those orders. Send only the arguments that apply: v4 takes 'reserveId'; v3 takes 'market' + 'token' + 'chainId'; 'max' is for withdraw and repay; 'native' works on both; 'enableCollateral' is v4 only. A quoted order takes 'quoteId' and 'sender' and nothing else, since the quote already binds the wallet, the reserves and the amounts, and the action names the tool that minted it: 'leverage' for get_leverage_quote, 'supplySwap' or 'borrowSwap' for get_position_swap_quote with kind supply or borrow, 'repayWithSupply' for get_repay_with_supply_quote. Both versions answer with 'healthFactorBefore' and 'healthFactorAfter'; v4 also returns net APY, risk premium, net collateral, net balance, projected earnings and both borrowing-power figures, each as a matching Before/After pair, plus 'rewardsAcquired' / 'rewardsAbandoned' when the action changes rewards. v3 has the two health factors and nothing else. Either version also returns 'warnings' when the action would not actually succeed - an error level there means the prepare step will refuse it, so fix the inputs rather than building it. Simulate first even when you intend to build immediately: this is the cheapest way to find out that an action cannot succeed, and it commits nothing. It reports the position's own limits and not token allowances, so a clean simulation says the position allows this, not that no approval step remains.
| Name | Required | Description | Default |
|---|---|---|---|
| max | No | Withdraw/repay only: use the entire balance/debt. | |
| token | No | v3 only: underlying token address. | |
| action | Yes | Action to simulate. 'leverage', 'supplySwap', 'borrowSwap' and 'repayWithSupply' simulate a quoted order and take 'quoteId' and 'sender', nothing else. | |
| amount | No | Amount in MAIN units (e.g. '10.5'), never base units: 100000 base units of a 6-decimal token is '0.1', not '100'. Convert before sending if the user stated base units. Omit only if max=true or the action is a quoted order. | |
| market | No | v3 only: market pool address, from a get_markets row in this session. It cannot be recalled: an Aave pool address you already recognise belongs to another deployment (v2, or another chain) and is rejected. | |
| native | No | Use the chain's native gas token instead of an ERC-20, on either version. Pass it whenever the action is in the native token, or the balance check below reads the wrapped ERC-20 balance and can refuse a supply that would work. | |
| sender | Yes | Sender wallet address (0x, 40 hex): the wallet that will sign, as the user named it in this session. If no wallet has been named, ask for it; never substitute a placeholder, which is rejected. | |
| chainId | No | v3 only: chain id (positive integer). | |
| quoteId | No | Quoted orders only: the quoteId from the quote tool the action names, in this session. The quote binds everything else, wallet included, so 'sender' is the 'user' it was quoted for and no other selector or amount applies. | |
| version | No | Optional: inferred from the reserve selector ('reserveId' is v4, 'market'+'token'+'chainId' is v3). Send it to be explicit, or if you somehow set both. | |
| reserveId | No | v4 only: the opaque reserveId, copied verbatim from a get_markets row or a get_position_items item in this session (e.g. 'MTo6MHg5NGU3...Ojo1') - it cannot be constructed or recalled, so fetch one before the first call rather than after a refusal. For a withdraw or a repay take it from get_position_items for the position being acted on, not from get_markets: the same asset exists on several spokes, and the one this wallet supplied is the only one it can exit. The 'spokeId' from get_user_positions is NOT this: it is the same encoding one segment short, names the spoke rather than a reserve inside it, and is rejected. A token symbol such as 'USDC' is rejected too. | |
| enableCollateral | No | v4 supply only: also enable as collateral. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/non-destructive annotations, it discloses that the call commits nothing, that 'warnings' with error level predicts a prepare-step refusal, and — a genuinely valuable caveat — that it checks position limits rather than token allowances, so a clean simulation does not mean no approval is needed. It also spells out version-specific return payloads (health factors only on v3; APY, risk premium, net collateral/balance, borrowing power, rewards on v4).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the imperative to simulate first are front-loaded, and almost every clause carries information an agent needs for a 12-parameter conditional tool. It is, however, a dense run-on chain, and the 'cheapest way to find out... commits nothing' sentence partially restates the earlier 'WITHOUT executing'/'Always do this' framing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-output-schema tool with 12 parameters and two protocol versions, the description covers the return shape of both versions, warning semantics, selector sourcing, and the allowance blind spot. Nothing an agent needs in order to call it correctly or interpret the result appears to be missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3; the description earns an extra point by adding cross-field routing the schema does not state as such — which argument set each version and each action type takes, and which quote tool each quoted-order action name corresponds to. Most individual parameter meaning (reserveId opacity, max, native, sender) is duplicated from the schema rather than extended.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — simulate a supply/borrow/withdraw/repay or quoted order against a wallet position WITHOUT executing — and enumerates the exact action set. It also separates itself from the build path by naming 'the prepare step' that will refuse a failed simulation, so an agent can tell it apart from prepare_action and the quote tools without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit directive: 'Always do this before a borrow, a withdraw or any of those orders,' reinforced by 'Simulate first even when you intend to build immediately.' It also routes each quoted-order action to the sibling that minted its quote (get_leverage_quote, get_position_swap_quote, get_repay_with_supply_quote), leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_governance_proposalsSearch Aave DAO proposalsARead-onlyInspect
Takes no 'version' argument (DAO governance is not per-market; Governance V3 is unrelated to Aave v3/v4 markets). List or search Aave DAO governance proposals. Filter by 'state' to answer "what is live right now" (state 'active') or "what is waiting to execute" (state 'queued'). Pass 'search' for full-text over title, author and description, ranked by relevance. Vote tallies are in AAVE.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max rows to return (1-100, default 20). | |
| state | No | Filter to one lifecycle state. 'active' is open for voting, 'queued' passed and waits out the timelock, 'executed' is done. Omit for every state. | |
| offset | No | Rows to skip, for paging (default 0). | |
| search | No | Optional full-text query, e.g. 'GHO' or 'Chaos Labs'. Combines with 'state'. | |
| includeSummaries | No | Include each proposal's ~500-char summary (default false). Adds roughly 500 bytes per row, so ask for it when summarising a list rather than when looking one up. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false. The description adds useful behavioral context: vote tallies are in AAVE, search ranks by relevance over title/author/description, state values map to lifecycle phases, and includeSummaries has a size/bandwidth tradeoff. It does not disclose pagination edge cases or default ordering, but provides solid additional transparency beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and information-dense. Every sentence earns its place: it clarifies the version misconception, explains core filtering use cases, describes search behavior, and notes the AAVE tally unit. The most important scoping fact is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list/search tool with no output schema and 100% schema coverage, the description is nearly complete. It explains state semantics, search scope, result ranking, tally unit, and the includeSummaries tradeoff. It does not mention default sort order or how limit/offset pagination behaves, but those are less critical for a simple query tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters. The description adds value by explaining the meaning of active/queued states and the tradeoff of includeSummaries, but it does not add significant syntax or format details beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('List or search') and resource ('Aave DAO governance proposals'), and clarifies scope by noting it is not per-market and unrelated to Aave v3/v4 markets. It also distinguishes from the sibling get_governance_proposal by implying list/search vs single-item retrieval, making it easy for an agent to select correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives concrete when-to-use guidance: use state 'active' for 'what is live right now' and state 'queued' for 'what is waiting to execute'. It also notes that the tool takes no 'version' argument and explains why, preventing a common misuse. It does not explicitly name sibling alternatives, but the search/filter behavior is clearly scoped.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_signed_orderSubmit a user-signed orderADestructiveIdempotentInspect
No version argument: every order runs on the v4 backend. Relay an order the user already signed (quoteId + signature from prepare_order's PreparedOrder). State-changing: this posts the order. The server never signs.
| Name | Required | Description | Default |
|---|---|---|---|
| quoteId | Yes | quoteId (the newQuoteId returned by prepare_order). | |
| signature | Yes | The user's EIP-712 signature (0x...). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses that the operation is state-changing, that the server never signs (so the signature must come from the user), and that there is no version argument because all orders use v4. These are meaningful behavioral details not present in the annotations and they align with readOnlyHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four short sentences, each carrying distinct information: version scope, what to relay, state-change effect, and server signing behavior. There is no filler or redundancy; the most important scoping note is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with no output schema, the description covers the essential operational context: prerequisite, inputs, state-change, and a critical server-side behavior. It omits what the response contains (e.g., order id or error conditions), which is a minor gap for an agent executing the call.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameters are already fully documented. The description mostly repeats the schema's origin info ('quoteId + signature from prepare_order's PreparedOrder') and adds no new semantic detail beyond that. A baseline of 3 is appropriate because the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses specific verbs ('Relay', 'posts') with a clear resource ('an order') and explicitly distinguishes this from prepare_order by referencing 'quoteId + signature from prepare_order's PreparedOrder'. The version note ('every order runs on the v4 backend') further scopes the tool's behavior, leaving no ambiguity about what it does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly establishes the prerequisite: use this after prepare_order, relaying the user's signed order. It does not explicitly name alternatives or state when not to use it, but the reference to prepare_order and the lack of other submit tools among siblings makes the intended usage obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
6 tool updates
- Changed
get_aave_guide1 field changed- changed
Input schema / properties / topic / enumPrevious value: -[ - "overview", - "v4", - "v3", - "positions", - "health-factor", - "risks", - "ids", - "amounts", - "prices", - "signing", - "swaps", - "gho", - "safety-module", - "portfolio", - "governance", - "rewards", - "tools", - "docs" -]New value: +[ + "overview", + "v4", + "v3", + "positions", + "health-factor", + "risks", + "ids", + "amounts", + "prices", + "signing", + "swaps", + "leverage", + "gho", + "safety-module", + "portfolio", + "governance", + "rewards", + "tools", + "docs" +]
- Added
get_leverage_quote - Added
get_position_swap_quote - Added
get_repay_with_supply_quote - Changed
prepare_order5 fields changed- added
Input schema / properties / adapterContractSignatureAdded value: +{ + "description": "Signature (0x...) over the 'bySignature' of an adapter approval the quote listed. Only when the quote asked for it.", + "type": "string" +} - changed
Input schema / properties / permitSignature / descriptionPrevious value: -"The user's signature (0x...) over the PermitTypedData a quote's approvals offered under 'bySignature'. Sending it skips the approval transaction. Never send it on a first call - you only have one once a quote has handed you a permit to sign. Requires permitDeadline."New value: +"The user's signature (0x...) over the PermitTypedData a quote's approvals offered: under 'bySignature' on a token-swap quote, under 'byPermit' on a leverage quote's ERC-20 approval. Sending it skips the approval transaction. Never send it on a first call - you only have one once a quote has handed you a permit to sign. Requires permitDeadline." - added
Input schema / properties / positionManagerSignatureAdded value: +{ + "description": "Signature (0x...) over the 'bySignature' of a position-manager approval the quote listed. Only when the quote asked for it; omit it entirely if that approval's 'byTransaction' was sent instead.", + "type": "string" +} - changed
Input schema / properties / quoteId / descriptionPrevious value: -"quoteId from get_swap_quote."New value: +"quoteId from get_swap_quote, get_position_swap_quote, get_repay_with_supply_quote or get_leverage_quote." - added
Input schema / properties / setCollateralSignatureAdded value: +{ + "description": "Signature (0x...) over the 'bySignature' of a set-collateral approval the quote listed. Only when the quote asked for it.", + "type": "string" +}
- Changed
preview_action4 fields changed- changed
Input schema / properties / action / descriptionPrevious value: -"Action to simulate."New value: +"Action to simulate. 'leverage', 'supplySwap', 'borrowSwap' and 'repayWithSupply' simulate a quoted order and take 'quoteId' and 'sender', nothing else." - changed
Input schema / properties / action / enumPrevious value: -[ - "supply", - "borrow", - "withdraw", - "repay" -]New value: +[ + "supply", + "borrow", + "withdraw", + "repay", + "leverage", + "supplySwap", + "borrowSwap", + "repayWithSupply" +] - changed
Input schema / properties / amount / descriptionPrevious value: -"Amount in MAIN units (e.g. '10.5'), never base units: 100000 base units of a 6-decimal token is '0.1', not '100'. Convert before sending if the user stated base units. Omit only if max=true."New value: +"Amount in MAIN units (e.g. '10.5'), never base units: 100000 base units of a 6-decimal token is '0.1', not '100'. Convert before sending if the user stated base units. Omit only if max=true or the action is a quoted order." - added
Input schema / properties / quoteIdAdded value: +{ + "description": "Quoted orders only: the quoteId from the quote tool the action names, in this session. The quote binds everything else, wallet included, so 'sender' is the 'user' it was quoted for and no other selector or amount applies.", + "type": "string" +}
3 tool updates
- Changed
get_spoke_configs2 fields changed- changed
Input schema / properties / hubId / descriptionPrevious value: -"hubId from get_hubs."New value: +"hubId from get_reserve_details or get_hubs." - changed
Input schema / properties / spokeId / descriptionPrevious value: -"spokeId from get_user_positions (not the spoke address)."New value: +"spokeId from get_reserve_details, or from get_user_positions (not the spoke address)."
- Changed
get_vault_activity2 fields changed- changed
Input schema / properties / window / descriptionPrevious value: -"How far back to go (default week). This endpoint buckets by week at the shortest, so 'day' reads as a week."New value: +"How far back to go (default week). These are the only buckets this endpoint has: there is no day and no six months, so ask for one of these rather than expecting the nearest." - changed
Input schema / properties / window / enumPrevious value: -[ - "day", - "week", - "month", - "sixMonths", - "year" -]New value: +[ + "week", + "month", + "year", + "max" +]
- Changed
get_vaults1 field changed- added
Input schema / properties / cursorAdded value: +{ + "description": "'nextCursor' from a previous call, to continue a 'user' or 'owner' listing. Omit the argument entirely for the first page.", + "type": "string" +}
14 tool updates
- Changed
get_aave_guide1 field changed- changed
Input schema / properties / topic / enumPrevious value: -[ - "overview", - "v4", - "v3", - "positions", - "health-factor", - "risks", - "ids", - "amounts", - "prices", - "signing", - "swaps", - "gho", - "governance", - "rewards", - "tools", - "docs" -]New value: +[ + "overview", + "v4", + "v3", + "positions", + "health-factor", + "risks", + "ids", + "amounts", + "prices", + "signing", + "swaps", + "gho", + "safety-module", + "portfolio", + "governance", + "rewards", + "tools", + "docs" +]
- Added
get_asset_history - Added
get_interest_rate_model - Added
get_market_history - Added
get_multichain_asset - Added
get_reserve_holders - Added
get_risk_premium - Added
get_safety_module - Added
get_spoke_configs - Added
get_vault_activity - Added
get_vault_preview - Added
get_vaults - Added
get_wallet_balances - Added
prepare_vault_action
9 tool updates
- Changed
get_apy_history2 fields changed- changed
Input schema / properties / version / descriptionPrevious value: -"Protocol version (v3 or v4; required)."New value: +"Optional: inferred from the reserve selector ('reserveId' is v4, 'market'+'token'+'chainId' is v3). Send it to be explicit, or if you somehow set both." - removed
Input schema / requiredRemoved value: -[ - "version" -]
- Changed
get_emode_categories1 field changed- added
Input schema / properties / versionAdded value: +{ + "description": "Optional, and only 'v3': this tool exists on v3 only.", + "enum": [ + "v3" + ], + "type": "string" +}
- Changed
get_reserve_details2 fields changed- changed
Input schema / properties / version / descriptionPrevious value: -"Protocol version (v3 or v4; required)."New value: +"Optional: inferred from the reserve selector ('reserveId' is v4, 'market'+'token'+'chainId' is v3). Send it to be explicit, or if you somehow set both." - removed
Input schema / requiredRemoved value: -[ - "version" -]
- Changed
get_swap_quote1 field changed- changed
Input schema / properties / user / descriptionPrevious value: -"Wallet address (0x, 40 hex) of the wallet that will sign the swap - the one the user named in this session. If no wallet has been named, ask for it; never substitute a placeholder, which is rejected."New value: +"Wallet address (0x, 40 hex) of the wallet that will sign, as the user named it in this session. If no wallet has been named, ask for it; never substitute a placeholder, which is rejected."
- Changed
get_user_activity1 field changed- changed
Input schema / properties / cursor / descriptionPrevious value: -"Pagination cursor (pageInfo.next from a previous call). Requires an explicit version ('v3' or 'v4'): a cursor belongs to one version's feed."New value: +"Pagination cursor: copy 'pageInfo.next' from a previous call verbatim. It is opaque and cannot be edited, shortened or rebuilt - a value that was changed comes back as a base64 parse failure. Requires an explicit version ('v3' or 'v4'): a cursor belongs to one version's feed."
- Changed
prepare_action4 fields changed- changed
Input schema / properties / reserveId / descriptionPrevious value: -"v4 only: the opaque reserveId, copied verbatim from a get_markets row or a get_position_items item in this session (e.g. 'MTo6MHg5NGU3...Ojo1') - it cannot be constructed or recalled, so fetch one before the first call rather than after a refusal. The 'spokeId' from get_user_positions is NOT this: it is the same encoding one segment short, names the spoke rather than a reserve inside it, and is rejected. A token symbol such as 'USDC' is rejected too."New value: +"v4 only: the opaque reserveId, copied verbatim from a get_markets row or a get_position_items item in this session (e.g. 'MTo6MHg5NGU3...Ojo1') - it cannot be constructed or recalled, so fetch one before the first call rather than after a refusal. For a withdraw or a repay take it from get_position_items for the position being acted on, not from get_markets: the same asset exists on several spokes, and the one this wallet supplied is the only one it can exit. The 'spokeId' from get_user_positions is NOT this: it is the same encoding one segment short, names the spoke rather than a reserve inside it, and is rejected. A token symbol such as 'USDC' is rejected too." - changed
Input schema / properties / sender / descriptionPrevious value: -"Sender wallet address, 0x-prefixed (40 hex chars)."New value: +"Sender wallet address (0x, 40 hex): the wallet that will sign, as the user named it in this session. If no wallet has been named, ask for it; never substitute a placeholder, which is rejected." - changed
Input schema / properties / version / descriptionPrevious value: -"Protocol version (v3 or v4; required, no 'all' for actions)."New value: +"Optional: inferred from the reserve selector ('reserveId' is v4, 'market'+'token'+'chainId' is v3). Send it to be explicit, or if you somehow set both." - changed
Input schema / requiredPrevious value: -[ - "action", - "version", - "sender" -]New value: +[ + "action", + "sender" +]
- Changed
prepare_set_collateral4 fields changed- changed
Input schema / properties / reserveId / descriptionPrevious value: -"v4 only: the opaque reserveId, copied verbatim from a get_markets row or a get_position_items item in this session (e.g. 'MTo6MHg5NGU3...Ojo1') - it cannot be constructed or recalled, so fetch one before the first call rather than after a refusal. The 'spokeId' from get_user_positions is NOT this: it is the same encoding one segment short, names the spoke rather than a reserve inside it, and is rejected. A token symbol such as 'USDC' is rejected too."New value: +"v4 only: the opaque reserveId, copied verbatim from a get_markets row or a get_position_items item in this session (e.g. 'MTo6MHg5NGU3...Ojo1') - it cannot be constructed or recalled, so fetch one before the first call rather than after a refusal. For a withdraw or a repay take it from get_position_items for the position being acted on, not from get_markets: the same asset exists on several spokes, and the one this wallet supplied is the only one it can exit. The 'spokeId' from get_user_positions is NOT this: it is the same encoding one segment short, names the spoke rather than a reserve inside it, and is rejected. A token symbol such as 'USDC' is rejected too." - changed
Input schema / properties / sender / descriptionPrevious value: -"Sender wallet address, 0x-prefixed (40 hex chars)."New value: +"Sender wallet address (0x, 40 hex): the wallet that will sign, as the user named it in this session. If no wallet has been named, ask for it; never substitute a placeholder, which is rejected." - changed
Input schema / properties / version / descriptionPrevious value: -"Protocol version (v3 or v4; required, no 'all' for actions)."New value: +"Optional: inferred from the reserve selector ('reserveId' is v4, 'market'+'token'+'chainId' is v3). Send it to be explicit, or if you somehow set both." - changed
Input schema / requiredPrevious value: -[ - "version", - "sender" -]New value: +[ + "sender" +]
- Changed
prepare_set_emode1 field changed- changed
Input schema / properties / sender / descriptionPrevious value: -"Sender wallet address, 0x-prefixed (40 hex chars)."New value: +"Sender wallet address (0x, 40 hex): the wallet that will sign, as the user named it in this session. If no wallet has been named, ask for it; never substitute a placeholder, which is rejected."
- Changed
preview_action3 fields changed- changed
Input schema / properties / reserveId / descriptionPrevious value: -"v4 only: the opaque reserveId, copied verbatim from a get_markets row or a get_position_items item in this session (e.g. 'MTo6MHg5NGU3...Ojo1') - it cannot be constructed or recalled, so fetch one before the first call rather than after a refusal. The 'spokeId' from get_user_positions is NOT this: it is the same encoding one segment short, names the spoke rather than a reserve inside it, and is rejected. A token symbol such as 'USDC' is rejected too."New value: +"v4 only: the opaque reserveId, copied verbatim from a get_markets row or a get_position_items item in this session (e.g. 'MTo6MHg5NGU3...Ojo1') - it cannot be constructed or recalled, so fetch one before the first call rather than after a refusal. For a withdraw or a repay take it from get_position_items for the position being acted on, not from get_markets: the same asset exists on several spokes, and the one this wallet supplied is the only one it can exit. The 'spokeId' from get_user_positions is NOT this: it is the same encoding one segment short, names the spoke rather than a reserve inside it, and is rejected. A token symbol such as 'USDC' is rejected too." - changed
Input schema / properties / sender / descriptionPrevious value: -"Sender wallet address, 0x-prefixed (40 hex chars)."New value: +"Sender wallet address (0x, 40 hex): the wallet that will sign, as the user named it in this session. If no wallet has been named, ask for it; never substitute a placeholder, which is rejected." - changed
Input schema / properties / version / descriptionPrevious value: -"Optional: inferred from the reserve selector ('reserveId' means v3 is not being used, 'market'+'token'+'chainId' means v4 is not). Send it to be explicit, or if you somehow set both."New value: +"Optional: inferred from the reserve selector ('reserveId' is v4, 'market'+'token'+'chainId' is v3). Send it to be explicit, or if you somehow set both."
5 tool updates
- Changed
get_apy_history2 fields changed- removed
Input schema / properties / reserveRemoved value: -{ - "description": "v4 only: reserveId (from get_markets).", - "type": "string" -} - added
Input schema / properties / reserveIdAdded value: +{ + "description": "v4 only: the reserveId from get_markets, copied verbatim.", + "type": "string" +}
- Changed
get_reserve_details2 fields changed- removed
Input schema / properties / reserveRemoved value: -{ - "description": "v4 only: reserveId (from get_markets).", - "type": "string" -} - added
Input schema / properties / reserveIdAdded value: +{ + "description": "v4 only: the reserveId from get_markets, copied verbatim.", + "type": "string" +}
- Changed
prepare_action2 fields changed- removed
Input schema / properties / reserveRemoved value: -{ - "description": "v4 only: the opaque reserveId, copied verbatim from a get_markets row or a get_position_items item in this session (e.g. 'MTo6MHg5NGU3...Ojo1') - it cannot be constructed or recalled, so fetch one before the first call rather than after a refusal. The 'spokeId' from get_user_positions is NOT this: it is the same encoding one segment short, names the spoke rather than a reserve inside it, and is rejected. A token symbol such as 'USDC' is rejected too.", - "type": "string" -} - added
Input schema / properties / reserveIdAdded value: +{ + "description": "v4 only: the opaque reserveId, copied verbatim from a get_markets row or a get_position_items item in this session (e.g. 'MTo6MHg5NGU3...Ojo1') - it cannot be constructed or recalled, so fetch one before the first call rather than after a refusal. The 'spokeId' from get_user_positions is NOT this: it is the same encoding one segment short, names the spoke rather than a reserve inside it, and is rejected. A token symbol such as 'USDC' is rejected too.", + "type": "string" +}
- Changed
prepare_set_collateral2 fields changed- removed
Input schema / properties / reserveRemoved value: -{ - "description": "v4 only: the opaque reserveId, copied verbatim from a get_markets row or a get_position_items item in this session (e.g. 'MTo6MHg5NGU3...Ojo1') - it cannot be constructed or recalled, so fetch one before the first call rather than after a refusal. The 'spokeId' from get_user_positions is NOT this: it is the same encoding one segment short, names the spoke rather than a reserve inside it, and is rejected. A token symbol such as 'USDC' is rejected too.", - "type": "string" -} - added
Input schema / properties / reserveIdAdded value: +{ + "description": "v4 only: the opaque reserveId, copied verbatim from a get_markets row or a get_position_items item in this session (e.g. 'MTo6MHg5NGU3...Ojo1') - it cannot be constructed or recalled, so fetch one before the first call rather than after a refusal. The 'spokeId' from get_user_positions is NOT this: it is the same encoding one segment short, names the spoke rather than a reserve inside it, and is rejected. A token symbol such as 'USDC' is rejected too.", + "type": "string" +}
- Changed
preview_action3 fields changed- removed
Input schema / properties / reserveRemoved value: -{ - "description": "v4 only: the opaque reserveId, copied verbatim from a get_markets row or a get_position_items item in this session (e.g. 'MTo6MHg5NGU3...Ojo1') - it cannot be constructed or recalled, so fetch one before the first call rather than after a refusal. The 'spokeId' from get_user_positions is NOT this: it is the same encoding one segment short, names the spoke rather than a reserve inside it, and is rejected. A token symbol such as 'USDC' is rejected too.", - "type": "string" -} - added
Input schema / properties / reserveIdAdded value: +{ + "description": "v4 only: the opaque reserveId, copied verbatim from a get_markets row or a get_position_items item in this session (e.g. 'MTo6MHg5NGU3...Ojo1') - it cannot be constructed or recalled, so fetch one before the first call rather than after a refusal. The 'spokeId' from get_user_positions is NOT this: it is the same encoding one segment short, names the spoke rather than a reserve inside it, and is rejected. A token symbol such as 'USDC' is rejected too.", + "type": "string" +} - changed
Input schema / properties / version / descriptionPrevious value: -"Optional: inferred from the reserve selector ('reserve' means v3 is not being used, 'market'+'token'+'chainId' means v4 is not). Send it to be explicit, or if you somehow set both."New value: +"Optional: inferred from the reserve selector ('reserveId' means v3 is not being used, 'market'+'token'+'chainId' means v4 is not). Send it to be explicit, or if you somehow set both."
40 tool updates
- First observed
cancel_order - First observed
get_aave_guide - First observed
get_apy_history - First observed
get_chains - First observed
get_emode_categories - First observed
get_governance_proposal - First observed
get_hub_assets - First observed
get_hubs - First observed
get_markets - First observed
get_order_status - First observed
get_pending_orders - First observed
get_position_items - First observed
get_proposal_payloads - First observed
get_proposal_votes - First observed
get_protocol_history - First observed
get_reserve_details - First observed
get_sgho_preview - First observed
get_sgho_vault - First observed
get_started - First observed
get_swap_quote - First observed
get_swappable_tokens - First observed
get_transaction_processed - First observed
get_user_activity - First observed
get_user_positions - First observed
get_user_rewards - First observed
get_user_summary - First observed
get_user_summary_history - First observed
get_user_vote - First observed
prepare_action - First observed
prepare_cancel_order - First observed
prepare_claim_rewards - First observed
prepare_liquidation - First observed
prepare_order - First observed
prepare_set_collateral - First observed
prepare_set_emode - First observed
prepare_sgho_action - First observed
prepare_stkgho_migrate - First observed
preview_action - First observed
search_governance_proposals - First observed
submit_signed_order
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceRemote MCP server that lets AI assistants read tracked competitive intelligence — competitor news, reviews, website changes, social posts and ads — and act on it by managing projects, competitors, battle cards, reports and canvases. Every answer carries a source and a date, and write actions only publish when explicitly shared.MIT
- AlicenseCqualityBmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs115 npm55 PyPIMIT
- AlicenseAqualityCmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.1618 npm1MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.