Sign In

chainrpc-mcp

Package Overview
Dependencies
Maintainers
1
Versions
3
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

chainrpc-mcp

A safety-first MCP server for EVM chains and Bitcoin

latest
Source
npmnpm
Version
2.0.2
Version published
Weekly downloads
367
Maintainers
1
Weekly downloads
 
Created
Source

ChainRPC MCP

npm CI Node.js License: MIT

A safety-first Model Context Protocol server for EVM chains and Bitcoin.

ChainRPC MCP gives agents a focused set of tools for balances, blocks, transactions, logs, smart-contract reads, gas and fee estimation, and transaction decoding. It can submit already-signed transactions, but only behind explicit, disabled-by-default safety gates. It never accepts private keys, manages wallets, or signs transactions.

  • Two ecosystems, one server: EVM JSON-RPC and Bitcoin Core-compatible RPC.
  • Useful without an account: defaults to public Ethereum and Bitcoin endpoints from PublicNode.
  • Bring your own infrastructure: replace either endpoint and optionally use HTTP Basic authentication.
  • Official transports: local stdio and stateful Streamable HTTP through the official MCP SDK.
  • Constrained by design: no arbitrary RPC passthrough and no wallet, admin, debug, miner, or node-management methods.

Choose how to connect

Hosted, read-only service

The public endpoint is available now:

https://chainrpc-mcp.mitander.io/mcp

For clients that accept a remote Streamable HTTP server:

{
  "mcpServers": {
    "chainrpc-mcp": {
      "url": "https://chainrpc-mcp.mitander.io/mcp"
    }
  }
}

Health and upstream status:

curl 'https://chainrpc-mcp.mitander.io/health?upstream=1'

The hosted service is shared, rate-limited, and intentionally has both broadcast features disabled. It is suitable for evaluation and public-chain reads, but has no availability SLA. Requests are visible to the service operator and upstream RPC providers; use your own deployment for sensitive queries or production workloads.

Local stdio server

Requirements: Node.js 20 or newer.

npx -y chainrpc-mcp

Example client configuration:

{
  "mcpServers": {
    "chainrpc-mcp": {
      "command": "npx",
      "args": ["-y", "chainrpc-mcp"],
      "env": {
        "EVM_RPC_URL": "https://ethereum-rpc.publicnode.com",
        "BITCOIN_RPC_URL": "https://bitcoin-rpc.publicnode.com"
      }
    }
  }
}

The RPC variables are optional; they are shown to make the defaults explicit.

Available tools

EVM

ToolPurposeState-changing
evm_getBlockNumberReturn the latest block numberNo
evm_getChainInfoReturn chain ID and client versionNo
evm_getNativeBalanceRead a native-token balance at a blockNo
evm_getBlockRead a block by number, tag, or hashNo
evm_getTransactionRead a transaction and receiptNo
evm_callExecute an eth_call with encoded calldataNo
evm_readContractEncode, call, and decode a function from its ABINo
evm_estimateTransactionEstimate gas for an unsigned transactionNo
evm_getLogsQuery event logs with address and topic filtersNo
evm_broadcastTransactionPreflight and submit signed transaction bytesYes

Any HTTP(S) EVM JSON-RPC endpoint can be used, so the same tools work with Ethereum mainnet, testnets, and compatible chains. Results always come from the configured endpoint; callers should inspect evm_getChainInfo before making chain-specific assumptions.

Bitcoin

ToolPurposeState-changing
btc_getBlockchainInfoReturn network, height, sync, and pruning informationNo
btc_getAddressBalanceScan confirmed UTXOs for an addressNo
btc_getBlockRead a block by height or hashNo
btc_getTransactionRead raw transaction detailsNo
btc_getTxOutLook up an unspent transaction outputNo
btc_estimateFeeEstimate a fee rate for a confirmation targetNo
btc_decodeRawTransactionDecode serialized transaction bytesNo
btc_broadcastTransactionValidate and submit signed transaction bytesYes

Bitcoin Core is not an address indexer. btc_getAddressBalance uses scantxoutset, which reports currently unspent, confirmed outputs—not history or unconfirmed balance. Only one scan can run on a node at a time, so a shared endpoint may return scan already in progress. Use a dedicated node for frequent address scans.

Safety model

