Koskamo

SportsTrackLive MCP

An official MCP server for SportsTrackLive that enables AI agents to analyze GPS sports activity files (GPX, TCX, IGC, SBP, FIT) for per-sport metrics, retrieve live athlete tracking data, search tracks and athletes, and generate 3D replays of activities.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

SportsTrackLive MCP logo, by SportsTrackLiveVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-06Operated by SportsTrackLive
You need:anonymous for everything except import_activity, which uses OAuth 2.1
MCP endpoint (Streamable HTTP)
https://mcp.sportstracklive.com/mcp
Vendor documentation

What its tools do

9 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.

9 of 9 have a description · 9 of 9 declare behavior hints · 6 of 8 with parameters document them all

Checks and signals

Each line is separate evidence, not a trust score.

  • Passed Endpoint answered the live check ·
  • Passed Official MCP Registry namespace is tied to sportstracklive.com ·
  • Passed Endpoint is on the registry namespace domain ·
  • Availability 1 of 1 checks passed in 30 days

What you can do with it

  • Analyze GPS activity files for sport-specific metrics like thermals or splits
  • Retrieve live activities and track statistics for athletes
  • Search for specific tracks or athletes on the platform
  • Generate 3D replays of recorded sports activities

Source and maintenance

Vendor evidenceRegistry 0.1.1

Protocol and capabilities

Server
sportstracklive 0.1.0
MCP protocol negotiated in check
2025-11-25
Tools
9 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {}
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

SportsTrackLive — live GPS sports tracking and sport-specific activity analysis (paragliding, hang gliding, gliding, sailing, cycling, running, skiing…). Use analyze_activity_file to analyze a user's GPS trace file (GPX/TCX/IGC/SBP/FIT): it returns computed metrics plus, per sport, thermals, flight phases with glide polar and MacCready, wind estimate and laps. Browse the public platform data with get_live_activities (who is live right now), search_tracks / get_track_stats (public activities and their statistics), search_athletes (public profiles) and get_track_replay_3d (interactive 3D replay URL) — these are read-only, anonymous, and only ever return public data. For the user's OWN file, create_ephemeral_replay builds a private 3D replay (no account, link valid 7 days) and import_activity saves it to their account (OAuth). Whenever you cannot transmit a file yourself — no shell, a sandbox that blocks this host, a file too large to inline — call create_upload_link and let the user drop the file in their browser; never give up on a file for lack of an upload route.

Tools

9 advertised

analyze_activity_file
Advertised by the server during the last successful anonymous check.
Advertised read-only

Analyze a GPS activity trace file (GPX, TCX, IGC, SBP or FIT, max 8 MiB) and return sport-specific metrics computed by the SportsTrackLive engine: distance, speeds, altitudes, and — depending on the sport — thermal detection with climb statistics, flight phases (glide/float/search) with glide polar and MacCready, wind estimation, lap detection around course marks, and splits. Stateless: nothing is stored, no account needed. HOW TO SEND THE FILE — pass exactly one of `file_url`, `upload_id` or `file_base64`. Take the first route below that works where you run and move on to the next whenever one is blocked; a blocked route is never a reason to stop or to ask the user to change settings. (1) The file already has a public https link: pass it as `file_url`. (2) You have a shell with outbound network access: `curl -s -X POST https://mcp.sportstracklive.com/upload --data-binary @/path/to/file` then pass the returned `upload_id`. A 403, a proxy error or a timeout here means your sandbox blocks the host — go to the next route. (3) The file is small: `file_base64`, keeping the base64 text under ~100 KB; gzip is inflated automatically, so `gzip -9 -c file | base64` fits traces 3–4× larger. (4) ALWAYS WORKS, including chat apps with no shell or a locked-down sandbox: call `create_upload_link`, give the user the link it returns, and once they have dropped the file there call this tool with the returned `upload_id`. Never retype or reconstruct file content by hand.

