Skip to main content
Glama

Infura MCP Server

A Model Context Protocol (MCP) server that connects AI assistants to 30+ blockchain networks through Infura's infrastructure. Query blocks, transactions, smart contracts, and accounts across Ethereum, Polygon, Arbitrum, Base, Avalanche, BNB Chain, and more using natural language.

What is This?

This server implements the Model Context Protocol (MCP), an open standard for connecting AI assistants to external data sources. MCP enables AI models to execute tools and access real-time data in a secure, structured way.

Why use this server?

  • Query live blockchain data directly from AI assistants (Claude, Cursor, VS Code Copilot)

  • No Web3 library setup required - just configure and start asking questions

  • All 29 tools are read-only and never modify blockchain state

  • Built-in security features protect against common vulnerabilities

Related MCP server: CryptoQuant MCP Server

Features

29 JSON-RPC Tools - Complete blockchain query suite for accounts, blocks, transactions, smart contracts, logs, and network data. All tools include MCP annotations (readOnlyHint, idempotentHint, etc.) for AI-optimized behavior. Optional response_format: "markdown" parameter for human-readable output.

30+ Networks - EVM-compatible chains including Ethereum mainnet/testnets, Layer 2 solutions (Arbitrum, Base, Optimism, Polygon, Linea, Scroll, ZKsync), and alternative L1s (Avalanche, BNB Chain, Celo, Starknet).

Enterprise-Grade Security - Configurable CORS, DNS rebinding protection, rate limiting, session management, input validation, and request/response size limits.

Flexible Deployment - Stdio mode for desktop integration or Streamable HTTP for web applications.

Quick Start

  1. Get your Infura API key from the MetaMask Developer Portal

  2. Choose your integration method below

  3. Restart your AI client and start querying blockchain data

Claude Desktop

Config file location:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

  • Windows: %APPDATA%\Claude\claude_desktop_config.json

How to access: Claude menu → Settings → Developer → Edit Config

{
  "mcpServers": {
    "infura": {
      "command": "npx",
      "args": ["-y", "infura-mcp-server"],
      "env": {
        "INFURA_API_KEY": "<YOUR_API_KEY>",
        "INFURA_NETWORK": "mainnet"
      }
    }
  }
}

After saving, quit and restart Claude Desktop completely. Look for the MCP server indicator (hammer icon) in the bottom-right of the chat input.

Cursor

Config file location:

  • Global: ~/.cursor/mcp.json

  • Project: .cursor/mcp.json in project root

How to access: Settings → Cursor Settings → MCP → Add new MCP server

{
  "mcpServers": {
    "infura": {
      "command": "npx",
      "args": ["-y", "infura-mcp-server"],
      "env": {
        "INFURA_API_KEY": "<YOUR_API_KEY>",
        "INFURA_NETWORK": "mainnet"
      }
    }
  }
}

Using environment variables (recommended for security):

{
  "mcpServers": {
    "infura": {
      "command": "npx",
      "args": ["-y", "infura-mcp-server"],
      "env": {
        "INFURA_API_KEY": "${env:INFURA_API_KEY}",
        "INFURA_NETWORK": "mainnet"
      }
    }
  }
}

Claude Code (CLI)

One-line install:

claude mcp add infura --transport stdio --env INFURA_API_KEY=<YOUR_API_KEY> -- npx -y infura-mcp-server

With network selection:

claude mcp add infura --transport stdio \
  --env INFURA_API_KEY=<YOUR_API_KEY> \
  --env INFURA_NETWORK=polygon-mainnet \
  -- npx -y infura-mcp-server

Scope options:

  • --scope local (default): Available only in current project

  • --scope user: Available across all your projects

  • --scope project: Shared with team via .mcp.json

Verify installation:

claude mcp list        # List configured servers
claude mcp get infura  # Check server details

Inside Claude Code, use /mcp to check server status.

VS Code

Quick install: NPX

Or manually add to User Settings (JSON) or .vscode/mcp.json:

{
  "mcp": {
    "servers": {
      "infura": {
        "command": "npx",
        "args": ["-y", "infura-mcp-server"],
        "env": {
          "INFURA_API_KEY": "<YOUR_API_KEY>"
        }
      }
    }
  }
}

Docker

Add to your MCP client config:

{
  "mcpServers": {
    "infura": {
      "command": "docker",
      "args": [
        "run", "--rm", "-i",
        "-e", "INFURA_API_KEY=<YOUR_API_KEY>",
        "-e", "INFURA_NETWORK=mainnet",
        "ghcr.io/qbandev/infura-mcp-server:latest"
      ]
    }
  }
}

HTTP Mode (Web Deployments)

npm run start:http
# Endpoints: http://localhost:3001/mcp (main) | http://localhost:3001/health

For HTTP/SSE clients (Cursor remote servers):

{
  "mcpServers": {
    "infura": {
      "url": "http://localhost:3001/mcp"
    }
  }
}

Configuration

Environment Variables

Variable

Required

Default

Description

