An MCP server that exposes Vultisig vault operations, multi-chain balance queries, transaction building, and DeFi protocol interactions to LLM-powered agents. Supports both stdio and HTTP transports.
# Build
go build -o mcp-server ./cmd/mcp-server/
# Run over stdio (default)
./mcp-server
# Run over HTTP on port 8080
./mcp-server -http :8080| Variable | Default | Description |
|---|---|---|
EVM_ETHEREUM_URL |
https://ethereum-rpc.publicnode.com |
Ethereum JSON-RPC endpoint |
EVM_BSC_URL |
https://bsc-rpc.publicnode.com |
BNB Smart Chain JSON-RPC endpoint |
EVM_POLYGON_URL |
https://polygon-bor-rpc.publicnode.com |
Polygon JSON-RPC endpoint |
EVM_AVALANCHE_URL |
https://avalanche-c-chain-rpc.publicnode.com |
Avalanche C-Chain JSON-RPC endpoint |
EVM_ARBITRUM_URL |
https://arbitrum-one-rpc.publicnode.com |
Arbitrum One JSON-RPC endpoint |
EVM_OPTIMISM_URL |
https://optimism-rpc.publicnode.com |
Optimism JSON-RPC endpoint |
EVM_BASE_URL |
https://base-rpc.publicnode.com |
Base JSON-RPC endpoint |
EVM_BLAST_URL |
https://blast-rpc.publicnode.com |
Blast JSON-RPC endpoint |
EVM_MANTLE_URL |
https://mantle-rpc.publicnode.com |
Mantle JSON-RPC endpoint |
EVM_ZKSYNC_URL |
https://mainnet.era.zksync.io |
zkSync Era JSON-RPC endpoint |
COINGECKO_API_KEY |
(empty) | CoinGecko API key (optional, raises rate limits) |
BLOCKCHAIR_API_URL |
https://api.vultisig.com/blockchair |
Blockchair proxy base URL for UTXO chain queries |
THORCHAIN_URL |
https://thornode.ninerealms.com |
THORChain node URL for fee rates and swap data |
Store vault key material for the current session. Must be called before any vault-derived address or balance queries.
| Parameter | Required | Description |
|---|---|---|
ecdsa_public_key |
Yes | Hex-encoded compressed ECDSA public key (33 bytes / 66 hex chars) |
eddsa_public_key |
Yes | Hex-encoded EdDSA public key (32 bytes / 64 hex chars) |
chain_code |
Yes | Hex-encoded 32-byte chain code for BIP-32 derivation |
Derive the address for a given blockchain network from vault key material. Requires set_vault_info first.
| Parameter | Required | Description |
|---|---|---|
chain |
Yes | Blockchain network name (see supported chains below) |
Supported chains: Arbitrum, Avalanche, Base, Bitcoin, Bitcoin-Cash, Blast, BSC, Cosmos, CronosChain, Dash, Dogecoin, Dydx, Ethereum, Kujira, Litecoin, Mantle, MayaChain, Noble, Optimism, Osmosis, Polygon, Ripple, Solana, Sui, Terra, TerraClassic, THORChain, Tron, Zcash, Zksync.
Search for tokens by ticker symbol, name, or contract address via CoinGecko. Returns token metadata and all known contract deployments across chains, ranked by market cap.
| Parameter | Required | Description |
|---|---|---|
query |
Yes | Ticker (e.g. USDC), name (e.g. Uniswap), or contract address |
All EVM tools accept a chain parameter (default: Ethereum). Supported chains: Ethereum, BSC, Polygon, Avalanche, Arbitrum, Optimism, Base, Blast, Mantle, Zksync.
Query the native coin balance of an address. Address falls back to vault-derived if omitted.
| Parameter | Required | Description |
|---|---|---|
chain |
No | EVM chain name (default: Ethereum) |
address |
No | Wallet address. Falls back to vault-derived if omitted. |
Query an ERC-20 token balance. Returns symbol, balance, and decimals.
| Parameter | Required | Description |
|---|---|---|
chain |
No | EVM chain name (default: Ethereum) |
contract_address |
Yes | ERC-20 token contract address (0x-prefixed) |
address |
No | Holder address. Falls back to vault-derived if omitted. |
Check how much of an ERC-20 token a spender is allowed to transfer. Used to determine if an approve transaction is needed before a swap or protocol interaction.
| Parameter | Required | Description |
|---|---|---|
chain |
No | EVM chain name (default: Ethereum) |
contract_address |
Yes | ERC-20 token contract address (0x-prefixed) |
owner |
No | Token holder address. Falls back to vault-derived if omitted. |
spender |
Yes | Address allowed to spend tokens (e.g. DEX router contract) |
Get nonce, gas prices, and chain ID for building an EVM transaction. Optionally estimates gas if to/data/value are provided.
| Parameter | Required | Description |
|---|---|---|
chain |
No | EVM chain name (default: Ethereum) |
address |
No | Sender address. Falls back to vault-derived if omitted. |
to |
No | Destination address for gas estimation |
data |
No | Hex calldata for gas estimation |
value |
No | Wei value for gas estimation (decimal string) |
Execute a read-only eth_call against a contract. Returns raw hex output and optionally decodes it.
| Parameter | Required | Description |
|---|---|---|
chain |
No | EVM chain name (default: Ethereum) |
to |
Yes | Contract address (0x-prefixed) |
data |
Yes | Hex-encoded calldata (0x-prefixed) |
from |
No | Sender address for call context |
value |
No | Wei value to send with the call (decimal string) |
block |
No | Block number (decimal) or "latest" (default) |
output_types |
No | Comma-separated ABI types to decode output (e.g. "uint256,address") |
Build an unsigned EIP-1559 (type 2) transaction for any EVM chain. Obtain fee/nonce parameters from evm_tx_info first.
| Parameter | Required | Description |
|---|---|---|
chain |
No | EVM chain name (default: Ethereum). Sets chain_id when not explicitly overridden. |
to |
Yes | Destination address (0x-prefixed) |
value |
Yes | Wei value to transfer (decimal string) |
nonce |
Yes | Sender nonce (decimal string) |
gas_limit |
Yes | Gas limit (decimal string) |
max_fee_per_gas |
Yes | Max fee per gas in wei (decimal string) |
max_priority_fee_per_gas |
Yes | Max priority fee (tip) per gas in wei (decimal string) |
data |
No | Hex-encoded calldata (default "0x") |
chain_id |
No | Chain ID override (decimal string) |
Build unsigned transaction(s) for a token swap. Supports THORChain, MayaChain, 1inch, LiFi, Jupiter, and Uniswap. Returns the swap transaction and an optional ERC-20 approval transaction.
| Parameter | Required | Description |
|---|---|---|
from_chain |
Yes | Source chain (e.g. "Ethereum", "Bitcoin") |
from_symbol |
Yes | Source token symbol (e.g. "ETH", "USDC") |
from_address |
No | Source token contract address (empty for native coins) |
from_decimals |
Yes | Source token decimals (e.g. 18 for ETH, 6 for USDC) |
to_chain |
Yes | Destination chain |
to_symbol |
Yes | Destination token symbol |
to_address |
No | Destination token contract address (empty for native coins) |
to_decimals |
Yes | Destination token decimals |
amount |
Yes | Amount in base units (e.g. "1000000" for 1 USDC) |
sender |
Yes | Sender wallet address |
destination |
Yes | Destination wallet address |
UTXO tools support: Bitcoin, Bitcoin-Cash, Dash, Dogecoin, Litecoin, Zcash.
Query balance and address stats. Address falls back to vault-derived if omitted.
| Parameter | Required | Description |
|---|---|---|
chain |
Yes | UTXO chain name |
address |
No | Address to query. Falls back to vault-derived if omitted. |
List recent transaction hashes for an address.
| Parameter | Required | Description |
|---|---|---|
chain |
Yes | UTXO chain name |
address |
No | Address to query. Falls back to vault-derived if omitted. |
limit |
No | Max number of hashes to return (default 50, max 100) |
List unspent transaction outputs for an address.
| Parameter | Required | Description |
|---|---|---|
chain |
Yes | UTXO chain name |
address |
No | Address to query. Falls back to vault-derived if omitted. |
Build an unsigned UTXO transaction with explicit inputs and outputs. Fee = sum(inputs) − sum(outputs).
| Parameter | Required | Description |
|---|---|---|
chain |
Yes | UTXO chain name |
inputs |
Yes | JSON array: [{"txid":"<hex>","vout":<n>,"value":<sats>}] |
outputs |
Yes | JSON array: [{"address":"<addr>","amount":<sats>}] |
Get the recommended Bitcoin fee rate in sat/vB from THORChain inbound addresses. No parameters.
Build an unsigned Bitcoin PSBT for a send or swap. Automatically selects UTXOs, calculates fees, and handles change. Requires set_vault_info first.
| Parameter | Required | Description |
|---|---|---|
to_address |
Yes | Recipient Bitcoin address (or THORChain vault address for swaps) |
amount |
Yes | Amount to send in satoshis (decimal string) |
fee_rate |
Yes | Fee rate in sat/vB (use btc_fee_rate tool to get recommended rate) |
memo |
No | OP_RETURN memo (e.g. THORChain swap instruction). Adds an OP_RETURN output. |
address |
No | Sender Bitcoin address. Falls back to vault-derived if omitted. |
ABI-encode a Solidity function call or pack raw arguments. Handles 4-byte selector prepending for function calls.
| Parameter | Required | Description |
|---|---|---|
signature |
Yes | Function signature (e.g. "transfer(address,uint256)") or bare types (e.g. "uint256,address") |
args |
Yes | Array of argument values as strings (addresses as 0x-hex, integers as decimal) |
ABI-decode hex-encoded calldata or return data.
| Parameter | Required | Description |
|---|---|---|
signature |
Yes | Function signature or bare types string |
data |
Yes | Hex-encoded data to decode (0x-prefixed) |
Convert between human-readable and base unit amounts.
| Parameter | Required | Description |
|---|---|---|
amount |
Yes | Amount to convert |
decimals |
Yes | Number of decimal places (e.g. 18 for ETH, 6 for USDC) |
direction |
Yes | "to_base" (human→base) or "to_human" (base→human) |
Aave V3 tools operate on Ethereum mainnet only.
Build unsigned transactions to deposit (supply) tokens into Aave V3. Returns an approve tx and a supply tx.
| Parameter | Required | Description |
|---|---|---|
asset |
Yes | ERC-20 token contract address (0x-prefixed) |
amount |
Yes | Amount in human-readable units (e.g. "100.5") or "max" for full balance |
address |
No | Depositor's Ethereum address. Falls back to vault-derived if omitted. |
Build an unsigned transaction to withdraw tokens from Aave V3.
| Parameter | Required | Description |
|---|---|---|
asset |
Yes | ERC-20 token contract address (0x-prefixed) |
amount |
Yes | Amount in human-readable units or "max" for full withdrawal |
address |
No | Withdrawer's Ethereum address. Falls back to vault-derived if omitted. |
Build an unsigned transaction to borrow tokens from Aave V3 at variable rate.
| Parameter | Required | Description |
|---|---|---|
asset |
Yes | ERC-20 token contract address (0x-prefixed) |
amount |
Yes | Amount in human-readable units |
address |
No | Borrower's Ethereum address. Falls back to vault-derived if omitted. |
Build unsigned transactions to repay a borrow on Aave V3. Returns an approve tx and a repay tx.
| Parameter | Required | Description |
|---|---|---|
asset |
Yes | ERC-20 token contract address (0x-prefixed) |
amount |
Yes | Amount in human-readable units or "max" to repay entire debt |
address |
No | Repayer's Ethereum address. Falls back to vault-derived if omitted. |
Query Aave V3 account summary: total collateral, debt, available borrows (USD), LTV, and health factor.
| Parameter | Required | Description |
|---|---|---|
address |
No | Ethereum address. Falls back to vault-derived if omitted. |
Query Aave V3 supply APY, variable borrow APY, and reserve configuration for a token.
| Parameter | Required | Description |
|---|---|---|
asset |
Yes | ERC-20 token contract address (0x-prefixed) |
{
"mcpServers": {
"vultisig": {
"command": "/path/to/mcp-server",
"env": {
"EVM_ETHEREUM_URL": "https://ethereum-rpc.publicnode.com"
}
}
}
}# Start the server
./mcp-server -http :8080
# MCP endpoint: POST/GET/DELETE http://localhost:8080/mcp{
"mcpServers": {
"vultisig": {
"url": "http://localhost:8080/mcp"
}
}
}