analyze_activity_file input schema
{
  "type": "object",
  "$defs": {
    "SportKind": {
      "enum": [
        "auto",
        "paragliding",
        "hang_gliding",
        "glider",
        "balloon",
        "sailing",
        "windsurfing",
        "cycling",
        "mountain_biking",
        "running",
        "trail_running",
        "ski",
        "hiking",
        "motorsport",
        "other"
      ],
      "type": "string",
      "description": "Sport declared by the calling agent. `Auto` lets the server guess from\nthe file format and the trace kinematics; the resolved value is returned\nin `context_used` so the agent can correct it and call again."
    },
    "DetailLevel": {
      "enum": [
        "standard",
        "full"
      ],
      "type": "string"
    },
    "MeasureUnit": {
      "enum": [
        "metric",
        "imperial"
      ],
      "type": "string"
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "filename"
  ],
  "properties": {
    "sport": {
      "$ref": "#/$defs/SportKind",
      "default": "auto",
      "description": "Sport of the activity. Use \"auto\" (default) to let the server infer it\nfrom the file format and trace kinematics; the resolved sport is\nreturned in `context_used.sport` and can be overridden on a second call."
    },
    "detail": {
      "$ref": "#/$defs/DetailLevel",
      "description": "\"standard\" (default) returns every computed insight but strips the\nbulky point-level payloads (per-phase segment lists, wind timeline,\npause/trim ranges) — a few KB instead of tens. \"full\" returns the\nraw engine output unabridged."
    },
    "file_url": {
      "type": [
        "string",
        "null"
      ],
      "default": null,
      "description": "Public https:// URL of the file (e.g. a cloud share or export link);\nthe server downloads it (15 MiB cap). Provide exactly one of\n`file_url`, `upload_id` or `file_base64`."
    },
    "filename": {
      "type": "string",
      "description": "File name including its extension — the extension selects the parser.\nSupported: .gpx, .tcx, .igc, .sbp, .fit"
    },
    "upload_id": {
      "type": [
        "string",
        "null"
      ],
      "default": null,
      "description": "Id of a file already sent to the server, valid 15 minutes. Two ways\nto get one: (a) the `create_upload_link` tool — the user drops the\nfile on the returned web page; works from any client, no shell\nneeded; (b) with a shell that can reach the host:\n`curl -s -X POST https://mcp.sportstracklive.com/upload --data-binary @/path/to/file`.\nPass the id here with the original filename."
    },
    "file_base64": {
      "type": [
        "string",
        "null"
      ],
      "default": null,
      "description": "The file content, base64-encoded — for small files only, since you\nemit every character yourself: keep the base64 text under ~100 KB.\nA gzip stream is detected and inflated server-side, so\n`gzip -9 -c file | base64` is accepted as is and fits traces 3–4×\nlarger. Past that, use `upload_id` (see `create_upload_link`)."
    },
    "measure_unit": {
      "$ref": "#/$defs/MeasureUnit",
      "description": "Preferred units for the computed metrics (\"metric\" default, or\n\"imperial\")."
    }
  }
}
analyze_activity_file annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
create_ephemeral_replay
Advertised by the server during the last successful anonymous check.

Create an interactive 3D replay of the USER'S OWN trace file (GPX, TCX, IGC, SBP or FIT, max 8 MiB) on SportsTrackLive and return its link. The flight becomes a PRIVATE track owned by a temporary guest account — it appears in no listing or search — and the link stays valid 7 days, after which everything is purged. From the replay page the user can create an account to keep the flight permanently. Send the file through exactly one of `file_url` (public https link), `upload_id` or `file_base64` (small files; gzip accepted) — same routes as analyze_activity_file. If you cannot upload it yourself (no shell, or your sandbox answers 403 for mcp.sportstracklive.com), do not stop: call `create_upload_link`, have the user drop the file on the returned page, then pass its `upload_id` here. Pass pilot_name so the player credits the right person. Takes up to ~90 s (the full analysis pipeline runs).

create_ephemeral_replay input schema
{
  "type": "object",
  "$defs": {
    "SportKind": {
      "enum": [
        "auto",
        "paragliding",
        "hang_gliding",
        "glider",
        "balloon",
        "sailing",
        "windsurfing",
        "cycling",
        "mountain_biking",
        "running",
        "trail_running",
        "ski",
        "hiking",
        "motorsport",
        "other"
      ],
      "type": "string",
      "description": "Sport declared by the calling agent. `Auto` lets the server guess from\nthe file format and the trace kinematics; the resolved value is returned\nin `context_used` so the agent can correct it and call again."
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "filename"
  ],
  "properties": {
    "sport": {
      "$ref": "#/$defs/SportKind",
      "default": "auto",
      "description": "Sport of the activity — improves the analysis (thermals/phases for\nfree flight). Defaults to auto-ish generic handling server-side."
    },
    "file_url": {
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "filename": {
      "type": "string",
      "description": "File name including its extension (.gpx, .tcx, .igc, .sbp, .fit)."
    },
    "language": {
      "type": [
        "string",
        "null"
      ],
      "default": null,
      "description": "BCP-47-ish language for the guest account pages (\"en\" default, \"fr\"…)."
    },
    "upload_id": {
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "pilot_name": {
      "type": [
        "string",
        "null"
      ],
      "default": null,
      "description": "Name of the pilot/athlete, shown in the 3D player instead of an\nanonymous placeholder. Use the user's name if they shared it."
    },
    "file_base64": {
      "type": [
        "string",
        "null"
      ],
      "default": null,
      "description": "Same three sources as analyze_activity_file — provide exactly one."
    }
  }
}
create_ephemeral_replay annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
create_upload_link
Advertised by the server during the last successful anonymous check.

Get a one-time web link the USER opens in their browser to send their trace file (GPX, TCX, IGC, SBP or FIT, max 8 MiB) to SportsTrackLive, plus the `upload_id` that analyze_activity_file, create_ephemeral_replay and import_activity then accept. Use it whenever you cannot transmit the file yourself: no shell, a sandbox that refuses mcp.sportstracklive.com (403), no public link, or a file too large for `file_base64`. Give the user the link as a clickable URL, ask them to drop the file there and to tell you when it is done, THEN call the file tool with the `upload_id`. The link and the file both expire after 15 minutes; the file is deleted afterwards and never listed anywhere.

create_upload_link input schema
{
  "type": "object",
  "properties": {}
}
create_upload_link annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
get_live_activities
Advertised by the server during the last successful anonymous check.
Advertised read-only

List public SportsTrackLive activities being recorded LIVE right now (paragliding flights, sailing races, rides, runs…), optionally filtered by sport and country. Each entry carries the athlete, sport, location, start time, latest recorded position/speed and a watch_url to follow the activity live in a browser.

get_live_activities input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "limit": {
      "type": [
        "integer",
        "null"
      ],
      "format": "uint32",
      "maximum": 50,
      "minimum": 1,
      "description": "Max results, 1-50 (default 20)."
    },
    "sport": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 64,
      "description": "Sport / category name filter, e.g. \"paragliding\", \"sailing\"."
    },
    "country": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 64,
      "description": "Country filter: ISO 3166-1 alpha-2 code (\"FR\", \"CH\") or a country\nname."
    }
  }
}
get_live_activities annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
get_track_replay_3d
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get the interactive 3D replay URL of an EXISTING PUBLIC SportsTrackLive track (Cesium terrain viewer with camera controls and timeline) plus its summary statistics. The URL must be opened in a web browser — share it with the user. NOT for a file the user just provided: for that, use create_ephemeral_replay, which builds a private replay of THEIR trace. Never substitute another athlete's track for the user's own file.

