Skip to main content
Glama
mzorz

bikerouter-mcp

by mzorz

bikerouter-mcp

一个 MCP 服务器,使用 bikerouter.de 规划自行车路线——bikerouter.de 是 Norbert Renner 基于 BRouter 引擎(作者 Arndt Brenschede)开发的 BRouter-Web 前端,在 OpenStreetMap 数据上进行路由。

将任何 MCP 客户端(Claude Code、Claude Desktop 等)指向它,然后提出类似 “沿莱茵河规划一条从科隆到波恩的砾石路线,并给我 GPX” 的请求。

它能做什么

工具

用途

plan_route

通过 2 个及以上途经点(坐标或地名)规划路线,并返回距离、爬升/下降、预计骑行时间、路面和道路类型细分、转弯指令、可分享的 bikerouter.de 链接,以及可选的保存 GPX/GeoJSON/KML/CSV 文件。

compare_profiles

使用多个配置文件(例如 trekking 对比 gravel 对比 fastbike)为相同途经点规划路线,并并排比较距离、时间、爬升和铺装路面占比。

geocode_place

将地名、地址或兴趣点转换为坐标(通过 Photon,即 bikerouter.de 使用的地理编码器)。

list_profiles

列出已知的路由配置文件,并可选择验证路由主机实际提供哪些配置文件。

get_profile_options

读取配置文件的 .brf 源码,并列出其暴露的参数(avoid_unsafe、allow_ferries、totalMass、bikerPower 等),供 plan_route 的 profile_options 使用。

plan_route 输出示例:

**Route** (profile: `trekking`)
Alexanderplatz, Berlin → Brandenburger Tor, Berlin