INFURA_API_KEY

Yes

-

Your Infura API key from MetaMask Developer Portal

INFURA_NETWORK

No

mainnet

Target blockchain network (see Supported Networks)

DEBUG

No

false

Enable debug logging

PORT

No

3001

HTTP server port (HTTP mode only)

Security Configuration (HTTP Mode)

Variable

Default

Description

CORS_ALLOWED_ORIGINS

http://localhost:3000,http://localhost:3001,http://127.0.0.1:3000

Comma-separated list of allowed CORS origins

ALLOWED_HOSTS

localhost,127.0.0.1

Comma-separated list of allowed Host headers (DNS rebinding protection)

SESSION_TIMEOUT_MS

1800000 (30 min)

Session timeout in milliseconds

MAX_SESSIONS

1000

Maximum concurrent sessions

Available Tools

Account and Balance (3 tools)

  • eth_getBalance - Get ETH balance of an address

  • eth_getCode - Get contract bytecode at an address

  • eth_getTransactionCount - Get transaction count (nonce) for an address

Blocks (7 tools)

  • eth_blockNumber - Get the latest block number

  • eth_getBlockByHash - Get block by its hash

  • eth_getBlockByNumber - Get block by number

  • eth_getBlockTransactionCountByHash - Get transaction count in a block by hash

  • eth_getBlockTransactionCountByNumber - Get transaction count in a block by number

  • eth_getUncleCountByBlockHash - Get uncle count by block hash

  • eth_getUncleCountByBlockNumber - Get uncle count by block number

Transactions (6 tools)

  • eth_getTransactionByHash - Get transaction details by hash

  • eth_getTransactionByBlockHashAndIndex - Get transaction by block hash and index

  • eth_getTransactionByBlockNumberAndIndex - Get transaction by block number and index

  • eth_getTransactionReceipt - Get transaction receipt (logs, status, gas used)

  • eth_getUncleByBlockHashAndIndex - Get uncle block by hash and index

  • eth_getUncleByBlockNumberAndIndex - Get uncle block by number and index

Smart Contracts (3 tools)

  • eth_call - Execute a read-only contract call

  • eth_estimateGas - Estimate gas for a transaction

  • eth_getStorageAt - Read storage slot from a contract

Logs (1 tool)

  • eth_getLogs - Query contract event logs with filtering (supports pagination for large result sets)

Network Info (5 tools)

  • eth_chainId - Get the chain ID

  • net_version - Get the network version

  • net_listening - Check if node is listening for connections

  • net_peerCount - Get number of connected peers

  • web3_clientVersion - Get the client version string

Gas and Fees (4 tools)

  • eth_gasPrice - Get current gas price

  • eth_feeHistory - Get historical fee data (EIP-1559)

  • eth_protocolVersion - Get the Ethereum protocol version

  • eth_syncing - Get sync status of the node

All tools include enhanced descriptions with Args, Returns, Examples, and Errors sections for better AI understanding.

Supported Networks

Access 30+ networks across 18 blockchain ecosystems. Set your target using INFURA_NETWORK.

Category

Networks

Ethereum

mainnet, sepolia, holesky

Arbitrum

arbitrum-mainnet, arbitrum-sepolia

Base

base-mainnet, base-sepolia

Optimism

optimism-mainnet, optimism-sepolia

Polygon

polygon-mainnet, polygon-amoy

Linea

linea-mainnet, linea-sepolia

ZKsync

zksync-mainnet, zksync-sepolia

Scroll

scroll-mainnet, scroll-sepolia

Blast

blast-mainnet, blast-sepolia

Mantle

mantle-mainnet, mantle-sepolia

Avalanche

avalanche-mainnet, avalanche-fuji

BNB Chain

bsc-mainnet, bsc-testnet

opBNB

opbnb-mainnet, opbnb-testnet

Celo

celo-mainnet, celo-alfajores

Palm

palm-mainnet, palm-testnet

Starknet

starknet-mainnet, starknet-sepolia

Swellchain

swellchain-mainnet, swellchain-testnet

Unichain

unichain-mainnet, unichain-sepolia

See complete network documentation.

Usage Examples

Once configured, ask your AI assistant natural language questions:

Cursor Chat with Infura MCP

Common queries:

  • "What is the ETH balance of vitalik.eth?"

  • "Show me the latest block on Ethereum mainnet"

  • "Get the transaction receipt for 0x..."

  • "What is the current gas price on Polygon?"

  • "Read the storage at slot 0 of this contract"

  • "Compare gas prices across Ethereum, Arbitrum, and Base"

The AI automatically selects the appropriate tools and provides contextual insights.

Tool parameters:

  • Use response_format: "markdown" for formatted, human-readable output

  • Use page and pageSize with eth_getLogs to paginate large result sets

Architecture

+------------------+     +-------------------+     +------------------+
|   AI Assistant   | <-> |  Infura MCP       | <-> |  Infura API      |
| (Claude, Cursor) |     |  Server           |     |  (30+ networks)  |
+------------------+     +-------------------+     +------------------+
                               |
                         +-----+-----+
                         |           |
                    Stdio Mode   HTTP Mode
                    (Desktop)    (Web/API)

