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.

ParameterValuesNotes
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

AreaToolChainsPurpose
Metaget_network_modeReturn configured mode, available networks, and default network.
Metaget_walletReturn sanitized local wallet metadata; never keys, WIFs, or mnemonics.
Datainspect_neo_valueClassify Neo addresses, hashes, keys, NNS/NeoFS identifiers, and common encodings.
Dataconvert_neo_dataConvert UTF-8, hex, base64, VM integers, N3 addresses, and script hashes.
Ecosystemget_neo_service_infoNetwork-correct NNS, NeoFS, Oracle, and official bridge metadata and boundaries.
Chainget_chain_infon3, neoxHeight plus network identity (N3 validators, or the Neo X EVM chain id).
Chainget_block_heightn3, neoxCurrent block height and block count.
Chainget_blockn3, neoxFetch a block by height/number or hash.
Chainget_transactionn3, neoxFetch a transaction by hash.
Chainget_transaction_statusn3, neoxWhether a transaction is known, confirmed, and executed successfully.
Chainget_application_logn3Executions, notifications, and consumed GAS for a transaction hash.
Chainwait_for_transactionn3Poll for confirmation with optional application log.
Accountsget_balancen3, neoxNEO, GAS, and NEP-17 balances on Neo N3; native GAS balance on Neo X.
Accountsget_unclaimed_gasn3Claimable GAS for an address.
Accountsget_nep17_transfersn3NEP-17 transfer history from live RPC.
Accountsget_nep11_balancesn3NEP-11 (NFT) balances from live RPC.
Accountsget_nep11_transfersn3NEP-11 (NFT) transfer history from live RPC.
VMdecode_neo_scriptn3Deterministic NeoVM opcode, operand, offset, syscall, and category decoding.
Ecosystemquery_nnsn3Network-correct NNS availability, price, owner, properties, expiration, and records.
Ecosystemquery_neofsn3Bounded NeoFS network/container/account reads and canonical object links.
Ecosystemget_oracle_infon3Native Oracle response price and contract-callback request boundary.
Contractscall_contractn3, neoxRead-only call: invokefunction on Neo N3, eth_call on Neo X.
Contractsget_contract_infon3, neoxManifest/ABI and known-name resolution on Neo N3; verified source on Neo X.
Contractsget_contract_statusn3Resolve a reference and check current on-chain deployment status.
Contractslist_famous_contractsn3Well-known contracts this server can resolve by name.
Feesestimate_transfer_feesn3Network and system fees for a NEP-17 transfer, without broadcasting.
Feesestimate_invoke_feesn3Network and system fees for a contract invocation.
Constructsimulate_calln3, neoxRead-only preview: N3 test-invoke state and gasConsumed, or an EVM call result.
Constructbuild_transfern3, neoxUNSIGNED transfer proposal: NeoLine dapi payload, or an unsigned EVM transaction.
Constructbuild_contract_calln3, neoxUNSIGNED invocation proposal for wallet-side signing.
Constructbuild_voten3UNSIGNED native NEO vote/unvote proposal, returned only after a true simulation result.
Constructbuild_nns_operationn3UNSIGNED network-correct NNS register, renew, record, delete, or transfer proposal.
Explorerexplorer_get_addressn3, neoxIndexed account summary: balances, type, tags, first-seen.
Exploreranalyze_addressn3Evidence-backed identity, relationships, co-signers, contract activity, behavioral signals, and sample limits.
Exploreranalyze_address_connectionn3Direct, co-signed, and shared-counterparty evidence between two addresses with explicit non-exhaustive sample limits.
Exploreranalyze_account_graphn3Offline replayable transfer graph with exact per-asset flows, curated identity metadata, and explicit materialization coverage.
Exploreranalyze_consensus_healthn3Deterministic expected-primary misses, view-change streaks, fallback producers, validator names, and freshness boundaries.
Exploreranalyze_transactionn3Deterministic status, exact GAS fees, signers, decimal-safe transfers, and bounded contract events.
Explorerinvestigate_transactionsn3One to twelve transactions composed into an immutable timeline and observed relationship evidence set with explicit sampling limits.
Exploreranalyze_contractn3Network-scoped ABI, Manifest permissions and trusts, NEF tokens, update state, source-verification status, and deterministic static evidence.
Exploreranalyze_contract_upgradesn3Immutable version artifacts, exact historical coverage, and structural ABI compatibility changes without inferring storage compatibility.
Explorerget_contract_source_verificationn3Immutable source bundle, compiler recipe, and exact artifact hashes scoped to one network and update counter.
Explorerinspect_contract_coden3Paginated NeoVM opcode annotations, ABI method ownership, bounded operands, syscalls, and static control-flow targets.
Explorerexplorer_list_address_transactionsn3, neoxTransactions involving an address, newest first.
Explorerexplorer_list_address_transfersn3, neoxToken transfers: NEP-17 on Neo N3, ERC-20/721/1155 on Neo X.
Explorerexplorer_list_address_assetsn3Assets held by an address, with balances.
Explorerexplorer_list_token_holdersn3, neoxHolders of a token contract, with balances.
Explorerexplorer_searchn3, neoxFull-text search over blocks, transactions, addresses, tokens, contracts.
Explorerquery_explorern3, neoxOne vetted read-only endpoint from the chain catalog (n3index or Blockscout).
Explorerquery_explorer_findn3Constrained filter over one allowlisted collection; gated off by default.
Explorerquery_explorer_graphqlneoxBlockscout GraphQL read query; gated off by default, no mutations.
Non-custodial by construction: none of the 51 default tools holds a private key, signs, or broadcasts. The 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

URIBehavior
neo://network/statusStatus for the default configured network.
neo://mainnet/statusMainnet status when mainnet is enabled.
neo://testnet/statusTestnet 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

MethodPathNotes
GET/liveUnauthenticated process liveness; does not call Neo RPC.
GET/healthUnauthenticated RPC readiness check.
GET/metricsBearer-protected when a key is set.
GET/api/blockchain/heightReturns blockCount and height.
GET/api/blocks/:hashOrHeightFetch block details.
GET/api/transactions/:txidFetch transaction details.
POST/api/contracts/invokeRead-only invocation; rejects private key and confirmation fields.
POST/api/transfersReserves a transfer intent; returns 202.
POST/api/accounts/claim-gasReserves a GAS claim intent; returns 202.
POST/api/contracts/invoke/writeReserves a contract write intent; explicit scriptHash only.
POST/api/contracts/deployReserves a deployment intent; needs a serialized nef and manifest.
GET/api/write-intents/:intentIdRead a reserved intent and its current state.
POST/api/write-intents/:intentId/approveApproves 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.