Skip to main content
Glama
khawjaahmad

elysium-chain-mcp

by khawjaahmad

elysium-chain-mcp

IMPORTANT

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-mcp

Claude 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

get_chain_status

RPC

Latest block, measured block time, base fee and gas price.

get_block

RPC

A block by number, tag or hash, optionally with full transactions.

get_transaction

RPC

A transaction with receipt, fee in HYPE, decoded input and logs.

get_balance

RPC

HYPE balance, plus up to 20 ERC-20 balances.

get_token_info

RPC

An ERC-20's name, symbol, decimals and total supply.

read_contract

RPC

Calls a view or pure function with a caller-supplied ABI.

get_logs

RPC

Event logs by address, event or topics, decoded when an ABI is given.

simulate_call

RPC

Dry-runs a transaction and estimates its gas; nothing is sent.

explorer_get_address

Explorer

Account or contract summary: proxy, creator, indexed balance.

explorer_get_address_transactions

Explorer

An address's transaction history, paginated.

explorer_get_token_transfers

Explorer

An address's token transfers, paginated.

explorer_get_token_balances

Explorer

Every token the explorer has indexed for an address.

explorer_get_contract

Explorer

Verification status, ABI and optionally source of a contract.

explorer_search

Explorer

Search tokens and addresses, with verification and holder counts.

explorer_get_token

Explorer

Token details, optionally with a page of holders.

send_native

Write

Sends HYPE on the testnet. Dry run by default.

write_contract

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

ELYSIUM_RPC_URL

required

JSON-RPC endpoint. Testnet: https://testnet-rpc.elysium.kinetiq.xyz.

ELYSIUM_CHAIN_ID

required

Chain ID the endpoint must serve (testnet 99801); checked before use.

ELYSIUM_CHAIN_NAME

Elysium

Display name only.

RPC_TIMEOUT_MS

10000

Timeout per RPC attempt.

RPC_RETRY_COUNT

3

Retries for timeouts, connection errors, 408/429/5xx and rate-limit errors.

RPC_RETRY_BASE_DELAY_MS

250

Base for exponential backoff with jitter; Retry-After takes precedence.

RPC_RATE_LIMIT_RPS

10

Client-side RPC requests per second, retries included.

MAX_LOG_BLOCK_RANGE

2000

Most blocks per unfiltered get_logs query; filtered queries have no limit.

BLOCK_TIME_SAMPLE_SIZE

1000

Blocks get_chain_status measures block time over.

MCP_TRANSPORT

stdio

stdio or http.

MCP_HTTP_HOST

127.0.0.1

HTTP bind address.

MCP_HTTP_PORT

3000

HTTP port.

MCP_HTTP_TOKEN

unset

Bearer token (16+ chars); required off loopback, and for writes over HTTP.

LOG_LEVEL

info

debug, info, warn or error. Logs go to stderr only.

EXPLORER_API_URL

unset

Enables the explorer tools. Testnet: https://elysium.kinetiq.xyz/api/v2.

EXPLORER_TIMEOUT_MS

10000

Timeout per explorer request.

EXPLORER_RETRY_COUNT

2

Retries for explorer timeouts, connection errors, 408/429/5xx; honours Retry-After.

EXPLORER_RATE_LIMIT_RPS

5

Client-side explorer requests per second.

ENABLE_WRITES

false

Registers the write tools; needs ELYSIUM_PRIVATE_KEY and chain ID 99801.

ELYSIUM_PRIVATE_KEY

unset

Key the write tools send from (64 hex chars). Never logged or returned.

MAX_SEND_HYPE

0.01

Most HYPE one write may send, else VALUE_CAP_EXCEEDED.

MAX_FEE_HYPE

0.001

Most one write may cost in fees, else FEE_CAP_EXCEEDED.

WRITE_ALLOWLIST

unset

Comma-separated destinations; when set, others get ADDRESS_NOT_ALLOWED.

WRITE_RECEIPT_TIMEOUT_MS

30000

How long a write waits for its receipt before returning pending.

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 is 99801. 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_run defaults to true. Each attempt writes one write-audit log 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.

Licence

MIT

Available Tools

8 tools
get_balanceGet balanceA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
blockNoBlock to read at. Defaults to latest. An integer block number or a tag: latest, safe, finalized, earliest, pending.
tokensNoERC-20 token contract addresses to read balances for (max 20).
addressYesAccount or contract whose balances to read. 0x followed by 40 hex characters.

Output Schema

ParametersJSON Schema
NameRequiredDescription
nativeYes
tokensYes
addressYes

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 blockA
Read-onlyIdempotent

Fetch a block by number, hash or tag. Returns header fields and transaction hashes (or full transactions).

ParametersJSON Schema
NameRequiredDescriptionDefault
blockNoBlock number, 32-byte block hash, or tag (latest, safe, finalized, earliest, pending). Defaults to latest.
includeTransactionsNoReturn full transaction objects instead of hashes. Defaults to false.

