{
  "markdown": "# Aave MCP\n\nThe official [Model Context Protocol](https://modelcontextprotocol.io) server for Aave. Connect any\nAI assistant to Aave and let it read live protocol data and build non-custodial transactions across\n**both Aave V3 and V4** through one endpoint.\n\nAsk your assistant \"what's my health factor?\", \"where's the best stablecoin yield?\", or \"prepare a\nsupply of 500 USDC\" and it calls Aave directly, with numbers that match the app.\n\n## Why this server\n\n- **V3 and V4, one endpoint.** Most tools take a `version` argument (`v3`, `v4`, or `all`), so a\n  single connection answers questions about either protocol, or compares them.\n- **Authoritative.** It wraps the official `@aave/client` SDK, so results match `app.aave.com` (V3)\n  and `pro.aave.com` (V4), including V4-specific concepts like hub/spoke, risk premium, and the\n  correct health factor. Third-party tools that reimplement the math get V4 wrong.\n- **Non-custodial by design.** Read and `prepare_*` tools return data or an *unsigned* transaction /\n  EIP-712 payload. The user's wallet signs; this server never holds keys and never submits for you.\n- **Built for LLMs.** Responses are compact and predictable (`{ data, next_actions }`, typed\n  `structuredContent`), so the model spends its budget on your problem, not on parsing. Reserve\n  detail is projected down from ~17 KB of raw SDK payload to ~1 KB, and `get_markets` takes a\n  `symbols` filter so asking about one asset does not return all ~70 reserves on the chain.\n- **Errors an agent can act on.** When Aave rejects an input, the reason comes back verbatim and\n  marked non-retryable, so the model fixes its arguments instead of looping on a generic failure.\n\n## Connect your MCP client\n\nThe server speaks streamable HTTP, so any MCP client connects with just the URL. Production is\n`https://mcp.aave.com`; for local dev use `http://localhost:8787`.\n\n- **Claude Code:** `claude mcp add --transport http aave https://mcp.aave.com`\n- **Claude Desktop / claude.ai:** Settings → Connectors → Add custom connector → `https://mcp.aave.com`\n- **ChatGPT:** Settings → Connectors (developer mode) → add MCP server → `https://mcp.aave.com`\n- **Cursor:** `~/.cursor/mcp.json` → `{ \"mcpServers\": { \"aave\": { \"url\": \"https://mcp.aave.com\" } } }`\n- **VS Code (Copilot):** `code --add-mcp '{\"name\":\"aave\",\"type\":\"http\",\"url\":\"https://mcp.aave.com\"}'`\n- **Windsurf:** Settings → MCP → Add server → `https://mcp.aave.com`\n- **Codex CLI:** `~/.codex/config.toml` → `[mcp_servers.aave]` with `url = \"https://mcp.aave.com\"`\n- **Other (Cline, LM Studio, Goose, …):** add a remote streamable-HTTP MCP server at `https://mcp.aave.com`\n\n## What you can ask\n\nOnce connected, try:\n\n- \"What's the health factor of `0x…` on Aave V4, and how close is it to liquidation?\"\n- \"Which has the higher USDC supply APY right now, Aave V3 or V4 on Ethereum?\"\n- \"Show the USDC supply APY trend over the last month on V4.\"\n- \"What are `0x…`'s positions and net APY across Aave?\"\n- \"Prepare a transaction to supply 500 USDC to Aave V4 for `0x…`, and show the resulting health factor first.\"\n- \"What's my recent Aave activity?\"\n- \"Which Aave governance proposals are open for voting, and has each one met quorum?\"\n- \"Who were the biggest voters on proposal 500, and did `0x…` vote?\"\n\nThe server answers with live data and, for actions, hands back an unsigned transaction for the user\nto sign in their own wallet.\n\n## Tools\n\nReads take `version` (`v3` | `v4` | `all`). Amounts are in main units (e.g. `10.5`), never wei. Every\nrate and percentage is a percent, named with a `Pct` suffix and rounded to 4 dp, on both versions:\n`\"3.32\"` means 3.32%. Plain ratios (health factor) stay as-is.\n\n| Tool | What it does |\n|---|---|\n| `get_chains` | Chains Aave supports on a version |\n| `get_markets` | Markets / reserves (symbol, APY, caps) for a chain; `symbols` filters to the assets you want |\n| `get_reserve_details` | Deep detail for a single reserve (rates, caps, risk params) |\n| `get_apy_history` | Supply or borrow APY time-series over a window |\n| `get_protocol_history` | Protocol-wide deposits and borrows over a window (v4) |\n| `get_user_summary_history` | One wallet's net balance, supplied, borrows and health factor over a window (v4) |\n| `get_hubs` / `get_hub_assets` | Hub-level liquidity and accounting, as opposed to the per-spoke view `get_markets` gives (v4) |\n| `get_user_positions` | A wallet's supplies / borrows (+ per-position health on v4); carries the `spokeId` |\n| `get_position_items` | The individual supplies or borrows inside one v4 spoke, each with a `positionItemId` |\n| `get_user_summary` | Aggregate position and health factor |\n| `get_user_activity` | Transaction history (supply/borrow/repay/…), paginated |\n| `get_user_rewards` | Claimable rewards across every supported chain, Merit programmes included; on v3 the response also carries the claim transaction |\n| `preview_action` | Simulate supply/borrow/withdraw/repay and see the resulting health factor (v4) |\n| `prepare_action` | Build an unsigned supply/borrow/withdraw/repay transaction |\n| `prepare_set_collateral` | Build an unsigned enable/disable-collateral transaction |\n| `prepare_set_emode` | Switch a wallet's v3 eMode category (`get_markets` returns the categories) |\n| `prepare_liquidation` | Build an unsigned liquidation of a position whose health factor is under 1 |\n| `get_transaction_processed` | Whether Aave has observed a transaction yet; poll this instead of sleeping before a dependent action |\n| `prepare_claim_rewards` | Build an unsigned rewards-claim transaction |\n| `get_swappable_tokens` | The chains and tokens a swap can be quoted on |\n| `get_swap_quote` | Quote a token swap (protocol-agnostic, runs on the v4 backend); `slippagePct` caps slippage |\n| `prepare_order` | What the user signs for a quoted order: EIP-712 typed data, or the on-chain transaction for a native-token sell |\n| `submit_signed_order` | Relay a user-signed order |\n| `prepare_cancel_order` / `cancel_order` | The cancellation to sign, and the relay (or on-chain cancel transaction) |\n| `get_order_status` / `get_pending_orders` | Check one order, or list a wallet's orders across chains |\n| `get_sgho_vault` | Savings GHO vault state and a wallet's position: target rate, supply cap, `maxDeposit` / `maxWithdraw` (v3, Ethereum) |\n| `get_sgho_preview` | Convert between GHO and sGHO shares at the current vault index |\n| `prepare_sgho_action` | Build an unsigned sGHO deposit or withdrawal; a withdrawal is denominated in shares, not GHO |\n| `prepare_stkgho_migrate` | Build an unsigned migration of an entire stkGHO position into sGHO |\n| `get_aave_guide` | On-demand protocol + usage guidance for the model |\n\n### Aave DAO governance\n\nThese take no `version`: Governance V3 is the DAO's own contract generation, unrelated to the v3 /\nv4 markets. Vote tallies, quorum and per-voter power are all in AAVE, so they compare directly.\n\n| Tool | What it does |\n|---|---|\n| `search_governance_proposals` | List proposals by lifecycle state (`active`, `queued`, `executed`, …), or full-text search them |\n| `get_governance_proposal` | One proposal in full, with `quorumMet` / `differentialMet` (the two conditions it must meet to pass) |\n| `get_proposal_votes` | Who voted and with how much power, largest first, plus totals across every vote |\n| `get_user_vote` | How one wallet voted on one proposal; `voted: false` when it did not |\n| `get_proposal_payloads` | What a proposal executes, per target chain, and whether it has landed everywhere yet |\n\n### Prompts and resources\n\nClients that surface MCP prompts get one-click workflows: `check_health`, `best_stablecoin_yield`,\n`prepare_supply`, `review_position`. Each guide topic is also exposed as a resource at\n`aave://guide/<topic>`, and prompt arguments support completion.\n\n## Non-custodial and safe\n\n- Read and `prepare_*` tools are side-effect-free; `prepare_*` returns an unsigned `TransactionRequest`\n  (or an `Erc20ApprovalRequired` step, or EIP-712 typed data for orders).\n- The state-changing tools, `submit_signed_order` and `cancel_order`, relay an order or cancellation the\n  user **already signed**.\n- The server stores no private keys and cannot move funds. Signing always happens in the user's wallet.\n- Position swaps, repay-with-supply and leverage are built but not served: their adapter contracts are\n  awaiting a second security audit. The tools are absent from `tools/list` and a call for one is\n  refused, so the gate covers the action and not just the listing. Search `AUDIT-GATED` to serve them\n  again.\n\n## How it works\n\nOne [Cloudflare Worker](https://workers.cloudflare.com) served at the root (`mcp.aave.com`), speaking\nMCP over streamable HTTP (protocol `2025-06-18`, with `2025-03-26` accepted for older clients). It\nwraps two versions of the official SDK in a single bundle: `@aave/client` (V4) and `@aave/client-v3`\n(V3, via an npm alias). A `version` argument dispatches per protocol, and `version: \"all\"` fetches\nboth concurrently. Read responses are projected to the fields a model needs and carry `next_actions`\nhints so the agent knows the next step.\n\nGovernance data comes from the DAO's own indexer rather than the market SDKs, over the same API\n`app.aave.com/governance/v3` reads from. `GOVERNANCE_API_URL` overrides the endpoint for staging.\n\n`POST /` is the MCP endpoint (`/mcp` is an alias). `GET` there returns 405, as the spec requires of a\nserver that offers no SSE stream; the human-readable status page lives at `GET /health`.\n\n## Develop\n\nRequires Node 22 (for wrangler).\n\n```sh\nnvm use 22\npnpm install       # first time\npnpm dev           # wrangler dev on http://localhost:8787\npnpm typecheck     # tsc --noEmit, for src/test and for eval\npnpm test          # vitest: protocol surface + argument validation, no network\npnpm build         # wrangler dry-run: bundle + validate\n```\n\nCI runs all three on every push and pull request.\n\nThose three cover the server. What they cannot see is whether an agent can *use* it: a tool with a\nconfusing name or an ambiguous description still returns correct data, so every test above passes\nwhile the agent muddles through. That is what `eval/` measures, with DeepEval's three MCP metrics over\nrecorded agent traces, ground truth pulled straight from `@aave/client`, and an `eth_call` of every\ntransaction the server builds, so one that reverts on chain stops reading as a pass.\n\n```sh\npython3 -m venv .venv && .venv/bin/pip install -r eval/score/requirements.txt   # first time\nexport OPENROUTER_API_KEY=sk-or-...   # or ANTHROPIC_API_KEY; one key drives the agent and the judges\npnpm eval          # drive the agent, write a trace\npnpm eval:score    # judge the trace: tool choice, argument quality, task completion\npnpm eval:gate     # compare against eval/baseline.json\n```\n\nIt runs on pull requests to `main`, comments the results, and blocks on a regression against the\ncommitted baseline. See [eval/README.md](eval/README.md), which covers how to take a score drop back\nto the tool name or description that caused it.\n\nThe governance tools use typed GraphQL documents generated from the live schema. The generated\noutput is committed, so nothing above touches the network. Run `pnpm codegen` after editing\n`src/governance/operations.ts`, and commit the result; it is also how an upstream schema change\nsurfaces, either as a codegen failure on a field that no longer exists or as a diff in\n`src/governance/gql/`.\n\nPoint an MCP client at `http://localhost:8787/`, or POST JSON-RPC directly:\n\n```sh\ncurl -s -X POST http://localhost:8787/ -H 'content-type: application/json' \\\n  -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"tools/call\",\"params\":{\"name\":\"get_user_summary\",\"arguments\":{\"user\":\"0x...\",\"version\":\"v4\"}}}'\n```\n\n### What is recorded\n\nCalls are counted for product analytics: tool name, MCP method, protocol version, chain id, and the\nclient name and version from the handshake. A call that names a wallet is counted under an HMAC of\nthat wallet, so the address itself is never recorded, and any address appearing in an error message\nis redacted before delivery. No keys, signatures, transaction content or prompt text are collected,\nand the server sends no IP address. See the [privacy policy](https://aave.com/privacy-policy).\n\n## Deploy and publish\n\nDeployment (Cloudflare Workers + the `mcp.aave.com` custom domain) and registry publishing\n(`@aave/mcp` on npm and `com.aave/mcp` in the MCP Registry) are documented in\n[DEPLOY.md](DEPLOY.md). The protocol layer is the\nofficial [`@modelcontextprotocol/sdk`](https://github.com/modelcontextprotocol/typescript-sdk); usage\nanalytics go to Amplitude via\n[`@amplitude/mcp-analytics`](https://github.com/amplitude/Amplitude-MCP-Analytics-Node) when\n`AMPLITUDE_API_KEY` is set.\n\n## Roadmap\n\n- Deploy to `mcp.aave.com` and publish to the MCP registry.\n- OAuth 2.1 + rate limiting for a public launch (`ALLOWED_ORIGINS` tightens browser access today).\n- Position swaps, repay-with-supply and leverage once the second audit clears.\n- A read-only escape hatch for the long tail of queries.\n\n## License\n\nBusiness Source License, see [LICENSE](LICENSE). As a customized license, BUSL uses the `LicenseRef-` prefix per [SPDX Spec v2.3, Annex E](https://spdx.github.io/spdx-spec/v2.3/using-SPDX-short-identifiers-in-source-files/).",
  "bytes": 13291,
  "sha": "7cf76b27e5ba9bbc36fdb3b27a9f385bfe0207610bd945996f61d898bd8149c6",
  "repo_slug": "aave/mcp",
  "fonte": "npm",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_com_aave_mcp_2d8b1b32/readme"
}