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
whoamitool 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 as30d,90d, or1y.
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 forweek_start.week_startmust 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 figuresget_training_weekreports for the same span.timezoneis an IANA name such asAmerica/Denverand only affects which day is markedis_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 ofathlete_idorteam_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.