MCP Ethereum Address Info Server
This server provides information about Ethereum addresses across multiple chains using the Model Context Protocol (MCP). It includes a Server-Sent Events (SSE) endpoint for real-time updates.
Table of Contents
- Setup
- Running the Server
- Available Endpoints
- Using the SSE Endpoint
- Testing with Curl
- Example Workflow
Setup
-
Clone the repository:
git clone <repository-url> cd mcp-0x-address
-
Install dependencies:
npm install
-
Create a
.env
file with the following variables:MCP_PORT=3002
Running the Server
Start the HTTP MCP server:
npm run start:http
This will start the server on port 3002 (or the port specified in your .env
file).
Available Endpoints
The server provides the following endpoints:
GET /health
- Server health checkPOST /mcp
- MCP endpoint for tool callsGET /sse
- Server-Sent Events endpoint for real-time updatesGET /sse/clients
- Get information about connected SSE clientsPOST /sse/subscribe/:clientId
- Subscribe to address updatesPOST /sse/unsubscribe/:clientId
- Unsubscribe from address updates
Using the SSE Endpoint
The SSE endpoint allows clients to receive real-time updates from the server. Here's how to use it:
- Connect to the SSE endpoint
- Get your client ID from the connection response
- Subscribe to specific addresses
- Receive real-time updates for those addresses
Testing with Curl
1. Connect to the SSE Endpoint
curl -N http://localhost:3002/sse
This will establish a connection to the SSE endpoint and start receiving events. The connection will remain open until you manually terminate it.
2. Check Connected Clients
curl http://localhost:3002/sse/clients
3. Subscribe to Address Updates
After connecting to the SSE endpoint, you'll receive a client ID. Use that ID to subscribe to address updates:
curl -X POST \
http://localhost:3002/sse/subscribe/YOUR_CLIENT_ID \
-H "Content-Type: application/json" \
-d '{"addresses": ["0x742d35Cc6634C0532925a3b844Bc454e4438f44e", "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"]}'
Replace YOUR_CLIENT_ID
with the client ID you received when connecting to the SSE endpoint.
4. Unsubscribe from Address Updates
curl -X POST \
http://localhost:3002/sse/unsubscribe/YOUR_CLIENT_ID \
-H "Content-Type: application/json" \
-d '{"addresses": ["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"]}'
5. Trigger an Address Update
To trigger an address update (which will be sent to subscribed clients), call the get-address-info
tool:
curl -X POST \
http://localhost:3002/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get-address-info",
"arguments": {
"address": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e"
}
}
}'
6. Check Server Health
curl http://localhost:3002/health
7. Test the Ping Tool
curl -X POST \
http://localhost:3002/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "ping",
"arguments": {}
}
}'
Example Workflow
Here's a complete workflow for testing the SSE functionality:
-
Start the server:
npm run start:http
-
In a new terminal, connect to the SSE endpoint:
curl -N http://localhost:3002/sse
You'll receive a response like:
data: {"type":"connection","clientId":"client-1234567890abcdef","message":"Connected to MCP SSE endpoint","timestamp":"2023-01-01T00:00:00.000Z"}
-
Note the
clientId
from the response. -
In another terminal, subscribe to address updates:
curl -X POST \ http://localhost:3002/sse/subscribe/client-1234567890abcdef \ -H "Content-Type: application/json" \ -d '{"addresses": ["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"]}'
-
Trigger an address update:
curl -X POST \ http://localhost:3002/mcp \ -H "Content-Type: application/json" \ -d '{ "jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "get-address-info", "arguments": { "address": "0x742d35Cc6634C0532925a3b844Bc454e4438f44e" } } }'
-
In the terminal where you're connected to the SSE endpoint, you'll see updates for the address.
Automated Testing Script
For a more automated test, you can use this bash script:
#!/bin/bash
# Start SSE connection in the background and capture the output
curl -N http://localhost:3002/sse > sse_output.txt &
SSE_PID=$!
# Wait a moment for the connection to establish
sleep 2
# Extract the client ID from the output
CLIENT_ID=$(grep -o '"clientId":"[^"]*"' sse_output.txt | head -1 | cut -d'"' -f4)
if [ -z "$CLIENT_ID" ]; then
echo "Failed to get client ID"
kill $SSE_PID
exit 1
fi
echo "Connected with client ID: $CLIENT_ID"
# Subscribe to an address
curl -X POST \
http://localhost:3002/sse/subscribe/$CLIENT_ID \
-H "Content-Type: application/json" \
-d '{"addresses": ["0x742d35Cc6634C0532925a3b844Bc454e4438f44e"]}'
echo "Subscribed to address. Waiting for updates..."
echo "Press Ctrl+C to stop"
# Keep the script running to see updates
tail -f sse_output.txt
# Clean up on exit
trap "kill $SSE_PID; rm sse_output.txt" EXIT
Save this as test_sse.sh
, make it executable with chmod +x test_sse.sh
, and run it with ./test_sse.sh
.