get_track_replay_3d input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "track_id"
  ],
  "properties": {
    "track_id": {
      "type": "integer",
      "format": "int64",
      "minimum": 1,
      "description": "Numeric id of a public SportsTrackLive track."
    }
  }
}
get_track_replay_3d annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_track_stats
Advertised by the server during the last successful anonymous check.
Advertised read-only

Get the public statistics of a SportsTrackLive track by its numeric id: athlete, sport, location, date, duration, distance, speeds, altitudes and the track's web page URL. Only public tracks are returned; private tracks answer not_found.

get_track_stats input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "track_id"
  ],
  "properties": {
    "track_id": {
      "type": "integer",
      "format": "int64",
      "minimum": 1,
      "description": "Numeric id of a public SportsTrackLive track."
    }
  }
}
get_track_stats annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
import_activity
Advertised by the server during the last successful anonymous check.

Import the user's trace file (GPX, TCX, IGC, SBP or FIT, max 8 MiB) into THEIR SportsTrackLive account permanently — full analysis, 3D replay, appears in their profile with their default privacy setting. REQUIRES the user to be connected via OAuth (this MCP server supports it; the client starts the flow). For a user without an account, use create_ephemeral_replay instead. Send the file through exactly one of `file_url` (public https link), `upload_id` or `file_base64` (small files; gzip accepted) — same routes as analyze_activity_file. If you cannot upload it yourself, call `create_upload_link`, have the user drop the file on the returned page, then pass its `upload_id` here.

