Skip to main content
Glama

Lido MCP Server

The reference MCP server for Lido — stETH staking, position management, governance, and earn vault monitoring, all natively callable by any AI agent.

Point Claude, Cursor, or any MCP-compatible agent at this server and stake ETH from a conversation. No custom integration code needed.

Why This Exists

AI agents need to interact with DeFi protocols, but bridging natural language to on-chain transactions is hard — private keys, gas estimation, protocol quirks (stETH rebasing), transaction safety. This MCP server gives agents a structured, safe interface to Lido:

  • Every write operation supports dry-run simulation — agents preview gas costs and verify transactions before executing

  • A mental model document (lido.skill.md) teaches agents Lido concepts before they act — rebasing mechanics, wstETH vs stETH tradeoffs, safe staking patterns

  • Live vault monitoring with intelligent alerts — watch Lido Earn vaults for yield changes, TVL shifts, share price anomalies, and protocol allocation shifts (Aave, Morpho, Pendle, Gearbox, Maple), with alerts in plain language via Telegram or email

  • Flexible rule engine — define alert conditions as readable expressions like apr < 3.0 or spread_vs_steth < -0.5, with automatic stETH benchmark comparison

  • AI-powered explanations — optionally uses Claude to translate raw vault events into plain-language messages explaining what changed, why, and whether you need to act

  • Security guardrailsread-only, dry-run-only, and full modes, receiver allowlists, per-transaction ETH caps

MCP Server

70+ tools across staking, governance, vault monitoring, and L2 — every write operation defaults to dry_run: true.

Category

Tools

Query

lido_get_balances, lido_get_staking_apr, lido_get_rewards, lido_get_protocol_status, lido_convert_amounts, lido_get_withdrawal_requests, lido_get_claimable_eth, lido_get_chain_info

Intelligence

lido_analyze_position, lido_estimate_withdrawal_time, lido_check_steth_rate, lido_check_gas_conditions, lido_get_swap_quote

Stake / Wrap / Withdraw

lido_stake_eth, lido_wrap_steth_to_wsteth, lido_wrap_eth_to_wsteth, lido_unwrap_wsteth_to_steth, lido_request_withdrawal, lido_claim_withdrawal, lido_swap_eth_for_ldo

Governance

Dual governance state + lock/unlock stETH in veto escrow, Aragon DAO vote/analyze/decode, Snapshot proposals + voting, Easy Track motions + objections, voting power + veto thresholds + timeline

Earn Vault Monitor

lido_list_earn_vaults, lido_watch_vault, lido_unwatch_vault, lido_add_rule, lido_remove_rule, lido_check_vault, lido_list_watches, lido_get_vault_alerts, lido_test_notifications

stVaults V3

List, inspect, fund, withdraw, pause/resume beacon deposits, mint/burn shares, rebalance, create vault, request validator exit

Protocol Info

TVL, fee structure, staking modules, node operators, contract addresses

Token Management

Token info, allowances, approve, transfer, revoke for stETH/wstETH/LDO

Withdrawal NFTs

Owner lookup, transfer, approve

L2 wstETH

Balance, transfer, info on Base/Optimism/Arbitrum + cross-chain balances across 11 L2s

L2 stETH

Rebasing stETH balance + transfer on Optimism

6 guided prompts — multi-step workflows for staking (stake-eth-safely), position analysis (manage-position), withdrawals (withdraw-steth), governance review (review-governance), vault management (manage-vault), and governance participation (participate-governance).

4 live resourceslido://position/{address}, lido://protocol/status, lido://governance/state, lido://governance/votes.

Agent mental model (lido.skill.md) — see "Why This Exists" above.