Transport Modes:

  • Stdio (default): For desktop integrations (Claude Desktop, Cursor, VS Code). The AI client spawns the server as a subprocess and communicates via stdin/stdout.

  • Streamable HTTP: For web deployments and multi-client scenarios. Exposes /mcp endpoint with session management.

Security

Warning: Never commit API keys to version control. Use environment variables or secrets management.

Built-in Security Features

Input Validation

  • Required parameter validation: All tool inputs validated against strict patterns before execution

  • Ethereum addresses: 0x + 40 hex characters

  • Transaction/block hashes: 0x + 64 hex characters

  • Networks: Validated against allowlist to prevent URL injection

  • Local execution: Server runs locally with no external code execution

Request Protection (HTTP Mode)

  • Rate limiting: 100 requests per minute per IP address

  • CORS: Configurable origin allowlist via CORS_ALLOWED_ORIGINS

  • DNS rebinding protection: Host header validation via ALLOWED_HOSTS

  • Request body limit: 100KB maximum payload size

  • Response size limit: 100KB maximum response (CHARACTER_LIMIT)

  • Session management: Configurable timeout and maximum concurrent sessions

Network Security

  • All Infura API calls use HTTPS/TLS encryption

  • Read-only operations only - tools never modify blockchain state

  • No arbitrary code execution - only predefined JSON-RPC methods

  • Request identification via User-Agent header: infura-mcp-server/{version}

Security Headers (HTTP Mode)

  • X-Content-Type-Options: nosniff

  • X-Frame-Options: DENY

  • Content-Security-Policy: default-src 'none'

  • Referrer-Policy: no-referrer

  • Cache-Control: no-store

API Key Security

  • Store keys in environment variables, never in code or committed config files

  • Use separate API keys for development and production

  • Monitor usage via the MetaMask Developer Dashboard

  • Rotate keys periodically and revoke unused keys

  • Use Infura's allowlist feature to restrict key usage by domain or IP

Supply Chain Security

This package uses npm Trusted Publishing with OIDC and provenance attestations for supply chain integrity.

Error Handling

The server provides actionable error messages to help diagnose issues:

Error

Cause

Solution

INFURA_API_KEY not set

Missing environment variable

Set INFURA_API_KEY in your configuration

Authentication failed

Invalid or restricted API key

Verify key at MetaMask Dashboard

Rate limit exceeded

Too many requests

Wait 60 seconds, or upgrade your Infura plan

Invalid Ethereum address

Malformed address input

Use 0x followed by 40 hex characters

Invalid network

Unsupported network name

Check Supported Networks

Service unavailable (5xx)

Infura outage

Transient error - automatic retry with exponential backoff

Request timeout

Network congestion

Retry, or simplify the query

Retry Logic: Transient failures (HTTP 429, 5xx, network errors) are automatically retried up to 3 times with exponential backoff (1s, 2s, 4s). Rate limit responses respect the Retry-After header.

Common Pitfalls

  1. Forgetting to set INFURA_API_KEY - The most common issue. Verify the variable is exported in your shell or set in your MCP client config.

  2. Using wrong network name - Network names are case-sensitive and hyphenated (e.g., arbitrum-mainnet, not arbitrum or Arbitrum).

  3. Querying testnet data on mainnet - Transactions and addresses are network-specific. Set INFURA_NETWORK to match your data.

  4. Expecting real-time updates - MCP tools query on-demand. For continuous monitoring, make repeated queries.

  5. Large log queries timing out - Use specific block ranges and topic filters with eth_getLogs to limit result size.

  6. Committing API keys - Use .env files (add to .gitignore) or your IDE's secrets management.

Development

npm install              # Install dependencies
npm start                # Run in stdio mode
npm run start:http       # Run in HTTP mode
npm test                 # Run basic tests
npm run test:full        # Run all tests including HTTP transport
npm run list-tools       # List available tools

Run without installation:

npx infura-mcp-server --help    # Show available commands

Docker

npm run docker:build     # Build image
npm run docker:run       # Run in stdio mode
npm run docker:run:http  # Run in HTTP mode
npm run docker:compose:up    # Start with docker-compose (HTTP)
npm run docker:compose:down  # Stop containers

Troubleshooting

API key not working - Verify your key at the MetaMask Developer Dashboard

Network not supported - Check the Supported Networks list and verify spelling

Tool not responding - Restart your MCP client and verify configuration JSON syntax

Rate limit exceeded - Upgrade your Infura plan for higher limits, or wait 60 seconds

Connection refused (HTTP mode) - Check that ALLOWED_HOSTS includes your hostname

CORS errors (HTTP mode) - Add your origin to CORS_ALLOWED_ORIGINS

For detailed API documentation, see Infura docs. For bugs or feature requests, open a GitHub issue.

Contributing

