bosch-flow-mcp
This server allows you to retrieve, track, and analyze data from your Bosch eBike Flow account, including battery health, ride activities, component details, and service history.
Retrieve Bike Information: List all registered e-bikes, get detailed profiles for individual bikes, and list components with their part numbers and firmware versions.
Monitor Battery Health: Access battery state snapshots, analyze charge cycle and energy trends, get live state-of-charge from the ConnectModule, and retrieve battery capacity tester results (with an EU Data Act client).
Track Ride Activities: List e-bike rides with detailed summary metrics (distance, elevation, speed, power, calories, CO2, assist-mode splits, ABS events) and get per-point GPS/speed/elevation/power tracks for individual rides.
Manage Service and Software History: Access digital service book history and software update installation history (requires an EU Data Act client for full details).
Synchronize Data: Sync bikes, batteries, components, service records, software updates, and capacity data from Bosch APIs to a local cache.
Provides tools for interacting with Bosch eBike Flow (Smart System) data, including battery health, charge cycles, component firmware, service history, live state-of-charge, and per-ride activity data such as distance, elevation, power, assist-mode, and CO2 savings.
bosch-flow-mcp
MCP server for Bosch eBike Flow (Smart System / BES3). Tracks battery health, charge cycles, component versions, service history, live state-of-charge, and per-ride activity data (distance, elevation, power, assist-mode, CO2).
Disclaimer
This is an unofficial, community-built project. It is not affiliated with, authorised by, or endorsed by Robert Bosch GmbH, Bosch eBike Systems, or SingleKey ID. "Bosch", "eBike Flow", and related marks belong to their owners and are used here only to describe interoperability.
It signs in with your own Bosch eBike Flow account (via the standard SingleKey ID login) and reads only your own data. It is read-only - it never modifies your bike, battery, or account.
It uses the same public OAuth client (
one-bike-app, PKCE) that the official Bosch eBike Flow app uses. No credentials, secrets, or protection measures are extracted, bypassed, or circumvented - every identifier here is already publicly documented.When you supply your own EU Data Act API credentials, the official Data Act API is used. Otherwise the same app API your phone already uses is queried with your own login.
This is an undocumented, unofficial interface that may change or stop working at any time if Bosch alters their systems.
You are responsible for ensuring your use complies with Bosch's and SingleKey ID's terms of service in your jurisdiction.
Provided with no warranty under GPLv3+ (see LICENSE). Use at your own risk.
Related MCP server: Mi Fitness MCP
Features
Battery state snapshots over time (charge cycles, energy delivered, degradation trends)
Components and firmware versions (drive unit, battery, ConnectModule, head unit, remote, ABS)
Service book history and software update log (EU Data Act client only)
Live state-of-charge from ConnectModule via mobile API
Battery capacity tester results (EU Data Act client only)
Per-ride activities: distance, elevation, speed, cadence, measured rider power, calories, rider-vs-motor energy share, assist-mode split, CO2, ABS events, plus a per-point GPS/speed/elevation/power track
Auto-sync on demand - tools fetch fresh data without a cron job
Requirements
Python 3.13+ (tested on 3.13 and 3.14, on Linux, macOS and Windows, in CI)
uv (recommended) or pip
A Bosch eBike Flow account (free, register at the Bosch eBike Flow app)
A BES3 Smart System eBike registered in the app
Install
pip install bosch-flow-mcpOr run it without installing with uvx bosch-flow-mcp. For development from a clone:
git clone https://github.com/partymola/bosch-flow-mcp
cd bosch-flow-mcp
uv venv --python 3.13 .venv
uv pip install -e .Auth
.venv/bin/bosch-flow-mcp authOpens your browser to Bosch login. The auth flow uses the one-bike-app public client
with PKCE - no API keys or registration needed. Just your Bosch Flow account.
Important: Open browser DevTools (F12) and switch to the Network tab before logging in.
After login, the browser redirects to an iOS URI (onebikeapp-ios://) that desktop browsers
can't open. Copy the full redirect URL from DevTools (right-click > Copy URL on the
oauth2redirect entry) and paste it at the prompt.
Tokens are saved to config/bosch_tokens.json and auto-refresh via offline_access.
EU Data Act users: if you have registered your own euda client and placed its ID in
config/bosch_config.json, auth uses that instead - it opens the browser and completes
automatically through a local http://localhost:4200 callback, with no DevTools step.
Sync
.venv/bin/bosch-flow-mcp sync # all data types
.venv/bin/bosch-flow-mcp sync --types bikes,batteriesData types: bikes, batteries, components, service, software_updates, capacity.
Fetches your data and stores it locally. The source depends on your sign-in:
A standard Bosch eBike Flow account (the default) reads bikes, batteries, components, current firmware, and live state-of-charge from the mobile app API - works for any account, including non-EU.
Service-book history, software-update history, and capacity-tester results come only from the EU Data Act API, which requires registering your own
eudaclient at the Bosch Data Act portal. With a standard sign-in those types reportunavailable(with a note) rather than a silent empty result, and the Data Act API returns nothing for accounts registered outside the EU.
You can also use the bosch_sync MCP tool, or rely on automatic sync (each get_* tool
triggers a sync if data is stale).
Run bosch-flow-mcp --version to print the installed package version.
Register with Claude Code
claude mcp add -s user bosch-flow -- /full/path/to/bosch-flow-mcp/.venv/bin/bosch-flow-mcpThen ask Claude questions like:
"What's my bike's battery health this year?"
"Show me charge cycle trends by month"
"What firmware version is my drive unit on?"
"Have there been any service records for my bike?"
"How far and how hard were my rides this week?"
Available tools
Tool | Description |
| Sync one or more data types (default: all) |
| List registered bikes |
| Single bike with full details |
| Battery snapshots - latest or historical range |
| Live state-of-charge from ConnectModule |
| Battery capacity tester results (EU Data Act client only) |
| Components with part numbers and firmware versions |
| Service book entries (EU Data Act client only) |
| Software update history (EU Data Act client only) |
| Charge cycle and energy trends by period |
| Per-ride summaries (distance, elevation, power, mode, CO2) over a date range |
| Per-point track for one ride (GPS/speed/elevation/cadence/power) |
API credits
This server uses the Bosch Mobile API (obc-rider-profile.prod.connected-biking.cloud)
as the primary data source, the rider-activity API
(obc-rider-activity.prod.connected-biking.cloud) for per-ride data, and optional
Data Act API (api.bosch-ebike.com) support for additional endpoints.
Authentication uses the one-bike-app public client (the same OAuth client as the Bosch
eBike Flow mobile app). The auth approach was documented by the
marq24/ha-bosch-ebike-flow Home Assistant
integration and the open-ebike/open-ebike-backend
project.
Configuration
Variable | Default | Description |
|
| SQLite database path |
|
| Directory for tokens and client config |
Data safety
OAuth tokens are created at
0600on POSIX - Windows ignores the mode and governs access by inherited ACLs; the token files andbosch_flow.dbare gitignored.A pre-commit hook (
scripts/check-no-data.sh) blocks committing databases, token files, and secrets. Install it after cloning:ln -sf ../../scripts/check-no-data.sh .git/hooks/pre-commitTests use temporary SQLite databases and fictional identifiers - no real bike or account data ever enters the repo.
Contributing
See CONTRIBUTING.md for development setup, the test workflow, and the pre-commit hook. Changes are tracked in CHANGELOG.md.
License
GPLv3+. See LICENSE.
Available Tools
12 toolsbosch_battery_trendsA
Analyse battery health trends for your Bosch eBike over time.
Computes per-period averages and deltas for:
Charge cycle count (total, rate of accumulation)
Average battery level at time of sync
Lifetime energy delivered (total kWh ever pushed through the battery)
Remaining energy trend (indicates capacity degradation over time)
A declining remaining_energy_wh at a constant charge level indicates the battery capacity is degrading. Compare early and recent snapshots for a long-term health picture.
Args: bike_id: Optional bike UUID. If omitted, includes all bikes. period: Aggregation period. Options: "weekly", "monthly" (default), "quarterly". start_date: Start date (YYYY-MM-DD, YYYY-MM, Nd, or None for all data). end_date: End date. Default: today.
| Name | Required | Description | Default |
|---|---|---|---|
| period | No | monthly | |
| bike_id | No | ||
| end_date | No | ||
| start_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even without annotations, the description discloses meaningful behavior: it computes per-period averages and deltas, and it explains how to interpret a declining remaining_energy_wh as capacity degradation. It does not discuss auth, rate limits, or side effects, but the analytic and presumably read-only nature of the tool is communicated effectively.
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 well-structured, starting with purpose, then behavioral interpretation, then parameter details. It is longer than the minimum, but every section adds value, especially given the lack of annotations and schema descriptions.
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?
The description covers the tool's purpose, interpretation guidance, and all parameter semantics, and an output schema exists to define the return shape. Minor ambiguities like the meaning of 'Nd' in start_date remain, but an agent has enough context to invoke the tool 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?
With schema description coverage at 0%, the description fully compensates by explaining every parameter: bike_id's null behavior, period's valid options, start_date's accepted formats, and end_date's default of today. It even notes that None means all data, which is not available from the schema alone.
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 ('Analyse') and clearly identifies the resource: battery health trends over time, broken out into concrete metrics like charge cycle count and capacity degradation. This also distinguishes it from snapshot tools like bosch_get_capacity or bosch_get_soc, which likely return current values rather than per-period aggregates.
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 clearly frames when this tool is appropriate: for long-term health analysis and comparing early vs recent snapshots to detect capacity degradation. It does not explicitly name sibling tools to avoid or state when not to use it, but the trend-focused wording provides enough contextual guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bosch_get_activitiesA
List e-bike rides with per-ride summary metrics.
Live read from the Bosch rider-activity API (no cache). Each ride includes distance, elevation gain/loss, avg/max speed, cadence, measured rider power, calories, rider-vs-motor energy share, assist-mode distance split (metres per mode), CO2 (emissions / car-equivalent / saved), and ABS/brake events. Heart rate is not recorded by the bike (it has no HR sensor) - pair with a wrist device for HR.
Args: start_date: Window start (YYYY-MM-DD, YYYY-MM, or "30d"). Default 30 days ago. end_date: Window end. Default today. bike_id: Optional bike UUID filter. limit: Optional cap on rides returned (most recent first).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| bike_id | No | ||
| end_date | No | ||
| start_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full transparency burden. It discloses live read/no-cache behavior, lists all included metrics, and explicitly notes that heart rate is not recorded (with guidance to pair a wrist device). This goes beyond a minimal read-only description, though it omits potential rate limits or auth requirements.
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 well-structured: purpose first, then behavioral context, metric list, a limitation note, and an Args section. The metric list is somewhat long but informative. No filler words; each sentence adds value.
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?
An output schema exists, so return structure is covered elsewhere. The description addresses parameters, live data behavior, metric scope, and a key limitation (no HR sensor). It could mention pagination behavior beyond the limit parameter, but overall it is sufficiently complete for a read-only list tool.
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 0%, but the Args section fully compensates. It explains each parameter's format (e.g., YYYY-MM-DD, YYYY-MM, or '30d'), default behavior, and filtering semantics. This is essential meaning completely absent from the input 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 opens with a specific verb+resource: 'List e-bike rides with per-ride summary metrics.' This clearly distinguishes from sibling tools like bosch_get_activity_detail by focusing on listing multiple rides with summary metrics rather than detailed individual-ride information.
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 usage for listing e-bike rides and gives parameter context, but it never explicitly states when to use this tool versus alternatives. It mentions 'Live read... (no cache)' and HR limitations, but does not name alternative tools or provide when-not-to-use conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bosch_get_activity_detailA
Get the per-point track for one ride (GPS + speed/elevation/cadence/power).
Live read. Returns a downsampled track (~500 points per ride): per-point cumulative distance (m), speed (km/h), elevation (m), cadence, rider power (W), and GPS lat/lon. Get the activity_id from bosch_get_activities.
Args: activity_id: The ride UUID from bosch_get_activities.
| Name | Required | Description | Default |
|---|---|---|---|
| activity_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the transparency burden. It discloses 'Live read' (read-only behavior), downsampling (~500 points per ride), and the return fields. This goes beyond schema/annotations.
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 concise and well-structured: opening purpose sentence, return details, dependency instruction, and parameter definition. No redundant 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 simple read tool with one parameter and an output schema, the description covers purpose, return values, and parameter provenance. It doesn't address error handling or rate limits, but the tool's simplicity and output schema mitigate that.
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 only defines activity_id as a string with 0% description coverage. The description's Args section explains it as 'The ride UUID from bosch_get_activities', providing critical context for where to obtain the value.
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 'Get the per-point track for one ride' with specific data types (GPS, speed, elevation, cadence, power). It also references bosch_get_activities for the activity_id, distinguishing it from the list tool.
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 usage for retrieving detailed track data for a specific ride, and explicitly instructs to get the activity_id from bosch_get_activities. It doesn't explicitly name alternatives or state when not to use, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bosch_get_batteriesA
Get battery state and health for your Bosch eBike.
Returns charge level, remaining energy, total capacity, charge cycles (total / on-bike / off-bike), lifetime energy delivered, and software version.
Each sync captures a snapshot, building a time series of battery health. Use latest_only=False with a date range to see history.
Args: bike_id: Optional bike UUID to filter to one bike. start_date: Start date (YYYY-MM-DD, YYYY-MM, or Nd like "30d"). Default: 30 days ago. end_date: End date. Default: today. latest_only: If True (default), return only the most recent snapshot per bike. Set to False to return all snapshots in the date range.
| Name | Required | Description | Default |
|---|---|---|---|
| bike_id | No | ||
| end_date | No | ||
| start_date | No | ||
| latest_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It explains that each sync captures a snapshot and how latest_only affects results, which adds context. However, it does not explicitly state that this is a read-only operation or disclose any side effects, authorization requirements, or rate limits, leaving some ambiguity for an agent.
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 well-structured and appropriately sized. It opens with a clear one-liner, lists return fields, explains the snapshot/history behavior, and then details parameters. Every sentence adds value, and the use of bullet-like formatting improves readability.
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 the absence of annotations and the presence of an output schema, the description is largely complete. It explains the tool's purpose, parameters, and the snapshot/time-series model. The only notable gap is the lack of comparison with overlapping sibling tools, which is more relevant to usage guidelines but also affects overall completeness in a broader toolset.
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 has no descriptions for parameters (0% coverage), but the tool description includes an Args section that thoroughly explains each of the 4 parameters: bike_id, start_date, end_date, and latest_only. It provides formats, defaults, and behavioral meaning (e.g., '30d' shorthand, 'return most recent snapshot'), fully compensating for the schema's lack of detail.
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 the tool gets battery state and health for a Bosch eBike, listing the specific data fields returned. This is a specific verb+resource, but it does not explicitly differentiate from sibling tools like bosch_get_soc and bosch_get_capacity, which serve overlapping 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 offers usage guidance for parameters (e.g., 'Use latest_only=False with a date range to see history') but does not explain when to choose this tool over alternatives like bosch_battery_trends or bosch_get_soc. The context implies this is the comprehensive battery snapshot tool, but no explicit exclusions or alternatives are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bosch_get_bikeA
Get detailed profile for a single Bosch eBike.
Returns full bike details including brand, model, frame number, and the cached raw API response which may include component info.
Args: bike_id: The bike UUID from bosch_get_bikes.
| Name | Required | Description | Default |
|---|---|---|---|
| bike_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that it returns a cached raw API response and that component info may be included, providing some behavioral insight. It does not mention potential side effects, permissions, or rate limits, which would be expected for a read operation.
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 concise and front-loaded, with the primary purpose stated first. The Args section is clearly separated, and every sentence adds value without verbosity.
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?
The description explains return values sufficiently for a single-bike retrieval tool, mentioning full details and cached raw API response. Given that an output schema exists, it does not need to enumerate all fields. The sibling context and lack of complex parameters make the description adequately complete.
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 only shows a string bike_id, but the description adds crucial context by explaining it is a bike UUID from bosch_get_bikes. This goes beyond the schema and helps the agent select the correct value. However, it could provide more detail on formatting or how to obtain the UUID.
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 the tool retrieves a detailed profile for a single Bosch eBike, using a specific verb and resource. It distinguishes itself from sibling tool bosch_get_bikes by explicitly targeting a single bike.
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 usage context by specifying the bike_id should come from bosch_get_bikes, indicating this tool is for retrieving details after listing. However, it does not explicitly mention when not to use it or name alternative tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bosch_get_bikesA
List all Bosch eBikes registered to your Flow account.
Returns bike names, brand, and frame numbers. Uses local cache (auto-syncs if stale). Run bosch_sync first if the list is empty.
Returns a list of bikes with id, name, brand_name, and frame_number.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description discloses useful behavioral traits: it uses a local cache with auto-sync, and advises running bosch_sync if the list is empty. This goes beyond the empty schema and adds meaningful context about data freshness.
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 concise and front-loaded with the purpose in the first line. It provides only essential extra guidance (cache and sync) without fluff, and every sentence serves a purpose.
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 zero-parameter list tool with an output schema, the description covers the main purpose, return contents, and cache behavior. It also includes a helpful tip about syncing, making it complete for the tool's simplicity.
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 tool has zero parameters, so schema coverage is effectively 100%. The description doesn't need to add parameter details, and the baseline for 0 parameters is 4.
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 starts with 'List all Bosch eBikes registered to your Flow account', which is a specific verb (List) and resource (all Bosch eBikes) with a clear scope. This clearly distinguishes it from the singular bosch_get_bike sibling.
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 a concrete prerequisite by saying 'Run bosch_sync first if the list is empty', which tells the user when to perform a sync before calling. It doesn't explicitly exclude alternatives, but the 'all' vs singular naming makes the usage context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bosch_get_capacityA
Get battery capacity tester diagnostic results.
Shows battery health data from Bosch's official capacity tester tool, typically done at dealer service appointments. Includes remaining capacity percentage vs. original specification.
Capacity-tester data comes only from the EU Data Act API; with a standard Bosch eBike Flow sign-in this is empty and the result explains why.
Args: part_number: Optional battery part number to filter results. serial_number: Optional battery serial number to filter results.
| Name | Required | Description | Default |
|---|---|---|---|
| part_number | No | ||
| serial_number | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that data comes from the EU Data Act API and that standard Flow sign-in yields empty results, which is valuable. However, it does not detail potential errors, rate limits, or required authorizations beyond the implied API restriction.
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 well-structured with a main purpose statement, a second paragraph on data source, and a parameter docstring. It is front-loaded and efficient, though the second paragraph could be slightly more concise.
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?
An output schema exists, so the description does not need to detail return values. It covers the data source constraint and empty result scenario. For a read tool with two optional parameters, this is sufficient, but it could mention when to expect non-empty results.
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 has 0% description coverage, so the description must compensate. It clearly explains both optional parameters: part_number and serial_number as filters. This adds meaning beyond the schema's type and default definitions.
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 it retrieves battery capacity tester diagnostic results, explains what data it includes (remaining capacity percentage), and distinguishes it from sibling tools like bosch_get_batteries and bosch_get_soc. The verb 'get' and resource 'capacity tester diagnostic results' are specific.
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?
There is no explicit guidance on when to use this tool versus alternatives (e.g., bosch_get_soc for state of charge). It mentions data source constraints (EU Data Act API) and empty results with standard sign-in, but does not direct the agent to other tools for common use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bosch_get_componentsA
List registered components for your Bosch eBike with software versions.
Shows the bike's components - drive unit, battery, ConnectModule, head unit, remote control, ABS - with part numbers, serial numbers, and firmware versions. The source depends on your sign-in: a standard Bosch eBike Flow account reads them from the bike profile (mobile app API); an EU Data Act (euda) client reads them from the Data Act registrations endpoint.
Useful for tracking firmware versions and identifying components for warranty or service purposes.
Args: bike_id: Optional bike UUID to filter to one bike. component_type: Optional component type filter, e.g. "driveUnit", "battery", "headUnit", "connectedModule", "remoteControl". Matched against the types your bikes registered, ignoring case, so every stored spelling of a type answers together. A value none of them match is refused, naming the types that are held.
| Name | Required | Description | Default |
|---|---|---|---|
| bike_id | No | ||
| component_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses that the data source depends on sign-in type, explains how component_type matching works (case-insensitive, grouped by stored spelling), and states that invalid values are refused while naming held types. This is unusually transparent.
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 front-loaded with the core purpose, then expands with necessary detail about source, use cases, and parameters. Although longer than minimal, every sentence adds value, and the structured Args section prevents ambiguity.
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 the 0% schema coverage and absence of annotations, the description is remarkably complete. It covers what is returned, which components are included, how source varies by authentication, filtering behavior, and error handling. An output schema exists, so return value details need not be in the description.
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 provides 0% description coverage, but the 'Args:' section fully compensates. bike_id is explained as an optional UUID filter, and component_type gets examples, matching semantics, and failure behavior. Both parameters are meaningfully documented beyond their raw schemas.
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 opens with a specific verb and resource: 'List registered components for your Bosch eBike with software versions.' It then enumerates the component types and data fields, making the tool's scope clear and distinct from sibling tools like bosch_get_batteries or bosch_get_bike.
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 usage context: 'Useful for tracking firmware versions and identifying components for warranty or service purposes.' It does not explicitly name sibling alternatives or state when not to use this tool, but the use case guidance is enough to orient an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bosch_get_service_recordsA
Get the digital service book history for your Bosch eBike.
Returns all service records logged by Bosch dealers and service centres, including dates and descriptions of work performed.
Service records come only from the EU Data Act API; with a standard Bosch eBike Flow sign-in this is empty and the result explains why (register a euda client).
Args: bike_id: Optional bike UUID to filter to one bike. start_date: Start date (YYYY-MM-DD, YYYY-MM, or Nd). Default: all records. end_date: End date. Default: today.
| Name | Required | Description | Default |
|---|---|---|---|
| bike_id | No | ||
| end_date | No | ||
| start_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full transparency burden. It discloses the data source, the condition under which results are empty (standard Flow sign-in), and that the result explains why. This adds meaningful behavioral context beyond a simple 'get' and alerts users to potential empty responses, which is valuable.
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 well-structured with a clear opening sentence, a contextual caveat, and a concise Args list. It is not overly long and front-loads the purpose. The caveat about EU Data Act and registration is necessary context, so every sentence earns its place, though it could be tightened slightly.
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 the tool's simplicity (read-only, three optional parameters) and the presence of an output schema, the description covers the essential aspects: what is returned, the data source caveat, and parameter semantics. It lacks explicit mention of return format or error handling, but the output schema likely covers this, so the description is complete enough.
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 has 0% description coverage, but the description's 'Args' section fully compensates by explaining each parameter's purpose, format (including the 'Nd' starting date format), and defaults. This adds significant meaning beyond the schema's bare type/name/default fields.
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 the tool's purpose: 'Get the digital service book history for your Bosch eBike.' It specifies the resource (service records), the verb (get), and differentiates from sibling tools that handle activities, batteries, or bikes. Including 'dates and descriptions of work performed' clarifies the exact data returned.
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 context about when the tool is useful (service history from dealers) and an important caveat (EU Data Act API requirement, empty with standard sign-in). However, it does not explicitly differentiate from alternatives or state when to use this tool over siblings like bosch_get_activities or bosch_get_bikes. The guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bosch_get_socA
Get live state-of-charge from the Bosch ConnectModule.
Returns real-time battery percentage, charging status, remaining energy, and reachable range per assist mode (eco/tour/sport/turbo).
Requires a ConnectModule on the bike. Data is only available when the bike is powered on, charging, or recently active.
Note: This calls the Bosch mobile API live - no caching.
Args: bike_id: The bike UUID from bosch_get_bikes.
| Name | Required | Description | Default |
|---|---|---|---|
| bike_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that the tool calls the Bosch mobile API live with no caching, which is useful. But it omits error behavior, what happens when the bike is inactive, and doesn't explicitly state that the operation is read-only.
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 appropriately concise, front-loading the purpose and then giving return values, prerequisites, a live-API note, and parameter guidance. Every sentence adds value with no redundancy.
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 one-parameter read tool with an output schema, the description covers purpose, returned data, prerequisites, data availability, and parameter provenance. It is slightly vague on what 'recently active' means and doesn't cover error scenarios, but overall it is complete enough for an agent to use the tool effectively.
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 0%, but the description provides essential parameter meaning: 'bike_id: The bike UUID from bosch_get_bikes.' This tells the agent exactly where to obtain the parameter value, fully compensating for the bare input 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 the verb and resource: 'Get live state-of-charge from the Bosch ConnectModule.' It also specifies the output values (battery percentage, charging status, remaining energy, range per assist mode), making it distinct from sibling battery-related tools like bosch_get_batteries or bosch_get_capacity.
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 gives clear context on when the tool is usable: it requires a ConnectModule and only returns data when the bike is powered on, charging, or recently active. However, it does not explicitly mention alternatives or exclusions relative to sibling tools, so it slightly falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bosch_get_software_updatesA
Get software update installation history for your Bosch eBike.
Returns all firmware/software update reports, showing which components were updated, from which version to which version, and when.
This history comes only from the EU Data Act API; with a standard Bosch eBike Flow sign-in it is empty (current firmware is still available via components).
Args: bike_id: Optional bike UUID to filter to one bike. start_date: Start date (YYYY-MM-DD, YYYY-MM, or Nd). Default: all records. end_date: End date. Default: today.
| Name | Required | Description | Default |
|---|---|---|---|
| bike_id | No | ||
| end_date | No | ||
| start_date | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and discloses important behavioral traits: the dependency on the EU Data Act API, the empty result under standard sign-in, and the fact that current firmware is still available via components. It does not explicitly label the operation as read-only, but this is inferable from the verb and 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 front-loaded with a clear one-sentence purpose, followed by a concise explanation of returned data and the essential EU Data Act caveat. The Args section is structured and directly adds parameter details. No sentence is extraneous; the length is appropriate for the tool's complexity.
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?
The description covers purpose, limitations, and all parameter semantics, and an output schema exists to detail return values. It is slightly incomplete in not mentioning pagination or error behavior, but for a history-retrieval tool with this caveat, it is quite complete. The existing output schema mitigates the need for return format details.
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 0%, so the description must define the parameters, and it does so thoroughly in the Args block. It explains bike_id as an optional filter, specifies start_date formats (YYYY-MM-DD, YYYY-MM, Nd) and defaults for start/end dates. This fully compensates for the lack of schema descriptions.
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 the tool retrieves software update installation history for a Bosch eBike, using the specific verb 'Get' and a distinct resource. It differentiates from sibling tools by detailing the output includes component update reports with version transitions, and it mentions the EU Data Act API limitation, which further defines its scope.
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 gives concrete guidance on when to use the tool: it explains that with a standard Bosch eBike Flow sign-in the history is empty, and points users to components for current firmware. This explicitly provides an alternative (bosch_get_components) and a strong when-not condition, exceeding basic usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
bosch_syncA
Sync Bosch eBike data to the local cache.
Fetches data from Bosch and stores it in SQLite. The source depends on your sign-in: a standard Bosch eBike Flow account uses the mobile app API; an EU Data Act (euda) client uses the Data Act API. Run this to populate the cache before using other bosch_get_* tools, or to refresh after a ride or charge cycle.
Bikes are identified automatically from your Bosch Flow account. Battery snapshots build a time series for health trend analysis.
Service records, software-update history and capacity-tester data are only available with a euda (EU Data Act) client; with a standard sign-in they report status "unavailable" rather than an empty result.
Args: data_types: What to sync. Options: "all", "bikes", "batteries", "components", "service", "software_updates", "capacity". Comma-separated for multiple, e.g. "bikes,batteries". Default: "all".
Returns a per-type summary: status (ok/empty/unavailable/error), record count, and a message explaining any non-ok result.
| Name | Required | Description | Default |
|---|---|---|---|
| data_types | No | all |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully carries the burden of behavioral disclosure. It explains internal storage (SQLite), API source selection based on sign-in type, automatic bike identification, battery time series behavior, and the 'unavailable' status for non-euda accounts, providing deep insight beyond the raw function.
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?
Despite being detailed, every sentence adds value. The structure is clear: a one-sentence summary, followed by behavior, usage context, caveats, args, and return format. It is front-loaded and avoids redundancy, making it easy for an agent to parse quickly.
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?
The description covers all critical aspects for a sync tool: purpose, prerequisites, data types, return format, and account-specific limitations. It even explains edge-case behavior (status 'unavailable' vs empty). Given the simple one-parameter schema and no annotations, this is exceptionally complete.
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 input schema offers no description for data_types (0% coverage), but the description compensates comprehensively by listing all valid options, explaining comma-separated multi-selection, providing examples, and stating the default. This fully compensates for the schema gap.
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 opens with a clear, specific verb+resource statement: 'Sync Bosch eBike data to the local cache.' It further distinguishes this from sibling getter tools by positioning it as the prerequisite for bosch_get_* tools, making its role unmistakable.
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?
Explicitly instructs when to run this tool ('before using other bosch_get_* tools, or to refresh after a ride or charge cycle') and provides context about account-type-dependent data availability. This leaves no ambiguity about appropriate invocation timing.
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 tool update
- Changed
bosch_battery_trends1 field changed- added
Input schema / properties / period / enumAdded value: +[ + "weekly", + "monthly", + "quarterly" +]
11 tool updates
v0.2.3- Added
bosch_battery_trends - Added
bosch_get_activities - Added
bosch_get_activity_detail - Added
bosch_get_batteries - Added
bosch_get_bike - Added
bosch_get_bikes - Added
bosch_get_components - Added
bosch_get_service_records - Added
bosch_get_soc - Added
bosch_get_software_updates - Added
bosch_sync
11 tool updates
v0.2.2- Removed
bosch_battery_trends - Removed
bosch_get_activities - Removed
bosch_get_activity_detail - Removed
bosch_get_batteries - Removed
bosch_get_bike - Removed
bosch_get_bikes - Removed
bosch_get_components - Removed
bosch_get_service_records - Removed
bosch_get_soc - Removed
bosch_get_software_updates - Removed
bosch_sync
12 tool updates
v0.1.0- First observed
bosch_battery_trends - First observed
bosch_get_activities - First observed
bosch_get_activity_detail - First observed
bosch_get_batteries - First observed
bosch_get_bike - First observed
bosch_get_bikes - First observed
bosch_get_capacity - First observed
bosch_get_components - First observed
bosch_get_service_records - First observed
bosch_get_soc - First observed
bosch_get_software_updates - First observed
bosch_sync
TDQS
Scored across 12 tools
Several battery-focused tools (bosch_get_soc, bosch_get_batteries, bosch_battery_trends, bosch_get_capacity) overlap in terms of charge/health data, and singular/plural pairs like get_bikes/get_bike and get_activities/get_activity_detail could be mixed up. The descriptions do clarify live vs historical vs analysed vs capacity-tester data, so most confusion can be resolved by reading carefully.
Most tools follow the bosch_get_<resource> pattern, making the set highly predictable. The exceptions are bosch_sync and bosch_battery_trends, which break the get_ prefix but remain understandable; minor singular/plural inconsistencies also slightly reduce consistency.
Twelve tools is well-scoped for a Bosch eBike data server: one sync/maintenence primitive plus read endpoints for bikes, battery health, activities, components, service records, and software updates. Each tool has a distinct role and none feel redundant or filler.
The tool surface covers the relevant read-only domain thoroughly: bike inventory, live and historical battery state, capacity diagnostics, ride summaries and details, components, service records, and software update history. No critical gap is apparent for a Flow eBike data-access server, and the sync tool ties the cached data sources together.
Maintenance
Related MCP Connectors
Remote MCP server for training, nutrition, wellness, and performance data with OAuth 2.0.
MCP server for Withings health data — sleep, activity, heart, and body metrics.
Multi-tenant hosted MCP server for Oura Ring — 21 read-only tools, OAuth per user.
MCP server for Boson Protocol — on-chain agentic commerce for physical & digital goods.
Related MCP Servers
- AlicenseAqualityAmaintenanceMCP server for the Fitbit Web API with OAuth PKCE, local cache, and trend analysis.182GPL 3.0
- AlicenseCqualityCmaintenanceMCP server for Mi Fitness cloud data. Provides a local SQLite-backed server to sync and query daily activity, heart rate, and body measurements.125MIT
- AlicenseBqualityAmaintenancePrivacy-first MCP server for Strava activities, streams, routes and training data.295332MIT
- AlicenseAqualityBmaintenanceMCP server for reading and querying Garmin Connect data, including activities, strength history, recovery, trends, and optionally creating workouts.12MIT