A Model Context Protocol (MCP) server for Blockchain interactions. This server enables AI agents to interact with multiple blockchain networks, check financial data, and send real-time notifications to Telegram.
- 💰 Wallet Balance Checker: Retrieves native token balances for any wallet address across Ethereum, Polygon, Arbitrum, Optimism, and Base simultaneously using public RPC nodes.
- 📜 Frax Transactions: Fetches the 5 latest transactions on the FRAX network, including both native transfers and ERC-20 token events.
- ⛽ Gas Price Estimator: Provides real-time gas fee estimates (in Gwei) across multiple blockchain networks to help determine transaction costs.
- 💱 Crypto Converter: Converts cryptocurrency and fiat values using real-time market rates (e.g., BTC to ETH or USDC to USD).
- 🤖 Telegram Bot: Programmatically posts updates, messages, or automated notifications to a specific Telegram chat or channel.
- Python 3.11+
- uv
Create a .env file in the root directory and populate it with your credentials:
# Telegram Configuration
TELEGRAM_BOT_TOKEN=your_bot_token_from_botfather
TELEGRAM_CHAT_ID=your_numeric_chat_id
# Blockchain API Keys
FRAXSCAN_API_KEY=your_fraxscan_api_key
# Optional: CoinGecko API Key
COINGECKO_API_KEY=your_api_key-
Clone the repository:
git clone <YOUR_REPO_URL_HERE> cd <YOUR_REPO_NAME>
-
Install dependencies: This project uses
uvfor fast dependency management.make install
The easiest way to test the tools is using the built-in Makefile command, which launches the MCP Inspector.
make devAlternatively: uv run fastmcp dev main.py
Below are example inputs for testing the tools in the MCP Inspector.
Queries multiple public RPC endpoints to retrieve native balances across various chains.
- Input:
{ "address": "0x..." } - Response:
{ "Ethereum": "1.2450 ETH", "Arbitrum": "0.0000 ETH", "Polygon": "150.3200 MATIC", "Optimism": "0.0500 ETH", "Base": "0.1200 ETH" }
Merges native and token transfer history from the Fraxscan API, sorted by timestamp.
- Input:
{ "address": "0x4200000000000000000000000000000000000015" } - Response:
[ { "time": "2026-01-30 18:00:00", "amount": "0.5000 frxETH", "token": "frxETH", "type": "Native", "hash": "0x..." } ]
Monitors real-time gas prices (in Gwei) to estimate transaction costs.
- Input:
{} - Response:
{ "Ethereum": "🔴 45.2 Gwei", "Base": "🟢 0.01 Gwei" }
Converts time between timezones.
-
Input:
{ "amount": 1, "from_coin": "bitcoin", "to_coin": "ripple" } -
Response:
{ "Response": "1 BITCOIN = 1235999999.0 XRP (Rate: 95000)" }
This tool allows the AI to send notifications to your phone via Telegram.
- User Trigger: You give Claude a condition or a direct command (e.g., "If ETH is below $2000, alert me").
- Decision: Claude evaluates the condition. If true, it decides to call
send_telegram_message. - Execution: The MCP server receives the text payload and makes an HTTP POST request to the Telegram Bot API.
- Confirmation: The Telegram API confirms the delivery, and the MCP server reports back to Claude that the task is done.
- Input:
{
"message": "The deployment was successful"
}- Response:
"Message sent successfully!"This mode enables the AI to automatically check for new messages and respond to them in a continuous loop, while also performing other operations in between.
Prompt to Initiate:
"I want you to run in Auto-Pilot Mode. Here is your loop:
1. **Check:** Run `telegram_read_messages`.
2. **Act:** If there is a NEW message (one you haven't answered yet), interpret it and use `telegram_reply` to send the answer.
3. **Wait:** If there are no new messages, carry out any pending commands then run `wait_for_seconds(4)`.
4. **Repeat:** Go back to Step 1.
Do not ask me for permission between steps. Just keep running this loop indefinitely."How the Loop Works:
- Check: The AI polls the Telegram API for incoming messages.
- Process: It reads the content of any new user messages (e.g., a user asking "What is the price of BTC?").
- Action: It uses other available tools (like
convert_crypto) to find the answer. - Reply: It sends the answer back to the user via Telegram and waits for the next cycle.