API reference
The server registers 50 non-custodial MCP tools across Neo N3 and Neo X, three fixed resources, one parameterized resource, and an optional authenticated HTTP transport.
MCP request and response
{
"name": "get_block_height",
"arguments": { "chain": "n3", "network": "testnet" }
}
Tool results are returned in MCP content. Most successful tools place formatted JSON in content[0].text.
{
"blockCount": 12346,
"height": 12345,
"network": "testnet"
}
blockCount is the RPC count. The latest block index is max(0, blockCount - 1).
Chain and network parameters
One tool covers both chains. Every tool that both chains implement takes a required chain discriminator; single-chain tools reject the chain they do not serve.
| Parameter | Values | Notes |
|---|---|---|
chain | "n3", "neox" | Neo N3 (native) or Neo X (EVM). Required on dual-chain tools. |
network | "mainnet", "testnet" | Same two values on both chains; the server maps them onto each backend internally. |
Node tools read live RPC on either network. Explorer analytics are backed by n3index for Neo N3 and Blockscout for Neo X; every network-capable tool pins network, while an endpoint that lacks testnet coverage rejects the request explicitly. Blockscout list endpoints are cursor-paginated, so limit and skip apply to Neo N3 explorer tools only.
Registered tools
| Area | Tool | Chains | Purpose |
|---|---|---|---|
| Meta | get_network_mode | — | Return configured mode, available networks, and default network. |
| Meta | get_wallet | — | Return sanitized local wallet metadata; never keys, WIFs, or mnemonics. |
| Data | inspect_neo_value | — | Classify Neo addresses, hashes, keys, NNS/NeoFS identifiers, and common encodings. |
| Data | convert_neo_data | — | Convert UTF-8, hex, base64, VM integers, N3 addresses, and script hashes. |
| Ecosystem | get_neo_service_info | — | Network-correct NNS, NeoFS, Oracle, and official bridge metadata and boundaries. |
| Chain | get_chain_info | n3, neox | Height plus network identity (N3 validators, or the Neo X EVM chain id). |
| Chain | get_block_height | n3, neox | Current block height and block count. |
| Chain | get_block | n3, neox | Fetch a block by height/number or hash. |
| Chain | get_transaction | n3, neox | Fetch a transaction by hash. |
| Chain | get_transaction_status | n3, neox | Whether a transaction is known, confirmed, and executed successfully. |
| Chain | get_application_log | n3 | Executions, notifications, and consumed GAS for a transaction hash. |
| Chain | wait_for_transaction | n3 | Poll for confirmation with optional application log. |
| Accounts | get_balance | n3, neox | NEO, GAS, and NEP-17 balances on Neo N3; native GAS balance on Neo X. |
| Accounts | get_unclaimed_gas | n3 | Claimable GAS for an address. |
| Accounts | get_nep17_transfers | n3 | NEP-17 transfer history from live RPC. |
| Accounts | get_nep11_balances | n3 | NEP-11 (NFT) balances from live RPC. |
| Accounts | get_nep11_transfers | n3 | NEP-11 (NFT) transfer history from live RPC. |
| VM | decode_neo_script | n3 | Deterministic NeoVM opcode, operand, offset, syscall, and category decoding. |
| Ecosystem | query_nns | n3 | Network-correct NNS availability, price, owner, properties, expiration, and records. |
| Ecosystem | query_neofs | n3 | Bounded NeoFS network/container/account reads and canonical object links. |
| Ecosystem | get_oracle_info | n3 | Native Oracle response price and contract-callback request boundary. |
| Contracts | call_contract | n3, neox | Read-only call: invokefunction on Neo N3, eth_call on Neo X. |
| Contracts | get_contract_info | n3, neox | Manifest/ABI and known-name resolution on Neo N3; verified source on Neo X. |
| Contracts | get_contract_status | n3 | Resolve a reference and check current on-chain deployment status. |
| Contracts | list_famous_contracts | n3 | Well-known contracts this server can resolve by name. |
| Fees | estimate_transfer_fees | n3 | Network and system fees for a NEP-17 transfer, without broadcasting. |
| Fees | estimate_invoke_fees | n3 | Network and system fees for a contract invocation. |
| Construct | simulate_call | n3, neox | Read-only preview: N3 test-invoke state and gasConsumed, or an EVM call result. |
| Construct | build_transfer | n3, neox | UNSIGNED transfer proposal: NeoLine dapi payload, or an unsigned EVM transaction. |
| Construct | build_contract_call | n3, neox | UNSIGNED invocation proposal for wallet-side signing. |
| Construct | build_vote | n3 | UNSIGNED native NEO vote/unvote proposal, returned only after a true simulation result. |
| Construct | build_nns_operation | n3 | UNSIGNED network-correct NNS register, renew, record, delete, or transfer proposal. |
| Explorer | explorer_get_address | n3, neox | Indexed account summary: balances, type, tags, first-seen. |
| Explorer | analyze_address | n3 | Evidence-backed identity, relationships, co-signers, contract activity, behavioral signals, and sample limits. |
| Explorer | analyze_address_connection | n3 | Direct, co-signed, and shared-counterparty evidence between two addresses with explicit non-exhaustive sample limits. |
| Explorer | analyze_account_graph | n3 | Offline replayable transfer graph with exact per-asset flows, curated identity metadata, and explicit materialization coverage. |
| Explorer | analyze_consensus_health | n3 | Deterministic expected-primary misses, view-change streaks, fallback producers, validator names, and freshness boundaries. |
| Explorer | analyze_transaction | n3 | Deterministic status, exact GAS fees, signers, decimal-safe transfers, and bounded contract events. |
| Explorer | investigate_transactions | n3 | One to twelve transactions composed into an immutable timeline and observed relationship evidence set with explicit sampling limits. |
| Explorer | analyze_contract | n3 | Network-scoped ABI, Manifest permissions and trusts, NEF tokens, update state, source-verification status, and deterministic static evidence. |
| Explorer | analyze_contract_upgrades | n3 | Immutable version artifacts, exact historical coverage, and structural ABI compatibility changes without inferring storage compatibility. |
| Explorer | get_contract_source_verification | n3 | Immutable source bundle, compiler recipe, and exact artifact hashes scoped to one network and update counter. |
| Explorer | inspect_contract_code | n3 | Paginated NeoVM opcode annotations, ABI method ownership, bounded operands, syscalls, and static control-flow targets. |
| Explorer | explorer_list_address_transactions | n3, neox | Transactions involving an address, newest first. |
| Explorer | explorer_list_address_transfers | n3, neox | Token transfers: NEP-17 on Neo N3, ERC-20/721/1155 on Neo X. |
| Explorer | explorer_list_address_assets | n3 | Assets held by an address, with balances. |
| Explorer | explorer_list_token_holders | n3, neox | Holders of a token contract, with balances. |
| Explorer | explorer_search | n3, neox | Full-text search over blocks, transactions, addresses, tokens, contracts. |
| Explorer | query_explorer | n3, neox | One vetted read-only endpoint from the chain catalog (n3index or Blockscout). |
| Explorer | query_explorer_find | n3 | Constrained filter over one allowlisted collection; gated off by default. |
| Explorer | query_explorer_graphql | neox | Blockscout GraphQL read query; gated off by default, no mutations. |
build_* tools return UNSIGNED, successfully simulated proposals that a wallet reviews and signs; key custody and broadcast stay with the user. Wallet creation and import are never exposed over MCP.Optional local signing tools
A locally launched stdio server with NEO_ENABLE_WRITES=true and a NEO_SIGNER_WIF_FILE registers four additional tools that sign with that owner-supplied key. They are annotated destructive and idempotent, require an idempotencyKey and an explicit network, and require the caller to accept the exact returned intent fingerprint. They never accept WIFs, private keys, or passwords as arguments.
The remote MCP HTTP transport rejects this configuration and stays read-only regardless of the setting, so a hosted server never signs on a user's behalf.
Fee estimate fields
{
"networkFeeDatos": "10000000",
"systemFeeDatos": "5000000",
"networkFeeGas": "0.1",
"systemFeeGas": "0.05"
}
The datos fields are exact integer decimal strings; the GAS fields are formatted decimal strings. Estimates are advisory: the signing wallet decides the fees it actually attaches.
Resources
| URI | Behavior |
|---|---|
neo://network/status | Status for the default configured network. |
neo://mainnet/status | Mainnet status when mainnet is enabled. |
neo://testnet/status | Testnet status when testnet is enabled. |
neo://block/{height} | Parameterized block lookup on the default network. |
Generic contract flow
On Neo N3 a contract reference can be a known name, script hash, or Neo address. Resolve and verify the reference on the selected network before calling it. Local names and descriptions are not deployment or protocol guarantees.
{
"name": "get_contract_status",
"arguments": {
"chain": "n3",
"network": "testnet",
"contract": "0x0123456789abcdef0123456789abcdef01234567"
}
}
Read a contract
On Neo N3 this is an invokefunction test invoke with typed args. On Neo X it is an eth_call against a checksummed 0x address.
{
"name": "call_contract",
"arguments": {
"chain": "n3",
"network": "testnet",
"scriptHash": "0x0123456789abcdef0123456789abcdef01234567",
"operation": "symbol",
"args": []
}
}
Propose a write
Writes are never executed server-side. build_contract_call returns an unsigned proposal plus the read-only simulation behind it, so a wallet can review the effect before signing.
{
"name": "build_contract_call",
"arguments": {
"chain": "n3",
"network": "testnet",
"from": "NXV7ZhHiyM1aHXwpVsRZC6BwNFP2jghXAq",
"scriptHash": "0x0123456789abcdef0123456789abcdef01234567",
"operation": "transfer",
"args": []
}
}
HTTP transport
HTTP binds to 127.0.0.1:3000 by default and requires one Neo network. A non-loopback host requires HTTP_API_KEY; every configured key must contain at least 32 bytes.
When a key is configured, every route except GET /live and GET /health requires:
Authorization: Bearer <HTTP_API_KEY>
POST and PUT bodies must be JSON objects. HTTP_MAX_BODY_BYTES defaults to 1 MiB. HTTP_CORS_ORIGINS is an exact comma-separated origin allowlist; wildcard CORS is not supported.
Selected routes
| Method | Path | Notes |
|---|---|---|
| GET | /live | Unauthenticated process liveness; does not call Neo RPC. |
| GET | /health | Unauthenticated RPC readiness check. |
| GET | /metrics | Bearer-protected when a key is set. |
| GET | /api/blockchain/height | Returns blockCount and height. |
| GET | /api/blocks/:hashOrHeight | Fetch block details. |
| GET | /api/transactions/:txid | Fetch transaction details. |
| POST | /api/contracts/invoke | Read-only invocation; rejects private key and confirmation fields. |
| POST | /api/transfers | Reserves a transfer intent; returns 202. |
| POST | /api/accounts/claim-gas | Reserves a GAS claim intent; returns 202. |
| POST | /api/contracts/invoke/write | Reserves a contract write intent; explicit scriptHash only. |
| POST | /api/contracts/deploy | Reserves a deployment intent; needs a serialized nef and manifest. |
| GET | /api/write-intents/:intentId | Read a reserved intent and its current state. |
| POST | /api/write-intents/:intentId/approve | Approves and executes the intent; separate approval key. |
Write intents
State-changing routes never accept a key. They require NEO_ENABLE_WRITES=true and NEO_SIGNER_WIF_FILE on the server, an Idempotency-Key header, and a network matching the one the HTTP server was started with. Any wif, privateKey, password, key, or legacy confirm field in the body is rejected with 400.
A successful reservation returns 202 with the intent, not a transaction:
{
"intentId": "<64 hex>",
"fingerprint": "<64 hex>",
"state": "awaiting_approval",
"operation": "transfer_assets",
"network": "testnet",
"signerAddress": "NXV7ZhHiyM1aHXwpVsRZC6BwNFP2jghXAq",
"payload": { "toAddress": "...", "asset": "GAS", "amount": "1.5" }
}
Execution is a second, separately authorized call. The approval route uses HTTP_WRITE_APPROVAL_API_KEY instead of HTTP_API_KEY, and the body must echo the exact fingerprint returned above, so holding the read key alone can never move funds.
POST /api/write-intents/<intentId>/approve
Authorization: Bearer <HTTP_WRITE_APPROVAL_API_KEY>
{ "fingerprint": "<64 hex>" }
Replaying the same Idempotency-Key with a different payload is refused rather than silently reserving a second intent.
Errors
MCP validation errors are returned as error content with descriptive messages. HTTP responses use JSON and commonly return 400, 401, 404, 413, 415, 429, 500, 503, or 504 according to the failure.