cuporacle-mcp
# Claude Code โ the 4 free data tools work with just two free API keys
claude mcp add cuporacle -- npx -y cuporacle-mcpPublished:
cuporacle-mcpis live on npm (also mirrored to GitHub Packages as@edycutjong/cuporacle-mcp), so thenpx -y cuporacle-mcpline above works today. Prefer source?git clone https://github.com/edycutjong/cuporacle-mcp && cd cuporacle-mcp && npm install && npm run smoke.
cuporacle-mcp is a standalone Model Context Protocol
server that runs side by side with the Injective MCP server: 8 tools + 2
resources + 1 prompt over stdio. Free data tools work out of the box; wc_edge
is a reference implementation of an agent buying and proving its own alpha
keylessly via Injective's x402.
๐งโโ๏ธ Notes for judges โ reproduce in < 5 min
Zero-cost path. The four free tools (
wc_fixtures,wc_live,wc_odds,wc_bracket) return real live World Cup 2026 data with just the two free API keys โ no wallet, no funds.The x402 buyer path runs with zero funds.
wc_edge(matchId, dry_run: true)(ornpm run paid-call-smoke) parses the recorded 402 quote, enforces the spend cap, and signs the EIP-3009 authorization locally โ a deterministic proof of the payment client with no money moved and no fabricated receipt.< 5-minute reproduce:
npm install npm run smoke # cold-start over stdio โ lists 8 tools/2 resources/1 prompt + a live free call npm test # 63 vitest (schemas ยท spend cap ยท 402-parse ยท EIP-3009 sign ยท receipts ยท degrade) npm run inspector # official MCP Inspector conformance against the built dist/Honestly gated (not faked) โ and now proven for real: on 2026-07-18 the agent made its first real settled
wc_edgepurchase against the live LineLock API โ 0.05 USDC on Injective EVM mainnet, receipt tx0x89cd955cf4cab5efcb7a25cbc8e25851c8524a186f2aa449d11e4b598541a07d. Verify it yourself:receipt_verify("0x89cdโฆ"). With zero funds,dry_runremains the reproduce path, andwc_edgestill degrades to free odds โ never an invented edge or receipt โ full honest state inSTATUS.md.
๐ก Why this exists
Agents have no first-class sports capability. Injective's own MCP server covers wallets, markets, CCTP and trading โ but an agent asked "is tonight's match worth a bet?" has to hallucinate or scrape, and there's no pattern for an agent paying for premium data itself. CupOracle is that missing layer, built as a composable server that runs side by side with the Injective MCP server.
๐งฐ Tools
Tool | Gate | Returns |
| free | fixtures for a day or the next upcoming window |
| free | live score, minute, status |
| free | consensus h2h odds + de-vigged implied probabilities |
| free | knockout bracket state (R16 โ Final) |
| pays x402 | CLV-audited edge + conviction ladder + receipt tx |
| free | verifies a receipt on Injective EVM (block time, amount, payee) |
| free | CCTP runbook to fund the agent wallet |
| free | the agent's own purchase history: entries + receipts + session total vs cap |
Resources: wc://bracket, wc://ledger ยท Prompt: analyze-match(matchId).
๐ Quickstart
1. Get keys
football-data.org free tier โ
FOOTBALL_DATA_KEYthe-odds-api.com free tier โ
ODDS_API_KEY
The four free data tools work with just these two keys. wc_edge additionally
needs a payer wallet (see Funding).
2. Add to your harness
Claude Desktop (claude_desktop_config.json):
{
"mcpServers": {
"cuporacle": {
"command": "npx",
"args": ["-y", "cuporacle-mcp"],
"env": {
"FOOTBALL_DATA_KEY": "โฆ",
"ODDS_API_KEY": "โฆ",
"CUPORACLE_PRIVATE_KEY": "0xโฆ",
"CUPORACLE_MAX_SPEND": "0.50"
}
}
}
}Claude Code:
claude mcp add cuporacle \
-e FOOTBALL_DATA_KEY=โฆ -e ODDS_API_KEY=โฆ \
-e CUPORACLE_PRIVATE_KEY=0xโฆ -e CUPORACLE_MAX_SPEND=0.50 \
-- npx -y cuporacle-mcpCursor (.cursor/mcp.json):
{
"mcpServers": {
"cuporacle": { "command": "npx", "args": ["-y", "cuporacle-mcp"],
"env": { "FOOTBALL_DATA_KEY": "โฆ", "ODDS_API_KEY": "โฆ" } }
}
}3. Ask
"What's tonight's Semi-Final, and is it worth a bet?"
The assistant lists the fixture (wc_fixtures), pulls odds (wc_odds), buys a
vetted edge for ~5ยข (wc_edge) paying via x402 itself, and cites the
receipt. Paste that hash into receipt_verify to confirm the payment on Injective.
(Funded path โ now exercised for real: first settled receipt 0x89cd955cโฆ541a07d
on 2026-07-18, see "Notes for judges". With no funds, wc_edge dry-runs or
degrades to free odds and says so.)
๐ ๏ธ Injective technologies used
CupOracle is Injective-native by construction โ remove any layer and it's just a scraper or a hosted API with a billing page.
# | Technology | Exact surface | Where |
1 | MCP Server | Publishes a complete server (stdio): 8 tools + 2 resources + 1 prompt, Inspector-conformance-checked. Extends the InjectiveLabs/mcp-server pattern and runs beside it. | the whole package |
2 | x402 | Autonomous client: parses the 402 quote ( |
|
3 | Agent Skills | Ships the |
|
4 | USDC + CCTP | Native USDC |
|
5 | Injective EVM | Mainnet |
|
Interop, not wrap. CupOracle does not reimplement chain ops or wrap the Injective MCP tools as its own โ both servers run in the same harness and the Skill routes funding to Injective's tools. Honesty over land-grab.
๐ The autonomous-payment loop (wc_edge)
flowchart TD
A["POST /api/edge"] --> B["402 Payment Required<br/>accepts: network eip155:1776 ยท amount 50000 ยท asset USDC ยท payTo"]
B --> C["spend-cap gate<br/>per-call max ยท per-session cap ยท ask human above cap"]
C --> D["sign EIP-3009 authorization<br/>local viem signTypedData โ no broadcast"]
D --> E["retry with PAYMENT-SIGNATURE header"]
E --> F["200 OK<br/>{ edge, ladder, pick_hash } + PAYMENT-RESPONSE { transaction: 0xโฆ }"]
F --> G["agent cites receipt_tx"]
G --> H["receipt_verify(0xโฆ)"]
H --> I["block time + amount on Injective"]Spending is auditable in-conversation via wc_spend_ledger (and wc://ledger).
Failures teach: INSUFFICIENT_USDC carries the CCTP runbook; SPEND_CAP_HIT
carries the cap and how to raise it (ask the human โ the agent never raises its own).
๐ฐ Funding the agent wallet
wc_edge needs a few cents of USDC on Injective. Generate a throwaway payer
wallet and fund it via CCTP:
npx cuporacle-mcp init # prints a fresh wallet address + keyThen call wallet_fund_guide (or ask your agent to) for the CCTP steps, executed
with the Injective MCP server: account_balances โ cctp_supported_chains โ burn on Base (domain 6) โ cctp_attestation_status โ cctp_mint. Fund only cents; the
default cap is 0.50 USDC.
๐งโ๐ป Development
npm install
npm run smoke # cold-start over stdio, list 8 tools/2 resources/1 prompt, one live call
npm test # 63 vitest (schemas, spend cap, 402-parse, EIP-3009 sign, receipts, degrade)
npm run bench # cache hit/miss + wc_edge dry_run (parse+sign) p50/p95
npm run build # tsup โ dist (publish-ready)
SMOKE_BIN=dist npm run smoke # smoke the built artifactnpm run paid-call-smoke runs a real paid wc_edge end-to-end โ it is
funds-gated behind CUPORACLE_ALLOW_PAID=1 and a funded key, and otherwise falls
back to a dry run.
๐งช Engineering harness & CI
This is a published npm library, not a web app โ so the pipeline swaps the
usual browser E2E / Lighthouse stages for the two proofs that actually matter for
a stdio MCP server: a cold-start over real stdio (npm run smoke) and
official MCP Inspector protocol conformance against the built dist/.
Multi-stage CI: Quality โ Security โ Build โ MCP Conformance โ Publish-readiness.
# โโ Quality โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
npm run typecheck # tsc --noEmit (strict)
npm test # vitest โ 63 passing
npm run ci # typecheck + test + build + smoke (local gate)
# โโ MCP "E2E" (no browser โ this is the end-to-end proof) โโ
npm run smoke # cold-start over stdio โ 8 tools / 2 resources / 1 prompt + a live free call
npm run inspector # official MCP Inspector conformance against dist/
SMOKE_BIN=dist npm run smoke # smoke the exact built artifact npm ships
# โโ Security โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
make security-scan # npm audit + license-checker (no GPL/AGPL in prod deps)Layer | Tool | Status |
Type safety | TypeScript ( | โ |
Unit / contract tests | Vitest โ 63 passing (schemas ยท spend cap ยท 402-parse ยท EIP-3009 sign ยท receipts ยท degrade) | โ |
Protocol "E2E" (smoke) | MCP stdio smoke โ cold-start lists 8 tools / 2 resources / 1 prompt + a live free call | โ |
Protocol conformance | MCP Inspector ( | โ |
Static analysis (SAST) | CodeQL ( | โ |
Dependency updates (SCA) | Dependabot (npm + github-actions, weekly) + | โ |
Secret scanning | TruffleHog (verified-only) | โ |
Publish readiness |
| โ |
No Playwright / Lighthouse โ there is no browser surface to drive or audit. The equivalent guarantee is the stdio smoke + Inspector conformance above, both run in CI on every push and PR. Also see
make helpfor the full target list.
โ๏ธ Configuration
Env | Default | Meaning |
| โ | football-data.org key (free data tools) |
| โ | the-odds-api.com key (odds) |
| โ | payer wallet key for |
|
| per-session USDC spend cap |
|
|
|
|
| upstream edge provider |
๐งฉ Extend it (add your own sport)
Each tool is { name, config, handler } (src/tools/). To add, say, a cricket
server: copy a free tool, swap the data client in src/data/, register it in
src/tools/index.ts. The x402 client (src/x402/) is sport-agnostic โ reuse it
to sell any premium signal. PRs welcome.
โ ๏ธ Honest limitations
wc_edgedepends on LineLock's/api/edge(a disclosed sibling project). If it's down,wc_edgedegrades to free odds โ it never fabricates an edge.Free-tier data APIs cap request rates โ 60s cache + committed snapshots (always labeled
[snapshot]).The payer keystore holds a real (tiny) balance. Spend caps default low; fund only cents. Windows keystore paths are documented, not hardened.
๐ License
MIT. "Football data provided by the Football-Data.org API."