Skip to main content
Glama
IndigoProtocol/indigo-mcp

IndigoProtocol/indigo-mcp

Official

Indigo MCP

Smithery npm downloads Ask DeepWiki

MCP server for Indigo Protocol — exposes Indigo iAsset data, prices, and CDP/loan analytics to LLM agents via the Model Context Protocol.

⚡ Quick Start — Full Cardano DeFi Stack

MCP Servers (75 tools)

# 1. Install & Setup Indigo MCP (69 tools)
npm install -g @indigoprotocol/indigo-mcp
npx @indigoprotocol/indigo-mcp setup

# 2. Install & Setup Cardano MCP (6 wallet tools)
npm install -g @indigoprotocol/cardano-mcp
npx @indigoprotocol/cardano-mcp setup

AI Skills (13 skills) — Optional

# 3. Install Indigo Skills
npx @indigoprotocol/indigo-skills

# 4. Install Cardano Skills
npx @indigoprotocol/cardano-skills
╔═══════════════════════════════════════════════════════════════╗
║                                                               ║
║   ██╗███╗   ██╗██████╗ ██╗ ██████╗  ██████╗                   ║
║   ██║████╗  ██║██╔══██╗██║██╔════╝ ██╔═══██╗                  ║
║   ██║██╔██╗ ██║██║  ██║██║██║  ███╗██║   ██║                  ║
║   ██║██║╚██╗██║██║  ██║██║██║   ██║██║   ██║                  ║
║   ██║██║ ╚████║██████╔╝██║╚██████╔╝╚██████╔╝                  ║
║   ╚═╝╚═╝  ╚═══╝╚═════╝ ╚═╝ ╚═════╝  ╚═════╝                   ║
║                                                               ║
║   ███╗   ███╗ ██████╗██████╗                                  ║
║   ████╗ ████║██╔════╝██╔══██╗                                 ║
║   ██╔████╔██║██║     ██████╔╝                                 ║
║   ██║╚██╔╝██║██║     ██╔═══╝                                  ║
║   ██║ ╚═╝ ██║╚██████╗██║                                      ║
║   ╚═╝     ╚═╝ ╚═════╝╚═╝                                      ║
║                                                               ║
║   75 tools • 13 skills for Cardano DeFi                       ║
║                                                               ║
╚═══════════════════════════════════════════════════════════════╝

The setup commands auto-configure Claude Desktop, Claude Code, Cursor, or Windsurf. No manual config editing needed.

Related MCP server: seashail

Features

  • Real-time iAsset prices (iUSD, iBTC, iETH, iSOL, iEUR, iJPY)

  • ADA and INDY token price feeds

  • CDP/loan browsing with pagination and filtering

  • Owner lookup by payment key hash or bech32 address

  • CDP health analysis with collateral ratio and liquidation risk status

  • Stability pool state and account queries

  • INDY staking positions and manager state

  • Protocol analytics: TVL, APR rewards, DEX yields, aggregated stats

  • Governance: protocol parameters, polls, temperature checks

  • Redemption order book and queue aggregation

  • DEX proxy: Steelswap swaps, Iris liquidity pools, Blockfrost balances

  • CDP liquidation, redemption, freeze, and merge operations

  • Leveraged CDP opening via ROB positions

  • ROB (Redemption Order Book) position management

  • Oracle interest rate feeding and initialization

  • Stability pool request processing and cancellation

  • Staking reward distribution

  • Collector UTXOs, IPFS storage and retrieval

Hosted deployment

A hosted deployment is available on Fronteir AI.

Quick Start

Run the interactive setup to automatically configure your MCP client:

npx @indigoprotocol/indigo-mcp setup

This will:

  1. Ask which client you're using (Claude Desktop, Claude Code, Cursor, Windsurf)

  2. Prompt for your Blockfrost API key

  3. Automatically update your config file

Manual Installation

Install globally:

