{"apiVersion":"v1","directorySlug":"aave-mcp-5a10432347","title":"Aave — Onchain Savings, Lending and Borrowing","description":"Earn on your savings, borrow against your assets, and build onchain finance with Aave. Six years of uninterrupted operation, independently audited.","pageUrl":"https://www.mcpbundles.com/skills/aave-mcp-5a10432347","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://mcp.aave.com/","hostedMcpUrl":null,"toolCount":53,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"com.aave/aave-mcp-5a10432347","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"name":"get_chains","description":"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.","inputSchema":{"type":"object","properties":{"version":{"enum":["v3","v4","all"],"type":"string"}},"additionalProperties":false},"title":"Get supported chains","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_chains","displayName":"Get supported chains"},{"name":"get_markets","description":"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","inputSchema":{"type":"object","properties":{"user":{"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"symbols":{"type":"array","items":{"type":"string"}},"version":{"enum":["v3","v4","all"],"type":"string"}},"additionalProperties":false},"title":"Get markets / reserves","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_markets","displayName":"Get markets / reserves"},{"name":"get_emode_categories","description":"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","inputSchema":{"type":"object","properties":{"chainId":{"type":"number","exclusiveMinimum":0},"symbols":{"type":"array","items":{"type":"string"}},"version":{"enum":["v3"],"type":"string"}},"additionalProperties":false},"title":"Get v3 eMode categories","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_emode_categories","displayName":"Get v3 eMode categories"},{"name":"get_user_positions","description":"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","inputSchema":{"type":"object","required":["user"],"properties":{"user":{"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v3","v4","all"],"type":"string"}},"additionalProperties":false},"title":"Get user positions","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_user_positions","displayName":"Get user positions"},{"name":"get_position_items","description":"v4 only. The individual supplies or borrows inside one v4 spoke: principal, accrued interest and what is withdrawable right now, per item, which the per-spoke aggregate from get_user_positions cannot show. Get 'spokeId' from get_user_positions.","inputSchema":{"type":"object","required":["user","spokeId"],"properties":{"side":{"enum":["supply","borrow"],"type":"string"},"user":{"type":"string"},"spokeId":{"type":"string"},"version":{"enum":["v4"],"type":"string"}},"additionalProperties":false},"title":"Get individual position items (v4)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_position_items","displayName":"Get individual position items (v4)"},{"name":"get_user_summary","description":"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 sc","inputSchema":{"type":"object","required":["user"],"properties":{"user":{"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v3","v4","all"],"type":"string"}},"additionalProperties":false},"title":"Get user summary / health factor","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_user_summary","displayName":"Get user summary / health factor"},{"name":"get_transaction_processed","description":"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.","inputSchema":{"type":"object","required":["txHash","operations"],"properties":{"txHash":{"type":"string"},"version":{"enum":["v4"],"type":"string"},"operations":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"title":"Has Aave seen my transaction yet?","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_transaction_processed","displayName":"Has Aave seen my transaction yet?"},{"name":"get_reserve_details","description":"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","inputSchema":{"type":"object","properties":{"token":{"type":"string"},"market":{"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v3","v4"],"type":"string"},"reserveId":{"type":"string"}},"additionalProperties":false},"title":"Get reserve details","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_reserve_details","displayName":"Get reserve details"},{"name":"get_apy_history","description":"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","inputSchema":{"type":"object","properties":{"side":{"enum":["supply","borrow"],"type":"string"},"token":{"type":"string"},"market":{"type":"string"},"window":{"enum":["day","week","month","sixMonths","year"],"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v3","v4"],"type":"string"},"reserveId":{"type":"string"}},"additionalProperties":false},"title":"Get APY history","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_apy_history","displayName":"Get APY history"},{"name":"get_user_activity","description":"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.","inputSchema":{"type":"object","required":["user"],"properties":{"user":{"type":"string"},"cursor":{"type":"string"},"market":{"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v3","v4","all"],"type":"string"}},"additionalProperties":false},"title":"Get user activity / transaction history","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_user_activity","displayName":"Get user activity / transaction history"},{"name":"get_protocol_history","description":"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).","inputSchema":{"type":"object","properties":{"window":{"enum":["day","week","month","sixMonths","year"],"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v4"],"type":"string"}},"additionalProperties":false},"title":"Protocol totals over time (v4)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_protocol_history","displayName":"Protocol totals over time (v4)"},{"name":"get_user_summary_history","description":"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.","inputSchema":{"type":"object","required":["user"],"properties":{"user":{"type":"string"},"window":{"enum":["day","week","month","sixMonths","year"],"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v4"],"type":"string"}},"additionalProperties":false},"title":"A wallet's position over time (v4)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_user_summary_history","displayName":"A wallet's position over time (v4)"},{"name":"get_hubs","description":"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.","inputSchema":{"type":"object","properties":{"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v4"],"type":"string"}},"additionalProperties":false},"title":"Get v4 hubs","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_hubs","displayName":"Get v4 hubs"},{"name":"get_hub_assets","description":"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.","inputSchema":{"type":"object","required":["hubId"],"properties":{"hubId":{"type":"string"},"version":{"enum":["v4"],"type":"string"}},"additionalProperties":false},"title":"Get the assets a v4 hub carries","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_hub_assets","displayName":"Get the assets a v4 hub carries"},{"name":"get_market_history","description":"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 interchang","inputSchema":{"type":"object","required":["scope","id"],"properties":{"id":{"type":"string"},"scope":{"enum":["hub","spoke"],"type":"string"},"window":{"enum":["day","week","month","sixMonths","year"],"type":"string"},"version":{"enum":["v4"],"type":"string"}},"additionalProperties":false},"title":"Market totals over time (v4)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_market_history","displayName":"Market totals over time (v4)"},{"name":"get_asset_history","description":"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_market","inputSchema":{"type":"object","required":["metric","token","chainId"],"properties":{"token":{"type":"string"},"metric":{"enum":["price","supply","borrow"],"type":"string"},"window":{"enum":["day","week","month","sixMonths","year"],"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v4"],"type":"string"}},"additionalProperties":false},"title":"One asset's price, supply or borrows over time (v4)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_asset_history","displayName":"One asset's price, supply or borrows over time (v4)"},{"name":"get_reserve_holders","description":"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.","inputSchema":{"type":"object","required":["reserveId"],"properties":{"side":{"enum":["supply","borrow"],"type":"string"},"limit":{"enum":[10,50],"type":"number"},"cursor":{"type":"string"},"version":{"enum":["v4"],"type":"string"},"reserveId":{"type":"string"}},"additionalProperties":false},"title":"Largest suppliers or borrowers of a reserve (v4)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_reserve_holders","displayName":"Largest suppliers or borrowers of a reserve (v4)"},{"name":"get_interest_rate_model","description":"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 wo","inputSchema":{"type":"object","required":["hubAssetId"],"properties":{"version":{"enum":["v4"],"type":"string"},"hubAssetId":{"type":"string"}},"additionalProperties":false},"title":"The interest rate curve for an asset (v4)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_interest_rate_model","displayName":"The interest rate curve for an asset (v4)"},{"name":"get_wallet_balances","description":"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'","inputSchema":{"type":"object","required":["user"],"properties":{"user":{"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v4"],"type":"string"}},"additionalProperties":false},"title":"What a wallet holds that Aave accepts (v4)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_wallet_balances","displayName":"What a wallet holds that Aave accepts (v4)"},{"name":"get_risk_premium","description":"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 otherwis","inputSchema":{"type":"object","required":["user","spokeId"],"properties":{"user":{"type":"string"},"spokeId":{"type":"string"},"version":{"enum":["v4"],"type":"string"}},"additionalProperties":false},"title":"How a position's risk premium is built up (v4)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_risk_premium","displayName":"How a position's risk premium is built up (v4)"},{"name":"get_spoke_configs","description":"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_detai","inputSchema":{"type":"object","required":["hubId","spokeId"],"properties":{"hubId":{"type":"string"},"spokeId":{"type":"string"},"version":{"enum":["v4"],"type":"string"}},"additionalProperties":false},"title":"What one venue will accept, per asset (v4)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_spoke_configs","displayName":"What one venue will accept, per asset (v4)"},{"name":"get_multichain_asset","description":"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'.","inputSchema":{"type":"object","required":["symbol"],"properties":{"symbol":{"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v4"],"type":"string"}},"additionalProperties":false},"title":"One asset wherever v4 holds it","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_multichain_asset","displayName":"One asset wherever v4 holds it"},{"name":"prepare_liquidation","description":"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.","inputSchema":{"type":"object","required":["version","user"],"properties":{"max":{"type":"boolean"},"debt":{"type":"string"},"user":{"type":"string"},"amount":{"type":"string"},"market":{"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v3","v4"],"type":"string"},"debtToken":{"type":"string"},"collateral":{"type":"string"},"liquidator":{"type":"string"},"collateralToken":{"type":"string"}},"additionalProperties":false},"title":"Prepare a liquidation","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"prepare_liquidation","displayName":"Prepare a liquidation"},{"name":"prepare_set_emode","description":"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.","inputSchema":{"type":"object","required":["sender","market","categoryId","chainId"],"properties":{"market":{"type":"string"},"sender":{"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v3"],"type":"string"},"categoryId":{"type":"number"}},"additionalProperties":false},"title":"Prepare an eMode change (v3)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"prepare_set_emode","displayName":"Prepare an eMode change (v3)"},{"name":"prepare_action","description":"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;","inputSchema":{"type":"object","required":["action","sender"],"properties":{"max":{"type":"boolean"},"token":{"type":"string"},"action":{"enum":["supply","borrow","withdraw","repay"],"type":"string"},"amount":{"type":"string"},"market":{"type":"string"},"native":{"type":"boolean"},"sender":{"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v3","v4"],"type":"string"},"reserveId":{"type":"string"},"permitDeadline":{"type":"number","exclusiveMinimum":0},"permitSignature":{"type":"string"},"enableCollateral":{"type":"boolean"}},"additionalProperties":false},"title":"Prepare supply / borrow / withdraw / repay","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"prepare_action","displayName":"Prepare supply / borrow / withdraw / repay"},{"name":"prepare_set_collateral","description":"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 simulat","inputSchema":{"type":"object","required":["sender"],"properties":{"token":{"type":"string"},"enable":{"type":"boolean"},"market":{"type":"string"},"sender":{"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v3","v4"],"type":"string"},"reserveId":{"type":"string"}},"additionalProperties":false},"title":"Prepare enable/disable collateral","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"prepare_set_collateral","displayName":"Prepare enable/disable collateral"},{"name":"preview_action","description":"Simulate a supply/borrow/withdraw/repay against a wallet's position WITHOUT executing, on v3 or v4. Always do this before a borrow or a withdraw. Send only the arguments that apply: v4 takes 'reserveId'; v3 takes 'market' + 'token' + 'chainId'; 'max' is for withdraw and repay; 'native' works on both; 'enableCollateral' is v4 only. Both versions answer with 'healthFactorBefore' and 'healthFactorAfter'; v4 also returns net APY, risk premium, net collateral, net balance, projected earnings and both","inputSchema":{"type":"object","required":["action","sender"],"properties":{"max":{"type":"boolean"},"token":{"type":"string"},"action":{"enum":["supply","borrow","withdraw","repay"],"type":"string"},"amount":{"type":"string"},"market":{"type":"string"},"native":{"type":"boolean"},"sender":{"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v3","v4"],"type":"string"},"reserveId":{"type":"string"},"enableCollateral":{"type":"boolean"}},"additionalProperties":false},"title":"Preview an action (simulate before executing)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"preview_action","displayName":"Preview an action (simulate before executing)"},{"name":"get_swappable_tokens","description":"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 'chainsNot","inputSchema":{"type":"object","properties":{"chainIds":{"type":"array","items":{"type":"number"}}},"additionalProperties":false},"title":"Get swappable chains and tokens","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_swappable_tokens","displayName":"Get swappable chains and tokens"},{"name":"get_swap_quote","description":"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.","inputSchema":{"type":"object","required":["chainId","sell","buy","amount","user"],"properties":{"buy":{"type":"string"},"kind":{"enum":["sell","buy"],"type":"string"},"sell":{"type":"string"},"user":{"type":"string"},"amount":{"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"slippagePct":{"type":"string"}},"additionalProperties":false},"title":"Get a token swap quote","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_swap_quote","displayName":"Get a token swap quote"},{"name":"prepare_order","description":"No version argument: every order runs on the v4 backend. Which optional arguments apply is decided by the quote that minted the quoteId, so decide before emitting any: a quote that offered a 'bySignature' permit takes permitSignature + permitDeadline once that permit is signed; route:'transaction' applies only to a SwapByTransaction... quote (a native-token sell) and takes no signatures at all. Never send a signature argument unsolicited - it exists to carry back a signature the quote explicitly","inputSchema":{"type":"object","required":["quoteId"],"properties":{"route":{"enum":["intent","transaction"],"type":"string"},"quoteId":{"type":"string"},"permitDeadline":{"type":"number","exclusiveMinimum":0},"permitSignature":{"type":"string"}},"additionalProperties":false},"title":"Prepare an order (typed data or transaction to sign)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"prepare_order","displayName":"Prepare an order (typed data or transaction to sign)"},{"name":"submit_signed_order","description":"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.","inputSchema":{"type":"object","required":["quoteId","signature"],"properties":{"quoteId":{"type":"string"},"signature":{"type":"string"}},"additionalProperties":false},"title":"Submit a user-signed order","logicalName":"submit_signed_order","displayName":"Submit a user-signed order","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"prepare_cancel_order","description":"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.","inputSchema":{"type":"object","required":["orderId"],"properties":{"orderId":{"type":"string"}},"additionalProperties":false},"title":"Prepare an order cancellation (EIP-712 to sign)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"prepare_cancel_order","displayName":"Prepare an order cancellation (EIP-712 to sign)"},{"name":"cancel_order","description":"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.","inputSchema":{"type":"object","required":["orderId"],"properties":{"orderId":{"type":"string"},"signature":{"type":"string"}},"additionalProperties":false},"title":"Cancel an order","logicalName":"cancel_order","displayName":"Cancel an order","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_order_status","description":"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.","inputSchema":{"type":"object","required":["orderId"],"properties":{"orderId":{"type":"string"}},"additionalProperties":false},"title":"Get order status","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_order_status","displayName":"Get order status"},{"name":"get_pending_orders","description":"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 retu","inputSchema":{"type":"object","required":["user"],"properties":{"user":{"type":"string"},"chainIds":{"type":"array","items":{"type":"number"}},"statuses":{"type":"array","items":{"enum":["open","pending_signature","fulfilled","cancelled","expired"],"type":"string"}}},"additionalProperties":false},"title":"List a wallet's orders","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_pending_orders","displayName":"List a wallet's orders"},{"name":"get_user_rewards","description":"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","inputSchema":{"type":"object","required":["user"],"properties":{"user":{"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v3","v4","all"],"type":"string"}},"additionalProperties":false},"title":"Get user rewards","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_user_rewards","displayName":"Get user rewards"},{"name":"prepare_claim_rewards","description":"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.","inputSchema":{"type":"object","required":["user"],"properties":{"ids":{"type":"array","items":{"type":"string"}},"user":{"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v4"],"type":"string"}},"additionalProperties":false},"title":"Prepare a rewards claim (V4)","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"prepare_claim_rewards","displayName":"Prepare a rewards claim (V4)"},{"name":"get_sgho_vault","description":"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 t","inputSchema":{"type":"object","properties":{"user":{"type":"string"},"version":{"enum":["v3"],"type":"string"}},"additionalProperties":false},"title":"Get the sGHO savings vault","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_sgho_vault","displayName":"Get the sGHO savings vault"},{"name":"get_sgho_preview","description":"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-n","inputSchema":{"type":"object","required":["action","amount"],"properties":{"action":{"enum":["deposit","withdraw"],"type":"string"},"amount":{"type":"string"},"version":{"enum":["v3"],"type":"string"}},"additionalProperties":false},"title":"Preview an sGHO deposit or withdrawal","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_sgho_preview","displayName":"Preview an sGHO deposit or withdrawal"},{"name":"prepare_sgho_action","description":"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 rede","inputSchema":{"type":"object","required":["action","sender"],"properties":{"max":{"type":"boolean"},"action":{"enum":["deposit","withdraw"],"type":"string"},"amount":{"type":"string"},"sender":{"type":"string"},"version":{"enum":["v3"],"type":"string"},"recipient":{"type":"string"}},"additionalProperties":false},"title":"Prepare an sGHO deposit or withdrawal","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"prepare_sgho_action","displayName":"Prepare an sGHO deposit or withdrawal"},{"name":"prepare_stkgho_migrate","description":"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.","inputSchema":{"type":"object","required":["user"],"properties":{"user":{"type":"string"},"version":{"enum":["v3"],"type":"string"}},"additionalProperties":false},"title":"Prepare a stkGHO migration into sGHO","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"prepare_stkgho_migrate","displayName":"Prepare a stkGHO migration into sGHO"},{"name":"get_safety_module","description":"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","inputSchema":{"type":"object","properties":{"user":{"type":"string"}},"additionalProperties":false},"title":"Get the Safety Module","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_safety_module","displayName":"Get the Safety Module"},{"name":"get_vaults","description":"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 th","inputSchema":{"type":"object","properties":{"user":{"type":"string"},"owner":{"type":"string"},"vault":{"type":"string"},"cursor":{"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v3"],"type":"string"}},"additionalProperties":false},"title":"Get Aave Vaults, or a wallet's shares in them","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_vaults","displayName":"Get Aave Vaults, or a wallet's shares in them"},{"name":"get_vault_preview","description":"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","inputSchema":{"type":"object","required":["action","vault","chainId","amount"],"properties":{"vault":{"type":"string"},"action":{"enum":["deposit","mint","withdraw","redeem"],"type":"string"},"amount":{"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v3"],"type":"string"}},"additionalProperties":false},"title":"Preview an Aave Vault deposit, mint, withdraw or redeem","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_vault_preview","displayName":"Preview an Aave Vault deposit, mint, withdraw or redeem"},{"name":"prepare_vault_action","description":"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","inputSchema":{"type":"object","required":["action","vault","chainId","sender","amount"],"properties":{"vault":{"type":"string"},"action":{"enum":["deposit","mint","withdraw","redeem"],"type":"string"},"amount":{"type":"string"},"sender":{"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v3"],"type":"string"},"asAToken":{"type":"boolean"},"recipient":{"type":"string"}},"additionalProperties":false},"title":"Prepare an Aave Vault deposit, mint, withdraw or redeem","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"prepare_vault_action","displayName":"Prepare an Aave Vault deposit, mint, withdraw or redeem"},{"name":"get_vault_activity","description":"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.","inputSchema":{"type":"object","required":["vault","chainId","user"],"properties":{"user":{"type":"string"},"vault":{"type":"string"},"window":{"enum":["week","month","year","max"],"type":"string"},"chainId":{"type":"number","exclusiveMinimum":0},"version":{"enum":["v3"],"type":"string"}},"additionalProperties":false},"title":"A wallet's history in one Aave Vault","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_vault_activity","displayName":"A wallet's history in one Aave Vault"},{"name":"search_governance_proposals","description":"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.","inputSchema":{"type":"object","properties":{"limit":{"type":"number"},"state":{"enum":["created","active","queued","executed","failed","cancelled","expired","pending","null"],"type":"string"},"offset":{"type":"number"},"search":{"type":"string"},"includeSummaries":{"type":"boolean"}},"additionalProperties":false},"title":"Search Aave DAO proposals","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"search_governance_proposals","displayName":"Search Aave DAO proposals"},{"name":"get_governance_proposal","description":"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.","inputSchema":{"type":"object","required":["proposalId"],"properties":{"proposalId":{"type":"string"},"includeDescription":{"type":"boolean"}},"additionalProperties":false},"title":"Get an Aave DAO proposal","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_governance_proposal","displayName":"Get an Aave DAO proposal"},{"name":"get_proposal_votes","description":"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.","inputSchema":{"type":"object","required":["proposalId"],"properties":{"limit":{"type":"number"},"offset":{"type":"number"},"support":{"type":"boolean"},"proposalId":{"type":"string"}},"additionalProperties":false},"title":"Get votes on a proposal","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_proposal_votes","displayName":"Get votes on a proposal"},{"name":"get_user_vote","description":"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.","inputSchema":{"type":"object","required":["user","proposalId"],"properties":{"user":{"type":"string"},"proposalId":{"type":"string"}},"additionalProperties":false},"title":"Get a wallet's vote on a proposal","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_user_vote","displayName":"Get a wallet's vote on a proposal"},{"name":"get_proposal_payloads","description":"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.","inputSchema":{"type":"object","required":["proposalId"],"properties":{"proposalId":{"type":"string"}},"additionalProperties":false},"title":"Get a proposal's payloads","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_proposal_payloads","displayName":"Get a proposal's payloads"},{"name":"get_aave_guide","description":"Applies to both versions. Protocol and usage guidance for building Aave flows correctly. Read the relevant topic before constructing an action. Topics: overview, v4, v3, positions, health-factor, risks, ids, amounts, prices, signing, swaps, gho, safety-module, portfolio, governance, rewards, tools, docs. Also the place to come when no tool seems to fit what you were asked for: send 'lookingFor' and this answers with the full capability list rather than leaving you to guess from tool names. For d","inputSchema":{"type":"object","properties":{"topic":{"enum":["overview","v4","v3","positions","health-factor","risks","ids","amounts","prices","signing","swaps","gho","safety-module","portfolio","governance","rewards","tools","docs"],"type":"string"},"lookingFor":{"type":"string"}},"additionalProperties":false},"title":"Aave protocol & usage guide","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_aave_guide","displayName":"Aave protocol & usage guide"},{"name":"get_started","description":"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.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"title":"What this connector can do","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_started","displayName":"What this connector can do"}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=Aave-Onchain-Savings-Lending-and-Borrowing&config=eyJ1cmwiOiAiaHR0cHM6Ly9tY3AuYWF2ZS5jb20vIn0%3D"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22Aave-Onchain-Savings-Lending-and-Borrowing%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.aave.com%2F%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22Aave-Onchain-Savings-Lending-and-Borrowing%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.aave.com%2F%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=Aave+%E2%80%94+Onchain+Savings%2C+Lending+and+Borrowing&connectorUrl=https%3A%2F%2Fmcp.aave.com%2F"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"Aave-Onchain-Savings-Lending-and-Borrowing\" --url \"https://mcp.aave.com/\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/aave-mcp-5a10432347","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/aave-mcp-5a10432347/tools/{tool}","mcpServerUrl":"https://mcp.aave.com/","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/aave-mcp-5a10432347?live=1"}