Output Schema

ParametersJSON Schema
NameRequiredDescription
blockYesBlock fields as returned by the node. Integers are decimal strings. Arbitrum-specific fields (e.g. l1BlockNumber, sendRoot) are passed through.
timestampIsoYes
transactionCountYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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 statusA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
sampleSizeNoHow many recent blocks to measure block time over. Defaults to BLOCK_TIME_SAMPLE_SIZE (1000).

Output Schema

ParametersJSON Schema
NameRequiredDescription
chainIdYes
gasPriceYesNode-suggested gas price (eth_gasPrice).
blockTimeYes
chainNameYes
latestBlockYes
baseFeePerGasYesMinimum per-gas fee for the next block, from the latest block.

TDQS

A3.6/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 logsA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
abiNoOptional 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)"].
argsNoValues for indexed event parameters, by name, e.g. {"from": "0x..."}. A list of values means "any of". Requires event.
eventNoEvent 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.
limitNoMaximum logs to return (default 1000). The response says if results were truncated.
topicsNoRaw topic filter (alternative to event): position-matched 32-byte hex values, a list for "any of", or null for wildcard.
addressNoContract address, or a list of up to 20, that emitted the logs.
toBlockNoLast block (inclusive): a number or tag. Defaults to latest.
fromBlockYesFirst block (inclusive): a number or tag (latest, safe, finalized, earliest).

Output Schema

ParametersJSON Schema
NameRequiredDescription
logsYes
countYesNumber of logs returned.
toBlockYes
fromBlockYes
truncatedYes
totalMatchedYesNumber of logs the node returned before applying limit.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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 infoA
Read-onlyIdempotent

Read an ERC-20 token's name, symbol, decimals and total supply. Fields the contract does not implement are null.

ParametersJSON Schema
NameRequiredDescriptionDefault
blockNoBlock to read at. Defaults to latest. An integer block number or a tag: latest, safe, finalized, earliest, pending.
tokenYesERC-20 token contract address. 0x followed by 40 hex characters.

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
tokenYes
symbolYes
decimalsYes
totalSupplyYesraw is in the token's smallest unit; formatted applies decimals.

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 transactionA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
abiNoOptional 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)"].
hashYesTransaction hash: 0x followed by 64 hex characters.

Output Schema

ParametersJSON Schema
NameRequiredDescription
feeYesgasUsed × effectiveGasPrice. null while pending or if the node reports no effectiveGasPrice.
logsYes
noteNo
valueYes
statusYes
receiptYesReceipt fields without logs (see logs). Arbitrum fields such as gasUsedForL1 are passed through.
transactionYesTransaction fields. Integers are decimal strings.
decodedInputYesDecoded call data, if an ABI was supplied and contains the called function.
transactionTypeYesFrom 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).
systemTransactionYesTrue for ArbOS internal transactions (type 106).

TDQS

A4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 contractA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
abiYesABI 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)"].
argsNoFunction 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.
blockNoBlock to read at. Defaults to latest. An integer block number or a tag: latest, safe, finalized, earliest, pending.
addressYesContract address. 0x followed by 40 hex characters.
functionNameYesName of the function to call.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYesDecoded return value. Integers are decimal strings; multiple outputs are an array or object.
addressYes
signatureYesThe resolved function signature, e.g. balanceOf(address).
functionNameYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 callA
Read-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.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYesRecipient or contract address. 0x followed by 40 hex characters.
abiNoABI 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)"].
argsNoFunction 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.
dataNoRaw call data (0x-hex). Use this or abi + functionName.
fromNoSender 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.
blockNoBlock state to simulate against. Defaults to latest. An integer block number or a tag: latest, safe, finalized, earliest, pending.
valueNoHYPE to send, in wei (1 HYPE = 10^18 wei), as a decimal or 0x-hex string. Defaults to 0.
functionNameNoFunction to call. Requires abi.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoNode error message if the call failed for a reason other than a revert (e.g. insufficient funds).
revertNoWhy the call would fail, if it reverted.
successYes
gasPriceYes
signatureNo
returnDataYesRaw return data from eth_call, if it succeeded.
gasEstimateYesGas units from eth_estimateGas; includes the parent-chain data cost on Arbitrum chains.
estimatedFeeYesgasEstimate × current gas price. An estimate, not a guarantee.
decodedResultNoDecoded return value, when abi + functionName were given.
gasEstimateErrorNo

TDQS

A3.9/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

  1. 8 tool updatesv0.1.1
    • First observedget_balance
    • First observedget_block
    • First observedget_chain_status
    • First observedget_logs
    • First observedget_token_info
    • First observedget_transaction
    • First observedread_contract
    • First observedsimulate_call

TDQS

A4/5.0

Scored across 8 tools

Disambiguation4/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables 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.
    -
  • A
    license
    A
    quality
    A
    maintenance
    Provides 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.
    12
    1
    MIT