import_activity input schema
{
  "type": "object",
  "$defs": {
    "SportKind": {
      "enum": [
        "auto",
        "paragliding",
        "hang_gliding",
        "glider",
        "balloon",
        "sailing",
        "windsurfing",
        "cycling",
        "mountain_biking",
        "running",
        "trail_running",
        "ski",
        "hiking",
        "motorsport",
        "other"
      ],
      "type": "string",
      "description": "Sport declared by the calling agent. `Auto` lets the server guess from\nthe file format and the trace kinematics; the resolved value is returned\nin `context_used` so the agent can correct it and call again."
    }
  },
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "filename"
  ],
  "properties": {
    "sport": {
      "$ref": "#/$defs/SportKind",
      "default": "auto",
      "description": "Sport of the activity — selects the analysis profile."
    },
    "file_url": {
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "filename": {
      "type": "string",
      "description": "File name including its extension (.gpx, .tcx, .igc, .sbp, .fit)."
    },
    "upload_id": {
      "type": [
        "string",
        "null"
      ],
      "default": null
    },
    "file_base64": {
      "type": [
        "string",
        "null"
      ],
      "default": null,
      "description": "Same three sources as analyze_activity_file — provide exactly one."
    }
  }
}
import_activity annotations
{
  "readOnlyHint": false,
  "openWorldHint": false,
  "idempotentHint": false,
  "destructiveHint": false
}
search_athletes
Advertised by the server during the last successful anonymous check.
Advertised read-only

Search SportsTrackLive athletes by name (user name, first or last name). Returns id, user name, full name, country, number of public tracks and the public profile URL.

search_athletes input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "required": [
    "query"
  ],
  "properties": {
    "limit": {
      "type": [
        "integer",
        "null"
      ],
      "format": "uint32",
      "maximum": 25,
      "minimum": 1,
      "description": "Max results, 1-25 (default 10)."
    },
    "query": {
      "type": "string",
      "maxLength": 64,
      "minLength": 2,
      "description": "Name to search for (user name, first name or last name), 2-64 chars."
    }
  }
}
search_athletes annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}
search_tracks
Advertised by the server during the last successful anonymous check.
Advertised read-only

Search public SportsTrackLive tracks (finished, stored activities), newest first. Filter by free text (locality / take-off name or athlete user name), sport name, and an ISO date range. Returns per track the athlete, sport, location, date and web page URL; feed a track_id to get_track_stats for full statistics.

search_tracks input schema
{
  "type": "object",
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "properties": {
    "to": {
      "type": [
        "string",
        "null"
      ],
      "description": "Latest activity date, ISO `YYYY-MM-DD` (inclusive, UTC)."
    },
    "from": {
      "type": [
        "string",
        "null"
      ],
      "description": "Earliest activity date, ISO `YYYY-MM-DD` (inclusive, UTC)."
    },
    "limit": {
      "type": [
        "integer",
        "null"
      ],
      "format": "uint32",
      "maximum": 25,
      "minimum": 1,
      "description": "Max results, 1-25 (default 10)."
    },
    "query": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 64,
      "description": "Free-text filter matched against the locality (take-off/venue) name\nand the athlete's user name."
    },
    "sport": {
      "type": [
        "string",
        "null"
      ],
      "maxLength": 64,
      "description": "Sport / category name, e.g. \"paragliding\", \"cycling\", \"sailing\"."
    }
  }
}
search_tracks annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

90-day uptime

A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.

Too few checks for a percentage yet (1 of 1 answered).

  1. 2026-11-07: 1 of 1 checks answered

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
1354 ms
95th percentile latency
1354 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 1354 ms · metadata changed · 9 tool(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http sportstracklive-mcp https://mcp.sportstracklive.com/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add sportstracklive-mcp --url https://mcp.sportstracklive.com/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable sportstracklive-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "sportstracklive-mcp": {
      "url": "https://mcp.sportstracklive.com/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "sportstracklive-mcp": {
      "type": "streamableHttp",
      "url": "https://mcp.sportstracklive.com/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start sportstracklive-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "sportstracklive-mcp": {
      "type": "http",
      "url": "https://mcp.sportstracklive.com/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http sportstracklive-mcp https://mcp.sportstracklive.com/mcp

Claude Desktop

Open Claude Settings > Connectors > Add custom connector, enter this server URL and enable it for the conversation. This is a manual remote-connector handoff, not a desktop JSON configuration.
Claude Desktop configuration
https://mcp.sportstracklive.com/mcp

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "sportstracklive-mcp": {
      "serverUrl": "https://mcp.sportstracklive.com/mcp"
    }
  }
}

Let your agent find its tools

Find servers like SportsTrackLive MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run SportsTrackLive MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing