80 MCP tools and 328 REST paths (364 OpenAPI operations) live across Ethereum, Bitcoin, and Hyperliquid. 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"}}}'
The live catalog (names + schemas, params, defaults, min/max bounds) is returned by tools/list; the same list with usage notes is at /agents.md. Lanes: RAG / natural language · block & tx data · raw RPC (own archive nodes) · whales / entities · market · signals · behavioral · Hyperliquid perps · forensic & compliance (sanctions + PEP screening, mixer detection, flow tracing, signed compliance reports with public re-verification) · compliance monitoring · agent identity (KYA) · system.
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) |
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
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 equals the catalog size advertised in
# /.well-known/mcp.json (tool_count).
# 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{...}}.