{"apiVersion":"v1","directorySlug":"courseprofiler-mcp-a1284d98d6","title":"CourseProfiler","description":"CourseProfiler builds trail race course profiles, runner evidence profiles, personalized race plans, and PDF race-plan exports with a documented public API.","pageUrl":"https://www.mcpbundles.com/skills/courseprofiler-mcp-a1284d98d6","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://courseprofiler.com/mcp","hostedMcpUrl":null,"toolCount":24,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"com.courseprofiler/courseprofiler-mcp-a1284d98d6","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"name":"create_race_plan","description":"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_p","inputSchema":{"type":"object","required":[],"properties":{"pdf":{"type":"object","required":[],"properties":{"enabled":{"type":"boolean"},"options":{"type":"object","additionalProperties":true}},"additionalProperties":false},"course":{"type":"object","required":[],"properties":{"source":{"type":"object","required":["kind"],"properties":{"url":{"type":"string","format":"uri"},"kind":{"enum":["url","artifact","raw_json","raw_file"],"type":"string"},"base64":{"type":"string"},"content":{"type":"string"},"payload":{"type":"object","additionalProperties":true},"file_name":{"type":"string"},"artifact_id":{"type":"string"},"content_type":{"type":"string"}},"additionalProperties":true},"segments":{"type":"object","required":[],"properties":{"mode":{"enum":["generate","skip"],"type":"string"},"options":{"type":"object","required":[],"properties":{"algorithm":{"type":"string"},"flat_grade":{"type":"number"},"instant_mode":{"type":"boolean"},"flat_max_delta":{"type":"number"},"include_routes":{"type":"boolean"},"minimum_distance":{"type":"number"},"slope_change_threshold":{"type":"number"},"flexible_flat_max_delta":{"type":"boolean"},"flexible_minimum_distance":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false},"import_options":{"type":"object","required":[],"properties":{"include_routes":{"type":"boolean"},"include_segments":{"type":"boolean"}},"additionalProperties":false},"crsprof_artifact_id":{"type":"string"}},"additionalProperties":false},"runner":{"type":"object","required":[],"properties":{"sources":{"type":"array","items":{"type":"object","required":["kind"],"properties":{"url":{"type":"string","format":"uri"},"kind":{"enum":["url","artifact","raw_json","raw_file"],"type":"string"},"base64":{"type":"string"},"content":{"type":"string"},"payload":{"type":"object","additionalProperties":true},"file_name":{"type":"string"},"artifact_id":{"type":"string"},"content_type":{"type":"string"}},"additionalProperties":true}},"import_options":{"type":"object","additionalProperties":true},"usrprof_artifact_id":{"type":"string"}},"additionalProperties":false},"estimate":{"type":"object","required":[],"properties":{"output":{"type":"object","additionalProperties":true},"options":{"type":"object","required":[],"properties":{"strategy":{"enum":["segment_evidence"],"type":"string"},"flat_grade":{"type":"number"},"gap_algorithm":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false},"race_name":{"type":"string"},"course_file":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"name":{"type":"string"},"base64":{"type":"string"},"content":{"type":"string"},"file_name":{"type":"string"},"content_type":{"type":"string"}},"additionalProperties":false},"runner_profile_file":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"name":{"type":"string"},"base64":{"type":"string"},"content":{"type":"string"},"file_name":{"type":"string"},"content_type":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false},"title":"Create race plan","logicalName":"create_race_plan","displayName":"Create race plan","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"search_race_catalog","description":"Search CourseProfiler's race catalog by race/course name and return direct CRSProf URLs that can be used as course sources.","inputSchema":{"type":"object","required":["query"],"properties":{"limit":{"type":"integer"},"query":{"type":"string"}},"additionalProperties":false},"title":"Search race catalog","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"search_race_catalog","displayName":"Search race catalog"},{"name":"import_course","description":"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. For structured answers about a supplied activity,","inputSchema":{"type":"object","required":[],"properties":{"source":{"type":"object","required":["kind"],"properties":{"url":{"type":"string","format":"uri"},"kind":{"enum":["url","artifact","raw_json","raw_file"],"type":"string"},"base64":{"type":"string"},"content":{"type":"string"},"payload":{"type":"object","additionalProperties":true},"file_name":{"type":"string"},"artifact_id":{"type":"string"},"content_type":{"type":"string"}},"additionalProperties":true},"options":{"type":"object","required":[],"properties":{"include_routes":{"type":"boolean"},"include_segments":{"type":"boolean"}},"additionalProperties":false},"course_file":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"name":{"type":"string"},"base64":{"type":"string"},"content":{"type":"string"},"file_name":{"type":"string"},"content_type":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false},"title":"Import course","logicalName":"import_course","displayName":"Import course","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"enrich_course_waypoints","description":"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 unsupp","inputSchema":{"type":"object","required":["crsprof_artifact_id","waypoints"],"properties":{"waypoints":{"type":"object","required":["mode"],"properties":{"mode":{"enum":["structured","table"],"type":"string"},"text":{"type":"string"},"items":{"type":"array","items":{"type":"object","required":["name","distance"],"properties":{"kind":{"enum":["start","finish","aid","checkpoint","water","crew","other"],"type":"string"},"name":{"type":"string"},"cutoff":{"type":"string"},"distance":{"type":"number"},"resources":{"type":"array","items":{"enum":["water","water_source","drinks","fruit","food","toilet","medic","chrono","crew","pacer","car","bus","ambulance","shuttle","telecabine","drop_bag","withdrawal","binoculars","hot_meal","tent","showers","changing_room","physiotherapy","rest_area","start_flag","finish_flag"],"type":"string"}},"cutoff_kind":{"enum":["in","out","leave"],"type":"string"},"distance_unit":{"enum":["km","m","mi"],"type":"string"}},"additionalProperties":false}},"table_url":{"type":"string"},"source_ref":{"type":"string"},"start_time":{"type":"string"},"distance_unit":{"enum":["km","m","mi"],"type":"string"}},"additionalProperties":false},"crsprof_artifact_id":{"type":"string"}},"additionalProperties":false},"title":"Enrich course waypoints","logicalName":"enrich_course_waypoints","displayName":"Enrich course waypoints","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"generate_course_segments","description":"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.","inputSchema":{"type":"object","required":["crsprof_artifact_id"],"properties":{"options":{"type":"object","required":[],"properties":{"algorithm":{"type":"string"},"flat_grade":{"type":"number"},"instant_mode":{"type":"boolean"},"flat_max_delta":{"type":"number"},"include_routes":{"type":"boolean"},"minimum_distance":{"type":"number"},"slope_change_threshold":{"type":"number"},"flexible_flat_max_delta":{"type":"boolean"},"flexible_minimum_distance":{"type":"boolean"}},"additionalProperties":false},"crsprof_artifact_id":{"type":"string"}},"additionalProperties":false},"title":"Generate course segments","logicalName":"generate_course_segments","displayName":"Generate course segments","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"generate_runner_profile","description":"Generate a segment-evidence USRProf runner profile artifact from uploaded runner evidence or an existing .usrprof source. Confirm profile purpose and evidence selection only if not already explicit. Do not silently use every local file. profile_intent is advisory: the server does not filter sources. Evidence supports pacing, durability, terrain fit, uphill running limits, and confidence; get_runner_profile_requirements explains selection. Accepted evidence includes GPX/FIT/CRSProf activity files","inputSchema":{"type":"object","required":["sources"],"properties":{"sources":{"type":"array","items":{"type":"object","required":["kind"],"properties":{"url":{"type":"string","format":"uri"},"kind":{"enum":["url","artifact","raw_json","raw_file"],"type":"string"},"base64":{"type":"string"},"content":{"type":"string"},"payload":{"type":"object","additionalProperties":true},"file_name":{"type":"string"},"artifact_id":{"type":"string"},"content_type":{"type":"string"}},"additionalProperties":true}},"import_options":{"type":"object","required":[],"properties":{"model":{"enum":["segment_evidence"],"type":"string"},"file_name":{"type":"string"}},"additionalProperties":false},"profile_intent":{"type":"object","required":[],"properties":{"type":{"enum":["target_race","target_distance","general_trail","insights_only"],"type":"string"},"terrain":{"type":"string"},"selection_notes":{"type":"string"},"target_race_name":{"type":"string"},"target_distance_km":{"type":"number"},"target_elevation_gain_m":{"type":"number"}},"additionalProperties":false}},"additionalProperties":false},"title":"Generate runner profile","logicalName":"generate_runner_profile","displayName":"Generate runner profile","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"submit_course","description":"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-","inputSchema":{"type":"object","required":["course"],"properties":{"course":{"type":"object","required":[],"properties":{"source":{"type":"object","required":["kind"],"properties":{"url":{"type":"string","format":"uri"},"kind":{"enum":["url","artifact","raw_json","raw_file"],"type":"string"},"base64":{"type":"string"},"content":{"type":"string"},"payload":{"type":"object","additionalProperties":true},"file_name":{"type":"string"},"artifact_id":{"type":"string"},"content_type":{"type":"string"}},"additionalProperties":true},"segments":{"type":"object","required":[],"properties":{"mode":{"enum":["generate","skip"],"type":"string"},"options":{"type":"object","required":[],"properties":{"algorithm":{"type":"string"},"flat_grade":{"type":"number"},"instant_mode":{"type":"boolean"},"flat_max_delta":{"type":"number"},"include_routes":{"type":"boolean"},"minimum_distance":{"type":"number"},"slope_change_threshold":{"type":"number"},"flexible_flat_max_delta":{"type":"boolean"},"flexible_minimum_distance":{"type":"boolean"}},"additionalProperties":false}},"additionalProperties":false},"waypoints":{"type":"object","required":["mode"],"properties":{"mode":{"enum":["structured","table"],"type":"string"},"text":{"type":"string"},"items":{"type":"array","items":{"type":"object","required":["name","distance"],"properties":{"kind":{"enum":["start","finish","aid","checkpoint","water","crew","other"],"type":"string"},"name":{"type":"string"},"cutoff":{"type":"string"},"distance":{"type":"number"},"resources":{"type":"array","items":{"enum":["water","water_source","drinks","fruit","food","toilet","medic","chrono","crew","pacer","car","bus","ambulance","shuttle","telecabine","drop_bag","withdrawal","binoculars","hot_meal","tent","showers","changing_room","physiotherapy","rest_area","start_flag","finish_flag"],"type":"string"}},"cutoff_kind":{"enum":["in","out","leave"],"type":"string"},"distance_unit":{"enum":["km","m","mi"],"type":"string"}},"additionalProperties":false}},"table_url":{"type":"string"},"source_ref":{"type":"string"},"start_time":{"type":"string"},"distance_unit":{"enum":["km","m","mi"],"type":"string"}},"additionalProperties":false},"import_options":{"type":"object","required":[],"properties":{"include_routes":{"type":"boolean"},"include_segments":{"type":"boolean"}},"additionalProperties":false},"crsprof_artifact_id":{"type":"string"}},"additionalProperties":false},"metadata":{"type":"object","required":[],"properties":{"event":{"type":"object","properties":{"city":{"type":"string"},"date":{"type":"string"},"name":{"type":"string"},"time":{"type":"string"},"year":{"type":"integer"},"links":{"type":"array","items":{"type":"object","required":["type","url"],"properties":{"url":{"type":"string"},"type":{"enum":["info","registration","rules","schedule","course","start_line","parking","bib_pickup","wardrobe","cutoff","results","contact"],"type":"string"},"tooltip":{"type":"string"}},"additionalProperties":false}},"notes":{"type":"string"},"types":{"type":"array","items":{"type":"string"}},"course":{"type":"string"},"region":{"type":"string"},"series":{"type":"string"},"country":{"type":"string"},"website":{"type":"string"},"distance":{"type":"number"},"location":{"type":"string"},"organizer":{"type":"object","additionalProperties":true},"event_name":{"type":"string"},"competitions":{"type":"array","items":{"type":"object","additionalProperties":true}},"distance_unit":{"enum":["km","m","mi"],"type":"string"},"elevation_gain":{"type":"number"},"elevation_gain_unit":{"enum":["m","ft"],"type":"string"},"official_source_url":{"type":"string"}},"additionalProperties":true},"source_urls":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"race_name":{"type":"string"},"submitter":{"type":"object","required":[],"properties":{"name":{"type":"string"},"email":{"type":"string"}},"additionalProperties":false},"course_file":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"name":{"type":"string"},"base64":{"type":"string"},"content":{"type":"string"},"file_name":{"type":"string"},"content_type":{"type":"string"}},"additionalProperties":false},"original_file_name":{"type":"string"}},"additionalProperties":false},"title":"Submit course","logicalName":"submit_course","displayName":"Submit course","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_course_submission_requirements","description":"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.","inputSchema":{"type":"object","required":[],"properties":{"race_name":{"type":"string"},"known_course_url":{"type":"string"},"has_waypoint_data":{"type":"boolean"}},"additionalProperties":false},"title":"Get course submission requirements","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_course_submission_requirements","displayName":"Get course submission requirements"},{"name":"get_race_plan_requirements","description":"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.","inputSchema":{"type":"object","required":[],"properties":{"race_name":{"type":"string"},"known_course_url":{"type":"string"},"has_runner_profile":{"type":"boolean"}},"additionalProperties":false},"title":"Get race plan requirements","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_race_plan_requirements","displayName":"Get race plan requirements"},{"name":"get_runner_profile_requirements","description":"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.","inputSchema":{"type":"object","required":[],"properties":{},"additionalProperties":false},"title":"Get runner profile requirements","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_runner_profile_requirements","displayName":"Get runner profile requirements"},{"name":"get_artifact_upload_requirements","description":"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.","inputSchema":{"type":"object","required":[],"properties":{},"additionalProperties":false},"title":"Get artifact upload requirements","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_artifact_upload_requirements","displayName":"Get artifact upload requirements"},{"name":"get_job","description":"Poll a CourseProfiler async job by job_id.","inputSchema":{"type":"object","required":["job_id"],"properties":{"job_id":{"type":"string"}},"additionalProperties":false},"title":"Get job","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_job","displayName":"Get job"},{"name":"get_artifact","description":"Fetch artifact metadata and a private short-lived download URL by artifact_id. Artifact download URLs are private and short-lived; share them only with the user, verbatim in a code block, not a clickable link. Ask the user to copy the entire URL into their browser address bar. Do not rewrite the URL or add tracking parameters such as utm_source: changes invalidate the signature. If expired, call get_artifact for a fresh URL. This applies only to artifact download_url values, not authorization or","inputSchema":{"type":"object","required":["artifact_id"],"properties":{"artifact_id":{"type":"string"}},"additionalProperties":false},"title":"Get artifact","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"get_artifact","displayName":"Get artifact"},{"name":"validate_course_profile","description":"Validate a CRSProf artifact or inline CRSProf JSON before race planning or catalog submission. This does not mutate artifacts or submit courses.","inputSchema":{"type":"object","required":[],"properties":{"crsprof":{"type":"object","additionalProperties":true},"crsprof_artifact_id":{"type":"string"}},"additionalProperties":false},"title":"Validate course profile","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"validate_course_profile","displayName":"Validate course profile"},{"name":"validate_runner_profile","description":"Validate a USRProf artifact or inline USRProf JSON before creating personalized race plans. This does not mutate artifacts or generate a new profile.","inputSchema":{"type":"object","required":[],"properties":{"usrprof":{"type":"object","additionalProperties":true},"usrprof_artifact_id":{"type":"string"}},"additionalProperties":false},"title":"Validate runner profile","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"validate_runner_profile","displayName":"Validate runner profile"},{"name":"export_race_plan_pdf","description":"Export a Hi-Fi PDF or standalone checkpoint card 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, format, and file name. Omit unit_system unless the user explicitly asks for metric or imperial.","inputSchema":{"type":"object","required":["crsprof_artifact_id"],"properties":{"options":{"type":"object","required":[],"properties":{"format":{"enum":["checkpoint_card"],"type":"string"},"subtitle":{"type":"string"},"file_name":{"type":"string"},"unit_system":{"enum":["metric","imperial"],"type":"string"}},"additionalProperties":false},"crsprof_artifact_id":{"type":"string"}},"additionalProperties":false},"title":"Export race plan PDF","logicalName":"export_race_plan_pdf","displayName":"Export race plan PDF","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"build_runner_profile_from_strava","description":"Build a USRProf from Strava activities selected for a target course or distance. Ask the user for the target course or distance and, when an existing profile is supplied, explicitly ask whether to merge or replace. Strava credentials are never accepted through MCP: this tool returns a private one-hour browser authorization URL and resumes the same job after authorization. If evidence is insufficient, relay the structured user decision and resume the same job with build_anyway, broaden_filters, o","inputSchema":{"type":"object","required":[],"properties":{"course":{"type":"object","required":[],"properties":{"source":{"type":"object","required":["kind"],"properties":{"url":{"type":"string","format":"uri"},"kind":{"enum":["url","artifact","raw_json","raw_file"],"type":"string"},"base64":{"type":"string"},"content":{"type":"string"},"payload":{"type":"object","additionalProperties":true},"file_name":{"type":"string"},"artifact_id":{"type":"string"},"content_type":{"type":"string"}},"additionalProperties":true},"crsprof_artifact_id":{"type":"string"}},"additionalProperties":false},"filters":{"type":"object","required":[],"properties":{"after_date":{"type":"string"},"before_date":{"type":"string"},"max_elapsed_s":{"type":"number"},"min_elapsed_s":{"type":"number"},"activity_types":{"type":"array","items":{"enum":["Run","TrailRun"],"type":"string"}},"max_distance_m":{"type":"number"},"min_distance_m":{"type":"number"},"estimation_model":{"enum":["load_response_evidence_v2","load_response_evidence_v3"],"type":"string"},"max_elevation_gain_m":{"type":"number"},"min_elevation_gain_m":{"type":"number"}},"additionalProperties":false},"decision":{"enum":["build_anyway","broaden_filters","cancel"],"type":"string"},"course_file":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"name":{"type":"string"},"base64":{"type":"string"},"content":{"type":"string"},"file_name":{"type":"string"},"content_type":{"type":"string"}},"additionalProperties":false},"resume_job_id":{"type":"string"},"target_distance_m":{"type":"number"},"existing_profile_strategy":{"enum":["merge","replace"],"type":"string"},"existing_usrprof_artifact_id":{"type":"string"}},"additionalProperties":false},"title":"Build runner profile from Strava","logicalName":"build_runner_profile_from_strava","displayName":"Build runner profile from Strava","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"analyze_activity","description":"Analyze supplied GPX/FIT directly with the browser's canonical pipeline; no catalog search or runner profile is needed. Accept inline course_file, URL, or artifact source. Existing CRSProf is preserved and summarized. Returns job plus a bounded structured summary, units, missing-data warnings and complete CRSProf artifact. Defaults: moving threshold 0.25 m/s, minimum stop 30 s, merge distance 60 m with combined-speed guard. Detected stop elapsed may include short moving portions; it is not total","inputSchema":{"type":"object","required":[],"properties":{"source":{"type":"object","required":["kind"],"properties":{"url":{"type":"string","format":"uri"},"kind":{"enum":["url","artifact","raw_json","raw_file"],"type":"string"},"base64":{"type":"string"},"content":{"type":"string"},"payload":{"type":"object","additionalProperties":true},"file_name":{"type":"string"},"artifact_id":{"type":"string"},"content_type":{"type":"string"}},"additionalProperties":true},"options":{"type":"object","required":[],"properties":{"algorithm":{"enum":["GREEDY","SLOPE_BASED","PACE_BASED"],"type":"string"},"include_routes":{"type":"boolean","default":true},"moving_threshold":{"type":"number","default":0.25,"minimum":0},"auto_stop_threshold":{"type":"number","default":30,"minimum":0},"auto_stop_merge_distance":{"type":"number","default":60,"minimum":0}},"additionalProperties":false},"course_file":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"name":{"type":"string"},"base64":{"type":"string"},"content":{"type":"string"},"file_name":{"type":"string"},"content_type":{"type":"string"}},"additionalProperties":false}},"additionalProperties":false},"title":"Analyze activity or route","logicalName":"analyze_activity","displayName":"Analyze activity or route","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"inspect_analysis","description":"Read an existing v3 CRSProf artifact without reanalysis or downloading source points. Query segments, splits, climbs, stops, range, or quality. Pages default to 20 rows (maximum 100); follow next_offset and total_matches. Distances are metres and times seconds. Climbs group existing UP movement rows, with dwell separate. Missing/UNKNOWN terrain uses the browser grade policy (gain-loss)/distance and saved flat_grade threshold (default zero); no smoothing or new segmentation. terrain_source distin","inputSchema":{"type":"object","required":["artifact_id","query"],"properties":{"axis":{"enum":["reference","execution"],"type":"string"},"sort":{"enum":["course_order","distance_desc","gain_desc","duration_desc"],"type":"string","default":"course_order"},"to_m":{"type":"number","minimum":0},"limit":{"type":"integer","default":20,"maximum":100,"minimum":1},"query":{"enum":["segments","splits","climbs","stops","range","quality"],"type":"string"},"from_m":{"type":"number","minimum":0},"offset":{"type":"integer","default":0,"maximum":2147483647,"minimum":0},"artifact_id":{"type":"string"},"duration_metric":{"enum":["actual_elapsed","actual_nonmoving","planned_dwell"],"type":"string","default":"actual_elapsed"},"min_duration_seconds":{"type":"number","minimum":0}},"additionalProperties":false},"title":"Inspect canonical analysis","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"inspect_analysis","displayName":"Inspect canonical analysis"},{"name":"compare_execution","description":"Compare plan and execution v3 CRSProf artifacts with the full browser canonical comparison pipeline. Association defaults to 60 metres; override stop_association_distance_m only when requested. This does not redetect stops: use analyze_activity on original GPX/FIT to change detection. Returns job and bounded summary: first 20 splits/stops, quality, and server-owned findings shared with the UI. Largest split deltas exclude separate dwell; matched planned stops are not unplanned. Follow inspection","inputSchema":{"type":"object","required":["plan_artifact_id","execution_artifact_id"],"properties":{"plan_artifact_id":{"type":"string"},"execution_artifact_id":{"type":"string"},"stop_association_distance_m":{"type":"number","default":60,"minimum":0}},"additionalProperties":false},"title":"Compare execution against plan","logicalName":"compare_execution","displayName":"Compare execution against plan","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"inspect_runner_profile","description":"Read an existing USRProf or uploaded USRProf source artifact without reconstruction, scope replacement or model activation. For chat attachments without artifact IDs, first use import_profile_attachment with explicit upload permission if host file handoff is available; otherwise offer the browser upload page immediately. Do not substitute raw-file commentary for this canonical inspection. Required query: summary, quality, recency, course_fit, coverage or insights. Stored readiness is not current","inputSchema":{"type":"object","required":["usrprof_artifact_id","query"],"properties":{"limit":{"type":"integer","maximum":100,"minimum":1},"query":{"enum":["summary","quality","recency","course_fit","coverage","insights"],"type":"string"},"offset":{"type":"integer","maximum":2147483647,"minimum":0},"course_artifact_id":{"type":"string"},"usrprof_artifact_id":{"type":"string"}},"additionalProperties":false},"title":"Inspect runner evidence","annotations":{"readOnlyHint":true,"untrustedContentHint":true},"logicalName":"inspect_runner_profile","displayName":"Inspect runner evidence"},{"name":"assess_finish_time_goal","description":"Assess a positive elapsed goal including saved dwell using the existing nine intensity/shape combinations (5% shapes). Preserve reference-plan movement locks, stops, checkpoint windows, cutoffs and saved GAP settings. Requires current v3 course and runner artifact IDs. Defaults to load_response_evidence_v2 and allow_profile_preparation=false; experimental v3 and in-memory preparation require explicit user approval, never silently retry with permission. Returns canonical support/classifications a","inputSchema":{"type":"object","required":["course_artifact_id","usrprof_artifact_id","target_elapsed_seconds"],"properties":{"estimation_model":{"enum":["load_response_evidence_v2","load_response_evidence_v3"],"type":"string","default":"load_response_evidence_v2"},"course_artifact_id":{"type":"string"},"usrprof_artifact_id":{"type":"string"},"target_elapsed_seconds":{"type":"number","exclusiveMinimum":0},"allow_profile_preparation":{"type":"boolean","default":false}},"additionalProperties":false},"title":"Assess an elapsed finish-time goal","logicalName":"assess_finish_time_goal","displayName":"Assess an elapsed finish-time goal","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"compare_pacing_strategies","description":"Compare all nine existing intensity/shape combinations without an elapsed goal. split_percent defaults to 5, inclusive range 0-15. Preserve reference-plan locks, dwell, checkpoint windows, cutoffs and saved GAP settings. Requires current v3 course and runner artifact IDs. Defaults to load_response_evidence_v2 and allow_profile_preparation=false; experimental v3 and in-memory preparation require explicit user approval, never silently retry with permission. Returns bounded canonical alternatives a","inputSchema":{"type":"object","required":["course_artifact_id","usrprof_artifact_id"],"properties":{"split_percent":{"type":"number","default":5,"maximum":15,"minimum":0},"estimation_model":{"enum":["load_response_evidence_v2","load_response_evidence_v3"],"type":"string","default":"load_response_evidence_v2"},"course_artifact_id":{"type":"string"},"usrprof_artifact_id":{"type":"string"},"allow_profile_preparation":{"type":"boolean","default":false}},"additionalProperties":false},"title":"Compare pacing strategies","logicalName":"compare_pacing_strategies","displayName":"Compare pacing strategies","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"import_profile_attachment","description":"Store an attached USRProf or CRSProf unchanged as a private source_file artifact (maximum 25 MiB). Prefer this for ChatGPT attachments when file handoff is available; do not ask the user to copy artifact IDs. Obtain explicit permission to send the selected file to CourseProfiler before setting upload_authorized=true. Use the host-provided file object, never invent a download URL or pass a sandbox/local path. profile_type specifies usrprof or crsprof; optional file_name must match that type or .j","inputSchema":{"type":"object","required":["file","profile_type","upload_authorized"],"properties":{"file":{"type":"object","required":["download_url","file_id"],"properties":{"file_id":{"type":"string"},"file_name":{"type":"string"},"mime_type":{"type":"string"},"download_url":{"type":"string"}},"additionalProperties":false},"profile_type":{"enum":["usrprof","crsprof"],"type":"string"},"upload_authorized":{"type":"boolean","const":true}},"additionalProperties":false},"title":"Import an authorized profile attachment","logicalName":"import_profile_attachment","displayName":"Import an authorized profile attachment","annotations":{"untrustedContentHint":true,"readOnlyHint":true}}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=CourseProfiler&config=eyJ1cmwiOiAiaHR0cHM6Ly9jb3Vyc2Vwcm9maWxlci5jb20vbWNwIn0%3D"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22CourseProfiler%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fcourseprofiler.com%2Fmcp%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22CourseProfiler%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fcourseprofiler.com%2Fmcp%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=CourseProfiler&connectorUrl=https%3A%2F%2Fcourseprofiler.com%2Fmcp"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"CourseProfiler\" --url \"https://courseprofiler.com/mcp\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/courseprofiler-mcp-a1284d98d6","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/courseprofiler-mcp-a1284d98d6/tools/{tool}","mcpServerUrl":"https://courseprofiler.com/mcp","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/courseprofiler-mcp-a1284d98d6?live=1"}