Koskamo

Aave MCP

Official Aave MCP server providing tools to query V3 and V4 market data, user positions, APY history, and governance details. It also supports transaction preparation for actions like supplying, borrowing, and liquidating, as well as simulating actions without execution. The server is non-custodial and does not require API keys or sign-in.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

Aave MCP logo, by AaveVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Aave
MCP endpoint (Streamable HTTP)
https://mcp.aave.com
Vendor documentation

What you can do with it

  • List supported chains and market reserves with APY and liquidity data
  • Retrieve user wallet positions, health factors, and transaction history
  • Prepare unsigned transactions for supplying, borrowing, or liquidating
  • Simulate supply/borrow/withdraw actions to preview outcomes

Source and maintenance

Vendor evidenceRegistry 1.0.0

Protocol and capabilities

Server
aave-mcp 1.0.0
MCP protocol
2025-06-18
Tools
56 advertised
Resources
19 advertised
Resource templates
1 advertised
Prompts
6 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  },
  "prompts": {
    "listChanged": false
  },
  "resources": {
    "subscribe": false,
    "listChanged": false
  },
  "completions": {}
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

Aave MCP: one endpoint serves both Aave V3 and V4. Pass a 'version' argument ('v3', 'v4', or 'all') to most tools; a tool without that argument states its applicability in the first words of its description ('v4 only', 'v3 only', or protocol-agnostic). Non-custodial: read and prepare_* tools return data or an unsigned transaction / EIP-712 typed data for the user's own wallet to sign; this server never holds keys or submits (only submit_signed_order and cancel_order relay what the user already signed). Workflow: discover (get_markets, or get_started on a cold turn) -> inspect (get_reserve_details, get_user_summary) -> simulate (preview_action, on either version) -> build (prepare_action; a quoted swap or leverage is an order, built with prepare_order and relayed with submit_signed_order instead) -> the user's wallet signs. Do not skip the simulation before a borrow, a withdraw, or a quoted order that moves a position (a leverage, a position swap or a repay-with-supply). Every successful result is the same envelope, { data, next_actions? }, returned both as JSON text and as structuredContent; read the payload from 'data' and follow 'next_actions'. Inside 'data', six reads nest their payload under 'v4' and 'v3' - get_chains, get_markets, get_user_summary, get_user_positions, get_user_activity, get_user_rewards - including when you asked for a single version, so on a version:'v4' call the answer is at 'data.v4' and 'data' itself holds no fields. Every other tool returns its payload on 'data' directly, preview_action and the prepare_* tools included, even though they take the same 'version' argument. A result may also carry 'warnings', each with a level: 'error' means the action cannot succeed as built, so stop and fix it or tell the user rather than preparing or signing past it; 'warning' means it will succeed but the user should be told; 'info' is context. Every USD figure is Aave's oracle price for the asset, read from Chainlink price feeds and named as 'priceSource' on a reserve read: when you quote a price or a USD value, attribute it to Chainlink rather than presenting it as a market quote. Token amounts are in main units (e.g. '10.5'), never wei. To build an action you need a reserveId (v4) or market+token+chainId (v3) from get_markets in this session - these are deployment-specific, so an Aave address or id you already recognise belongs to a different deployment and is rejected; call get_markets before the first prepare rather than after it refuses; narrow that call with 'symbols' (e.g. ['USDC']) instead of listing every reserve. Reads cover every supported chain by default and say which under 'chainsCovered', so do not loop over chains by hand; where a read is narrower it also returns 'chainsNotCovered', which is the only case a sweep is needed. A chain under 'chainsNotServed' is one this API holds no market on: an empty result there is an absence of data, not an answer about the chain, and asking again returns the same nothing - get_chains flags those chains too. Rank on a rate that can actually be entered, not on APY alone: get_markets carries the liquidity left and flags a reserve that is frozen, paused or at its cap. Health factor and aggregate values come from v4's cross-chain summary; v3 is per-market. Token swaps are protocol-agnostic (they run on the v4 backend); position swaps, repay-with-supply and leverage are v4 only and run the same order lifecycle. Aave DAO governance tools (search_governance_proposals, get_governance_proposal, get_proposal_votes, get_user_vote, get_proposal_payloads) take no 'version' either: Governance V3 is the DAO's own contract generation, unrelated to the v3 / v4 markets. Leave an optional argument out of the call entirely when you are not using it; do not send an empty string, a zero or a near-zero number to stand in for 'unset'. A tool error that says the input was rejected will fail again unchanged: fix the arguments instead of retrying. When an Aave conversation opens with no specific request - the user is asking what this can do, or just says hello - call get_started and answer from it rather than guessing at the tool list. Savings GHO (sGHO) is v3 and Ethereum only, and a withdrawal there is denominated in vault shares rather than in GHO: read the 'gho' guide topic before using get_sgho_vault or prepare_sgho_action. When unsure how something works, call get_aave_guide (topics: overview, v4, v3, positions, health-factor, risks, ids, amounts, prices, signing, swaps, leverage, gho, safety-module, portfolio, governance, rewards, tools, docs).

Tools

56 advertised

get_chains — Get supported chains
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_chains input schema
{
  "type": "object",
  "properties": {
    "version": {
      "enum": [
        "v3",
        "v4",
        "all"
      ],
      "type": "string",
      "description": "Protocol version (default all)."
    }
  },
  "additionalProperties": false
}
get_chains annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_markets — Get markets / reserves
Advertised by the server during the last successful anonymous check.
Advertised read-only

List Aave markets/reserves (symbol, APY, caps, liquidity) on v3, v4, or both. Chain coverage: omit chainId and every response states the chains it read as 'chainsCovered', plus 'chainsNotCovered' when it read fewer than all of them. 'chainsNotServed', when present, lists chains this API holds no market on: Aave supports the chain, there is nothing here to read, so an empty result for one of them is not an answer about that chain, and asking again returns the same nothing. v4 always covers every chain it serves; v3 covers every chain when you pass 'symbols' and Ethereum alone when you do not, because an unfiltered 21-chain listing is hundreds of kilobytes. So to compare one asset across chains, pass symbols and no chainId. Every rate is a percent ('3.32' means 3.32%), named with a Pct suffix. Do not rank on APY alone: 'suppliable'/'borrowable' (v4), 'availableLiquidity' and 'totalSuppliedUsd' (v3) say whether a rate can actually be entered, and isFrozen / isPaused / supplyCapReached / borrowCapReached appear only when set, so a reserve with none of them is not flagged. Both versions return one row per reserve under 'reserves', carrying supplyApyPct and borrowApyPct together plus canSupply / canBorrow for the sides that are actually open, so the two versions read the same way. On v4 one asset appears once per spoke, so rows are labelled with 'spoke' and 'hub'; spokes sharing a hub share its rate, so identical APYs across rows are expected rather than duplicates. 'canSwapFrom' (v4) says whether that token can be the sell side of a token swap, which is the per-reserve form of what get_swappable_tokens answers per chain. 'quotableAs' (v4) lists the order-quote arguments the reserve can fill: supplySwapTo or borrowSwapTo as get_position_swap_quote's buyReserve, repayWith as get_repay_with_supply_quote's repayWithReserve, leverageDebt and leverageCollateral as get_leverage_quote's debtReserve and collateralReserve. It is absent when the reserve fills none of them.

