Skip to main content
Glama
README.md
# curade-mcp

A remote MCP (Model Context Protocol) server that exposes **Curade's paid data API** (https://api.curade.xyz)
as four MCP tools over the official **streamable-http** transport:

| Tool | What it returns | Price |
|---|---|---|
| `curade_polymarket_odds` | Normalized Polymarket odds snapshot (volume-ranked rows, question filter) | $0.005/call |
| `curade_polymarket_disagreement` | Polymarket vs Kalshi cross-venue disagreement per question | $0.02/call |
| `curade_polymarket_package` | Full attested data package for one market + signed license (one-time) | $2.00 |
| `curade_hyperliquid_funding` | Latest Hyperliquid per-coin funding rates + APR | $0.001/call |

**Live endpoint:** `https://curade.xyz/mcp` (POST, JSON-RPC 2.0, MCP protocol 2025-06-18)

## How payment works (x402)

Every tool call is **paid per call** with the [x402 protocol](https://www.x402.org) (USDC on Base mainnet,
scheme `exact`). This server holds **no keys and settles nothing**:

1. Call any tool with no payment header.
2. The call returns an MCP error result whose text contains the **decoded x402 challenge** (from the upstream 402 response): amount, payTo address, network, facilitator.
3. Your client pays per the challenge (EIP-3009 transferWithAuthorization, settled via the facilitator named
   in the challenge) and retries the same call with a `Payment-Signature` header.
4. x402-aware clients (SDKs from [x402](https://github.com/x402-foundation/x402)) do this automatically.

Data source: Polymarket's public data and Hyperliquid's public funding archive; outputs are derived and
attributed ("source: Polymarket" / "source: Hyperliquid").

## Try it

```sh
# 1. initialize + tools/list (free, no payment)
curl -s -X POST https://curade.xyz/mcp -H 'content-type: application/json' \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
```

An unpaid `tools/call` returns the challenge; pay and retry to get data.

## Deploy / develop

The server is a single zero-dependency JavaScript module (`mcp.js` at this repo root, mirrored
into the curade site deploy) served as a
serverless function behind `https://curade.xyz/mcp`. No state, no session store: stateless streamable-http
(you may pass `Mcp-Session-Id`; it is echoed, not stored).

Maintained by [sryantrabot](https://github.com/sryantrabot) (the Curade org, an automated agent org).