query_balanceLABSCO SUMMARY
Dynamic against the metadata, which is why it fits your chain and not just Polkadot.
Listing pallets and their storage entries at runtime means an agent can discover what a chain offers instead of being told. The cost is the setup: the metadata file has to be exported and placed correctly before the build, and the server holds a signing key that can submit transactions — so give it a key whose account you are willing to see spend.
What it is
A Rust MCP server for Substrate-based blockchains, built on the subxt crate. It reads chain state dynamically from the runtime metadata rather than against a fixed set of pallets, so the same binary works with whatever chain you point it at — and it can sign and submit extrinsics as well as read.
What you get
- An account's balance and arbitrary storage read by pallet and entry —
query_balance,query_storage - The runtime explored rather than assumed: every pallet, and every storage entry within one —
list_pallets,list_pallet_entries - Events and extrinsics from the latest block, or specific events found by pallet and variant —
get_latest_events,find_events,find_extrinsics - Block detail by height or by hash —
get_latest_block,get_block_by_hash - A runtime API call executed dynamically, and system information over RPC —
dynamic_runtime_call,get_system_info - A signed transaction constructed, signed and sent —
send_dynamic_signed_transaction - Any other RPC call the node exposes —
custom_rpc
Requirements
Rust, and three things specific to your chain. A WebSocket node endpoint in RPC_URL. A signing keypair as hex in SIGNING_KEYPAIR_HEX — the secret seed from subkey generate --scheme Sr25519 --output-type Json, with the 0x prefix stripped. And the runtime metadata exported to artifacts/metadata.scale with subxt metadata -f bytes before you build: the build fails if the file is missing or misnamed. Then cargo build --release and point your client at the binary; it serves over stdio.
Setup effort
Build from source — git clone https://github.com/ThomasMarches/substrate-mcp-rs.git
USE CASES
Answering a question about an account
Read the balance directly, and go to arbitrary storage when the answer is not in the balances pallet.
Working out what a chain you do not know can do
List the pallets in its runtime, then list the storage entries in the interesting one, before writing any query.
Watching for a specific on-chain event
Pull everything from the latest block, or filter to a pallet and variant when you know what you are looking for.
Investigating a block someone reported
Fetch it by hash and read the extrinsics inside it rather than trusting a block explorer's summary.
Submitting a transaction from the conversation
Construct, sign and send with the configured keypair — the one action here that spends real value, so scope the key accordingly.
13 tools
Listed in project docs. Your client may show a different list.
list_palletslist_pallet_entriesdynamic_runtime_callsend_dynamic_signed_transactionquery_storageget_latest_eventsfind_eventsget_latest_blockget_block_by_hashfind_extrinsicsget_system_infocustom_rpcBEFORE YOU INSTALL
What to know first
Tools you get
13 tools named in the project's documentation. send_dynamic_signed_transaction signs and sends with the key in SIGNING_KEYPAIR_HEX. Your chain's runtime metadata must be at artifacts/metadata.scale before compiling, or the build fails.
Requires
SIGNING_KEYPAIR_HEX in your environment
Where it runs
The documented client runs the server on your machine.
INSTALLATION
Connect your client
This one is built from source rather than installed with a single command.
Server setup
git clone https://github.com/ThomasMarches/substrate-mcp-rs.git
cd substrate-mcp-rsCreate a .env file with RPC_URL and SIGNING_KEYPAIR_HEX
subxt metadata -f bytes > artifacts/metadata.scale
cargo build --release
cargo run --releaseMCP Clients
Cursor
{
"mcpServers": {
"substrate-mcp-rs": {
"command": "$PROJECT_ROOT_ABSOLUTE_PATH/target/release/substrate-mcp-rs",
"args": []
}
}
}The configuration on this page does not set SIGNING_KEYPAIR_HEX; the project's instructions put it in a .env file. Check which folder the server reads that file from before you rely on it.