Aave
Server Details
Aave's official MCP
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 53 tools
Every tool targets a distinct resource or action, and the descriptions explicitly cross-reference lookalikes (e.g., get_apy_history vs get_asset_history vs get_market_history), so an agent can reliably select the right one despite the large set. The two meta tools are clearly separated by purpose.
The server overwhelmingly uses get_ for reads and prepare_ for transaction building, with verb_noun names throughout. Minor deviations like preview_action, cancel_order, submit_signed_order, and get_started break the pattern slightly but remain readable.
53 tools is well beyond the 25+ threshold, and the extremely long descriptions compound the navigation burden. The breadth reflects Aave's complexity, but the set would benefit from consolidation or clearer grouping.
The surface covers the full Aave domain: v3/v4 markets, user positions, actions, liquidation, rewards, governance, Safety Module, sGHO, vaults, orders, and swaps, with no obvious dead ends. Meta tools fill gaps when no tool seems to fit.
Available Tools
53 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, 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 establish readOnlyHint=true and destructiveHint=false, so no contradiction exists. The description adds useful behavioral context beyond annotations: it applies to both protocol versions, it returns a full capability list when 'lookingFor' is used, and it records gaps when a capability does not exist.
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 moderately sized and front-loaded with the core purpose before enumerating topics. The topic list is somewhat redundant with the schema enum, but it serves as a quick reference for the agent and the edge-case guidance about 'lookingFor' 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, but the description explains what the tool returns for the 'lookingFor' path and implies guidance content for the topic path. Given the tool's role as a meta-guide among many specialized siblings, the description covers the selection and invocation needs well, though it could state the return format for normal topic queries more explicitly.
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 meaningful usage context for both parameters: it explains when to send 'lookingFor' versus when to omit it, and stresses that topic should be read before building an action. The topic list duplicates the enum but reinforces the intended workflow.
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 this is the protocol and usage guidance tool for building Aave flows, covering both v3 and v4. It differentiates itself from the many get_/prepare_ siblings by explicitly positioning itself as the fallback when no tool seems to fit and offering the 'lookingFor' capability to discover tools by intent.
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 when-to-use guidance: read the relevant topic before constructing an action, and come here when no other tool seems to fit. It also gives a clear boundary by directing users to external docs for deep protocol documentation, which functions as a when-not-to-use signal.
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_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.
| 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 already declare readOnlyHint=true and destructiveHint=false, so the bar is for added context, and this description goes far beyond: it discloses response metadata fields (chainsCovered, chainsNotCovered, chainsNotServed), conditional flags that 'appear only when set, so a reserve with none of them is not flagged', the v3/v4 coverage asymmetry, the percent-unit convention, and that identical APYs across spoke rows 'are expected rather than duplicates'. Nothing 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?
Long but with zero filler: every sentence addresses a distinct misinterpretation risk (coverage semantics, empty-result trap, APY ranking, conditional flags, spoke/hub duplicates, per-reserve swap semantics). The purpose is front-loaded in the first sentence, and the trade-off against response size ('hundreds of kilobytes') justifies behavior rather than padding prose.
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 carries the full burden of explaining return values — and it does: row shape under 'reserves', paired supplyApyPct/borrowApyPct fields, per-version fields (suppliable/borrowable vs availableLiquidity/totalSuppliedUsd), the user param's row additions (walletBalance, youCanSupply, youCanBorrow), and chain coverage metadata. For a 21-chain, two-version listing tool with no output schema, this is complete.
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 already-strong param descriptions, so the baseline is 3. The description adds genuine cross-parameter semantics: passing symbols changes v3 coverage from Ethereum-only to all chains, omitting chainId triggers the chainsCovered/chainsNotCovered metadata, and the Pct-suffix naming convention. This is additive, but the schema still carries most per-parameter load, so not a 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+scope: 'List Aave markets/reserves (symbol, APY, caps, liquidity) on v3, v4, or both.' It names the entities, the data dimensions, and the version axis, and it differentiates from siblings by explicitly contrasting canSwapFrom with what get_swappable_tokens answers per chain.
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 when-to-use directives with conditions: 'to compare one asset across chains, pass symbols and no chainId', 'Pass it [user] whenever the question is about what someone can actually do rather than what the rates are', and the symbols param's 'Strongly preferred when you know the asset' guidance. It also warns when NOT to trust results ('an empty result for one of them is not an answer about that chain') and names the alternative tool (get_swappable_tokens).
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. 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 mark the tool as read-only and non-destructive. The description adds useful behavioral context beyond annotations by specifying the v4-only constraint, the item-level scope, and the returned data concepts: principal, accrued interest, and withdrawable amount.
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, front-loads the critical 'v4 only' constraint, and every sentence earns its place by conveying scope, data contents, and a required parameter source.
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, but the description enumerates the key returned fields (principal, accrued interest, withdrawable) and connects the main parameter to its source tool. Minor details like the default side are left to the schema, which is acceptable given full schema coverage.
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 fully documents user, spokeId, side, and version. The description reinforces the spokeId source but does not add significant parameter meaning beyond what the schema already provides.
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: 'Get individual position items' and 'the individual supplies or borrows inside one v4 spoke.' It clearly differentiates itself from get_user_positions by stating the per-spoke aggregate 'cannot show' item-level details.
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 says this is v4 only, tells the agent to obtain 'spokeId' from get_user_positions, and explains that the per-spoke aggregate cannot show this level of detail. This makes the selection between this tool and get_user_positions unambiguous.
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_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. 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 carry readOnlyHint=true and destructiveHint=false, and the description does not contradict them, so this is not a mere annotation echo. It adds substantial behavioral context beyond annotations: the Pct-suffix percent convention ('3.32' means 3.32%), the v4 hub-wide sharing of utilisation and the rate curve, the warning that collateralFactorPct is the liquidation boundary itself, and the double-counting warning for liquidityFeePct (supplyApy = borrowApy x utilisation x (1 - liquidityFee)). These are exactly the non-obvious facts 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 long (~300 words), but nearly every sentence carries a non-obvious fact an agent could not infer from names like 'collateralFactorPct' or 'liquidityFeePct'. It front-loads the core purpose and scoping first, then layers the field interpretations. It could trim the parenthetical 'if you want to check' formula, but overall the density of useful content earns its length.
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 explaining the return data, and it does so extensively: percent units, v4 hub-wide behaviour, the two ambiguous v4 fields, and the price fields with their source. Minor gaps remain — it does not enumerate every v3 vs v4 difference or describe the cap structure in the same depth as the risk parameters — but for a 5-parameter, zero-output-schema tool with substantial domain complexity, it is close to complete.
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's parameter-related contribution is thin: it explains the v3/v4 selector pattern and that version is optional when the selector is unambiguous, but the schema itself already documents each parameter (including 'copied verbatim' for reserveId). Most of the description's semantic depth concerns output fields, not parameters, so it does not exceed the schema-covered 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 opens with a specific verb and resource: 'Deep detail for a single reserve (rates, caps, risk parameters, utilisation, the interest-rate curve, token addresses) on v3 or v4.' This immediately distinguishes it from sibling list-style tools like get_markets, and the sentence 'get_markets quotes no price at all, so what an asset is worth on Aave is answered here' explicitly separates its scope from a sibling.
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?
Explicit when-to-use and sequencing guidance is present: 'Use get_markets first to get the reserveId (v4) or market+token (v3).' It also gives an exclusion rule ('get_markets quotes no price at all') and warns about the collateralFactorPct misunderstanding ('do not look for one'). This is exemplary when/not-when guidance.
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. Which optional arguments apply is decided by the quote that minted the quoteId, so decide before emitting any: a quote that offered a 'bySignature' permit takes permitSignature + permitDeadline once that permit is signed; route:'transaction' applies only to a SwapByTransaction... quote (a native-token sell) and takes no signatures at all. Never send a signature argument unsolicited - it exists to carry back a signature the 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. | |
| 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'. 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. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and non-destructive annotations, the description reveals that the tool is non-custodial, returns what the user signs, commits nothing, and that optional argument applicability is driven by the originating quote. It also discloses backend version behavior, adding meaningful operational 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?
Every sentence carries a distinct and useful rule, and there is no filler. The middle sentence is a long run-on with multiple clauses, which slightly hurts readability, but the key constraints are still front-loaded and precise.
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 prepare-only tool with no output schema, the description covers the major behavioral traps: backend version, quote-driven optional arguments, unsolicited signatures, and non-custodial behavior. It relies on the schema for exact parameter descriptions and route defaults, which is acceptable given 100% schema coverage.
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 valuable conditional semantics: permitSignature and permitDeadline are only valid after the quote explicitly offers a bySignature permit, and the transaction route accepts no signatures. This helps an agent decide parameter combinations rather than just reading individual 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?
States a specific verb and resource: prepare an order as typed data or a transaction to sign, sourced from a quoteId. It clearly distinguishes the signature-based and transaction-based routes, but it does not explicitly name sibling prepare_* tools to disambiguate from cancel/claim/action preparation.
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 conditional usage guidance: bySignature permits require permitSignature + permitDeadline, transaction route applies only to SwapByTransaction native-token sells, and signature arguments should never be sent unsolicited. It does not explicitly route to alternatives such as prepare_cancel_order or submit_signed_order, so it stops short of full when-vs-alternatives guidance.
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. Always do this before a borrow or a withdraw. 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. 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. | |
| 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, 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). | |
| 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?
Annotations already mark this as read-only and non-destructive, but the description adds substantial behavior beyond that: it commits nothing, reports the position's own limits rather than token allowances, and warns that a clean simulation does not mean no approval step remains. It also precisely defines the meaning of 'warnings' and its consequence for the prepare step.
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 justifiably so for an 11-parameter tool with two protocol versions and no output schema. It is front-loaded with the core purpose and usage rule, then organized into parameter routing, return-shape differences, and edge-case caveats. Every sentence carries operational information; there is 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 fully documents return values for both versions: healthFactorBefore/After, v4-only metrics, rewards fields, and warnings semantics. It also covers prerequisite data sourcing (fetch reserveId/market before first call), amount unit conventions, and sender requirements, so an agent has everything needed 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 already 100%, but the description meaningfully enriches the parameters: amount must be in MAIN units with an explicit base-unit conversion example, reserveId must be copied verbatim from session data and cannot be constructed, spokeId is explicitly rejected, market cannot be recalled from memory, sender must be the user-named wallet, and native's failure mode is explained. This is far beyond the schema text.
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 ('Simulate'), the concrete action set (supply/borrow/withdraw/repay), the evaluated resource (a wallet's position), and the key constraint (WITHOUT executing, on v3 or v4). The title and first sentence also make it immediately distinguishable from prepare_action and other sibling 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?
Gives an explicit rule: 'Always do this before a borrow or a withdraw' and 'Simulate first even when you intend to build immediately.' It also tells the agent what to do when simulation fails ('fix the inputs rather than building it'), which is an implicit when-not for proceeding to prepare/execute.
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.
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
- 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.169 npm1MIT
- AlicenseCqualityAmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs119 npm49 PyPIMIT
- AlicenseNot gradedqualityBmaintenanceEnables tracking competitor websites, changelogs, blog feeds, and pricing pages with meaningful diffs, classification, and Markdown digests via MCP tools for listing, adding, removing competitors, running checks, and retrieving digests or changes.MIT

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.