Skip to main content

Moonwell Plugin

[!IMPORTANT] Complete the short Base MCP onboarding flow defined in SKILL.md before calling any Moonwell endpoint. The user’s wallet address — required for prepare and position queries — is fetched lazily when needed.

Overview

Moonwell is a Compound v2 lending protocol on Base and Optimism. The plugin reads positions/rates and prepares unsigned calldata over the Moonwell HTTP API, then executes via send_calls. No additional MCP server required — everything goes through an HTTP call + send_calls. Supported chains: Base (8453), Optimism (10).

Surface Routing

Moonwell is HTTP-only; every capability follows the standard HTTP routing in ../references/custom-plugins.md.
CapabilityPath
Read markets/rates/positions/healthHarness HTTP tool if available, else web_request GET against api.moonwell.fi.
Prepare a lend/borrow actionHarness HTTP tool or web_request (GET or POST) → calldata → send_calls.

Endpoints

Read endpoints (use web_request GET)

Market reads are edge-cached 30 s. User-scoped reads (positions, health, rewards, token-balance) are never cached. /positions returns an array — one entry per market. Use ?active=true to filter out markets where both suppliedUsd and borrowedUsd are zero.

Prepare endpoints (use web_request → send_calls)

Verbs: supply, withdraw, borrow, repay. GET form (query params):
POST form (JSON body — pass as the body object parameter to web_request):
Both return identical response shapes. Use GET when simpler; use POST when the body is complex.

Key parameters

FieldNotes
chainbase (default), optimism, or chain ID
assetSymbol: USDC, WETH, ETH (alias for WETH)
amountDecimalHuman-readable string, e.g. "100". Use this or amount (base units), never both.
fromUser’s wallet address (from get_wallets)

Orchestration

Steps in transactions[] are ordered — approve and enter-market come before the protocol action. Execute them as a single send_calls batch.

Submission

Target tool: send_calls. A prepare/<verb> response returns ordered transaction steps:
Pass all items as the calls array to send_calls, mapping chainId from any transaction item to the Base MCP chain string (base for Base mainnet, optimism for Optimism). Then walk the approval flow (see ../references/approval-mode.md) and poll get_request_status.

Example Prompts

Supply 100 USDC on Base

Borrow USDC against collateral

Check positions and health

Risks & Warnings

  • Liquidation risk. Borrowing against collateral can be liquidated if the position’s health factor falls too low. Always read /health/<address> before and after a borrow or withdraw, and surface the value to the user.

Health factor guide

ValueStatus
> 1.5Healthy
1.1 – 1.5Caution
< 1.1Liquidation risk
nullNo borrows

Notes

  • mTokens — ERC-20 receipt tokens (mUSDC, mWETH…); exchange rate accrues over time
  • WETH special-case — borrow/withdraw deliver native ETH; supply/repay require ERC-20 WETH. Both asset=ETH and asset=WETH resolve to the same mWETH market
  • Compound v2 error codesmint, borrow, repay return non-zero codes for business-logic failures without reverting. Check the onchain receipt after broadcast
  • Base has two mUSDC entries — the current market and a deprecated bridged-USDC market. Disambiguate by marketAddress or deprecated: true

Chain IDs from Moonwell

ChainMoonwell chainIdBase MCP chain
Base mainnet8453base
Optimism10optimism