PuntersEdge Developers
PuntersEdge MCP server
The official Model Context Protocol server for the PuntersEdge Australian racing and sports odds API. Install one package, set one environment variable, and Claude Desktop, Claude Code, Cursor or any other MCP host can read live per-bookmaker odds, best prices, settled results and market movement — with the credit cost of every tool stated before it is called.
What it is
A small Python process that speaks MCP over stdio and forwards each tool call to the same REST endpoints documented on this site. It adds nothing the HTTP API does not have; what it adds for an assistant is a typed tool surface with costs in the descriptions, the credit balance returned after every call so the assistant can budget without spending a request, and a read-only design — nothing that rotates keys, touches billing or places a bet is exposed.
| Package | puntersedge-mcp on PyPI — currently 0.3.0, read from PyPI — MIT licensed. pip installs the latest; nothing here pins a version. |
|---|---|
| Command | puntersedge-mcp |
| Transport | stdio (runs locally, next to the client) |
| Python | >=3.10 |
| API key | read from the PUNTERSEDGE_API_KEY environment variable; never logged or echoed in tool output |
| Base URL override | PUNTERSEDGE_BASE_URL (optional; defaults to https://api.puntersedge.online) |
Install
Either install it, or let uvx fetch and run it on demand:
pip install puntersedge-mcp
# or, with uv installed, no install step at all:
uvx puntersedge-mcp
You need an API key. Sign up at /api — the free tier is 3,000 credits a month with no credit card. The demo tool works without a key, so a host can be wired up and tested before the key arrives.
Configure your client
Every MCP host takes the same three facts: a command, optional arguments and an
env block carrying PUNTERSEDGE_API_KEY. The snippets use the
installed puntersedge-mcp command; to run through uvx
instead, set "command": "uvx" and "args": ["puntersedge-mcp"].
Claude Desktop
Edit claude_desktop_config.json (Claude → Settings → Developer → Edit
Config) and restart Claude Desktop:
{
"mcpServers": {
"puntersedge": {
"command": "puntersedge-mcp",
"env": { "PUNTERSEDGE_API_KEY": "your-key-here" }
}
}
}
Claude Code
One command from the project directory:
claude mcp add puntersedge -e PUNTERSEDGE_API_KEY=your-key-here -- puntersedge-mcp
Cursor
Create .cursor/mcp.json in the project (or ~/.cursor/mcp.json
for every project):
{
"mcpServers": {
"puntersedge": {
"command": "puntersedge-mcp",
"env": { "PUNTERSEDGE_API_KEY": "your-key-here" }
}
}
}
Any other MCP host
The same JSON shape works wherever a host accepts a stdio server. Keep the key in the
env block or the process environment rather than in a prompt; the server
reads it once at start-up.
Tools
Twenty-six tools, all read-only. Costs are in API credits and are the amounts the API bills
for the underlying endpoint — a next-to-go call is 2 credits (JSON), the
same as calling /v1/racing/next-to-go over HTTP. Each name links
to the endpoint's reference page, which carries the full parameter list and response
shape.
| Tool | What it returns | Cost |
|---|---|---|
racing_next_to_go |
Next Australian/NZ races to jump, with runners and live per-bookmaker prices. Filters: categories (horse, greyhound, harness), country, venue, bookmakers, num_races. Each price carries its own age_seconds and stale flag. | 2 credits (JSON) |
racing_best_odds |
Best win, place and tote price per runner across every bookmaker, with the book offering it and the market percentage. | 3 credits |
racing_movers |
Consensus firmers and drifters in the live window. min_books only reports a move confirmed by that many bookmakers, which separates a real move from one book repricing. | 3 credits |
racing_changes |
Only the races and prices that changed since a timestamp — the right way to watch a market, instead of re-downloading the card on a timer. Returns the cursor for the next call. | 2 credits |
racing_events |
Scheduled races in a forward window, without prices. Cheaper than next-to-go when you only need the card. | 1 credit |
racing_track_conditions |
Track condition, weather and rail position: current state plus the day's change log. | 1 credit |
racing_acceptances |
Full-day AU thoroughbred acceptance card. Several counts are a floor rather than an exact figure; the response states the bound. | 2 credits |
racing_venues |
Canonical venue directory: venue_id, display name, physical site, country and the codes run there. | 1 credit |
racing_results |
Settled AU/NZ results: dividends, plus the full finishing order with jockey, trainer, margin, starting price and, on every thoroughbred runner, horse_ref, the key that joins one horse across meetings. | 2 credits |
racing_results_coverage |
What results coverage measurably is — the honest answer before reporting that a race is missing a result. | 1 credit |
racing_price_history |
Recorded per-bookmaker price ticks for one race — the market movement record. | 5 credits |
racing_closing_lines |
The permanent closing-line and result archive, for measuring closing line value. Standard plan and above. | 5 credits (JSON) |
racing_closing_lines_coverage |
What the archive holds: floor date, row and race counts, how much is a true closing line and how much is resulted. | 1 credit |
racing_clv |
Score up to 200 bets against the closing line each race closed at: per-bet CLV, beat-the-close, result and P&L, plus the averages, beat rate and ROI. Plus and above. | 5 credits |
horse_form |
Thoroughbred form, career record and profile for one horse, by name or by its pe: horse_ref; an ra: runner_ref pins one meeting's entry. | 3 credits |
horse_runs |
Every run we hold for one horse from our own settled results since 1 September 2026, with a starts/wins/places summary. | 3 credits |
greyhound_form |
Every run we hold for one dog from our own results since 13 September 2026, by name or registry ref. | 3 credits |
greyhound_stats |
One dog's record from our own results, split by track, distance or box. | 3 credits |
jockey_stats |
Jockey premiership leaderboards, or one jockey by name, per state, scope and season. | 2 credits |
trainer_stats |
Trainer premiership leaderboards, or one trainer by name. | 2 credits |
list_sports |
The sport catalogue: every queryable sport_key with its display name. Racing is not in here and has no sport key. | 1 credit |
sports_odds |
Head-to-head, spread and total prices per bookmaker for a sport's upcoming fixtures (afl, nrl, nba and so on). Every market carries a quality object. | per market |
best_odds |
Best available price per outcome across bookmakers for one sport. | 3 credits |
arb_best_prices |
Cross-book price comparison per selection, with every bookmaker's quote alongside the best. | 2 credits |
check_usage |
The key's plan, monthly allowance, credits used and reset date. | free |
check_overage |
Whether the account may run past its allowance, the rate, the ceiling the API enforces and what this period would be invoiced if it ended now. | free |
bulk_datasets |
The catalogue of pre-built dataset files: daily files and monthly bundles with rows, bytes, digest and URL. Business and above. | free |
connector_health |
Per-bookmaker feed freshness: last_ok, status, records written. How an agent tells a quiet market from a stalled scraper, which keeps serving its last value rather than erroring. | free |
demo_next_to_go |
No-key sandbox sample of racing_next_to_go, for exploring the response shape before spending credits. | free |
demo_best_odds |
No-key sandbox sample of sports best-odds with arb detection. | free |
sports_odds is billed one credit per market type requested, which is why
its row carries no single figure. Every priced response is wrapped as
{"data": ..., "credits_remaining": "..."}, the second value coming from
the API's X-Credits-Remaining header. A 402 means the monthly
allowance is spent — or, on Business and Platform with overage switched on, that
the overage ceiling above it is spent too — and the tool result says so rather
than failing silently.
Notes the server gives the assistant
- Racing lives under the
racing_*tools, not a sport key. Categories arehorse,greyhoundandharness. - Prices are decimal odds. Every racing quote carries its own
age_seconds; every sports market carries aqualityobject. The assistant is told to trust those over assumptions. - Settle only against
status: "final"results — interim placings can change on protest. horse_refon every thoroughbred runner is the key that joins one horse across meetings.runner_refis Racing Australia's code for that meeting's entry and changes from meeting to meeting; greyhound refs are per-dog registry ids and do persist.- Omit
countryon next-to-go unless you need a filter: late-card races can be country-unresolved and a filter would drop them.
Prefer a prompt-only route?
If you cannot run a local process — a custom GPT, a hosted agent, a browser-only
assistant — Use the API from ChatGPT, Claude, Cursor
and Copilot covers the OpenAPI-import and llms.txt paths, and includes
a worked prompt.