Key Design Decisions

  • Real SDK, no mocks — all operations go through @lidofinance/lido-ethereum-sdk and viem to actual Ethereum contracts

  • Dry-run by default — every state-changing tool defaults to dry_run: true. Agents must explicitly set dry_run: false to execute

  • Protocol-aware errors — raw blockchain errors (insufficient funds, reverts, nonce conflicts, stake limits, paused) are translated to human-readable messages

  • MCP annotations — every tool declares readOnlyHint, destructiveHint, idempotentHint, and openWorldHint so agents know which tools are safe to call without confirmation

  • L2 aware — set LIDO_CHAIN_ID to Base, Optimism, or Arbitrum and the server exposes only wstETH-specific tools; L1-only tools are excluded automatically

Earn Vault Monitor

Watches Lido Earn vaults (EarnETH, EarnUSD) and tells depositors when something worth knowing has changed — in plain language, not raw data.

How It Works

  1. Watch a vault — call lido_watch_vault with a vault address (use lido_list_earn_vaults to discover them)

  2. Define alert rules — write conditions as readable expressions evaluated against live vault data

  3. Receive alerts — get notified via Telegram or email when rules fire, with AI-generated explanations

The monitor runs continuously:

  • Subscribes to on-chain Deposit/Withdraw events on each vault and TokenRebased on stETH for near-real-time reaction

  • Runs a 30-second polling health check as a fallback

  • Compares vault APR against the stETH SMA APR from the Lido API on every check

  • Detects protocol allocation shifts across underlying protocols (Aave, Morpho, Pendle, Gearbox, Maple) by reading on-chain subvault balances for known Lido Earn vaults

  • Persists all state (watches, snapshots, alerts, dedup) in SQLite — survives restarts

  • 6-hour dedup window per rule per vault prevents alert fatigue

Alert Delivery

  • Telegram — formatted alerts with severity indicators, vault context, benchmark comparison, and actionable guidance

  • Email — HTML-formatted alerts with the same context

  • AI explanations (optional) — when ANTHROPIC_API_KEY is set, each alert is passed to Claude which generates a plain-language explanation covering:

    1. What changed — the specific metric that triggered the alert

    2. Why it likely happened — plausible explanations based on the data

    3. What to consider — whether the depositor should act, wait, or investigate

Rule Engine

Rules aren't a fixed set of predefined alerts — they're open-ended expressions you define in natural language through the agent. Tell Claude "alert me if yield drops below 3%" and it writes the rule apr < 3.0. Say "notify me if the vault starts underperforming stETH by more than half a percent while TVL is also dropping" and it composes spread_vs_steth < -0.5 and tvl_change_pct < 0. The agent translates your intent into a mathjs expression evaluated against live vault metrics:

Variable

What it is

apr / apy

Current vault APR (%)

apr_prev / apy_prev

APR from previous snapshot

apr_delta / apy_delta

APR change between snapshots (percentage points)

tvl

Total value locked

tvl_prev

TVL from previous snapshot

tvl_change_pct

TVL change as a percentage

share_price

Current share price (asset/share)

share_price_prev

Share price from previous snapshot

share_price_change_pct

Share price change as a percentage

steth_apr

stETH SMA APR benchmark (from Lido API)

spread_vs_steth

Vault APR minus stETH APR (positive = outperforming)

max_alloc_shift

Largest protocol allocation change between snapshots (pp)

num_protocols

Number of protocols with active allocations

top_alloc_pct

Largest single protocol allocation (%)

Example rules:

Expression

Fires when

apr < 3.0

Yield drops below 3% — a simple yield floor

spread_vs_steth < 0

Vault underperforms raw stETH staking

spread_vs_steth < -0.5

Vault underperforms stETH by more than 0.5pp

tvl_change_pct < -10

TVL drops >10% between checks — capital flight

share_price_change_pct < -0.1

Share price drop — possible exploit or depeg

apr < 3.0 and tvl_change_pct < -5

Yield dropped AND capital leaving

abs(apr_delta) > 2.0

Large APR swing in either direction

apr < steth_apr - 1.0

Falls more than 1pp behind stETH benchmark

apr > apr_prev * 1.5