Contributions are welcome! See CONTRIBUTING.md for guidelines.

License

MIT License - see LICENSE file for details.

Available Tools

29 tools
eth_callA

Execute a read-only smart contract call without creating a transaction.

Args:

  • to (string): Contract address to call (20-byte hex, e.g., '0x...').

  • data (string): ABI-encoded function call data (hex string starting with 0x).

  • network (string, optional): Ethereum network to query. Defaults to 'mainnet'.

Returns:

  • Hexadecimal string containing the return value of the executed contract method.

Examples:

  • "Read ERC20 balance": { "to": "0xdAC17F958D2ee523a2206206994597C13D831ec7", "data": "0x70a08231000000000000000000000000..." }

  • "Query on Sepolia": { "to": "0x...", "data": "0x...", "network": "sepolia" }

Errors:

  • InvalidParams: When 'to' address or 'data' format is invalid.

  • InternalError: When contract execution reverts or Infura API fails.

Inputs: to (required), data (required), network, response_format.

eth_chainIdA

Get the chain ID of an Ethereum network for EIP-155 transaction signing.

Args:

  • network (string, optional): Ethereum network to query. Defaults to 'mainnet'.

Returns:

  • Hexadecimal string representing the chain ID (e.g., '0x1' for mainnet, '0xaa36a7' for Sepolia).

Examples:

  • "Get mainnet chain ID": {}

  • "Get Sepolia chain ID": { "network": "sepolia" }

Errors:

  • InternalError: When Infura API is unavailable or returns an error.

Inputs: network, response_format.

eth_estimateGasA

Estimate the gas required to execute a transaction without broadcasting it.

Args:

  • from (string): Sender address (20-byte hex, e.g., '0x...').

  • to (string): Recipient address (20-byte hex, e.g., '0x...').

  • value (string): Amount to send in wei as hex (e.g., '0xde0b6b3a7640000' for 1 ETH).

  • network (string, optional): Ethereum network to query. Defaults to 'mainnet'.

Returns:

  • Hexadecimal string representing estimated gas units (e.g., '0x5208' for 21000 gas).

Examples:

  • "Estimate ETH transfer": { "from": "0xYourAddress", "to": "0xRecipient", "value": "0xde0b6b3a7640000" }

  • "Estimate on Sepolia": { "from": "0x...", "to": "0x...", "value": "0x0", "network": "sepolia" }

Errors:

  • InvalidParams: When address format or value format is invalid.

  • InternalError: When transaction would revert or Infura API fails.

Inputs: from (required), to (required), value (required), network, +1 more.

eth_getBalanceA

Get the ETH balance of an address at a specific block.

Args:

  • address (string): Ethereum address to check (20-byte hex, e.g., '0x...').

  • tag (string): Block reference - 'latest', 'earliest', or 'pending'.

  • network (string, optional): Ethereum network to query. Defaults to 'mainnet'.

Returns:

  • Hexadecimal string representing balance in wei (e.g., '0xde0b6b3a7640000' for 1 ETH).

Examples:

  • "Get current balance": { "address": "0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045", "tag": "latest" }

  • "Check Sepolia balance": { "address": "0x...", "tag": "latest", "network": "sepolia" }

Errors:

  • InvalidParams: When address format is invalid or tag is not recognized.

  • InternalError: When Infura API is unavailable or returns an error.

Inputs: address (required), tag, network, response_format.

eth_getBlockByHashA

Get detailed block information using its hash.

Args:

  • blockHash (string): 32-byte block hash (66 chars with 0x prefix).

  • fullTransactions (boolean): If true, returns full tx objects; if false, returns tx hashes only.

  • network (string, optional): Ethereum network to query. Defaults to 'mainnet'.

Returns:

  • Block object with number, hash, parentHash, transactions, gasUsed, timestamp, etc. Returns null if block not found.

Examples:

  • "Get block with tx hashes": { "blockHash": "0x...", "fullTransactions": false }

  • "Get block with full txs": { "blockHash": "0x...", "fullTransactions": true, "network": "mainnet" }

Errors:

  • InvalidParams: When blockHash format is invalid (not 66 char hex).

  • InternalError: When Infura API is unavailable or returns an error.

Inputs: blockHash (required), fullTransactions, network, response_format.

eth_getBlockByNumberA

Get detailed block information using its number or tag.

Args:

  • blockNumber (string): Block number as hex (e.g., '0x10d4f') or tag ('latest', 'earliest', 'pending').

  • fullTransactions (boolean): If true, returns full tx objects; if false, returns tx hashes only.

  • network (string, optional): Ethereum network to query. Defaults to 'mainnet'.

Returns:

  • Block object with number, hash, parentHash, transactions, gasUsed, timestamp, etc. Returns null if block not found.

Examples:

  • "Get latest block": { "blockNumber": "latest", "fullTransactions": false }

  • "Get specific block with full txs": { "blockNumber": "0x10d4f", "fullTransactions": true }

