ourpr.
Measured race courses, open to all, and your own runs, Blocks and plans once you sign in.
| Endpoint | https://ourpr.app/api/mcp (streamable-http) |
|---|---|
| Registry version | 1.1.0 |
| Now | 18 tools · grade D (63) · pin ts_e6320d9fd014ca290239b9fc232ca3d4 · protocol 2025-06-18 |
| First / last listed | 2026-11-01 01:54 UTC / 2026-11-01 01:54 UTC |
| Grade over time | 2026-11-01: D (63), 18 tools |
Is this your server? Own a server? ToolFit hosted watch re-checks it every 24 h ($0.25 per 30 days) or 6 h ($0.60) and sends you an HMAC-signed webhook when its tools or grade change: POST https://api.youraitools.co/toolfit/v1/watch. To opt out, see About & opt-out.
Tools: ourpr_list_courses ourpr_get_course ourpr_get_course_terrain ourpr_get_course_amenities ourpr_get_course_route ourpr_list_trail_systems ourpr_get_trail_system ourpr_list_runs ourpr_get_run ourpr_run_stream ourpr_run_laps ourpr_rep_workouts ourpr_detect_reps ourpr_similar_terrain ourpr_training_blocks ourpr_list_races ourpr_list_plans ourpr_plan_week
ourpr_list_courses | List every running course published on ourpr., with its place, distance, climb and next race date.
Each course is a MEASURED centerline built from recorded runs, with elevation from a public terrain model: USGS 3DEP 10 m in the US, and the city's own 1 m model in Berlin. It is not a course map traced by hand.
START HERE. Every other course tool takes a slug, and this is where slugs come from.
A params: query, kind, course_type, min_distance_mi, max_distance_mi, upcoming_only, limit, offset, response_format |
ourpr_get_course | Read one published course: its place, distance, climb, how it was measured, and which streets carry it.
DELIBERATELY WITHOUT the elevation profile, the amenities and the centerline. Those are three more tools, because one course payload is about 83 KB and 91% of it is the profile.
Args:
- slug (string): From ourpr_list_courses. Example: 'boston-marathon'.
- response_format ('markdown' | 'jso params: slug*, response_format |
ourpr_get_course_terrain | The elevation profile of one course, sampled, plus every climb and descent ourpr. named on it.
THIS IS THE TOOL FOR "what are the hills and where". Each named section carries the street it runs on, the miles it spans, its net rise or fall and its average grade.
The elevation comes from a public terrain model sampled along the measured centerline (elevation_source names it), not from a watch baro params: slug*, points, response_format |
ourpr_get_course_amenities | Public drinking water and toilets on the line of one course, each placed at the mile it sits at.
READ THIS LIMIT BEFORE YOU ANSWER. These come from OpenStreetMap: public taps and toilets somebody mapped near the route. It is a FREQUENCY difference, not a category one — a race day sets up many more stops than an ordinary day has. A mapped tap can also be seasonal, shut off or gone. Never present t params: slug*, response_format |
ourpr_get_course_route | Where a course actually runs: its start, its finish, its bounding box, every mile marker, and the streets in the order you meet them.
The GPX file is free and needs no account. Hand `gpx_url` to a person who wants the course on a watch.
Args:
- slug (string): From ourpr_list_courses.
- include_polyline (boolean): Add the encoded centerline, about 9,800 characters. Default false.
- response params: slug*, include_polyline, response_format |
ourpr_list_trail_systems | List every trail system ourpr. maps. A trail system is a whole network of connected paths, measured end to end, not a single route through it.
Args:
- response_format ('markdown' | 'json'): Default 'markdown'.
Returns:
{
"count": number,
"trail_systems": [{
"slug": string, // "trinity-trails"
"name": string,
"region": string | null, // "Fort Worth, TX"
params: response_format |
ourpr_get_trail_system | Read one trail system: how many miles of path it holds, how many ways were mapped, where it sits, and where the measurement came from.
Args:
- slug (string): From ourpr_list_trail_systems. Example: 'trinity-trails'.
- response_format ('markdown' | 'json'): Default 'markdown'.
Returns:
{
"slug": string, "name": string, "region": string | null,
"total_mi": number, // every params: slug*, response_format |
ourpr_list_runs | Training history between two dates, newest first: date, local start, name, type, miles, pace, time, elevation, average heart rate, and on a runs-only list Friel's efficiency factor and the heartbeats each mile took. Start here for totals, streaks, trends, or finding a run. For one run's splits, use ourpr_get_run with an id from here. params: start_date*, end_date*, include_non_runs, limit |
ourpr_get_run | One activity in full: mile splits with heart rate, cadence, calories, device. Id comes from ourpr_list_runs. For the profile along the route, use ourpr_run_stream. params: activity_id* |
ourpr_run_stream | A run's profile on a 10 m grid — elevation, heart rate, power, cadence — as min, average, max and coverage per channel, not every sample. Also each half by distance with its moving pace, heart rate and efficiency, the pace change between them, and the drift (aerobic decoupling, Pa:HR), also after the warm up. No profile is a normal answer for an indoor run. params: activity_id* |
ourpr_run_laps | The laps the watch recorded for one run — the runner's own button presses. Laps follow the workout; mile splits follow the mile. params: activity_id* |
ourpr_rep_workouts | Interval sessions found across the history, with reps and distances. Detection is conservative, so a session it misses is still in ourpr_list_runs. params: limit |
ourpr_detect_reps | Whether one particular run was an interval session, and its reps. params: activity_id* |
ourpr_similar_terrain | Stretches of past runs matching a distance and climb — what the runner has already done that resembles a race they are training for. params: miles*, gain_ft*, limit, tolerance_ft |
ourpr_training_blocks | The goal race and its Block: race day, distance, goal time, which week of the Block today falls in, and miles for each week. Also the Blocks before past races, each with its result, weeks and peak week. A Block is the race-anchored Monday to Sunday weeks before a race. params: past |
ourpr_list_races | Every race ourpr. finds in the history, newest first, tune-ups included: date, name, distance, time, pace and run id. Also the fastest result at 5K, 10K, half marathon and marathon among them. params: distance, limit |
ourpr_list_plans | The runner's planned runs between two dates: day, name, miles, time, tag, the runner's note, whether a logged run fulfilled it, and whether ourpr. create wrote it. Read it before ourpr_plan_week so a new plan does not land on a day that already holds one. params: start_date, end_date |
ourpr_plan_week | Write one planned run, or a week of them, onto days still ahead. Each lands on the runner's week as a plan they can see, edit and remove. Needs a token made with the write scope and ourpr. create. Never logs a run. params: plans* |
Entries describe changes in tool definitions. They are not statements about a server, its quality or its author. The grade measures how the tool definitions fit model providers (token cost, schema compatibility, confusable names) as scored by the ToolFit engine at the time of the listing. JSON: append .json. Opt-out: how or hello@youraitools.co.