get_markets input schema
{
  "type": "object",
  "properties": {
    "user": {
      "type": "string",
      "description": "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": {
      "type": "number",
      "description": "Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain.",
      "exclusiveMinimum": 0
    },
    "symbols": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "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": {
      "enum": [
        "v3",
        "v4",
        "all"
      ],
      "type": "string",
      "description": "Protocol version (default all)."
    }
  },
  "additionalProperties": false
}
get_markets annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_emode_categories — Get v3 eMode categories
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_emode_categories input schema
{
  "type": "object",
  "properties": {
    "chainId": {
      "type": "number",
      "description": "Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain.",
      "exclusiveMinimum": 0
    },
    "symbols": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "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": {
      "enum": [
        "v3"
      ],
      "type": "string",
      "description": "Optional, and only 'v3': this tool exists on v3 only."
    }
  },
  "additionalProperties": false
}
get_emode_categories annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_user_positions — Get user positions
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_user_positions input schema
{
  "type": "object",
  "required": [
    "user"
  ],
  "properties": {
    "user": {
      "type": "string",
      "description": "Wallet address, 0x-prefixed (40 hex chars)."
    },
    "chainId": {
      "type": "number",
      "description": "Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain.",
      "exclusiveMinimum": 0
    },
    "version": {
      "enum": [
        "v3",
        "v4",
        "all"
      ],
      "type": "string",
      "description": "Protocol version (default all)."
    }
  },
  "additionalProperties": false
}
get_user_positions annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_position_items — Get individual position items (v4)
Advertised by the server during the last successful anonymous check.
Advertised read-only

v4 only. The individual supplies or borrows inside one v4 spoke: principal, accrued interest and what is withdrawable right now, per item, which the per-spoke aggregate from get_user_positions cannot show. Each item's positionItemId is what a position swap or a repay-with-supply sells, and its 'quotableAs' says which: supplySwapFrom or borrowSwapFrom as get_position_swap_quote's sellPosition, repayDebt as get_repay_with_supply_quote's debtPosition; absent when the item can enter neither. Get 'spokeId' from get_user_positions.

get_position_items input schema
{
  "type": "object",
  "required": [
    "user",
    "spokeId"
  ],
  "properties": {
    "side": {
      "enum": [
        "supply",
        "borrow"
      ],
      "type": "string",
      "description": "Which side to list (default supply)."
    },
    "user": {
      "type": "string",
      "description": "Wallet address, 0x-prefixed (40 hex chars)."
    },
    "spokeId": {
      "type": "string",
      "description": "spokeId from get_user_positions (not the spoke address)."
    },
    "version": {
      "enum": [
        "v4"
      ],
      "type": "string",
      "description": "Optional, and only 'v4': this tool exists on v4 only."
    }
  },
  "additionalProperties": false
}
get_position_items annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_user_summary — Get user summary / health factor
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_user_summary input schema
{
  "type": "object",
  "required": [
    "user"
  ],
  "properties": {
    "user": {
      "type": "string",
      "description": "Wallet address, 0x-prefixed (40 hex chars)."
    },
    "chainId": {
      "type": "number",
      "description": "Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain.",
      "exclusiveMinimum": 0
    },
    "version": {
      "enum": [
        "v3",
        "v4",
        "all"
      ],
      "type": "string",
      "description": "Protocol version (default all)."
    }
  },
  "additionalProperties": false
}
get_user_summary annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_transaction_processed — Has Aave seen my transaction yet?
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_transaction_processed input schema
{
  "type": "object",
  "required": [
    "txHash",
    "operations"
  ],
  "properties": {
    "txHash": {
      "type": "string",
      "description": "Transaction hash you broadcast (0x...)."
    },
    "version": {
      "enum": [
        "v4"
      ],
      "type": "string",
      "description": "Optional, and only 'v4': this tool exists on v4 only."
    },
    "operations": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "The 'operations' from the transaction the server built, e.g. ['SPOKE_SUPPLY']."
    }
  },
  "additionalProperties": false
}
get_transaction_processed annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_reserve_details — Get reserve details
Advertised by the server during the last successful anonymous check.
Advertised read-only

Deep detail for a single reserve (rates, caps, risk parameters, utilisation, the interest-rate curve, token addresses) on v3 or v4. Every rate and percentage is a percent ('3.32' means 3.32%), named with a Pct suffix. On v4, utilisation and the rate curve are hub-wide, shared by every spoke drawing on the asset. Two v4 fields whose meaning the numbers do not give away: 'collateralFactorPct' is the liquidation boundary itself, because v4 has no separate liquidation threshold - do not look for one - so a position drawn to its full borrow limit sits at health factor 1.0; and 'liquidityFeePct' is the protocol's share of borrower interest, already netted out of supplyApyPct, so treating it as a user cost double-counts it (supplyApy = borrowApy x utilisation x (1 - liquidityFee), if you want to check). This is also where the asset's price lives: 'priceUsd', with 'priceSource' naming who priced it, and no listing carries either - get_markets quotes no price at all, so what an asset is worth on Aave is answered here. On v4 'quotableAs' lists the position-swap, repay-with-supply and leverage arguments the reserve can fill, the same list get_markets carries. Use get_markets first to get the reserveId (v4) or market+token (v3).

