# CourseProfiler MCP server

Race course profiling, catalog search, course submission, and personalized race plans.

## Links
- Registry page: https://www.getdrio.com/mcp/com-courseprofiler-courseprofiler
- Website: https://courseprofiler.com/mcp.html

## Install
- Endpoint: https://courseprofiler.com/mcp
- Auth: Not captured

## Setup notes
- Remote endpoint: https://courseprofiler.com/mcp

## Tools
- create_race_plan (Create race plan) - Primary CourseProfiler tool for creating a personalized race plan and optional PDF. Use this after obtaining both a course input and runner input. Course input may be course_file, course.source with kind=url/artifact/raw_file, or course.crsprof_artifact_id. Do not use raw_json or reconstruct/synthesize a course from roadbooks, checkpoint tables, elevation profiles, aid-station lists, or screenshots; those are enrichment/context only and are not valid course geometry. Runner input may be runner_profile_file, runner.sources, or runner.usrprof_artifact_id. Prefer generate_runner_profile first when the user has GPX/FIT/CRSProf activity evidence or an uploaded .usrprof source but no already-converted usrprof_artifact_id; then call create_race_plan with runner.usrprof_artifact_id. Before generating a runner profile for a race plan, resolve the target course if possible and ask the user whether the profile should be target-race-specific, target-distance/elevation-specific, general trail, or insights-only; select evidence that matches the intended distance, elevation gain/loss, terrain/technicality, altitude, duration, and recency. Do not silently use all files in a local folder. Use runner.usrprof_artifact_id only for an already-converted USRProf artifact; uploaded .usrprof/source_file artifacts from POST /api/artifact-uploads must be passed through runner.sources[{kind:'artifact'}] or through generate_runner_profile. Bare local filesystem paths never work in hosted MCP clients; send inline content/base64 when the MCP client can read the file, or use the REST POST /api/artifact-uploads flow outside MCP, complete the upload, then pass the returned source_file artifact ID. There is no raw-byte MCP upload tool; get_artifact_upload_requirements only explains the REST flow. Use get_runner_profile_requirements when the user needs instructions for creating/exporting a USRProf, using Strava/browser import, or uploading GPX/FIT/CRSProf evidence. If the user provides only a race name, check the CourseProfiler race catalog manifest first, but do not rely on uniqueness alone: confirm the catalog match is the same event/course/location before using its assetPath CRSProf URL. Auto-resolution only uses exact/strong catalog matches; weak matches require explicit confirmation or an explicit course.source URL/artifact. Use search_race_catalog first when the user may need to choose among multiple matching catalog courses or when the match confidence is not clearly exact/strong. If no catalog match exists, try to resolve it to a fetchable official GPX/FIT/CRSProf URL or ask the user to upload/provide the course file or URL; do not stop at the race name. Third-party route hosts such as Wikiloc may return 403 to server fetches. If an official or third-party GPX/FIT/CRSProf URL cannot be fetched or is blocked, stop and ask the user to download the official file and upload it through POST /api/artifact-uploads, then continue with the returned source_file artifact ID. Do not create a race plan until a real route file/trusted CRSProf is available. Use import_course to create a CRSProf, enrich_course_waypoints to add structured aid stations/resources/cutoffs, then generate_course_segments before creating the race plan. Catalog CRSProf files may already include official waypoints/resources/cutoffs; if they do not, call enrich_course_waypoints or ask the user for structured aid/resource/cutoff data before segmentation. If official pages and regulation PDFs disagree, or exact aid locations are not fully listed in machine-readable form, ask the user to confirm and include only confirmed aid stations; do not invent missing locations. Route-only plans are incomplete unless the user explicitly accepts missing aid/resource details. If browsing/search is available, prefer the catalog first, then official race sources and direct GPX links over generic home pages; course-only pacing is incomplete without waypoint/resource enrichment. If runner data is missing, ask for a USRProf file/artifact or runner evidence, explain that the profile drives estimated times plus insights such as uphill running limit, durability/fatigue tendencies, downhill sensitivity, and terrain strengths/weaknesses, generate a segment-evidence runner profile with generate_runner_profile after user-approved evidence selection, and do not invent personalized fitness data. This race-plan flow creates a personalized plan/PDF only; it does not submit the course to the public catalog and does not need to. Only call submit_course when the user explicitly asks to submit/add/update a course for catalog review. Returns a top-level job with artifact role metadata; use get_job to poll and get_artifact to fetch outputs. Endpoint: https://courseprofiler.com/mcp
- search_race_catalog (Search race catalog) - Search CourseProfiler's race catalog by race/course name and return direct CRSProf URLs that can be used as course sources. Endpoint: https://courseprofiler.com/mcp
- import_course (Import course) - Import a fetchable official GPX/FIT/CRSProf URL, official ZIP containing exactly one GPX, uploaded source_file artifact, raw JSON payload, or inline/proxied course_file into a CRSProf artifact. Third-party route hosts such as Wikiloc may return 403 to server fetches; when a URL is blocked, ask the user to download/upload the file through POST /api/artifact-uploads outside MCP and pass the returned source_file artifact ID as source.kind=artifact. Use this on catalog misses before waypoint enrichment. Endpoint: https://courseprofiler.com/mcp
- enrich_course_waypoints (Enrich course waypoints) - Add structured aid stations, checkpoints, cutoffs, and canonical resources to a CRSProf artifact that lacks them. Before enriching, inspect whether the imported source already contains GPX/CRSProf waypoints; if it already contains GPX/CRSProf waypoints, avoid duplicate Start/Finish/aid stations and prefer merging/updating resources, cutoffs, notes, or links on existing waypoint metadata. Prefer waypoints.mode=structured; put non-canonical/free-text aid details in notes/source text because unsupported resource strings are ignored with warnings. Route-only plans should be labeled incomplete unless the CRSProf already includes official waypoints/resources/cutoffs or the user explicitly accepts missing aid/resource details. Endpoint: https://courseprofiler.com/mcp
- generate_course_segments (Generate course segments) - Generate analytical course segments from an enriched CRSProf artifact after waypoint enrichment, or from a catalog CRSProf that already contains official waypoints/resources/cutoffs; then use the resulting artifact in create_race_plan for race planning, or call submit_course if and only if the user asked to submit a course for catalog review. A generated CRSProf artifact is not a catalog submission. Endpoint: https://courseprofiler.com/mcp
- generate_runner_profile (Generate runner profile) - Generate a segment-evidence USRProf runner profile artifact from uploaded runner evidence or an existing .usrprof source. Before using this tool, ask what profile the user wants: target race/course, target distance/elevation range, general trail profile, or insights-only profile. Do not silently use every local file or arbitrary folders; if many evidence files are available, summarize candidates and ask the user to approve a selection strategy. A USRProf is not just average pace: CourseProfiler uses segment evidence to estimate climbs, descents, runnable grades, fatigue/durability, terrain fit, uphill running limits, and pacing confidence. Evidence choice affects race-plan times and standalone athlete insights. Use this when the user does not already have an already-converted usrprof_artifact_id. Accepted evidence includes GPX/FIT/CRSProf activity files, ZIP/TAR/TAR.GZ/TGZ/TAR.XZ/TXZ archives containing those files, and .usrprof files passed as source_file artifacts from POST /api/artifact-uploads, raw_file inline content/base64, or fetchable HTTPS URLs. Archives must use purpose runner_evidence, are expanded server-side, and report skipped nested archives, duplicate contents, unsupported entries, and parse failures by filename/path. For Strava, ask the user to authenticate in the CourseProfiler browser app, use its activity filters (date, distance, elevation gain, and elapsed time) to fetch relevant Run/TrailRun activities, select activities matching the profile intent, and export/download the .usrprof; do not ask for Strava credentials in MCP. Once the browser Strava flow has produced a downloaded .usrprof, the profile is already created: do not call generate_runner_profile merely to recreate/repackage it. If the user only asked to create/download a profile, stop there. If the user wants to use that .usrprof for a race plan through MCP, upload/pass it as runner input. After this tool succeeds, pass the returned usrprof artifact ID to create_race_plan as runner.usrprof_artifact_id. Endpoint: https://courseprofiler.com/mcp
- submit_course (Submit course) - Submit an official/trusted course for CourseProfiler catalog review. This is the only MCP tool that creates a catalog-review submission; import_course, enrich_course_waypoints, and generate_course_segments only create temporary artifacts. A final CRSProf artifact is not a submission. If there is no submission_id in the submit_course result, the course has not been submitted. Use this only when the user asked to submit/add/update a course in the catalog. Do not call submit_course for normal race-plan creation; create_race_plan does not require catalog submission. Before calling submit_course, collect and pass event metadata from official sources whenever available: main event/race name, specific course name, year/date, start time, location/city/region and country, distance, elevation gain, organizer, applicable tags/types, competitions/series, official race page, route source URL, aid-chart/regulation URLs, and other source URLs. Use metadata.event.name for the main event and metadata.event.course for the specific course (example: name='Speedgoat Mountain Races', course='50K'); do not put distance/elevation stats in the course name (bad: 'Skyrace — 32 km, +2400 m'); location must not include country because metadata.event.country is separate. Add metadata.event.types tags where they apply, and metadata.event.competitions for circuits/series/championships such as Golden Trail World Series (GTWS). Put the race start time in metadata.event.time when known. Put catalog UI event links in metadata.event.links, not just metadata.source_urls; supported types include info, registration, rules, schedule, course, cutoff, parking, bib_pickup, wardrobe, results, and contact. Include official General Information (type=info), Registration (registration), Rules/Regulations (rules), Schedule/Program (schedule), Course (course), Cut-off times (cutoff), Parking (parking), Bib pick-up (bib_pickup), Wardrobe/drop bag (wardrobe), Results (results), and Contact (contact) links when available. This metadata is important for catalog review and discoverability. Do not invent unknown values; omit unconfirmed fields rather than guessing. Use this after discovering the official route source externally, importing a real GPX/FIT/CRSProf/ZIP-with-one-GPX source, enriching waypoints/resources/cutoffs when official data is available, applying metadata, and generating segments. Do not submit reconstructed/synthetic course geometry from roadbooks, checkpoint tables, elevation profiles, aid-station lists, screenshots, or regulations; those are enrichment/context only. If route links are blocked, stop and ask the user to upload the official GPX/FIT/CRSProf/ZIP through REST artifact upload or pass inline/proxied file content. Search the CourseProfiler catalog first to avoid duplicates or to identify updates. If official waypoint/aid documents conflict or are incomplete, ask the user to confirm and include only confirmed aid stations; do not invent locations. Returns a job whose progress includes submission_id and final_crsprof_artifact_id, and whose artifacts include the final CRSProf submitted for review. Report both IDs to the user. Endpoint: https://courseprofiler.com/mcp
- get_course_submission_requirements (Get course submission requirements) - Use this before submit_course when the user gives only a race name or incomplete inputs. Returns the catalog-first course submission workflow, accepted route sources, metadata, waypoint enrichment, and upload requirements. Endpoint: https://courseprofiler.com/mcp
- get_race_plan_requirements (Get race plan requirements) - Use this before create_race_plan when the user gives only a race name or incomplete inputs. Returns the required course and runner inputs and the next steps an assistant should take, including catalog matches when available. Endpoint: https://courseprofiler.com/mcp
- get_runner_profile_requirements (Get runner profile requirements) - Use this when runner input is missing or unclear. Explains how to obtain or generate runner input, what USRProf/evidence files should contain, whether GPX/FIT activities are enough, and how hosted MCP clients should upload artifacts. Endpoint: https://courseprofiler.com/mcp
- get_artifact_upload_requirements (Get artifact upload requirements) - Use this when an assistant needs instructions for CourseProfiler's REST artifact upload flow or needs to explain why hosted MCP cannot upload bare local paths. This is an instruction helper, not a raw-byte MCP upload tool. Endpoint: https://courseprofiler.com/mcp
- get_job (Get job) - Poll a CourseProfiler async job by job_id. Endpoint: https://courseprofiler.com/mcp
- get_artifact (Get artifact) - Fetch artifact metadata and a private short-lived download URL by artifact_id. Endpoint: https://courseprofiler.com/mcp
- validate_course_profile (Validate course profile) - Validate a CRSProf artifact or inline CRSProf JSON before race planning or catalog submission. This does not mutate artifacts or submit courses. Endpoint: https://courseprofiler.com/mcp
- validate_runner_profile (Validate runner profile) - Validate a USRProf artifact or inline USRProf JSON before creating personalized race plans. This does not mutate artifacts or generate a new profile. Endpoint: https://courseprofiler.com/mcp
- export_race_plan_pdf (Export race plan PDF) - Export a Hi-Fi PDF from an existing CRSProf artifact. The CRSProf supplies the course/profile/plan data; options are presentation-only overrides such as title, subtitle, metric/imperial unit system, and file name. Omit unit_system unless the user explicitly asks for metric or imperial. Endpoint: https://courseprofiler.com/mcp

## Resources
Not captured

## Prompts
Not captured

## Metadata
- Owner: com.courseprofiler
- Version: 0.1.0
- Runtime: Streamable Http
- Transports: HTTP
- License: Not captured
- Language: Not captured
- Stars: Not captured
- Updated: Jul 14, 2026
- Source: https://registry.modelcontextprotocol.io
