Skip to main content
Glama

bosch-flow-mcp

CI License: GPL v3 Python 3.13+ PyPI Glama MCP Server

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-mcp

Or 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 auth

Opens 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,batteries

Data 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 euda client at the Bosch Data Act portal. With a standard sign-in those types report unavailable (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-mcp

Then 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

bosch_sync

Sync one or more data types (default: all)

bosch_get_bikes

List registered bikes

bosch_get_bike

Single bike with full details

bosch_get_batteries

Battery snapshots - latest or historical range

bosch_get_soc

Live state-of-charge from ConnectModule

bosch_get_capacity

Battery capacity tester results (EU Data Act client only)

bosch_get_components

Components with part numbers and firmware versions

bosch_get_service_records

Service book entries (EU Data Act client only)

bosch_get_software_updates

Software update history (EU Data Act client only)

bosch_battery_trends

Charge cycle and energy trends by period

bosch_get_activities

Per-ride summaries (distance, elevation, power, mode, CO2) over a date range

bosch_get_activity_detail

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

BOSCH_FLOW_MCP_DB_PATH

bosch_flow.db in the package root

SQLite database path

BOSCH_FLOW_MCP_CONFIG_DIR

config/ in the package root

Directory for tokens and client config

Data safety

  • OAuth tokens are created at 0600 on POSIX - Windows ignores the mode and governs access by inherited ACLs; the token files and bosch_flow.db are 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-commit
  • Tests 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 tools
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).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
bike_idNo
end_dateNo
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return 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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
activity_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bike_idNo
end_dateNo
start_dateNo
latest_onlyNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations provided, the description carries the 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bike_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
part_numberNo
serial_numberNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior4/5

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

With no annotations, the description carries the full burden. 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.

Conciseness4/5

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.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bike_idNo
component_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bike_idNo
end_dateNo
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

With no annotations, the description carries the full 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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bike_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
bike_idNo
end_dateNo
start_dateNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
data_typesNoall

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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. 1 tool update
    • Changedbosch_battery_trends1 field changed
      • addedInput schema / properties / period / enum
        Added value: +[
        +  "weekly",
        +  "monthly",
        +  "quarterly"
        +]
  2. 11 tool updatesv0.2.3
    • Addedbosch_battery_trends
    • Addedbosch_get_activities
    • Addedbosch_get_activity_detail
    • Addedbosch_get_batteries
    • Addedbosch_get_bike
    • Addedbosch_get_bikes
    • Addedbosch_get_components
    • Addedbosch_get_service_records
    • Addedbosch_get_soc
    • Addedbosch_get_software_updates
    • Addedbosch_sync
  3. 11 tool updatesv0.2.2
    • Removedbosch_battery_trends
    • Removedbosch_get_activities
    • Removedbosch_get_activity_detail
    • Removedbosch_get_batteries
    • Removedbosch_get_bike
    • Removedbosch_get_bikes
    • Removedbosch_get_components
    • Removedbosch_get_service_records
    • Removedbosch_get_soc
    • Removedbosch_get_software_updates
    • Removedbosch_sync
  4. 12 tool updatesv0.1.0
    • First observedbosch_battery_trends
    • First observedbosch_get_activities
    • First observedbosch_get_activity_detail
    • First observedbosch_get_batteries
    • First observedbosch_get_bike
    • First observedbosch_get_bikes
    • First observedbosch_get_capacity
    • First observedbosch_get_components
    • First observedbosch_get_service_records
    • First observedbosch_get_soc
    • First observedbosch_get_software_updates
    • First observedbosch_sync

TDQS

A4.2/5.0

Scored across 12 tools

Disambiguation3/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers