The MCP server
The Darts API inside Claude, ChatGPT, Cursor and any assistant that speaks MCP.
Add one address to your assistant and it can look players up, read results and fixtures, follow live scores, and on the bigger plans read ratings and price any pairing. Every tool call goes through the API on your own key, so your plan, its window, the rate limit and your allowance apply exactly as they do to your code.
The address
JSON-RPC 2.0 over HTTPAuthorization: Bearer
For clients that let you add a header. The same header the API takes.
Authorization: Bearer da_live_••••••••X-API-Key
For clients that only take a named header.
X-API-Key: da_live_••••••••Your personal address
For assistants that take only an address, such as a custom connector. The key is part of it.
https://dartsapi.com/mcp/k/da_live_••••••••Add it to your assistant
The agent skill- Open Settings, then Connectors, and add a custom connector.
- Name it
Darts APIand paste your personal address. - Start a chat and ask about a player. The first answer comes from
find_player.
https://dartsapi.com/mcp/k/da_live_••••••••- Keep your key in
DARTS_API_KEY. - Add the server once; it is then there in every project.
- Run
/mcpinside Claude Code to see the 14 tools.
claude mcp add --transport http dartsapi https://dartsapi.com/mcp \ --header "Authorization: Bearer $DARTS_API_KEY"
- In ChatGPT's settings, add a connector by its address. Where connectors need developer mode, turn it on first.
- Paste your personal address and leave the sign-in as none: the key is in the address.
- Pick the connector in a chat and ask away.
https://dartsapi.com/mcp/k/da_live_••••••••- Open
~/.cursor/mcp.json, or.cursor/mcp.jsonin one project. - Add the server below and save.
- The tools show under MCP in Cursor's settings.
{
"mcpServers": {
"dartsapi": {
"url": "https://dartsapi.com/mcp",
"headers": { "Authorization": "Bearer da_live_••••••••" }
}
}
}- Use the streamable HTTP transport: one POST per message to the address.
- Send the key in a header, or use the personal address.
- Call
initialize, thentools/list, thentools/call.
curl https://dartsapi.com/mcp \ -H "Authorization: Bearer $DARTS_API_KEY" \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
Try a tool
Runs from this page on your keyThe 14 tools
Free keyLive and upAnalyst| Tool | What it does | Arguments | Endpoint | Plan |
|---|---|---|---|---|
find_player | Find a player by name, however it is spelt (accents and particles are folded). Returns ids for the other tools. | q reqcountry_codeactivelimit | Players | Free key |
get_player | One player's profile: country, career span and matches. | player_id req | A player | Free key |
head_to_head | Every meeting between two players, with the overall record. | player_id reqopponent_id reqfromto | Head to head | Free key |
find_results | Settled matches, filtered by player, competition or dates, newest first. | player_idcompetition_idfromtolimit | Results | Free key |
upcoming_fixtures | Matches coming up, with the best price where one is held. | player_idcompetition_idfromtolimit | Fixtures | Free key |
player_form | A player's recent form, measured against what was expected of them. | player_id reqmatches | Player form | Live |
player_splits | A player's record split by tier, format length or year. | player_id reqbyfromto | Player splits | Live |
player_scoring | A player's scoring and finishing: averages, checkout rate, 180s. | player_id reqfromto | Player scoring | Live |
match_preview | Everything about one match before it starts: form, rating, meetings, price. | match_id req | Match preview | Live |
live_scores | Matches in play right now, leg by leg. | competition_id | Live | Live |
ratings_table | The current rating, top to bottom. | limit | Ratings | Live |
rating_movers | The players rising and falling most in the rating. | dayslimit | Ratings movers | Live |
win_probability | The chance of each result for any pairing, in any format. | player_id reqopponent_id reqformatlegssets | Probability | Analyst |
tournament_odds | Title and round-reaching chances for an event, simulated from its draw. | edition_id reqsimulations | Outrights | Analyst |
Each tool is built from the endpoint behind it, so its arguments, types and wording are always the endpoint's own. Cursor and page arguments are left out on purpose: an assistant handed a cursor tends to invent one.
When a tool says no
The errors guideA refusal comes back as a plain sentence for the person reading in their assistant, never a raw error, and never counts against the allowance.
| When | What the assistant is told |
|---|---|
| No key, or a wrong one | The darts API key was not accepted. Check the key in your MCP settings: it starts da_live_ and is on your dashboard at https://dartsapi.com/dashboard. |
| The plan does not reach it | This needs the Live plan or above, and the key in use is on a smaller one, followed by the plan that opens it and its checkout. |
| Outside the window | The API's own sentence on what the key's plan reaches, followed by the plan that opens it and its checkout. |
| Allowance used | The API's own sentence on the allowance, with where larger allowances are: https://dartsapi.com/pricing. |
| Too many too quickly | Paused by the pace limit, not an outage. Wait briefly, and prefer one broader call over several narrow ones. |
| Nothing by that id | Nothing found by that id. Use find_player to look an id up by name first. |
How it behaves
Your plan, exactly
A tool call is an API call on your key. It counts once against the minute and the allowance, and sees what your plan sees.
Short answers
An answer is held under 60,000 characters. When a list is cut, the answer says how many rows it shows and how to narrow the question.
Read only
Every tool reads. None changes your account, your key or the data, and each says so to the assistant.
The protocol
For anyone writing their own client| Method | What it does |
|---|---|
initialize | Agrees a version (2025-06-18, 2025-03-26, 2024-11-05) and returns the server's name and a short note on how to use the tools. |
tools/list | The 14 tools with their input schemas. The list never changes mid-session. |
tools/call | Runs one tool. The answer is the API's JSON as text, or a refusal with isError set. |
ping | Answers at once, for keeping a connection checked. |
Batches are taken, a notification is answered 202 with no body, and a body that is not JSON is answered 400 with JSON-RPC code -32700.