bikerouter-mcp
bikerouter-mcp
bikerouter.de로 자전거 경로를 계획하는 MCP 서버입니다. BRouter 엔진(Arndt Brenschede 제작) 위에서 동작하는 BRouter-Web 프런트엔드(Norbert Renner 제작)이며, OpenStreetMap 데이터를 기반으로 라우팅합니다.
아무 MCP 클라이언트(Claude Code, Claude Desktop 등)에 연결하고 "라인강을 따라 쾰른에서 본까지 자갈길 경로를 계획하고 GPX를 줘" 같은 요청을 하면 됩니다.
할 수 있는 일
도구 | 용도 |
| 2개 이상의 경유지(좌표 또는 장소 이름)를 경유하는 경로를 만들고 거리, 상승/하강 고도, 예상 주행 시간, 노면 및 도로 종류 분석, 회전 안내, 공유 가능한 bikerouter.de 링크, 선택적으로 저장된 GPX/GeoJSON/KML/CSV 파일을 반환합니다. |
| 동일한 경유지를 여러 프로파일(예: |
| 장소 이름, 주소 또는 관심 지점(POI)을 좌표로 변환합니다(Photon, bikerouter.de가 사용하는 지오코더 사용). |
| 알려진 라우팅 프로파일을 나열하고, 선택적으로 라우팅 호스트가 실제로 제공하는 프로파일을 확인합니다. |
| 프로필의 |
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=trekkingRelated MCP server: komoot-mcp
설치
cd bikerouter-mcp
npm install # also builds via the prepare script
npm testClaude 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 키는 필요 없습니다. 서비스는 무료이며 인증이 필요 없습니다.
구성
모두 선택 사항이며 환경 변수로 설정합니다:
변수 | 기본값 | 의미 |
|
| BRouter |
|
| 공유 가능한 지도 링크에 사용되는 웹 UI입니다. |
|
|
|
|
| Photon 호환 지오코더입니다. |
|
| 호출자가 프로필을 지정하지 않을 때 사용되는 프로필입니다. |
|
| HTTP 제한 시간입니다. 긴 경로는 시간이 오래 걸릴 수 있습니다. |
|
| 모든 요청에 전송됩니다. |
BRouter API에 매핑되는 방식
요청은 BRouter의 ServerHandler.java에 문서화된 대로 일반 GET /brouter 호출입니다:
/brouter?lonlats=lon,lat|lon,lat&nogos=lon,lat,radius,weight|…&profile=trekking
&alternativeidx=0&format=geojson&timode=1&straight=0&profile:avoid_unsafe=truewaypoints→lonlats(장소 이름은 먼저 지오코딩되며 이전 경유지 쪽으로 치우칩니다)avoid_areas→nogos(하드 노고(no-go)로 설정하려면weight를 생략)straight_from→straight(직선 구간)profile_options→profile:NAME=VALUEalternative_index→alternativeidx(대체 경로의 경우 1–3)turn_instructions→timode(GeoJSON 응답의 음성 안내)
GeoJSON 응답은 로컬에서 요약됩니다. 트랙 길이, filtered ascend, total-time, total-energy는 트랙 속성에서 가져오고, 하강 고도는 필터링된 상승 고도와 순 높이 변화에서 파생되며, 노면/도로 종류/매끄러움 분석은 messages 테이블(WayTags를 Distance로 가중치)에서 집계됩니다.
알아두면 좋은 제한 사항
라우팅 품질은 OpenStreetMap 품질을 따릅니다. 노면 또는 접근 태그가 누락되면 이상한 우회로가 생성될 수 있으므로, 주행 전에 반환된 지도 링크에서 항상 경로를 확인하세요.
BRouter에는 도로명이 없으므로 회전 안내에 도로 이름 없이 "1.2km 앞에서 우회전"이라고만 표시됩니다. 이는 이 서버가 아닌 엔진의 속성입니다.
예상 주행 시간은 프로필의 물리 모델(라이더 질량, 출력, 항력)에서 비롯됩니다. 현실적인 수치를 얻으려면
profile_options로totalMass,bikerPower,maxSpeed를 재정의하세요.고도는 SRTM 적용 범위가 필요합니다. 대략 북위/남위 60° 이상에서는 고도 없이 트랙이 반환되며 요약에 그렇게 표시됩니다.
공용 서비스는 무료 커뮤니티 운영 인스턴스이므로 요청량을 적정하게 유지하거나 자체 BRouter 서버를 실행하고
BIKEROUTER_HOST를 설정하세요.프로필은 서버마다 다릅니다.
list_profiles는 기본 BRouter/BRouter-Web 프로필 카탈로그를 제공하며, 특정 호스트가 실제로 제공하는 프로필을 확인하려면verify: true를 전달하세요.
테스트
npm test는 서버를 빌드하고 node --test를 실행합니다:
URL 구성, 경유지 검증,
.brf매개변수 구문 분석 및 GeoJSON 요약기에 대한 단위 테스트
스텁 BRouter 호스트에 대해 실제 서버 바이너리와 MCP over stdio로 통신하는 엔드투엔드 테스트로, 라우팅, GPX 내보내기, 프로필 나열 및 BRouter의 일반 텍스트 오류 응답을 다룹니다.
테스트는 공용 서비스를 전혀 건드리지 않으므로 오프라인에서 실행됩니다.
크레딧 및 라이선스
서버 코드: MIT. 이 서버는 클라이언트일 뿐이며 라우팅은 BRouter(MIT)를 통해 BRouter-Web / bikerouter.de에서 수행되며, 지도 데이터는 © OpenStreetMap 기여자(ODbL)입니다.
Available Tools
5 toolscompare_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.
| Name | Required | Description | Default |
|---|---|---|---|
| profiles | Yes | Profiles to compare, e.g. ["trekking", "gravel", "fastbike"] | |
| waypoints | Yes | Start, optional via points, and destination | |
| avoid_areas | No | ||
| profile_options | No | Profile 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
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of candidates (default 5) | |
| query | Yes | Place to search for, e.g. "Kölner Dom" or "Piazza Navona, Rome" | |
| language | No | Result language, e.g. "en" or "de" | |
| near_lat | No | Bias results towards this latitude | |
| near_lon | No | Bias results towards this longitude |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | Yes | Profile name, e.g. "trekking" or "gravel" |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| verify | No | Check availability by fetching each profile from https://brouter.de (slower) | |
| category | No | Filter by category (default bike) |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| profile | No | Routing profile (default "trekking"). See list_profiles. | |
| save_to | No | File path to write the track to | |
| waypoints | Yes | Start, optional via points, and destination, in order | |
| track_name | No | Track name used inside the exported file | |
| avoid_areas | No | Circular areas the route should avoid | |
| save_format | No | Format for save_to (default gpx) | |
| straight_from | No | Waypoint indexes (0-based) whose following leg should be a straight beeline instead of routed | |
| include_geojson | No | Also return the raw GeoJSON track (large; off by default) | |
| profile_options | No | Profile 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_index | No | 0 = best route (default); 1-3 request alternative routes | |
| turn_instructions | No | Include turn-by-turn instructions (default true) | |
| max_turn_instructions | No | Cap on listed turns (default 40) |
TDQS
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.
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.
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.
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.
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.
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.
5 tool updates
v0.1.0- First observed
compare_profiles - First observed
geocode_place - First observed
get_profile_options - First observed
list_profiles - First observed
plan_route
TDQS
Scored across 5 tools
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.
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.
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.
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
Related MCP Connectors
Analyse cycling-event GPX routes and build bounded, practical ride-fuelling carry plans.
Plan trips on a map: routed transport, day-by-day itineraries, and a plan you can share.
Multi-stop route optimization, navigation links, and email delivery. Powered by MyRouteOnline.
Splits deliveries across vehicles and orders each route: time windows, capacities, road times. Free.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceAn 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.7MIT
- FlicenseBqualityDmaintenanceEnables users to interact with Komoot for managing tours, planning routes, exporting GPX/FIT, and accessing highlights and user profile.181-
- AlicenseAqualityDmaintenanceMCP 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.636 PyPI2MIT
- AlicenseAqualityDmaintenanceEnables querying self-hosted OpenTripPlanner for accurate transit routes via MCP, supporting both stdio and HTTP.3284 npmMIT