
Bike Router
io.github.JonasHeinickeBioPublished by GitHub account JonasHeinickeBiov0.3.0Updated Oct 29, 2026
Plan bike routes with a self-hosted OSM service: facts only, with weather and sights.
The publisher's own server: 370.ai — AI Gateway: 100+ Chat Models, Image & Speech Generation
Overview
MCP bridge to a self-hosted pyBikeRouter API that plans OSM-based bike routes with weather, sights and GeoJSON/GPX exports.
- What you can do
- Plan cycling routes from place names or coordinates, with bike type and constraints
- Get scored route alternatives with distance, elevation and warnings, plus a facts-only explanation
- Export routes as GeoJSON or GPX and look up sights near a route
- Add a weather forecast along the route at a departure time
- Ask for clarification when a place name is ambiguous instead of guessing
- When to use it
- Useful when you already run the pyBikeRouter service and want an assistant to plan, compare and explain cycling routes, including weather and sightseeing stops, from a chat or agent workflow.
- Requirements
- A local process started with uvx from the bike-router PyPI package, plus a running pyBikeRouter API whose address is set in BIKE_ROUTER_API_URL. The API itself typically needs an openrouteservice API key (ORS_API_KEY) and network access for geocoding.
Installation
In SourceWeft
- Open Bike Router in the dashboard and add it to a workspace.
- Enable the server for the chats that should use its tools.
Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.
Other MCP clients
Follow the launch instructions in the repository.
README
bike-routing-agent
An OSM-based bike-routing service: a typed, provider-neutral domain model, a full openrouteservice API client plus routing adapter, and a LangGraph workflow that turns a validated route request into an explainable, exportable cycling route.
The LLM (where used) may parse free text, ask clarification questions, and explain a chosen route. It never invents coordinates, geometry, elevation, or route suitability -- all of that comes from OSM-derived routing engines.
Easy install (no programming needed)
Download pybikerouter-easy-<version>.zip from the
Releases page, unzip it, install
Docker Desktop, and double-click the Start
file for your computer. The first start asks one question -- where you ride -- downloads that
area's map data, and opens the planner in your browser. Step by step, in plain words:
docs/easy-install.md (and START-HERE.txt in the download).
Documentation
The full documentation suite lives in docs/:
Architecture
Graph branches:
Every path ends with an explicit status; the graph never calls a routing
provider unless validation and geocoding both succeeded, and it never
returns without a terminal status.
Setup
Requires Python 3.11+ and Poetry.
poetry install creates an in-project virtualenv (.venv/, see
poetry.toml) with both runtime and dev dependencies. Run any command
inside it with poetry run <command>, or poetry shell to activate it
directly.
Edit .env and set ORS_API_KEY to a valid
openrouteservice API key.
Environment variables
Running the API
The app also serves a built-in web UI (map-based route planner) at
http://localhost:8000/, with the interactive API docs at /docs.
Command-line interface
Installing the package exposes a bike-router command (also runnable as
python -m bike_routing_agent.cli) organised into subcommand groups:
Everything the API and the web form do is available from the CLI -- see docs/cli.md.
route plan --text "50 km gravel loop from Braunschweig" uses the optional LLM parser (docs/llm-parser.md).
route plan accepts lat,lon pairs or place text for --origin,
--destination and repeated --via waypoints, prints the JSON result and
exits 0 on ready, 1 on clarification/provider failure, 2 on usage
errors. With DATABASE_URL set it also records the plan in the route history
(best effort; plan_id in the output, --no-record to skip), a forecast along
the route at --departure-time (docs/weather.md), and
bike-router db migrate / db status manage the schema
(docs/persistence.md).
Running with Docker
All container assets live in docker/:
Open http://localhost:8000/ for the web UI. Route artifacts are stored in
the named pybikerouter-exports volume. See
docs/self-hosted.md for the optional local routing /
geocoding stack -- including what it needs and how to run just one half on a
small machine.
Example request
Example response
If origin/destination are ambiguous or unresolved, status is
awaiting_clarification and clarification lists the candidate places to
choose from -- no route is generated from a guess.
Bike types
constraints.bike_type selects the routing profile per engine and defaults to
gravel. Supported values: road, gravel, touring, mountain, city,
ebike, commuter (fast, low-traffic), recumbent. ORS ships four cycling
profiles, so e.g. ebike uses cycling-electric while commuter rides on
cycling-regular; the self-hosted BRouter provider differentiates further --
gravel, touring, mountain, city, commuter and recumbent each get
their own profile, while road and ebike share fastbike (BRouter has no
e-assist cost model) (see docs/configuration.md).
Make targets
make lists the everyday commands; they use the project's .venv (or the active environment):
Linting and type checking
Both run in CI on every push and pull request (see
.github/workflows/ci.yml).
Running tests
Coverage is collected on every run and the suite fails below 80%
(--cov-fail-under=80 in tool.pytest.ini_options.addopts; currently 97%
total, every module ≥84%).
Live tests that hit real external services are marked @pytest.mark.live
and excluded by default (see tool.pytest.ini_options.addopts in
pyproject.toml). Run them explicitly with:
Pre-commit hooks
Quality gates run automatically before each commit/push via
pre-commit. Install both git hook stages once after
poetry install:
On commit it runs whitespace/EOF/YAML/TOML/merge-conflict/large-file checks,
ruff check --fix and mypy src; the full pytest suite runs only in the
pre-push stage on git push (mirroring CI). Run the commit stage manually
with poetry run pre-commit run --all-files and the pre-push stage with
poetry run pre-commit run --hook-stage pre-push --all-files.
Known limitations
- OSM tag completeness varies by region; surface/access metadata is frequently missing and is represented as uncertainty, not treated as favorable.
- Routing engines (ORS, Valhalla, BRouter) map bike categories to their own
profiles differently; the mapping in
config.pyis an approximation, especially for gravel riding. - Elevation data (ascent/descent) varies in accuracy between providers and is not always available.
- No route produced by this service is a safety guarantee. Explanations use hedged language ("better aligned with available map metadata") rather than claims like "safe route".
- BRouter and Valhalla are wired up end to end but only against
self-hosted deployments (
ROUTING_PROVIDER=brouter/valhalla/all, BRouter via the compose profile in docker/brouter/README.md), and openrouteservice remains the default engine. - The Pelias geocoder option needs a Pelias API served at
<ORS_BASE_URL>/pelias/v1: neither the publicapi.openrouteservice.orgnor a stock self-hosted ORS provides one, and the adapter has only been tested against mocks (see docs/geocoding.md). For a local geocoder use the self-hosted Nominatim.
Repository layout
Licence
MIT, see LICENSE.
Third-party licences
BRouter (MIT) and the OpenStreetMap data (ODbL) this project builds on are credited, with the full BRouter licence text, in THIRD_PARTY_LICENSES.md.
Source: README.md at commit bc2d1da
Tools
0Version history
1- v0.3.0LatestOct 29, 2026
Score
50% of the applicable checks met
How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.
- Reached in the last 30 days25 pts
Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.
- Auth declared10 pts
Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.
- Tools listed15 pts
Answer tools/list without a credential, or ship a package that starts in a sandbox without one.
- DescriptionRequired15 pts
- Logo10 pts
- Documentation15 pts
- License10 pts
Other Router integrations
370.ai — AI Gateway: 100+ Chat Models, Image & Speech Generation
ai.routerOfficial publisher
Remote AI gateway MCP server that lets an assistant call 100+ chat models, generate images, and convert text to speech through one 370.ai API key.

AI Media Router
Published by GitHub account jutsuhq
Local MCP server that generates images and videos through 40+ providers using your own API keys, with price comparison and a searchable local asset library.

Uniswap Universal Router Decoder
Published by GitHub account Elnaril
Local MCP server that decodes and encodes Uniswap Universal Router calldata for V2, V3 and V4 swaps, read-only and never signing or sending.

x402 Router
Published by GitHub account camerxnduff
Read-only MCP server that searches a probed registry of live x402 pay-per-call endpoints and routes an agent to the best-scored one.

GenPark Consistent Hash Ring Router
Published by GitHub account alphaparkinc
A local MCP server providing a consistent hashing ring with virtual nodes, for routing distributed LLM caches and partitioning agents.