Model Context Protocol server for Lido staking - AI-native ETH staking on Ethereum and Base
Lido MCP has clear, domain-specific tool names (lido_stake, lido_unstake, etc.) and reasonable descriptions (avg ~120 chars). All 8 tools have input schemas with type definitions. However, parameter descriptions are minimal (often single phrases like 'Amount of ETH to stake'), lacking actionable constraints (min/max, format, examples). Output schemas are not documented, LLMs cannot predict return structure. Error handling is absent from tool definitions. No dry-run confirmation pattern despite WRITE operations on financial assets. Rate limiting exists in code but is not exposed to the LLM. Missing tool annotations (destructiveHint, idempotentHint) for financial operations.
Fetch the current stETH APY (Annual Percentage Yield) from Lido's live API. Cached for 5 minutes.
Check stETH and wstETH balances on Ethereum mainnet and Base L2. Returns balances in ETH equivalent and raw token amounts.
Calculate estimated staking rewards based on current stETH balance and Lido APY. Shows daily, monthly, and annual reward projections.
Stake ETH via Lido on Ethereum mainnet. Returns stETH (Lido staked ETH) in exchange. Supports dry-run mode to preview rewards without executing.
Initiate unstaking of stETH via Lido's withdrawal queue on Ethereum mainnet. Returns a withdrawal request ID that can be claimed after finalization.
Unwrap wstETH back into stETH on Base L2. Reverses the wrapping operation.
Parameter descriptions lack actionable constraints. 'Amount of ETH to stake (0.001 - 10 ETH per transaction)' is good, but most params are bare phrases ('Amount of stETH to unstake', 'Ethereum address to check balances for'). LLMs cannot infer valid ranges, formats, or error conditions.
No output schemas documented. Tool descriptions state what they return (e.g., 'Returns stETH in exchange', 'Returns balances in ETH equivalent'), but LLMs cannot predict field names, types, or structure. Downstream tool chaining is blind.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 66 | 2026-07-28+ | v2 |
Check the status of pending withdrawal requests from Lido's withdrawal queue on Ethereum mainnet.
Wrap stETH into wstETH (wrapped staked ETH) on Base L2. wstETH is a rebasing-free version of stETH that accumulates rewards.
WRITE operations (stake, unstake, wrap, unwrap) lack dry-run confirmation pattern and destructiveHint annotations. Financial transactions are irreversible, agents should confirm before executing. Dry-run mode exists in code but is not surfaced as a tool annotation.
No error handling guidance in tool definitions. If a transaction fails, times out, or hits rate limits, the LLM has no recovery path. Error responses should categorize as retryable, user-fixable, or fatal.
Private key loading from environment is correct, but no audit trail or permission gates documented. Tool definitions do not declare required scopes (e.g., 'requires: write:ethereum'). Agents cannot verify they have authority before calling.