elysium-chain-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@elysium-chain-mcpWhat's the latest block on Elysium, and how fast are blocks?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
elysium-chain-mcp
Testnet only. Unofficial. Not affiliated with Kinetiq. This is an independent open-source project, not
made, endorsed or supported by Kinetiq. It is built and tested against the Elysium testnet only; mainnet
has not been published. The optional write tools refuse any chain other than the testnet (chain ID 99801).
An open-source Model Context Protocol server that lets AI agents read and interact with Elysium, Kinetiq's Layer 2 for Hyperliquid.
Elysium is a standard EVM chain (Arbitrum Orbit / Nitro) with HYPE as its gas token. The server gives an agent typed, rate-limited access through eight read-only RPC tools, seven optional explorer tools, and two optional testnet write tools that stay off unless the operator enables them.
New to blockchains? CONCEPTS.md explains every concept the server relies on.
Quickstart (five minutes)
You need Node.js 20 or newer (node --version) and Claude Code or Claude Desktop. Nothing else: the
server runs through npx, and the RPC tools are read-only.
1. Add the server.
Claude Code:
claude mcp add --env ELYSIUM_RPC_URL=https://testnet-rpc.elysium.kinetiq.xyz \
--env ELYSIUM_CHAIN_ID=99801 --transport stdio elysium \
-- npx -y elysium-chain-mcpClaude Desktop: open Settings → Developer → Edit Config, and add this to claude_desktop_config.json
(~/Library/Application Support/Claude/ on macOS, %APPDATA%\Claude\ on Windows):
{
"mcpServers": {
"elysium": {
"command": "npx",
"args": ["-y", "elysium-chain-mcp"],
"env": {
"ELYSIUM_RPC_URL": "https://testnet-rpc.elysium.kinetiq.xyz",
"ELYSIUM_CHAIN_ID": "99801"
}
}
}
}2. Restart Claude Desktop, or start a new Claude Code session. In Claude Code, /mcp should list
elysium as connected. Claude Desktop writes server logs to ~/Library/Logs/Claude/mcp-server-elysium.log
on macOS and to %APPDATA%\Claude\logs on Windows.
3. Ask it something, for example:
"What's the latest block on Elysium, and how fast are blocks?"
"Show me the most recent transaction in that block and what it cost in HYPE."
"What's the HYPE balance of 0x…?"
Related MCP server: Nexus MCP Server
Tools
Full inputs, outputs and error codes: TOOLS.md, EXPLORER.md and WRITES.md.
Tool | Kind | What it does |
| RPC | Latest block, measured block time, base fee and gas price. |
| RPC | A block by number, tag or hash, optionally with full transactions. |
| RPC | A transaction with receipt, fee in HYPE, decoded input and logs. |
| RPC | HYPE balance, plus up to 20 ERC-20 balances. |
| RPC | An ERC-20's name, symbol, decimals and total supply. |
| RPC | Calls a |
| RPC | Event logs by address, event or topics, decoded when an ABI is given. |
| RPC | Dry-runs a transaction and estimates its gas; nothing is sent. |
| Explorer | Account or contract summary: proxy, creator, indexed balance. |
| Explorer | An address's transaction history, paginated. |
| Explorer | An address's token transfers, paginated. |
| Explorer | Every token the explorer has indexed for an address. |
| Explorer | Verification status, ABI and optionally source of a contract. |
| Explorer | Search tokens and addresses, with verification and holder counts. |
| Explorer | Token details, optionally with a page of holders. |
| Write | Sends HYPE on the testnet. Dry run by default. |
| Write | Calls a state-changing function on the testnet. Dry run by default. |
Explorer tools need EXPLORER_API_URL. They rely on an undocumented API, and their text fields can carry
prompt injection, so read EXPLORER.md
first. Write tools need ENABLE_WRITES=true; see below.
Environment variables
Variable | Default | Description |
| required | JSON-RPC endpoint. Testnet: |
| required | Chain ID the endpoint must serve (testnet |
|
| Display name only. |
|
| Timeout per RPC attempt. |
|
| Retries for timeouts, connection errors, 408/429/5xx and rate-limit errors. |
|
| Base for exponential backoff with jitter; |
|
| Client-side RPC requests per second, retries included. |
|
| Most blocks per unfiltered |
|
| Blocks |
|
|
|
|
| HTTP bind address. |
|
| HTTP port. |
| unset | Bearer token (16+ chars); required off loopback, and for writes over HTTP. |
|
|
|
| unset | Enables the explorer tools. Testnet: |
|
| Timeout per explorer request. |
|
| Retries for explorer timeouts, connection errors, 408/429/5xx; honours |
|
| Client-side explorer requests per second. |
|
| Registers the write tools; needs |
| unset | Key the write tools send from (64 hex chars). Never logged or returned. |
|
| Most HYPE one write may send, else |
|
| Most one write may cost in fees, else |
| unset | Comma-separated destinations; when set, others get |
|
| How long a write waits for its receipt before returning |
HTTP transport
Start the server with MCP_TRANSPORT=http to serve POST /mcp (stateless) and GET /health
({"status":"ok"}) on http://127.0.0.1:3000. With MCP_HTTP_TOKEN set, every request needs Authorization: Bearer <token>, compared in constant time. On loopback, requests with a non-loopback Host or Origin get
403, which blocks DNS rebinding. The server refuses to start off loopback without a token. To connect Claude
Code:
claude mcp add --transport http elysium http://127.0.0.1:3000/mcp \
--header "Authorization: Bearer $MCP_HTTP_TOKEN"Write tools: safety summary
send_native and write_contract send real transactions. They are off by default, and when enabled:
They are only registered with
ENABLE_WRITES=true, and the server refuses to start unless the chain ID is99801. Every write re-checks the chain ID with the node.The key comes only from
ELYSIUM_PRIVATE_KEY. It is never a tool input, and never logged or returned.Every write is simulated first; if the simulation reverts, nothing is sent.
Each write is capped by
MAX_SEND_HYPE(value),MAX_FEE_HYPE(fee), and, if set,WRITE_ALLOWLIST.dry_rundefaults totrue. Each attempt writes onewrite-auditlog line, which never contains the key.Once a transaction is signed, no error is retryable, so an agent can't send it twice by retrying.
dry_run is not human approval: keep tool-call approval on in your MCP client. A passing simulation
doesn't guarantee success. The allowlist and caps don't look inside call data, which must be fixed before
writes are ever enabled on a chain with real value. Setup, every check and the full risks list are in
WRITES.md.
Links
Licence
Available Tools
8 toolsget_balanceGet balanceARead-onlyIdempotent
Native HYPE balance of an address, plus optional ERC-20 balances. A failure for one token is reported in that token's entry and does not fail the whole call.
| Name | Required | Description | Default |
|---|---|---|---|
| block | No | Block to read at. Defaults to latest. An integer block number or a tag: latest, safe, finalized, earliest, pending. | |
| tokens | No | ERC-20 token contract addresses to read balances for (max 20). | |
| address | Yes | Account or contract whose balances to read. 0x followed by 40 hex characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
| native | Yes | |
| tokens | Yes | |
| address | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description adds genuinely non-obvious behavior: a per-token failure is surfaced in that token's entry rather than failing the whole call, which is important for an agent parsing partial results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero waste. The core capability is front-loaded and the partial-failure caveat follows immediately where it is most relevant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return structure need not be explained, and the description usefully covers the one non-obvious output behavior (per-token errors). It is slightly thin on whether 'block' applies to both native and ERC-20 reads, and on the meaning of 'HYPE' for a non-chain-expert agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents address, block (including tags) and the max-20 tokens array. The description only reinforces that token balances are optional and that failures are isolated; it adds no format or syntax detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Native HYPE balance of an address') and adds the scope extension of optional ERC-20 balances. It does not, however, name or exclude any sibling such as get_token_info or read_contract, so sibling disambiguation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance. The description never says how this differs from read_contract or get_token_info, or when the optional tokens list should be supplied versus a separate token query.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_blockGet blockARead-onlyIdempotent
Fetch a block by number, hash or tag. Returns header fields and transaction hashes (or full transactions).
| Name | Required | Description | Default |
|---|---|---|---|
| block | No | Block number, 32-byte block hash, or tag (latest, safe, finalized, earliest, pending). Defaults to latest. | |
| includeTransactions | No | Return full transaction objects instead of hashes. Defaults to false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| block | Yes | Block fields as returned by the node. Integers are decimal strings. Arbitrum-specific fields (e.g. l1BlockNumber, sendRoot) are passed through. |
| timestampIso | Yes | |
| transactionCount | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true, and destructiveHint=false, so the safety profile is fully covered. The description's added value is noting the two return modes (hashes vs full transactions), which is mildly useful context but partially redundant with the includeTransactions parameter and the output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the purpose and identifier forms, with the return behavior appended. No filler or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a full parameter schema, an output schema, and rich annotations, the description covers the essentials an agent needs to invoke the tool. The only real omission is usage routing against siblings, which is a minor gap given how specific the verb and resource are.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in detail (block accepts number/hash/tag with defaults; includeTransactions controls verbosity). The description restates the identifier forms the schema already covers and adds no new syntax, formatting, or edge-case guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb (fetch) and resource (block), enumerates the three accepted identifier forms (number, hash, tag), and states the return shape (header fields plus transaction hashes or full transactions). This clearly separates it from siblings like get_transaction or get_logs without needing to name them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to call this versus alternatives such as get_transaction or get_chain_status, nor any stated prerequisites or exclusions. The only situational hint — that an unspecified block defaults to latest — lives in the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_chain_statusGet chain statusARead-onlyIdempotent
Latest block, measured average block time, current base fee and gas price. Block timestamps have one-second resolution while Elysium produces several blocks per second, so block time is measured over a window of recent blocks.
| Name | Required | Description | Default |
|---|---|---|---|
| sampleSize | No | How many recent blocks to measure block time over. Defaults to BLOCK_TIME_SAMPLE_SIZE (1000). |
Output Schema
| Name | Required | Description |
|---|---|---|
| chainId | Yes | |
| gasPrice | Yes | Node-suggested gas price (eth_gasPrice). |
| blockTime | Yes | |
| chainName | Yes | |
| latestBlock | Yes | |
| baseFeePerGas | Yes | Minimum per-gas fee for the next block, from the latest block. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, open-world and non-destructive, so the safety profile is covered. The description adds real behavioral context beyond them: block time is a *measured* average over a recent window, and the one-second timestamp resolution combined with multi-block-per-second production means a single block's delta would be misleading. That is a meaningful caveat about the precision of a returned metric.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the returned metrics, and the second sentence exists solely to explain why block time is windowed. Nothing is repeated from the schema and no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be enumerated, and an output schema plus full schema coverage means the one parameter is covered. For a simple read-only status tool the description supplies enough; only the when-to-use framing is absent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single optional sampleSize parameter is fully documented in the schema, including its default (BLOCK_TIME_SAMPLE_SIZE = 1000). The description only alludes to 'a window of recent blocks' without adding format, bounds, or tuning advice beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names the concrete payload — latest block, measured average block time, current base fee and gas price — which is a specific resource distinct from sibling tools like get_block or get_transaction. It never explicitly names a sibling to route against, but an agent can tell this is chain-wide aggregate status rather than per-block or per-tx detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to prefer this over get_block or get_logs, no exclusions, and no prerequisites. Usage is only inferable from the returned-fields list, so an agent must guess whether this is the right entry point for chain health versus pulling a specific block.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_logsGet event logsARead-onlyIdempotent
Query event logs over a block range. Filter by contract address and either an event signature (with optional indexed-argument values) or raw topics. Without an address or topic filter the range is capped at MAX_LOG_BLOCK_RANGE blocks (default 2,000, about 3-7 minutes on Elysium); with one, any range is allowed. Either way the RPC returns at most 10,000 logs per query; split longer ranges or add filters if you hit that.
| Name | Required | Description | Default |
|---|---|---|---|
| abi | No | Optional ABI used to decode logs (in addition to event). Either a JSON ABI (array of items, or a single item), or human-readable signatures such as ["function balanceOf(address owner) view returns (uint256)", "event Transfer(address indexed from, address indexed to, uint256 value)"]. | |
| args | No | Values for indexed event parameters, by name, e.g. {"from": "0x..."}. A list of values means "any of". Requires event. | |
| event | No | Event to filter by, as a human-readable signature ("event Transfer(address indexed from, address indexed to, uint256 value)") or a JSON ABI event item. Matching logs are decoded. | |
| limit | No | Maximum logs to return (default 1000). The response says if results were truncated. | |
| topics | No | Raw topic filter (alternative to event): position-matched 32-byte hex values, a list for "any of", or null for wildcard. | |
| address | No | Contract address, or a list of up to 20, that emitted the logs. | |
| toBlock | No | Last block (inclusive): a number or tag. Defaults to latest. | |
| fromBlock | Yes | First block (inclusive): a number or tag (latest, safe, finalized, earliest). |
Output Schema
| Name | Required | Description |
|---|---|---|
| logs | Yes | |
| count | Yes | Number of logs returned. |
| toBlock | Yes | |
| fromBlock | Yes | |
| truncated | Yes | |
| totalMatched | Yes | Number of logs the node returned before applying limit. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld, non-destructive), so the bar is lower. The description goes beyond them by disclosing the range cap (MAX_LOG_BLOCK_RANGE, default 2,000, ~3-7 min on Elysium), the 10,000-log-per-query ceiling, and the mitigation (split ranges or add filters) – concrete limit behavior the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the core action, then filtering options, then the constraint/limit caveat. No filler; each sentence adds operative information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained. Combined with annotations carrying the safety profile, the description covers action, filtering, and limits fully enough for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so a 3 baseline is warranted, but the description adds meaningful relational semantics: address filtering plus the choice between an event signature (with optional indexed-argument values) or raw topics. This clarifies the event/args-vs-topics alternative beyond the per-property schema text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Query) and resource (event logs) with a clear scope (over a block range) plus the two filtering mechanisms (address + event signature/args, or raw topics). It is distinguishable from siblings like get_transaction and get_block by resource, though it never explicitly names a sibling to route against.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides operational guidance on how filtering changes the allowed range and how to react to the 10,000-log cap, which is genuinely useful when-usage context. However, it never names an alternative (e.g., read_contract or get_transaction) or states when a different tool would be preferable, so routing guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_token_infoGet ERC-20 token infoARead-onlyIdempotent
Read an ERC-20 token's name, symbol, decimals and total supply. Fields the contract does not implement are null.
| Name | Required | Description | Default |
|---|---|---|---|
| block | No | Block to read at. Defaults to latest. An integer block number or a tag: latest, safe, finalized, earliest, pending. | |
| token | Yes | ERC-20 token contract address. 0x followed by 40 hex characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
| name | Yes | |
| token | Yes | |
| symbol | Yes | |
| decimals | Yes | |
| totalSupply | Yes | raw is in the token's smallest unit; formatted applies decimals. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description usefully adds one edge-case behavior – unimplemented fields return null – but says nothing about failure modes for invalid/non-contract addresses or reverts.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences, front-loaded with the purpose and followed by the one behavioral caveat. Every clause earns its place with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and annotations fully cover the read-only safety profile. For a two-parameter read tool this is complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both the token address format and the block parameter (with its tags) are fully documented in the schema. The description adds no parameter meaning beyond that, making the baseline 3 correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Read) and resource (ERC-20 token) and enumerates exactly which fields are returned: name, symbol, decimals, total supply. This clearly distinguishes it from the generic sibling read_contract, letting an agent pick the right tool without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the ERC-20 specialization; the description never says when to prefer this over read_contract or what happens for non-ERC-20 contracts. No explicit when-not or alternative routing is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transactionGet transactionARead-onlyIdempotent
Fetch a transaction and its receipt by hash. With an ABI, the input data and event logs are decoded. If the transaction is still pending, receipt is null. systemTransaction is true for ArbOS-generated bookkeeping transactions (Arbitrum type 106, e.g. startBlock at index 0 of every block), which no user sent and which pay no fee.
| Name | Required | Description | Default |
|---|---|---|---|
| abi | No | Optional ABI used to decode the input data and logs. Either a JSON ABI (array of items, or a single item), or human-readable signatures such as ["function balanceOf(address owner) view returns (uint256)", "event Transfer(address indexed from, address indexed to, uint256 value)"]. | |
| hash | Yes | Transaction hash: 0x followed by 64 hex characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
| fee | Yes | gasUsed × effectiveGasPrice. null while pending or if the node reports no effectiveGasPrice. |
| logs | Yes | |
| note | No | |
| value | Yes | |
| status | Yes | |
| receipt | Yes | Receipt fields without logs (see logs). Arbitrum fields such as gasUsedForL1 are passed through. |
| transaction | Yes | Transaction fields. Integers are decimal strings. |
| decodedInput | Yes | Decoded call data, if an ABI was supplied and contains the called function. |
| transactionType | Yes | From the raw type field. 0-4 are standard Ethereum types sent by users; 100-106 are Arbitrum types (bridge deposits and messages from the parent chain, retryable redeems, ArbOS internal transactions). |
| systemTransaction | Yes | True for ArbOS internal transactions (type 106). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: pending transactions return a null receipt, and systemTransaction flags ArbOS type-106 bookkeeping txs that pay no fee — semantics an agent could not infer from the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action in the first sentence, then layers conditional behavior. Each sentence carries information, though the closing systemTransaction clause is long and reads more like a doc footnote than selection guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be enumerated, and the description still covers the two edge cases an agent would otherwise misread — pending txs and system transactions. Combined with annotations, nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both hash and abi are already documented in the schema. The description reinforces the ABI effect (decodes input data and event logs) but adds no syntax or format detail beyond the schema's own examples. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch a transaction and its receipt by hash'), and the retrieval key is named, which distinguishes it from siblings like get_block and get_logs. An agent knows exactly what it retrieves and by what identifier.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the name and scope (look up a tx by hash), and the conditional ABI-decoding behavior hints at when to supply that parameter. However, there is no explicit when-to-use vs alternatives guidance, e.g. when to prefer get_logs or get_block, nor any statement of preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
read_contractRead contractARead-onlyIdempotent
Call a view or pure function on a contract and return its decoded result. Nothing is sent to the chain. For state-changing functions, use simulate_call.
| Name | Required | Description | Default |
|---|---|---|---|
| abi | Yes | ABI containing the function (a single fragment is enough). Either a JSON ABI (array of items, or a single item), or human-readable signatures such as ["function balanceOf(address owner) view returns (uint256)", "event Transfer(address indexed from, address indexed to, uint256 value)"]. | |
| args | No | Function arguments in order. Integers may be numbers or decimal/0x-hex strings (use strings above 2^53). Tuples may be arrays or objects keyed by component name. | |
| block | No | Block to read at. Defaults to latest. An integer block number or a tag: latest, safe, finalized, earliest, pending. | |
| address | Yes | Contract address. 0x followed by 40 hex characters. | |
| functionName | Yes | Name of the function to call. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes | Decoded return value. Integers are decimal strings; multiple outputs are an array or object. |
| address | Yes | |
| signature | Yes | The resolved function signature, e.g. balanceOf(address). |
| functionName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the bar is lower. The description reinforces this with 'Nothing is sent to the chain' and adds that the result is decoded, giving useful behavioral context beyond the flags, though it lacks detail on failure/call-revert behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences with zero filler; the functional statement is front-loaded and the routing note follows immediately. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is unnecessary, and rich annotations plus full schema coverage cover the structured fields. For a read-only call tool, nothing an agent needs to invoke it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all five parameters (abi, args, block, address, functionName) are already documented in the schema. The description adds no further parameter meaning such as argument coercion or block-tag nuances, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (call), resource (view or pure function on a contract), and outcome (decoded result), which is unambiguous. It also distinguishes itself from the sibling simulate_call by name, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly specifies the condition for using the alternative: 'For state-changing functions, use simulate_call.' This gives a clear when-to-use / when-to-use-something-else rule rather than leaving it to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
simulate_callSimulate callARead-onlyIdempotent
Dry-run a transaction with eth_call and estimate its gas, without sending anything. Provide either raw data, or abi + functionName + args to have the call data encoded and the result decoded. A transaction that would fail returns success: false with the revert reason; that is a result, not a tool error.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Recipient or contract address. 0x followed by 40 hex characters. | |
| abi | No | ABI containing the function to call. Either a JSON ABI (array of items, or a single item), or human-readable signatures such as ["function balanceOf(address owner) view returns (uint256)", "event Transfer(address indexed from, address indexed to, uint256 value)"]. | |
| args | No | Function arguments in order. Integers may be numbers or decimal/0x-hex strings (use strings above 2^53). Tuples may be arrays or objects keyed by component name. | |
| data | No | Raw call data (0x-hex). Use this or abi + functionName. | |
| from | No | Sender to simulate as. Defaults to the zero address. Set it when the call depends on msg.sender or balance. 0x followed by 40 hex characters. | |
| block | No | Block state to simulate against. Defaults to latest. An integer block number or a tag: latest, safe, finalized, earliest, pending. | |
| value | No | HYPE to send, in wei (1 HYPE = 10^18 wei), as a decimal or 0x-hex string. Defaults to 0. | |
| functionName | No | Function to call. Requires abi. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Node error message if the call failed for a reason other than a revert (e.g. insufficient funds). |
| revert | No | Why the call would fail, if it reverted. |
| success | Yes | |
| gasPrice | Yes | |
| signature | No | |
| returnData | Yes | Raw return data from eth_call, if it succeeded. |
| gasEstimate | Yes | Gas units from eth_estimateGas; includes the parent-chain data cost on Arbitrum chains. |
| estimatedFee | Yes | gasEstimate × current gas price. An estimate, not a guarantee. |
| decodedResult | No | Decoded return value, when abi + functionName were given. |
| gasEstimateError | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful behavioral context beyond that: it is a dry run that sends nothing, it estimates gas, and a failing transaction returns success:false with the revert reason rather than a tool error. That failure-mode disclosure is valuable and not present in the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core action ('Dry-run a transaction ... without sending anything'). Every sentence carries information: scope, input modes, failure semantics. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to explain return values, and it already covers the critical non-obvious return behavior for reverts. Annotations cover the safety profile. The one omission is routing relative to similar sibling tools like read_contract, which would help an agent pick correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3; the individual params are already well documented. The description adds orchestration semantics the schema can't express cleanly: the two mutually exclusive input modes (raw data vs. abi + functionName + args) and the fact that the latter causes encoding and result decoding.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: dry-run a transaction with eth_call, estimate gas, and do not send. This is far more precise than a tautology, and the no-send scope distinguishes it from a real transaction submission. However, it never names or contrasts with the similar sibling read_contract, so an agent must infer the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implicitly defines when to use it ('dry-run ... without sending anything') and documents the two input modes (raw data vs. abi+functionName+args). But it does not explicitly say when to choose this over read_contract or get_transaction, nor does it state any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.1.1- First observed
get_balance - First observed
get_block - First observed
get_chain_status - First observed
get_logs - First observed
get_token_info - First observed
get_transaction - First observed
read_contract - First observed
simulate_call
TDQS
Scored across 8 tools
Each tool targets a distinct resource or action, and descriptions clearly delineate them. The only notable overlap is read_contract vs simulate_call, since both perform eth_call and decode results; the descriptions mitigate this by telling the agent to use simulate_call for state-changing functions.
All tools use snake_case with a consistent verb_noun structure (get_chain_status, get_block, get_transaction, read_contract, simulate_call, etc.). The get_* family dominates with two well-formed outliers that still follow verb_noun.
Eight tools is well-scoped for a read-focused chain RPC interface. Every tool earns its place with no redundancy, and the set stays comfortably within the ideal 3-15 range.
The surface covers chain status, blocks, transactions with receipts, balances (native + ERC-20), token metadata, contract reads, log queries, and call simulation, which is broad for a read-only chain client. Minor gaps exist (no dedicated gas/fee estimation tool, no code fetch, no write/submit path), but agents can work around these via simulate_call and the RPC surface.
Maintenance
Related MCP Connectors
Read-only Hyperliquid data for AI agents: fills, candles, funding, liquidations, wallet analytics.
Read-only on-chain intelligence for AI agents on Base: balances, tokens, gas, tx status.
Read-only on-chain intelligence for AI agents on Base: balances, tokens, gas, tx status.
Provide AI agents and automation tools with contextual access to blockchain data including balance…
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with Ethereum blockchain by querying ETH and ERC-20 token balances, fetching token prices from CoinGecko, and building/simulating Uniswap V3 swap transactions. Built in Rust with read-only mode by default for safety.-

Nexus MCP Serverofficial
AlicenseNot gradedqualityDmaintenanceEnables AI agents to interact with the Nexus blockchain, providing tools for querying blockchain data, smart contract calls, transaction submission, and event monitoring.7MIT- AlicenseNot gradedqualityDmaintenanceEnables AI agents to safely interact with Ethereum by providing structured tools for reading blockchain state, simulating transactions, and drafting transactions that require human-in-the-loop approval.13 npmISC
- AlicenseAqualityAmaintenanceProvides AI agents read-only, keyless access to Hyperliquid market data, funding rates, account risk, and HyperEVM token transfers through MCP tools, with caching and rate limiting to protect upstream APIs.121MIT