68 MCP tools and 206 REST paths (224 OpenAPI operations) live across Ethereum, Bitcoin, and Hyperliquid, with Polygon node coverage in progress. Free instant API key, no signup. The snippets below are paste-ready -- replace bp_YOUR_KEY with a key from POST https://api.bitpoort.com/v1/keys. Jump: quickstart · get-key · mcp-client · claude-code · claude-desktop · cursor · vscode · codex-openclaw · anthropic-sdk · openai-sdk · curl · tools · discover
curl -X POST https://api.bitpoort.com/v1/keys
Response includes api_key (a bp_ string), tier: free, 60 req/min limit, 10,000/day cap, 90-day expiry, usage.docs, usage.agents_landing, usage.discovery_manifest, and the MCP config snippet under usage.mcp.config.
claude mcp add bitpoort \ --transport http \ --url https://mcp.bitpoort.com/ \ --header "X-API-Key: bp_YOUR_KEY"
{
"mcpServers": {
"bitpoort": {
"type": "http",
"url": "https://mcp.bitpoort.com/",
"headers": {"X-API-Key": "bp_YOUR_KEY"}
}
}
}
{
"mcpServers": {
"bitpoort": {
"url": "https://mcp.bitpoort.com/",
"headers": {"X-API-Key": "bp_YOUR_KEY"}
}
}
}
{
"servers": {
"bitpoort": {
"type": "http",
"url": "https://mcp.bitpoort.com/",
"headers": {"X-API-Key": "bp_YOUR_KEY"}
}
}
}
[mcp_servers.bitpoort] command = "npx" args = ["-y", "mcp-remote", "https://mcp.bitpoort.com/", "--header", "X-API-Key:bp_YOUR_KEY"]
import anthropic
client = anthropic.Anthropic()
response = client.beta.messages.create(
model="claude-opus-4-7",
max_tokens=1024,
mcp_servers=[{
"type": "url",
"url": "https://mcp.bitpoort.com/",
"name": "bitpoort",
"authorization_token": "bp_YOUR_KEY",
}],
messages=[{"role": "user", "content": "What large ETH transfers happened in the last hour?"}],
extra_headers={"anthropic-beta": "mcp-client-2025-04-04"},
)
from agents import Agent, Runner
from agents.mcp import MCPServerStreamableHttp
bitpoort = MCPServerStreamableHttp(
name="bitpoort",
params={"url": "https://mcp.bitpoort.com/", "headers": {"X-API-Key": "bp_YOUR_KEY"}},
)
async with bitpoort as server:
agent = Agent(name="onchain-analyst", mcp_servers=[server], model="gpt-4o")
print((await Runner.run(agent, "Latest whale activity on ETH?")).final_output)
# 1. Initialize -- capture the Mcp-Session-Id header
SESSION_ID=$(curl -sD - -X POST https://mcp.bitpoort.com/ \
-H "X-API-Key: bp_YOUR_KEY" -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"curl","version":"1"}}}' \
| awk -F': ' 'tolower($1)=="mcp-session-id"{gsub(/\r/,"",$2);print $2}')
# 2. List tools
curl -X POST https://mcp.bitpoort.com/ \
-H "X-API-Key: bp_YOUR_KEY" -H "Mcp-Session-Id: $SESSION_ID" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'
# 3. Call ask_blockchain
curl -X POST https://mcp.bitpoort.com/ \
-H "X-API-Key: bp_YOUR_KEY" -H "Mcp-Session-Id: $SESSION_ID" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"ask_blockchain","arguments":{"question":"Recent whale activity on ETH","chain":"ETH"}}}'
Matches the live tools/list response. Schema for each tool (params, defaults, min/max bounds) is returned by tools/list.
Total: 2+3+7+5+5+9+3+5+8+3+4+7 = 61. Standard query contract on most list endpoints: chain, limit, min_usd, since, until (ISO 8601), cursor (opaque keyset paginator where supported). Responses include next_cursor + has_more for keyset-paginated endpoints.
| Chain | Status | Backed by |
|---|---|---|
| Ethereum (ETH) | live | Erigon archive node + full pipeline (whales, flows, RAG, signals) |
| Bitcoin (BTC) | live | Bitcoin Core full node + 2.3M-address entity registry, CIOH clustering |
| Hyperliquid (HL) | live | non-validator HL node + perps poller (positions, funding, liquidations) |
| Polygon (MATIC) | node-only | Erigon archive node live; public indexing pipeline pending. Chain enum accepts MATIC for forward compat but data is currently thin. |
If all five steps return successful JSON matching the expected shapes, your MCP integration is healthy end-to-end.
KEY=$(curl -s -X POST https://api.bitpoort.com/v1/keys | python3 -c "import sys,json;print(json.load(sys.stdin)['api_key'])")
# Expected: KEY starts with "bp_". POST /v1/keys returns api_key, tier="agent",
# rate_limit=20, daily_cap=1500, scopes[], expires_at, usage{...}.
# 1. Auth identity (REST)
curl -H "X-API-Key: $KEY" https://api.bitpoort.com/v1/auth/me
# Expected: {api_key_id:<int>, name:"instant-agent", role:"agent",
# rate_limit:20, scopes:[...], sso:null}
# 2. Sample REST query
curl -H "X-API-Key: $KEY" "https://api.bitpoort.com/v1/whales/recent?chain=ETH&limit=3"
# Expected: {count:<=3, chain:"ETH", min_usd:100000.0, next_cursor, has_more,
# whales:[{tx_hash,block_number,from/to_address,value_usd,timestamp,...}]}
# 3. MCP initialize -- capture session id
SESSION=$(curl -sD - -X POST https://mcp.bitpoort.com/ \
-H "X-API-Key: $KEY" -H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"smoke","version":"1"}}}' \
| awk -F': ' 'tolower($1)=="mcp-session-id"{gsub(/\r/,"",$2);print $2}')
# Expected: SESSION is a UUID. result.serverInfo = {name:"bitpoort", version:"3.5.0"}.
# result.instructions opens with "Bitpoort provides real-time blockchain
# intelligence live across Ethereum, Bitcoin, and Hyperliquid..."
# 4. MCP tools/list (68 tools)
curl -X POST https://mcp.bitpoort.com/ -H "X-API-Key: $KEY" -H "Mcp-Session-Id: $SESSION" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/list"}'
# Expected: result.tools length == 68.
# 5. MCP tool call
curl -X POST https://mcp.bitpoort.com/ -H "X-API-Key: $KEY" -H "Mcp-Session-Id: $SESSION" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get_network_summary","arguments":{"chain":"ETH"}}}'
# Expected: result.content[0].text is a JSON string. Parsed:
# {chain:"ETH", health_score, latest_block, hourly{...}, whales_1h{...}}.