APR spiked to 1.5x its previous value

max_alloc_shift > 10

Protocol allocation shifted by more than 10pp

top_alloc_pct > 80

Single protocol holds >80% of vault capital

Supports and/or/not boolean logic, comparison operators (<, >, <=, >=, ==, !=), arithmetic (+, -, *, /), and safe math functions (abs, min, max, round, floor, ceil, sqrt).

Each rule includes a message template with {{variable}} interpolation:

APR dropped to {{apr}}%, below your 3% floor. stETH is at {{steth_apr}}%.

If no message is provided, one is auto-generated from the expression pattern.

The rule engine is sandboxed — expressions are parsed into an AST and validated against an allowlist of variables, functions, and node types. No arbitrary code execution.

Protocol Allocation Detection

For known Lido Earn vaults (strETH/EarnETH), the monitor reads on-chain balances across each vault subvault to determine how capital is distributed across underlying protocols — Aave, Morpho, Pendle, Gearbox, Maple, and others. Each health check compares the current allocation to the previous snapshot and detects shifts.

Allocation data appears in:

  • Health reports (lido_check_vault) — shows per-protocol percentage breakdown

  • Alert context — when any rule fires, the alert includes allocation shift details (protocol name, from/to percentages, delta)

  • AI explanations — the LLM receives allocation shift data and can explain rebalancing events in plain language

  • Rule variablesmax_alloc_shift, num_protocols, and top_alloc_pct let you write rules like max_alloc_shift > 10 (alert when any protocol's share shifts by more than 10pp)

MCP-Callable Vault Health

Other agents can query vault health programmatically — the monitor isn't just a notification service, it's a building block:

  • lido_check_vault — on-demand health check for any ERC-4626 vault (no watch required). Returns APR, TVL, share price, and stETH benchmark spread

  • lido_list_earn_vaults — discover available Mellow earn vaults from the live API

  • lido_get_vault_alerts — query alert history programmatically

Target Use Cases

1. Developer stakes ETH via Claude — zero integration code

User: "Stake 1 ETH with Lido"

Claude: Let me walk you through this safely.
  → Checks protocol status (not paused, limits ok)
  → Checks your balance (1.5 ETH available)
  → Shows current APR (3.4%, 7-day SMA 3.3%)
  → Dry-runs the transaction (gas: 0.002 ETH)
  → "Ready to stake 1 ETH. Gas cost ~0.002 ETH. Confirm?"

User: "Yes"

Claude: → Executes stake
  → "Done. TX: 0xabc... You received 1.0 stETH."

2. Depositor gets a Telegram message explaining why EarnETH yield dropped overnight

User: "Watch the EarnETH vault. Alert me if yield drops below 4%
       or it falls behind raw stETH staking."

Claude: → Discovers vault via lido_list_earn_vaults
  → Calls lido_watch_vault with rules:
    - apr < 4.0 [warning]
    - spread_vs_steth < 0 [critical]
  → "Watching EarnETH (0x...). APR: 5.2%, TVL: 12,450 ETH.
     You'll get a Telegram alert if APR drops below 4%
     or the vault underperforms stETH."

[Overnight, APR drops to 3.6%]

Telegram: 🚨 EarnETH — Warning

  APR dropped to *3.60%*, down from 5.20%.

  The vault's yield fell 1.6pp since the last check. This likely
  reflects a rotation in the underlying strategy or temporary
  market conditions. The vault is still outperforming direct stETH
  staking (3.40%) by 0.20pp, so no immediate action is needed —
  but worth monitoring if the trend continues.

  • Current APR: 3.60%
  • Previous APR: 5.20%
  • stETH benchmark: 3.40%
  • Spread vs stETH: 0.20pp above

  View on Etherscan

3. Agent queries vault health before deciding to deposit

Agent: → Calls lido_check_vault(address="0x...")

Response:
  === Vault Health: EarnETH ===
  TVL: 12,450.00 ETH
  Share Price: 1.034521 ETH/share
  APR: 5.20%

  --- Benchmark ---
  stETH APR (SMA): 3.40%
  Spread: 1.80pp above stETH benchmark

  --- Protocol Allocations ---
  Aave: 32.1%
  Morpho: 28.4%
  Pendle: 18.7%
  Gearbox: 12.3%
  Maple: 8.5%

  Last checked: 2025-03-23T14:30:00.000Z

Agent: → Diversified allocation, positive spread — decides to deposit

4. Natural-language rule configuration

User: "I want to know if the vault starts doing worse than just
       holding stETH, especially if people are also pulling money out.
       And give me a heads up if the share price ever drops suddenly —
       that could mean something bad happened."

Claude: I'll set up three rules for you.
  → Calls lido_add_rule: "spread_vs_steth < 0 and tvl_change_pct < -5" [warning]
    Message: "Vault underperforming stETH (spread {{spread_vs_steth}}pp)
              while TVL dropped {{tvl_change_pct}}%"
  → Calls lido_add_rule: "share_price_change_pct < -0.1" [critical]
    Message: "Share price dropped {{share_price_change_pct}}% — investigate immediately"
  → Calls lido_add_rule: "spread_vs_steth < -1.0" [critical]
    Message: "Vault is {{spread_vs_steth}}pp behind stETH — significant underperformance"

  "Done. Three rules active:
   1. Warning if the vault trails stETH while TVL is declining
   2. Critical alert on any sudden share price drop (>0.1%)
   3. Critical if the vault falls more than 1pp behind stETH

   Dry-ran all three against current data — none would fire right now
   (APR 5.2% vs stETH 3.4%, TVL stable). You'll get alerts the
   moment any condition is met."

5. DAO contributor queries and votes on governance proposals

User: "Show me the latest Lido DAO votes"

Claude: → Calls lido_get_aragon_vote
  → "Vote #185: Open — Yea 15.2M LDO (92%), Nay 1.3M LDO (8%)
     Vote #184: Executed — passed with 98% support ..."

User: "Vote yes on #185"

Claude: → Calls lido_vote_on_proposal (dry_run=true)
  → "Dry run: Vote Yea on #185. You have 5,000 LDO. Gas: ~0.001 ETH. Confirm?"

User: "Yes"

Claude: → Executes vote
  → "Done. Voted Yea on #185. TX: 0xabc..."

6. Staker signals opposition via Dual Governance

User: "I want to signal opposition to the latest proposal."

Claude: → Calls lido_get_governance_state
  → "Governance is in Normal state. Veto signalling is at 0.12%,
     well below the first seal threshold of 1%."
  → Dry-runs lock of 10 stETH in escrow
  → "Ready to lock 10 stETH for governance. Gas: ~0.003 ETH. Confirm?"

User: "Yes"

Claude: → Approves stETH for escrow + locks
  → "Done. 10 stETH locked in veto signalling escrow. TX: 0xdef..."

Setup

git clone <repo-url>
cd lido-mcp-server
cp .env.example .env  # edit with your RPC URL, private key, chain ID
npm install && npm run build && npm start

See .env.example for all configuration options (chain ID, security mode, Telegram, SMTP, Anthropic).

Connect to Claude / Cursor

{
  "mcpServers": {
    "lido": {
      "command": "bash",
      "args": ["/path/to/lido-mcp-server/start.sh"],
      "env": {
        "LIDO_RPC_URL": "https://eth-mainnet.g.alchemy.com/v2/YOUR_KEY",
        "LIDO_PRIVATE_KEY": "0xYOUR_PRIVATE_KEY",
        "LIDO_CHAIN_ID": "1"
      }
    }
  }
}

License

MIT

-
security - not tested
F
license - not found
-
quality - not tested

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/the-wunmi/lido-mcp-server'

If you have feedback or need assistance with the MCP directory API, please join our Discord server