Documentation / Guides
MCP server for Claude and ChatGPT
Connect GreyhoundAPI to Claude, ChatGPT or any Model Context Protocol client and ask about GB and Australian greyhound racing in plain English. How to set it up, which tools the assistant gets, and how it decides which to call.
The Model Context Protocol is a standard way for an AI assistant to call an external service. Point Claude or ChatGPT at our MCP server and racing data becomes something it can look up mid-conversation, rather than something you have to fetch and paste in.
There is nothing to install and nothing to run. The server is hosted at
https://greyhoundapi.com/mcp and authenticates with the same API key
you already use. The overview page covers the pitch; this guide is the
detail.
Why bother
- No integration to write. The 23 tools describe themselves, so the assistant works out which one answers your question and how to fill in its arguments.
- Names resolve themselves. Ask about a dog by name and the assistant calls
find_dogfirst to get an id, then the tool that needs it. You never see the two-step. - It is your key. Same tier scope, same rate limits, same quota. Nothing is bypassed and nothing is billed differently.
- Good for exploring. Working out whether the data suits you takes minutes in a chat window rather than an afternoon of writing throwaway scripts.
Connect it in Claude
Settings → Connectors → Add custom connector.
- URL:
https://greyhoundapi.com/mcp - Authentication: None. This is the step that catches people — Claude also offers two OAuth options and either will fail to connect. This server uses an API key header, not OAuth, and Claude normally detects that and marks None as Detected.
- Under Additional request headers, add
x-api-keywith your key as the value. - Transport: leave it. Streamable HTTP is set from the URL and is correct.
Other clients work the same way: that address, and your key in an x-api-key
header. Authorization: Bearer <key> is accepted too, for clients that only
offer bearer tokens.
What the assistant actually does
Two calls, both JSON-RPC 2.0 over HTTP POST. On connecting it asks what
exists:
curl -X POST https://greyhoundapi.com/mcp \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Then, when your question needs data, it calls one:
{
"jsonrpc": "2.0", "id": 2, "method": "tools/call",
"params": {
"name": "find_races",
"arguments": { "date_from": "2026-08-24", "date_to": "2026-08-24", "region": "GB" }
}
}The server forwards that to the public REST API with your key, so every gate that applies to a normal request applies here too. The answer comes back as text the assistant reads, prefixed with anything worth knowing — how many results were truncated, how fresh the data is, or why a list came back empty.
The tools
23 of the 62 endpoints are exposed, chosen because they match how people ask questions. A model given every endpoint picks badly, and most clients show the list in a picker. Anything not here is still reachable through the REST API.
| Tool | Endpoint | Plan | What it answers |
|---|---|---|---|
todays_racecards |
/v1/racecards/today |
Free | Every race card scheduled today across Great Britain and Australia, with runners, trap draws and scheduled off times. |
upcoming_races |
/v1/racecards/upcoming |
Free | Races due off shortly, nearest first. Use this for "what is running next". |
latest_results |
/v1/results/latest |
Free | The most recently settled races, newest first, with finishing order and times. |
find_races |
/v1/races |
Free | Search the race archive by date range, region, track, grade, distance or status. The general-purpose way to locate races. |
get_race |
/v1/races/{race_id} |
Free | One race in full: conditions, going, distance, grade and its runners. |
get_race_result |
/v1/races/{race_id}/result |
Live | The finishing order for one race, with times, sectionals and starting prices where published. |
dog_layoff |
/v1/dogs/{dog_id}/layoff |
Live Plus | How a greyhound has run after different lengths of time off, beside how greyhounds generally run after the same break. Rates are suppressed where the dog has too few runs; counts are always shown. |
dog_trend |
/v1/dogs/{dog_id}/trend |
Live Plus | Whether a greyhound is running quicker or slower lately, each run measured against par for that track and distance, with the change shown beside the dog's own run-to-run variation so noise is not mistaken for a trend. |
meeting_analysis |
/v1/meetings/{meeting_id}/analysis |
Live Plus | A whole card as one unit: how fast the track actually ran against par for each distance, and whether the published going agreed. Trap wins are counts only — a single card cannot show bias. |
race_precedents |
/v1/races/{race_id}/precedents |
Live Plus | Races from the archive that ran under matching conditions at this track and distance, with what happened in them. Each row says what it matched on and where it differs. History, never a forecast. |
race_field |
/v1/races/{race_id}/field |
Live Plus | Every runner in one race with its record at this track and trip, its grade record, days since it last ran and how it has run off that break, beside the strike rate of the trap it has drawn. Replaces a call per runner per measure. Measurements only, never a forecast; runners short of history are named, not omitted. |
race_analysis |
/v1/races/{race_id}/analysis |
Live Plus | Conditions and early pace for one race in a single call, joined per runner — trap record, winning times, field experience and each runner's early split with its sample size. Measurements only, never a forecast. |
race_pace |
/v1/races/{race_id}/pace |
Live Plus | Each runner's measured early split from past runs at this track and distance, with the run count behind every figure. Runners with too little data are named, not omitted. Measurements only, never a forecast. |
race_conditions |
/v1/races/{race_id}/conditions |
Live Plus | The context one race runs in: trap strike rates at this track and distance, typical winning time, and how experienced the field is. Every figure carries its sample size. Historical context, never a forecast. |
get_race_market |
/v1/races/{race_id}/market |
Live | Market data for one race: each runner's starting price and the best Betfair back and lay prices taken seconds before the off. Factual prices only, never a prediction. |
find_dog |
/v1/dogs/search |
Live | Find a greyhound by name. Use this first when someone names a dog, to get its dog_id. |
get_dog_form |
/v1/dogs/{dog_id}/form |
Live | A greyhound's recent runs — the form line: date, track, distance, grade, finishing position, time and price. |
compare_dogs |
/v1/dogs/{dog_id}/head-to-head/{rival_id} |
Live | Every time two greyhounds have met, with how each finished. Needs both dog ids. |
dog_statistics |
/v1/dogs/{dog_id}/stats |
Live Plus | A greyhound's record split by distance, track, trap, grade and going — what tends to happen rather than what happened once. |
find_trainer |
/v1/trainers/search |
Live | Find a trainer by name to get their trainer_id. |
trainer_statistics |
/v1/trainers/{trainer_id}/stats |
Live Plus | A trainer's strike rate split by track, distance, trap and grade over a rolling window. |
list_tracks |
/v1/tracks |
Free | Every track covered, with region and the distances raced there. |
track_statistics |
/v1/tracks/{track_id}/stats |
Free | Trap bias and winning-time distribution for a track, by distance. |
7 of them work on a free sandbox key,
within its data window. The rest return a plain-English message telling the assistant which
plan is needed, rather than a raw 403 for it to misreport.
Limits
An assistant answering one question can fire several tool calls in a few seconds, which trips a per-minute limit a human never would. When that happens the server says so in words — that it is a pace limit and not an outage — so the model waits rather than telling you the API is broken. Your rate limits are otherwise unchanged.
What this is not
It returns factual race data: results, times, sectionals, form and published prices. There are no predictions, ratings or selections in it, and the server tells the assistant so on connecting. A model can still reason out loud about what it fetched — that is the model doing it, not the data, and it is not betting advice.