npm install -g @indigoprotocol/indigo-mcp

Or run directly with npx (no install needed):

npx @indigoprotocol/indigo-mcp

Docker

The image builds the server from source — no prior pnpm build needed, and no dependency on any external build step:

docker build -t indigo-mcp .
docker run -p 3000:3000 -e BLOCKFROST_API_KEY=your-key indigo-mcp

It runs the HTTP transport on port 3000 (MCP_TRANSPORT=http is baked in), which is what the Fly deployment uses.

HTTP Transport (Remote)

The server supports HTTP transport for remote/hosted deployments:

MCP_TRANSPORT=http PORT=3000 npx @indigoprotocol/indigo-mcp

This starts an HTTP server with:

  • POST /mcp — MCP endpoint (Streamable HTTP with SSE)

  • GET /health — Health check

Each 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).

Configuration

Note: BLOCKFROST_API_KEY is required for write operations (transaction building). Read-only tools work without it. Get a free key at blockfrost.io.

Claude Desktop

Add to ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):

# macOS
nano ~/Library/Application\ Support/Claude/claude_desktop_config.json

# Windows (PowerShell)
notepad "$env:APPDATA\Claude\claude_desktop_config.json"

Standard config:

{
  "mcpServers": {
    "indigo": {
      "command": "npx",
      "args": ["-y", "@indigoprotocol/indigo-mcp"],
      "env": {
        "INDEXER_URL": "https://analytics.indigoprotocol.io/api",
        "BLOCKFROST_API_KEY": "your-blockfrost-project-id"
      }
    }
  }
}

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:

{
  "mcpServers": {
    "indigo": {
      "command": "/Users/YOUR_USERNAME/.nvm/versions/node/v22.22.0/bin/npx",
      "args": ["-y", "@indigoprotocol/indigo-mcp"],
      "env": {
        "PATH": "/Users/YOUR_USERNAME/.nvm/versions/node/v22.22.0/bin:/usr/local/bin:/usr/bin:/bin",
        "INDEXER_URL": "https://analytics.indigoprotocol.io/api",
        "BLOCKFROST_API_KEY": "your-blockfrost-project-id"
      }
    }
  }
}

Note: Replace YOUR_USERNAME and Node version with your actual values. Find your Node path with which npx.

Claude Code (CLI)

Add to ~/.claude/settings.json or .claude/settings.json in your project:

nano ~/.claude/settings.json
{
  "mcpServers": {
    "indigo": {
      "command": "npx",
      "args": ["-y", "@indigoprotocol/indigo-mcp"],
      "env": {
        "INDEXER_URL": "https://analytics.indigoprotocol.io/api",
        "BLOCKFROST_API_KEY": "your-blockfrost-project-id"
      }
    }
  }
}

Cursor

Add to ~/.cursor/mcp.json (global) or .cursor/mcp.json (project-level):

{
  "mcpServers": {
    "indigo": {
      "command": "npx",
      "args": ["-y", "@indigoprotocol/indigo-mcp"],
      "env": {
        "INDEXER_URL": "https://analytics.indigoprotocol.io/api",
        "BLOCKFROST_API_KEY": "your-blockfrost-project-id"
      }
    }
  }
}

Windsurf

Add to ~/.codeium/windsurf/mcp_config.json:

{
  "mcpServers": {
    "indigo": {
      "command": "npx",
      "args": ["-y", "@indigoprotocol/indigo-mcp"],
      "env": {
        "INDEXER_URL": "https://analytics.indigoprotocol.io/api",
        "BLOCKFROST_API_KEY": "your-blockfrost-project-id"
      }
    }
  }
}

OpenClaw

Install Indigo skills for OpenClaw:

openclaw skills add IndigoProtocol/indigo-skills

Skills are automatically configured — start using Indigo tools immediately.

Combined with Cardano MCP

For full Cardano DeFi capabilities, use both Indigo MCP and Cardano MCP together:

