The Core Wallet MCP Server exposes a set of Model Context Protocol tools that let an AI agent read a user's multi-chain wallet and sign & broadcast transactions on their behalf, subject to a configurable on-chain spend policy. To configure your policies in Core web, see this article.
NOTE: You MUST enable AI interaction through the MCP Configuration tool in Core web as outlined in this article. If you do not, all attempts from your agent to interact with the MCP server will be rejected.
It is a seedless wallet server: private keys are never exposed to the agent. The agent calls high-level tools; the server resolves the account, enforces policy, signs with the seedless key, and broadcasts.
Connection
Transport | Streamable HTTP |
Endpoint | |
Authentication | OAuth 2.0 — the agent authenticates on behalf of a wallet user; requests act on that user's accounts |
All tools operate on the authenticated user's accounts. Accounts are identified by a numeric account index (0, 1, …) that is stable across chains.
Supported networks
Family | Networks | Identifier |
EVM | Avalanche C-Chain, Ethereum, Base, Arbitrum, Polygon | CAIP-2 eip155:<chainId> (e.g. eip155:43114) |
Avalanche | X-Chain (AVM), P-Chain (PVM) — mainnet & Fuji testnet | chainAlias "X" / "P" |
Bitcoin | Mainnet & testnet | isTestnet flag |
Solana | Mainnet & testnet | isTestnet flag |
Policy & safety
Every signing request passes through a policy engine before the key is used. A transaction may be rejected (before signing, so no funds move) when it violates any configured rule. The Configuration tool can be found in Core.app. See this article for more info.
Account allowlist — only policy-enabled accounts can sign.
Recipient allowlist — the destination must be permitted (unless recipients mode is everyone).
NOTE: The recipient allow list is only enforced for
Native network tokens
ERC20 (EVM networks)
Send txns for SPL tokens (Solana).
In ERC20 and SPL token transfers, the contract call data will be parsed to the determine recipient address and check it against the allowlist. If the transaction is not one of the above token types, the destination allowlist policy is not enforced.
Spend limit — a rolling 24-hour USD limit. Valuation relies on transaction simulation; Transactions whose simulation is unsuccessful are rejected.
Network access — the target network must be enabled.
Rejections are returned as tool errors (see Errors below).
Tools
list_accounts
List all wallet accounts for the authenticated user, with their addresses grouped by chain type.
Parameters
None.
Returns
An object keyed by account index. Each account contains its per-chain addresses:
Field | Description |
EVM | EVM address (0x…), shared across all EVM chains |
AVM | Avalanche X-Chain address (X-…) |
PVM | Avalanche P-Chain address (P-…) |
CoreEth | Avalanche C-Chain (Core) address (C-…) |
BITCOIN | Bitcoin address |
SVM | Solana address |
Example
{
"0": {
"EVM": "0x15268AC7514328baA9af7b50F01661b39F8834Bc",
"SVM": "3ieUZEVKfcDEHr4gYA8qNvqAbsfjKEs5ABu69BYpnm2y",
"CoreEth": "C-avax1g6xesvqwttn76fq9az6w8qzfd9wmg37mgh7ycv",
"AVM": "X-avax1g6xesvqwttn76fq9az6w8qzfd9wmg37mgh7ycv",
"PVM": "P-avax1g6xesvqwttn76fq9az6w8qzfd9wmg37mgh7ycv",
"BITCOIN": "bc1qhazfhkr46y2y9ls3pz2zw42qvqasflrecejury"
},
"1": {
"EVM": "0x1392a1503D28d3e23c2d14a7fC22540F06626056",
"AVM": "X-avax1ppdxcjk6p8fhh3f077qhnw84sv3qq77zz0l3ps",
"PVM": "P-avax1ppdxcjk6p8fhh3f077qhnw84sv3qq77zz0l3ps",
"CoreEth": "C-avax1ppdxcjk6p8fhh3f077qhnw84sv3qq77zz0l3ps",
"BITCOIN": "bc1q29z6rvyteugllexep3aqwlfyjty7ey6834au7v",
"SVM": "7GDZmnAntrNDnbo3kBQU1TRyVXnkuWoC9J4RFdjhdGnL"
}
}
Call this first when you need an address to use as a fromAddress or to for the signing tools.
get_balances
Get token balances for the authenticated user, grouped by account. Returns every token held on every supported network for each enabled account, including Avalanche X-Chain and P-Chain AVAX balances.
Parameters
None.
Returns
{ "accounts": { "<index>": [ <networkBalance>, … ] } }. Each network balance entry includes:
Field | Description |
caip2Id | Network identifier |
networkType | evm / avm / pvm / btc / svm |
id | Address or account id the balances belong to |
balances.nativeTokenBalance | Native asset (symbol, decimals, raw balance, USD price & value) |
balances.erc20TokenBalances / splTokenBalances | Token holdings, where applicable |
error | Per-network error, or null |
Example (single network entry)
{
"caip2Id": "avax:imji8papUf2EhV3le337w1vgFauqkJg-",
"networkType": "avm",
"id": "0",
"balances": {
"nativeTokenBalance": {
"symbol": "AVAX",
"decimals": 9,
"balance": "10000000",
"price": 6.68,
"balanceInCurrency": 0.0668
}
},
"error": null,
"currency": "usd"
}
sign_and_send_evm_tx
Sign and broadcast an EVM transaction. Use this for Ethereum and EVM-compatible chains, including Avalanche C-Chain. Supports native transfers, ERC-20 transfers, and arbitrary contract calls (via data).
Parameters
Name | Type | Required | Description |
fromAddress | string (0x + 40 hex) | Yes | Sender EVM address (from list_accounts) |
caip2Id | string (eip155:<chainId>) | Yes | Target EVM network, e.g. eip155:43114 (Avalanche C-Chain) |
to | string (0x + 40 hex) | Yes | Recipient — an account for native transfers, or the contract for token/contract calls |
value | string (hex wei) | — | Amount of native token, e.g. 0x38d7ea4c68000 (0.001). Omit for pure contract calls |
data | string (hex) | — | Calldata, e.g. an ERC-20 transfer(address,uint256) |
gasLimit | string (hex) | — | Gas limit, e.g. 0x5208 (21000) |
maxFeePerGas | string (hex wei) | — | EIP-1559 max fee per gas |
maxPriorityFeePerGas | string (hex wei) | — | EIP-1559 priority fee per gas |
nonce | integer | — | Transaction nonce. Auto-fetched from the network when omitted |
Returns
{ "response": { "result": "<transactionHash>" } }
Example — native transfer (0.001 AVAX on C-Chain)
{
"caip2Id": "eip155:43114",
"fromAddress": "0x1392a1503D28d3e23c2d14a7fC22540F06626056",
"to": "0x15268AC7514328baA9af7b50F01661b39F8834Bc",
"value": "0x38d7ea4c68000"
}
Example — ERC-20 transfer (0.1 USDC)
to is the token contract; data encodes transfer(recipient, amount):
{
"caip2Id": "eip155:43114",
"fromAddress": "0x1392a1503D28d3e23c2d14a7fC22540F06626056",
"to": "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E",
"data": "0xa9059cbb0000000000000000000000001a32bf51566f7fbe8bed1e616bbe42e40223070a00000000000000000000000000000000000000000000000000000000000186a0"
}
Note: EVM transactions are simulated for security and spend-limit valuation before signing. If simulation cannot complete, the request is rejected with Blockaid simulation was unsuccessful.
sign_and_send_avalanche_tx
Sign and broadcast an Avalanche X-Chain or P-Chain transaction. Accepts a hex-encoded unsigned transaction and its input UTXOs — matching avalanche_sendTransaction in Core. The caller is responsible for building the unsigned transaction (e.g. with @avalabs/avalanchejs); this tool signs the required inputs and broadcasts.
Parameters
Name | Type | Required | Description |
fromAddress | string (X-… / P-…) | Yes | Sender X/P-Chain address (from list_accounts) |
chainAlias | "X" | "P" | Yes | Target chain: X-Chain or P-Chain |
transactionHex | string (hex) | Yes | Hex-encoded unsigned transaction bytes |
isTestnet | boolean | Yes | true for Fuji testnet, false for mainnet |
utxos | string[] (hex) | Yes | Hex-encoded input UTXOs referenced by the transaction (≥ 1) |
externalIndices | integer[] | — | External address indices needed to sign |
internalIndices | integer[] | — | Internal (change) address indices needed to sign |
Returns
{ "response": { "result": "<transactionId>" } }
Example
{
"fromAddress": "X-avax1ppdxcjk6p8fhh3f077qhnw84sv3qq77zz0l3ps",
"chainAlias": "X",
"transactionHex": "0x00000000000000000001ed5f…",
"isTestnet": false,
"utxos": ["0x9edd03c5fe95f560…"],
"externalIndices": [0]
}
sign_and_send_btc_tx
Sign and broadcast a Bitcoin transaction. Accepts pre-selected input UTXOs and outputs; the server builds the PSBT, signs each input, finalizes, and broadcasts.
NOTE: The caller is responsible for selecting inputs and outputs, including any change output. The difference between total input value and total output value is paid as the network fee.
WARNING: Remember, if the change output is not included, the difference is considered the fee, as fee = inputsTotal - outputsTotal. Without a change address defined, you could experience a loss of funds to excessive fees.
Parameters
Name | Type | Required | Description |
fromAddress | string | Yes | Sender Bitcoin address |
isTestnet | boolean | Yes | true for testnet, false for mainnet |
inputs | object[] | Yes | Input UTXOs to spend (≥ 1) — see below |
outputs | object[] | Yes | Transaction outputs (≥ 1) — see below |
inputs[]
Name | Type | Required | Description |
txHash | string | Yes | Funding transaction hash |
index | integer | Yes | Output index within the funding transaction |
value | integer (sats) | Yes | UTXO value in satoshis |
script | string | Yes | Locking script |
blockHeight | integer | Yes | Block height of the UTXO |
confirmations | integer | Yes | Confirmation count |
txHex | string | Optional | Raw funding transaction hex |
confirmedTime | string | — | Confirmation timestamp |
outputs[]
Name | Type | Required | Description |
address | string | Yes | Recipient Bitcoin address |
value | integer (sats) | Yes | Amount in satoshis |
Returns
{ "response": { "result": "<transactionHash>" } }
sign_and_send_solana_tx
Sign and broadcast a Solana transaction. Accepts a base64-encoded serialized transaction (legacy or versioned); the server signs with the account's Solana key and submits it.
Parameters
Name | Type | Required | Description |
fromAddress | string | Yes | Signer's Solana public key (from list_accounts) |
isTestnet | boolean | Yes | true for testnet, false for mainnet |
base64EncodedTx | string | Yes | Base64-encoded serialized transaction |
Returns
{ "response": { "result": "<transactionSignature>" } }
Errors
All tools return errors as MCP tool results with isError: true and a JSON text payload.
Pre-flight failures (e.g. network or module not found) return a plain message:
{ "content": [{ "type": "text", "text": "Network not found" }], "isError": true }
Signing / RPC / policy failures return a structured error:
{
"error": {
"code": -32603,
"message": "Unable to create transaction: Failed to sign Avalanche transaction",
"data": { "cause": { "message": "…" } }
}
}
Common policy rejections include: Account access disabled, Recipient is not allowed. Add recipient to policy, Blockaid simulation was unsuccessful (spend-limit valuation could not simulate the transaction), and daily spend-limit breaches.
Disclaimer
The Core Knowledge Base, including all the Help articles on this site, is provided for technical support purposes only, without representation, warranty, or guarantee of any kind, and is not technical, investment, financial, accounting, tax, or legal advice. The Core Wallet MCP Server enables an authorized AI agent to sign and broadcast transactions from your wallet. The spend-policy controls described above are provided on a best-efforts basis, apply only to the transaction types and networks specified, and do not guarantee against loss — including loss resulting from agent behavior, network fees, failed or unavailable simulation, or transactions falling outside the scope of a given control. You are responsible for the accounts, recipients, networks, limits, and agents you choose to enable. Examples are illustrative only. Please review this Notice and the Terms of Use.
For any additional questions, please view our other knowledge base articles or contact a Product Support team member via the chat button. Examples are for illustrative purposes only.