get_reserve_details input schema
{
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "v3 only: underlying token address."
    },
    "market": {
      "type": "string",
      "description": "v3 only: market pool address (from get_markets)."
    },
    "chainId": {
      "type": "number",
      "description": "v3 only: chain id (positive integer).",
      "exclusiveMinimum": 0
    },
    "version": {
      "enum": [
        "v3",
        "v4"
      ],
      "type": "string",
      "description": "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": {
      "type": "string",
      "description": "v4 only: the reserveId from get_markets, copied verbatim."
    }
  },
  "additionalProperties": false
}
get_reserve_details annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_apy_history — Get APY history
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_apy_history input schema
{
  "type": "object",
  "properties": {
    "side": {
      "enum": [
        "supply",
        "borrow"
      ],
      "type": "string",
      "description": "Which rate (default supply)."
    },
    "token": {
      "type": "string",
      "description": "v3 only: underlying token address."
    },
    "market": {
      "type": "string",
      "description": "v3 only: market pool address (from get_markets)."
    },
    "window": {
      "enum": [
        "day",
        "week",
        "month",
        "sixMonths",
        "year"
      ],
      "type": "string",
      "description": "Time window (default week)."
    },
    "chainId": {
      "type": "number",
      "description": "v3 only: chain id (positive integer).",
      "exclusiveMinimum": 0
    },
    "version": {
      "enum": [
        "v3",
        "v4"
      ],
      "type": "string",
      "description": "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": {
      "type": "string",
      "description": "v4 only: the reserveId from get_markets, copied verbatim."
    }
  },
  "additionalProperties": false
}
get_apy_history annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_user_activity — Get user activity / transaction history
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_user_activity input schema
{
  "type": "object",
  "required": [
    "user"
  ],
  "properties": {
    "user": {
      "type": "string",
      "description": "Wallet address, 0x-prefixed (40 hex chars)."
    },
    "cursor": {
      "type": "string",
      "description": "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": {
      "type": "string",
      "description": "v3 only, optional: market pool address (defaults to the chain's main market)."
    },
    "chainId": {
      "type": "number",
      "description": "Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain.",
      "exclusiveMinimum": 0
    },
    "version": {
      "enum": [
        "v3",
        "v4",
        "all"
      ],
      "type": "string",
      "description": "Protocol version (default all)."
    }
  },
  "additionalProperties": false
}
get_user_activity annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_protocol_history — Protocol totals over time (v4)
Advertised by the server during the last successful anonymous check.
Advertised read-only

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).

get_protocol_history input schema
{
  "type": "object",
  "properties": {
    "window": {
      "enum": [
        "day",
        "week",
        "month",
        "sixMonths",
        "year"
      ],
      "type": "string",
      "description": "Time window (default week)."
    },
    "chainId": {
      "type": "number",
      "description": "Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain.",
      "exclusiveMinimum": 0
    },
    "version": {
      "enum": [
        "v4"
      ],
      "type": "string",
      "description": "Optional, and only 'v4': this tool exists on v4 only."
    }
  },
  "additionalProperties": false
}
get_protocol_history annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_user_summary_history — A wallet's position over time (v4)
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_user_summary_history input schema
{
  "type": "object",
  "required": [
    "user"
  ],
  "properties": {
    "user": {
      "type": "string",
      "description": "Wallet address, 0x-prefixed (40 hex chars)."
    },
    "window": {
      "enum": [
        "day",
        "week",
        "month",
        "sixMonths",
        "year"
      ],
      "type": "string",
      "description": "Time window (default week)."
    },
    "chainId": {
      "type": "number",
      "description": "Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain.",
      "exclusiveMinimum": 0
    },
    "version": {
      "enum": [
        "v4"
      ],
      "type": "string",
      "description": "Optional, and only 'v4': this tool exists on v4 only."
    }
  },
  "additionalProperties": false
}
get_user_summary_history annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_hubs — Get v4 hubs
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_hubs input schema
{
  "type": "object",
  "properties": {
    "chainId": {
      "type": "number",
      "description": "Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain.",
      "exclusiveMinimum": 0
    },
    "version": {
      "enum": [
        "v4"
      ],
      "type": "string",
      "description": "Optional, and only 'v4': this tool exists on v4 only."
    }
  },
  "additionalProperties": false
}
get_hubs annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_hub_assets — Get the assets a v4 hub carries
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_hub_assets input schema
{
  "type": "object",
  "required": [
    "hubId"
  ],
  "properties": {
    "hubId": {
      "type": "string",
      "description": "hubId from get_hubs."
    },
    "version": {
      "enum": [
        "v4"
      ],
      "type": "string",
      "description": "Optional, and only 'v4': this tool exists on v4 only."
    }
  },
  "additionalProperties": false
}
get_hub_assets annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_market_history — Market totals over time (v4)
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_market_history input schema
{
  "type": "object",
  "required": [
    "scope",
    "id"
  ],
  "properties": {
    "id": {
      "type": "string",
      "description": "The hubId (scope 'hub') or spokeId (scope 'spoke'). Not an address."
    },
    "scope": {
      "enum": [
        "hub",
        "spoke"
      ],
      "type": "string",
      "description": "Which layer 'id' names: a hub's liquidity, or one spoke onto it."
    },
    "window": {
      "enum": [
        "day",
        "week",
        "month",
        "sixMonths",
        "year"
      ],
      "type": "string",
      "description": "How far back to go (default week)."
    },
    "version": {
      "enum": [
        "v4"
      ],
      "type": "string",
      "description": "Optional, and only 'v4': this tool exists on v4 only."
    }
  },
  "additionalProperties": false
}
get_market_history annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_asset_history — One asset's price, supply or borrows over time (v4)
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_asset_history input schema
{
  "type": "object",
  "required": [
    "metric",
    "token",
    "chainId"
  ],
  "properties": {
    "token": {
      "type": "string",
      "description": "Token address, 0x-prefixed (40 hex chars)."
    },
    "metric": {
      "enum": [
        "price",
        "supply",
        "borrow"
      ],
      "type": "string",
      "description": "Which series: oracle price, supplied amount, or borrowed amount."
    },
    "window": {
      "enum": [
        "day",
        "week",
        "month",
        "sixMonths",
        "year"
      ],
      "type": "string",
      "description": "How far back to go (default week)."
    },
    "chainId": {
      "type": "number",
      "description": "Chain the token is on, e.g. 1 for Ethereum. Required: the same symbol exists on several.",
      "exclusiveMinimum": 0
    },
    "version": {
      "enum": [
        "v4"
      ],
      "type": "string",
      "description": "Optional, and only 'v4': this tool exists on v4 only."
    }
  },
  "additionalProperties": false
}
get_asset_history annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_reserve_holders — Largest suppliers or borrowers of a reserve (v4)
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_reserve_holders input schema
{
  "type": "object",
  "required": [
    "reserveId"
  ],
  "properties": {
    "side": {
      "enum": [
        "supply",
        "borrow"
      ],
      "type": "string",
      "description": "Rank the wallets supplying it, or the ones borrowing it (default supply)."
    },
    "limit": {
      "enum": [
        10,
        50
      ],
      "type": "number",
      "description": "How many wallets to return. Only 10 or 50; default 10."
    },
    "cursor": {
      "type": "string",
      "description": "'nextCursor' from a previous call, for the next page. Omit the argument entirely for the first page."
    },
    "version": {
      "enum": [
        "v4"
      ],
      "type": "string",
      "description": "Optional, and only 'v4': this tool exists on v4 only."
    },
    "reserveId": {
      "type": "string",
      "description": "reserveId from get_markets or get_position_items."
    }
  },
  "additionalProperties": false
}
get_reserve_holders annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_interest_rate_model — The interest rate curve for an asset (v4)
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_interest_rate_model input schema
{
  "type": "object",
  "required": [
    "hubAssetId"
  ],
  "properties": {
    "version": {
      "enum": [
        "v4"
      ],
      "type": "string",
      "description": "Optional, and only 'v4': this tool exists on v4 only."
    },
    "hubAssetId": {
      "type": "string",
      "description": "hubAssetId from get_hub_assets (not a token address)."
    }
  },
  "additionalProperties": false
}
get_interest_rate_model annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_wallet_balances — What a wallet holds that Aave accepts (v4)
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_wallet_balances input schema
{
  "type": "object",
  "required": [
    "user"
  ],
  "properties": {
    "user": {
      "type": "string",
      "description": "Wallet address, 0x-prefixed (40 hex chars)."
    },
    "chainId": {
      "type": "number",
      "description": "Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain.",
      "exclusiveMinimum": 0
    },
    "version": {
      "enum": [
        "v4"
      ],
      "type": "string",
      "description": "Optional, and only 'v4': this tool exists on v4 only."
    }
  },
  "additionalProperties": false
}
get_wallet_balances annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_risk_premium — How a position's risk premium is built up (v4)
Advertised by the server during the last successful anonymous check.
Advertised read-only

v4 only. The per-collateral breakdown of one position's risk premium: how much of the position each token is, and the weight the protocol charges for it. 'currentRiskPremiumWeightPct' is the weight in force now and 'latestRiskPremiumWeightPct' the one the protocol has moved to, so the two differing is the point - the position has been repriced and has not caught up, and the borrow rate will follow. Use it to answer why a v4 borrow costs what it does when the reserve's headline rate says otherwise. 'spokeId' comes from get_user_positions.

get_risk_premium input schema
{
  "type": "object",
  "required": [
    "user",
    "spokeId"
  ],
  "properties": {
    "user": {
      "type": "string",
      "description": "Wallet address, 0x-prefixed (40 hex chars)."
    },
    "spokeId": {
      "type": "string",
      "description": "spokeId from get_user_positions (not the spoke address)."
    },
    "version": {
      "enum": [
        "v4"
      ],
      "type": "string",
      "description": "Optional, and only 'v4': this tool exists on v4 only."
    }
  },
  "additionalProperties": false
}
get_risk_premium annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_spoke_configs — What one venue will accept, per asset (v4)
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_spoke_configs input schema
{
  "type": "object",
  "required": [
    "hubId",
    "spokeId"
  ],
  "properties": {
    "hubId": {
      "type": "string",
      "description": "hubId from get_reserve_details or get_hubs."
    },
    "spokeId": {
      "type": "string",
      "description": "spokeId from get_reserve_details, or from get_user_positions (not the spoke address)."
    },
    "version": {
      "enum": [
        "v4"
      ],
      "type": "string",
      "description": "Optional, and only 'v4': this tool exists on v4 only."
    }
  },
  "additionalProperties": false
}
get_spoke_configs annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_multichain_asset — One asset wherever v4 holds it
Advertised by the server during the last successful anonymous check.
Advertised read-only

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'.

get_multichain_asset input schema
{
  "type": "object",
  "required": [
    "symbol"
  ],
  "properties": {
    "symbol": {
      "type": "string",
      "description": "Token symbol, e.g. 'USDC'. Case-insensitive."
    },
    "chainId": {
      "type": "number",
      "description": "Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain.",
      "exclusiveMinimum": 0
    },
    "version": {
      "enum": [
        "v4"
      ],
      "type": "string",
      "description": "Optional, and only 'v4': this tool exists on v4 only."
    }
  },
  "additionalProperties": false
}
get_multichain_asset annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
prepare_liquidation — Prepare a liquidation
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

prepare_liquidation input schema
{
  "type": "object",
  "required": [
    "version",
    "user"
  ],
  "properties": {
    "max": {
      "type": "boolean",
      "description": "Cover the maximum the protocol allows."
    },
    "debt": {
      "type": "string",
      "description": "v4 only: reserveId of the debt to repay."
    },
    "user": {
      "type": "string",
      "description": "The wallet being liquidated (0x, 40 hex)."
    },
    "amount": {
      "type": "string",
      "description": "Debt to cover, in main units. Omit only if max=true."
    },
    "market": {
      "type": "string",
      "description": "v3 only: market pool address (from get_markets)."
    },
    "chainId": {
      "type": "number",
      "description": "v3 only: chain id (positive integer).",
      "exclusiveMinimum": 0
    },
    "version": {
      "enum": [
        "v3",
        "v4"
      ],
      "type": "string",
      "description": "Protocol version (v3 or v4; required, no 'all' for actions)."
    },
    "debtToken": {
      "type": "string",
      "description": "v3 only: debt token address."
    },
    "collateral": {
      "type": "string",
      "description": "v4 only: reserveId of the collateral to seize."
    },
    "liquidator": {
      "type": "string",
      "description": "v4 only: the wallet performing the liquidation (0x, 40 hex). On v3 the liquidator is whoever signs the returned transaction."
    },
    "collateralToken": {
      "type": "string",
      "description": "v3 only: collateral token address."
    }
  },
  "additionalProperties": false
}
prepare_liquidation annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
prepare_set_emode — Prepare an eMode change (v3)
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

prepare_set_emode input schema
{
  "type": "object",
  "required": [
    "sender",
    "market",
    "categoryId",
    "chainId"
  ],
  "properties": {
    "market": {
      "type": "string",
      "description": "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": {
      "type": "string",
      "description": "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": {
      "type": "number",
      "description": "Chain id (positive integer).",
      "exclusiveMinimum": 0
    },
    "version": {
      "enum": [
        "v3"
      ],
      "type": "string",
      "description": "Optional, and only 'v3': this tool exists on v3 only."
    },
    "categoryId": {
      "type": "number",
      "description": "eMode categoryId from get_emode_categories, or 0 to disable."
    }
  },
  "additionalProperties": false
}
prepare_set_emode annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
prepare_action — Prepare supply / borrow / withdraw / repay
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

prepare_action input schema
{
  "type": "object",
  "required": [
    "action",
    "sender"
  ],
  "properties": {
    "max": {
      "type": "boolean",
      "description": "Withdraw/repay only: use the entire balance/debt."
    },
    "token": {
      "type": "string",
      "description": "v3 only: underlying token address."
    },
    "action": {
      "enum": [
        "supply",
        "borrow",
        "withdraw",
        "repay"
      ],
      "type": "string",
      "description": "Which action to build."
    },
    "amount": {
      "type": "string",
      "description": "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": {
      "type": "string",
      "description": "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": {
      "type": "boolean",
      "description": "Use the chain's native gas token instead of an ERC-20."
    },
    "sender": {
      "type": "string",
      "description": "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": {
      "type": "number",
      "description": "v3 only: chain id (positive integer).",
      "exclusiveMinimum": 0
    },
    "version": {
      "enum": [
        "v3",
        "v4"
      ],
      "type": "string",
      "description": "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": {
      "type": "string",
      "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. 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": {
      "type": "number",
      "description": "Unix seconds, the 'deadline' from the permit message that was signed. Required with permitSignature.",
      "exclusiveMinimum": 0
    },
    "permitSignature": {
      "type": "string",
      "description": "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": {
      "type": "boolean",
      "description": "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."
    }
  },
  "additionalProperties": false
}
prepare_action annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
prepare_set_collateral — Prepare enable/disable collateral
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

prepare_set_collateral input schema
{
  "type": "object",
  "required": [
    "sender"
  ],
  "properties": {
    "token": {
      "type": "string",
      "description": "v3 only: underlying token address."
    },
    "enable": {
      "type": "boolean",
      "description": "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": {
      "type": "string",
      "description": "v3 only: market pool address."
    },
    "sender": {
      "type": "string",
      "description": "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": {
      "type": "number",
      "description": "v3 only: chain id (positive integer).",
      "exclusiveMinimum": 0
    },
    "version": {
      "enum": [
        "v3",
        "v4"
      ],
      "type": "string",
      "description": "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": {
      "type": "string",
      "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. 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."
    }
  },
  "additionalProperties": false
}
prepare_set_collateral annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
preview_action — Preview an action (simulate before executing)
Advertised by the server during the last successful anonymous check.
Advertised read-only

Simulate a supply/borrow/withdraw/repay against a wallet's position WITHOUT executing, on v3 or v4 - or, v4 only, a quoted order that moves a position: a leverage, a position swap or a repay-with-supply. Always do this before a borrow, a withdraw or any of those orders. Send only the arguments that apply: v4 takes 'reserveId'; v3 takes 'market' + 'token' + 'chainId'; 'max' is for withdraw and repay; 'native' works on both; 'enableCollateral' is v4 only. A quoted order takes 'quoteId' and 'sender' and nothing else, since the quote already binds the wallet, the reserves and the amounts, and the action names the tool that minted it: 'leverage' for get_leverage_quote, 'supplySwap' or 'borrowSwap' for get_position_swap_quote with kind supply or borrow, 'repayWithSupply' for get_repay_with_supply_quote. Both versions answer with 'healthFactorBefore' and 'healthFactorAfter'; v4 also returns net APY, risk premium, net collateral, net balance, projected earnings and both borrowing-power figures, each as a matching Before/After pair, plus 'rewardsAcquired' / 'rewardsAbandoned' when the action changes rewards. v3 has the two health factors and nothing else. Either version also returns 'warnings' when the action would not actually succeed - an error level there means the prepare step will refuse it, so fix the inputs rather than building it. Simulate first even when you intend to build immediately: this is the cheapest way to find out that an action cannot succeed, and it commits nothing. It reports the position's own limits and not token allowances, so a clean simulation says the position allows this, not that no approval step remains.

preview_action input schema
{
  "type": "object",
  "required": [
    "action",
    "sender"
  ],
  "properties": {
    "max": {
      "type": "boolean",
      "description": "Withdraw/repay only: use the entire balance/debt."
    },
    "token": {
      "type": "string",
      "description": "v3 only: underlying token address."
    },
    "action": {
      "enum": [
        "supply",
        "borrow",
        "withdraw",
        "repay",
        "leverage",
        "supplySwap",
        "borrowSwap",
        "repayWithSupply"
      ],
      "type": "string",
      "description": "Action to simulate. 'leverage', 'supplySwap', 'borrowSwap' and 'repayWithSupply' simulate a quoted order and take 'quoteId' and 'sender', nothing else."
    },
    "amount": {
      "type": "string",
      "description": "Amount in MAIN units (e.g. '10.5'), never base units: 100000 base units of a 6-decimal token is '0.1', not '100'. Convert before sending if the user stated base units. Omit only if max=true or the action is a quoted order."
    },
    "market": {
      "type": "string",
      "description": "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": {
      "type": "boolean",
      "description": "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": {
      "type": "string",
      "description": "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": {
      "type": "number",
      "description": "v3 only: chain id (positive integer).",
      "exclusiveMinimum": 0
    },
    "quoteId": {
      "type": "string",
      "description": "Quoted orders only: the quoteId from the quote tool the action names, in this session. The quote binds everything else, wallet included, so 'sender' is the 'user' it was quoted for and no other selector or amount applies."
    },
    "version": {
      "enum": [
        "v3",
        "v4"
      ],
      "type": "string",
      "description": "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": {
      "type": "string",
      "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. 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": {
      "type": "boolean",
      "description": "v4 supply only: also enable as collateral."
    }
  },
  "additionalProperties": false
}
preview_action annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_swappable_tokens — Get swappable chains and tokens
Advertised by the server during the last successful anonymous check.
Advertised read-only

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'.

get_swappable_tokens input schema
{
  "type": "object",
  "properties": {
    "chainIds": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Optional: chain ids to list tokens for. Omit the argument entirely to get every chain with a count instead of a token list."
    }
  },
  "additionalProperties": false
}
get_swappable_tokens annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_swap_quote — Get a token swap quote
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_swap_quote input schema
{
  "type": "object",
  "required": [
    "chainId",
    "sell",
    "buy",
    "amount",
    "user"
  ],
  "properties": {
    "buy": {
      "type": "string",
      "description": "Token to buy: 'native' for the chain's gas token, or an ERC-20 address (0x...)."
    },
    "kind": {
      "enum": [
        "sell",
        "buy"
      ],
      "type": "string",
      "description": "sell = spend an exact sell amount; buy = receive an exact buy amount. Default sell."
    },
    "sell": {
      "type": "string",
      "description": "Token to sell: 'native' for the chain's gas token, or an ERC-20 address (0x...)."
    },
    "user": {
      "type": "string",
      "description": "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": {
      "type": "string",
      "description": "Amount in main units (of the sell token for kind=sell, the buy token for kind=buy)."
    },
    "chainId": {
      "type": "number",
      "description": "Chain id (positive integer).",
      "exclusiveMinimum": 0
    },
    "slippagePct": {
      "type": "string",
      "description": "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."
    }
  },
  "additionalProperties": false
}
get_swap_quote annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_position_swap_quote — Quote a position swap (v4)
Advertised by the server during the last successful anonymous check.
Advertised read-only

v4 only. Quote swapping one Aave v4 position for another, atomically and without leaving the protocol: kind=supply swaps collateral for a different collateral asset, kind=borrow swaps one debt for another. Both sides are on the same spoke. Get 'sellPosition' from get_position_items, whose 'quotableAs' says whether that item can be sold this way (supplySwapFrom or borrowSwapFrom), and 'buyReserve' from get_markets, whose 'quotableAs' says whether that reserve can receive it (supplySwapTo or borrowSwapTo). The quoteId feeds prepare_order. Nothing is committed until the user signs, so state the plan rather than asking permission to quote it.

get_position_swap_quote input schema
{
  "type": "object",
  "required": [
    "kind",
    "sellPosition",
    "buyReserve",
    "amount",
    "user"
  ],
  "properties": {
    "kind": {
      "enum": [
        "supply",
        "borrow"
      ],
      "type": "string",
      "description": "supply = collateral swap, borrow = debt swap."
    },
    "user": {
      "type": "string",
      "description": "Wallet address (0x, 40 hex)."
    },
    "amount": {
      "type": "string",
      "description": "Amount in main units of the sold position, e.g. '100.5'."
    },
    "version": {
      "enum": [
        "v4"
      ],
      "type": "string",
      "description": "Optional, and only 'v4': this tool exists on v4 only."
    },
    "buyReserve": {
      "type": "string",
      "description": "reserveId to move into (from get_markets), on the same spoke as the position sold."
    },
    "slippagePct": {
      "type": "string",
      "description": "Optional max slippage as a percent string, e.g. '0.5'. Omit to accept the backend suggestion."
    },
    "sellPosition": {
      "type": "string",
      "description": "positionItemId to sell (from get_position_items): a supply item for kind=supply, a borrow item for kind=borrow."
    },
    "enableCollateral": {
      "type": "boolean",
      "description": "kind=supply only: enable the bought reserve as collateral (default true)."
    }
  },
  "additionalProperties": false
}
get_position_swap_quote annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_repay_with_supply_quote — Quote repaying debt from collateral (v4)
Advertised by the server during the last successful anonymous check.
Advertised read-only

v4 only. Quote paying down a borrow using supplied collateral, atomically and without the funds leaving Aave. 'debtPosition' is the borrow to reduce, a positionItemId from get_position_items with side=borrow whose 'quotableAs' lists repayDebt; 'repayWithReserve' is the reserveId of the collateral that pays for it, from get_markets with 'quotableAs' listing repayWith, on the same spoke. Use this instead of withdraw-swap-repay by hand: it is one atomic step, so the health factor never dips in between. The quoteId feeds prepare_order. Nothing is committed until the user signs, so state the plan rather than asking permission to quote it.

get_repay_with_supply_quote input schema
{
  "type": "object",
  "required": [
    "debtPosition",
    "repayWithReserve",
    "amount",
    "user"
  ],
  "properties": {
    "user": {
      "type": "string",
      "description": "Wallet address (0x, 40 hex)."
    },
    "amount": {
      "type": "string",
      "description": "Amount of debt to repay, in main units, e.g. '100.5'."
    },
    "version": {
      "enum": [
        "v4"
      ],
      "type": "string",
      "description": "Optional, and only 'v4': this tool exists on v4 only."
    },
    "slippagePct": {
      "type": "string",
      "description": "Optional max slippage as a percent string, e.g. '0.5'. Omit to accept the backend suggestion."
    },
    "debtPosition": {
      "type": "string",
      "description": "positionItemId of the borrow to reduce (get_position_items side=borrow)."
    },
    "repayWithReserve": {
      "type": "string",
      "description": "reserveId of the collateral that pays for it (from get_markets)."
    }
  },
  "additionalProperties": false
}
get_repay_with_supply_quote annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_leverage_quote — Quote a leveraged position (v4)
Advertised by the server during the last successful anonymous check.
Advertised read-only

v4 only. Quote opening or increasing a leveraged position in one atomic order: the debt reserve is flash-loaned, swapped into the collateral reserve and supplied, and the debt is drawn against it to repay the flash loan. Both reserves are reserveIds from get_markets in this session, on the same spoke: pick a debtReserve whose 'quotableAs' lists leverageDebt and a collateralReserve whose 'quotableAs' lists leverageCollateral. Returns the quote with a quoteId (feeds preview_action and prepare_order), the approvals to sign first, and maxSafeMultiplier - the multiplier at which the position becomes liquidatable, which a requested multiplier must stay under. Nothing is committed until the user signs, so state the plan rather than asking permission to quote it.

get_leverage_quote input schema
{
  "type": "object",
  "required": [
    "debtReserve",
    "collateralReserve",
    "user"
  ],
  "properties": {
    "user": {
      "type": "string",
      "description": "Wallet address (0x, 40 hex) of the wallet that will sign, as the user named it in this session. If no wallet has been named, ask for it; never substitute a placeholder, which is rejected."
    },
    "version": {
      "enum": [
        "v4"
      ],
      "type": "string",
      "description": "Optional, and only 'v4': this tool exists on v4 only."
    },
    "multiplier": {
      "type": "string",
      "description": "Target exposure multiplier (target collateral / entry equity), e.g. '2.5'. Strictly greater than 1, and it must stay under the quote's maxSafeMultiplier. Omit the argument entirely to be quoted at a multiplier the backend picks from how closely the two assets track each other."
    },
    "debtReserve": {
      "type": "string",
      "description": "reserveId of the asset borrowed (flash-loaned, then owed as debt), from get_markets."
    },
    "slippagePct": {
      "type": "string",
      "description": "Optional max slippage as a percent string, e.g. '0.5'. Omit to accept the backend suggestion."
    },
    "enableCollateral": {
      "type": "boolean",
      "description": "Whether the supplied collateral backs borrowing (default true, which the leverage loop requires). Omit unless the user asked otherwise."
    },
    "collateralReserve": {
      "type": "string",
      "description": "reserveId of the asset bought and supplied as collateral, from get_markets."
    },
    "additionalCollateral": {
      "type": "string",
      "description": "Extra collateral pulled from the wallet (via permit) on top of existing collateral, in the collateral asset's main units. Required when the wallet has no existing collateral in that reserve; otherwise omit the argument entirely unless the user wants to top up."
    }
  },
  "additionalProperties": false
}
get_leverage_quote annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
prepare_order — Prepare an order (typed data or transaction to sign)
Advertised by the server during the last successful anonymous check.
Advertised read-only

No version argument: every order runs on the v4 backend. One prepare for every product - a token swap, position swap, repay-with-supply or leverage quoteId all come here. Which optional arguments apply is decided by the quote that minted the quoteId, so decide before emitting any: a token-swap quote that offered a 'bySignature' permit takes permitSignature + permitDeadline once that permit is signed; a position-swap, repay-with-supply or leverage quote listing approvals takes one signature per approval under its matching argument (adapterContractSignature, positionManagerSignature, setCollateralSignature, and on a leverage quote permitSignature + permitDeadline for an ERC-20 approval's 'byPermit'); route:'transaction' applies only to a SwapByTransaction... quote (a native-token sell) and takes no signatures at all. Never send a signature argument unsolicited - each exists to carry back a signature its quote explicitly asked for. Non-custodial: this returns what the user signs, and commits nothing.

prepare_order input schema
{
  "type": "object",
  "required": [
    "quoteId"
  ],
  "properties": {
    "route": {
      "enum": [
        "intent",
        "transaction"
      ],
      "type": "string",
      "description": "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": {
      "type": "string",
      "description": "quoteId from get_swap_quote, get_position_swap_quote, get_repay_with_supply_quote or get_leverage_quote."
    },
    "permitDeadline": {
      "type": "number",
      "description": "Unix seconds, the 'deadline' from the permit message that was signed. Required with permitSignature.",
      "exclusiveMinimum": 0
    },
    "permitSignature": {
      "type": "string",
      "description": "The user's signature (0x...) over the PermitTypedData a quote's approvals offered: under 'bySignature' on a token-swap quote, under 'byPermit' on a leverage quote's ERC-20 approval. Sending it skips the approval transaction. Never send it on a first call - you only have one once a quote has handed you a permit to sign. Requires permitDeadline."
    },
    "setCollateralSignature": {
      "type": "string",
      "description": "Signature (0x...) over the 'bySignature' of a set-collateral approval the quote listed. Only when the quote asked for it."
    },
    "adapterContractSignature": {
      "type": "string",
      "description": "Signature (0x...) over the 'bySignature' of an adapter approval the quote listed. Only when the quote asked for it."
    },
    "positionManagerSignature": {
      "type": "string",
      "description": "Signature (0x...) over the 'bySignature' of a position-manager approval the quote listed. Only when the quote asked for it; omit it entirely if that approval's 'byTransaction' was sent instead."
    }
  },
  "additionalProperties": false
}
prepare_order annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
submit_signed_order — Submit a user-signed order
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

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.

submit_signed_order input schema
{
  "type": "object",
  "required": [
    "quoteId",
    "signature"
  ],
  "properties": {
    "quoteId": {
      "type": "string",
      "description": "quoteId (the newQuoteId returned by prepare_order)."
    },
    "signature": {
      "type": "string",
      "description": "The user's EIP-712 signature (0x...)."
    }
  },
  "additionalProperties": false
}
submit_signed_order annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": true
}
prepare_cancel_order — Prepare an order cancellation (EIP-712 to sign)
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

prepare_cancel_order input schema
{
  "type": "object",
  "required": [
    "orderId"
  ],
  "properties": {
    "orderId": {
      "type": "string",
      "description": "The order id (from submit_signed_order's receipt, get_order_status or get_pending_orders)."
    }
  },
  "additionalProperties": false
}
prepare_cancel_order annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
cancel_order — Cancel an order
Advertised by the server during the last successful anonymous check.
Advertised destructiveOpen-world

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.

cancel_order input schema
{
  "type": "object",
  "required": [
    "orderId"
  ],
  "properties": {
    "orderId": {
      "type": "string",
      "description": "The order id (from submit_signed_order's receipt, get_order_status or get_pending_orders)."
    },
    "signature": {
      "type": "string",
      "description": "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."
    }
  },
  "additionalProperties": false
}
cancel_order annotations
{
  "readOnlyHint": false,
  "openWorldHint": true,
  "idempotentHint": true,
  "destructiveHint": true
}
get_order_status — Get order status
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_order_status input schema
{
  "type": "object",
  "required": [
    "orderId"
  ],
  "properties": {
    "orderId": {
      "type": "string",
      "description": "The order id."
    }
  },
  "additionalProperties": false
}
get_order_status annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_pending_orders — List a wallet's orders
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_pending_orders input schema
{
  "type": "object",
  "required": [
    "user"
  ],
  "properties": {
    "user": {
      "type": "string",
      "description": "Wallet address, 0x-prefixed (40 hex chars)."
    },
    "chainIds": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "Optional: chain ids to read. Omit the argument entirely to sweep every chain the backend serves."
    },
    "statuses": {
      "type": "array",
      "items": {
        "enum": [
          "open",
          "pending_signature",
          "fulfilled",
          "cancelled",
          "expired"
        ],
        "type": "string",
        "description": "Order status."
      },
      "description": "Optional: statuses to keep. Omit the argument entirely for all of them."
    }
  },
  "additionalProperties": false
}
get_pending_orders annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_user_rewards — Get user rewards
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_user_rewards input schema
{
  "type": "object",
  "required": [
    "user"
  ],
  "properties": {
    "user": {
      "type": "string",
      "description": "Wallet address, 0x-prefixed (40 hex chars)."
    },
    "chainId": {
      "type": "number",
      "description": "Chain id to restrict to, e.g. 1 for Ethereum. Omit the argument entirely to cover every chain.",
      "exclusiveMinimum": 0
    },
    "version": {
      "enum": [
        "v3",
        "v4",
        "all"
      ],
      "type": "string",
      "description": "Protocol version (default all)."
    }
  },
  "additionalProperties": false
}
get_user_rewards annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
prepare_claim_rewards — Prepare a rewards claim (V4)
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

prepare_claim_rewards input schema
{
  "type": "object",
  "required": [
    "user"
  ],
  "properties": {
    "ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional reward ids (from get_user_rewards). Omit to claim all claimable."
    },
    "user": {
      "type": "string",
      "description": "Wallet address (0x, 40 hex)."
    },
    "chainId": {
      "type": "number",
      "description": "Chain id to claim on. Required unless 'ids' is omitted, in which case the chain is discovered from the wallet's claimable rewards.",
      "exclusiveMinimum": 0
    },
    "version": {
      "enum": [
        "v4"
      ],
      "type": "string",
      "description": "Optional, and only 'v4': this tool exists on v4 only."
    }
  },
  "additionalProperties": false
}
prepare_claim_rewards annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_sgho_vault — Get the sGHO savings vault
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_sgho_vault input schema
{
  "type": "object",
  "properties": {
    "user": {
      "type": "string",
      "description": "Optional wallet address (0x, 40 hex) to include its position. Omit the argument entirely for vault state only."
    },
    "version": {
      "enum": [
        "v3"
      ],
      "type": "string",
      "description": "Optional, and only 'v3': this tool exists on v3 only."
    }
  },
  "additionalProperties": false
}
get_sgho_vault annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_sgho_preview — Preview an sGHO deposit or withdrawal
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_sgho_preview input schema
{
  "type": "object",
  "required": [
    "action",
    "amount"
  ],
  "properties": {
    "action": {
      "enum": [
        "deposit",
        "withdraw"
      ],
      "type": "string",
      "description": "'deposit' converts GHO to shares; 'withdraw' converts shares to GHO."
    },
    "amount": {
      "type": "string",
      "description": "Amount in main units (e.g. '10.5'): GHO when action is 'deposit', sGHO shares when it is 'withdraw'."
    },
    "version": {
      "enum": [
        "v3"
      ],
      "type": "string",
      "description": "Optional, and only 'v3': this tool exists on v3 only."
    }
  },
  "additionalProperties": false
}
get_sgho_preview annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
prepare_sgho_action — Prepare an sGHO deposit or withdrawal
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

prepare_sgho_action input schema
{
  "type": "object",
  "required": [
    "action",
    "sender"
  ],
  "properties": {
    "max": {
      "type": "boolean",
      "description": "withdraw only: redeem the entire share balance."
    },
    "action": {
      "enum": [
        "deposit",
        "withdraw"
      ],
      "type": "string",
      "description": "Which side to build: deposit GHO, or withdraw by redeeming shares."
    },
    "amount": {
      "type": "string",
      "description": "Amount in main units: GHO to deposit, or sGHO shares to redeem. Omit only when max=true."
    },
    "sender": {
      "type": "string",
      "description": "Wallet address, 0x-prefixed (40 hex chars)."
    },
    "version": {
      "enum": [
        "v3"
      ],
      "type": "string",
      "description": "Optional, and only 'v3': this tool exists on v3 only."
    },
    "recipient": {
      "type": "string",
      "description": "Optional address to receive the shares (deposit) or the GHO (withdraw). Omit the argument entirely to use the sender."
    }
  },
  "additionalProperties": false
}
prepare_sgho_action annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
prepare_stkgho_migrate — Prepare a stkGHO migration into sGHO
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

prepare_stkgho_migrate input schema
{
  "type": "object",
  "required": [
    "user"
  ],
  "properties": {
    "user": {
      "type": "string",
      "description": "Wallet address, 0x-prefixed (40 hex chars)."
    },
    "version": {
      "enum": [
        "v3"
      ],
      "type": "string",
      "description": "Optional, and only 'v3': this tool exists on v3 only."
    }
  },
  "additionalProperties": false
}
prepare_stkgho_migrate annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_safety_module — Get the Safety Module
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_safety_module input schema
{
  "type": "object",
  "properties": {
    "user": {
      "type": "string",
      "description": "Optional wallet address (0x, 40 hex) to include its stake, rewards and cooldown. Omit the argument entirely for protocol-wide state only."
    }
  },
  "additionalProperties": false
}
get_safety_module annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_vaults — Get Aave Vaults, or a wallet's shares in them
Advertised by the server during the last successful anonymous check.
Advertised read-only

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'.

get_vaults input schema
{
  "type": "object",
  "properties": {
    "user": {
      "type": "string",
      "description": "Wallet address (0x, 40 hex) to list its vault positions. Omit the argument entirely when using another selector."
    },
    "owner": {
      "type": "string",
      "description": "Curator address (0x, 40 hex) to list the vaults it owns. Omit the argument entirely when using another selector."
    },
    "vault": {
      "type": "string",
      "description": "Vault contract address (0x, 40 hex) to read one vault. Needs 'chainId'. Omit the argument entirely when using another selector."
    },
    "cursor": {
      "type": "string",
      "description": "'nextCursor' from a previous call, to continue a 'user' or 'owner' listing. Omit the argument entirely for the first page."
    },
    "chainId": {
      "type": "number",
      "description": "Chain the vault is on, e.g. 1 for Ethereum.",
      "exclusiveMinimum": 0
    },
    "version": {
      "enum": [
        "v3"
      ],
      "type": "string",
      "description": "Optional, and only 'v3': this tool exists on v3 only."
    }
  },
  "additionalProperties": false
}
get_vaults annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_vault_preview — Preview an Aave Vault deposit, mint, withdraw or redeem
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_vault_preview input schema
{
  "type": "object",
  "required": [
    "action",
    "vault",
    "chainId",
    "amount"
  ],
  "properties": {
    "vault": {
      "type": "string",
      "description": "Vault contract address, 0x-prefixed (40 hex chars)."
    },
    "action": {
      "enum": [
        "deposit",
        "mint",
        "withdraw",
        "redeem"
      ],
      "type": "string",
      "description": "Which conversion: deposit/withdraw speak assets, mint/redeem speak shares."
    },
    "amount": {
      "type": "string",
      "description": "Amount in main units (e.g. '10.5'), in the unit the action takes."
    },
    "chainId": {
      "type": "number",
      "description": "Chain the vault is on, e.g. 1 for Ethereum.",
      "exclusiveMinimum": 0
    },
    "version": {
      "enum": [
        "v3"
      ],
      "type": "string",
      "description": "Optional, and only 'v3': this tool exists on v3 only."
    }
  },
  "additionalProperties": false
}
get_vault_preview annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
prepare_vault_action — Prepare an Aave Vault deposit, mint, withdraw or redeem
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

prepare_vault_action input schema
{
  "type": "object",
  "required": [
    "action",
    "vault",
    "chainId",
    "sender",
    "amount"
  ],
  "properties": {
    "vault": {
      "type": "string",
      "description": "Vault contract address, 0x-prefixed (40 hex chars)."
    },
    "action": {
      "enum": [
        "deposit",
        "mint",
        "withdraw",
        "redeem"
      ],
      "type": "string",
      "description": "Which side to build: deposit/withdraw in assets, mint/redeem in shares."
    },
    "amount": {
      "type": "string",
      "description": "Amount in main units, in the unit the action takes (assets or shares)."
    },
    "sender": {
      "type": "string",
      "description": "Wallet address, 0x-prefixed (40 hex chars)."
    },
    "chainId": {
      "type": "number",
      "description": "Chain the vault is on, e.g. 1 for Ethereum.",
      "exclusiveMinimum": 0
    },
    "version": {
      "enum": [
        "v3"
      ],
      "type": "string",
      "description": "Optional, and only 'v3': this tool exists on v3 only."
    },
    "asAToken": {
      "type": "boolean",
      "description": "Move the reserve's aToken rather than its underlying token (default false)."
    },
    "recipient": {
      "type": "string",
      "description": "Optional address to receive the shares or the assets. Omit the argument entirely to use the sender."
    }
  },
  "additionalProperties": false
}
prepare_vault_action annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_vault_activity — A wallet's history in one Aave Vault
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_vault_activity input schema
{
  "type": "object",
  "required": [
    "vault",
    "chainId",
    "user"
  ],
  "properties": {
    "user": {
      "type": "string",
      "description": "Wallet address, 0x-prefixed (40 hex chars)."
    },
    "vault": {
      "type": "string",
      "description": "Vault contract address, 0x-prefixed (40 hex chars)."
    },
    "window": {
      "enum": [
        "week",
        "month",
        "year",
        "max"
      ],
      "type": "string",
      "description": "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": {
      "type": "number",
      "description": "Chain the vault is on, e.g. 1 for Ethereum.",
      "exclusiveMinimum": 0
    },
    "version": {
      "enum": [
        "v3"
      ],
      "type": "string",
      "description": "Optional, and only 'v3': this tool exists on v3 only."
    }
  },
  "additionalProperties": false
}
get_vault_activity annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
search_governance_proposals — Search Aave DAO proposals
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

search_governance_proposals input schema
{
  "type": "object",
  "properties": {
    "limit": {
      "type": "number",
      "description": "Max rows to return (1-100, default 20)."
    },
    "state": {
      "enum": [
        "created",
        "active",
        "queued",
        "executed",
        "failed",
        "cancelled",
        "expired",
        "pending",
        "null"
      ],
      "type": "string",
      "description": "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": {
      "type": "number",
      "description": "Rows to skip, for paging (default 0)."
    },
    "search": {
      "type": "string",
      "description": "Optional full-text query, e.g. 'GHO' or 'Chaos Labs'. Combines with 'state'."
    },
    "includeSummaries": {
      "type": "boolean",
      "description": "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."
    }
  },
  "additionalProperties": false
}
search_governance_proposals annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_governance_proposal — Get an Aave DAO proposal
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_governance_proposal input schema
{
  "type": "object",
  "required": [
    "proposalId"
  ],
  "properties": {
    "proposalId": {
      "type": "string",
      "description": "Proposal id as a decimal string, e.g. '508'. From search_governance_proposals."
    },
    "includeDescription": {
      "type": "boolean",
      "description": "Include the full proposal markdown from IPFS (default false). It runs to many KB; the short description is always returned."
    }
  },
  "additionalProperties": false
}
get_governance_proposal annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_proposal_votes — Get votes on a proposal
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_proposal_votes input schema
{
  "type": "object",
  "required": [
    "proposalId"
  ],
  "properties": {
    "limit": {
      "type": "number",
      "description": "Max rows to return (1-100, default 20)."
    },
    "offset": {
      "type": "number",
      "description": "Rows to skip, for paging (default 0)."
    },
    "support": {
      "type": "boolean",
      "description": "Filter to one side: true for votes in favour, false for against. Omit for both."
    },
    "proposalId": {
      "type": "string",
      "description": "Proposal id as a decimal string, e.g. '508'. From search_governance_proposals."
    }
  },
  "additionalProperties": false
}
get_proposal_votes annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_user_vote — Get a wallet's vote on a proposal
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_user_vote input schema
{
  "type": "object",
  "required": [
    "user",
    "proposalId"
  ],
  "properties": {
    "user": {
      "type": "string",
      "description": "Wallet address, 0x-prefixed (40 hex chars)."
    },
    "proposalId": {
      "type": "string",
      "description": "Proposal id as a decimal string, e.g. '508'. From search_governance_proposals."
    }
  },
  "additionalProperties": false
}
get_user_vote annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_proposal_payloads — Get a proposal's payloads
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_proposal_payloads input schema
{
  "type": "object",
  "required": [
    "proposalId"
  ],
  "properties": {
    "proposalId": {
      "type": "string",
      "description": "Proposal id as a decimal string, e.g. '508'. From search_governance_proposals."
    }
  },
  "additionalProperties": false
}
get_proposal_payloads annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_aave_guide — Aave protocol & usage guide
Advertised by the server during the last successful anonymous check.
Advertised read-only

Applies to both versions. Protocol and usage guidance for building Aave flows correctly. Read the relevant topic before constructing an action. Topics: overview, v4, v3, positions, health-factor, risks, ids, amounts, prices, signing, swaps, leverage, gho, safety-module, portfolio, governance, rewards, tools, docs. Also the place to come when no tool seems to fit what you were asked for: send 'lookingFor' and this answers with the full capability list rather than leaving you to guess from tool names. For deep protocol docs, point the user to https://docs.aave.com.

get_aave_guide input schema
{
  "type": "object",
  "properties": {
    "topic": {
      "enum": [
        "overview",
        "v4",
        "v3",
        "positions",
        "health-factor",
        "risks",
        "ids",
        "amounts",
        "prices",
        "signing",
        "swaps",
        "leverage",
        "gho",
        "safety-module",
        "portfolio",
        "governance",
        "rewards",
        "tools",
        "docs"
      ],
      "type": "string",
      "description": "Guide topic (default overview). Read 'v3' or 'v4' before building an action on that version."
    },
    "lookingFor": {
      "type": "string",
      "description": "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."
    }
  },
  "additionalProperties": false
}
get_aave_guide annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_started — What this connector can do
Advertised by the server during the last successful anonymous check.
Advertised read-only

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.

get_started input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
get_started annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}

Prompts

6 advertised

check_health — Check wallet health

Advertised by the server during the last successful anonymous check.

Check a wallet's Aave health factor and liquidation risk.

wallet
Wallet address (0x...) (required)
version
v3, v4, or all (default all)
portfolio — Full Aave portfolio

Advertised by the server during the last successful anonymous check.

Everything a wallet holds across Aave: lending, Safety Module stake, Savings GHO, vaults, rewards and wallet balance.

wallet
Wallet address (0x...) (required)
best_stablecoin_yield — Best stablecoin yield

Advertised by the server during the last successful anonymous check.

Find the best stablecoin supply APY across Aave V3 and V4, on every chain.

chainId
Chain id to restrict to. Omit to search every chain
prepare_supply — Prepare a supply

Advertised by the server during the last successful anonymous check.

Build a non-custodial supply transaction for a wallet.

wallet
Wallet address (0x...) (required)
amount
Amount in main units, e.g. 100 (required)
asset
Token symbol, e.g. USDC (required)
version
v3 or v4 (default v4)
gho_savings — Where to put GHO

Advertised by the server during the last successful anonymous check.

Compare the sGHO savings rate against supplying GHO to a market.

wallet
Wallet address (0x...), optional
amount
Amount of GHO to consider, e.g. 1000
review_position — Review positions

Advertised by the server during the last successful anonymous check.

Summarize a wallet's Aave positions and suggest next steps.

wallet
Wallet address (0x...) (required)

Resources

19 advertised

aave-guide-overview — Aave guide: overview

Advertised by the server during the last successful anonymous check.

Protocol and usage guidance for building Aave flows correctly (overview).

aave-guide-overview URI
aave://guide/overview

MIME type: text/plain

aave-guide-v4 — Aave guide: v4

Advertised by the server during the last successful anonymous check.

Protocol and usage guidance for building Aave flows correctly (v4).

aave-guide-v4 URI
aave://guide/v4

MIME type: text/plain

aave-guide-v3 — Aave guide: v3

Advertised by the server during the last successful anonymous check.

Protocol and usage guidance for building Aave flows correctly (v3).

aave-guide-v3 URI
aave://guide/v3

MIME type: text/plain

aave-guide-positions — Aave guide: positions

Advertised by the server during the last successful anonymous check.

Protocol and usage guidance for building Aave flows correctly (positions).

aave-guide-positions URI
aave://guide/positions

MIME type: text/plain

aave-guide-health-factor — Aave guide: health-factor

Advertised by the server during the last successful anonymous check.

Protocol and usage guidance for building Aave flows correctly (health-factor).

aave-guide-health-factor URI
aave://guide/health-factor

MIME type: text/plain

aave-guide-risks — Aave guide: risks

Advertised by the server during the last successful anonymous check.

Protocol and usage guidance for building Aave flows correctly (risks).

aave-guide-risks URI
aave://guide/risks

MIME type: text/plain

aave-guide-ids — Aave guide: ids

Advertised by the server during the last successful anonymous check.

Protocol and usage guidance for building Aave flows correctly (ids).

aave-guide-ids URI
aave://guide/ids

MIME type: text/plain

aave-guide-amounts — Aave guide: amounts

Advertised by the server during the last successful anonymous check.

Protocol and usage guidance for building Aave flows correctly (amounts).

aave-guide-amounts URI
aave://guide/amounts

MIME type: text/plain

aave-guide-prices — Aave guide: prices

Advertised by the server during the last successful anonymous check.

Protocol and usage guidance for building Aave flows correctly (prices).

aave-guide-prices URI
aave://guide/prices

MIME type: text/plain

aave-guide-signing — Aave guide: signing

Advertised by the server during the last successful anonymous check.

Protocol and usage guidance for building Aave flows correctly (signing).

aave-guide-signing URI
aave://guide/signing

MIME type: text/plain

aave-guide-swaps — Aave guide: swaps

Advertised by the server during the last successful anonymous check.

Protocol and usage guidance for building Aave flows correctly (swaps).

aave-guide-swaps URI
aave://guide/swaps

MIME type: text/plain

aave-guide-leverage — Aave guide: leverage

Advertised by the server during the last successful anonymous check.

Protocol and usage guidance for building Aave flows correctly (leverage).

aave-guide-leverage URI
aave://guide/leverage

MIME type: text/plain

aave-guide-gho — Aave guide: gho

Advertised by the server during the last successful anonymous check.

Protocol and usage guidance for building Aave flows correctly (gho).

aave-guide-gho URI
aave://guide/gho

MIME type: text/plain

aave-guide-safety-module — Aave guide: safety-module

Advertised by the server during the last successful anonymous check.

Protocol and usage guidance for building Aave flows correctly (safety-module).

aave-guide-safety-module URI
aave://guide/safety-module

MIME type: text/plain

aave-guide-portfolio — Aave guide: portfolio

Advertised by the server during the last successful anonymous check.

Protocol and usage guidance for building Aave flows correctly (portfolio).

aave-guide-portfolio URI
aave://guide/portfolio

MIME type: text/plain

aave-guide-governance — Aave guide: governance

Advertised by the server during the last successful anonymous check.

Protocol and usage guidance for building Aave flows correctly (governance).

aave-guide-governance URI
aave://guide/governance

MIME type: text/plain

aave-guide-rewards — Aave guide: rewards

Advertised by the server during the last successful anonymous check.

Protocol and usage guidance for building Aave flows correctly (rewards).

aave-guide-rewards URI
aave://guide/rewards

MIME type: text/plain

aave-guide-tools — Aave guide: tools

Advertised by the server during the last successful anonymous check.

Protocol and usage guidance for building Aave flows correctly (tools).

aave-guide-tools URI
aave://guide/tools

MIME type: text/plain

aave-guide-docs — Aave guide: docs

Advertised by the server during the last successful anonymous check.

Protocol and usage guidance for building Aave flows correctly (docs).

aave-guide-docs URI
aave://guide/docs

MIME type: text/plain

aave-guide — Aave guide topic

Advertised by the server during the last successful anonymous check.

One guide topic. Topics: overview, v4, v3, positions, health-factor, risks, ids, amounts, prices, signing, swaps, leverage, gho, safety-module, portfolio, governance, rewards, tools, docs.

aave-guide URI template
aave://guide/{topic}

MIME type: text/plain

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
320 ms
95th percentile latency
320 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 320 ms · metadata changed · 56 tool(s), 19 resource(s), 1 resource template(s), 6 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http aave-mcp https://mcp.aave.com

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add aave-mcp --url https://mcp.aave.com

Cursor

Merge this server into .cursor/mcp.json in your project, then enable aave-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "aave-mcp": {
      "url": "https://mcp.aave.com"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "aave-mcp": {
      "type": "streamableHttp",
      "url": "https://mcp.aave.com",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start aave-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "aave-mcp": {
      "type": "http",
      "url": "https://mcp.aave.com"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http aave-mcp https://mcp.aave.com

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "aave-mcp": {
      "url": "https://mcp.aave.com"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "aave-mcp": {
      "serverUrl": "https://mcp.aave.com"
    }
  }
}

Let your agent find its tools

Find servers like Aave MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run Aave MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing