Skip to main content
Glama

komoot-mcp

An MCP server that lets Claude search your Komoot tours by distance, start point, surface and scenery, and build new gravel routes from the best sections of tours you already saved.

Preview

You:    Find me a 50 km gravel loop within 30 minutes of Amsterdam,
        at least 60% unpaved, and tell me what is scenic along the way.

Claude: I checked 14 planned tours near Amsterdam and pulled surface data for the
        closest matches.

        1. Vechtplassen gravel loop: 48 km, 71% gravel (compacted and dirt),
           starts in Weesp (25 min drive). Passes 3 saved highlights:
           Ankeveense Plassen, Fort Uitermeer, Naardermeer boardwalk.
        2. Diemerbos and IJmeer dike: 52 km, 63% gravel, starts at Diemen.
           Exposed dike section for 9 km, watch the wind.
        3. Spaarnwoude polders: 55 km, 58% gravel, just under your target.

        Want the GPX for route 1, or should I build a new loop that combines
        the gravel sections of all three?

Related MCP server: komoot-mcp

What it does

%%{init: {"flowchart": {"wrappingWidth": 600, "nodeSpacing": 30, "rankSpacing": 32}}}%%
flowchart TB
    Q(["You, in Claude: a distance, a start, how much gravel, what to see"]):::human
    Q --> CL["`**Claude** picks the tools and calls them over MCP`"]:::sys
    CL --> T1["list_tours: planned and recorded, by sport, place, radius"]:::sys
    T1 --> T2["get_tour_segments: surface and way-type spans turned into percentages"]:::sys
    T2 --> T3["get_highlights and your saved ones, near a point"]:::sys
    T3 --> RC["build_combined_route: single-surface segments, forward runs, scored by gravel and highlights"]:::sys
    RC --> OS["OSRM public cycling router joins the chosen runs"]:::sys
    OS --> OUT["A GPX track plus a waypoint list for the Komoot planner"]:::out
    OUT --> R(["You ride it, or upload it as a new planned tour"]):::human
    classDef sys fill:#1f3a5f,stroke:#7aa2d8,color:#ffffff
    classDef human fill:#6b4514,stroke:#e0a95a,color:#ffffff
    classDef out fill:#1e4d3a,stroke:#6fcf97,color:#ffffff
  1. Lists your planned and recorded tours by sport, location and radius.

  2. Returns a tour's surface breakdown (gravel, asphalt, dirt) and way types, so a ride can be scored by how much is unpaved.

  3. Downloads any tour as GPX, or uploads a GPX as a new planned tour.

  4. Finds highlights near a point, and reads the ones you bookmarked.

  5. Builds a new route from the gravel sections of several saved tours, joined by short OSRM cycling connectors, as a GPX track plus a waypoint list for the Komoot planner.

Constraints: credentials live in the system keychain or in environment variables, never on disk in this project. Tests run without network.

Why this exists

I ride gravel around Amsterdam and wanted to plan rides from inside Claude instead of clicking through maps. Komoot has the surface data; this server makes it available as tools, and gravel-ride-plan uses them for the route step of a full ride plan. It is the same habit as the work tools on my profile: when a routine has a data source, give the assistant the tools and let it do the lookups.

Requirements

  • Python 3.10 or newer and uv

  • A Komoot account. Credentials go in environment variables or the system keychain (see Install); they are never written to disk by this project.

  • Claude Code or Claude Desktop

Unofficial: this server talks to Komoot's web API and is not affiliated with or endorsed by Komoot; use it within Komoot's terms, at your own risk. The route combiner calls the public OSRM demo server, at most 30 calls per build, within its light-use policy.

Install

git clone https://github.com/nunomnferreirapt/komoot-mcp.git
cd komoot-mcp
uv sync
uv run pytest

Register the server, then ask Claude once to run the setup_credentials tool: it stores your Komoot email and password in the system keychain under the service komoot-mcp, and no config file ever holds them. The password passes through the conversation that one time; set the two environment variables instead if you would rather it never did. Claude Code:

claude mcp add -s user komoot-mcp -- uv --directory /absolute/path/to/komoot-mcp run komoot-mcp

Claude Desktop, in claude_desktop_config.json:

{
  "mcpServers": {
    "komoot-mcp": {
      "command": "uv",
      "args": ["--directory", "/absolute/path/to/komoot-mcp", "run", "komoot-mcp"]
    }
  }
}

If you prefer environment variables, set KOMOOT_EMAIL and KOMOOT_PASSWORD in the server's env block instead; they take precedence over the keychain. That block sits in plain text in the client's config file (claude_desktop_config.json, or ~/.claude.json for Claude Code), so the keychain is the safer place; to keep the password out of the config, export the two variables in the shell that starts the client.

Optional variables: KOMOOT_MCP_ROUTES_DIR (where built routes are saved, default ~/komoot-mcp-routes) and KOMOOT_MCP_CACHE_DIR (parsed tour cache, default ~/.cache/komoot-mcp). Both hold your tours' full GPS tracks and your saved highlights in plain files, so keep them outside any folder you push to a public repo.

Usage

Ask in plain language: "list my planned tours near Utrecht", "how much of tour 123456 is gravel", "build a 60 km gravel loop from Weesp using my saved tours". The tools are list_tours, get_tour_details, get_tour_segments, download_tour_gpx, upload_gpx_to_komoot, get_highlights, get_saved_highlights, build_combined_route and setup_credentials. To run the server by hand: uv run komoot-mcp (it speaks MCP over stdio).

How the route combiner works

A FastMCP app over Komoot's web API. It signs in with Basic Auth, keeps the short-lived session token in memory and retries once on a 401. Tour responses carry surface and way-type spans indexed into the coordinate array; the client turns these into percentages. The route combiner splits each tour into single-surface segments, groups them into runs that move forward along the start-to-end corridor, scores runs by gravel length and nearby saved highlights, and joins the chosen runs with OSRM's public cycling router. Parsed segments are cached on disk, so a rebuild only fetches tours it has not seen.

Repository layout

src/komoot_mcp/
  __main__.py        MCP tools and server entry point
  auth.py            credentials and Basic Auth session
  client.py          Komoot API calls and surface parsing
  route_combiner.py  segment splitting, run selection, OSRM connectors, GPX output
  cache.py           disk cache for parsed segments and highlights
tests/               pytest, no network
pyproject.toml       uv project, console script komoot-mcp

License

MIT, see LICENSE.

Built by Nuno Ferreira.

Available Tools

9 tools
build_combined_routeA

Build a custom gravel route by combining the best segments from multiple saved tours.

Selects gravel segments from saved tours within a corridor between start and end, ordered by forward progress. Connects them via OSRM cycling router. Every km follows either a saved-tour path or a short OSRM connector.

For loops: omit end_lat/end_lon. For point-to-point: provide both.

Uses a disk cache for parsed segments: only fetches new tours from the API. Set force_refresh=True to re-fetch all tour data.

Args: tour_ids: List of Komoot tour IDs to extract segments from. start_lat: Starting point latitude. start_lon: Starting point longitude. distance_km: Target route distance in km (default 50). min_gravel_pct: Minimum gravel percentage target (default 60). route_name: Name for the combined route. save_path: File path to save GPX. Defaults to $KOMOOT_MCP_ROUTES_DIR/.gpx (or ~/komoot-mcp-routes/ when the variable is not set). use_saved_highlights: If True, fetch saved highlights and use as waypoint attractors (default True). force_refresh: If True, ignore cache and re-fetch all tour data from Komoot API (default False). end_lat: End point latitude (for point-to-point routes). Omit for loops. end_lon: End point longitude (for point-to-point routes). Omit for loops.

NameRequiredDescriptionDefault
end_latNo
end_lonNo
tour_idsYes
save_pathNo
start_latYes
start_lonYes
route_nameNoGravel-AI route
distance_kmNo
force_refreshNo
min_gravel_pctNo
use_saved_highlightsNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden and does well: it discloses the disk cache ('only fetches new tours from the API'), the cache-busting flag, the save location and its default resolution, and the composition guarantee of saved paths plus OSRM connectors. It stops short of auth requirements, rate limits, runtime cost, and whether an existing file at save_path is overwritten.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose, then mechanism, then mode selection, then args — a sensible hierarchy with no filler sentences. Minor redundancy: the loop/point-to-point rule appears both in prose and again in the end_lat/end_lon entries.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter tool with an output schema present, the description covers purpose, mode branching, caching, and every argument, so an agent can invoke it correctly. Remaining gaps are operational: prerequisite credentials/auth, failure behavior on bad tour_ids, and expected runtime are unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: all 11 parameters are documented in the Args block with semantics and defaults that match the schema (distance_km=50, min_gravel_pct=60, use_saved_highlights=True, force_refresh=False). It also links two params ('route_name' feeds the 'save_path' default) and clarifies the null-default end_lat/end_lon.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Build a custom gravel route by combining segments from saved tours') and immediately explains the mechanism: corridor selection, progress ordering, OSRM connectors. None of the sibling tools build routes, and the description makes the output object (a GPX combined route) unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit conditional guidance for the loop vs point-to-point modes ('omit end_lat/end_lon' vs 'provide both'), which is the main branching decision an agent must make. It also explains when to set force_refresh. It does not, however, route the agent against alternatives (e.g., when to prefer download_tour_gpx or get_tour_segments instead).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

download_tour_gpxA

Download a Komoot tour as GPX file.

Args: tour_id: The Komoot tour ID. save_path: Optional file path to save the GPX. If empty, returns GPX XML as text.

NameRequiredDescriptionDefault
tour_idYes
save_pathNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden, but it does disclose a genuinely useful behavioral trait: the tool's mode switches based on save_path (filesystem write vs. returning GPX XML text). It omits whether credentials are required (a sibling setup_credentials exists), what happens on invalid tour_id, and any file-overwrite behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short lines, the core action front-loaded, followed by a compact Args block. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter download tool with an output schema present, the description covers purpose, both parameters, and the return-mode behavior. The main gap is the absence of any prerequisite/permission context given setup_credentials exists among siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: tour_id is defined as 'the Komoot tour ID' and save_path is explained as an optional path whose emptiness changes the return behavior. This adds real meaning beyond the bare integer/string types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Download a Komoot tour as GPX file') with a clear output format, which cleanly separates it from the inverse sibling upload_gpx_to_komoot. It does not, however, explicitly name alternatives or scope (e.g., single tour vs. combined route), so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus siblings like list_tours, get_tour_details, or build_combined_route. It vaguely implies you need a tour_id, but no preconditions (credentials, tour existence) or exclusions are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_highlightsB

Get highlights and points of interest near a location.

Highlights include scenic viewpoints, interesting places, and user-recommended spots that are useful for planning attractive gravel routes.

Args: lat: Latitude of the center point. lon: Longitude of the center point. radius_m: Search radius in meters (default 5000).

NameRequiredDescriptionDefault
latYes
lonYes
radius_mNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses the nature of the returned content but says nothing about result limits, pagination, auth requirements, or how many highlights come back. For a no-annotation tool this leaves meaningful behavioral gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three well-formed sentences plus an Args block, front-loaded with the core purpose before the content explanation. Appropriately sized with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation. Parameters are documented and the purpose is clear for a read-style lookup tool. The main omission is the lack of differentiation from the saved-highlights sibling, which is a minor completeness gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: it defines lat/lon as the center point and radius_m as the search radius in meters. This adds real meaning over the bare schema titles, though the 5000 default merely repeats the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource ('Get highlights and points of interest near a location') and further qualifies the content type (scenic viewpoints, interesting places, user-recommended spots). It is clear what the tool does, but it never distinguishes itself from the sibling get_saved_highlights, so it falls short of the top tier.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage by stating the highlights are 'useful for planning attractive gravel routes', which gives an agent a sense of when the tool fits. However, it names no alternatives and gives no when-not-to-use guidance, leaving the distinction from get_saved_highlights entirely to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_saved_highlightsA

Get your saved/bookmarked Komoot highlights.

Returns your personally saved highlights (scenic spots, viewpoints, interesting places you've bookmarked). These are used as waypoint attractors when building combined routes: the route combiner prefers paths that pass near your saved highlights.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full behavioral burden. It discloses the semantic role of the returned data (waypoint attractors the route combiner prefers), which is useful, but says nothing about authentication needs, rate limits, or whether the saved set can be empty.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three compact lines, front-loaded with the action and resource, then the purpose. Minor duplication of 'saved/bookmarked' does not cost meaningful space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return-value explanation is unnecessary, and with zero parameters there is no input contract to document. The description supplies the one thing structured fields cannot: why the agent should care about this data.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there are no parameter semantics to explain; baseline 4 applies by the rubric.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Get') and resource ('your saved/bookmarked Komoot highlights') and clarifies the ownership scope ('personally saved'). This distinguishes it from the sibling get_highlights, which presumably returns highlights generally rather than the user's saved set.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains the downstream purpose — these highlights act as waypoint attractors in combined-route building — which implies when the agent would care about them. However, it never explicitly contrasts this tool with the sibling get_highlights, so the routing decision is left partly to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tour_detailsA

Get full details of a Komoot tour including surface types and way types.

Returns surface breakdown (gravel, asphalt, dirt, etc.) and way types (path, cycleway, street, etc.) which are essential for gravel ride planning.

Args: tour_id: The Komoot tour ID. include_coordinates: If True, include full GPS coordinate array (can be 1000+ points). Defaults to False to keep responses compact for scoring/ranking.

NameRequiredDescriptionDefault
tour_idYes
include_coordinatesNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full disclosure burden. It does usefully explain that include_coordinates can return 1000+ points and defaults to False to keep responses compact, but says nothing about authentication requirements, failure modes for invalid tour IDs, or whether the call works across all tour types.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, followed by a scoped elaboration and a clean Args block; every element is relevant. There is mild repetition between the opening line and the second paragraph about surface/way types.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be documented, and the description still summarizes the key returned data. For a two-parameter read tool this is nearly complete; only auth/error behavior is absent, which is a minor gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: tour_id is identified as the Komoot tour ID and include_coordinates is explained with its default, its payload size, and the reason for the default. Only tour_id's type/format nuance is left implicit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource ('Get full details of a Komoot tour') and enumerates the distinctive payload (surface types, way types), which separates it from siblings like get_tour_segments or download_tour_gpx. It stops short of explicitly naming those siblings as alternatives, so it is clear but not fully differentiated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Offers a use context ('essential for gravel ride planning') that implies when the tool matters, but gives no when-not guidance and never points to the sibling tools an agent should prefer for GPX download or segment data. Usage is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tour_segmentsA

Get raw segment data (coordinates + surfaces + way types) for a tour.

Unlike get_tour_details which aggregates surface data, this returns the raw segment arrays needed for route combination: splitting tours by surface type and recombining the best gravel segments.

Args: tour_id: The Komoot tour ID.

NameRequiredDescriptionDefault
tour_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden, and it does disclose that the output is raw unaggregated arrays rather than summarized data. However, it says nothing about response size, pagination, rate limits, or that the operation is a non-destructive read, leaving the safety profile implicit.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose and sibling contrast are front-loaded in the first two sentences with no filler. The trailing Args block is somewhat formulaic for a single self-evident parameter, but it is short and does not bury the main point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description need not enumerate return fields, and it correctly focuses on purpose, differentiation, and the one input. It is nearly complete for a single-parameter read tool; only the absence of any safety/pagination note keeps it from the top score.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate; it supplies the one parameter description ('The Komoot tour ID'), which adds the Komoot-domain context missing from the bare 'Tour Id' title. That is the minimum needed but adds no format, range, or lookup guidance.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Get raw segment data') and enumerates exactly what the payload contains (coordinates, surfaces, way types). It explicitly distinguishes itself from the sibling get_tour_details by contrasting raw segment arrays against aggregated surface data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It names the alternative tool and the condition that selects this one: use this for route combination work (splitting tours by surface type, recombining gravel segments) rather than for aggregate surface stats. It gives clear context but never states an explicit exclusion or prerequisite, so it falls just short of the top band.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_toursA

List your Komoot tours with optional filtering by sport type, location, and radius.

Use near_lat/near_lon to search tours near a geographic point.

Args: sport_type: Sport type filter. Empty string = all sports. Common: touringbicycle, mtb, mtb_easy, racebike, hike. tour_type: Tour type. 'tour_planned' for planned, 'tour_recorded' for recorded. limit: Max number of tours to return. near_lat: Filter by latitude (center point). near_lon: Filter by longitude (center point). radius_km: Search radius in km (used with near_lat/near_lon).

NameRequiredDescriptionDefault
limitNo
near_latNo
near_lonNo
radius_kmNo
tour_typeNotour_planned
sport_typeNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It signals a read/list operation and notes that limit is the max number of tours to return, but omits authentication requirements, pagination behavior, sort order, and whether filters combine.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the purpose, then uses a compact Args list for parameter details. Every sentence contributes either usage or parameter meaning, with no filler or repetition beyond useful clarification.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers all parameters and the output schema handles return values, which is helpful. With no annotations and six optional parameters, however, missing auth expectations, pagination behavior, and read-only confirmation leave some gaps for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it documents all six parameters. It adds useful examples for sport_type and tour_type and explains the relationship between near_lat, near_lon, and radius_km, though it does not restate schema defaults.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States the specific verb 'List' and resource 'Komoot tours', with optional filters, so the core operation is clear. It does not explicitly distinguish this tool from siblings such as get_tour_details, but the listing purpose is unmistakable from the name and description.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides practical filtering guidance, including how to use near_lat/near_lon for geographic search and radius_km with them. However, it does not say when to choose this tool over alternatives like get_tour_details or get_highlights, leaving usage context largely implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

setup_credentialsA

Store Komoot credentials in the system keychain for future use.

Call this once before using any other Komoot tools, unless you set the KOMOOT_EMAIL and KOMOOT_PASSWORD environment variables instead. Credentials are verified first, then stored in the system keychain under service 'komoot-mcp'; a failed sign-in stores nothing.

NameRequiredDescriptionDefault
emailYes
passwordYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and does well: it discloses that credentials are verified before storage, the keychain service name ('komoot-mcp'), and the failure semantics ('a failed sign-in stores nothing'). It stops short of covering overwrite behavior, keychain access requirements, or security handling of the plaintext password.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the action, then the ordering/prerequisite, then the failure guarantee. Every sentence carries distinct information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described. For a credential-setup tool the description covers the prerequisite timing, the alternative configuration path, storage location, and failure behavior - all that an agent needs to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the two parameters are self-evident (email, password) and the description ties them to the env-var equivalents KOMOOT_EMAIL/KOMOOT_PASSWORD, which clarifies their meaning. It still adds no format, validation, or constraint detail beyond the obvious.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (store) and resource (Komoot credentials in the system keychain), with scope ('for future use') that immediately separates it from the tour/highlight/route siblings. An agent can tell this is the one-time auth setup tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says 'Call this once before using any other Komoot tools' and names the alternative path (KOMOOT_EMAIL and KOMOOT_PASSWORD environment variables). This is exactly the when-to-use / when-not-to-use / alternative structure that removes inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_gpx_to_komootB

Upload a GPX file to Komoot as a new planned tour.

Args: gpx_path: Path to the GPX file to upload. name: Name for the new tour on Komoot. sport: Sport type. Common: touringbicycle, mtb, racebike.

NameRequiredDescriptionDefault
nameYes
sportNotouringbicycle
gpx_pathYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It does disclose the side effect of creating a new tour, but says nothing about required credentials, permission needs, rate limits, duplicate-name handling, or failure behavior. Significant gaps for a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action, followed by a compact per-argument breakdown. The 'Args:' block is slightly mechanical but every line earns its place by documenting an otherwise undescribed parameter.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema exists, so return values need not be explained, and all three parameters are covered. However, for a mutating upload tool with no annotations, the missing authentication/prerequisite and error-handling context leaves the definition only minimally sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it largely does: it defines gpx_path as the file to upload, name as the tour name, and sport with concrete common values (touringbicycle, mtb, racebike). Only the default value and full acceptance set of sport remain undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb, resource and outcome: uploading a GPX file as a new planned tour on Komoot. This is clearly distinguishable from the download_tour_gpx sibling by the verb alone, though the description never explicitly names or contrasts the sibling. Clear but no explicit differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use, when-not-to-use, or alternative guidance is provided. The presence of setup_credentials as a sibling suggests an authentication precondition that the description never mentions. Usage must be fully inferred from the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv0.1.0
    • First observedbuild_combined_route
    • First observeddownload_tour_gpx
    • First observedget_highlights
    • First observedget_saved_highlights
    • First observedget_tour_details
    • First observedget_tour_segments
    • First observedlist_tours
    • First observedsetup_credentials
    • First observedupload_gpx_to_komoot

TDQS

A3.8/5.0

Scored across 9 tools

Disambiguation4/5

Each tool has a largely distinct purpose, and the descriptions clarify potential overlaps. The main possible confusion is between get_tour_details and get_tour_segments, but the text explicitly differentiates aggregated data from raw segment arrays. Highlight tools are also distinguished by location-based versus saved/bookmarked results.

Naming Consistency5/5

All tool names follow a clear snake_case, verb-first action_object pattern (e.g., setup_credentials, list_tours, download_tour_gpx, build_combined_route). The convention is consistent across the entire set with no mixed casing or vague verb styles.

Tool Count5/5

Nine tools is well-scoped for a Komoot integration focused on credential setup, tour browsing, GPX handling, highlights, and route building. Each tool serves a distinct step in these workflows, with no obviously redundant or missing count-level concerns.

Completeness4/5

The surface covers credentials, tour listing/details, raw segments, GPX download/upload, highlights, saved highlights, and combined route building, forming a coherent gravel-planning toolkit. Minor gaps exist around tour metadata update/delete and saving highlights, but core creation/read/export/route-building workflows are covered.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    A
    quality
    D
    maintenance
    Connects Claude to your Strava fitness data, enabling natural language queries about your training history such as activities, stats, and routes.
    8
    -
  • A
    license
    B
    quality
    B
    maintenance
    Enables Claude to design reliable hiking routes on real trails, computing accurate distance and elevation gain, locating notable points, technical passages, regulated areas, bivouac and stage options, and weather, with automatic validation across roughly 35 rules. Routes can be exported as GPX (including one file per day), Obsidian notes, HTML maps, and printable roadbooks.
    23
    1
    MIT