Skip to main content
Glama
franckyo
by franckyo

evm-recon-mcp

Give your AI assistant the ability to read deployed smart contracts.

An MCP server for EVM contract reconnaissance: fetch bytecode, disassemble it, detect invalid jump targets, read storage slots, derive Solidity storage layouts, and decode calldata — on any EVM chain, with no API key.

Built for security researchers, auditors, and CTF players who keep hitting the same wall: the contract is unverified, there's no source, and you need to understand what it actually does.

Read-only by design. No private keys, no signing, no transactions.


Install

npx evm-recon-mcp

Claude Code:

claude mcp add evm-recon -- npx -y evm-recon-mcp

Claude Desktop — add to claude_desktop_config.json:

{
  "mcpServers": {
    "evm-recon": { "command": "npx", "args": ["-y", "evm-recon-mcp"] }
  }
}

Requires Node 18+.


Related MCP server: Onchain MCP Server

The part you can't get elsewhere: invalid jump detection

Most disassemblers print opcodes. This one also tells you which jumps cannot land.

In the EVM, jumping to anything that isn't a JUMPDEST is an exceptional halt — the call reverts and consumes all gas. When a PUSH is immediately followed by JUMP/JUMPI, the target is statically known, so it can be checked. Hand-written assembly and puzzle contracts get this wrong constantly, sometimes deliberately.

=== 0x60055600005b00
0000: PUSH1 0x05
0002: JUMP
0003: STOP
0004: STOP
0005: JUMPDEST
0006: STOP

All statically-resolvable jump targets are valid JUMPDESTs.

Change the push by one byte:

=== 0x60045600005b00
0000: PUSH1 0x04
0002: JUMP
...

!! 1 INVALID JUMP TARGET(S) — these revert if taken:
   pc 0x0002 JUMP -> 0x4: target is STOP, not JUMPDEST — taking this jump
   halts exceptionally (reverts, consumes all gas)

That single line is often the whole answer to "why does this always revert?"

The decoder also skips PUSH immediate data correctly, so a 0x5b byte sitting inside push data is not mistaken for a jump destination — a classic source of wrong disassembly.


Tools

Tool

What it does

get_bytecode

Fetch deployed runtime bytecode (eth_getCode)

disassemble

Disassemble an address or raw hex, with PC offsets + invalid-jump analysis

read_storage

Read a raw storage slot (eth_getStorageAt), with uint/address interpretations

compute_storage_slot

Derive mapping, nested mapping, array, and hand-rolled keccak(words) slots

decode_calldata

Split calldata into selector + 32-byte words, name known selectors

function_selector

Compute 4-byte selectors from canonical signatures

eth_call

Simulate a read-only call; reports returned vs reverted

list_chains

List built-in chains

Storage slot derivation

Reading an unverified contract's state means knowing where the state lives:

  • mappingkeccak256(pad32(key) . pad32(slot))

  • nested_mapping — applied left to right for mapping(a => mapping(b => c))

  • arraykeccak256(pad32(slot)) + index

  • keccak_wordskeccak256 over concatenated 32-byte words, which is what hand-written assembly does when it MSTOREs values and hashes the region. Compiler-generated layouts don't cover this; hand-rolled ones need it.


Chains

Built in: ethereum, sepolia, holesky, polygon, polygon-amoy, arbitrum, optimism, base, base-sepolia, bsc, avalanche, gnosis, scroll, linea.

Any other network works by passing rpc_url directly. Each chain has multiple public endpoints and fails over automatically, so a single dead RPC doesn't stop you.


Example prompts

Disassemble 0x… on Base and tell me whether any jump target is invalid.

This contract is unverified. Read storage slot 0 and slot 1, and tell me what they probably are.

What's the storage slot for balances[0xd8dA…] if balances is at slot 2?

Decode this calldata and tell me which function it calls.


Safety

Every tool is read-only. The server never signs, never broadcasts, and never asks for a private key. eth_call is a simulation — nothing reaches the chain.

Public RPC endpoints see the addresses you query and your IP. For sensitive work, pass your own rpc_url.


License

MIT

Available Tools

8 tools
compute_storage_slotDerive a Solidity storage slotB
Read-only

Derive storage slots. kind=mapping: keccak256(pad32(key).pad32(slot)). kind=nested_mapping: applied left to right. kind=array: keccak256(pad32(slot))+index. kind=keccak_words: keccak256 over concatenated 32-byte words, which is what hand-written assembly does when it MSTOREs values and hashes the region. kind=keccak_utf8 / keccak_hex: plain hashing.

ParametersJSON Schema
NameRequiredDescriptionDefault
keyNoKey, for kind=mapping.
keysNoKeys outermost-first, for kind=nested_mapping.
kindYes
slotNoBase slot, for mapping/nested_mapping/array.
indexNoElement index, for kind=array.
inputNoString for keccak_utf8, or hex for keccak_hex.
wordsNoValues to pad to 32 bytes and hash, for kind=keccak_words.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=true, so the description doesn't need to restate safety. It adds useful behavioral context by explaining the exact hashing formulas for each kind, including the note that keccak_words matches hand-written assembly MSTORE behavior. However, it doesn't disclose edge cases like whether keys are left-padded or right-padded, or what happens with invalid input.

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?

The description is compact and front-loaded with the core purpose ('Derive storage slots'), then efficiently enumerates the kinds. Each kind's formula is stated in a single clause. The only minor issue is that the list of kinds is dense and could be slightly more scannable, but it earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a computation tool with readOnlyHint=true and no output schema, the description covers the main formulas but leaves gaps: it doesn't specify the expected input format (hex vs decimal), the output format (32-byte hex?), or how nested_mapping ordering maps to the 'keys' array. These are important for an agent to call it correctly without guessing.

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 86%, so the schema already documents most parameters. The description adds meaning by explaining the formulas that connect parameters (e.g., pad32(key).pad32(slot) for mapping), which goes beyond the schema. However, it doesn't clarify the exact format of key/slot strings (hex? decimal?) or how nested_mapping applies left to right in terms of parameter order.

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 states a specific verb ('Derive') and resource ('Solidity storage slot'), and enumerates the supported kinds, which distinguishes it from sibling tools like read_storage or eth_call. However, it doesn't explicitly name a sibling alternative or contrast itself, so it's clear but not fully differentiated.

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 implies usage by listing the kinds and their formulas, but it doesn't explicitly state when to use this tool vs alternatives like read_storage. It provides no exclusions or conditions, so an agent must infer that this is for computing slots rather than reading them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

decode_calldataDecode raw calldataA
Read-only

Split calldata into a 4-byte selector and 32-byte words, flag word values that look like addresses, and name the function when the selector is a well-known one.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesCalldata hex.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses meaningful behavioral detail beyond the readOnlyHint annotation: it explains that the output consists of a selector, 32-byte words, address-like flags, and possibly a function name. This gives the agent a clear mental model of what the tool computes, though edge-case behavior is not covered.

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?

A single, well-structured sentence that front-loads the core action and uses no filler. Every clause contributes specific operational detail, making it compact and immediately useful.

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?

For a simple one-parameter, read-only tool, the description covers the main output behavior well. It omits guidance on malformed or non-word-aligned calldata, but given the low complexity and the readOnlyHint annotation, the definition is largely sufficient.

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% and the schema already describes 'data' as 'Calldata hex.' The description adds value by explaining how the data is interpreted—split into a 4-byte selector and 32-byte words—which clarifies what kind of input is expected beyond a generic hex string.

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 ('Split'), a precise resource ('calldata'), and detailed behaviors: extracting the 4-byte selector, splitting into 32-byte words, flagging address-like words, and naming known functions. This clearly differentiates it from siblings like function_selector and disassemble.

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 about when to use this tool versus siblings such as function_selector or eth_call. The intended use is only implied by the operational description, and no alternatives or exclusions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

disassembleDisassemble EVM bytecodeA
Read-only

Disassemble bytecode into opcodes with program counters. Supply either an on-chain address or a raw hex string. Crucially, this also validates statically-resolvable jump targets: a PUSH followed immediately by JUMP/JUMPI whose target is not a JUMPDEST will halt exceptionally at runtime (revert, all gas consumed). Those are reported separately as invalidJumps — a common intentional trap in CTF and puzzle contracts, and a real bug in hand-written assembly.