{
  "mcpServers": {
    "indigo": {
      "command": "npx",
      "args": ["-y", "@indigoprotocol/indigo-mcp"],
      "env": {
        "BLOCKFROST_API_KEY": "your-blockfrost-project-id"
      }
    },
    "cardano": {
      "command": "npx",
      "args": ["-y", "@indigoprotocol/cardano-mcp"],
      "env": {
        "SEED_PHRASE": "word1,word2,word3,...",
        "BLOCKFROST_PROJECT_ID": "your-blockfrost-project-id"
      }
    }
  }
}

Any MCP-Compatible Client

Run the server directly via stdio:

INDEXER_URL=https://analytics.indigoprotocol.io/api \
BLOCKFROST_API_KEY=your-blockfrost-project-id \
npx @indigoprotocol/indigo-mcp

Or install globally and reference the binary:

npm install -g @indigoprotocol/indigo-mcp
indigo-mcp

For any client that supports MCP over stdio, point it to the npx @indigoprotocol/indigo-mcp command with the environment variables above.

Available Tools

Asset Tools

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

CDP / Loan Tools

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

CDP Write Tools

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 a summary.pyth block with the price, its timestamp and a submitBefore deadline. 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

CDP Mint/Burn Tools

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

CDP Liquidation & Redemption Tools

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)

Leverage CDP Tools

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

Stability Pool Tools

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

Staking Tools

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

Stability Pool Request Tools

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

Staking Write Tools

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

Staking Reward Tools

Tool

Description

Parameters

distribute_staking_rewards

Distribute collected ADA rewards from collector UTxOs to stakers

address: bech32 address; collectorTxHashes: array of {txHash, outputIndex}

Analytics & APR Tools

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

Governance Tools

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

Redemption & Order Book Tools

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

ROB Write Tools

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}

DEX Proxy Tools

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

Collector & IPFS Tools

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

Interest Tools (v3)

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

Oracle / Pyth Tools (v3)

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

Stableswap Tools (v3)

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

Environment Variables

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)

Example Queries

When connected to an LLM agent, you can ask natural language questions like:

  • "What are the current prices of all Indigo iAssets?"

  • "What is the price of iUSD right now?"

  • "How much is ADA worth in USD?"

  • "Show me all iETH CDPs"

  • "What CDPs does this address own?" (paste a Cardano address)

  • "Analyze the health of my CDPs" (with your address or payment key hash)

  • "Are any of my positions at risk of liquidation?"

  • "Show me the current stability pool state"

  • "What are my stability pool deposits?" (with your address)

  • "How much INDY am I staking?" (with your address)

  • "What's the current TVL of Indigo?"

  • "What APR can I earn on iUSD stability pool?"

  • "What are the current governance protocol parameters?"

  • "Show me the iUSD redemption queue"

  • "Get a Steelswap estimate for swapping 100 ADA to iUSD"

  • "What are the current DEX yields for iAsset pairs?"

Distribution

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.