- Distance: **5.2 km**
- Estimated riding time: **20 min** (⌀ 15.6 km/h, from the profile's physics model)
- Ascent: **80 m** / descent: **60 m**
- Elevation: 35–55 m (start 35 m, end 55 m)

- Surfaces: asphalt 76.9% (4 km), gravel 23.1% (1.2 km)
- Way types: cycleway 38.5% (2 km), residential 38.5% (2 km), track 23.1% (1.2 km)

Open in bikerouter.de: https://bikerouter.de/#map=14/52.518154/13.396327/standard&lonlats=…&profile=trekking

Related MCP server: komoot-mcp

安装

cd bikerouter-mcp
npm install     # also builds via the prepare script
npm test

使用 Claude Code 注册它:

claude mcp add bikerouter -- node /absolute/path/to/bikerouter-mcp/dist/index.js

或将其添加到 claude_desktop_config.json / 任何其他 MCP 客户端:

{
  "mcpServers": {
    "bikerouter": {
      "command": "node",
      "args": ["/absolute/path/to/bikerouter-mcp/dist/index.js"]
    }
  }
}

无需 API 密钥——该服务免费且无需身份验证。

配置

全部可选,通过环境变量设置:

变量

默认值

含义

BIKEROUTER_HOST

https://brouter.de

提供 BRouter /brouter 路由端点的主机。bikerouter.de 只是 Web 前端,在此处会返回 404,因此默认值为 brouter.de。将其指向 http://localhost:17777 以使用您自己的 BRouter 服务器。

BIKEROUTER_WEB_URL

https://bikerouter.de

用于可分享地图链接的 Web UI。

BIKEROUTER_PROFILES_URL

<host>/brouter/profiles2/,然后是 <host>/profiles/,然后是 <web>/profiles/

.brf 配置文件源码所在位置(供 get_profile_options 使用)。

BIKEROUTER_GEOCODER_URL

https://photon.komoot.io/api

兼容 Photon 的地理编码器。

BIKEROUTER_DEFAULT_PROFILE

trekking

当调用方未指定时使用的配置文件。

BIKEROUTER_TIMEOUT_MS

60000

HTTP 超时。长路线可能需要一些时间。

BIKEROUTER_USER_AGENT

bikerouter-mcp/0.1.0

随每个请求发送。

如何映射到 BRouter API

请求是普通的 GET /brouter 调用,与 BRouter 的 ServerHandler.java 中记录的完全一致:

/brouter?lonlats=lon,lat|lon,lat&nogos=lon,lat,radius,weight|…&profile=trekking
        &alternativeidx=0&format=geojson&timode=1&straight=0&profile:avoid_unsafe=true
  • waypoints → lonlats(先对地名进行地理编码,并偏向于上一个途经点)

  • avoid_areas → nogos(省略 weight 表示硬性禁行区)

  • straight_from → straight(直线路段)

  • profile_options → profile:NAME=VALUE

  • alternative_index → alternativeidx(1–3 表示备选路线)

  • turn_instructions → timode(GeoJSON 响应中的语音提示)

GeoJSON 响应在本地进行汇总:轨迹长度、filtered ascend、total-time 和 total-energy 来自轨迹属性,下降由过滤后的爬升和净高度变化推导得出,路面 / 道路类型 / 平整度细分则从 messages 表中聚合(WayTags 按 Distance 加权)。

值得了解的局限性

  • 路由质量即 OpenStreetMap 质量。 缺少路面或通行标签会产生奇怪的绕路;骑行前务必在返回的地图链接上检查路线是否合理。

  • BRouter 没有街道名称,因此转弯指令显示为“1.2 公里后右转”,没有道路名称。这是引擎本身的属性,而非此服务器的属性。

  • 预计骑行时间来自配置文件的物理模型(骑行者质量、功率、阻力)。通过 profile_options 覆盖 totalMass、bikerPower、maxSpeed 以获得更实际的数值。

  • 海拔需要 SRTM 覆盖;在约 ~60°N/S 以上,轨迹返回时没有海拔数据,摘要中会说明这一点。

  • 公共服务是一个免费、社区运行的实例——请保持适度的请求量,或者运行您自己的 BRouter 服务器并设置 BIKEROUTER_HOST。

  • 不同服务器的配置文件有所不同。list_profiles 附带一份标准 BRouter/BRouter-Web 配置文件目录;传入 verify: true 可检查给定主机实际提供哪些配置文件。

测试

npm test 构建服务器并运行 node --test:

  • 针对 URL 构建、途经点验证、.brf 参数解析和 GeoJSON 汇总器的单元测试

  • 一个端到端测试,通过 stdio 与真实服务器二进制文件进行 MCP 通信,并针对一个桩 BRouter 主机,涵盖路由、GPX 导出、配置文件列表和 BRouter 的纯文本错误响应

测试从不访问公共服务,因此可以离线运行。

致谢与许可证

服务器代码:MIT。它仅是一个客户端——路由由 BRouter(MIT)通过 BRouter-Web / bikerouter.de 完成,地图数据 © OpenStreetMap 贡献者(ODbL)。

Available Tools

5 tools
compare_profilesCompare routing profilesA

Routes the same waypoints with several profiles (e.g. trekking vs gravel vs fastbike) and compares distance, riding time, climb and surface mix, so the best style of route can be picked.

ParametersJSON Schema
NameRequiredDescriptionDefault
profilesYesProfiles to compare, e.g. ["trekking", "gravel", "fastbike"]
waypointsYesStart, optional via points, and destination
avoid_areasNo
profile_optionsNoProfile parameter overrides sent as profile:NAME=VALUE, e.g. {"avoid_unsafe": true, "maxSpeed": 25}. Use get_profile_options to discover what a profile supports.

TDQS

A4/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. It explains that the tool computes routes for multiple profiles and reports comparison metrics, which is useful. It does not disclose side effects, error behavior, or constraints such as profile availability, though for a routing comparison the main behavior is well covered.

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 front-loads the action (routes same waypoints with several profiles) and the purpose (compare metrics to pick best style), with no filler or repeated schema 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?

For a tool with nested parameters and no output schema, the description names all key output dimensions and states the input structure. Optional parameters are left to a detailed schema, and available profiles can be discovered from sibling list_profiles, so an agent has enough context 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 coverage is 75% and most parameters already have descriptive text, so the baseline is 3. The description adds an example profile list and links profiles to the comparison metrics, but does not materially add meaning to waypoints, avoid_areas, or profile_options beyond the schema.

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 uses a specific verb ('routes', 'compares') and a clear resource (waypoints across multiple routing profiles), and names concrete comparison metrics (distance, riding time, climb, surface mix). This distinguishes it from siblings like plan_route or list_profiles by emphasizing multi-profile comparison rather than single-route planning or profile enumeration.

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 clearly frames the use case: pick a route style by comparing the same waypoints under several profiles. It does not explicitly name alternatives or state when not to use it, but the 'several profiles' contrast makes the selection condition reasonably clear.

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

geocode_placeFind coordinates for a placeA

Looks up coordinates for a place name, address or POI so it can be used as a routing waypoint.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoNumber of candidates (default 5)
queryYesPlace to search for, e.g. "Kölner Dom" or "Piazza Navona, Rome"
languageNoResult language, e.g. "en" or "de"
near_latNoBias results towards this latitude
near_lonNoBias results towards this longitude

TDQS

A4/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden for behavioral disclosure. It states the read-only nature ('looks up') and the main output ('coordinates'), but it does not disclose that multiple candidates may be returned, that results may be ambiguous, or how the response is structured. This is adequate for a simple lookup but lacks richer behavioral context.

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 a single, efficient sentence with no filler. The core action ('looks up coordinates') is front-loaded, followed by the object and use case. Every word earns 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 simple, read-only geocoding tool with no output schema, the description is nearly complete: it states the input scope, the output concept, and the routing use case. It does not specify the response format, but the title and description together make the tool's purpose and behavior sufficiently clear for correct invocation.

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 100%, so the baseline is 3. The description adds minimal semantic value by clarifying that 'query' can be a place name, address, or POI, but it does not add significant explanation for limit, language, near_lat, or near_lon beyond what the schema already documents.

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 ('looks up'), a clear resource ('coordinates for a place name, address or POI'), and a concrete use case ('as a routing waypoint'). It distinguishes itself from sibling tools like plan_route or compare_profiles, which serve different purposes.

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 description provides clear context by tying the tool's output to routing waypoints, implying it should be used whenever a place needs to be converted to coordinates before route planning. It does not explicitly exclude alternatives or mention when not to use it, but no sibling tool performs geocoding, so the usage context is reasonably clear.

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

get_profile_optionsShow tunable options of a profileA

Fetches a profile's source and lists the parameters it exposes (avoid unsafe roads, allow ferries, rider mass and power, elevation weighting, ...). Pass them to plan_route via profile_options.

ParametersJSON Schema
NameRequiredDescriptionDefault
profileYesProfile name, e.g. "trekking" or "gravel"

TDQS

A4.3/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 burden of explaining behavior. It discloses that the tool reads a profile's source and extracts tunable options, and the examples convey that the output is a list of parameter names. It doesn't explicitly state read-only semantics, but 'fetches' strongly implies a non-mutating operation, and no side effects are suggested.

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 a single sentence that front-loads the core action and result, then quickly gives examples and a usage note. Every phrase adds value, and there is no wasted wording.

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?

For a tool with one parameter and no output schema, the description explains what it does, what it returns, and how to use the result. The absence of error-handling details or return format specifics is minor given the simplicity of the operation.

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?

The schema already provides 100% coverage for the single parameter 'profile' with a description and example values. The tool description adds context about the parameter's role (used to fetch that profile's source), but this is largely implied by the purpose and doesn't provide additional semantic depth beyond the schema.

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 clearly states a specific action ('fetches a profile's source') and its result ('lists the parameters it exposes'), with concrete examples of the parameters. It distinguishes itself from siblings like plan_route and compare_profiles by focusing on retrieving tuning options rather than routing or comparison.

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 description tells the agent to pass the fetched parameters to plan_route via profile_options, making the tool's role in a workflow clear. It doesn't explicitly exclude alternatives or mention when not to use it, but the connection to plan_route provides strong contextual guidance.

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

list_profilesList routing profilesA

Lists the BRouter routing profiles (riding styles) known to this server, optionally checking which ones the routing host actually serves.

ParametersJSON Schema
NameRequiredDescriptionDefault
verifyNoCheck availability by fetching each profile from https://brouter.de (slower)
categoryNoFilter by category (default bike)

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 burden of behavioral disclosure. 'Lists' conveys a read-only operation, and the 'optionally checking' phrase hints at an extra verification step, but it does not disclose that verify says it fetches from an external URL (as in the schema) or that it might be slow. No contradictions.

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 with no wasted words. The core purpose is front-loaded, and the optional behavior is appended without distracting from the main operation.

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 simple two-optional-parameter listing tool, the description covers scope and optional behavior. It does not describe the return format, but for a list operation this is likely inferable; overall, nothing critical is missing.

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 100%, with both 'verify' and 'category' having clear descriptions. The tool description adds no parameter-specific meaning beyond the schema, so the baseline 3 applies.

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 uses a specific verb ('Lists') and a clear resource ('BRouter routing profiles') with a scope qualifier ('known to this server'), distinguishing it from sibling tools like plan_route and compare_profiles. The optional availability check adds clarity without ambiguity.

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 use when you need to discover server-known profiles, but it does not explicitly contrast with sibling tools or state when to use it instead of get_profile_options. No exclusions or preconditions are mentioned, so guidance is only implied.

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

plan_routePlan a bike routeA

Plans a cycling route through the given waypoints with BRouter and returns distance, climb, estimated riding time, surface and way-type breakdown, turn instructions and a shareable bikerouter.de link. Waypoints may be coordinates or place names. Optionally saves the track as GPX/GeoJSON/KML.

ParametersJSON Schema
NameRequiredDescriptionDefault
profileNoRouting profile (default "trekking"). See list_profiles.
save_toNoFile path to write the track to
waypointsYesStart, optional via points, and destination, in order
track_nameNoTrack name used inside the exported file
avoid_areasNoCircular areas the route should avoid
save_formatNoFormat for save_to (default gpx)
straight_fromNoWaypoint indexes (0-based) whose following leg should be a straight beeline instead of routed
include_geojsonNoAlso return the raw GeoJSON track (large; off by default)
profile_optionsNoProfile parameter overrides sent as profile:NAME=VALUE, e.g. {"avoid_unsafe": true, "maxSpeed": 25}. Use get_profile_options to discover what a profile supports.
alternative_indexNo0 = best route (default); 1-3 request alternative routes
turn_instructionsNoInclude turn-by-turn instructions (default true)
max_turn_instructionsNoCap on listed turns (default 40)

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 full burden and does well: it discloses the return payload (distance, climb, time, surfaces, turn instructions, shareable link), optional file saving, coordinate/place-name waypoints, and the large-GeoJSON caveat. It does not mention failure modes, rate limits, or network dependency, but the core behavioral surface is well covered.

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 sentences cover the core action, output payload, waypoint flexibility, and optional saving behavior with no filler. Important details are front-loaded in the first sentence, and the later sentences add only necessary nuance.

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?

Given a complex schema with 12 parameters and no output schema, the description effectively summarizes what the tool returns and the key modes of use. It names most salient behaviors but leaves some output structure details (e.g., exact JSON shape, units) implicit; still, the description is sufficient for an agent to understand what the tool does and when it is appropriate.

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 coverage is 100%, so the schema already documents all 12 parameters and their meanings. The description adds a helpful high-level characterization of waypoints (coordinates or place names) and optional GPX/GeoJSON/KML export, but this overlaps with existing parameter descriptions rather than substantially extending them.

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 names a specific verb ('Plans a cycling route'), a specific engine (BRouter), and a detailed list of outputs, which makes the tool's purpose unmistakable. It clearly differentiates from its siblings (profile comparison, geocoding, profile listing/options) without needing to mention them.

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 the tool is for routing through waypoints and references list_profiles/get_profile_options for related configuration, but it never explicitly states when to use plan_route versus an alternative or when not to use it. The context is clear enough from the purpose, but no direct usage-selection guidance is provided.

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. 5 tool updatesv0.1.0
    • First observedcompare_profiles
    • First observedgeocode_place
    • First observedget_profile_options
    • First observedlist_profiles
    • First observedplan_route

TDQS

A4.1/5.0

Scored across 5 tools

Disambiguation4/5

The five tools are fairly distinct: plan_route is the core routing function, compare_profiles explicitly compares routing results across profiles, geocode_place converts names to coordinates, and list_profiles/get_profile_options are clearly about profile metadata. Minor confusion could arise between list and get_profile, but their scope is differentiated by listing and options-fetching.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern in lowercase with underscores: plan/compare/geocode/list/get + route/profiles/place. Every verb is specific and every noun clearly reflects the resource. There is no mixing of naming styles or tense conventions.

Tool Count5/5

The server provides exactly five tools for a domain that is naturally narrow: compose a route, compare routing outcomes, geocode a waypoint, inspect available profiles, and retrieve profile tuning details. This is a well-scoped set for a routing assistant without feature bloat.

Completeness4/5

The tool set covers the core lifecycle of bike route planning smoothly: geocoding inputs, planning a route, selecting and comparing routing styles. The main gap is the lack of a save/load route history or a user-specific profile creation tool, but these are optional conveniences, not critical. There are no major dead-ends in the existing workflow.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    An AI-powered companion that provides access to the RideWithGPS API, allowing you to interact with cycling routes, trips, events, and user data through natural language.
    7
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    MCP server for planning routes (hiking, biking, driving, etc.) using the OpenRouteService API. Provides tools to find coordinates, create routes with GPX/PNG/HTML output, search POIs, and compute reachable areas.
    6
    36 PyPI
    2
    MIT