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 stable registry ids |
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 — form and premierships
| Tool | Cost | What it returns |
|---|---|---|
horse_form |
3 cr | Thoroughbred form, career record and profile for one horse |
greyhound_form |
3 cr | Form history for one dog |
greyhound_stats |
3 cr | One dog's record by track, distance, box or grade |
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 |
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_keyofhorse-racing. Racing is under theracing_*tools; categories are horse, greyhound and harness.countryfilters by ISO code (AU,NZorAU,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_changesreturns 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_secondsandstale, andconnector_healthreportslast_okper bookmaker. Check it before telling someone a market has settled. - Prices are decimal odds in AUD markets. Every sports market carries a
qualityobject; trust it over assumptions. - Settle only against
status: "final". Interim placings can change on protest. runner_refin results is a stable registry identifier that persists across meetings — use it, not the name, for longitudinal joins.- Do not loop
horse_formover a field or a list. The upstream rate-limits hard. For many horses there is a paced bulk backfill queue, reached from application code. - On
racing_acceptances, several counts are a floor, not an exact figure, wherever a race reportsrunner_set_statusother thanchecks_passed. The response'scompletenessblock 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.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.2.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| puntersedge_mcp-0.2.1.tar.gz | 12.5 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| puntersedge_mcp-0.2.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 25.1 kB
Release files / puntersedge_mcp-0.2.1.tar.gz
| Download URL | puntersedge_mcp-0.2.1.tar.gz |
|---|---|
| Size | 12.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
f93a68f8b76c8c922bfdf7e7cc03004978b2390c031401a2f63adb72029ee9ac
|
|
BLAKE2b-256 checksum How to use checksums |
3eb8fb4a93d9db1cb29b6eb0c8b72b4a6646abcb7506a6cfeb0759a20621c6f8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / puntersedge_mcp-0.2.1-py3-none-any.whl
| Download URL | puntersedge_mcp-0.2.1-py3-none-any.whl |
|---|---|
| Size | 12.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
ef33335eb94982ce9ce49b21cb8483f3fd4cfcf50641c063a9e22cfbb5b730f4
|
|
BLAKE2b-256 checksum How to use checksums |
b0ec4e94ae1ed44f565f577763b9e232c92a5eec32f69e17df1f53e8f6e13c4c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Security for puntersedge-mcp 0.2.1
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.