Ankr Agent RPC
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ANKR_API_KEY | Yes | Ankr API key. Create one at ankr.com/rpc. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| getAccountBalanceA | Balance of an account across many blockchains, by 0x address or ENS name, via the Ankr Advanced API indexer.
Assets are ranked by USD value descending and only the top 20 are listed by default (a real wallet can hold 1000+ assets, over half of them priced at $0); tune that with maxTokens/minUsd, or call getBalances for structured JSON. Anything the indexer PRICED at zero or below minUsd is summarised as a dust count instead of being listed.
An asset with NO indexer price is not dust: it reads "USD value unknown" and ranks after every priced asset, so on a wallet holding more priced assets than maxTokens none appear here and the note says how many exist off-page. Unknown is not zero.
An implausibly large raw balance (typical of scam tokens minting max-uint) is flagged and its balance is withheld; never add it to a total.
Each line names the chain the asset is held on, which matters because omitting |
| getTokenPriceA | USD price of a token on one blockchain: pass a contract address for an ERC-20, or leave it empty for the native coin. Returns { chain, asset, usd, priced_via_contract, as_of: { timestamp, blockNumber, lag, status } }. Read as_of before reporting a price; it says how stale the indexer's view is. A native-coin query is priced from the WRAPPED token, which is why priced_via_contract is a wrapped-token address rather than the coin itself. |
| getTransactionA | Get a transaction by its hash on one blockchain, with tier-2 decoding requested. Check tier_degraded before reading |
| getLogsA | Event logs on one chain, filtered by address and/or topics over a block range. Tier 2 emits each log as { contract, event, args }, dropping logsBloom and per-log block duplication; an undecodable one stays raw as { address, topics, data, _event_unknown }. Check tier_degraded before reading |
| getBlockA | Get a block by a 0x-64 hash, a block number (decimal or 0x-hex), or a tag (latest, finalized, safe, earliest, pending).
Tier 2 drops the verbose header roots and bloom and, with includeTxs, ABI-decodes and compacts the embedded transactions. A large block with includeTxs may come back raw (hex); _meta.tier says which, and dropping includeTxs gets the header decoded.
Sui: |
| getBalancesA | An address's balances on ONE chain: native via eth_getBalance plus, by default, ERC-20 balances with USD from the Ankr Advanced API indexer (tier 0). ENS resolves for the token lookup only; a raw-RPC-only chain returns native alone.
Tokens rank by USD descending, top 20 by default; tune with maxTokens/minUsd. Anything PRICED at zero or below minUsd goes to |
| getWalletActivityA | An address's recent transactions on one blockchain, newest first, via the Ankr Advanced API indexer.
Items are returned under |
| resolveContractA | Inspect an address on a chain: whether it is a contract, best-effort ERC-20 token metadata (name, symbol, decimals), and EIP-1967 proxy detection (implementation address). Built from eth_getCode / eth_call / eth_getStorageAt, which are plain JSON-RPC passthrough. The metadata is best-effort and may be absent on a non-standard contract. |
| searchChainA | Resolve an on-chain IDENTIFIER to the object it names. Accepts exactly THREE shapes, and nothing else:
|
| expandResultA | Continue a paged result using the opaque cursor returned by a previous tool call. Supported cursor sources: getWalletActivity, getLogs (a block range, or a Sui checkpoint scan), getBalances (asset offset), Sui views (tier 0 re-reads the view unshaped: a fresh upstream call, never a replay of the earlier answer). Returns the next page of compact items plus a new cursor if more remains. |
| rpcCallA | Call ANY JSON-RPC method on a supported chain: the escape hatch beyond the routed tools (eth_call, eth_estimateGas, eth_getCode, debug_trace*, trace_*). Prefer getTransaction/getLogs/getBlock where they fit. TORPC tier is negotiated per call (contract 2); check meta.tier. This is a read/data tool, never a wallet. It REFUSES anything that would change state, on every chain family: transaction broadcast and signing (eth_sendRawTransaction, MEV bundle/private-tx, personal/eth_sign, Solana sendTransaction/requestAirdrop, BTC sendrawtransaction and bumpfee/psbtbumpfee, Sui sui_executeTransactionBlock, XRPL submit, Tron broadcasttransaction/createtransaction/triggersmartcontract, Cosmos broadcast_tx_*); transaction BUILDING, which returns an unsigned transaction rather than sending one (Sui's unsafe_* namespace); node administration and dev-node state (admin_*, miner_*, personal_*, hardhat_*, anvil_*, evm_*, engine_*); any mutating verb (set*, write*, start*, stop*, compact*), which refuses settxfee, debug_setHead and debug_writeBlockProfile; the node-operation half of geth's debug namespace (profilers, chaindb compaction, file-writing traces), which the verb rule cannot reach when the mutating word sits mid-camelCase; bitcoind's node and wallet state controls (invalidateblock, reconsiderblock, preciousblock, pruneblockchain, rescanblockchain, abortrescan, generateblock); and, on dot-namespaced chains, mempool submission and the node's own wallet, multisig and administration families (Filecoin.MpoolPush, Filecoin.WalletExport). Sign and send with your own wallet or signer. On sui this tool speaks gRPC, not JSON-RPC: a bridged method is answered there, any other is REFUSED rather than sent to Sui's JSON-RPC, which Sui removes in mid-October 2026. describeMethods says which are bridged. Everything else is FORWARDED: this tool keeps no list of permitted reads, because which methods exist is decided per chain by the endpoint's blockchain schema and what you may call by your tenant. A forwarded read can still come back refused ("Method disabled, reason: restricted by blockchain schema") — that is the authoritative answer. Call listChains for coverage. |
| suiGetObjectsA | Move objects by id, in ONE batch call: each answer carries the object's id, type, version, owner and its decoded Move fields under json. Up to 50 ids per request and nothing is trimmed from the reply, so no cursor is issued. An id the node cannot serve is reported POSITIONALLY under failed, with its request index, the id asked for and the gRPC status, never dropped in silence. Reads only. |
| suiListOwnedObjectsA | Every object an address owns, page by page, out of the node's own owner index. Narrow it with type: a bare Move type such as 0x2::coin::Coin matches any type parameter, while a fully applied one matches only that instantiation. A page holds 50 entries by default and 200 at most; when the node holds more, an opaque cursor comes back and expandResult returns the following page in this same shape. Reads only. |
| suiListDynamicFieldsA | Whatever a Move package stored under one object's UID: tables, bags and dynamic object fields, listed from the parent id. A row names the field's own object id, its kind, the name it is keyed by and the Move type of its value. The value itself is a BCS blob and is left out of this answer; hand that field id to suiGetObjects and it comes back decoded. 50 rows unless asked otherwise and 200 at the outside, with a cursor for as long as the parent has more. Reads only. |
| suiGetPackageA | What a published Move package declares, so a caller can pick what to inspect next.
By default this answers with an INDEX: one row per module carrying its name and how many functions and datatypes it holds, capped at 50 rows (raise it with maxModules). Pass |
| suiGetFunctionA | One Move function's signature: visibility, whether it is an entry function, its type parameters, its parameter types and its return types — what a programmable transaction block needs in order to call it. Never capped or paged. Take the package and module names from suiGetPackage. A name the package does not declare is refused by the node rather than approximated. |
| suiResolveNameA | Resolve a SuiNS name (something.sui) to the address it points at, or an address back to its name. Give exactly one of |
| suiSimulateTransactionA | Run a transaction against current state and report what it WOULD do, without submitting it: whether it succeeds or which Move abort stops it and in which command, the gas it consumes, the objects it creates, mutates and deletes, the balance changes per address and coin, each command's return values decoded, and any events it would emit. Takes the base64 BCS TransactionData your wallet or SDK produces — the same argument sui_dryRunTransactionBlock takes; no signature, and none is accepted. Nothing is broadcast: this server cannot reach Sui's execute rpc at all. |
| suiWatchEventsA | Follow Move events from now on, by POLLING — nothing is pushed. This first call only establishes a start position: it reads the executed tip from a Sui event subscription, returns NO events, and hands back a cursor. Each expandResult on that cursor lists what has been emitted since and returns the next one, so no event falls in the gap between two polls. That is the whole difference from getLogs, which scans a checkpoint range you name and cannot resume across calls. Filter by address (the emitting package[::module]), eventType and sender; rows and body keys are getLogs'. Sui executes about 4 checkpoints a second, so poll on that scale; |
| getNFTsA | NFTs one wallet holds on one chain: collection, name, token id, contract, standard (ERC721/1155), image URL. For fungible tokens use getBalances. |
| getTokenHoldersA | Who holds an ERC-20 token on one chain, largest balance first, plus the total holder count. |
| getTokenPriceHistoryA | Historical USD price series for a token contract on a chain, via the Ankr Advanced API indexer: a list of { timestamp, usd, block } quotes.
|
| getInteractionsA | List the blockchains an address has interacted with, via the Ankr Advanced API indexer. Cross-chain, so there is no chain argument. Useful as a first step before fetching balances or activity per chain. |
| listChainsA | Discover chain support. Returns the chains where the Ankr Advanced API indexer is available (token balances, NFTs, holders, transfers, prices). IMPORTANT: the raw-RPC tools (getTransaction, getLogs, getBlock) and rpcCall are NOT limited to this list — they reach ANY chain Ankr serves (200+ EVM mainnets/testnets plus non-EVM like solana, btc, xrp, ton, near, aptos, and cosmos chains); just pass the chain slug as it appears in rpc.ankr.com/. suiChains are served over gRPC rather than by the proxy and have their own sui* tools. TORPC tier-2 compression is applied by the proxy on supported EVM chains, and other proxy chains pass through unchanged; suiChains are shaped in this server instead, so a Sui reply can be tier 1 or 2 with no proxy involved — check _meta.tier and _meta.tier_source for what was applied and by whom. |
| describeMethodsA | What a JSON-RPC method takes, and whether this key can actually call it on this chain. Returns the positional param shape and a worked example for every method rpcCall can validate, plus rpcCall's own verdict (permitted, or refused as a write path). Pass probe:true with an explicit methods list (max 12) to also ask the node, so served reflects your key, your tenant and the chain's blockchain schema instead of a guess: yes, no, restricted, or unknown. A refused method is never sent. Without methods it returns the whole catalogue and does not probe. The catalogue is SHAPE guidance, not a coverage list: a method missing from it may still be served, and the chain's schema is the authority. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 25 tools
Most tools have clearly distinct resource+action targets, and the sui* family is cleanly partitioned from the EVM/generic tools. A few pairs need the descriptions to separate them (getBalances vs getAccountBalance for one-chain vs multi-chain, getLogs vs suiWatchEvents for range scans vs polling), but those descriptions do resolve the ambiguity.
The set is nearly all camelCase verb_noun (getTransaction, listChains, resolveContract, searchChain), which reads predictably. The 'sui' prefix creates a parallel namespace rather than a style break, and expandResult/describeMethods are the only mild deviations.
25 tools is on the heavy side, but the server spans several genuinely different surfaces (generic EVM JSON-RPC, Ankr indexer analytics, and a Sui gRPC layer), so most entries earn their place. It sits at the upper bound of reasonable rather than being padded.
Coverage for a read-only chain-data server is strong: transactions, blocks, logs, events, balances, NFT/holders, prices and history, contract inspection, Sui objects/packages/functions, plus expandResult for cursor paging. Gaps are mostly deliberate or acknowledged dead ends (no write/broadcast path, no label or ENS registry, no continuation for getTokenPriceHistory).