Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Certificate changed, valid to 2026-12-26
Changed the definition of "get_market_history", "get_spoke_configs", "get_vault_activity" and 1 more
⟨43 unchanged words⟩ '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 ⟨21 unchanged words⟩
⟨72 unchanged words⟩ different thing from one that was turned off.IdsBoth ids come fromget_hubsget_reserve_detailsandforget_user_positions.any reserve, which is the route that works before a wallet holds anything on that spoke.
⟨3 unchanged words⟩ :{"hubId":{"description":"hubId from get_reserve_details or get_hubs.","type":"string"},"spokeId":{"description":"spokeId from get_reserve_details, or from get_user_positions (not the spoke address)." ⟨23 unchanged words⟩
⟨60 unchanged words⟩ far back to go (default week).ThisTheseendpointare the only bucketsbythisweekendpointathas:thethereshortestis no day and no six months, so'day'askreadsforasoneaofweek.these rather than expecting the nearest.
⟨14 unchanged words⟩ "exclusiveMinimum":0,"type":"number"},"cursor":{"description":"'nextCursor' from a previous call, to continue a 'user' or 'owner' listing. Omit the argument entirely for the first page.","type":"string"},"owner":{"description":"Curator address (0x, ⟨82 unchanged words⟩
Added "get_asset_history", "get_interest_rate_model", "get_market_history" and 10 more; changed the definition of "get_aave_guide", "get_sgho_vault", "get_user_summary" and 1 more (40 tools before, 53 now)
⟨29 unchanged words⟩ amounts, prices, signing, swaps, gho, safety-module, portfolio, governance, rewards, tools, docs. Also the place ⟨42 unchanged words⟩
⟨106 unchanged words⟩ prices","signing","swaps","gho","safety-module","portfolio","governance","rewards","tools","docs"], ⟨4 unchanged words⟩
Certificate recorded, valid to 2026-10-28
Authorization not required
First tool surface recorded: 40 tools (server version 1.0.0)
Showing the latest 6 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨44 unchanged words⟩ 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 ⟨44 unchanged words⟩
⟨169 unchanged words⟩ '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.
⟨26 unchanged words⟩ the entire stkGHO position and takes no amount.This server cannot read aCallstkGHOget_safety_modulebalancewithorthecooldownsamestate,walletsofirstsayandthatquote themigration is forlegacythestkGHOwholebalancepositionitandreturns,letso the usercheck itsknowssizewhatintheytheirarewalletmoving beforesigning.they sign. Non-custodial, so build it rather than asking permission first.
One asset's price, supply or borrows over time (v4) — 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 symbo…
The interest rate curve for an asset (v4) — 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.
Market totals over time (v4) — 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_hubs ('hubId') and get_user_positions ('spokeId'); the two are not interchangeable and the wrong one is rejected. 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…
One asset wherever v4 holds it — 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'.
Largest suppliers or borrowers of a reserve (v4) — 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.
How a position's risk premium is built up (v4) — 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 the Safety Module — 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 walle…
What one venue will accept, per asset (v4) — 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. Ids come from get_hubs and get_user_positions.
A wallet's history in one Aave Vault — 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.
Preview an Aave Vault deposit, mint, withdraw or redeem — 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 …
Get Aave Vaults, or a wallet's shares in them — 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…
What a wallet holds that Aave accepts (v4) — 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 'chainsCove…
Prepare an Aave Vault deposit, mint, withdraw or redeem — 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 …