Documentation

Connect AI Tools with MCP

Connect an MCP-compatible AI client to your private rslts.run training and team data.

The rslts.run Model Context Protocol (MCP) endpoint lets supported AI clients read the training, race, notebook, and team data your account can access. The connection is read-only: MCP tools cannot change data in rslts.run.

Before you connect

Create a read API key from the Developer page. Copy the key when it appears; the complete key is shown only once.

The key has this form:

rr_read_KEY_ID_SECRET

Treat the complete key like a password. Anyone who has it can read the same rslts.run data until the key expires or is revoked.

Connection details

Use these values in any client that supports remote HTTP MCP servers:

Setting Value
Name rslts-run
Transport Streamable HTTP
URL https://rslts.run/mcp
Header Authorization: Bearer rr_read_KEY_ID_SECRET

Replace rr_read_KEY_ID_SECRET with the complete key you copied. Do not include quotation marks in a client’s header field unless its configuration format requires them.

Claude Code

Run:

claude mcp add --transport http rslts-run https://rslts.run/mcp \
  --header "Authorization: Bearer rr_read_KEY_ID_SECRET"

JSON configuration

Clients such as Claude Desktop and Cursor can use an HTTP server entry like this:

{
  "mcpServers": {
    "rslts-run": {
      "type": "http",
      "url": "https://rslts.run/mcp",
      "headers": {
        "Authorization": "Bearer rr_read_KEY_ID_SECRET"
      }
    }
  }
}

Where the client stores this configuration depends on the client and operating system. Restart the client after changing its MCP configuration if it does not reload servers automatically.

Verify the connection

Ask the client:

Use the rslts-run whoami tool and tell me which account and teams this key can access.

A successful response confirms that the client can reach the endpoint and authenticate. If your client can display MCP tools, you should also see the tools listed below.

Ways to use it

Start by asking the model to find an athlete or team, then use the returned ID for more detailed tools. For example:

  • “Find Jordan Example, summarize the last 30 days of training, and call out any abrupt load changes.”
  • “Compare Jordan Example’s last four training weeks. Separate volume, intensity, and consistency.”
  • “Review Jordan Example’s most recent race alongside the preceding training week.”
  • “Summarize the Example Track Club roster’s training for this week and identify athletes with sparse data.”
  • “Show the newest notebook threads that need a coach response, then open the relevant threads.”

Names are convenient for discovery, but detailed tools use stable athlete, team, activity, result, run, or thread IDs. Let the client call a list tool first instead of guessing an ID.

Available tools

Account and athletes

  • whoami() — shows the account and teams available to the key.
  • list_athletes(team_id?, query?, limit?, cursor?) — finds accessible athletes and their IDs.
  • get_athlete_overview(athlete_id, window?) — summarizes an athlete over a window such as 30d, 90d, or 1y.

Activities and training

  • list_activities(athlete_id, from?, to?, activity_type?, limit?, cursor?) — lists an athlete’s activities with optional date and type filters.
  • get_activity(athlete_id, activity_id, include_samples?, include_coach_notes?) — returns one activity, with optional samples and coach notes.
  • get_training_week(athlete_id, week_start) — returns one athlete’s training week. Use an ISO date for week_start. week_start must be a Monday.
  • list_daily_totals(athlete_id, from, to, timezone?) — returns per-day running and cross-training totals for any date range up to 31 days. Use this for windows that do not run Monday to Sunday. Days with no activity are included as zero rows, and the day totals add up to the same figures get_training_week reports for the same span. timezone is an IANA name such as America/Denver and only affects which day is marked is_today.

Races and plans

  • list_race_results(athlete_id?, team_id?, season?, limit?, cursor?) — lists results for either an athlete or a team. Provide exactly one of athlete_id or team_id.
  • get_race_review(athlete_id, result_id) — returns a detailed review of one race result.
  • get_race_plan(team_id, run_id, athlete_id) — returns one athlete’s report from a saved team race-plan run.

Notebook

  • get_notebook_feed(athlete_id?, team_id?, filter?, include_full_threads?, limit?, cursor?) — lists notebook activity for an athlete or team.
  • get_notebook_thread(thread_id) — opens one complete notebook thread.

Teams

  • list_teams() — lists teams available to the key.
  • get_team_roster(team_id, include_tags?, include_contacts?, limit?, cursor?) — returns roster entries, with optional tags and contacts.
  • get_team_training(team_id, date?, week_start?) — summarizes team training for a day or week.

Pagination

List tools return up to 50 items by default and accept a maximum limit of 200. When a response includes a non-null next_cursor, pass that value unchanged as cursor in the next call. A null next_cursor means there are no more results.

Continuation tokens are signed and can reveal only the next page permitted by the same API key. Do not edit or construct them; an invalid or mismatched cursor is rejected.

Access and privacy

The API key inherits your account’s current access. An individual account can read its accessible athletes. A coach or team key can also expose data for team athletes, including minors, within that account’s permissions. Depending on the tool, this can include training details, race results, notebook conversations, roster metadata, and contact information.

There is currently no narrower per-key athlete or team scope. Use the shortest practical expiration, avoid pasting keys into prompts or messages, and revoke keys that are no longer needed. Revoking a key immediately disconnects every client using it.

Troubleshooting

Result What to check
401 Unauthorized The bearer header is missing, the complete key was not copied, or the key expired or was revoked.
403 Forbidden The account does not have access to the requested athlete, team, or record. Discover available IDs with whoami, list_athletes, or list_teams.
400 Bad Request A required argument is missing, a date or window is invalid, or a cursor does not belong to this key and query.
404 Not Found The requested record does not exist or is not visible to this account.
405 Method Not Allowed The client is not using the MCP Streamable HTTP transport. The endpoint accepts MCP requests over POST.
429 Too Many Requests The client is sending requests too quickly. Wait briefly and retry with fewer concurrent calls.

If authentication works but a model does not use the server, explicitly tell it to use the rslts-run tools and begin with whoami.

Disconnect

Remove the rslts-run server from the client to disconnect that client. To disable the credential everywhere, revoke the API key from the Developer page.