Cutting a release

  1. Merge the version bump (package.json; SERVER_VERSION is read from it)

  2. git tag vX.Y.Z && git push origin vX.Y.Z

  3. CI publishes to npm, then to the MCP Registry (the registry verifies ownership via the package's mcpName field, so npm has to go first)

  4. Verify against the registry, not the workflow: npm view @indigoprotocol/indigo-mcp version

  5. fly deploy for the hosted HTTP endpoint, and pnpm smithery:publish for Smithery

Development

Prerequisites

  • Node.js >= 20 (the bundled undici requires the File global, added in Node 20)

  • npm

Setup

git clone https://github.com/IndigoProtocol/indigo-mcp.git
cd indigo-mcp
npm install
npm run dev      # run with tsx (hot reload)

Scripts

npm run build          # compile TypeScript
npm run start          # run compiled server
npm run dev            # run with tsx (hot reload)
npm run typecheck      # type-check without emitting
npm run lint           # eslint
npm run lint:fix       # eslint --fix
npm run format         # prettier
npm run format:check   # prettier --check
npm run test           # run tests
npm run test:watch     # run tests in watch mode

Project Structure

src/
├── index.ts                       # Server entry point (stdio transport)
├── payment.ts                     # x402 configuration: chain addresses + tool price tiers
├── payment-client.ts              # withAutoPayment: client-side auto-pay on 402 responses
├── types/
│   └── tx-types.ts                # UnsignedTxResult, TxSummary types
├── tools/
│   ├── index.ts                   # Tool registration hub
│   ├── asset-tools.ts             # 5 asset/price tools
│   ├── cdp-tools.ts               # 4 CDP/loan tools
│   ├── stability-pool-tools.ts    # 3 stability pool tools
│   ├── staking-tools.ts           # 4 INDY staking tools
│   ├── staking-write-tools.ts     # 3 INDY staking write tools
│   ├── staking-reward-tools.ts    # 1 staking reward distribution tool
│   ├── cdp-liquidation-tools.ts   # 4 CDP liquidation/redemption/freeze/merge tools
│   ├── leverage-cdp-tools.ts      # 1 leveraged CDP tool
│   ├── rob-write-tools.ts         # 5 ROB write tools

│   ├── sp-request-tools.ts        # 2 SP request processing tools
│   ├── analytics-tools.ts         # 5 analytics/APR tools
│   ├── governance-tools.ts        # 3 governance tools
│   ├── redemption-tools.ts        # 3 redemption/order book tools
│   ├── dex-tools.ts               # 4 DEX proxy tools
│   └── collector-tools.ts         # 3 collector/IPFS tools
├── resources/
│   └── index.ts                   # MCP resource definitions
├── tests/
│   ├── unit/
│   │   ├── tools/                 # Unit tests for each tool module
│   │   └── utils/                 # Unit tests for validators, address
│   └── integration/
│       └── indexer-client.test.ts # Integration test for HTTP client
└── utils/
    ├── index.ts                   # Re-exports
    ├── indexer-client.ts          # Axios client for Indigo analytics API
    ├── validators.ts              # Zod validators (AssetParam enum)
    ├── address.ts                 # Bech32 address → payment credential
    ├── lucid-provider.ts          # Lucid + Blockfrost singleton provider
    ├── sdk-config.ts              # SystemParams loader with cache
    └── tx-builder.ts              # Transaction builder → unsigned CBOR

Testing via stdin

The server communicates over stdio using JSON-RPC. You can test tools directly:

npm run build
echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"0.1.0"}}}' | node dist/index.js

x402 Payment Gating

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.

How it works

Payment uses the split execution model — the same architecture as openMM-MCP:

  1. A tool is called (no payment header needed from the caller)

  2. The gate intercepts and contacts the settlement worker (mcp.openmm.io by default)

  3. Worker responds 402 with EIP-3009 requirements (amount, recipient, chain)

  4. Gate signs locally using X402_PRIVATE_KEY — the key never leaves this process

  5. Gate retries with the signed payment → worker verifies on-chain, issues a JWT

  6. Gate verifies JWT locally, executes the original tool handler

  7. Settlement tx hash is injected into the tool response

This 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.

  • Read tools (get_tvl, get_asset_price, …) cost $0.001 USDC per call

  • Analysis tools (analyze_cdp_health) cost $0.005 USDC per call

  • Write tools (open_cdp, mint_cdp, …) cost $0.01 USDC per call

Environment variables

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)

Split execution flow