ParametersJSON Schema
NameRequiredDescriptionDefault
chainNoChain name. One of: ethereum, sepolia, holesky, polygon, polygon-amoy, arbitrum, optimism, base, base-sepolia, bsc, avalanche, gnosis, scroll, lineaethereum
addressNoContract address to fetch and disassemble.
rpc_urlNoCustom JSON-RPC URL. Overrides `chain`; use for private or unlisted networks.
bytecodeNoRaw bytecode hex, as an alternative to address.
max_linesNoMax instructions to print.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint and openWorldHint annotations, the description discloses significant extra behavior: it validates statically-resolvable jump targets, reports invalid jumps separately as `invalidJumps`, and explains the runtime consequence (revert, all gas consumed). This is genuinely useful context that 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 dense sentences with no filler: purpose, input modes, then the critical caveat about jump targets. The most important operational detail is front-loaded, and every sentence earns its place.

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?

There is no output schema, so the description carries the burden of explaining the return shape. It names 'opcodes with program counters' and the `invalidJumps` field, which is enough for an agent to call the tool and interpret results. It could specify the full response structure or error behavior, but overall completeness is strong.

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 the baseline is 3. The description adds meaning beyond the schema by clarifying that `address` and `bytecode` are alternative inputs and that bytecode is a 'raw hex string.' This helps disambiguate the optional parameters, though it does not detail every parameter.

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 and resource: 'Disassemble bytecode into opcodes with program counters.' It also distinguishes the tool from siblings like get_bytecode (raw fetch) and decode_calldata (calldata decoding) by explicitly describing opcode-level output plus jump validation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear invocation context: 'Supply either an on-chain address or a raw hex string.' This tells the agent the two valid input modes. It does not explicitly name when-not-to-use or alternative sibling tools, but the context is clear enough for a read-only disassembly task.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

eth_callSimulate a read-only callA
Read-only

Simulate a call with eth_call and report whether it returned or reverted. Nothing is broadcast and no key is used. Useful for probing which calldata and value combinations a contract accepts.

ParametersJSON Schema
NameRequiredDescriptionDefault
toYes
dataNoCalldata hex.0x
fromNo
blockNo
chainNoChain name. One of: ethereum, sepolia, holesky, polygon, polygon-amoy, arbitrum, optimism, base, base-sepolia, bsc, avalanche, gnosis, scroll, lineaethereum
valueNoWei, as hex or decimal.
rpc_urlNoCustom JSON-RPC URL. Overrides `chain`; use for private or unlisted networks.

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds behavioral insight beyond annotations: 'Nothing is broadcast and no key is used' reinforces the read-only nature and explains the absence of state changes. It also reveals the tool's behavior of reporting whether the call reverted, which is useful. However, it doesn't mention error cases or edge conditions like invalid calldata, but this is minor given 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?

The description is two sentences, front-loads the primary action and outcome, and adds the safety note. Every sentence earns its place: the first states the result, the second gives usage context. No fluff.

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?

Given the tool has 7 parameters, no output schema, and moderate schema coverage, the description covers the main use case and outcome. It doesn't list all parameter interactions, but for a simulation tool with readOnlyHint=true, an agent can infer that it is a safe probe. The description could benefit from noting that the call is executed in a simulated environment and may not reflect actual future state, but this is a minor gap.

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 57%, meaning some parameters (to, from, block, value) lack descriptions. The overall description mentions 'calldata and value combinations', which hints at the relevance of data and value parameters. It does not add detail on 'to', 'from', 'block', or 'value' beyond schema, but the description's mention of probing combinations partially compensates. Since coverage is moderate, the description adds moderate value but could provide more per-parameter explanation.

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 clearly states the tool performs a read-only eth_call simulation and reports success/revert status, distinguishing it from mutation tools. It specifies the verb 'Simulate', the resource 'call', and the output (returned or reverted). It names the sibling tools that serve similar but distinct purposes (like get_bytecode, read_storage), helping an agent differentiate.

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?

The description explicitly states when to use this tool: 'Useful for probing which calldata and value combinations a contract accepts.' It implicitly warns against using it when actual transaction execution is desired, since it says nothing is broadcast and no key is used. It doesn't explicitly mention alternatives, but the sibling context provides the differentiation. This is strong guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

function_selectorCompute function selectorsA
Read-only

Compute 4-byte selectors from canonical signatures, e.g. transfer(address,uint256).

ParametersJSON Schema
NameRequiredDescriptionDefault
signaturesYesCanonical signatures, no argument names or spaces.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already set readOnlyHint=true, so the safety profile is covered. The description adds that this is a pure computation ('Compute') but does not discuss error behavior, invalid-signature handling, or output formatting. It is coherent with annotations and provides no contradicting information, but adds limited behavioral context beyond what annotations provide.

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?

The entire description is a single sentence with an illustrative example and zero filler. The core action and input type are front-loaded, making it easy to parse quickly.

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?

For a simple read-only compute tool, the description is mostly complete: it names the input format and the output concept (4-byte selectors). However, since there is no output schema, it does not specify whether selectors are returned as hex strings with a '0x' prefix or in some other encoding. This is a minor gap for such a straightforward utility.

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?

The input schema already documents the 'signatures' parameter with 'Canonical signatures, no argument names or spaces,' giving 100% coverage. The description's example reinforces the expected format but does not add meaning beyond the schema, so the baseline score of 3 is appropriate.

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 opens with the specific verb 'Compute' and resource '4-byte selectors from canonical signatures,' making the tool's function immediately unambiguous. The example 'transfer(address,uint256)' anchors the expected input and clearly distinguishes this from siblings like decode_calldata or compute_storage_slot.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a concrete example and specifies the input as 'canonical signatures,' which implies when this tool is appropriate. It does not explicitly name alternatives or exclusions, but the narrow scope leaves little ambiguity; an agent can infer this is for signature-to-selector conversion and not for decoding calldata or reading storage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_bytecodeFetch deployed bytecodeA
Read-only

Fetch a contract's deployed runtime bytecode via eth_getCode. Returns size and hex. Empty result means the address is an EOA or has no code.

ParametersJSON Schema
NameRequiredDescriptionDefault
blockNoBlock tag or number. Default 'latest'.
chainNoChain name. One of: ethereum, sepolia, holesky, polygon, polygon-amoy, arbitrum, optimism, base, base-sepolia, bsc, avalanche, gnosis, scroll, lineaethereum
addressYesContract address (0x...)
rpc_urlNoCustom JSON-RPC URL. Overrides `chain`; use for private or unlisted networks.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnlyHint and openWorldHint. The description adds behavioral detail beyond annotations: it invokes eth_getCode, returns size and hex, and explains that an empty result means the address is an EOA or has no code.

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 front-load the action and resource, then add return shape and an important edge-case interpretation. No wasted words or redundant restatement of schema fields.

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?

