Skip to main content

PuntersEdge MCP Server

Official MCP server for the PuntersEdge odds API — Australian and New Zealand racing odds (AU thoroughbred, greyhound and harness; NZ thoroughbred and harness) and Australian sports odds: live per-bookmaker prices, the change feed, best-price comparison, full-field results, form, premiership tables, the closing-line archive and feed health, for AI agents. Bookmaker coverage is measured live at puntersedge.online/api/coverage rather than fixed here.

Install

pip install puntersedge-mcp

Configure

Get a free API key (1,500 credits/month, no card) at puntersedge.online/api, then add it to your MCP client config (Claude Desktop, Claude Code, Cursor, or any MCP host):

{
  "mcpServers": {
    "puntersedge": {
      "command": "puntersedge-mcp",
      "env": { "PUNTERSEDGE_API_KEY": "your-key-here" }
    }
  }
}

Claude Code, in one line:

claude mcp add puntersedge --env PUNTERSEDGE_API_KEY=your-key-here -- puntersedge-mcp

Tools

Read only. Nothing here mutates — no key rotation, no billing, no webhook creation. An agent should not be able to rotate its own credentials, change what is billed, or register a URL that will then receive data. Those endpoints exist and are documented; they are reached deliberately, from application code, not from a chat turn.

Racing — live

Tool Cost What it returns
racing_next_to_go 2 cr Next AU/NZ races with runners and live per-bookmaker prices
racing_best_odds 3 cr Best win/place/tote per runner, with the book offering it and the market percentage
racing_movers 3 cr Consensus firmers and drifters right now
racing_changes 2 cr Only what moved since a timestamp — the right way to watch a market
racing_events 1 cr The forward card without prices
racing_track_conditions 1 cr Going, weather and rail, plus the day's change log
racing_acceptances 2 cr Full-day AU thoroughbred acceptance card
racing_venues 1 cr Canonical venue directory — venue_id for joining across endpoints

Racing — results and history

Tool Cost What it returns
racing_results 2 cr Settled results: dividends and the full finishing order, with horse_ref on every thoroughbred runner
racing_results_coverage 1 cr What results coverage measurably is
racing_price_history 5 cr Recorded per-book price ticks for one race
racing_closing_lines 5 cr The permanent closing-line archive (Standard plan and above)
racing_closing_lines_coverage 1 cr What the archive actually holds
racing_clv 5 cr Score up to 200 bets against the closing line: per-bet CLV and P&L, plus the averages, beat rate and ROI (Plus and above)

Racing — form and premierships