When X402_PRIVATE_KEY is set, every paid tool call is handled transparently:

  1. Gate contacts PAYMENT_SERVER (https://mcp.openmm.io by default)

  2. Signs EIP-3009 locally — the private key never leaves this process

  3. Proxy verifies on-chain, issues a short-lived JWT

  4. Gate verifies JWT, executes tool, injects settlement tx hash into response

If X402_PRIVATE_KEY is not set the gate is disabled and all tools execute without payment.

# Minimal: just set the payer key (proxy defaults to mcp.openmm.io)
X402_PRIVATE_KEY=0xYourPayerPrivateKey npx @indigoprotocol/indigo-mcp

# Self-hosted proxy
X402_PRIVATE_KEY=0xYourPayerPrivateKey \
PAYMENT_SERVER=https://your-own-proxy \
npx @indigoprotocol/indigo-mcp

Local development

# 1. Copy example env
cp .env.example .env
# Edit .env and set X402_PRIVATE_KEY to a funded Base Sepolia wallet

# 2. Start the HTTP server
MCP_TRANSPORT=http PORT=3000 npm run dev

# 3. Run the payment e2e tests
X402_TESTNET=true npm test -- x402-payment

MCP client config with x402

Add the env block to whichever MCP config file your client uses:

Claude Code (~/.claude/settings.json):

{
  "mcpServers": {
    "indigo": {
      "command": "npx",
      "args": ["-y", "@indigoprotocol/indigo-mcp"],
      "env": {
        "INDEXER_URL": "https://analytics.indigoprotocol.io/api",
        "BLOCKFROST_API_KEY": "your-blockfrost-project-id",
        "X402_PRIVATE_KEY": "0xYourPayerPrivateKey",
        "X402_TESTNET": "true"
      }
    }
  }
}

Claude Desktop (~/Library/Application Support/Claude/claude_desktop_config.json):

{
  "mcpServers": {
    "indigo": {
      "command": "npx",
      "args": ["-y", "@indigoprotocol/indigo-mcp"],
      "env": {
        "INDEXER_URL": "https://analytics.indigoprotocol.io/api",
        "BLOCKFROST_API_KEY": "your-blockfrost-project-id",
        "X402_PRIVATE_KEY": "0xYourPayerPrivateKey",
        "X402_TESTNET": "true"
      }
    }
  }
}

Cursor / Windsurf — same env block applies to ~/.cursor/mcp.json or ~/.codeium/windsurf/mcp_config.json.

Set X402_TESTNET to false (or omit it) for Base mainnet.

License

ISC

Available Tools

69 tools
adjust_robA

Adjust ADA amount in an ROB buy order (positive to increase, negative to decrease). Optionally update the max price (numerator/denominator). Returns an unsigned transaction (CBOR hex) for client-side signing.

Inputs: address (required), robTxHash (required), robOutputIndex (required), lovelacesAdjustAmount (required), +2 more.

adjust_sp_accountA

Deposit to or withdraw from an existing stability pool account. Positive amount deposits, negative withdraws. Returns an unsigned transaction (CBOR hex) for client-side signing.

Inputs: asset (required), amount (required), address (required), accountTxHash (required), +1 more.

adjust_staking_positionA

Adjust an existing INDY staking position (add or remove INDY). Returns an unsigned transaction (CBOR hex) for client-side signing.

Inputs: amount (required), address (required), positionTxHash (required), positionOutputIndex (required).

analyze_cdp_healthA

Analyze collateral ratios and liquidation risk of CDPs for an owner, accounting for accrued interest

Inputs: owner (required).

annul_sp_requestA

Cancel a pending stability pool request. Returns an unsigned transaction (CBOR hex) for client-side signing.

Inputs: address (required), accountTxHash (required), accountOutputIndex (required).

burn_cdpA

Burn iAssets to reduce CDP debt — builds an unsigned transaction (CBOR hex) for client-side signing

Inputs: asset (required), amount (required), address (required), cdpTxHash (required), +1 more.

cancel_robA

Cancel an existing ROB position. Returns an unsigned transaction (CBOR hex) for client-side signing.

Inputs: address (required), robTxHash (required), robOutputIndex (required).

cancel_stableswap_orderA

Cancel an outstanding stableswap order and reclaim funds. Returns an unsigned transaction (CBOR hex) for client-side signing.

Inputs: address (required), orderTxHash (required), orderOutputIndex (required).

claim_robB

Claim received iAssets from an ROB position. Returns an unsigned transaction (CBOR hex) for client-side signing.

Inputs: address (required), robTxHash (required), robOutputIndex (required).

close_cdpA

Close a CDP and reclaim collateral — builds an unsigned transaction (CBOR hex) for client-side signing

Inputs: asset (required), address (required), cdpTxHash (required), cdpOutputIndex (required).

close_sp_accountA

Close a stability pool account and withdraw all deposited iAssets. Returns an unsigned transaction (CBOR hex) for client-side signing.

Inputs: address (required), accountTxHash (required), accountOutputIndex (required).

close_staking_positionA

Close an INDY staking position and unstake all INDY. Returns an unsigned transaction (CBOR hex) for client-side signing.

Inputs: address (required), positionTxHash (required), positionOutputIndex (required).

collect_interestA

Batch-collect accrued interest from one or more CDP positions into the interest collector — builds an unsigned transaction (CBOR hex) for client-side signing

Inputs: cdps (required), asset (required), address (required).

create_sp_accountA

Create a new stability pool account by depositing iAssets. Returns an unsigned transaction (CBOR hex) for client-side signing.

Inputs: asset (required), amount (required), address (required).

create_stableswap_orderA

Submit a stableswap order: swap collateral for iAsset (minting=true) or iAsset for collateral (minting=false). Returns an unsigned transaction (CBOR hex) for client-side signing.

Inputs: asset (required), amount (required), address (required), minting (required).

deposit_cdpA

Deposit additional ADA collateral into a CDP — builds an unsigned transaction (CBOR hex) for client-side signing

Inputs: asset (required), amount (required), address (required), cdpTxHash (required), +1 more.

distribute_interestA

Distribute accumulated interest from collector UTxOs to the admin interest collector — builds an unsigned transaction (CBOR hex) for client-side signing

Inputs: address (required), collectorTxHashes (required), collectorOutputIndices (required).

distribute_staking_rewardsA

Distribute collected ADA rewards from collector UTxOs to staking positions. This is a protocol maintenance operation that anyone can call. Returns an unsigned transaction (CBOR hex) for client-side signing.

Inputs: address (required), collectorTxHashes (required).

feed_interest_oracleA

ADMIN/MAINTENANCE: Update the interest rate stored in an interest oracle UTxO. Builds an unsigned transaction (CBOR hex) that must be signed by the oracle owner key. Requires the oracle contract parameters (biasTime in milliseconds, owner pubkey hash hex) which are fixed at contract deployment and must be supplied by the protocol admin.

Inputs: asset (required), address (required), oracleOwner (required), oracleBiasTime (required), +1 more.

feed_price_oracleA

Feed a new price to an OracleNft-backed price oracle — builds an unsigned transaction (CBOR hex) for admin signing. Only applicable to assets whose priceInfo is OracleNft; Pyth-priced assets are updated via signed Pyth messages, not this tool.

Inputs: asset (required), address (required), priceNumerator (required), priceDenominator (required).

freeze_cdpA

Freeze a CDP to prevent further operations until unfrozen — builds an unsigned transaction (CBOR hex) for client-side signing

Inputs: asset (required), address (required), cdpTxHash (required), cdpOutputIndex (required).

get_ada_priceB

Get the current ADA price in USD

Inputs: no named parameters.

get_all_cdpsB

Get all CDPs, optionally filtered by iAsset

Inputs: asset, limit, offset.

get_apr_by_keyC

Get APR for a specific key

Inputs: key (required).

get_apr_rewardsB

Get all APR reward records

Inputs: no named parameters.

get_assetB

Get details for a specific Indigo iAsset

Inputs: asset (required).

get_asset_priceA

Get the current price(s) for a specific Indigo iAsset, per collateral asset (ADA and others)

Inputs: asset (required).

get_assetsA

Get all Indigo iAssets with their prices

Inputs: no named parameters.

get_blockfrost_balancesB

Get token balances for a Cardano address via Blockfrost

Inputs: address (required).

get_cdps_by_addressB

Get all CDPs for a specific Cardano address

Inputs: address (required).

get_cdps_by_ownerA

Get all CDPs for a specific owner (accepts payment key hash or bech32 address)

Inputs: owner (required).

get_collector_utxosC

Get collector UTXOs for fee distribution

Inputs: length.

get_dex_yieldsB

Get DEX farm yields for iAsset pairs

Inputs: no named parameters.

get_indy_priceA

Get the current INDY token price in ADA and USD

Inputs: no named parameters.

get_interest_oracleA

Read the current interest oracle state for an asset — returns the on-chain interest rate, unitary interest accumulator, and last-updated timestamp

Inputs: asset (required).

get_iris_liquidity_poolsB

Get liquidity pools from Iris, optionally filtered by tokens or DEX

Inputs: dex, tokenA, tokenB.

get_oracle_priceA

Get the on-chain price for an iAsset from its price oracle. Handles OracleNft (reads the oracle UTxO datum), Delisted (returns the delisted price), and Pyth/DeferredValidation (delegates to get_pyth_price).

Inputs: asset (required).

get_order_bookB

Get open ROB (redemption order book) positions, optionally filtered by iAsset or owners

Inputs: asset, owners.

get_pollsB

Get all governance polls

Inputs: no named parameters.

get_protocol_paramsB

Get latest governance protocol parameters

Inputs: no named parameters.

get_protocol_statsC

Get aggregated protocol statistics

Inputs: no named parameters.

get_pyth_priceA

Get the current Pyth price for an iAsset, together with its on-chain feed configuration. The price is the latest signed Pyth update served by the Indigo analytics API — the same payload the CDP write tools embed on-chain — and is only valid on-chain until validUntil.

Inputs: asset (required).

get_redemption_ordersB

Get executed redemption orders, optionally filtered by iAsset

Inputs: asset, limit.

get_redemption_queueB

Get the open ROB order-book entries for a specific iAsset

Inputs: asset (required).

get_sp_account_by_ownerB

Get stability pool accounts for specific owners (accepts payment key hashes or bech32 addresses)

Inputs: owners (required).

get_stability_pool_accountsA

Get all open stability pool accounts, optionally filtered by iAsset

Inputs: asset.

get_stability_poolsA

Get the latest stability pool state for each iAsset (snapshots, epoch-to-scale-to-sum, asset states)

Inputs: no named parameters.

get_stableswap_poolA

Find the stableswap pool UTxO for an (iAsset, ADA collateral) pair and return its parsed datum

Inputs: asset (required).

get_staking_infoA

Get the current INDY staking manager state (total stake, snapshot ada, output ref)

Inputs: no named parameters.

get_staking_position_by_addressB

Get INDY staking positions for a single Cardano address

Inputs: address (required).

get_staking_positionsB

Get all open INDY staking positions

Inputs: no named parameters.

get_staking_positions_by_ownerA

Get INDY staking positions for specific owners (accepts payment key hashes or bech32 addresses)

Inputs: owners (required).

get_steelswap_estimateC

Get a swap estimate from Steelswap DEX

Inputs: tokenIn (required), amountIn (required), tokenOut (required).

get_steelswap_tokensB

Get all tokens available on Steelswap DEX

Inputs: no named parameters.

get_temperature_checksC

Get temperature check polls

Inputs: no named parameters.

get_tvlB

Get protocol TVL history

Inputs: no named parameters.

leverage_cdpA

Open a leveraged CDP by redeeming against ROB positions — builds an unsigned transaction (CBOR hex) for client-side signing

Inputs: asset (required), address (required), leverage (required), baseCollateral (required).

liquidate_cdpA

Liquidate an undercollateralized CDP through the stability pool — builds an unsigned transaction (CBOR hex) for client-side signing

Inputs: asset (required), address (required), cdpTxHash (required), cdpOutputIndex (required).

merge_cdpsA

Merge multiple CDPs into one — builds an unsigned transaction (CBOR hex) for client-side signing

Inputs: address (required), cdpOutRefs (required).

mint_cdpA

Mint additional iAssets from an existing CDP (increases debt) — builds an unsigned transaction (CBOR hex) for client-side signing

Inputs: asset (required), amount (required), address (required), cdpTxHash (required), +1 more.

open_cdpA

Open a new CDP position with ADA collateral — builds an unsigned transaction (CBOR hex) for client-side signing

Inputs: asset (required), address (required), mintAmount (required), collateralAmount (required).

open_robA

Open a new ROB (Redemption Order Book) buy order: deposit ADA to buy an iAsset up to a max price. The max price is a rational number (numerator/denominator). Returns an unsigned transaction (CBOR hex) for client-side signing.

Inputs: asset (required), address (required), lovelacesAmount (required), maxPriceNumerator (required), +1 more.

open_staking_positionA

Stake INDY tokens by creating a new staking position. Returns an unsigned transaction (CBOR hex) for client-side signing.

Inputs: amount (required), address (required).

process_sp_requestA

Process a pending stability pool request (protocol maintenance operation). Returns an unsigned transaction (CBOR hex) for client-side signing.

Inputs: asset (required), address (required), accountTxHash (required), accountOutputIndex (required).

redeem_cdpA

Redeem iAssets from a CDP — builds an unsigned transaction (CBOR hex) for client-side signing. To redeem the maximum possible, pass the total minted amount.

Inputs: asset (required), amount (required), address (required), cdpTxHash (required), +1 more.

redeem_robA

Redeem iAssets against one or more ROB positions for a given iAsset. Returns an unsigned transaction (CBOR hex) for client-side signing.

Inputs: asset (required), address (required), redemptionRobs (required).

retrieve_from_ipfsC

Retrieve content from IPFS by CID

Inputs: cid (required).

store_on_ipfsC

Store text content on IPFS

Inputs: text (required).

withdraw_cdpA

Withdraw ADA collateral from a CDP — builds an unsigned transaction (CBOR hex) for client-side signing

Inputs: asset (required), amount (required), address (required), cdpTxHash (required), +1 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    B3.1/5.0

    Scored across 69 tools

    Disambiguation2/5

    Multiple query tools have unclear boundaries, e.g., get_redemption_queue and get_order_book both return open ROB order-book entries, and get_cdps_by_owner/get_cdps_by_address or get_staking_positions_by_owner/get_staking_position_by_address are near-duplicates. get_assets/get_asset/get_asset_price and get_oracle_price/get_pyth_price also overlap, so agents must read descriptions carefully to avoid misselection.

    Naming Consistency4/5

    The vast majority follow a consistent snake_case verb_noun pattern (get_*, open_*, close_*, adjust_*). Minor inconsistencies exist: singular get_staking_position_by_address vs plural get_staking_positions_by_owner, and sp/stable_pool abbreviation mixing (get_sp_account_by_owner vs get_stability_pool_accounts).

    Tool Count1/5

    69 tools far exceeds the well-scoped range and crosses the 50+ extreme threshold. Even though the protocol has many subdomains, the count overwhelms agent tool selection and includes many redundant query variants.

    Completeness4/5

    Core lifecycle coverage is strong: CDPs, stability pool accounts, staking positions, ROB orders, stableswap orders, and oracles all have open/read/adjust/close equivalents. Minor gaps exist around governance (only temperature checks and polls are readable, no vote/proposal creation) and external DEX actions are query-only, but these are workable.

    Maintenance

    ActivityStale
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers