morpho-cli
Experimental (pre-v1.0) — Command syntax, response schemas, and available operations may change. Always verify critical outputs independently.
Query Morpho protocol data and build unsigned transactions. All commands output JSON to stdout. No private keys needed.
npx @morpho-org/cli@latest <command> [options]
Supported chains: ethereum, base, arbitrum, optimism, polygon, unichain, worldchain, katana, hyperevm, monad, stable. Every command requires --chain.
Response Schemas
- Read commands — exact JSON shapes for query-vaults, get-vault, query-markets, get-market, get-positions, get-token-balance, health-check, get-supported-chains
- Write commands — exact JSON shapes for prepare-* and simulate-transactions
Quick Reference
# Read — query protocol state
npx @morpho-org/cli@latest query-vaults --chain base [--asset-symbol USDC] [--asset-address 0x...] [--sort apy_desc|apy_asc|tvl_desc|tvl_asc] [--limit 5] [--skip 0] [--fields address,name,symbol,apyPct,tvl,tvlUsd,feePct]
npx @morpho-org/cli@latest get-vault --chain base --address 0x...
npx @morpho-org/cli@latest query-markets --chain base [--loan-asset 0x...] [--collateral-asset 0x...] [--sort-by supplyApy|borrowApy|netSupplyApy|netBorrowApy|supplyAssetsUsd|borrowAssetsUsd|totalLiquidityUsd] [--sort-direction asc|desc] [--limit 10] [--skip 0] [--fields supplyApy,borrowApy,totalSupply,totalBorrow,totalCollateral,totalLiquidity,supplyAssetsUsd,borrowAssetsUsd,collateralAssetsUsd,liquidityAssetsUsd]
npx @morpho-org/cli@latest get-market --chain base --id 0x...
npx @morpho-org/cli@latest get-positions --chain base --user-address 0x...
npx @morpho-org/cli@latest get-token-balance --chain base --user-address 0x... --token-address 0x...
# Write — prepare unsigned transactions (simulation runs by default; add --no-simulate to skip)
npx @morpho-org/cli@latest prepare-deposit --chain base --vault-address 0x... --user-address 0x... --amount 1000
npx @morpho-org/cli@latest prepare-withdraw --chain base --vault-address 0x... --user-address 0x... --amount max
npx @morpho-org/cli@latest prepare-supply --chain base --market-id 0x... --user-address 0x... --amount 5000
npx @morpho-org/cli@latest prepare-borrow --chain base --market-id 0x... --user-address 0x... --borrow-amount 1
npx @morpho-org/cli@latest prepare-repay --chain base --market-id 0x... --user-address 0x... --amount max
npx @morpho-org/cli@latest prepare-supply-collateral --chain base --market-id 0x... --user-address 0x... --amount 5000
npx @morpho-org/cli@latest prepare-withdraw-collateral --chain base --market-id 0x... --user-address 0x... --amount max
# Simulate — standalone re-simulation or arbitrary transaction simulation
npx @morpho-org/cli@latest simulate-transactions --chain base --from 0x... --transactions '<JSON>' --analysis-context '<JSON>'
# Utility
npx @morpho-org/cli@latest health-check
npx @morpho-org/cli@latest get-supported-chains
Write Workflow: Prepare → Present
Every write operation follows two steps. Simulation runs automatically inside prepare-*.
- Prepare — run a
prepare-* command. The CLI handles token decimals, allowances, approvals, and simulation automatically. Returns a flat PreparedOperation with the fields you need at the root: operation, summary, requirements (informational — approval txs are already in transactions), transactions (the unsigned payloads to sign), simulated, simulationOk, totalGasUsed, outcome, warnings. Pass --no-simulate to skip simulation (in which case simulationOk, totalGasUsed, and most of outcome will be absent).
- Present — show
summary, the transactions list, the key outcome fields (see table below), and any warnings in tabular format. If simulationOk is false, inspect revertReason before presenting.
The outcome block is discriminated by operation type:
| Operation |
outcome shape |
Key fields to surface |
deposit, withdraw (vaults) |
outcome.vault |
sharesReceived, assetsReceived, positionAssets, positionShares |
supply, borrow, repay, supply_collateral, withdraw_collateral (markets) |
outcome.market |
healthFactor, isHealthy, maxBorrowable, utilizationBeforePct → utilizationAfterPct, borrowApyBeforePct → borrowApyAfterPct, plus post-operation supplied / borrowed / collateral (raw integer strings — divide by 10^decimals) |
Use simulate-transactions separately only for re-simulating with different parameters or simulating arbitrary transactions. Its top-level success field is allSucceeded (not simulationOk) — see references/write.md.
Simulation Failures
| Revert |
Cause |
What to do |
ERC20: insufficient allowance |
Missing approval |
Re-prepare — CLI should include approvals automatically |
ERC4626ExceededMaxWithdraw |
Vault liquidity insufficient |
Reduce amount (see below) |
insufficient balance |
User lacks tokens |
Tell the user |
| Custom error hex |
Protocol-specific |
Query state with get-market or get-vault to diagnose |
Partial Withdrawal
When prepare-withdraw --amount max cannot withdraw the full balance, the CLI returns a PreparedOperation whose warnings[] calls out the liquidity shortfall. The response is still valid — it represents the largest withdrawable amount right now.
- Surface the warning to the user verbatim — do not silently accept a smaller withdrawal.
- Offer two paths:
- Accept the partial amount the CLI prepared (inspect
outcome.vault.assetsReceived for the concrete figure, optionally re-run prepare-withdraw with --amount <value> using ~99% of that figure as a safety buffer against interest accrual between prepare and execute).
- Wait for more liquidity — locked assets unlock as underlying-market borrowers repay or the curator reallocates.
- Never invent an amount by parsing the
summary string — it is a human sentence, not a machine-readable field.
Safety Rules
- Check simulation before presenting — simulation runs by default; check
simulationOk (for prepare-*) or allSucceeded (for simulate-transactions) before presenting
- Never sign or broadcast — unsigned payloads only
- Watch health factor for borrows — warn if below 1.1
- Communicate liquidity constraints clearly for partial withdrawals
CLI Errors
When a npx @morpho-org/cli@latest command fails, stop and report the error to the user. Do not:
- Retry with different parameters you invented
- Fall back to alternative tools or APIs
- Attempt to work around missing required options
- Pipe output through
jq or other filters — use the CLI's built-in flags (--fields, --sort-by, --limit, etc.) to shape the response
Common Mistakes
- Forgetting
--chain — every command requires it, there is no default
- Using chain IDs (
1, 8453) instead of names (ethereum, base)
- Dividing
TokenAmount.value by 10^decimals — TokenAmount values are already decimal-applied (a USDC value of "1000" means $1,000, not 1,000 micro-USDC). *Pct fields are already percent-scaled; *Usd fields are already in dollars. The only raw integer strings are inside outcome.market.{supplied,borrowed,collateral} and outcome.vault.{sharesReceived,assetsReceived,positionShares} — those do need /10^decimals for display.
- Assuming 18 decimals — USDC/USDT have 6, WBTC/cbBTC have 8. Read decimals from response metadata; never assume.
- Passing raw units as
--amount — CLI expects human-readable (1000 not 1000000000)
- Using
--no-simulate without reason — simulation is on by default; only skip when debugging or for speed
- Ignoring
simulationOk === false on prepare-* (or allSucceeded === false on simulate-transactions) — diagnose before presenting
1---2name: morpho-cli3description: Drive the Morpho lending protocol from the terminal via `npx @morpho-org/cli@latest` — queries vaults/markets/positions and prepares unsigned Morpho transactions with built-in simulation across all supported chains (Ethereum, Base, Arbitrum, Optimism, Polygon, Unichain, World Chain, Katana, HyperEVM, Monad, Stable). Invoke whenever the user asks to explore Morpho vault APYs / TVL / allocations ("best USDC vault on Base"), compare Morpho Blue markets ("ETH/USDC markets on Arbitrum"), inspect positions or health factor ("what are my Morpho positions"), or prepare any Morpho operation — deposit, withdraw, supply, borrow, repay, supply/withdraw collateral — even when the user doesn't explicitly name the CLI. If the user is writing application code that integrates Morpho, prefer the morpho-builder skill instead.4---56# morpho-cli78> **Experimental (pre-v1.0)** — Command syntax, response schemas, and available operations may change. Always verify critical outputs independently.910Query Morpho protocol data and build unsigned transactions. All commands output JSON to stdout. No private keys needed.1112```bash13npx @morpho-org/cli@latest <command> [options]14```1516Supported chains: `ethereum`, `base`, `arbitrum`, `optimism`, `polygon`, `unichain`, `worldchain`, `katana`, `hyperevm`, `monad`, `stable`. Every command requires `--chain`.1718## Response Schemas1920- **[Read commands](references/read.md)** — exact JSON shapes for query-vaults, get-vault, query-markets, get-market, get-positions, get-token-balance, health-check, get-supported-chains21- **[Write commands](references/write.md)** — exact JSON shapes for prepare-\* and simulate-transactions2223## Quick Reference2425```bash26# Read — query protocol state27npx @morpho-org/cli@latest query-vaults --chain base [--asset-symbol USDC] [--asset-address 0x...] [--sort apy_desc|apy_asc|tvl_desc|tvl_asc] [--limit 5] [--skip 0] [--fields address,name,symbol,apyPct,tvl,tvlUsd,feePct]28npx @morpho-org/cli@latest get-vault --chain base --address 0x...29npx @morpho-org/cli@latest query-markets --chain base [--loan-asset 0x...] [--collateral-asset 0x...] [--sort-by supplyApy|borrowApy|netSupplyApy|netBorrowApy|supplyAssetsUsd|borrowAssetsUsd|totalLiquidityUsd] [--sort-direction asc|desc] [--limit 10] [--skip 0] [--fields supplyApy,borrowApy,totalSupply,totalBorrow,totalCollateral,totalLiquidity,supplyAssetsUsd,borrowAssetsUsd,collateralAssetsUsd,liquidityAssetsUsd]30npx @morpho-org/cli@latest get-market --chain base --id 0x...31npx @morpho-org/cli@latest get-positions --chain base --user-address 0x...32npx @morpho-org/cli@latest get-token-balance --chain base --user-address 0x... --token-address 0x...3334# Write — prepare unsigned transactions (simulation runs by default; add --no-simulate to skip)35npx @morpho-org/cli@latest prepare-deposit --chain base --vault-address 0x... --user-address 0x... --amount 100036npx @morpho-org/cli@latest prepare-withdraw --chain base --vault-address 0x... --user-address 0x... --amount max37npx @morpho-org/cli@latest prepare-supply --chain base --market-id 0x... --user-address 0x... --amount 500038npx @morpho-org/cli@latest prepare-borrow --chain base --market-id 0x... --user-address 0x... --borrow-amount 139npx @morpho-org/cli@latest prepare-repay --chain base --market-id 0x... --user-address 0x... --amount max40npx @morpho-org/cli@latest prepare-supply-collateral --chain base --market-id 0x... --user-address 0x... --amount 500041npx @morpho-org/cli@latest prepare-withdraw-collateral --chain base --market-id 0x... --user-address 0x... --amount max4243# Simulate — standalone re-simulation or arbitrary transaction simulation44npx @morpho-org/cli@latest simulate-transactions --chain base --from 0x... --transactions '<JSON>' --analysis-context '<JSON>'4546# Utility47npx @morpho-org/cli@latest health-check48npx @morpho-org/cli@latest get-supported-chains49```5051## Write Workflow: Prepare → Present5253Every write operation follows two steps. Simulation runs automatically inside `prepare-*`.54551. **Prepare** — run a `prepare-*` command. The CLI handles token decimals, allowances, approvals, and simulation automatically. Returns a flat `PreparedOperation` with the fields you need at the root: `operation`, `summary`, `requirements` (informational — approval txs are already in `transactions`), `transactions` (the unsigned payloads to sign), `simulated`, `simulationOk`, `totalGasUsed`, `outcome`, `warnings`. Pass `--no-simulate` to skip simulation (in which case `simulationOk`, `totalGasUsed`, and most of `outcome` will be absent).562. **Present** — show `summary`, the `transactions` list, the key `outcome` fields (see table below), and any `warnings` in tabular format. If `simulationOk` is `false`, inspect `revertReason` before presenting.5758The `outcome` block is discriminated by operation type:5960| Operation | `outcome` shape | Key fields to surface |61|-----------|-----------------|------------------------|62| `deposit`, `withdraw` (vaults) | `outcome.vault` | `sharesReceived`, `assetsReceived`, `positionAssets`, `positionShares` |63| `supply`, `borrow`, `repay`, `supply_collateral`, `withdraw_collateral` (markets) | `outcome.market` | `healthFactor`, `isHealthy`, `maxBorrowable`, `utilizationBeforePct` → `utilizationAfterPct`, `borrowApyBeforePct` → `borrowApyAfterPct`, plus post-operation `supplied` / `borrowed` / `collateral` (raw integer strings — divide by 10^decimals) |6465Use `simulate-transactions` separately only for re-simulating with different parameters or simulating arbitrary transactions. Its top-level success field is `allSucceeded` (not `simulationOk`) — see [references/write.md](references/write.md).666768## Simulation Failures6970| Revert | Cause | What to do |71|--------|-------|------------|72| `ERC20: insufficient allowance` | Missing approval | Re-prepare — CLI should include approvals automatically |73| `ERC4626ExceededMaxWithdraw` | Vault liquidity insufficient | Reduce amount (see below) |74| `insufficient balance` | User lacks tokens | Tell the user |75| Custom error hex | Protocol-specific | Query state with `get-market` or `get-vault` to diagnose |7677## Partial Withdrawal7879When `prepare-withdraw --amount max` cannot withdraw the full balance, the CLI returns a `PreparedOperation` whose `warnings[]` calls out the liquidity shortfall. The response is still valid — it represents the largest withdrawable amount right now.80811. **Surface the warning** to the user verbatim — do not silently accept a smaller withdrawal.822. **Offer two paths**:83 - Accept the partial amount the CLI prepared (inspect `outcome.vault.assetsReceived` for the concrete figure, optionally re-run `prepare-withdraw` with `--amount <value>` using ~99% of that figure as a safety buffer against interest accrual between prepare and execute).84 - Wait for more liquidity — locked assets unlock as underlying-market borrowers repay or the curator reallocates.853. **Never invent an amount** by parsing the `summary` string — it is a human sentence, not a machine-readable field.8687## Safety Rules88891. **Check simulation before presenting** — simulation runs by default; check `simulationOk` (for `prepare-*`) or `allSucceeded` (for `simulate-transactions`) before presenting902. **Never sign or broadcast** — unsigned payloads only913. **Watch health factor** for borrows — warn if below 1.1924. **Communicate liquidity constraints** clearly for partial withdrawals9394## CLI Errors9596When a `npx @morpho-org/cli@latest` command fails, **stop and report the error to the user**. Do not:97- Retry with different parameters you invented98- Fall back to alternative tools or APIs99- Attempt to work around missing required options100- Pipe output through `jq` or other filters — use the CLI's built-in flags (`--fields`, `--sort-by`, `--limit`, etc.) to shape the response101102103## Common Mistakes104105- Forgetting `--chain` — every command requires it, there is no default106- Using chain IDs (`1`, `8453`) instead of names (`ethereum`, `base`)107- Dividing `TokenAmount.value` by `10^decimals` — `TokenAmount` values are already decimal-applied (a USDC value of `"1000"` means $1,000, not 1,000 micro-USDC). `*Pct` fields are already percent-scaled; `*Usd` fields are already in dollars. The only raw integer strings are inside `outcome.market.{supplied,borrowed,collateral}` and `outcome.vault.{sharesReceived,assetsReceived,positionShares}` — those do need `/10^decimals` for display.108- Assuming 18 decimals — USDC/USDT have 6, WBTC/cbBTC have 8. Read decimals from response metadata; never assume.109- Passing raw units as `--amount` — CLI expects human-readable (`1000` not `1000000000`)110- Using `--no-simulate` without reason — simulation is on by default; only skip when debugging or for speed111- Ignoring `simulationOk === false` on `prepare-*` (or `allSucceeded === false` on `simulate-transactions`) — diagnose before presenting