mcp-server
Use Arcadia Finance MCP to query protocol/account data and build unsigned transactions for managing Arcadia accounts, liquidity, lending, borrowing, swaps, automations, and upgrades across Base, Optimism, Unichain, and Robinhood.
Inspect accounts: health factor, collateral, debt, LP positions, liquidation price, automation status, history, PnL, owned accounts, and Aero upgrade eligibility.
Query market data: supported assets and prices, lending pools with APY/TVL/utilization/history, LP strategies and APYs, rebalancing recommendations, points leaderboard, and reference guides.
Check wallet state: ETH/ERC20 balances, token allowances, Arcadia points, and required approvals.
Build account transactions: create, deposit, withdraw, borrow, repay, swap, deleverage, close positions, and stake/unstake/claim LP rewards.
Build LP transactions: add liquidity with optional leverage, remove liquidity, and manage concentrated-liquidity positions.
Build lending-pool transactions: deposit into or redeem from ERC-4626 tranches.
Configure automations: compound fees, claim rewards, add idle balances to LP, claim Merkl rewards, and rebalance/take-profit/POL strategies using full-state or delta changes.
Build upgrade transactions: Aero account upgrades and VELO-to-AERO migration.
Write tools return unsigned transactions as to, data, value, and chainId; the server does not sign or broadcast them.
Allows managing concentrated liquidity positions, borrowing assets, and performing yield optimization on the Optimism network through the Arcadia Finance protocol.
This server has a remotely hosted endpoint. Open its connector listing for connection details, authentication requirements, and setup instructions:
Arcadia Finance MCP Server
MCP server for Arcadia Finance, a platform for concentrated liquidity on Uniswap and Aero with automated rebalancing, compounding, yield optimization, and leverage, or single-sided liquidity into lending pools. Read protocol data and build unsigned transactions for LP management, borrowing and deposits. Live on Base, Optimism, Unichain and Robinhood.
Quick start
The hosted server needs no install and no API key:
https://mcp.arcadia.finance/mcp
The Claude button opens Customize > Connectors > Add custom connector with the name and URL filled in. Claude Free allows one custom connector. On Team and Enterprise, an owner adds it under Organization settings > Connectors.
Most clients accept this config. Cursor reads it from .cursor/mcp.json or ~/.cursor/mcp.json. VS Code uses .vscode/mcp.json with "servers" in place of "mcpServers" and "type": "http" on the server.
{
"mcpServers": {
"arcadia-finance": {
"url": "https://mcp.arcadia.finance/mcp"
}
}
}Install the plugin, which adds the server and the clamm-liquidity skill:
/plugin install arcadia --marketplace arcadia-finance/mcp-serverOn Claude Code older than 2.1.275, run /plugin marketplace add arcadia-finance/mcp-server, then /plugin install arcadia@arcadia-finance. To add only the server:
claude mcp add --transport http arcadia-finance https://mcp.arcadia.finance/mcpAdd https://mcp.arcadia.finance/mcp as a custom MCP app. Availability depends on your plan and workspace settings, see OpenAI's guide.
codex mcp add arcadia-finance --url https://mcp.arcadia.finance/mcpgemini mcp add --transport http arcadia-finance https://mcp.arcadia.finance/mcpRun it locally
To run the server as a local process instead (Node.js 22 or newer):
{
"mcpServers": {
"arcadia-finance": {
"command": "npx",
"args": ["-y", "@arcadia-finance/mcp-server"]
}
}
}In Claude Code: claude mcp add arcadia-finance -- npx -y @arcadia-finance/mcp-server. Optional environment variables are listed under Configuration.
Try it
"Which Arcadia strategies on Base have the highest APY right now?"
"Show the health factor and positions of Arcadia account 0x..."
"Open the top WETH/USDC strategy with 1,000 USDC and turn on compounding."
"What do the Arcadia lending pools pay lenders?"
Write tools return unsigned transactions. Your wallet signs them, see Transaction Signing.
Related MCP server: MAIN MCP
Tools
Read Tools
Tool | Description |
| Account overview: health factor, collateral, debt, positions, liquidation price, automation status. |
| Historical account value over time. |
| PnL and yield data for an account. |
| List all Arcadia accounts owned by a wallet address. |
| What a wallet's accounts (or one account) have to upgrade to Aero: status and counts, no calldata. |
| On-chain ERC20 balances and native ETH for a wallet address. |
| Check ERC20 token allowances for a spender. Use before |
| Points balance for a specific wallet address. |
| Supported collateral assets with addresses, types, decimals. |
| USD prices for one or more asset addresses. |
| All lending pools: TVL, APY, utilization, liquidity. |
| Single pool detail with APY history over time. |
| Paginated Arcadia points leaderboard. |
| LP strategies with APY, underlyings, pool info. Supports featured filter and pagination. |
| Full detail for a specific LP strategy: APY per range width, pool config. |
| Rebalancing recommendation for an account. |
| Reference guides: automation setup, strategy selection, strategy templates. |
| Automation intents and their params; add |
| Automations enabled on an account: decoded config, mapped intents, Merkl state, superseded managers. |
Write Tools
Tool | Description |
| Approve an ERC20 token for spending. Required before depositing into an account. Call |
| Upgrade wallet VELO on Optimism to the new AERO on Base (approve, then the payable deposit). |
| Lend the pool's underlying asset into an ERC-4626 tranche to earn interest. Mints tranche shares to the receiver. |
| Redeem tranche shares back into the underlying asset (lender exit). |
| Create a new Arcadia account via Factory. |
| Deposit ERC20 tokens into an account. |
| Withdraw assets from an account. |
| Borrow from a lending pool. |
| Repay debt to a lending pool from wallet. |
| Flash-action: deposit + swap + mint LP + optional leverage, atomically. |
| Remove/decrease LP position liquidity. |
| Swap assets within an account (backend-routed). |
| Repay debt by selling collateral (swap + repay in one tx). |
| Atomic close: burn LP + swap + repay debt in one tx. |
| Stake, unstake, or claim rewards for LP positions. |
| Upgrade an account to Aero: its Slipstream positions move to Aero CL and its old AERO becomes the new AERO, in one flashAction. |
| Configure automations from an intents array (full desired state). Returns the unsigned setAssetManagers tx. |
| Enable/disable individual automations, leaving the rest untouched. |
Transaction Signing
All write tools return unsigned transactions as { to, data, value, chainId }. This server does not sign or broadcast them; your agent or application does.
Options
Wallet MCP servers (recommended for production):
Wallet MCP | Provider | Model |
Community | Non-custodial, routes to browser wallet (MetaMask, Rabby) | |
Coinbase | Wallet-agnostic, supports multiple providers | |
Phantom | Embedded wallet | |
Privy | Wallet infrastructure | |
Community | Multi-sig via Safe |
Or use your existing wallet setup (Fireblocks, Dfns, Turnkey, Biconomy, Dynamic) and pass the unsigned tx object to your provider's signing method.
viem/ethers in your agent:
import { createWalletClient, http } from "viem";
import { privateKeyToAccount } from "viem/accounts";
import { base } from "viem/chains";
const account = privateKeyToAccount("0x...");
const client = createWalletClient({ account, chain: base, transport: http() });
// tx = result from any write_* tool
const hash = await client.sendTransaction(tx);Configuration
All environment variables are optional. Set them in a .env file in the server directory (gitignored, never commit it) or in your MCP client env block, which takes precedence.
Variable | Required | Default | Transport | Description |
| No | Public RPC | Both | RPC URL for Base (8453). |
| No | Public RPC | Both | RPC URL for Unichain (130). |
| No | Public RPC | Both | RPC URL for Optimism (10). |
| No | Public RPC | Both | RPC URL for Robinhood (4663). |
| No |
| n/a | Transport mode: |
| No |
| HTTP | Listen port for HTTP transport. |
| No |
| HTTP | Comma-separated allowed Origin headers (CORS / DNS rebinding). |
| No |
| HTTP | Max requests per minute per client IP. |
| No | none | HTTP | PostHog project key. Unset = no analytics are sent. |
| No |
| HTTP | PostHog ingestion host. |
Skills
The skills/ directory contains skills that teach AI agents how to use this MCP server. The Claude Code plugin (see Quick start) installs them together with the server. To install a skill on its own, symlink it into your skills directory:
ln -s /path/to/mcp-server/skills/clamm-liquidity ~/.claude/skills/clamm-liquiditySkill | Description |
| Concentrated liquidity management: concepts, intent-based automation, and step-by-step workflows. |
The OpenClaw skill in openclaw/ calls the hosted server through a curl script, for agents without MCP support.
Reporting Issues
Open an issue for bugs, missing features or unclear documentation: https://github.com/arcadia-finance/mcp-server/issues
For AI agents: If you hit a gap during task execution, open an issue with:
Tool name and parameters you used
What you expected vs what happened
The strategy or goal you were trying to execute
Pull requests for documentation fixes are welcome. Every PR needs a human review before merging.
Where to Find Us
MCP Registry: registry.modelcontextprotocol.io
MCP Servers: mcpservers.org
LobeHub: lobehub.com
PulseMCP: pulsemcp.com
MCP Market: mcpmarket.com
Glama: glama.ai
mcp.so: mcp.so
awesome-mcp-servers: github.com/punkpeye/awesome-mcp-servers
mcptry: mcptry.com
mcprush: mcprush.com
ClawHub (OpenClaw skill): clawhub.ai
Development
yarn install
yarn build # Compile TypeScript
yarn dev # Run with tsx (hot reload)
yarn test # Run tests
yarn lint # Lint with ESLint
yarn format # Check formatting with PrettierTo point a client at your build, use "command": "node" with "args": ["/absolute/path/to/mcp-server/dist/index.js"].
Privacy
When POSTHOG_KEY is set on an HTTP deployment, the server records one analytics event per tool call in PostHog (EU ingestion host by default): the tool name, its arguments (which can include public wallet and account addresses), whether the call failed, the duration, and the client name and version. Events carry no person profile. Running the server locally over stdio sends no analytics, and neither does an HTTP deployment without POSTHOG_KEY. The server never handles private keys. Questions: legal@arcadia.finance.
License
Copyright (C) 2026 Pragma Labs. Licensed under the GNU Affero General Public License v3.0.
Available Tools
37 toolsread_account_aero_upgradeARead-onlyIdempotentInspect
Which Arcadia accounts have something to upgrade to Aero (MetadexCL V1): Slipstream V1 to V3 positions (Aerodrome on Base, Velodrome on Optimism, staked or not) and old AERO. Pass wallet_address for every account of a wallet, or account_address for one. Per account: status (ready | choices_required | waiting | not_open | nothing_to_upgrade), positions (every Slipstream position on it), movable (ready or needing a pool choice), waiting, blocked, old_aero (raw, 18 decimals). Accounts without a Slipstream position or old AERO are left out, including accounts whose positions already moved but whose automations still run on the old Slipstream managers: when read_asset_manager_current shows Slipstream managers on an account that only holds metadexcl_v1 positions, call write_account_aero_upgrade for it to get managers_to_reconnect. failed_accounts lists the accounts whose check failed, with the error: an empty accounts list means nothing to do only when failed_accounts is empty too. Otherwise tell the user those accounts could not be checked and retry later. opens_at is when the AERO token upgrade opens on Base. No calldata, prices or simulation: this is the cheap check. For the plan and the transaction call write_account_aero_upgrade. Chains: Base (8453), Optimism (10); Robinhood (4663) has no Slipstream positions and answers an empty list.
Inputs: chain_id, wallet_address, account_address. Returns: accounts, chain_id, opens_at, checked_at, +2 more
read_account_historyARead-onlyIdempotentInspect
Get an Arcadia account's historical net value over time. Returns a time series of snapshots, oldest first, each { timestamp, net_value } — timestamp is unix seconds and net_value is USD (human-readable, not raw units). Useful for charting account performance over a period. An empty history means the account has no snapshots in the window, not that the read failed.
Inputs: account_address (required), days, chain_id. Returns: history
read_account_infoARead-onlyIdempotentInspect
Get full overview of an Arcadia account: health factor, collateral value, debt, deposited assets, liquidation price, and automation status. Health factor = 1 - (used_margin / liquidation_value): 1 = no debt (safest), >0 = healthy, 0 = liquidation threshold, <0 = past liquidation. Higher is safer. The automation object reports which asset managers are enabled (rebalancer, compounder, yield_claimer, cow_swapper, merkl_operator, gas_relayer), each as the position's dex_protocol when protocol-specific or true when account-level, plus inferred_intents (the automations those managers add up to), merkl claim state, and deprecated_managers for any superseded deployment still set on the account. Superseded managers should be cleared: write_account_automations disables them as part of a save. For the full decoded per-manager config use read_asset_manager_current. LP positions in assets[] include a dex_protocol field (slipstream, slipstream_v2, slipstream_v3, metadexcl_v1, staked_slipstream, staked_slipstream_v2, staked_slipstream_v3, staked_metadexcl_v1, uniV3, uniV4). metadexcl_v1 is Aero CL, live on Base, Optimism and Robinhood for spot and margin accounts. Slipstream V2 is Base-only. V3 is available on Base and Optimism. Unichain supports Slipstream V1, uniV3 and uniV4. To configure automations, prefer passing the position's id as position_id to write_account_automations, which resolves the protocol and tokens for you; the dex_protocol value is also accepted directly as its protocol param. Numeric fields without a _usd suffix are in the account's numeraire token raw units (divide by 10^decimals: 6 for USDC, 18 for WETH, 8 for cbBTC). Fields ending in _usd are in USD with 18 decimals (divide by 1e18). health_factor is unitless. Asset amounts are raw token units. To list all accounts for a wallet, use read_wallet_accounts.
Inputs: account_address (required), chain_id. Returns: overview, automation, context_notes, account_version, +1 more
read_account_pnlARead-onlyIdempotentInspect
Get PnL (cost basis) and yield earned for an Arcadia account. Returns lifetime totals: cost basis vs current value (negative cost_basis = net profit withdrawn), net transfers per token, total yield earned in USD and per token. cost_basis, current_value, cost_diff are in USD (human-readable). Per-token fields (net_transfers, summed_yields_earned) are in raw token units.
Inputs: account_address (required), chain_id. Returns: yield_earned, pnl_cost_basis
read_asset_listARead-onlyIdempotentInspect
List supported collateral assets on Arcadia. Returns compact list (address, symbol, decimals, type). Use search to filter by symbol substring. For USD prices, use read_asset_prices.
Inputs: search, chain_id. Returns: total, assets
read_asset_manager_currentARead-onlyIdempotentInspect
Read which asset managers are currently enabled on an account, with their decoded on-chain configuration. Returns the active managers (address, protocol, initiator, decoded strategy metadata, slippage and value-loss caps, fee recipient), the intents they map to, and Merkl claim state including whether reward tokens still need registering. Managers from superseded deployments are listed separately under deprecated: pass their addresses to write_account_automations_delta to clear them, or run write_account_automations which disables them as part of the save. read_ok is false when chain state could not be read, in which case the result is unreliable rather than empty.
Inputs: account_address (required), chain_id. Returns: merkl, account, enabled, read_ok, +4 more
read_asset_manager_intentsARead-onlyIdempotentInspect
List the automation intents Arcadia supports, with the parameters each one accepts. Pass account_address to also get per-account availability: which intents can be enabled right now and, for any that cannot, the compatibility rule blocking it. Pass position_id as well to scope availability to one LP position. Without account_address this returns the catalog only.
Inputs: chain_id, position_id, account_address. Returns: usage, automations, shared_params, availability_error
read_asset_pricesARead-onlyIdempotentInspect
Get USD prices for one or more asset addresses on one chain. Pass a single address or comma-separated addresses. Returns a price map keyed by address. Unknown or unpriced addresses return 0, not an error. Prices are scoped to chain_id (default 8453, Base), so pass the chain the addresses live on. Read-only. To find asset addresses, use read_asset_list.
Inputs: asset_addresses (required), chain_id. Returns: prices
read_guidesARead-onlyIdempotentInspect
Get Arcadia workflow guides and reference documentation. Call this before multi-step workflows (opening LP positions, enabling automation, closing positions) or when you need contract addresses, asset manager addresses, or strategy parameters. Topics: overview (addresses + tool catalog), automation (intent-based automation setup), strategies (step-by-step templates), selection (how to evaluate and parameterize strategies).
Inputs: topic. Returns: topic, content
read_point_leaderboardARead-onlyIdempotentInspect
Get the Arcadia points leaderboard (paginated). For a specific wallet's points balance, use read_wallet_points.
Inputs: limit, offset. Returns: limit, total, offset, leaderboard
read_pool_infoARead-onlyIdempotentInspect
Get detailed info for a single lending pool including APY history over time. Useful for analyzing rate trends and comparing pools. Use read_pool_list to discover pool addresses.
Inputs: pool_address (required), days, chain_id. Returns: pool, apy_history
read_pool_listARead-onlyIdempotentInspect
List all Arcadia lending pools: TVL, utilization, available liquidity. Key fields: interest_rate = current borrow cost, lending_apy = lender yield. All rates are decimal fractions (1.0 = 100%, 0.06 = 6%). For APY history on a specific pool, use read_pool_info.
Inputs: chain_id. Returns: pools, context_notes
read_strategy_infoARead-onlyIdempotentInspect
Get full detail for a specific concentrated-liquidity LP strategy by ID: includes APY per range width over the last 24 hours, each range anchored on the current price (narrower range = higher APY but more rebalancing cost/risk), the 7-day average APY at the default range in the yield field, pool info, and configuration. For basic (constant-product) pools, use strategy_apy_7d from read_strategy_list. Use read_strategy_list to discover strategy IDs. All APY values are decimal fractions (1.0 = 100%, 0.05 = 5%).
Inputs: strategy_id (required), chain_id. Returns: object
read_strategy_listARead-onlyIdempotentInspect
Get Arcadia LP strategies. Use featured_only=true for curated top strategies (recommended first call); their apy is measured over the last 24 hours at the featured range width, and is 0.0 when that measurement fails. Otherwise returns a paginated list where strategy_apy_7d is the 7-day average APY at each strategy's default range. Increase limit or use offset for pagination. All APY values are decimal fractions (1.0 = 100%, 0.05 = 5%). For APY per range width over the last 24 hours, use read_strategy_info.
Inputs: limit, offset, chain_id, featured_only. Returns: limit, total, offset, strategies, +1 more
read_strategy_recommendationARead-onlyIdempotentInspect
Get a rebalancing recommendation for an Arcadia account: suggests asset changes to optimize yield. current_apy and proposed_apy are measured over the last 24 hours where possible (the account's positions at their own ranges, the proposal at its ranges), not the 7-day average of read_strategy_list, so recommended strategies may differ from the list ranking. APY values are decimal fractions (0.05 = 5%). weekly_earning_difference is in USD.
Inputs: account_address (required), chain_id. Returns: object
read_wallet_accountsARead-onlyIdempotentInspect
List all Arcadia accounts owned by a wallet address. Returns a summary of each account (address, name). Call read_account_info with a specific account_address for full details like health factor, collateral, and debt.
Inputs: wallet_address (required), chain_id. Returns: accounts
read_wallet_allowancesARead-onlyIdempotentInspect
Check ERC20 token allowances for a spender address. Use before write_wallet_approve to avoid redundant approvals: skip approving if the current allowance is already sufficient.
Inputs: owner_address (required), spender_address (required), token_addresses (required), chain_id. Returns: tokens
read_wallet_balancesARead-onlyIdempotentInspect
Get native ETH and ERC20 token balances for a wallet address. Reads directly from chain via RPC multicall. Use before write_account_add_liquidity or write_account_deposit to verify the wallet has sufficient tokens. Returns both raw balance (smallest unit/wei) and formatted (human-readable) per token.
Inputs: wallet_address (required), token_addresses (required), chain_id. Returns: native, tokens
read_wallet_pointsARead-onlyIdempotentInspect
Get the Arcadia points balance for one wallet address. Returns points and wallet_address. A wallet with no points returns points 0 and wallet_address 'unknown', not an error. Read-only, no authentication. For the ranked list of wallets, use read_point_leaderboard.
Inputs: wallet_address (required). Returns: object
write_account_add_liquidityAIdempotentInspect
Multi-step flash-action: atomically combines [deposit from wallet] + [use account collateral] + [swap to optimal ratio] + [mint LP] + [borrow if leveraged] in ONE transaction. Do NOT call write_account_deposit separately. Capital sources: wallet tokens (deposits array), existing account collateral (use_account_assets=true), or both. Check allowances first (read_wallet_allowances), then approve if needed (write_wallet_approve). Supports depositing multiple tokens and minting multiple LP positions in one tx. Works with both margin accounts (can leverage) and spot accounts (no leverage). For workflows, call read_guides('strategies'). The returned calldata is time-sensitive: sign and broadcast within 30 seconds. If the transaction reverts due to price movement, rebuild and sign again immediately (retry at least once before giving up), passing only the accept_price_checks the user already confirmed. Response includes tenderly_sim_url and tenderly_sim_status for pre-broadcast validation. expected_value_change is in raw units of the account's numeraire token (6 decimals for USDC, 18 for WETH). Negative = cost to open, positive = value gained. Compare before.total_account_value and after.total_account_value for the full picture. If a pool's price is off market or one of its tokens has no price, the tool returns the price warnings, an accept_price_checks list and NO transaction. Show the warnings to the user and call again with that accept_price_checks list only after the user explicitly confirms they accept them. If a later call returns new warnings, even on a rebuild, show them and get a new confirmation before passing their list. The acknowledgement never bypasses a backend refusal.
Inputs: positions (required), wallet_address (required), account_address (required), chain_id, +5 more. Returns: after, before, description, transaction, +5 more
write_account_aero_upgradeAIdempotentInspect
Upgrade one Arcadia account to Aero (MetadexCL V1) in one flashAction: every Slipstream V1/V2/V3 position (dex_protocol slipstream*, staked or not, see read_account_info) moves to the Aero CL pool with the same pair and variant at the same range and tick spacing (when Aero has no pool at that tick spacing, the user picks another one), and every unit of old AERO (loose, in rewards, in an old-AERO pair) becomes the new AERO. Returns the plan and, when anything can go now, the unsigned transaction. Only the account owner can sign it. The backend decides what moves: report items[].status and items[].reason as given, never decide eligibility yourself. status ready: sign transaction. choices_required: some position has status choose with options[] (every Aero pool on its pair, with apy, tvl_usd, is_new, tick_spacing, range_widened, default and disabled_reason); ask the user to pick one whose disabled_reason is null, then call again with it in choices so one transaction moves everything. The transaction returned with choices_required moves only the ready items: sign it alone only when the user wants to leave the choose positions where they are. waiting: each item's reason says why (pool_not_on_aero, staking_not_open, target_price_mismatch, account_unhealthy, ...); a waiting item with an option whose disabled_reason is null can still move with that pick, so ask the user; do not retry in a loop. not_open: the AERO upgrade contract does not accept deposits at the moment. A 422 saying a pool is not selectable: drop that pick, call again without it and ask the user again. Pass accounts (up to 10) instead of account_address for one plan per account; the accounts share one AERO upgrade budget. multisends groups the accounts that got a transaction, in order: a Safe signs one MultiSend per group (each below max_gas_per_tx). After it confirms, reconnect managers_to_reconnect with write_account_automations and verify with read_account_info (next_steps). Spot and margin accounts can hold Aero positions, staked or not. Chains: 8453 (Base, default), 10 (Optimism) and 4663 (Robinhood, which has nothing to upgrade). Calldata is time-sensitive: sign promptly, rebuild on a price revert. After a transaction confirms, pass its block as min_block on the next call so the plan is not built on older state. When the transaction's simulation reverts the tool returns the plan with an error and no transaction; tenderly_sim_status unavailable means Tenderly did not answer: call once more before signing. A plan without a transaction can still show tenderly_sim_status failure: the account's health or a lending pool limit refused the move, and the items wait on account_unhealthy or exposure_limit; report those reasons and do not rebuild.
Inputs: choices, accounts, chain_id, slippage, +2 more. Returns: gas, error, items, owner, +18 more
write_account_automationsAIdempotentInspect
Configure an account's automations from a list of intents and return the unsigned setAssetManagers transaction. The backend resolves which asset managers each intent needs, validates that the combination is compatible, encodes the metadata and builds the calldata, so you describe the desired outcome rather than the contracts.
With mode 'save' (the default) the intents array is the complete desired state: the backend diffs it against what is currently enabled, so any automation you leave out is DISABLED by the returned transaction. Pass a single intent with enabled: false to turn everything off.
Mode 'preview' validates and resolves the intents WITHOUT reading chain state and returns no transaction, because its calldata carries no disable entries and would only partially apply the state. Use it to check a combination is legal or to show a plan; use 'save' to get something signable. To toggle one automation without restating the rest, use write_account_automations_delta.
Intents:
compound_fees: reinvest earned fees/rewards back into the LP. Optional 'tokens' scopes it per yielding token. A staked reward that is not a pool token is swapped in via CowSwap automatically.
claim_rewards: claim yield out. config.mode as_earned pays the tokens as-is, convert_to swaps them to config.buy_token via CowSwap. config.convert_tokens converts only a subset and claims the rest as-earned. config.destination account or wallet.
add_to_lp: fold idle pool-token balances (deposits, rebalance leftovers) back into the LP. Opt-in per token.
claim_merkl: auto-claim Merkl incentive rewards. Independent of the compounder/claimer/cowswapper triad and needs no position context.
rebalance: reposition the LP. strategy out_of_range (default), take_profit (runs on the dedicated profit-taker contract), or protocol_owned_liquidity.
Pass position_id (from assets[] in read_account_info) and the backend fills in protocol, is_staked, token0, token1 and reward_tokens for you; anything you pass explicitly wins. claim_merkl needs no position context.
Rules the backend enforces (a violation is returned as an error, never written on-chain):
Every yielding token must be assigned to exactly one of compound_fees or claim_rewards. Scoping one to a subset without covering the rest is rejected, and no token may be in both.
A wallet or custom-recipient payout requires a pure as-earned claim: nothing converted, and every yielding token claimed. Converts settle in the account.
convert_tokens must be a subset of the claimed tokens, and buy_token cannot be a compounded token, a converted token, or an add_to_lp folded token.
Each intent kind may appear only once, and a token list must not be empty or name a token the position does not yield.
Returns { valid, errors, warnings, human_summary, plan, diff, transaction }. When a compatibility rule fires the call returns an error and no transaction: read errors[].reason, adjust the intents and retry. There is deliberately no transaction when the account already matches the request (no_changes_needed), when the Tenderly simulation predicts a revert (an error), or in preview mode (preview_only). Call read_asset_manager_intents first to see which intents this account can enable.
Inputs: intents (required), account_address (required), mode, owner, +7 more. Returns: diff, plan, valid, errors, +8 more
write_account_automations_deltaAIdempotentInspect
Apply an explicit change to an account's automations and return the unsigned setAssetManagers transaction. Unlike write_account_automations this is a delta, not a full desired state: automations you do not mention are left untouched. Use it to switch one automation on or off without restating the others.
The enable array takes intents to switch on (same shapes as write_account_automations). To turn an automation OFF, call read_asset_manager_current, take the address of the manager serving it, and pass that address in the disable array: an intent with enabled: false in enable is rejected because the backend would ignore it. Superseded or unreadable managers still set on the account are force-disabled in the same transaction regardless.
Intents:
compound_fees: reinvest earned fees/rewards back into the LP. Optional 'tokens' scopes it per yielding token. A staked reward that is not a pool token is swapped in via CowSwap automatically.
claim_rewards: claim yield out. config.mode as_earned pays the tokens as-is, convert_to swaps them to config.buy_token via CowSwap. config.convert_tokens converts only a subset and claims the rest as-earned. config.destination account or wallet.
add_to_lp: fold idle pool-token balances (deposits, rebalance leftovers) back into the LP. Opt-in per token.
claim_merkl: auto-claim Merkl incentive rewards. Independent of the compounder/claimer/cowswapper triad and needs no position context.
rebalance: reposition the LP. strategy out_of_range (default), take_profit (runs on the dedicated profit-taker contract), or protocol_owned_liquidity.
Pass position_id (from assets[] in read_account_info) and the backend fills in protocol, is_staked, token0, token1 and reward_tokens for you; anything you pass explicitly wins. claim_merkl needs no position context.
Rules the backend enforces (a violation is returned as an error, never written on-chain):
Every yielding token must be assigned to exactly one of compound_fees or claim_rewards. Scoping one to a subset without covering the rest is rejected, and no token may be in both.
A wallet or custom-recipient payout requires a pure as-earned claim: nothing converted, and every yielding token claimed. Converts settle in the account.
convert_tokens must be a subset of the claimed tokens, and buy_token cannot be a compounded token, a converted token, or an add_to_lp folded token.
Each intent kind may appear only once, and a token list must not be empty or name a token the position does not yield.
Inputs: account_address (required), owner, enable, token0, +7 more. Returns: diff, plan, valid, errors, +8 more
write_account_borrowAIdempotentInspect
Build an unsigned transaction to borrow from an Arcadia lending pool against account collateral. NOT needed for leveraged LP: write_account_add_liquidity handles borrowing internally when leverage > 0. Only works with margin accounts (created with a creditor/lending pool). Spot accounts (no creditor) cannot borrow: the tool will validate this and reject. Before borrowing, verify the account has positive free margin via read_account_info: collateral_value must exceed used_margin.
Inputs: to (required), amount (required), pool_address (required), account_address (required), +1 more. Returns: description, transaction, predicted_account_address
write_account_closeAIdempotentInspect
Atomic flash-action that closes an Arcadia account position in ONE transaction. Combines up to 3 steps atomically: [burn LP position] + [swap all tokens to a single target asset] + [repay debt]. Tokens remain in the account after closing: use write_account_withdraw to send them to your wallet.
ALWAYS try this tool first when closing/exiting a position. Only fall back to individual tools (write_account_remove_liquidity, write_account_swap, write_account_deleverage, write_account_withdraw) if this tool fails.
Supports two modes:
close_lp_only=true: Burns LP and leaves underlying tokens in the account. Use as step 1 if the full close fails, then call again with close_lp_only=false to swap+repay the remaining tokens.
close_lp_only=false (default): Full atomic close: burns LP, swaps everything to receive_assets, repays debt. Remaining tokens stay in the account. Follow up with write_account_withdraw to send to wallet. Supports multiple receive assets with custom distribution.
The returned calldata is time-sensitive — sign and broadcast within 30 seconds. If the transaction reverts due to price movement, rebuild and sign again immediately (retry at least once before giving up). Response includes tenderly_sim_url and tenderly_sim_status for pre-broadcast validation.
Inputs: assets (required), account_address (required), chain_id, slippage, +2 more. Returns: after, before, description, transaction, +5 more
write_account_createAIdempotentInspect
Build an unsigned transaction to create a new Arcadia account via the Factory contract. account_version: 3 with creditor → V3 margin account (can borrow/leverage). account_version: 0 or 4 → V4 spot account (no borrowing, creditor is ignored, any ERC20 allowed). Returns the predicted account address (deterministic via CREATE2).
Inputs: salt (required), wallet_address (required), chain_id, creditor, +1 more. Returns: description, transaction, predicted_account_address
write_account_deleverageAIdempotentInspect
Multi-step flash-action: sells account collateral to the debt token and repays in one atomic transaction: no wallet tokens needed. To repay from wallet tokens instead, use write_account_repay. NOTE: If you are closing a position (remove LP + swap + repay + withdraw), prefer write_account_close which batches everything atomically. Only use this tool for standalone repayment while keeping the position active. The returned calldata is time-sensitive: sign and broadcast within 30 seconds. If the transaction reverts due to price movement, rebuild and sign again immediately (retry at least once before giving up). Response includes tenderly_sim_url and tenderly_sim_status for pre-broadcast validation: if tenderly_sim_status is 'false', do NOT broadcast the transaction.
Inputs: creditor (required), amount_in (required), numeraire (required), asset_from (required), +3 more. Returns: after, before, description, transaction, +5 more
write_account_depositAIdempotentInspect
Build an unsigned transaction to deposit assets into an Arcadia account as collateral. Supports ERC20 tokens and ERC721 NFTs (LP positions). NOT needed before write_account_add_liquidity: that tool deposits from wallet atomically. Ensure the account is approved first (call read_wallet_allowances to check, then write_wallet_approve if needed). Account version is auto-detected on-chain (override with account_version if needed).
Inputs: asset_amounts (required), account_address (required), asset_addresses (required), chain_id, +3 more. Returns: description, transaction, predicted_account_address
write_account_remove_liquidityAIdempotentInspect
Flash-action: PARTIALLY decreases liquidity from an LP position. The position remains open with reduced liquidity; underlying tokens stay in the account.
For FULL position exit (burn LP + swap + repay + withdraw), use write_account_close instead: it batches everything into one atomic transaction.
The returned calldata is time-sensitive — sign and broadcast within 30 seconds. If the transaction reverts due to price movement, rebuild and sign again immediately (retry at least once before giving up). Response includes tenderly_sim_url and tenderly_sim_status for pre-broadcast validation.
Inputs: asset_id (required), adjustment (required), asset_address (required), account_address (required), +1 more. Returns: after, before, description, transaction, +5 more
write_account_repayAIdempotentInspect
Repay debt to an Arcadia lending pool using tokens from the wallet (requires ERC20 allowance). To repay using account collateral instead (no wallet tokens needed), use write_account_deleverage. Check allowance first (read_wallet_allowances), then approve the pool if needed (write_wallet_approve). Check outstanding debt with read_account_info.
Inputs: amount (required), pool_address (required), account_address (required), chain_id. Returns: description, transaction, predicted_account_address
write_account_stakeAIdempotentInspect
Flash-action: stake, unstake, or claim rewards for an LP position in one atomic transaction. Use the action parameter to select the operation. asset_address is the position manager contract: pass the non-staked PM address when staking, or the staked PM address when unstaking. The returned calldata is time-sensitive, sign and broadcast within 30 seconds. If the transaction reverts due to price movement, rebuild and sign again immediately (retry at least once before giving up). Tenderly simulation may not be available for this endpoint. Verify the position exists with read_account_info before signing. Aero CL (metadexcl_v1): spot accounts stake through the Arcadia wrapper, margin accounts through the staked module, on Base, Optimism and Robinhood.
Inputs: action (required), asset_id (required), asset_address (required), account_address (required), +1 more. Returns: after, before, description, transaction, +5 more
write_account_swapAIdempotentInspect
Flash-action: swaps assets within an Arcadia account in one atomic transaction. The backend finds the optimal swap route. NOTE: If you are closing a position (swap + repay + withdraw), prefer write_account_close which batches everything atomically. Only use this tool for standalone swaps within an active position. The returned calldata is time-sensitive: sign and broadcast within 30 seconds. If the transaction reverts due to price movement, rebuild and sign again immediately (retry at least once before giving up). Response includes tenderly_sim_url and tenderly_sim_status for pre-broadcast validation: if tenderly_sim_status is 'false', do NOT broadcast the transaction.
Inputs: asset_to (required), amount_in (required), asset_from (required), account_address (required), +2 more. Returns: after, before, description, transaction, +5 more
write_account_withdrawAIdempotentInspect
Build an unsigned transaction to withdraw assets from an Arcadia account to the owner's wallet. Only the account owner can withdraw. Will revert if the account has debt and withdrawal would make it undercollateralized. Does not support max_uint256: pass exact amounts from read_account_info. Account version is auto-detected on-chain (override with account_version if needed).
Inputs: asset_amounts (required), account_address (required), asset_addresses (required), chain_id, +3 more. Returns: description, transaction, predicted_account_address
write_pool_depositAInspect
Build an unsigned deposit transaction into an Arcadia lending tranche (ERC-4626). Lenders deposit the pool's underlying asset (USDC/WETH/cbBTC) and receive tranche shares that accrue interest from borrowers. Requires prior ERC-20 approval to the tranche (see write_wallet_approve). To check current lender yield, call read_pool_list or read_pool_info.
Inputs: assets (required), receiver (required), tranche_address (required), chain_id. Returns: description, transaction, predicted_account_address
write_pool_redeemAInspect
Build an unsigned redeem transaction to withdraw from an Arcadia lending tranche (ERC-4626). Burns tranche shares and returns the corresponding amount of underlying asset, including accrued interest. The owner must be the shares holder; receiver is where the underlying asset is sent.
Inputs: owner (required), shares (required), receiver (required), tranche_address (required), +1 more. Returns: description, transaction, predicted_account_address
write_wallet_approveAIdempotentInspect
Build an unsigned approval transaction. For ERC20 tokens: generates approve(spender, amount). For ERC721/ERC1155 NFTs (e.g. LP positions): generates setApprovalForAll(operator, true). Required before write_account_deposit or write_account_add_liquidity (when depositing from wallet). Tip: call read_wallet_allowances first to check if approval already exists: skip this if the current allowance is sufficient.
Inputs: token_address (required), spender_address (required), amount, chain_id, +1 more. Returns: description, transaction, predicted_account_address
write_wallet_upgrade_veloAIdempotentInspect
Upgrade VELO held in a wallet on Optimism to the new AERO on Base: ordered unsigned wallet transactions from owner_address, an approve when the allowance is short, then depositLiquid on the Velodrome migration with the Hyperlane fee as value. 0.044 new AERO per VELO arrives at the same address on Base once the message lands. VELO inside an Arcadia account must be withdrawn to the wallet first (write_account_withdraw). VELO stays usable, so this is optional. Optimism (chain_id 10) only. 'upgrade unavailable' names the contract's reason: not_open (with the opening time), paused, budget_exhausted, recipient_not_deployed (a contract wallet with no code on Base).
Inputs: owner_address (required), amount, chain_id. Returns: fee_wei, amount_in, new_token, old_token, +5 more
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 37 tools
Most tools target distinct resources/actions, and descriptions explicitly route overlapping workflows such as add_liquidity vs deposit, close vs individual close steps, and automations save vs delta. However, several primitive tools intentionally overlap with higher-level batch tools, and write_account_stake bundles stake/unstake/claim, leaving some misselection risk.
All tools use snake_case with a consistent read_/write_ prefix followed by domain and action. Longer names like read_account_aero_upgrade and write_account_automations_delta still follow the same predictable pattern.
37 tools is well above the 3-15 sweet spot and the 25+ heavy threshold. Although the DeFi domain is broad, the surface is large enough to burden tool selection and could be consolidated.
Coverage spans pools, accounts, assets, strategies, points, wallet operations, automations, and Aero/VELO upgrades, with read and write paths for most workflows. Minor gaps like account ownership/name management or standalone account close/transfer are not exposed, but core lifecycle operations are covered.
Maintenance
Related MCP Connectors
Official Aave MCP for V3 and V4 markets, positions, governance, and transaction preparation.
DefiLlama MCP — TVL, yields, volumes, fees, and protocol analytics for DeFi.
23-in-1 MCP server: EVM tx simulator, funding rate arb, macro radar, swap calldata & security.
MCP server for Boson Protocol — on-chain agentic commerce for physical & digital goods.
Related MCP Servers
- AlicenseBqualityDmaintenanceEnables natural language queries and JSON-RPC calls to 69+ blockchain networks through Grove's free public endpoints. Supports Ethereum, Solana, Cosmos chains, and Layer 2 solutions without requiring authentication or API keys.6712MIT
- AlicenseNot gradedqualityDmaintenanceMCP (Model Context Protocol) server for the MAIN DEX on Base. Provides AI agents (Claude, Cursor, etc.) with tools to interact with the protocol: swap tokens, manage liquidity, enter/exit ALM strategies(10% APY), and more.MIT
- AlicenseAqualityBmaintenanceSelf-custodial crypto portfolio and DeFi MCP server. Read balances and positions (Aave, Compound, Morpho, Uniswap V3, Lido, EigenLayer) across Ethereum, Arbitrum, Polygon, and Base, and prepare transactions for approval on a Ledger via WalletConnect.100145 npm4Business Source 1.1
- FlicenseNot gradedqualityFmaintenanceMCP server for the Arcadia Arc utility data API, enabling retrieval of bill data, interval meter readings, and carbon calculations.-