ChainRPC MCP treats transaction submission as an exceptional operation:

  • Broadcasting is off unless ALLOW_EVM_BROADCAST or ALLOW_BITCOIN_BROADCAST is explicitly enabled.
  • The server accepts only serialized, already-signed transaction bytes.
  • Every broadcast call requires the literal confirmation I understand this broadcasts a real transaction.
  • EVM submission checks the endpoint and transaction chain IDs, rejects unprotected legacy transactions, recovers the signer, and runs eth_estimateGas first.
  • Bitcoin submission checks the endpoint network and requires testmempoolaccept to approve the transaction.
  • Submission requests are never automatically retried. A timeout can leave broadcast status ambiguous.
  • Read inputs use strict schemas; upstream concurrency, timeout, retry, and response sizes are bounded.
  • HTTP mode validates hosts and browser origins, supports bearer authentication, caps request bodies, and binds to loopback by default.

RPC responses are untrusted external data. A compromised endpoint can lie about chain state, censor requests, or observe queries. Independently verify high-value decisions, ideally against infrastructure you control.

See SECURITY.md for vulnerability reporting and the complete trust boundary.

Configuration

Copy example.env to .env when running from a checkout.

VariableDefaultDescription
EVM_RPC_URLhttps://ethereum-rpc.publicnode.comAny HTTP(S) EVM JSON-RPC endpoint
BITCOIN_RPC_URLhttps://bitcoin-rpc.publicnode.comAny HTTP(S) Bitcoin Core-compatible endpoint
EVM_RPC_USERNAME / EVM_RPC_PASSWORDunsetOptional EVM HTTP Basic authentication pair
BITCOIN_RPC_USERNAME / BITCOIN_RPC_PASSWORDunsetOptional Bitcoin HTTP Basic authentication pair
RPC_TIMEOUT_MS12000Per-attempt upstream timeout
RPC_RETRIES1Retry count for retryable reads only
RPC_MAX_RESPONSE_BYTES10000000Maximum upstream response body
RPC_MAX_CONCURRENCY20Maximum concurrent requests per chain client
ALLOW_EVM_BROADCASTfalseEnable signed EVM transaction submission
ALLOW_BITCOIN_BROADCASTfalseEnable signed Bitcoin transaction submission
TRANSPORTstdioDefault transport: stdio or http
HOST / PORT127.0.0.1 / 3000HTTP bind address and port
MCP_PATH/mcpStreamable HTTP MCP path
MCP_AUTH_TOKENunsetOptional bearer token for /mcp
ALLOWED_HOSTSunsetRequired allowlist when binding HTTP to a non-loopback address
CORS_ORIGINSunsetComma-separated browser-origin allowlist
MAX_MCP_SESSIONS1000Maximum concurrent HTTP MCP sessions
HTTP_BODY_LIMIT1mbExpress request-body limit

GETH_URL remains a deprecated compatibility alias for EVM_RPC_URL. Credentials embedded in RPC URLs are rejected; use the matching username and password variables.

Self-host with Streamable HTTP

Start a loopback-only HTTP server:

npm start
curl 'http://127.0.0.1:3000/health?upstream=1'

To bind beyond loopback, explicitly set the host allowlist and authentication:

HOST=0.0.0.0 \
ALLOWED_HOSTS=mcp.example.com \
MCP_AUTH_TOKEN='replace-with-a-long-random-secret' \
npm start

Terminate TLS at a trusted reverse proxy, preserve the original Host header, and keep the origin private. A bearer token is useful for a single trusted client; use an OAuth-capable gateway and network access policy for multi-user deployments.

Docker defaults to stdio. Override the command for HTTP:

docker build -t chainrpc-mcp .
docker run --rm -p 127.0.0.1:3000:3000 \
  -e HOST=0.0.0.0 \
  -e ALLOWED_HOSTS=localhost,127.0.0.1 \
  -e MCP_AUTH_TOKEN='replace-with-a-long-random-secret' \
  chainrpc-mcp --http

Production service topology:

MCP client
    |
    v
Cloudflare edge -> outbound-only Cloudflare Tunnel -> nginx on loopback
                                                     |
                                                     v
                                              ChainRPC MCP
                                                /       \
                                               v         v
                                          EVM RPC    Bitcoin RPC

Deployment units, nginx configuration, hardening details, and operating commands are in docs/OPERATIONS.md.

Development

git clone https://github.com/John0n1/chainrpc-mcp.git
cd chainrpc-mcp
npm ci
npm run check
npm run test:coverage

Useful commands:

CommandPurpose
npm run start:stdioStart the stdio transport
npm startStart Streamable HTTP
npm run devStart HTTP with Node watch mode
npm testRun the test suite
npm run checkSyntax-check the entry point and run all tests
npm pack --dry-runInspect the npm package contents

The detailed design and remediation record is in docs/AUDIT.md. Contributions are welcome through issues and pull requests. Please use a private GitHub security advisory—not a public issue—for suspected vulnerabilities.

License

MIT

Keywords

mcp

FAQs

Package last updated on 19 Aug 2026

Related posts