Tool Cost What it returns
horse_form 3 cr Thoroughbred form, career record and profile for one horse (Racing Australia's page)
horse_runs 3 cr One horse's runs in our own settled results since 1 Sep 2026, with a starts/wins/places summary
greyhound_form 3 cr Form history for one dog
greyhound_stats 3 cr One dog's record by track, distance or box
jockey_stats 2 cr Jockey premiership tables, or one jockey by name
trainer_stats 2 cr Trainer premiership tables, or one trainer by name

Sports

Tool Cost What it returns
list_sports 1 cr The sport catalogue
sports_odds 1 cr per market Per-bookmaker prices for a sport's fixtures
best_odds 3 cr Best price per outcome for one sport
arb_best_prices 2 cr Cross-book comparison per selection

Account, health, sandbox

Tool Cost What it returns
check_usage free Plan, allowance, credits used, reset date
check_overage free Whether calls may run past the allowance, the rate, the ceiling and this period's estimate
bulk_datasets free The catalogue of pre-built dataset files (rows, bytes, digest, URL)
connector_health free Per-bookmaker feed freshness — a quiet market vs a broken feed
demo_next_to_go free No-key sandbox sample, to explore the shape
demo_best_odds free No-key sandbox sports sample

Every tool response includes credits_remaining, and credits_warning once you cross the threshold, so an agent can budget without spending a call on check_usage. Costs are enforced server-side; a 402 is a hard stop, never overage billing.

sports_odds is billed per market requested — markets="h2h,spreads,totals" is three credits, not one — so it has no single figure and the tool description says so rather than naming one that is right only for the default.

Notes for agents

  • Racing is not a sport key. There is no sport_key of horse-racing. Racing is under the racing_* tools; categories are horse, greyhound and harness. country filters by ISO code (AU, NZ or AU,NZ); omit it to get every meeting. New Zealand is thoroughbred and harness only — there are no NZ greyhounds in the feed.
  • Do not poll racing_next_to_go. It re-downloads every race every time and bills 2 credits for it. racing_changes returns only what moved and hands back the cursor for the next call. The cursor sits 30 seconds behind the server clock so nothing in flight is skipped, which makes the feed at-least-once — expect to see a race twice.
  • A stale price looks exactly like a live one. A stalled scraper does not error; it keeps serving its last value. Every racing quote carries age_seconds and stale, and connector_health reports last_ok per bookmaker. Check it before telling someone a market has settled.
  • Prices are decimal odds in AUD markets. Every sports market carries a quality object; trust it over assumptions.
  • Settle only against status: "final". Interim placings can change on protest.
  • Join one thoroughbred across meetings on horse_ref, not runner_ref. Every thoroughbred runner and placing in results, every live-board runner, every archive row and every form response carries horse_ref (pe:<name>), and it is the same value on all of them. runner_ref (ra:<code>) is Racing Australia's code for that day's entry and changes from meeting to meeting (measured 21 Sep 2026: 1,450 of 1,452 horses with two or more runs carried a different code on each), so it joins a row to its own meeting only. Greyhound refs (grv:/grsa:) are per-dog registry ids and do persist.
  • Do not loop horse_form over a field or a list. The upstream rate-limits hard. For many horses there is a paced bulk backfill queue, reached from application code. When the answer is a 503 saying Racing Australia is refusing fresh reads, horse_runs is our own record of the horse and does not depend on that page.
  • On racing_acceptances, several counts are a floor, not an exact figure, wherever a race reports runner_set_status other than checks_passed. The response's completeness block states the bound. Say "at least N" rather than reporting a field size.
  • One book quoting both legs is not an arb. A large apparent edge on a two-outcome market that only one bookmaker is pricing is a data artefact.

Also available

  • Rules for coding agents — AGENTS.md, a drop-in instructions file so Claude Code, Cursor or Copilot write correct PuntersEdge code. The MCP server lets an agent read live odds; that file makes it write better clients.
  • SDKs — npm install puntersedge (TypeScript/JavaScript), pip install puntersedge (Python).
  • Schema — https://api.puntersedge.online/openapi.json.

Development

python3 tests/check_contract.py .        # checks every tool against the live OpenAPI document

That test drives each tool through a stub and verifies three things the runtime will not tell you about: that the path exists, that every query parameter is one the endpoint actually declares, and that the credit cost in the docstring matches what the API charges. It is the test that catches a tool quietly sending a filter the server ignores.

Changelog

0.3.0 — runner_ref on thoroughbreds is not a horse identity, and this package said it was. It is Racing Australia's code for that day's entry and changes from meeting to meeting; horse_ref (pe:<name>), now on every thoroughbred surface, is the join key. Tool texts, the server instructions and the notes above say so. New horse_runs tool: one horse's runs in our own settled results (3 credits), the fallback when Racing Australia refuses a fresh form read. Also new: racing_clv (score up to 200 bets against the closing line, 5 credits, Plus and above — the server's first POST tool), check_overage and bulk_datasets (both free). greyhound_stats no longer claims a grade dimension.

0.2.1 — The "Rules for coding agents" link named github.com/puntersedge/puntersedge-examples. That account exists and belongs to someone else; ours is Propertyscout001. Documentation only.

0.2.0 — 16 new tools (change feed, events, track conditions, acceptances, venues, results coverage, closing lines and coverage, horse and greyhound form, greyhound stats, jockey and trainer premierships, cross-book comparison, connector health, sports sandbox). Corrected three understated credit costs: best_odds said 2 and is 3, racing_price_history said 3 and is 5, sports_odds said 2 and is one per market. Removed num_races from racing_movers — that endpoint has no such parameter, so the filter had silently done nothing since 0.1.0; use limit. Status-specific error hints, and a contract test to stop all of that recurring.

0.1.1 — Package text says Australian and New Zealand racing, with no fixed book count.

0.1.0 — First release.

Metadata

Release files for puntersedge-mcp 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for puntersedge-mcp 0.3.0
File Size Uploaded Provenance
puntersedge_mcp-0.3.0.tar.gz 17.7 kB Without provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for puntersedge-mcp 0.3.0
File Interpreter ABI Platform
puntersedge_mcp-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 39.0 kB

Release files / puntersedge_mcp-0.3.0.tar.gz

Download URL puntersedge_mcp-0.3.0.tar.gz
Size 17.7 kB
Tags Source
SHA-256 checksum
How to use checksums
e7f9ea590520990fb6c9856c6f8cd34930d0b938d4335b73318ad614b119b66f
BLAKE2b-256 checksum
How to use checksums
f5705e25f0fc718dc18f9c2a85c90e1527e226c41de5a4b55a74cc67370afa04
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.13

Release files / puntersedge_mcp-0.3.0-py3-none-any.whl

Download URL puntersedge_mcp-0.3.0-py3-none-any.whl
Size 21.2 kB
Tags Python 3
SHA-256 checksum
How to use checksums
87306c535e086de0c76f485236387eee4daccfee07bba7eb12defb11b4f354e5
BLAKE2b-256 checksum
How to use checksums
561d70fe4929dff04f00297438652cc47a4831b46934bc19e5496d3114c27380
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.12.13

Security for puntersedge-mcp 0.3.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page