- Home
- /
- Connect
Connect AI Assistants to Velo Index
The Velo Index connector searches and compares manufacturer-published e-bike specifications across the EU, UK, US, Canada, Australia and New Zealand, normalised into the same fields for every brand.
Using Velo Index inside ChatGPT as a rider rather than a developer? See how it works.
The connector is a free, read-only MCP server at https://www.theveloindex.com/api/mcp. It requires no authentication and no account, and uses the Streamable HTTP transport. In Claude, add the URL as a custom connector under Settings, Connectors. In ChatGPT, add it as a connector in developer mode. Any MCP-compatible client can connect with the URL alone.
Interactive Panel in ChatGPT and Claude
In assistants that support MCP Apps, including ChatGPT and Claude, the same three tools also show a Velo Index panel in the conversation. Other clients receive the same facts as text. The panel's images and links travel separately from the answer the assistant reads, so a response is the same size with or without it.
The panel uses one more read-only tool, refresh_bike_explorer, to filter and page through results when you use its controls. Assistants with panel support do not offer it to the model; other clients list it as a fourth tool.
- A search shows a carousel of up to eight matching bikes, each with its listed price and two figures that follow the search, with the US e-bike class first in the USA and Canada. "Explore and compare" opens it full screen to filter by budget, frame type, US class, weight, battery, torque, removable battery, motor, sensor and drivetrain, sort, and page through every match in that market.
- A lookup or comparison shows catalogue images of the named bikes with key figures. Pick two to see their published specifications side by side, with differences marked but no winner.
- Each bike links to its listing on Velo Index. Recorded discount codes appear in the details view with the date they were last checked and a commission disclosure.
- The panel follows the assistant's light or dark appearance and works on phones. It reads the public catalogue only and never asks for an account.
All product names, logos, and images are trademarks of their respective owners. Velo Index uses these materials solely for comparison and informational purposes.
To try it, connect the server URL above and ask, for example, "Find e-bikes under €2,500 and under 20 kg in the EU" or "Compare the Turbo Vado SL 2 4.0 and the Turbo Vado 4.0 Step-Through in the UK". The panel sends no usage data of its own; see the privacy page.
Why Use This Connector
Merchant catalogs describe their own products, in their own formats, for one brand at a time. The Velo Index connector answers a different question: which bikes, across competing brands, meet a set of specification requirements in a given market.
- The same fields for every brand. Motor sensor type, torque in Nm, battery capacity in Wh, manufacturer-claimed range, and published weight are recorded in one consistent structure, so a filter such as “torque sensor, at least 500Wh, under $2,000” means the same thing for every bike.
- Unknowns stay unknown. When a manufacturer does not publish a figure, the field is empty rather than estimated. An agent can tell a missing specification from a bike that fails a requirement.
- Regional records kept separate. The same model can differ in price, specification and availability between markets. Each record belongs to one market, in that market's currency.
- Brands regardless of storefront. Coverage includes direct-to-consumer brands and dealer-network brands, whatever platform they sell through.
- Source links and dates. Each record links to its Velo Index page, which links to the manufacturer or retailer source.
- Velo Index discount codes where they exist. Where Velo Index holds a discount code for a brand, the code, its stated value and the date it was last checked are included, with a commercial disclosure. Codes currently exist for some brands in the EU, UK and US only.
Coverage
Model variants and brands per market, as indexed at the last data review.
| Market | Region code | Currency | Variants | Brands | Velo Index discount codes |
|---|---|---|---|---|---|
| EU | EU | EUR | 1,256 | 70 | Yes |
| UK | UK | GBP | 824 | 59 | Yes |
| US | USA | USD | 634 | 59 | Yes |
| Canada | CA | CAD | 122 | 14 | No |
| Australia | AU | AUD | 243 | 21 | No |
| New Zealand | NZ | NZD | 59 | 8 | No |
Tools
search_bikes
Search the Velo Index e-bike specification index by region and filter criteria. Use this when the user describes what they want in general terms, for example a price ceiling, a riding purpose, a motor position or a battery range, and does not name a specific model. Returns up to 10 matching models per call with summary specifications, ordered by price ascending unless sort asks for price descending, lightest listed weight, longest claimed range, largest battery or model name, plus the total number of matches; offset pages through the rest. In the USA and Canada, us_class filters by US e-bike class (1, 2 or 3). Specifications are manufacturer claims standardised for comparison, not independent test results. Battery capacity, torque, claimed range, published weight and sensor type are returned as null when the manufacturer does not publish them, never estimated. A model with no published value for a field never matches a minimum or maximum filter on that field (price_max, weight_max_kg, min_range_miles, min_battery_wh, min_torque_nm). The sensor filter value torque matches any system with torque sensing; cadence_only matches cadence-only systems; models with no published sensor type never match a sensor filter. Do not use this to look up a single named model; use get_bike instead.
| Parameter | Type | Required | Values or bounds | Notes |
|---|---|---|---|---|
region | string | Yes | EU, UK, USA, CA, AU, NZ. Case-insensitive; US, GB, CAN, AUS, NZL also accepted. | Each record belongs to one market, in that market’s currency. |
price_max | number | No | 0 to 100,000 | Inclusive, in the region’s currency. Unpriced models are excluded when set. |
form_factor | string | No | Step-Over, Step-Through, Mountain, Folding, Cargo, Fat Tire | Frame or bike category. |
motor_type | string | No | hub, mid-drive | Models whose motor position is not established are excluded when set. |
sensor | string | No | torque, cadence, cadence_only | torque matches any system with torque sensing. cadence_only matches cadence-only systems. cadence is the earlier value, kept for compatibility, and matches any system with cadence sensing, including combined torque and cadence. Models with no published sensor type never match. |
removable_battery | boolean | No | true, false | Omit to include both. |
weight_max_kg | number | No | 0 to 100 | Inclusive, published weight. Models with no published weight are excluded when set. |
min_range_miles | number | No | 0 to 500 | Inclusive, manufacturer-claimed range. Models with no claimed range are excluded when set. |
min_battery_wh | number | No | 0 to 5,000 | Inclusive, battery capacity in Wh. Models with no published capacity are excluded when set. |
min_torque_nm | number | No | 0 to 250 | Inclusive, motor torque in Nm. Models with no published torque are excluded when set. |
brand | string | No | 1 to 128 characters | Exact match ignoring case, accents, spaces, hyphens and punctuation, so surface604 matches Surface 604. No substring or fuzzy matching. |
us_class | integer | No | 1, 2, 3 | USA and CA only; an error elsewhere. Matches models whose listed US e-bike class includes it, so a model listed as 1/2/3 matches each. Models with no listed class never match. |
sort | string | No | price_asc (default), price_desc, weight_asc, range_desc, battery_desc, name_asc | Each order uses one published figure; models that do not publish it come last. price_desc with price_max lists the models nearest the budget first. |
offset | integer | No | 0 to 10,000 (default 0) | Matches to skip, for the next page: pass next_offset from the previous result. |
max_results | number | No | 1 to 10 (default 10) | Values outside the range are clamped. |
Example arguments
{
"region": "USA",
"sensor": "torque",
"price_max": 2000,
"min_battery_wh": 500,
"max_results": 1
}Example response
{
"source": "Velo Index (theveloindex.com), an independent e-bike specification index. No sponsored rankings.",
"sort": "price ascending",
"total_matches": 176,
"showing": 1,
"offset": 0,
"next_offset": 1,
"results": [
{
"slug": "kingbull-discover-st-20",
"brand": "Kingbull",
"model": "Kingbull Discover ST 2.0",
"price_value": 949,
"price_display": "$949",
"weight_kg": 34.93,
"weight_lbs": 77,
"claimed_range_miles": 60,
"claimed_range_km": 97,
"battery_wh": 720,
"motor_type": "hub",
"torque_nm": 80,
"drivetrain_sensor": "Torque",
"form_factor": "Fat Tire",
"removable_battery": true,
"top_speed_mph": 28,
"brakes": "ZOOM HB-875-E 2-piston hydraulic disc 180mm front/rear",
"gears": "7-speed",
"drivetrain": "7-speed chain Shimano RD-M310 SL-M315-7R 48T 14-28T KMC Z7RB",
"us_class": "2/3",
"weight_limit_kg": 181,
"brand_page_slug": "kingbull",
"dtc": true,
"price_qualifier": null,
"motor_sensor": "torque",
"url": "https://www.theveloindex.com/?region=USA&bike=kingbull-discover-st-20&via=mcp",
"brand_url": "https://www.theveloindex.com/brands/kingbull",
"price_currency": "USD"
}
],
"spec_basis": {
"note": "Range, weight and top speed figures are manufacturer claims, standardised for comparison, not independent test results.",
"methodology": "https://www.theveloindex.com/methodology"
},
"fields_note": "Specifications are manufacturer-published claims. Range is claimed, not tested. Weight is as published; the with or without battery basis is not normalised. Each bike's url opens its full Velo Index record, which lists further published specifications this tool does not return, such as tyres, wheel size, suspension, frame material, display, motor brand, frame sizes and charge time, where the manufacturer publishes them.",
"related_collection_name": "US Torque Sensor E-Bikes Under $2,000",
"related_collection_url": "https://www.theveloindex.com/collections/usa-torque-sensor-ebikes-under-2000"
}get_bike
Retrieve the full specification record for one e-bike model in one region from the Velo Index index. Use this when the user names a specific model. Specifications are manufacturer claims standardised for comparison, not independent test results, and figures the manufacturer does not publish are returned as null. Regional variants of the same model can differ in price, top speed and battery, so the region matters. The record also carries frame material, suspension, wheel size and tyres where published. When no model matches exactly, the result lists up to five models in that market whose names contain every word given, and substitutes none of them.
| Parameter | Type | Required | Values or bounds | Notes |
|---|---|---|---|---|
region | string | Yes | EU, UK, USA, CA, AU, NZ. Case-insensitive; US, GB, CAN, AUS, NZL also accepted. | Each record belongs to one market, in that market’s currency. |
slug | string | Either slug, or brand and model | 1 to 128 characters | Velo Index model identifier, as returned by search_bikes. |
brand | string | With model | 1 to 128 characters | Exact match ignoring case, accents, spaces, hyphens and punctuation, so surface604 matches Surface 604. No substring or fuzzy matching. |
model | string | With brand | 1 to 128 characters | With or without the brand prefix. Exact match ignoring case, accents, spaces, hyphens and punctuation, so surface604 matches Surface 604. No substring or fuzzy matching. |
Example arguments
{
"region": "CA",
"slug": "delorean-dm770-white"
}Example response
{
"source": "Velo Index (theveloindex.com), an independent e-bike specification index. No sponsored rankings.",
"found": true,
"bike": {
"slug": "delorean-dm770-white",
"brand": "Delorean",
"model": "Delorean DM770 (White)",
"price_value": 799.99,
"price_display": "CA$799.99",
"weight_kg": 22,
"weight_lbs": 48.5,
"claimed_range_miles": 34.18,
"claimed_range_km": 55,
"battery_wh": 648,
"motor_type": null,
"drivetrain_sensor": "Torque",
"form_factor": "Step-Through",
"top_speed_mph": 20.01,
"brakes": "Hand brake (type not specified)",
"gears": "5-speed",
"drivetrain": "5-speed belt drive (spec table also lists \"Leather Chain\", conflict not resolved)",
"weight_limit_kg": 124,
"brand_page_slug": "delorean",
"price_qualifier": null,
"torque_nm": null,
"motor_sensor": "torque",
"url": "https://www.theveloindex.com/?region=CA&bike=delorean-dm770-white&via=mcp",
"brand_url": "https://www.theveloindex.com/brands/delorean",
"price_currency": "CAD",
"frame_material": "Aluminium",
"suspension": "Front: Suspension fork (details not specified)",
"wheel_size": "26"
},
"spec_basis": {
"note": "Range, weight and top speed figures are manufacturer claims, standardised for comparison, not independent test results.",
"methodology": "https://www.theveloindex.com/methodology"
},
"fields_note": "Specifications are manufacturer-published claims. Range is claimed, not tested. Weight is as published; the with or without battery basis is not normalised. Each bike's url opens its full Velo Index record, which lists further published specifications this tool does not return, such as display, motor brand, frame sizes and charge time, where the manufacturer publishes them."
}compare_bikes
Compare the specifications of two to four named e-bike models side by side within one region, using the Velo Index index. Use this when the user names multiple models and wants them set against each other. Each model can be given as a slug or as a brand and model name, so named models can be compared in one call. Returns aligned specification fields, including frame material, suspension, wheel size and tyres where published, with null where a core figure is not published. Models not found are reported by input position, with any models in that market whose names contain every word given; none is substituted. Velo Index publishes no rankings and this tool returns no recommendation, ranking or verdict; it returns comparable figures only. Specifications are manufacturer claims, not independent test results.
| Parameter | Type | Required | Values or bounds | Notes |
|---|---|---|---|---|
region | string | Yes | EU, UK, USA, CA, AU, NZ. Case-insensitive; US, GB, CAN, AUS, NZL also accepted. | Each record belongs to one market, in that market’s currency. |
slugs | array of string or {brand, model} | Yes | 2 to 4 items; each string 1 to 128 characters | Each item is a slug, or an object with brand and model. Exact match ignoring case, accents, spaces, hyphens and punctuation, so surface604 matches Surface 604. No substring or fuzzy matching. Duplicates are ignored. Items not found are reported in not_found by input position. |
Example arguments
{
"region": "USA",
"slugs": [
{
"brand": "Lectric",
"model": "XP4"
},
{
"brand": "Aventon",
"model": "Aventure 3"
}
]
}Example response
Trimmed: each result in a real response carries the full record shown for get_bike.
{
"source": "Velo Index (theveloindex.com), an independent e-bike specification index. No sponsored rankings.",
"results": [
{
"slug": "lectric-xp4",
"model": "Lectric XP4",
"price_value": 999,
"price_currency": "USD",
"battery_wh": 500,
"torque_nm": 55,
"motor_sensor": "torque",
"claimed_range_miles": 50,
"weight_kg": 31.29
},
{
"slug": "aventon-aventure-3",
"model": "Aventon Aventure 3",
"price_value": 1999,
"price_currency": "USD",
"battery_wh": 733,
"torque_nm": 80,
"motor_sensor": "torque",
"claimed_range_miles": 65,
"weight_kg": 34.47
}
],
"not_found": [],
"fields_compared": [
"price_value",
"price_currency",
"weight_kg",
"weight_lbs",
"claimed_range_miles",
"claimed_range_km",
"battery_wh",
"motor_type",
"torque_nm",
"drivetrain_sensor",
"form_factor",
"removable_battery",
"top_speed_mph",
"brakes",
"gears",
"drivetrain",
"us_class",
"weight_limit_kg",
"frame_material",
"suspension",
"tyres"
],
"spec_basis": {
"note": "Range, weight and top speed figures are manufacturer claims, standardised for comparison, not independent test results.",
"methodology": "https://www.theveloindex.com/methodology"
},
"fields_note": "Specifications are manufacturer-published claims. Range is claimed, not tested. Weight is as published; the with or without battery basis is not normalised. Each bike's url opens its full Velo Index record, which lists further published specifications this tool does not return, such as display, motor brand, frame sizes and charge time, where the manufacturer publishes them."
}Field Reference
The null rule. battery_wh, torque_nm, motor_sensor, claimed_range_miles, claimed_range_km, weight_kg, price_display and price_qualifier are present on every record. When the manufacturer does not publish the figure, the value is null. Velo Index never estimates, infers or fills a missing figure, so null means “not published”, not zero and not a failed requirement.
Filters and null. A record with a null value for a field never matches a minimum or maximum filter on that field: price_max, weight_max_kg, min_range_miles, min_battery_wh and min_torque_nm each exclude records where the figure is not published. Omit the filter to include them.
Specifications are manufacturer-published claims. Range is claimed, not tested. Weight is as published; the with or without battery basis is not normalised. Each bike's url opens its full Velo Index record, which lists further published specifications this tool does not return, such as tyres, wheel size, suspension, frame material, display, motor brand, frame sizes and charge time, where the manufacturer publishes them.
slug, brand, model- Identity of the record. slug is the identifier get_bike and compare_bikes accept.
url- The record’s Velo Index page, which links to the manufacturer or retailer source.
brand_url- The Velo Index brand page, or the brands index when the brand has no page.
price_value- Number parsed from the listed price. Omitted when no price is listed.
price_currency- ISO currency code, set from the region, never read from the price text. Present whenever price_value is.
price_display- The listed price exactly as published, including any prefix.
price_qualifier- from, srp or msrp when the listed price carries that prefix; otherwise null.
battery_wh- Battery capacity in watt-hours.
torque_nm- Motor torque in newton-metres.
motor_sensor- Pedal assist sensor type: torque, cadence, torque_and_cadence or speed_cadence_torque.
drivetrain_sensor- The sensor description as recorded, before normalisation.
claimed_range_miles, claimed_range_km- The manufacturer’s claimed range. A claim, not a tested figure.
weight_kg- Weight as published by the manufacturer. Whether it includes the battery is not normalised. weight_lbs carries the same figure in pounds when published.
motor_type- Motor position: hub, mid-drive, or null when the position is not established in the source specification.
form_factor, removable_battery, top_speed_mph, brakes, gears, drivetrain, us_class, weight_limit_kg, release_year- Further specification fields, omitted when not recorded.
frame_material, suspension, wheel_size, tyres- get_bike and compare_bikes only: further specifications as published, omitted when not recorded. wheel_size is in inches unless the value says otherwise, for example 700c.
dtc- Whether the brand sells direct to consumers, where recorded.
discount- Present only when Velo Index holds a discount code for the model: code, value_text (the stated value, verbatim), description (verbatim) and checked_on (the date the code was last checked, YYYY-MM-DD). Any part that cannot be read from the source text is null.
discount_code, discount_description, disclosure- The discount code and description exactly as recorded, and the commercial disclosure that accompanies any code.
Response-level fields
source- Attribution line for Velo Index.
total_matches, showing, sort- search_bikes only: how many records matched, how many are returned, and the order applied (price ascending by default; models without the sort figure last).
offset, next_offset- search_bikes only: where this page starts among all matches, and the offset for the next page, or null on the last page.
related_collection_name, related_collection_url- search_bikes only: a Velo Index collection page, when the filters fall inside exactly one collection.
found, error, region, message- get_bike only: whether the record was found, and a not_found error when it was not.
did_you_mean- get_bike and compare_bikes, only when an identifier is not found: up to five models in that market whose name contains every word given (for compare_bikes, grouped by input position). Nothing is substituted.
not_found, fields_compared- compare_bikes only: input positions of identifiers not found, and the fields published for every compared record.
spec_basis, fields_note- What the figures represent and a link to the methodology. fields_note also states that each bike's url opens its full Velo Index record, which lists further published specifications, such as tyres, suspension and frame material, that the tools do not return.
Neutrality and Commercial Disclosure
Commercial relationships may affect how Velo Index earns revenue. They never affect whether a bike is included, the specification values shown, the order of results, or the output of a comparison. No brand pays for inclusion or placement.
Responses may include discount codes, and Velo Index may earn a commission when codes or brand links are used. The full disclosure is on the methodology page.
Limits and Fair Use
- 60 requests per minute per IP address. Every request counts, including the connection handshake. Over the limit, the server returns HTTP 429 with a Retry-After header. Claude and ChatGPT reach the server from a few shared addresses on behalf of all their users, so addresses in their published ranges get 1,200 requests per minute, and ChatGPT tool calls are also limited to 60 per minute per user.
- search_bikes returns at most 10 results per call; compare_bikes takes 2 to 4 identifiers.
- Responses are compact JSON; a full 10-result search is under 16 KB.
- Request bodies over 16 KB and JSON-RPC batch requests are rejected.
- No authentication or account is required. Availability is not guaranteed, there is no uptime commitment, and the tools may change.
- Bulk extraction is not permitted. The dataset remains the property of Velo Index. See the terms of use.
If you quote or surface Velo Index figures, cite Velo Index by name and link to the source page where the surface permits. The methodology page describes how specifications are compiled and what they represent.
Support
Questions, problems or data corrections: inquiries@theveloindex.com.
Security vulnerabilities: email the same address with "Security" in the subject line, and include the affected URL and steps to reproduce. Please do not test against other people's data or degrade the service while investigating. The address is also published in security.txt.
Changelog
Current server version: 1.2.0.
1.2.0,
- In assistants that support MCP Apps, such as ChatGPT and Claude, results render an interactive panel: search results as a card that opens a filterable explorer, get_bike and compare_bikes results as catalogue images with key figures, and a two-bike comparison in fullscreen.
- Every 1.1.0 field keeps its name and meaning; the fields added in 1.2.0 are listed below. Each result adds a short second text item with the catalogue date and the statement that Velo Index publishes no rankings.
- The panel's data (images, Velo Index links, filter state) travels in the result's _meta under com.theveloindex/panel. MCP Apps hosts pass _meta to the panel and keep it out of the model's context, so responses cost the model no more than before.
- New tool refresh_bike_explorer, called by the panel for filtering, paging and selection. MCP Apps hosts do not offer it to the model; other clients list it as a fourth read-only tool.
- The server now answers resources/list and resources/read, which serve the panel. Clients without MCP Apps support are unaffected.
- Addresses in the published egress ranges of Claude and ChatGPT, which carry many users through a few addresses, get 1,200 requests per minute instead of 60. ChatGPT tool calls are also limited to 60 per minute per user, using the anonymous user id ChatGPT supplies for rate limiting.
- search_bikes takes sort (price_asc, the default, price_desc, weight_asc, range_desc, battery_desc or name_asc) and offset, and returns offset and next_offset, so results are no longer limited to the ten lowest-priced matches. Each order uses one published figure, with models that do not publish it last.
- search_bikes takes us_class (1, 2 or 3) in the USA and Canada: models whose listed US e-bike class includes it, so a model listed as 1/2/3 matches each. A Class 3 search under $1,500 links to the matching Velo Index collection.
- In the panel, search results show as a carousel, one bike as a card with its Velo Index link, and two bikes side by side, each within the hosts' limits for inline content. The figures shown follow the search, and lead with the US class in the USA and Canada.
- get_bike and compare_bikes add frame_material, suspension, wheel_size and tyres where the manufacturer publishes them, verbatim from the record. search_bikes results are unchanged. Each response's fields_note says which further specifications the bike's Velo Index page lists.
- When get_bike or compare_bikes finds no exact match, the result adds did_you_mean: up to five models in that market whose name contains every word given, fewest extra words first. Matching stays exact and nothing is substituted; the field is absent when nothing is close.
1.1.0,
- All three tools accept six regions: EU, UK, USA, CA, AU and NZ. Region input is case-insensitive and accepts US, GB, CAN, AUS and NZL.
- New fields: price_display, price_qualifier, motor_sensor and, where a discount code exists, a parsed discount object. Every response carries fields_note.
- battery_wh, torque_nm, claimed_range_miles, claimed_range_km and weight_kg are always present, with null when the manufacturer does not publish the figure.
- New search_bikes filters min_battery_wh and min_torque_nm. A model with no published value for a field never matches a minimum or maximum filter on that field.
- New sensor filter value cadence_only. The existing cadence value keeps its behaviour.
- Brand and model matching ignores case, accents, spaces, hyphens and punctuation, so surface604 matches Surface 604. Matching is still exact; there is no substring or fuzzy matching.
- compare_bikes accepts brand and model names as well as slugs, so named models can be compared in one call.
- Text inputs are limited to 128 characters and numeric inputs have published bounds. Error messages no longer repeat submitted identifiers; compare_bikes reports unmatched identifiers by input position.
- The rate limit applies to every request and returns HTTP 429 with Retry-After. Batch requests and request bodies over 16 KB are rejected. Notifications are acknowledged with HTTP 202 and no body.
1.0.0,
- First public release of search_bikes, get_bike and compare_bikes.