About chainlens
chainlens queries EVM chain data through Blockscout for developers and agents inspecting addresses, transactions, and contracts. It includes six built-in chains and tools for blocks, tokens, NFTs, and verified contract data.
Key features
- 01Query six built-in EVM chains
- 02Retrieve address balances and transactions
- 03Inspect blocks and transaction details
- 04View token balances, transfers, and NFTs
- 05Retrieve verified contract ABIs and source
- 06Read contract methods and call APIs
Use cases
- 01Check tokens and NFTs held by an address
- 02Track address transactions and token transfers
- 03Inspect block or transaction details
- 04Read data from verified contracts
MCP support
The MCP server provides Blockscout data-query tools for chains, addresses, blocks, transactions, tokens, NFTs, and contracts. Apart from local tools such as chain-list filtering, queries use each chain's public Blockscout API v2.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
Tools
16Saved tool list · updated 1w ago
This tool takes no parameters.
Details
From the project READMEchainlens
chainlens looks into EVM blockchains through Blockscout: what an address holds and has done, what is in a block or a transaction, which tokens and NFTs sit in a wallet, and what a verified contract's ABI and source say. Six chains are built in — Ethereum, Optimism, Gnosis, Polygon, Base, and Arbitrum One — and every answer comes from that chain's public Blockscout API v2 instance.
This package is a clean-room rebuild of the 16 tools documented in the README of the original Blockscout MCP server. The full documented set is covered; the wire mapping is described below, including the parts that are reconstructions.
How it talks to the service
No API key is required — public Blockscout instances are keyless:
# Optional: send a key as an x-api-key header
export BLOCKSCOUT_API_KEY="your key"
# Optional: override the per-chain base URL for any chain
export BLOCKSCOUT_API_URL="https://eth.blockscout.com/api/v2"
The base URL is chosen per chain_id from a built-in map:
1 Ethereum, 10 Optimism, 100 Gnosis, 137 Polygon, 8453 Base,
42161 Arbitrum One. An unknown chain_id is an error naming the
known chains (unless BLOCKSCOUT_API_URL is set, in which case the
override wins for any chain).
Wire-format notes. The original server routes most data tools
through its PRO gateway; this rebuild maps them onto the public
Blockscout API v2 (/addresses/..., /blocks/...,
/transactions/..., /smart-contracts/..., /search). A few shapings
are documented reconstructions and first live-smoke checks:
- ENS resolution uses mainnet
/search?q=<name>and picks the first result carrying an address. read_contractPOSTs{function_name, args, abi}to/smart-contracts/{address}/methods/read— the least-proven mapping.cursorarguments are forwarded as acursorquery parameter; Blockscout v2 paging normally usesnext_page_params, so cursor support is a drift risk.age_from/age_to(andmethods/token) filters are applied client-side over the first fetched page, not forwarded upstream.
Two tools never touch the network: __unlock_blockchain_analysis__
returns local guidance plus the chain list, and get_chains_list
filters that list locally by name, chain id, or currency substring.
Install
npx @reneturcios/chainlens get_block_number '{"chain_id":"1"}'
Or run the container image:
docker run -i ghcr.io/cloudcorprecords/chainlens
The container defaults to the MCP server. Pass CLI arguments to use it as a CLI instead.
CLI
The CLI mirrors the tools: one subcommand per tool, taking its arguments as a single JSON object.
chainlens get_chains_list '{"query":"base"}'
chainlens get_address_info '{"chain_id":"1","address":"0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"}'
chainlens get_transactions_by_address '{"chain_id":"1","address":"0x...","age_from":"2026-10-01T00:00:00Z","age_to":"2026-10-26T23:59:59Z"}'
chainlens get_block_info '{"chain_id":"8453","number_or_hash":"latest"}'
chainlens --version
Exit codes: 0 on success, 1 on an API or validation error (the
error names the problem), 2 for usage errors.
MCP server
One bin serves both faces. The mcp subcommand starts a stdio MCP
server:
npx -y @reneturcios/chainlens mcp
MCP client configuration:
{
"mcpServers": {
"chainlens": {
"command": "npx",
"args": ["-y", "@reneturcios/chainlens", "mcp"]
}
}
}
Tools
| Tool | Input | What it does |
|---|---|---|
__unlock_blockchain_analysis__ | — | Local: returns status, guidance, and the supported chain list. |
get_chains_list | query | Local: the 6-chain list filtered by a name/id/currency substring. |
get_address_by_ens_name | name (required) | Resolve an ENS name via mainnet search; returns the first result with an address. |
lookup_token_by_symbol | chain_id, symbol (required) | Search a chain; returns token-type items (fallback: all items). |
get_contract_abi | chain_id, address (required) | The ABI of a verified contract. |
inspect_contract_code | chain_id, address (required), file_name | Source code and creation status of a verified contract. |
get_address_info | chain_id, address (required) | Address balance, type, and metadata. |
get_tokens_by_address | chain_id, address (required), cursor | Token balances held by an address. |
get_block_number | chain_id (required), datetime | Latest block number and timestamp; echoes the requested datetime. |
get_transactions_by_address | chain_id, address, age_from, age_to (required), methods, cursor | Address transactions; age and method filters applied client-side over the first page. |
get_token_transfers_by_address | chain_id, address, age_from, age_to (required), token, cursor | ERC-20 transfers; age and token filters applied client-side over the first page. |
nft_tokens_by_address | chain_id, address (required), cursor | NFT tokens (ERC-721, ERC-1155) held by an address. |
get_block_info | chain_id, number_or_hash (required), include_transactions | Block details by number or hash. |
get_transaction_info | chain_id, hash (required), include_raw_input | Transaction details by hash. |
read_contract | chain_id, address, abi, function_name (required), args (JSON string, default []), block | Read a contract function (reconstructed wire mapping, see notes). |
direct_api_call | chain_id, endpoint_path (required), query_params, method, json_body, cursor | Call any Blockscout API v2 endpoint path directly. |
Development
npm install
npm run build # tsc -> dist/
npm test # node test runner over test/*.test.ts, fake fetch only, no network
npm run dev # run the CLI from source via tsx
License
MIT — see LICENSE.
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.