
Monad Mcp
io.github.pareen由 GitHub 帳號 pareen 發布v0.2.1更新於 Oct 24, 2026
Monad blockchain gateway for AI agents: balances, transfers, swaps, DeFi, with Privy signing.
概覽
面向 Monad 區塊鏈的 MCP 伺服器,讓助理查詢餘額、代幣與合約,並透過 Privy 內嵌錢包簽章完成轉帳、兌換與 DeFi 交易。
- 可以做什麼
- 讀取鏈上資料:原生與 ERC-20 餘額、含美元價格的資產組合、交易歷史、交易收據、代幣價格與風險檢查
- 解析名稱與代幣:.nad 名稱與地址互轉、符號轉代幣地址、內建標準代幣清單
- 檢查合約:用內嵌 ABI 呼叫任意 view 函式、解碼回傳資料、試跑交易
- 轉移資金:原生與 ERC-20 轉帳、任意合約寫入、x402 服務付款、跨鏈報價與執行
- 管理審批:查詢待處理請求狀態、發放含消費上限與允許清單的工作階段金鑰、撤銷授權
- 使用協定外掛:Uniswap 兌換、Kintsu 與 FastLane 流動性質押、Morpho 借貸、Kuru 訂單簿
- 適用情境
- 適合讓助理查詢 Monad 餘額、代幣風險或合約狀態,或在人工審批環節下準備並送出 Monad 交易,而不必交出私鑰。也適合需要透過工作階段金鑰預先授權消費的自動化代理流程。
- 執行需求
- 以 npm 套件形式透過 stdio 在本機執行,或連線託管的 HTTP 端點。寫入類工具需要 Privy 應用程式:PRIVY_APP_ID 與 PRIVY_APP_SECRET,並需一次性引導產生 P-256 金鑰並註冊 Privy key quorum(PRIVY_AUTHORIZATION_PRIVATE_KEY、PRIVY_KEY_QUORUM_ID)。MONAD_DEFAULT_NETWORK 選擇主網或測試網。審批流程需要 HTTP 伺服器執行且 PUBLIC_BASE_URL 可連線。需能存取 Monad RPC、DexScreener 與 Privy。
安裝
在 SourceWeft 中
- 開啟 儀表板中的 Monad Mcp,將其新增到工作區。
- 為需要使用其工具的對話啟用該服務。
Desktop only,透過 STDIO。 STDIO 服務會啟動本機處理程序,因此需要 SourceWeft 桌面主機。
其他 MCP 客戶端
參照 儲存庫 中的啟動說明。
README
monad-mcp
MCP server for the Monad blockchain. Your agent's gateway to balances, transfers, swaps, and DeFi on Monad — with signing handled by a Privy embedded wallet, never by the agent.
Built around a simple shape — stored requests + approval URLs + skill plugins — on Monad mainnet 143 / testnet 10143, with Privy as the wallet provider.
🌐 Landing page + live read-only demo: pareen.github.io/monad-mcp — query real Monad balances in your browser, exactly what the agent sees.
🔌 Connect it — no install, no terminal. In Claude Desktop or ChatGPT, add a custom connector and paste this URL:
That's the whole setup — read tools (balances, prices, portfolios, token checks) work immediately. Step-by-step for each app: docs/connect-claude.md.
Prefer the terminal? One line in Claude Code:
The hosted endpoint runs in split mode: read tools are public (paste the URL,
no login — safe to share) and write tools are gated behind a Privy sign-in,
returning auth_required until you authenticate. The hosted sign-in path is wired
but still being verified end-to-end, so the tested route for transactions is your
own Privy-signed instance — see docs/connect-claude.md, docs/FAQ.md for common security/setup questions, and docs/DEPLOY.md.
🧭 Monad ≠ Ethereum: the server ships agent-facing guidance on Monad's quirks (128 KB contracts, gas_limit billing, speculative latest, eth_getLogs caps, FastLane/MEV) as monad://guide/* MCP resources — see docs/building-on-monad.md.
What's in the box
Core tools (work on any address; auth required only where noted):
Skill plugins (additive, drop in your own under src/plugins/):
- Uniswap (
uniswap_quote,uniswap_swap,approve_erc20) — exact-input single-hop swaps on Uniswap v3 (testnet + mainnet). - Kintsu (
kintsu_stake,kintsu_request_unstake,kintsu_claim_unstake,kintsu_position) — liquid staking MON → sMON via Kintsu's ERC-7535 vault. Two-step unstake with batch processing. - FastLane (
fastlane_stake,fastlane_unstake,fastlane_position) — liquid staking MON → shMON via FastLane's shMONAD ERC-4626 vault. Payable native deposit, synchronous redeem (no epoch wait); shMON keeps earning staking + MEV rewards. - Morpho (
morpho_supply,morpho_withdraw,morpho_borrow,morpho_repay,morpho_position,morpho_market) — lending on Morpho Blue's singleton. Caller passes MarketParams inline; plugin derives the market id. - Kuru (
kuru_best_bid_ask,kuru_market_params,kuru_place_limit,kuru_cancel_orders,kuru_market_swap) — fully-on-chain CLOB. Ships with known mainnet markets (MON/USDC, MON/AUSD, WETH/USDC); accepts raw addresses for new ones.
All write tools across plugins auto-route through a covering session-key grant (see "Session keys" below); otherwise they return an approval URL.
Mainnet-only plugins (Kintsu / FastLane / Morpho / Kuru) are skipped at boot when MONAD_DEFAULT_NETWORK=testnet. Override per-tool with network: "mainnet".
Quickstart
1. Install + configure
Edit .env. Minimum config to do anything useful with write tools:
For the Uniswap plugin, supply contract addresses (verify against the canonical Uniswap deployment for Monad before using):
2. Privy app setup
In the Privy dashboard:
- Create an app. Enable embedded wallets under "Wallets".
- Under "Networks", add Monad mainnet (chainId
143) and/or testnet (chainId10143) as an EVM chain. - Copy the App ID + App Secret into
.env. - Copy the JWT verification key (PEM-encoded ES256 public key) into
PRIVY_VERIFICATION_KEYfor fastest token verification. If omitted, the server falls back to JWKS over the network. - (Optional) Configure wallet policies (spend limits, allowlists) to gate what the agent can do.
2a. Bootstrap server-side wallet authorization (one-time)
Privy embedded wallets are user-owned by default — the server cannot sign for them. The MCP server needs a P-256 key quorum registered with Privy, attached as an additional_signer on every wallet it provisions. Bootstrap it:
After bootstrap, every create_user call attaches the quorum at wallet creation, and every transfer/swap includes the private key in authorization_context. Important: wallets minted before you set these env vars are stranded — Privy doesn't let you retrofit an additional_signer (updating authorization requires existing authorization). Always bootstrap first.
3. Run
4. Wire it into Claude Desktop
Add to ~/Library/Application Support/Claude/claude_desktop_config.json. The --env-file flag loads PRIVY_*, MONAD_*, and PUBLIC_BASE_URL from your .env into the spawned process:
You'll also need the HTTP server running (npm run start:http) for the approval flow — the stdio MCP returns approval URLs that point at the HTTP server. See docs/claude-desktop.md for the full dogfood walkthrough (bootstrap, funding, first transfer).
Public reads, no self-hosting: to use the read tools (balances, portfolio, history) without building anything, point Claude Desktop at the hosted endpoint via the
mcp-remoteshim —"args": ["-y", "mcp-remote", "https://monad-mcp.fly.dev/mcp"]. Writes (transfers/swaps) are gated behind a Privy sign-in; the verified path for them is a self-hosted signer.
5. Try a prompt
For the second prompt the agent calls transfer, hands you a link like http://localhost:8787/approve/<uuid>, and you approve in your browser. The agent polls poll_request and reports the tx hash.
Architecture
Write tools follow the stored request pattern:
- Tool builds an unsigned
{ to, value, data }payload and a human-readable summary. - Server stores it under a UUID and returns
https://your-server/approve/<uuid>to the agent. - User opens the URL — page shows the summary + asset diff + signs via their Privy embedded wallet.
- Server records the tx hash; agent polls
poll_requestand continues.
The agent never touches a private key. Privy's TEE-backed key custody + wallet policies are the security envelope.
Adding your own skill plugin
Plugins live in src/plugins/<id>/ and export a SkillPlugin:
Register it in src/plugins/index.ts. Write tools just need to construct a { to, value, data } payload and call server.store.create(...) — the approval flow is shared.
Testing
56 unit tests cover the chain config, both stores (requests + grants), tool registry (auth gating, schema validation), every core tool, every session-key surface, and the Uniswap plugin's quote sweep.
The integration suite runs transfer end-to-end on Monad testnet through the Privy server SDK: build → sign → broadcast → poll receipt. Gated on PRIVY_APP_ID, PRIVY_APP_SECRET, PRIVY_AUTHORIZATION_PRIVATE_KEY, PRIVY_KEY_QUORUM_ID, and MONAD_MCP_E2E_USER_ID being set + the wallet being funded; cleanly skips otherwise so it doesn't break CI without secrets.
Security model
- Keys: Privy holds the key in a TEE. The MCP server never sees a private key.
- Authorization to act: every write tool builds a stored request; nothing happens until the user clicks Approve on the approval page.
- Token scope: the OAuth 2.1 bearer in the MCP transport identifies which user; it does not authorize which tx — that's gated by the explicit approval click + Privy wallet policies.
- Stale link defense: stored requests expire after
ttl_seconds(default 5 min); expired requests can't be approved. - CSRF on /reject: rejection is intentionally permissionless — worst case, a stale link can't be re-used. Approval requires a Bearer token tied to the requesting user.
For production, the stored-request and grant stores already support a Postgres backend (set STORE_BACKEND=postgres); still on the hardening list are rate limiting on /approve and /submit, and per-tool spend caps via Privy policies.
Session keys: skipping per-tx approvals
By default every write tool returns an approval URL the user has to click. That's fine for one-shot prompts, fatal for anything agentic ("DCA $100 into MON every Friday", "rebalance my LP weekly"). The fix is grant_session_key:
Grants are scoped by:
spend_cap_mon— total native MON the agent can spend (running total tracked across calls)ttl_seconds— grant expiry window (max 30 days)allowed_targets— optional recipient/contract allowlist (empty = any)allowed_selectors— optional 4-byte function selector allowlist (e.g.0xa9059cbb= ERC-20 transfer only)
Coverage is checked against every write call; if the grant doesn't cover (wrong target, wrong selector, would exceed cap), the tool falls back to the approval-URL flow. Revoke any time with revoke_session_key.
Limits: v1 tracks native-MON spend cap only. ERC-20 token amounts aren't deducted from the cap — instead, restrict ERC-20 access by listing the token contract in allowed_targets. Per-token spend caps are a v2 add.
End-to-end testing on Monad testnet
The e2e script reuses MONAD_MCP_E2E_USER_ID from env so you don't burn a new Privy seat on each run.
What's next
- Browser-first signing path (Privy web SDK in the approval page → no server-side
sendTransactionround-trip). - More plugins — Neverland lending (Aave V3 fork on Monad), additional DEXes/perps.
- Block-explorer integration once Monad's explorer API stabilizes (
get_transaction_historywill return full decoded history). - x402 payment support (pay for x402-enabled services).
- Per-token (ERC-20) spend caps on session grants — today's cap is a single native-MON budget per grant.
- Universal contract reader/writer for "talk to any Monad contract" without writing a per-protocol plugin.
License
MIT — see LICENSE.
來源:README.md,提交 b2bd497
工具
0版本歷史
1- v0.2.1最新Sep 16, 2026
評分
已滿足適用檢查項的 50%
該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。
- 近 30 天內可連通25 分
請保持端點能夠回應 MCP 握手;SourceWeft 每 30 天探測一次。
- 已宣告認證方式10 分
請在註冊中心條目中宣告憑證請求標頭,或保持端點能夠回應探測,以便判定其認證方式。
- 已列出工具15 分
請讓伺服器在無憑證時回應 tools/list,或發布可在沙箱中無憑證啟動的軟體包。
- 描述必需15 分
- 圖示10 分
- 文件15 分
- 授權條款10 分