Skip to main content
Glama

bike-mapper

A road-cycling route planner for Dublin and Wicklow that ranks routes by how often you will have to stop, not just by how far you ride. It plans loops, out-and-backs and one-way rides to a target length, can seek out the hardest climbs or avoid them, keeps you off main roads if you ask, and exports GPX files that import straight into Garmin Connect. It runs as a local web page and as an MCP server, so you can plan a ride by talking to Claude Code.

Everything is built on open data: OpenStreetMap, the Copernicus GLO-30 elevation model and BRouter. The project started as a feasibility study (see Research) into whether open data can predict where a cyclist stops; the planner is what came out of it.

What it does

  • Fewest-stops routing. Every candidate route is scored against a directional index of stop causes derived from OSM (traffic signals, stop and give-way signs, roundabout entries, junction priority) and a per-class stop model, giving expected stops, stops per km and expected stopped time.

  • Three ride shapes with a length target. loop, out_and_back (same road back, or a free return) and one_way, with length_km or an explicit min_km/max_km range. Loops are searched over ring and petal via-point shapes so they still close from awkward starts such as the Howth peninsula.

  • Three objectives. flow (fewest stops and turns), climb (most and hardest climbing, via-points picked from the DEM) and flat.

  • Tunable routing. Lane bonus, turn cost, lane-exit cost, cycleway weight and a main_road_penalty (1 to 5) that trades distance for quieter roads, with presets (straight & lanes, plain flow, quiet roads, climb, flat). Ferries are never used.

  • Route explanation. Per route: km by road class, km on cycle infrastructure, main-road km, stop events by cause, turns, detected climbs (length, gain, grade), ascent and descent from DEM-sampled elevations.

  • GPX export with elevation, ready for Garmin Connect (Training & Planning > Courses > Import).

  • Web UI (Leaflet, single file) with click-to-pick start and end, place search, sliders for every setting, route cards and a cycle-infrastructure overlay.

  • MCP server exposing plan_route, route_details, export_gpx, geocode, list_presets, pick_points, status and start_brouter.

Related MCP server: runcoach

Quick start

Prerequisites: uv (brew install uv), Java 17+ (for BRouter), curl, and Node (only for the UI syntax check).

make setup           # uv sync
make planner-setup   # once: downloads BRouter 1.7.10 + Ireland tiles into data/brouter/, builds the flow index
make brouter         # terminal 1: BRouter on http://localhost:17777
make planner         # terminal 2: planner on http://localhost:8081

Open http://localhost:8081, click a start and an end (or search by name) and pick a mode. make planner-check runs pytest, ruff and the UI syntax check.

Data you need to provide

The data/ directory is gitignored apart from small samples and the stop model. Before make planner-setup you need:

path

what

where from

data/osm/ireland.osm.pbf

OSM extract

Geofabrik

data/osm/events_ireland.csv

stop-cause events

scripts/osm_stop_features.py over the PBF, see docs/planner.md