For a read-only tool with complete schema descriptions and no output schema, the description covers core invocation and return interpretation. It could specify the exact representation of 'size and hex' more precisely, but that is a minor gap.

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 all parameters. The description adds no extra parameter-level guidance, leaving the baseline of 3 appropriate.

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 uses a specific verb ('Fetch') and resource ('contract's deployed runtime bytecode'), names the underlying method eth_getCode, and notes return content and empty-result meaning. This clearly distinguishes it from siblings like read_storage or disassemble.

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 purpose implies when to use it: when you need deployed runtime bytecode. However, it does not explicitly contrast it with sibling tools such as disassemble or eth_call, nor does it state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_chainsList supported chainsA
Read-only

List built-in EVM chains with their chain IDs and explorers. Any other network works by passing rpc_url.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The readOnlyHint annotation already declares the tool as read-only, and the description adds behavioral context by stating it lists chain IDs and explorers, and that custom networks are handled elsewhere. This supplements the annotation without contradiction.

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, both directly useful. The first states the core function, the second clarifies a related behavior (custom networks) without verbosity. No wasted words.

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?

Given zero parameters, no output schema, and a readOnlyHint, the description fully covers what an agent needs: what the tool returns (chain IDs and explorers) and the important note that custom networks are handled via rpc_url elsewhere. Nothing essential is missing for a simple listing tool.

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?

The tool has zero parameters, so the baseline is 4. The description adds value by specifying what the output contains (chain IDs and explorers), which is the only semantic needed for a parameterless listing tool.

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 uses a specific verb (List) and resource (built-in EVM chains) and specifies the key output fields (chain IDs and explorers). It clearly distinguishes itself from the sibling tools, which are all about code analysis or execution, not chain enumeration.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool: when you need to know which built-in chains are available. It also notes that custom networks don't require listing ('Any other network works by passing rpc_url'), which prevents misuse. However, it does not explicitly name an alternative or state when not to use it, but the purpose itself is self-explanatory.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_storageRead a contract storage slotA
Read-only

Read a raw storage slot via eth_getStorageAt. Returns the 32-byte word plus uint and address interpretations.

ParametersJSON Schema
NameRequiredDescriptionDefault
slotYesSlot as hex (0x...) or decimal.
blockNo
chainNoChain name. One of: ethereum, sepolia, holesky, polygon, polygon-amoy, arbitrum, optimism, base, base-sepolia, bsc, avalanche, gnosis, scroll, lineaethereum
addressYes
rpc_urlNoCustom JSON-RPC URL. Overrides `chain`; use for private or unlisted networks.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark the operation read-only and open-world; the description adds useful context by naming eth_getStorageAt and specifying the return shape: a 32-byte word plus uint and address interpretations. It does not discuss block defaulting or edge cases, but it meaningfully extends the annotation-only information.

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?

The description is a single front-loaded sentence: the first clause names the action, resource, and RPC method, and the second specifies the return format. There is no filler or redundant restatement of the tool name.

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?

For a read-only storage getter with two required parameters, the description plus schema provides the essential information: address, slot, chain, RPC override, and the expected return values. The main missing context is the semantics of the optional block parameter and explicit guidance on sibling alternatives, but these are relatively minor gaps.

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?

The schema documents slot, chain, and rpc_url, but address and block have no descriptions. The description does not clarify the ambiguous block parameter or add per-parameter meaning; it mainly reinforces the operation-level behavior. With 60% schema coverage, this is adequate but leaves gaps unaddressed.

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 states a specific operation ('Read a raw storage slot via eth_getStorageAt') and identifies the resource as contract storage. It distinguishes itself from siblings like get_bytecode or eth_call by emphasizing raw storage and naming the exact RPC method.

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 use read_storage versus compute_storage_slot, eth_call, or get_bytecode. The description does not mention alternatives, exclusions, or conditions, so the agent must infer usage from the sibling list and tool name.

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.0
    • First observedcompute_storage_slot
    • First observeddecode_calldata
    • First observeddisassemble
    • First observedeth_call
    • First observedfunction_selector
    • First observedget_bytecode
    • First observedlist_chains
    • First observedread_storage

TDQS

A4/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a distinct recon activity: chains, bytecode, disassembly, storage slots, slot derivation, calldata decoding, selector computation, and call simulation. No two tools overlap in purpose; even the selector-related tools (decode_calldata and function_selector) serve clearly different functions.

Naming Consistency4/5

Most tools follow a verb_noun pattern (list_chains, get_bytecode, read_storage, compute_storage_slot, decode_calldata). Minor deviations exist with disassemble (bare verb) and function_selector (noun form), but these are still readable and do not introduce confusion.

Tool Count5/5

8 tools is well-scoped for EVM reconnaissance. Each tool earns its place and covers a distinct layer of contract analysis without redundancy or sprawl.

Completeness4/5

The set covers the core recon workflow: fetch bytecode, disassemble/validate, inspect storage, derive slots, decode calldata, compute selectors, and simulate calls. Minor gaps exist (e.g., no balance/transaction fetching), but they are outside the apparent specialization of smart-contract reconnaissance.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides tools for querying onchain data across 12+ blockchain networks, including token balances, transaction analysis, and smart contract security auditing. It enables users to interact with multiple EVM-compatible chains and perform deep contract evaluations through natural language interfaces.
    1
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to resolve smart contract ABIs, read, encode, simulate, and prepare transactions across multiple blockchains via a REST API or MCP server, with no signing required.
    -
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI assistants to audit Solidity smart contracts for security vulnerabilities, fetch verified source code from block explorers, decode calldata, and estimate gas costs across major EVM networks.
    4
    MIT