The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Indigo MCP listing page.
MCP server for Indigo Protocol — exposes Indigo iAsset data, prices, and CDP/loan analytics to LLM agents via the Model Context Protocol.
The setup commands auto-configure Claude Desktop, Claude Code, Cursor, or Windsurf. No manual config editing needed.
A hosted deployment is available on Fronteir AI.
Run the interactive setup to automatically configure your MCP client:
This will:
Install globally:
Or run directly with npx (no install needed):
The image builds the server from source — no prior pnpm build needed, and no
dependency on any external build step:
It runs the HTTP transport on port 3000 (MCP_TRANSPORT=http is baked in), which
is what the Fly deployment uses.
The server supports HTTP transport for remote/hosted deployments:
This starts an HTTP server with:
POST /mcp — MCP endpoint (Streamable HTTP with SSE)GET /health — Health checkEach client gets its own session: initialize returns an Mcp-Session-Id that
subsequent requests must send back. A client that restarts can simply
initialize again — existing sessions are unaffected and the server does not
need restarting. Bind address and port come from HOST and PORT (MCP_PORT
is accepted as an alias for PORT).
Note:
BLOCKFROST_API_KEYis required for write operations (transaction building). Read-only tools work without it. Get a free key at blockfrost.io.
Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
Standard config:
For nvm users (multiple Node versions):
If you use nvm and have multiple Node versions, you may need to specify the full path and set PATH explicitly:
Note: Replace
YOUR_USERNAMEand Node version with your actual values. Find your Node path withwhich npx.
Add to ~/.claude/settings.json or .claude/settings.json in your project:
Add to ~/.cursor/mcp.json (global) or .cursor/mcp.json (project-level):
Add to ~/.codeium/windsurf/mcp_config.json:
Install Indigo skills for OpenClaw:
Skills are automatically configured — start using Indigo tools immediately.
For full Cardano DeFi capabilities, use both Indigo MCP and Cardano MCP together:
Run the server directly via stdio:
Or install globally and reference the binary:
For any client that supports MCP over stdio, point it to the npx @indigoprotocol/indigo-mcp command with the environment variables above.
| Tool | Description | Parameters |
|---|---|---|
get_assets | Get all Indigo iAssets with prices and interest data | None |
get_asset | Get details for a specific iAsset | asset: iUSD, iBTC, iETH, iSOL, iEUR, iJPY, or iADA |
get_asset_price | Get the current price for a specific iAsset | asset: iUSD, iBTC, iETH, iSOL, iEUR, iJPY, or iADA |
get_ada_price | Get the current ADA price in USD | None |
get_indy_price | Get the current INDY token price in ADA and USD | None |
| Tool | Description | Parameters |
|---|---|---|
get_all_cdps | Get all CDPs/loans, optionally filtered by iAsset | asset?: iAsset filter; limit?: 1-500 (default 50); offset?: pagination offset |
get_cdps_by_owner | Get CDPs for a specific owner | owner: payment key hash (56-char hex) or bech32 address |
get_cdps_by_address | Get CDPs for a specific Cardano address | address: bech32 address (addr1... or addr_test1...) |
analyze_cdp_health | Analyze collateral ratios and liquidation risk | owner: payment key hash or bech32 address |
Pyth-priced iAssets have a submission deadline. Every iAsset is currently priced through Pyth, and the on-chain feed validator only accepts a transaction for 280 seconds after the price update it embeds. Price-dependent write tools (
open_cdp,withdraw_cdp,mint_cdp,redeem_cdp,freeze_cdp,leverage_cdp,redeem_rob) therefore return asummary.pythblock with the price, its timestamp and asubmitBeforedeadline. If signing takes longer than that — a hardware wallet, or a human approving in a browser — rebuild the transaction rather than submitting a stale one. A price update that has already expired is rejected at build time with a retry hint.
| Tool | Description | Parameters |
|---|---|---|
open_cdp | Open a new CDP position (returns unsigned CBOR tx) | address: bech32 address; asset: iUSD, iBTC, iETH, iSOL, iEUR, iJPY, or iADA; collateralAmount: lovelace; mintAmount: iAsset smallest unit |
deposit_cdp | Deposit additional collateral into a CDP | address: bech32 address; asset: iAsset; cdpTxHash: CDP UTxO tx hash; cdpOutputIndex: output index; amount: lovelace |
withdraw_cdp | Withdraw collateral from a CDP | address: bech32 address; asset: iAsset; cdpTxHash: CDP UTxO tx hash; cdpOutputIndex: output index; amount: lovelace |
close_cdp | Close a CDP and reclaim collateral | address: bech32 address; asset: iAsset; cdpTxHash: CDP UTxO tx hash; cdpOutputIndex: output index |
| Tool | Description | Parameters |
|---|---|---|
mint_cdp | Mint additional iAssets from an existing CDP (increases debt) | address: bech32 address; asset: iUSD, iBTC, iETH, iSOL, iEUR, iJPY, or iADA; cdpTxHash: CDP UTxO tx hash; cdpOutputIndex: CDP UTxO output index; amount: iAsset amount in smallest unit |
burn_cdp | Burn iAssets to reduce CDP debt | address: bech32 address; asset: iUSD, iBTC, iETH, iSOL, iEUR, iJPY, or iADA; cdpTxHash: CDP UTxO tx hash; cdpOutputIndex: CDP UTxO output index; amount: iAsset amount in smallest unit |
| Tool | Description | Parameters |
|---|---|---|
liquidate_cdp | Liquidate an undercollateralized CDP through the stability pool | address: bech32 address; asset: iAsset; cdpTxHash: CDP UTxO tx hash; cdpOutputIndex: output index |
redeem_cdp | Redeem iAssets from a CDP | address: bech32 address; asset: iAsset; cdpTxHash: CDP UTxO tx hash; cdpOutputIndex: output index; amount: iAsset amount in smallest unit |
freeze_cdp | Freeze a CDP to prevent further operations | address: bech32 address; asset: iAsset; cdpTxHash: CDP UTxO tx hash; cdpOutputIndex: output index |
merge_cdps | Merge multiple CDPs into one | address: bech32 address; cdpOutRefs: array of {txHash, outputIndex} (min 2) |
| Tool | Description | Parameters |
|---|---|---|
leverage_cdp | Open a leveraged CDP by redeeming against ROB positions | address: bech32 address; asset: iAsset; leverage: multiplier (e.g. 2.0); baseCollateral: lovelace amount |
| Tool | Description | Parameters |
|---|---|---|
get_stability_pools | Get the latest stability pool state for each iAsset | None |
get_stability_pool_accounts | Get all open stability pool accounts, optionally filtered by iAsset | asset?: iUSD, iBTC, iETH, iSOL, iEUR, iJPY, or iADA |
get_sp_account_by_owner | Get stability pool accounts for specific owners | owners: array of payment key hashes or bech32 addresses |
| Tool | Description | Parameters |
|---|---|---|
get_staking_info | Get the current INDY staking manager state | None |
get_staking_positions | Get all open INDY staking positions | None |
get_staking_positions_by_owner | Get INDY staking positions for specific owners | owners: array of payment key hashes or bech32 addresses |
get_staking_position_by_address | Get INDY staking positions for a single address | address: Cardano bech32 address |
| Tool | Description | Parameters |
|---|---|---|
process_sp_request | Process a pending stability pool request (protocol maintenance) | address: bech32 address; asset: iAsset; accountTxHash: account UTxO tx hash; accountOutputIndex: output index |
annul_sp_request | Cancel a pending stability pool request | address: bech32 address; accountTxHash: account UTxO tx hash; accountOutputIndex: output index |
| Tool | Description | Parameters |
|---|---|---|
open_staking_position | Stake INDY tokens by creating a new staking position | address: bech32 address; amount: INDY amount in smallest unit |
adjust_staking_position | Adjust an existing staking position (add or remove INDY) | address: bech32 address; amount: positive=stake more, negative=unstake; positionTxHash: UTxO tx hash; positionOutputIndex: UTxO output index |
close_staking_position | Close a staking position and unstake all INDY | address: bech32 address; positionTxHash: UTxO tx hash; positionOutputIndex: UTxO output index |
| Tool | Description | Parameters |
|---|---|---|
distribute_staking_rewards | Distribute collected ADA rewards from collector UTxOs to stakers | address: bech32 address; collectorTxHashes: array of {txHash, outputIndex} |
| Tool | Description | Parameters |
|---|---|---|
get_tvl | Get historical TVL data from DefiLlama | None |
get_apr_rewards | Get all APR reward records | None |
get_apr_by_key | Get APR for a specific key | key: APR key (e.g. sp_iUSD_indy, stake_ada) |
get_dex_yields | Get DEX farm yields for iAsset pairs | None |
get_protocol_stats | Get aggregated protocol statistics | None |
| Tool | Description | Parameters |
|---|---|---|
get_protocol_params | Get latest governance protocol parameters | None |
get_temperature_checks | Get temperature check polls | None |
get_polls | Get all governance polls | None |
| Tool | Description | Parameters |
|---|---|---|
get_order_book | Get open ROB (redemption order book) positions | asset?: iAsset filter; owners?: array of payment key hashes |
get_redemption_orders | Get executed redemption orders | asset?: iAsset filter; limit?: max records (default 100) |
get_redemption_queue | Get open ROB order-book entries for an iAsset | asset: iUSD, iBTC, iETH, iSOL, iEUR, iJPY, or iADA |
| Tool | Description | Parameters |
|---|---|---|
open_rob | Open a new ROB position with ADA and a max price limit | address: bech32 address; asset: iAsset; lovelacesAmount: lovelace to deposit; maxPriceNumerator + maxPriceDenominator: rational max price |
cancel_rob | Cancel an existing ROB position | address: bech32 address; robTxHash: ROB UTxO tx hash; robOutputIndex: output index |
adjust_rob | Adjust ADA in a ROB (positive to add, negative to remove) | address: bech32 address; robTxHash: ROB UTxO tx hash; robOutputIndex: output index; lovelacesAdjustAmount: adjustment; newMaxPriceNumerator? + newMaxPriceDenominator?: optional new rational max price |
claim_rob | Claim received iAssets from an ROB position | address: bech32 address; robTxHash: ROB UTxO tx hash; robOutputIndex: output index |
redeem_rob | Redeem iAssets against one or more ROB positions | address: bech32 address; asset: iAsset; redemptionRobs: array of {txHash, outputIndex, amount} |
| Tool | Description | Parameters |
|---|---|---|
get_steelswap_tokens | Get all tokens available on Steelswap DEX | None |
get_steelswap_estimate | Get a swap estimate from Steelswap | tokenIn: input token; tokenOut: output token; amountIn: amount |
get_iris_liquidity_pools | Get liquidity pools from Iris | tokenA?: first token; tokenB?: second token; dex?: DEX filter |
get_blockfrost_balances | Get token balances for a Cardano address | address: Cardano bech32 address |
| Tool | Description | Parameters |
|---|---|---|
get_collector_utxos | Get collector UTXOs for fee distribution | length?: max UTXOs to return |
store_on_ipfs | Store text content on IPFS | text: content to store |
retrieve_from_ipfs | Retrieve content from IPFS by CID | cid: IPFS content identifier |
| Tool | Description | Parameters |
|---|---|---|
collect_interest | Build a tx to collect accrued interest for one or more CDPs | asset, cdps[] |
distribute_interest | Build a tx to distribute collected interest (admin) | address |
feed_interest_oracle | Feed a new interest rate to the interest oracle (admin) | address, oracle params |
get_interest_oracle | Read the current interest oracle state for an iAsset | asset |
| Tool | Description | Parameters |
|---|---|---|
get_oracle_price | On-chain price for an iAsset (OracleNft / Delisted / Pyth) | asset |
get_pyth_price | Current Pyth price for an iAsset, plus its on-chain feed config | asset |
feed_price_oracle | Feed a new price to an OracleNft-backed price oracle (admin) | address, oracleTxHash, price |
| Tool | Description | Parameters |
|---|---|---|
get_stableswap_pool | Get the stableswap pool state for an (iAsset, collateral) | asset |
create_stableswap_order | Build a tx to swap collateral↔iAsset via the stableswap pool | address, asset, amount, minting |
cancel_stableswap_order | Build a tx to cancel a stableswap order | address, orderTxHash, orderOutputIndex |
| Variable | Required | Default | Description |
|---|---|---|---|
INDEXER_URL | No | https://analytics.indigoprotocol.io/api | Indigo analytics API base URL |
BLOCKFROST_API_KEY | For write ops | — | Blockfrost project ID for transaction building |
CARDANO_NETWORK | No | mainnet | Cardano network: mainnet, preprod, or preview |
MCP_TRANSPORT | No | stdio | Transport mode: stdio or http |
PORT | No | 3000 | HTTP server port (only used when MCP_TRANSPORT=http); MCP_PORT is accepted as an alias |
HOST | No | 0.0.0.0 | HTTP bind address (only used when MCP_TRANSPORT=http); set 127.0.0.1 to bind locally only |
X402_PRIVATE_KEY | No | — | EVM private key (0x…) of the payer wallet — enables auto-payment via split flow |
PAYMENT_SERVER | No | https://mcp.openmm.io | Settlement worker / proxy URL |
X402_TESTNET | No | false | Use Base Sepolia testnet |
X402_FACILITATOR_URL | No | — | Fallback facilitator (used only when PAYMENT_SERVER unset) |
When connected to an LLM agent, you can ask natural language questions like:
The server is published to three places, and they are not the same artifact.
| Target | Built by | Output | Published by |
|---|---|---|---|
npm — @indigoprotocol/indigo-mcp | scripts/build.sh | dist/ | CI, on a v* tag |
MCP Registry — io.github.IndigoProtocol/indigo-mcp | server.json | metadata only | CI, on a v* tag (GitHub OIDC — no token) |
| Smithery | scripts/smithery-build.sh | .smithery/stdio/server.mcpb | pnpm smithery:publish, manually |
The container image (Dockerfile) builds from source and is used by Fly and any
other container host. It does not consume .smithery/ output — that path is
Smithery-specific.
package.json; SERVER_VERSION is read from it)git tag vX.Y.Z && git push origin vX.Y.ZmcpName field, so npm has to go first)npm view @indigoprotocol/indigo-mcp versionfly deploy for the hosted HTTP endpoint, and pnpm smithery:publish for Smitheryundici requires the File global, added in Node 20)The server communicates over stdio using JSON-RPC. You can test tools directly:
Indigo MCP optionally gates tools behind per-call micropayments using the x402 protocol. Payment is disabled by default — set at least one wallet address to enable it.
Payment uses the split execution model — the same architecture as openMM-MCP:
mcp.openmm.io by default)402 with EIP-3009 requirements (amount, recipient, chain)X402_PRIVATE_KEY — the key never leaves this processThis keeps process isolation clean: indigo-mcp never holds the recipient wallet — only the payer key. Verification and settlement are handled by the openmm.io proxy.
get_tvl, get_asset_price, …) cost $0.001 USDC per callanalyze_cdp_health) cost $0.005 USDC per callopen_cdp, mint_cdp, …) cost $0.01 USDC per call| Variable | Required | Default | Description |
|---|---|---|---|
X402_PRIVATE_KEY | to enable | — | EVM private key (0x…) of the payer wallet — enables split payment |
PAYMENT_SERVER | optional | https://mcp.openmm.io | Settlement worker / proxy URL |
X402_TESTNET | optional | false | Use Base Sepolia testnet |
X402_FACILITATOR_URL | optional | — | Fallback facilitator URL (used only when PAYMENT_SERVER is not set) |
When X402_PRIVATE_KEY is set, every paid tool call is handled transparently:
PAYMENT_SERVER (https://mcp.openmm.io by default)If X402_PRIVATE_KEY is not set the gate is disabled and all tools execute without payment.
Add the env block to whichever MCP config file your client uses:
Claude Code (~/.claude/settings.json):
Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):
Cursor / Windsurf — same env block applies to ~/.cursor/mcp.json or ~/.codeium/windsurf/mcp_config.json.
Set
X402_TESTNETtofalse(or omit it) for Base mainnet.
ISC