darwintree/blockchain-mcp-server
If you are the rightful owner of blockchain-mcp-server and would like to certify it and/or have it hosted online, please leave a comment on the right or send an email to henry@mcphub.com.
A comprehensive Model Context Protocol (MCP) server for interacting with multiple EVM-compatible blockchains, providing tools and resources for blockchain data access and analysis.
Blockchain MCP Server DEMO
A comprehensive Model Context Protocol (MCP) server for interacting with multiple EVM-compatible blockchains. This server provides tools and resources for blockchain data access and analysis.
Features
🔗 Multi-Chain Support
- Ethereum Mainnet (Chain ID: 1)
- Conflux eSpace (Chain ID: 1030)
🛠️ Tools (POST-like endpoints)
get_chains
- Get list of supported blockchain networksget_rpc_methods
- Get supported RPC method listcall_rpc
- Execute arbitrary RPC method callsget_latest_block
- Get latest block number for a chainget_transaction
- Get transaction details by hashget_address
- Get address balance and informationget_block
- Get block information by number
📚 Resources (GET-like endpoints)
blockchain://transaction/{hash}
- Fetch transaction details (cross-chain search)blockchain://block/{chainId}/{number}
- Fetch block informationblockchain://address/{chainId}/{address}
- Fetch address information and balanceblockchain://chains
- List all supported blockchain networks
Technology Stack
- TypeScript - Type-safe development
- Viem - Modern Ethereum library with excellent TypeScript support
- Model Context Protocol (MCP) - Standardized AI-blockchain communication
- Zod - Runtime type validation
Installation
- Clone the repository:
git clone <repository-url>
cd blockchain-mcp-server
- Install dependencies:
npm install
- Build the project:
npm run build
- Start the server:
npm start
Usage Examples
Tools
Get supported chains
// 获取所有支持的区块链网络
await callTool("get_chains", {});
Get transaction information
// 获取交易信息
await callTool("get_transaction", {
hash: "0x1234567890abcdef...",
chainId: 1 // optional, will search all chains if not provided
});
Get address information
// 获取地址信息
await callTool("get_address", {
address: "0x742de6d65963b2c3a5e8e3b8c7cb56c6f78e0c00",
chainId: 1
});
Execute RPC call
// 获取以太坊主网最新区块号
await callTool("call_rpc", {
method: "eth_blockNumber",
params: [],
chainId: 1
});
// 获取地址余额
await callTool("call_rpc", {
method: "eth_getBalance",
params: ["0x742de6d65963b2c3a5e8e3b8c7cb56c6f78e0c00", "latest"],
chainId: 1
});
Resources
Access transaction data
// 跨链查询交易 (will search all supported chains)
const txResource = await getResource("blockchain://transaction/0x1234567890abcdef...");
Access block data
// 获取以太坊主网特定区块
const block = await getResource("blockchain://block/1/19000000");
// 获取Polygon特定区块
const polygonBlock = await getResource("blockchain://block/137/12345678");
Access address data
// 获取地址信息
const addressInfo = await getResource("blockchain://address/1/0x742de6d65963b2c3a5e8e3b8c7cb56c6f78e0c00");
Access supported chains
// 获取所有支持的区块链网络
const chains = await getResource("blockchain://chains");
Supported RPC Methods
The server supports the following standard Ethereum JSON-RPC methods:
eth_getBalance
- Get account balanceeth_getTransactionByHash
- Get transaction by hasheth_getTransactionReceipt
- Get transaction receipteth_getBlockByNumber
- Get block by numbereth_getBlockByHash
- Get block by hasheth_getTransactionCount
- Get account nonceeth_getCode
- Get contract codeeth_call
- Execute contract calleth_estimateGas
- Estimate gas for transactioneth_gasPrice
- Get current gas priceeth_blockNumber
- Get latest block numbereth_chainId
- Get chain IDnet_version
- Get network versionweb3_clientVersion
- Get client version
API Reference
Tools
get_chains
Returns a list of all supported blockchain networks.
Parameters: None
Response:
[
{
"chainId": 1,
"name": "Ethereum Mainnet",
"symbol": "ETH",
"rpcUrls": [...],
"blockExplorerUrls": [...],
"nativeCurrency": {...}
}
]
get_transaction
Get detailed transaction information.
Parameters:
hash
(string): Transaction hashchainId
(number, optional): Chain ID to search on
Response:
{
"hash": "0x...",
"blockNumber": 19000000,
"from": "0x...",
"to": "0x...",
"value": "1.0",
"gasPrice": "0.00002",
"gasUsed": "21000",
"chainId": 1,
"status": 1
}
get_address
Get address balance and information.
Parameters:
address
(string): Ethereum addresschainId
(number): Chain ID
Response:
{
"address": "0x...",
"balance": "10.5",
"nonce": 42,
"code": null,
"chainId": 1
}
call_rpc
Execute arbitrary RPC method calls.
Parameters:
method
(string): RPC method nameparams
(array, optional): Method parameterschainId
(number, optional): Chain ID (default: 1)
Response: Raw RPC response
Error Handling
The server includes comprehensive error handling:
- Network failures: Automatic failover between RPC endpoints
- Invalid parameters: Input validation using Zod schemas
- Chain unavailability: Graceful handling when chains are down
- Transaction not found: Cross-chain search with clear error messages
Architecture
src/
├── index.ts # Main MCP server implementation
├── blockchain-service.ts # Blockchain interaction service (using viem)
├── config.ts # Chain configurations and constants
└── types.ts # TypeScript interfaces and schemas
Key Components
- BlockchainService: Manages connections to multiple EVM chains using viem clients
- MCP Server: Exposes tools and resources following MCP specification
- Type Safety: Full TypeScript support with Zod validation and viem's excellent types
- Multi-chain Support: Seamless interaction across different networks
Why Viem?
This project uses viem instead of ethers for several advantages:
- Better TypeScript Support: Native TypeScript with strict typing
- Modern API: Functional approach with better tree-shaking
- Performance: Optimized for speed and bundle size
- Reliability: Built-in retry logic and better error handling
- Future-proof: Actively maintained with cutting-edge features
Testing
You can test the server using the MCP Inspector:
npx @modelcontextprotocol/inspector node dist/index.js
Configuration
The server automatically connects to multiple blockchain networks using public RPC endpoints. You can customize RPC endpoints by modifying the src/config.ts
file.
Adding New Chains
To add support for new EVM-compatible chains, update the SUPPORTED_CHAINS
object in src/config.ts
:
export const SUPPORTED_CHAINS: Record<number, ChainConfig> = {
// ... existing chains
// New chain example
YOUR_CHAIN_ID: {
chainId: YOUR_CHAIN_ID,
name: "Your Chain Name",
symbol: "TOKEN",
rpcUrls: [
"https://rpc.yourchain.com",
"https://backup-rpc.yourchain.com"
],
blockExplorerUrls: ["https://explorer.yourchain.com"],
nativeCurrency: {
name: "Your Token",
symbol: "TOKEN",
decimals: 18
}
}
};
Contributing
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests if applicable
- Submit a pull request
License
MIT License - see LICENSE file for details.
Support
For questions or issues, please open an issue on the GitHub repository.