DocumentationAPI v1
Documentation/More/MCP server and tools

The MCP server

The Darts API inside Claude, ChatGPT, Cursor and any assistant that speaks MCP.

14tools 5on the free key Read only POST /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 HTTP
POST
https://dartsapi.com/mcp
header

Authorization: Bearer

For clients that let you add a header. The same header the API takes.

Authorization: Bearer da_live_••••••••
header

X-API-Key

For clients that only take a named header.

X-API-Key: da_live_••••••••
address

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_••••••••
The personal address holds your key, so keep it as private as the key. Rotating the key on your dashboard retires the old address at once.

Add it to your assistant

The agent skill
  1. Open Settings, then Connectors, and add a custom connector.
  2. Name it Darts API and paste your personal address.
  3. Start a chat and ask about a player. The first answer comes from find_player.
Your personal address
https://dartsapi.com/mcp/k/da_live_••••••••
  1. Keep your key in DARTS_API_KEY.
  2. Add the server once; it is then there in every project.
  3. Run /mcp inside Claude Code to see the 14 tools.
Terminal
claude mcp add --transport http dartsapi https://dartsapi.com/mcp \
  --header "Authorization: Bearer $DARTS_API_KEY"
  1. In ChatGPT's settings, add a connector by its address. Where connectors need developer mode, turn it on first.
  2. Paste your personal address and leave the sign-in as none: the key is in the address.
  3. Pick the connector in a chat and ask away.
Your personal address
https://dartsapi.com/mcp/k/da_live_••••••••
  1. Open ~/.cursor/mcp.json, or .cursor/mcp.json in one project.
  2. Add the server below and save.
  3. The tools show under MCP in Cursor's settings.
mcp.json
{
  "mcpServers": {
    "dartsapi": {
      "url": "https://dartsapi.com/mcp",
      "headers": { "Authorization": "Bearer da_live_••••••••" }
    }
  }
}
  1. Use the streamable HTTP transport: one POST per message to the address.
  2. Send the key in a header, or use the personal address.
  3. Call initialize, then tools/list, then tools/call.
curl
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 key
Your keyPaste it once, kept in this browser
The same message your assistant sends
Run it to see your limits
The endpoint behind it

The 14 tools

Free keyLive and upAnalyst
ToolWhat it doesArgumentsEndpointPlan
find_playerFind a player by name, however it is spelt (accents and particles are folded). Returns ids for the other tools.q reqcountry_codeactivelimitPlayersFree key
get_playerOne player's profile: country, career span and matches.player_id reqA playerFree key
head_to_headEvery meeting between two players, with the overall record.player_id reqopponent_id reqfromtoHead to headFree key
find_resultsSettled matches, filtered by player, competition or dates, newest first.player_idcompetition_idfromtolimitResultsFree key
upcoming_fixturesMatches coming up, with the best price where one is held.player_idcompetition_idfromtolimitFixturesFree key
player_formA player's recent form, measured against what was expected of them.player_id reqmatchesPlayer formLive
player_splitsA player's record split by tier, format length or year.player_id reqbyfromtoPlayer splitsLive
player_scoringA player's scoring and finishing: averages, checkout rate, 180s.player_id reqfromtoPlayer scoringLive
match_previewEverything about one match before it starts: form, rating, meetings, price.match_id reqMatch previewLive
live_scoresMatches in play right now, leg by leg.competition_idLiveLive
ratings_tableThe current rating, top to bottom.limitRatingsLive
rating_moversThe players rising and falling most in the rating.dayslimitRatings moversLive
win_probabilityThe chance of each result for any pairing, in any format.player_id reqopponent_id reqformatlegssetsProbabilityAnalyst
tournament_oddsTitle and round-reaching chances for an event, simulated from its draw.edition_id reqsimulationsOutrightsAnalyst

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 guide

A refusal comes back as a plain sentence for the person reading in their assistant, never a raw error, and never counts against the allowance.

WhenWhat the assistant is told
No key, or a wrong oneThe 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 itThis 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 windowThe API's own sentence on what the key's plan reaches, followed by the plan that opens it and its checkout.
Allowance usedThe API's own sentence on the allowance, with where larger allowances are: https://dartsapi.com/pricing.
Too many too quicklyPaused by the pace limit, not an outage. Wait briefly, and prefer one broader call over several narrow ones.
Nothing by that idNothing 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
MethodWhat it does
initializeAgrees 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/listThe 14 tools with their input schemas. The list never changes mid-session.
tools/callRuns one tool. The answer is the API's JSON as text, or a refusal with isError set.
pingAnswers 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.