loading…
Search for a command to run...
loading…
Self-custodial crypto portfolio and DeFi MCP server. Read balances and positions (Aave, Compound, Morpho, Uniswap V3, Lido, EigenLayer) across Ethereum, Arbitru
Self-custodial crypto portfolio and DeFi MCP server. Read balances and positions (Aave, Compound, Morpho, Uniswap V3, Lido, EigenLayer) across Ethereum, Arbitrum, Polygon, and Base, and prepare transactions for approval on a Ledger via WalletConnect.
npm version license node vaultpilot-mcp MCP server
Safety first. Hardware-verified DeFi for AI agents. The agent proposes, you approve on your Ledger — designed for when the AI can be compromised.

VaultPilot is a self-custodial cryptocurrency MCP server for AI coding agents. Manage portfolios and DeFi positions on Ethereum, Arbitrum, Polygon, Base, Optimism, TRON, Solana, Bitcoin, and Litecoin. Every transaction signs on your Ledger hardware wallet — the AI proposes, you approve. Works with Claude Desktop, Claude Code, Cursor, and any MCP-compatible client.
Agents: read AGENTS.md for the agent-targeted install + usage guide. One-line install:
curl -fsSL https://github.com/szhygulin/vaultpilot-mcp/releases/latest/download/install.sh | bash(Windows PowerShell:
iwr https://github.com/szhygulin/vaultpilot-mcp/releases/latest/download/install.ps1 -UseBasicParsing | iex)
VaultPilot MCP is a Model Context Protocol server that lets AI agents — Claude Code, Claude Desktop, Cursor, and any MCP-compatible client — read your on-chain positions across Ethereum, Arbitrum, Polygon, Base, TRON, and Solana and prepare transactions you sign on your Ledger device. EVM flows go through Ledger Live over WalletConnect; TRON and Solana go through a directly-connected Ledger over USB HID (Ledger Live's WalletConnect bridge does not support either namespace today). Private keys never leave the hardware wallet; every transaction is previewed in human-readable form before you approve it on the device.
Supported protocols: Aave V3, Compound V3, Morpho Blue, Uniswap V3 LP, Lido, EigenLayer on EVM, MarginFi lending on Solana, plus LiFi (EVM swap/bridge) and Jupiter v6 (Solana swap) aggregation, with 1inch as an optional EVM quote cross-check.
This is an agent-driven portfolio management tool, not a wallet replacement. The MCP never holds keys or broadcasts anything you haven't approved on your Ledger device.
simulateTransaction gate so program-level reverts fail loudly at prepare time rather than on broadcast.VaultPilot assumes the AI agent, MCP server, and host computer can all be compromised. Only your Ledger device is trusted. Every transaction is cryptographically bound across every layer so that tampering — a swapped recipient, a rewritten swap route, a smuggled approval — produces a visible mismatch on the device screen, giving you the chance to reject before anything is signed.
user-intent ──► agent ──► MCP server ──► WalletConnect / USB-HID ──► Ledger Live / host ──► Ledger device
Layered defenses catch most single-layer compromises: a server-side prepare↔send fingerprint, an independent 4byte.directory selector check, agent-side ABI decode + pre-sign hash recomputation, on-device clear-sign or blind-sign-hash match, a WalletConnect session-topic cross-check, a previewToken/userDecision gate, and — for skeptical users on high-value flows — a get_verification_artifact that routes bytes to an independent second LLM. See SECURITY.md for the full defenses table, threat mapping, honest limits, and verification recipes.
The CHECKS PERFORMED / VERIFY-BEFORE-SIGNING directives VaultPilot emits are authored by the MCP server itself — a compromised server could silently omit them. Install the companion vaultpilot-skill so the agent runs the bytes-decode + hash-recompute invariants regardless of what the MCP says:
git clone https://github.com/szhygulin/vaultpilot-skill.git \
~/.claude/skills/vaultpilot-preflight
Restart Claude Code after installing. When the skill is missing, the MCP emits a one-shot VAULTPILOT NOTICE until you install it. The skill file's expected SHA-256 is pinned in the server source and verified on every signing flow, so on-disk tamper or plugin-collision attempts produce a visible integrity check FAILED.
/setup (optional)For a chat-driven onboarding flow that detects current config, asks one question to classify the use case, and only collects API keys you actually need, install the companion vaultpilot-setup-skill:
git clone https://github.com/szhygulin/vaultpilot-setup-skill.git \
~/.claude/skills/vaultpilot-setup
Restart Claude Code, then type /setup — the agent uses get_vaultpilot_config_status (read-only, no secrets leak) to snapshot what's already configured and walks you through whatever's missing. Skip if you'd rather edit the config file directly.
EVM: Ethereum, Arbitrum, Polygon, Base. Lido reads work on both Ethereum and Arbitrum; Lido writes (prepare_lido_stake / _unstake) are Ethereum-only. EigenLayer is Ethereum-only. Morpho Blue is currently Ethereum-only (Base deployment tracked as a follow-up).
TRON: full reads + writes via USB HID (@ledgerhq/hw-app-trx). Balance coverage: TRX + canonical TRC-20 stablecoins (USDT, USDC, USDD, TUSD). Staking: Stake 2.0 freeze/unfreeze/withdraw-expire-unfreeze + voting-reward claims. No lending/LP (Aave/Compound/Morpho/Uniswap aren't deployed on TRON). Pair once per session via pair_ledger_tron.
Solana: SOL + SPL balances; MarginFi lending positions; Marinade / Jito / native stake-account reads (with SOL-equivalent valuation); Jupiter v6 swap quotes. Writes cover SOL / SPL transfers, MarginFi supply / withdraw / borrow / repay, Jupiter-routed swaps, Marinade stake + immediate-unstake, native SOL delegate / deactivate / withdraw, and LiFi-routed EVM↔Solana bridging. Signing via @ledgerhq/hw-app-solana. Sends are protected by a per-wallet durable-nonce account (~0.00144 SOL rent, reclaimable) so the ~60s blockhash validity window doesn't expire during Ledger review. One-time setup via prepare_solana_nonce_init; teardown via prepare_solana_nonce_close. Pair once per session via pair_ledger_solana. SOL native transfers clear-sign on device; SPL, MarginFi, and Jupiter flows blind-sign against a Message Hash — enable Allow blind signing in the Solana app's on-device Settings.
Ledger Live's WalletConnect bridge does not honor the tron: namespace (verified 2026-04-14) or expose Solana accounts (verified 2026-04-23), which is why both paths use USB HID. Readers short-circuit cleanly on chains where a protocol isn't deployed.
In flight
@solana-program/kit bridge foundation; supply / withdraw / borrow / repay tools follow.New protocols (EVM)
@pendle/sdk-v2 for Pendle. (plan)mint / collect / decrease_liquidity / burn / rebalance (reads already shipped), Curve LP, Balancer LP. (plan)New chains
More Solana protocols
New tools
check_liquidation_risk — per-asset "ETH drops X% triggers liquidation" math across Aave V3 / Compound V3 / Morpho Blue. Replaces today's raw-HF-number output with actionable price deltas. (plan)get_pnl_summary — wallet-level net PnL over preset periods across EVM / TRON / Solana. Balance-delta minus net user contribution, priced via DefiLlama historical. (plan)compare_yields adapter expansion — v1 covers Aave V3 + Compound V3 + Lido (PR #282). The remaining seven protocols on the original plan ship as separate adapters; full scope, ordering, and bundling rationale in plan-yields-v2-followups.md.
getLidoApr()'s DefiLlama path. The quick-win.getCompoundMarketInfo already establishes.Wallet integrations
Deployment modes
Security hardening
get_verification_artifact flow only narrows.vaultpilot-hook repo.Recently shipped (previously on this list)
compare_yields — ranked supply-side yield comparison across integrated lending / staking protocols. v1 covers Aave V3 (5 EVM chains), Compound V3 (5 EVM chains, multi-market), and Lido stETH. Surfaces data, doesn't pick — the user decides. Adapter expansion for the other 7 protocols on the roadmap above (#282).lastValidBlockHeight path that's meaningless for nonce-protected sends (#137).Read-only:
get_portfolio_summary — cross-chain USD totals; optional tronAddress / solanaAddress fold those chains into the same totals (breakdown.tron / breakdown.solana)get_lending_positions, get_compound_positions, get_morpho_positions, get_marginfi_positions — per-protocol lending positions + health factorsget_compound_market_info — wallet-less market snapshot for a single Comet (base-token metadata, supply/borrow/utilization/APR, pause flags, full collateral list with caps + LTV factors)get_market_incident_status — "is anything on fire" scan across all Compound or Aave markets on a chain; flags paused / frozen / utilization ≥ 95% conditions and surfaces a top-level incident bitget_marginfi_diagnostics — surfaces banks the bundled SDK had to skip, with root causeget_lp_positions — Uniswap V3 LP + IL estimateget_staking_positions, get_staking_rewards, estimate_staking_yield — Lido + EigenLayerget_health_alerts, simulate_position_change — liquidation-risk toolingsimulate_transaction — EVM eth_call preview; the Solana equivalent runs automatically inside preview_solana_sendget_token_balance, get_token_price, get_token_metadata — balances + DefiLlama prices (EVM, TRON, Solana); get_token_metadata fetches ERC-20 symbol/name/decimals and detects EIP-1967 proxy implementationsget_transaction_history — merged recent-tx reader across external / ERC-20 / internal (and Solana program_interaction) with 4byte-decoded methods and historical USD values (Etherscan for EVM, TronGrid for TRON, Solana RPC for Solana)get_tron_staking, list_tron_witnesses — TRON staking state + SR listget_solana_setup_status — cheap probe of a wallet's Solana setup PDAs (nonce + MarginFi account existence)get_solana_staking_positions — Marinade mSOL + Jito jitoSOL + native stake-account enumeration with activation status and SOL-equivalent valuation via on-chain exchange ratesget_vaultpilot_config_status — diagnostic snapshot of the local server config (RPC source per chain, API-key presence per service, paired-account counts, WC session-topic suffix, preflight-skill state). Strict no-secrets contract — booleans / counts / source enums / topic suffix only, never values. Use to triage "why isn't my balance read working" before suggesting vaultpilot-mcp-setup.get_ledger_device_info — probe the connected Ledger over USB HID and report which app is currently open (name + version + dashboard flag) plus an actionable hint. Uses the dashboard-level GET_APP_AND_VERSION APDU so it works whether the device is on the dashboard or inside any chain app. Returns deviceConnected: false cleanly with a hint when no device is plugged in or udev rules are missing on Linux. Call BEFORE pair_ledger_solana / pair_ledger_tron so you can replace generic "open the Solana app" guidance with a state-aware instruction.resolve_ens_name, reverse_resolve_ens — ENS forward/reverseget_swap_quote (LiFi, EVM), get_solana_swap_quote (Jupiter v6)check_contract_security, check_permission_risks, get_protocol_risk_score — risk toolingget_transaction_status — poll inclusion by hashget_tx_verification — re-emit the VERIFY-BEFORE-SIGNING block + prepared-tx JSON for a handle when the original prepare_* output has dropped out of context (15-minute TTL); never scrape tool-result files from diskget_verification_artifact — sparse JSON artifact (calldata / Solana message bytes + hashes) for second-LLM cross-verification; see SECURITY.mdExecution (Ledger-signed):
pair_ledger_live (EVM/WalletConnect), pair_ledger_tron (USB HID), pair_ledger_solana (USB HID), get_ledger_status — session + account discoveryprepare_aave_*, prepare_compound_*, prepare_morpho_* — EVM lending actionsprepare_lido_stake / _unstake, prepare_eigenlayer_deposit — stakingprepare_swap (LiFi), prepare_native_send, prepare_token_send — EVM sends + swapprepare_uniswap_swap — direct Uniswap V3 swap, same-chain only; auto-picks best fee tier across 100/500/3000/10000 bps. Use only when the user explicitly asks for Uniswap; otherwise prefer prepare_swap (LiFi) which compares venuesprepare_tron_* — native TRX + TRC-20 transfers, WithdrawBalance claim, Stake 2.0 freeze/unfreeze/withdraw-expire-unfreeze, VoteWitnessprepare_solana_nonce_init / _close — one-time setup/teardown of the durable-nonce PDAprepare_solana_native_send, prepare_solana_spl_send, prepare_solana_swap — SOL, SPL (auto-includes createAssociatedTokenAccount when needed), Jupiter swapprepare_marginfi_init + prepare_marginfi_supply / _withdraw / _borrow / _repay — MarginFi lendingprepare_marinade_stake / prepare_marinade_unstake_immediate — Marinade liquid staking: SOL → mSOL deposit, and SOL-pool immediate-unstake (fee applies; unstake-ticket delayed path deferred)prepare_native_stake_delegate / _deactivate / _withdraw — native SOL staking: create+delegate a stake account to a validator vote pubkey, deactivate (one-epoch cooldown), drain post-cooldown (full or partial)preview_solana_send — pins the current nonce/blockhash, serializes the message, computes the Message Hash the user matches on-device, runs the pre-sign simulation gate, emits the CHECKS PERFORMED block. Required between every prepare_solana_* and send_transaction.send_transaction — forwards to Ledger: EVM via WalletConnect, TRON/Solana via USB HIDMeta:
request_capability — files a GitHub issue for missing protocols/chains/tools. Default returns a pre-filled URL (no auto-submit); rate-limited 3/hour.ETHEREUM_RPC_URL, SOLANA_RPC_URL, …) or vaultpilot-mcp-setup.vaultpilot-mcp-setup prints the exact one-liner if they're missing. node-hid compiles natively so Debian/Ubuntu needs sudo apt install libudev-dev build-essential. For SPL/MarginFi/Jupiter flows, enable Allow blind signing in the Solana app's on-device Settings. SOL native transfers clear-sign and do not need this.Three paths — full step-by-step instructions, MCP-client wiring, Gatekeeper / SmartScreen handling, and update / uninstall flows for all three are in INSTALL.md.
| Path | TL;DR |
|---|---|
| Bundled binary (no Node.js needed) | Download the matching pair for your OS from the latest release page, chmod +x, run setup. |
| From npm | npm install -g vaultpilot-mcp && vaultpilot-mcp-setup |
| From source | git clone https://github.com/szhygulin/vaultpilot-mcp.git && cd vaultpilot-mcp && npm install --legacy-peer-deps && npm run build && npm run setup |
Run the interactive setup to pick RPC providers, validate keys, optionally pair Ledger Live, and write ~/.vaultpilot-mcp/config.json:
npm run setup
Environment variables always override the config file.
vaultpilot-mcp-setup detects which agent clients you have installed and offers to add a vaultpilot-mcp entry to each one's MCP-server config automatically. Each existing config is backed up to <file>.vaultpilot.bak before any change. Detected client paths:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json~/.config/Claude/claude_desktop_config.json~/.claude.json~/.cursor/mcp.jsonPer-project (<project>/.claude/settings.json) and per-workspace (<workspace>/.cursor/mcp.json) configs are deliberately skipped — the wizard runs from an arbitrary CWD and patching the wrong project is worse than skipping.
If you'd rather edit configs by hand, the entry is:
{
"mcpServers": {
"vaultpilot-mcp": {
"command": "vaultpilot-mcp"
}
}
}
From source: replace with "command": "node" and "args": ["/absolute/path/to/vaultpilot-mcp/dist/index.js"].
All optional if the matching field is in ~/.vaultpilot-mcp/config.json; env vars take precedence.
ETHEREUM_RPC_URL, ARBITRUM_RPC_URL, POLYGON_RPC_URL, BASE_RPC_URL, SOLANA_RPC_URL — custom RPC endpointsRPC_PROVIDER (infura | alchemy) + RPC_API_KEY — alternative to custom URLsETHERSCAN_API_KEY — contract verification lookupsONEINCH_API_KEY — enables 1inch quote comparisonTRON_API_KEY — TronGrid (sent as TRON-PRO-API-KEY)WALLETCONNECT_PROJECT_ID — required for Ledger Live signingRPC_BATCH=1 — opt into JSON-RPC batching (off by default; many public endpoints mishandle batched POSTs)VAULTPILOT_ALLOW_INSECURE_RPC=1 — opt out of https/private-IP RPC checks (local anvil/hardhat only)VAULTPILOT_FEEDBACK_ENDPOINT — optional https proxy for request_capability direct POSTs. The client does not sign or authenticate requests — the proxy MUST enforce its own auth.VAULTPILOT_SKILL_MARKER_PATH — suppresses the preflight-skill notice for read-only users who accept the tradeoffnpm run dev # tsc --watch
npm test # vitest run
npm run test:watch
Pull requests are welcome. Before your first contribution, the CLA Assistant bot will ask you to sign the Contributor License Agreement by replying to your PR with a sign-off comment — one signature covers all your future PRs. The CLA grants the project the right to relicense your contribution under future license terms (since the project ships under BUSL-1.1 today and auto-converts to Apache 2.0 in 2030, the relicensing right matters); without it, future license changes get stuck.
The repo owner and Dependabot are exempt from the CLA check.
Business Source License 1.1 (BUSL-1.1) — see LICENSE.
vaultpilot-mcp on your own machine to manage your own portfolio — including earning yield, swapping, lending, or staking through DeFi protocols on your own behalf — is expressly permitted, even if it generates monetary returns to you.Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"recon-crypto-mcp": {
"command": "npx",
"args": []
}
}
}Payments, customers, subscriptions
110+ tools for AI agents spanning social media, finance, gaming, music, AU-specific services, and utilities. Zero-config local tools plus platform connectors. n
Unified API hub for AI agents with 56+ tools across travel (Amadeus, Sabre), prediction markets (Polymarket), crypto, and weather. Pay-per-call via x402 micropa
Deploy live HTTPS websites in seconds. Instant subdomains ($1 USDC) or custom .xyz domains ($10 USDC) on Base chain. Templates for crypto tokens and AI agent pr