data/dem/*.tif

Copernicus GLO-30 tiles (optional, needed for climb/flat)

AWS Open Data, see docs/planner.md

BRouter's routing tiles are downloaded by the setup script. The committed stop model (data/model/stop_model.json) defaults to a literature-based prior; the empirical weight sets were derived offline from one rider's history, which is not in the repo.

Use it from Claude Code

The repo ships a project-scoped .mcp.json that registers the planner as the flow-planner MCP server (uv run scripts/flow_mcp.py). Start Claude Code in the repo, approve the server, make sure BRouter is running (or ask for start_brouter), then:

Plan a 60 km climbing loop from Rathfarnham.

Out and back from Howth to Donabate, 50 to 60 km, keep me off the main roads.

Export the best one for my Garmin.

Details, the full tool table and the evaluation results are in docs/mcp.md.

How it works

  1. The web page or MCP tool calls PlannerService in scripts/flowplan/.

  2. BRouter is asked for candidates with the custom profiles/flow.brf profile: four cost variants times four alternatives per leg, plus via-point sets for loops and out-and-backs, under a call budget.

  3. Near-duplicate candidates are dropped, the rest are matched to the flow index (data/flow/ireland.index.csv) and scored by the stop model.

  4. Routes are ranked by the objective, climbs are detected on a DEM-sampled profile, and the top n are returned with explanations and GPX.

docs/planner.md covers the architecture, the stop model, the BRouter profile, loop geometry, elevation sources and known limits.

Repository layout

path

contents

scripts/flowplan/

planner library: BRouter client, candidates, scoring, ranking, climbs, terrain (DEM), turns, GPX, service

scripts/flow_server.py

FastAPI web server and /api/plan, /api/route

scripts/flow_mcp.py

MCP server (FastMCP, stdio)

scripts/*.py

data pipeline and research scripts (OSM features, flow index, stop-model validation, evals)

profiles/flow.brf

the BRouter profile with node costs per stop cause, lane and main-road factors

web/index.html

the planner page

tests/

pytest suite (BRouter is mocked; no network needed)

docs/planner.md, docs/mcp.md

planner and MCP documentation, evaluation tables

docs/research/

the feasibility study, one note per question

docs/map/

Leaflet viewer over the study's sample outputs

data/samples/, data/model/

small committed data: eval CSVs, sample GPX, the stop model

.beads/

issue tracker export (see below)

Research

The planner rests on a set of research notes in docs/research/, each following one template, starting from the feasibility summary: OSM tag coverage in Ireland, OSM stop-cause features, empirical stop detection from ride GPS, validation of the stop model against observed stops, open elevation models checked on the Wicklow Gap, open climb datasets, motor-traffic counts, routing engines compared on node-level costs, and open sources for stop priors.

Development

  • make planner-check is the gate: pytest, ruff check, and a syntax check of the inline UI script.

  • Evaluations: uv run scripts/plan_eval.py (loop, out-and-back and one-way scenarios against a live BRouter) and uv run scripts/planner_eval.py (one-way pairs). Results are committed under data/samples/ and discussed in the docs.

  • Issues are tracked with beads (bd). The versioned export is .beads/issues.jsonl; run bd prime for the workflow. The commit history is one commit per bead, so git log reads as the project's change log.

  • The code was written with Claude Code acting as implementer and reviewer under a human orchestrator; CLAUDE.md and AGENTS.md hold the agent instructions.

Data licences

  • Map data (c) OpenStreetMap contributors, ODbL. Derived tables (the flow index, the stop-cause events, the committed samples) are derived databases under the ODbL.

  • Elevation: Copernicus DEM GLO-30, (c) European Union, Copernicus free licence.

  • Routing: BRouter (MIT), downloaded at setup, not vendored.

Licence

MIT, see LICENSE.

Available Tools

8 tools
export_gpxB

Write a planned route as GPX 1.1 (with elevation) into out_dir (must exist; absolute or ~).

NameRequiredDescriptionDefault
nameNo
out_dirNo~/Downloads
route_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

With no annotations, the description must carry the behavioral burden, and it does disclose that this is a file write of GPX 1.1 with elevation and that the target directory must pre-exist. It is silent on overwrite behavior (does an existing file get replaced?), whether the filename derives from the name param or route_id, and whether permissions/side effects apply.

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?

A single front-loaded sentence with no filler; every clause (format, elevation, directory constraint) earns its place. The packed parenthetical for out_dir constraints is slightly terse but readable.

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?

An output schema exists, so return values need not be described, and the format/elevation/directory requirements are covered. For a filesystem-mutating tool with zero annotations, though, the overwrite semantics and how the output filename is chosen are meaningful gaps.

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, and it only partially does: out_dir gets real added meaning (must exist, absolute or ~), but route_id is left implicit and the name parameter is never explained (filename? GPX track name?). The most ambiguous parameter is 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?

The description names a specific verb ("Write") and resource ("a planned route as GPX 1.1") plus the output destination, which is far more precise than the bare name export_gpx. It does not explicitly contrast itself with siblings like plan_route or route_details, but the write-to-file purpose is unambiguous.

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?

It states one prerequisite for out_dir ("must exist; absolute or ~"), which implies the tool is used after a route exists. However, it never says when to choose this over alternatives, nor that a route must be planned first (e.g., via plan_route) or that route_id must reference an existing route.

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

geocodeB

Look up an Irish place name (Nominatim). Returns candidates with name and lat,lon.

NameRequiredDescriptionDefault
limitNo
queryYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.1/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 burden. It does disclose useful behavior: the lookup uses Nominatim, is limited to Irish place names, and returns candidate matches with name and coordinates. However, it omits operational details such as rate limits, ambiguity handling, and whether an empty result is expected when no Irish place matches.

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 two short sentences with the core purpose front-loaded and the return shape immediately after. There is no filler, and every clause contributes useful information for selecting or calling the tool.

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?

An output schema exists, so the description need not explain return values in depth, and it does summarize the key return fields. Still, for a tool with no annotations and 0% schema description coverage on its inputs, the description leaves gaps around the 'limit' parameter and expected query format that would help an agent call it correctly.

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

Parameters2/5

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

Schema description coverage is 0%, so the schema does not explain the parameters. The description implies that 'query' is an Irish place name, but it never explains the 'limit' parameter (default 5) or how it controls the number of returned candidates. It therefore only partially compensates for the missing schema documentation.

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 uses a specific verb and resource ('look up an Irish place name') and names the backing service (Nominatim), so the agent knows this is a geocoding lookup rather than a routing tool. It does not explicitly distinguish itself from siblings like route_details or plan_route, but the purpose is clear enough to select it for place-name lookups.

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?

The description gives no guidance on when to use this tool versus alternatives such as route_details, plan_route, or pick_points. The Irish-place-name scope is stated, but there are no exclusions, prerequisites, or workflow context to help the agent decide when geocoding is the right call.

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

list_presetsA

Settings presets (straight & lanes, plain flow, climb, flat) as dicts: pass settings to plan_route and objective as plan_route's objective argument.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations the description carries the full burden, and it discloses the meaningful behavior: the tool yields plain data dicts whose keys (`settings`, `objective`) map onto plan_route arguments. It does not explicitly state that the call is side-effect free or list what serialization/shape edge cases exist, so it stops short of fully covering the behavioral surface.

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?

A single dense sentence: the resource and its contents come first, followed by the consumption instruction. No filler, nothing that fails to earn its place.

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 zero-input lister with an output schema already present, the description need not explain return values, and it still adds the crucial consumption mapping. The only minor gap is the absence of any explicit statement that calling it has no side effects.

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 the baseline is 4. The description goes further by naming the two output fields and which plan_route argument each feeds, which is directly actionable semantics even though the output schema already exists.

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 names the resource (settings presets) and enumerates the concrete preset kinds (straight & lanes, plain flow, climb, flat) plus their output form ('as dicts'). It implicitly separates this from siblings by pointing at plan_route as the consumer, though the listing verb itself is only implied.

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 tells the agent exactly what to do with the result: pass `settings` to plan_route and `objective` as plan_route's objective argument. That is a clear usage context with no realistic alternatives to disambiguate among siblings, but there is no explicit 'when not to call' or prerequisite statement.

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

pick_pointsA

Ask the user to click 1 or 2 points on the planner map (opens the browser at the planner web page, which needs make planner running) and wait for them. Returns 'lat,lon' strings to use as start / end in plan_route.

NameRequiredDescriptionDefault
nNo
timeout_sNo

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

With no annotations, the description carries the burden and does disclose key traits: the tool is interactive and blocking (it opens a browser and waits for the user), and it depends on an external server being up. It omits what happens when the user never clicks (timeout behavior, failure mode), which matters for a blocking call.

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?

A single tight sentence front-loads the action and follows with the prerequisite and return contract. No filler, though the parenthetical could be structured more crisply.

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?

Output schema exists, so the description need not explain the return shape, though it helpfully notes 'lat,lon' strings and their use in plan_route. The remaining gap is timeout/failure behavior for a tool that blocks on human input.

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

Parameters2/5

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

Schema coverage is 0%, so the description must document both parameters. 'Click 1 or 2 points' loosely hints at `n` but never names it or its bounds, and `timeout_s` is not mentioned at all despite governing how long an agent will block.

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 and resource: asks the user to click 1 or 2 points on the planner map and waits for the result. It also names the downstream consumer (plan_route) and the return format, so an agent can distinguish this interactive picker from geocode or route_details without opening a schema.

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?

Implies usage clearly: call this before plan_route to obtain 'lat,lon' start/end strings, and it requires `make planner` running. It gives a prerequisite and a purpose in the workflow, but offers no explicit exclusions or alternatives (e.g., when to use geocode instead).

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

plan_routeA

Plan routes. mode: loop | out_and_back | one_way. start/end: 'lat,lon' or a place name (geocoded; the resolved place is echoed). Loops and out-and-backs need length_km (+-10%) or min_km and max_km; one_way needs end and ignores length. objective: flow (fewest stops/turns) | climb | flat. return_mode: same | free. settings: optional dict from list_presets (e.g. turn_cost, lane_bonus, weights; main_road_penalty 1..5 multiplies the cost of primary, secondary and trunk roads, 2.5 = 'quiet roads' preset). Loops take 30-60 s. Returns a markdown table of ranked routes (use the ids with route_details / export_gpx) plus plan notes.

NameRequiredDescriptionDefault
nNo
endNo
modeYes
startYes
max_kmNo
min_kmNo
bearingsNo
settingsNo
length_kmNo
objectiveNoflow
return_modeNosame

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/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: it discloses geocoding of place names (echoed back), a 30-60 s latency for loops, and that length is ignored for one_way. It does not say whether the call is read-only/side-effect free, what happens on unresolvable place names, or the shape of plan notes.

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?

Telegraphic parameter-grouped style with the most load-bearing facts (modes, distance rules, objective) up front and return behavior last. Every clause carries information, though the run-on density and the stray line break make it slightly harder to scan than it needs to be.

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, the description covers all the semantically complex inputs plus a one-line note on the returned markdown table and plan notes. The gaps are the unmentioned n (result count) and bearings parameters, which no structured field explains.

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 does nearly all the work: it defines mode values, start/end formats, the length family and its tolerance, objective values, return_mode values, and the settings dict including the main_road_penalty 1..5 scale with a concrete 2.5 example. Two parameters, n and bearings, are left entirely 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 and resource ('Plan routes') and immediately enumerates the mode vocabulary, so an agent knows this is the route-generation entry point. It also implies its place in the pipeline by telling the caller to feed returned ids into route_details / export_gpx, though it never explicitly contrasts itself with those siblings.

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 concrete conditional rules: loops and out-and-backs require length_km (+-10%) or min_km/max_km, one_way requires end and ignores length, and settings should come from list_presets. Alternatives are implicit via the downstream id usage rather than stated as explicit when-not-to-use guidance.

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

route_detailsB

Explain a planned route: km by road class, cycle-infrastructure km, stop events, climbs, turns.

NameRequiredDescriptionDefault
route_idYes

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

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

With no annotations, the description carries the behavioral burden. "Explain" and the listed output metrics strongly imply a read-only informational operation, but the description does not explicitly state side effects, permissions, or error 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?

The definition is a single front-loaded sentence with zero waste. It efficiently lists the key output dimensions without unnecessary preamble.

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?

An output schema exists and the description summarizes the returned metrics, so return values are reasonably covered. What remains missing is the route_id source/prerequisite and any guidance on when to choose this over siblings.

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

Parameters2/5

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

Schema description coverage is 0%, and the description never explains route_id, its expected format, or where to obtain it. The single parameter is simple and inferable from context, but the description adds little beyond the schema's parameter name.

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 gives a specific verb ("Explain") and resource ("planned route"), then enumerates the route metrics returned. It clearly separates this from plan_route by implying this is post-planning detail retrieval, though it does not explicitly name the sibling.

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 phrase "planned route" and required route_id imply this should be used after a route has been planned. However, there is no explicit when-to-use guidance, no mention of plan_route, and no exclusions versus export_gpx or other siblings.

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

start_brouterA

Start the local BRouter server (scripts/run_brouter.sh serve) if it is not reachable; waits up to 60 s.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

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

With no annotations, the description still discloses meaningful behavior: it spawns a local server process, is conditional on reachability, and blocks for up to 60 seconds. It does not say what happens on timeout or failure (error vs. partial start), which is the main remaining gap for a process-launching tool.

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?

A single sentence that is front-loaded with the action and resource, then adds the mechanism and the blocking timeout. No filler, and every clause carries information.

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?

The tool is simple, parameterless, and ships with an output schema, so return values need not be explained. The description covers what an agent needs to call it correctly; only failure/timeout semantics are unaddressed.

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 is nothing for the description to disambiguate and the baseline of 4 applies. The description correctly implies no configuration is needed.

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 (Start) and resource (the local BRouter server), plus the concrete mechanism (scripts/run_brouter.sh serve). It is clearly distinct from the sibling 'status' tool, though it does not name any sibling explicitly.

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?

The phrase 'if it is not reachable' gives an explicit precondition and signals the call is safe/idempotent when the server is already up. It does not point the agent at 'status' as the way to determine reachability, so the routing to the alternative is left implicit.

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

statusC

BRouter reachability, region, stop-model weight set, flow index size and DEM coverage.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.8/5.0
Behavior2/5

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

No annotations are supplied, so the description carries the full burden, yet it never states that this is a read-only, side-effect-free query, whether an unavailable BRouter instance is reported as an error or as a value, or what the reachability/coverage fields mean. Listing the reported facets is a start but leaves the behavioral profile thin.

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

Conciseness3/5

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

It is a single compact sentence with zero padding, which is good, but as a sentence fragment without a subject or verb it reads as a field list rather than a definition, and the most important information (what the tool returns/why to call it) is not front-loaded.

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?

An output schema exists, so return-value detail is legitimately omitted, and with zero parameters the call mechanics are trivial. Still, for a status/health tool it would help to say it reports the state of the configured BRouter instance and is the natural first call in the workflow, which is absent.

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 the schema fully covers the call signature; the description adds nothing to misinterpret and nothing is missing on the parameter side.

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

Purpose3/5

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

The description enumerates the domains reported (reachability, region, weight set, flow index size, DEM coverage), which tells an agent what information is surfaced, but it is a noun phrase with no verb, so the action (return current BRouter server/segment state) is only inferred from the name 'status'. It also never distinguishes itself from siblings like start_brouter or list_presets.

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 guidance is given: nothing says this is the pre-flight/health check before calling plan_route or route_details, and no alternatives or exclusions are named. The agent must infer applicability from the tool name alone.

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. 8 tool updatesv0.1.0
    • First observedexport_gpx
    • First observedgeocode
    • First observedlist_presets
    • First observedpick_points
    • First observedplan_route
    • First observedroute_details
    • First observedstart_brouter
    • First observedstatus

TDQS

A3.7/5.0

Scored across 8 tools

Disambiguation5/5

Each tool has a clearly distinct role in the route-planning workflow: planning, inspecting, exporting, presets, point picking, geocoding, status, and starting BRouter. There is no meaningful overlap; plan_route returns route IDs while route_details and export_gpx consume them.

Naming Consistency4/5

Most names follow a predictable snake_case verb_noun or noun pattern (route_details, export_gpx, list_presets, pick_points, start_brouter, plan_route). A few deviations like status and geocode are single-word but still clear and readable.

Tool Count5/5

Eight tools is well-scoped for a route-planning server, with each tool covering a necessary step from setup to output. No tool feels redundant or missing from the count.

Completeness4/5

The surface covers the core lifecycle: discover places, configure settings, plan routes, inspect details, and export GPX. Minor gaps exist around managing multiple saved routes or re-inspecting previously planned routes beyond the immediate result set.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Brings Garmin training data into Claude via Intervals.icu, enabling querying of activities, wellness, and planned workouts, as well as creating structured workouts that sync back to the Garmin watch.
    9
    1
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Provides Claude Code and Claude Desktop with safe, read-only access to your local Garmin training data, readiness decisions, run details, and trends so you can get coaching advice in natural language.
    13
    1
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables users to ask ChatGPT or Claude where a runner or cyclist is in a live race, how the race is going, and what the weather along the course will be, returning live maps and 3D route flyovers inline in the chat. Also surfaces cycling tour day-by-day routes, GPX links and organiser notes, all read-only and free.
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Enables Claude to generate mountain bike loops or point-to-point routes from a place name or coordinates, computed on real OpenStreetMap trails by a routing engine and saved as GPX files with elevation, along with a summary and warnings about traffic, steep grades, protected areas and forbidden access. It also lists previously saved routes.
    2
    MIT