Errors:

  • InvalidParams: When blockNumber format is invalid.

  • InternalError: When Infura API is unavailable or returns an error.

Inputs: blockNumber (required), fullTransactions, network, response_format.

eth_getBlockNumberA

Fetch the latest block number from an Ethereum network.

Args:

  • network (string, optional): Ethereum network to query. Defaults to 'mainnet'.

Returns:

  • Hexadecimal string representing the current block number (e.g., '0x10d4f').

Examples:

  • "Get mainnet block number": {}

  • "Get Sepolia block number": { "network": "sepolia" }

Errors:

  • InternalError: When Infura API is unavailable or returns an error.

Inputs: network, response_format.

eth_getBlockTransactionCountByHashA

Get the number of transactions in a block identified by its hash.

Args:

  • blockHash (string): 32-byte block hash (66 chars with 0x prefix).

  • network (string, optional): Ethereum network to query. Defaults to 'mainnet'.

Returns:

  • Hexadecimal string representing transaction count (e.g., '0x10' for 16 transactions). Returns null if block not found.

Examples:

  • "Count txs in block": { "blockHash": "0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238" }

  • "Query Sepolia block": { "blockHash": "0x...", "network": "sepolia" }

Errors:

  • InvalidParams: When blockHash format is invalid (not 66 char hex).

  • InternalError: When Infura API is unavailable or returns an error.

Inputs: blockHash (required), network, response_format.

eth_getBlockTransactionCountByNumberA

Get the number of transactions in a block identified by its number or tag.

Args:

  • blockNumber (string): Block number as hex (e.g., '0x10d4f') or tag ('latest', 'earliest', 'pending').

  • network (string, optional): Ethereum network to query. Defaults to 'mainnet'.

Returns:

  • Hexadecimal string representing transaction count (e.g., '0x10' for 16 transactions). Returns null if block not found.

Examples:

  • "Count txs in latest block": { "blockNumber": "latest" }

  • "Count txs in specific block": { "blockNumber": "0x10d4f", "network": "mainnet" }

Errors:

  • InvalidParams: When blockNumber format is invalid.

  • InternalError: When Infura API is unavailable or returns an error.

Inputs: blockNumber (required), network, response_format.

eth_getCodeA

Get the deployed bytecode of a smart contract.

Args:

  • contractAddress (string): Contract address (20-byte hex, e.g., '0x...').

  • network (string, optional): Ethereum network to query. Defaults to 'mainnet'.

Returns:

  • Hexadecimal string containing the contract bytecode. Returns '0x' if address is not a contract or has no code.

Examples:

  • "Get USDT contract code": { "contractAddress": "0xdAC17F958D2ee523a2206206994597C13D831ec7" }

  • "Check Sepolia contract": { "contractAddress": "0x...", "network": "sepolia" }

Errors:

  • InvalidParams: When contractAddress format is invalid.

  • InternalError: When Infura API is unavailable or returns an error.

Inputs: contractAddress (required), network, response_format.

eth_getFeeHistoryA

Get historical gas fee data for EIP-1559 fee estimation.

Args:

  • blockCount (string): Number of blocks to analyze as hex (e.g., '0x4' for 4 blocks).

  • newestBlock (string): Latest block to include ('latest', 'pending', or hex block number).

  • rewardPercentiles (array): Percentiles for priority fee sampling (e.g., [25, 50, 75]).

  • network (string, optional): Ethereum network to query. Defaults to 'mainnet'.

Returns:

  • Object with baseFeePerGas array, gasUsedRatio array, oldestBlock, and reward matrix.

Examples:

  • "Get last 4 blocks fee history": { "blockCount": "0x4", "newestBlock": "latest", "rewardPercentiles": [25, 50, 75] }

  • "Query Sepolia fees": { "blockCount": "0xa", "newestBlock": "latest", "rewardPercentiles": [10, 50, 90], "network": "sepolia" }

Errors:

  • InvalidParams: When blockCount format, newestBlock, or rewardPercentiles are invalid.

  • InternalError: When Infura API is unavailable or returns an error.

Inputs: blockCount (required), newestBlock (required), rewardPercentiles (required), network, +1 more.

eth_getGasPriceA

Get the current gas price in wei for legacy (non-EIP-1559) transactions.

Args:

  • network (string, optional): Ethereum network to query. Defaults to 'mainnet'.

Returns:

  • Hexadecimal string representing gas price in wei (e.g., '0x3b9aca00' for 1 Gwei).

Examples:

  • "Get mainnet gas price": {}

  • "Get Sepolia gas price": { "network": "sepolia" }

Errors:

  • InternalError: When Infura API is unavailable or returns an error.

Inputs: network, response_format.

eth_getLogsA

Query event logs emitted by smart contracts with flexible filters. Supports pagination for large result sets.

Args:

  • fromBlock (string): Start block as hex (e.g., '0x10d4f') or tag ('latest', 'earliest', 'pending').

  • toBlock (string): End block as hex or tag.

  • address (string, optional): Contract address to filter logs from.

  • topics (array, optional): Array of 32-byte topic filters for indexed event parameters.

  • network (string, optional): Ethereum network to query. Defaults to 'mainnet'.

  • limit (integer, optional): Maximum logs to return (1-10000). Defaults to 1000.

  • offset (integer, optional): Number of logs to skip for pagination. Defaults to 0.

Returns:

  • Object with 'logs' array and 'pagination' metadata (total, count, offset, limit, has_more, next_offset).

Examples:

  • "Get all logs in block range": { "fromBlock": "0x10d4f", "toBlock": "0x10d50" }

  • "Filter by contract and topic": { "fromBlock": "latest", "toBlock": "latest", "address": "0xdAC17F958D2ee523a2206206994597C13D831ec7", "topics": ["0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"] }

  • "Paginate results": { "fromBlock": "0x10d4f", "toBlock": "0x10d50", "limit": 100, "offset": 0 }

Errors:

  • InvalidParams: When block tags or address format is invalid.

  • InternalError: When query range is too large or Infura API fails.

Inputs: fromBlock (required), toBlock (required), address, topics, +4 more.

eth_getProtocolVersionA

Returns the current Ethereum protocol version used by the node. Useful for checking client compatibility and supported features.

Args:

  • network (string, optional): Ethereum network to query, defaults to 'mainnet'

Returns:

  • Hex-encoded string representing the protocol version number (e.g., '0x41' for version 65)

Examples:

  • "Get mainnet protocol version": {}

  • "Get Sepolia protocol version": { "network": "sepolia" }

Errors:

  • InternalError: When Infura API is unavailable or method not supported

Inputs: network, response_format.

eth_getStorageAtA

Read the raw value from a specific storage slot of a contract.

Args:

  • address (string): Contract address (20-byte hex, e.g., '0x...').

  • position (string): Storage slot index as hex (e.g., '0x0' for slot 0).

  • network (string, optional): Ethereum network to query. Defaults to 'mainnet'.

Returns:

  • 32-byte hexadecimal string representing the storage value at the given position.

Examples:

  • "Read slot 0": { "address": "0xdAC17F958D2ee523a2206206994597C13D831ec7", "position": "0x0" }

  • "Read mapping slot": { "address": "0x...", "position": "0x1", "network": "sepolia" }

Errors:

  • InvalidParams: When address or position format is invalid.

  • InternalError: When Infura API is unavailable or returns an error.

Inputs: address (required), position (required), network, response_format.

eth_getTransactionByBlockHashAndIndexA

Get a transaction by its position within a block identified by hash.

Args:

  • blockHash (string): 32-byte block hash (66 chars with 0x prefix).

  • index (string): Transaction index position as hex (e.g., '0x0' for first tx).

  • network (string, optional): Ethereum network to query. Defaults to 'mainnet'.

Returns:

  • Transaction object with hash, from, to, value, gas, gasPrice, input, nonce, etc. Returns null if not found.

Examples:

  • "Get first tx in block": { "blockHash": "0xb903239f8543d04b5dc1ba6579132b143087c68db1b2168786408fcbce568238", "index": "0x0" }

  • "Get third tx on Sepolia": { "blockHash": "0x...", "index": "0x2", "network": "sepolia" }

Errors:

  • InvalidParams: When blockHash or index format is invalid.

  • InternalError: When Infura API is unavailable or returns an error.

Inputs: blockHash (required), index (required), network, response_format.

eth_getTransactionByBlockNumberAndIndexA

Retrieves a transaction by its position within a specific block using block number and transaction index.

Args:

  • blockNumber (string): Block number as hex (e.g., '0x10d4f') or tag ('latest', 'earliest', 'pending')

  • transactionIndex (string): Zero-based position of the transaction in the block as hex (e.g., '0x0')

  • network (string, optional): Ethereum network to query, defaults to 'mainnet'

Returns:

  • Transaction object with hash, from, to, value, gas, gasPrice, input, nonce, blockHash, blockNumber, transactionIndex; null if not found

Examples:

  • "Get first transaction in latest block": { "blockNumber": "latest", "transactionIndex": "0x0" }

  • "Get transaction at index 5 in specific block": { "blockNumber": "0x10d4f", "transactionIndex": "0x5" }

Errors:

  • InvalidParams: When blockNumber or transactionIndex format is invalid

  • InternalError: When Infura API is unavailable

Inputs: blockNumber (required), transactionIndex (required), network, response_format.

eth_getTransactionByHashA

Retrieves detailed transaction information using its unique transaction hash.

Args:

  • transactionHash (string): 32-byte transaction hash in hex format (e.g., '0xabc123...')

  • network (string, optional): Ethereum network to query, defaults to 'mainnet'

Returns:

  • Transaction object with hash, from, to, value, gas, gasPrice, input, nonce, blockHash, blockNumber, transactionIndex; null if transaction not found or still pending

Examples:

  • "Get transaction details": { "transactionHash": "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b" }

  • "Query on Sepolia testnet": { "transactionHash": "0xabc...", "network": "sepolia" }

Errors:

  • InvalidParams: When transactionHash is not a valid 32-byte hex string

  • InternalError: When Infura API is unavailable

Inputs: transactionHash (required), network, response_format.

eth_getTransactionCountA

Returns the number of transactions sent from an address (nonce). Useful for determining the next nonce for sending transactions.

Args:

  • address (string): 20-byte Ethereum address in hex format (e.g., '0x742d35Cc6634C0532925a3b844Bc9e7595f...')

  • tag (string, optional): Block tag - 'latest', 'earliest', or 'pending', defaults to 'latest'

  • network (string, optional): Ethereum network to query, defaults to 'mainnet'

Returns:

  • Hex-encoded integer representing the number of transactions sent from the address

Examples:

  • "Get current nonce for address": { "address": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e" }

  • "Get pending transaction count": { "address": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e", "tag": "pending" }

Errors:

  • InvalidParams: When address format is invalid or tag is not a valid block tag

  • InternalError: When Infura API is unavailable

Inputs: address (required), tag, network, response_format.

eth_getTransactionReceiptA

Retrieves the receipt of a mined transaction, including status, gas used, and logs. Only available for transactions that have been included in a block.

Args:

  • transactionHash (string): 32-byte transaction hash in hex format (e.g., '0xabc123...')

  • network (string, optional): Ethereum network to query, defaults to 'mainnet'

Returns:

  • Receipt object with status (1=success, 0=failure), blockHash, blockNumber, transactionIndex, from, to, contractAddress (if contract creation), cumulativeGasUsed, gasUsed, effectiveGasPrice, logs array, logsBloom; null if transaction pending or not found

Examples:

  • "Get receipt to check if transaction succeeded": { "transactionHash": "0x88df016429689c079f3b2f6ad39fa052532c56795b733da78a91ebe6a713944b" }

  • "Get receipt on Sepolia": { "transactionHash": "0xabc...", "network": "sepolia" }

Errors:

  • InvalidParams: When transactionHash is not a valid 32-byte hex string

  • InternalError: When Infura API is unavailable

Inputs: transactionHash (required), network, response_format.

eth_getUncleByBlockHashAndIndexA

Retrieves an uncle (ommer) block by block hash and uncle index position. Uncles are valid blocks that were not included in the main chain but are referenced by main chain blocks.

Args:

  • blockHash (string): 32-byte hash of the block containing the uncle (e.g., '0xabc123...')

  • index (string): Zero-based uncle index position as hex (e.g., '0x0' for first uncle)

  • network (string, optional): Ethereum network to query, defaults to 'mainnet'

Returns:

  • Uncle block object with hash, parentHash, sha3Uncles, miner, stateRoot, number, gasLimit, gasUsed, timestamp, difficulty, nonce; null if not found

Examples:

  • "Get first uncle in block": { "blockHash": "0xb3b20624f8f0f86eb50dd04688409e5cea4bd02d700bf6e79e9384d47d6a5a35", "index": "0x0" }

Errors:

  • InvalidParams: When blockHash or index format is invalid

  • InternalError: When Infura API is unavailable

Inputs: blockHash (required), index (required), network, response_format.

eth_getUncleByBlockNumberAndIndexA

Retrieves an uncle (ommer) block by block number and uncle index position. Uncles are valid blocks that were not included in the main chain but are referenced by main chain blocks.

Args:

  • blockNumber (string): Block number as hex (e.g., '0x10d4f') or tag ('latest', 'earliest', 'pending')

  • index (string): Zero-based uncle index position as hex (e.g., '0x0' for first uncle)

  • network (string, optional): Ethereum network to query, defaults to 'mainnet'

Returns:

  • Uncle block object with hash, parentHash, sha3Uncles, miner, stateRoot, number, gasLimit, gasUsed, timestamp, difficulty, nonce; null if not found

Examples:

  • "Get first uncle in specific block": { "blockNumber": "0x29c", "index": "0x0" }

  • "Get uncle from latest block": { "blockNumber": "latest", "index": "0x0" }

Errors:

  • InvalidParams: When blockNumber or index format is invalid

  • InternalError: When Infura API is unavailable

Inputs: blockNumber (required), index (required), network, response_format.

eth_getUncleCountByBlockHashA

Returns the number of uncle (ommer) blocks in a specific block identified by its hash.

Args:

  • blockHash (string): 32-byte hash of the block to query (e.g., '0xabc123...')

  • network (string, optional): Ethereum network to query, defaults to 'mainnet'

Returns:

  • Hex-encoded integer representing the number of uncles in the block (e.g., '0x0' for no uncles, '0x2' for two uncles)

Examples:

  • "Get uncle count for block": { "blockHash": "0xb3b20624f8f0f86eb50dd04688409e5cea4bd02d700bf6e79e9384d47d6a5a35" }

  • "Query on Sepolia": { "blockHash": "0xabc...", "network": "sepolia" }

Errors:

  • InvalidParams: When blockHash is not a valid 32-byte hex string

  • InternalError: When Infura API is unavailable

Inputs: blockHash (required), network, response_format.

eth_getUncleCountByBlockNumberA

Returns the number of uncle (ommer) blocks in a specific block identified by its number or tag.

Args:

  • blockNumber (string, optional): Block number as hex (e.g., '0x10d4f') or tag ('latest', 'earliest', 'pending'), defaults to 'latest'

  • network (string, optional): Ethereum network to query, defaults to 'mainnet'

Returns:

  • Hex-encoded integer representing the number of uncles in the block (e.g., '0x0' for no uncles, '0x2' for two uncles)

Examples:

  • "Get uncle count for latest block": {}

  • "Get uncle count for specific block": { "blockNumber": "0x29c" }

  • "Query on Sepolia": { "blockNumber": "latest", "network": "sepolia" }

Errors:

  • InvalidParams: When blockNumber format is invalid

  • InternalError: When Infura API is unavailable

Inputs: blockNumber, network, response_format.

eth_isSyncingA

Returns the sync status of the Ethereum node. Useful for determining if the node is fully synced before relying on its data.

Args:

  • network (string, optional): Ethereum network to query, defaults to 'mainnet'

Returns:

  • false if the node is not syncing (fully synced)

  • Object with startingBlock, currentBlock, and highestBlock (all hex-encoded) if syncing is in progress

Examples:

  • "Check if mainnet node is synced": {}

  • "Check Sepolia sync status": { "network": "sepolia" }

Errors:

  • InternalError: When Infura API is unavailable

Inputs: network, response_format.

net_getPeerCountA

Returns the number of peers currently connected to the client. Useful for monitoring network connectivity and health.

Args:

  • network (string, optional): Ethereum network to query, defaults to 'mainnet'

Returns:

  • Hex-encoded integer representing the number of connected peers (e.g., '0x19' for 25 peers)

Examples:

  • "Get mainnet peer count": {}

  • "Get Sepolia peer count": { "network": "sepolia" }

Errors:

  • InternalError: When Infura API is unavailable

Inputs: network, response_format.

net_getVersionA

Returns the current network ID. Useful for identifying which Ethereum network the node is connected to (1=mainnet, 11155111=sepolia, etc.).

Args:

  • network (string, optional): Ethereum network to query, defaults to 'mainnet'

Returns:

  • String representing the network ID (e.g., '1' for mainnet, '11155111' for Sepolia)

Examples:

  • "Get mainnet network ID": {}

  • "Verify Sepolia network ID": { "network": "sepolia" }

Errors:

  • InternalError: When Infura API is unavailable

Inputs: network, response_format.

net_isListeningA

Returns whether the client is actively listening for network connections. Useful for checking node connectivity status.

Args:

  • network (string, optional): Ethereum network to query, defaults to 'mainnet'

Returns:

  • true if the client is listening for connections

  • false if the client is not listening

Examples:

  • "Check if mainnet node is listening": {}

  • "Check Sepolia node status": { "network": "sepolia" }

Errors:

  • InternalError: When Infura API is unavailable

Inputs: network, response_format.

web3_getClientVersionA

Returns the current Ethereum client version string. Useful for identifying the node software and version being used.

Args:

  • network (string, optional): Ethereum network to query, defaults to 'mainnet'

Returns:

  • String containing the client name and version (e.g., 'Geth/v1.10.26-stable/linux-amd64/go1.18.5')

Examples:

  • "Get mainnet client version": {}

  • "Get Sepolia client version": { "network": "sepolia" }

Errors:

  • InternalError: When Infura API is unavailable

Inputs: network, response_format.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.1/5.0

    Scored across 29 tools

    Disambiguation5/5

    Every tool has a distinct purpose, covering different Ethereum RPC methods with clear parameters. Even similar tools like block retrieval by hash vs number are clearly differentiated.

    Naming Consistency4/5

    Tools consistently use prefix_methodName pattern (eth_getX, net_getY, web3_getZ) with underscores. Minor deviation like eth_chainId and eth_isSyncing not strictly following verb_noun, but overall predictable.

    Tool Count3/5

    29 tools is on the higher side for a single server, but each covers a distinct Ethereum RPC endpoint. The number is borderline heavy but justified given the comprehensive data query scope.

    Completeness4/5

    Covers most common read-only Ethereum data queries (accounts, blocks, transactions, logs, gas, chain info, net info). Missing raw transaction submission, but that fits the read-only nature. Good coverage.

    Maintenance

    ActivityNo data
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      A
      quality
      B
      maintenance
      Enables AI assistants to access real-time on-chain crypto analytics, whale tracking, and market metrics through natural language queries. It provides access to over 245 endpoints for comprehensive data analysis of assets like Bitcoin, Ethereum, and stablecoins.
      7
      90 npm
      9
      MIT
    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables querying on-chain data (balances, transactions, token transfers, blocks) across 20+ EVM chains through natural language.
      149 npm
      MIT