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 — version 0.2.1 at the time of writing, MIT licensed |
|---|---|
| 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 1,500 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, 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 |
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 a stable runner_ref per runner. | 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 |
horse_form |
Thoroughbred form, career record and profile for one horse, by name or by the stable ra: code from runner_ref. | 3 credits |
greyhound_form |
Form history for one dog, by name or Topaz dogId. | 3 credits |
greyhound_stats |
One dog's record broken down by track, distance, box or grade — crossable, e.g. track and distance together. | 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 |
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; it is a hard stop with no overage billing, 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. runner_refin results is a stable registry identifier that persists across meetings; use it, not the name, for longitudinal joins.- 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.