gbfs-mcp
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@gbfs-mcpfind nearby Citi Bike stations with available e-bikes"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
gbfs-mcp ๐ฒ
General Bikeshare Feed Specification (GBFS v3.0 / v2.3) Model Context Protocol (MCP) server & interactive CLI.
Connect AI assistants (Antigravity, Claude Desktop, Cursor, Claude Code) and developers to real-time bikeshare and micromobility availability worldwide across 1,000+ public systems (Citi Bike, Bay Wheels, Vรฉlib', Santander Cycles, Biki, Lime, and more).
๐ Features
๐ 1,000+ Worldwide Systems: Built-in integration with MobilityDataโs official
systems.csvcatalog.โก Dynamic Auto-Discovery: Seamlessly parses
gbfs.jsonfor both GBFS v3.0 (flat feed manifests) and GBFS v2.x (multi-language feed manifests).๐ Geographic Proximity Sorting: Rank stations and free-floating e-bikes/scooters by distance (
lat,lon,radius_meters).๐ Fleet & Battery Telemetry: Real-time visibility into vehicle types, electric vs. mechanical bikes, battery ranges, and dock availability.
๐ค Built-in Agent Skill (
SKILL.md): Complete agent guide included for querying and reasoning about shared micromobility feeds.
Related MCP server: mcp-citybikes
๐ ๏ธ MCP Tools
Tool | Parameters | Description |
|
| Search 1,000+ public bikeshare systems by city, country, or system ID. |
|
| Resolves |
|
| Fetches live station capacity, available bikes, e-bikes, and empty docks with proximity ranking. |
|
| Fetches dockless/floating bikes and scooters with battery range. |
|
| Active operational notices, weather closures, or maintenance. |
|
| Vehicle specifications (form factors, propulsion, battery range). |
๐ Quick Start (CLI)
cd E:\development\gbfs-mcp
npm install
npm run build
# Search systems
node dist/index.js systems Minneapolis
# Get live station availability
node dist/index.js stations bay_wheels --limit 10โ๏ธ MCP Configuration
Add to your mcp_config.json:
{
"mcpServers": {
"gbfs-mcp": {
"command": "node",
"args": ["E:/development/gbfs-mcp/dist/index.js", "serve"]
}
}
}๐ License
MIT ยฉ Amin
Available Tools
6 toolsgbfs_get_alertsB
Fetch active system alerts, disruption notices, and weather closures from system_alerts.json.
| Name | Required | Description | Default |
|---|---|---|---|
| system_id_or_url | Yes | System ID or gbfs.json URL. |
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 usefully scopes the result to 'active' alerts and named disruption/weather categories, implying a read-only fetch, but says nothing about auth requirements, caching, failure modes, or result shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence that front-loads the verb and the resource. No wasted language, nothing to trim.
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 endpoint with no output schema, the description covers what the tool returns (active alerts, disruptions, weather closures) and where they come from. Only minor gaps remain around auth and response structure.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single required parameter (system_id_or_url), so the schema already documents the accepted ID-or-URL forms. The description adds no parameter meaning beyond what the schema supplies, which is the baseline 3 case.
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?
States a specific verb (fetch) and resource (active system alerts, disruption notices, weather closures) plus the backing file system_alerts.json. The alert resource is clearly distinct from the sibling station/bike/vehicle-type endpoints, though no sibling is named explicitly.
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?
No when-to-use or when-not-to-use guidance, and no mention of alternatives among the other gbfs_* tools. Usage is only inferable from the fact that it fetches alerts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gbfs_get_free_bikesB
Fetch real-time dockless/free-floating bikes and scooters (free_bike_status.json) with battery levels and coordinates.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum vehicles to return (default 25). | |
| latitude | No | Optional latitude for proximity filtering. | |
| longitude | No | Optional longitude for proximity filtering. | |
| radius_meters | No | Optional search radius in meters. | |
| system_id_or_url | Yes | System ID or gbfs.json URL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full behavioral burden. It discloses that data is real-time and includes battery levels and coordinates, but says nothing about authentication needs, rate limits, pagination behavior, or whether the endpoint returns empty results for systems without free-floating vehicles. For a network API call with zero annotation coverage, this is thin.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, dense sentence that front-loads the verb and resource, then adds key value attributes (battery levels, coordinates). No filler or 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 5-parameter network API tool with no annotations and no output schema, the description covers purpose and return content but omits behavioral context like error handling, rate limits, or data freshness caveats. It is adequate but leaves gaps for correct invocation in a production agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema fully documents all five parameters (limit, latitude, longitude, radius_meters, system_id_or_url). The description adds no parameter details beyond what the schema provides. Baseline 3 applies when the schema does all the work.
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?
States a specific verb (Fetch) and resource (real-time dockless/free-floating bikes and scooters via free_bike_status.json). Clearly distinguishes from siblings like gbfs_get_stations and gbfs_get_vehicle_types by naming the exact data feed.
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?
No guidance on when to use this tool versus alternatives. It doesn't mention that free-floating vehicles are different from docked stations (gbfs_get_stations) or vehicle types (gbfs_get_vehicle_types). An agent must infer the distinction from the resource name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gbfs_get_stationsB
Fetch real-time station status (available bikes, e-bikes, and docks) for a bikeshare system. Optionally sort and filter by geographic proximity.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum stations to return (default 25). | |
| latitude | No | Optional latitude for proximity ranking. | |
| longitude | No | Optional longitude for proximity ranking. | |
| radius_meters | No | Optional search radius in meters. | |
| system_id_or_url | Yes | System ID or gbfs.json URL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. 'Fetch' and 'real-time' imply a safe read, and it names the returned fields, but it says nothing about authentication, rate limits, pagination, or behavior when coordinates are omitted. Useful but incomplete for a tool with zero annotation coverage.
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?
Two sentences, zero filler, with the core purpose front-loaded and the optional proximity behavior second. Nothing could be trimmed without losing 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?
With 5 parameters, no output schema, and no annotations, the definition is largely complete for a simple read tool: purpose, payload contents, and the proximity option are covered. It could do slightly more (e.g., what the response looks like or defaults when coordinates are absent), but the schema handles the required 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 description coverage is 100%, so every parameter (limit, latitude, longitude, radius_meters, system_id_or_url) is already documented. The description's mention of 'sort and filter by geographic proximity' loosely maps to lat/long/radius but adds no format or interaction details beyond the schema. Baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch real-time station status') and enumerates the payload contents (available bikes, e-bikes, docks), so the agent knows exactly what comes back. It does not, however, distinguish itself from siblings like gbfs_get_free_bikes or gbfs_get_system, leaving overlap ambiguous.
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?
Only hints at usage via 'Optionally sort and filter by geographic proximity.' There is no statement of when to prefer this over gbfs_get_free_bikes or gbfs_get_system, no prerequisites, and no exclusions. The agent must infer routing from the names alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gbfs_get_systemA
Fetch system metadata, operator information, and resolved feed endpoints from gbfs.json for a given system_id or auto-discovery URL.
| Name | Required | Description | Default |
|---|---|---|---|
| system_id_or_url | Yes | System ID from catalog (e.g. "citi_bike_nyc", "bay_wheels", "velib_metropole") or direct gbfs.json URL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does disclose a meaningful behavior: this tool resolves feed endpoints from the GBFS discovery document rather than returning raw data. But it says nothing about error handling for unknown system IDs, network calls to the URL, or latency/caching characteristics of an external fetch.
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?
One sentence, front-loaded with the verb and resource, every clause earning its place. No filler or 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?
No output schema exists, so the description usefully enumerates the returned content (system metadata, operator info, resolved feed endpoints), giving the agent a sense of the response. It is a single-parameter read tool, so little else is strictly required, though failure behavior for bad IDs/URLs is unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the single parameter with concrete examples. The description restates 'system_id or auto-discovery URL' plus the gbfs.json source, adding only marginal framing beyond the schema. Baseline 3 is appropriate.
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?
States a specific verb (Fetch) and a specific resource (system metadata, operator information, resolved feed endpoints from gbfs.json), scoped to a system_id or URL. This clearly separates it from siblings like gbfs_get_stations or gbfs_get_alerts, which fetch different GBFS feeds.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the call context (given a system_id or auto-discovery URL, retrieve the discovery document). However, it never states when to prefer this over gbfs_list_systems or when the URL form is appropriate versus the catalog ID form. No exclusions or prerequisites are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gbfs_get_vehicle_typesB
Fetch vehicle fleet specifications (form factors, mechanical vs electric assist, maximum battery range) from vehicle_types.json.
| Name | Required | Description | Default |
|---|---|---|---|
| system_id_or_url | Yes | System ID or gbfs.json URL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full behavioral burden. It mentions the source file but doesn't disclose whether this is a read-only operation, if it requires authentication, if data is cached, or what the response contains. For a data-fetching tool with no annotations, this is a significant gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, efficient sentence that front-loads the core purpose and includes specific details about the returned data. No wasted words.
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 lack of annotations and output schema, the description should do more to explain the tool's behavior, such as read-only nature or response format. It provides some useful detail about the data but leaves key behavioral aspects unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents the single parameter. The description doesn't add any additional meaning about the parameter or its expected format beyond what the schema provides. Baseline 3 is appropriate when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Fetch) and resource (vehicle fleet specifications) and names the source file (vehicle_types.json). It clearly distinguishes itself from siblings like get_stations or get_free_bikes. However, it doesn't explicitly contrast its scope with those siblings, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the tool retrieves static vehicle type data, but it doesn't state when to use this tool versus get_system or get_stations. No explicit usage context or exclusions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gbfs_list_systemsA
Search the MobilityData systems.csv catalog of 1,000+ public bikeshare and micromobility systems worldwide by city name, country, operator, or system_id.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return. Default 20. | |
| query | No | Search keyword, city, country code, or system name (e.g. "Paris", "US", "Minneapolis", "citi-bike", "bay-wheels"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. 'Search ... catalog' strongly implies a non-destructive read, and it discloses catalog size (1,000+ systems), which hints at result volume, but it says nothing about pagination, rate limits, or whether results are filtered server-side.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that front-loads the verb and resource, then the searchable facets. Nothing is repeated or padded; every clause carries 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 two-parameter search tool with no annotations and no output schema, the definition covers purpose and searchable scope adequately. However, with no output schema present, nothing describes the return shape or result ordering, leaving a modest gap for an agent deciding how to consume 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?
Schema description coverage is 100%, so both parameters are already documented, giving a baseline of 3. The description adds mild value by enumerating the fields query matches against (city, country, operator, system_id), but contributes no format or syntax detail beyond the schema examples.
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?
Specific verb (Search) plus a clearly named resource (MobilityData systems.csv catalog of 1,000+ bikeshare/micromobility systems) and the searchable facets. It contrasts implicitly with single-entity siblings like gbfs_get_system, but never names them, so the differentiation is inferable rather than explicit.
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?
Usage is implied by the word 'Search' and the catalog scope, but there is no explicit when-to-use guidance and no exclusions. Notably, it does not tell the agent when to prefer this over gbfs_get_system for a known system_id, despite mentioning system_id as a search key.
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.
6 tool updates
v1.0.0- First observed
gbfs_get_alerts - First observed
gbfs_get_free_bikes - First observed
gbfs_get_stations - First observed
gbfs_get_system - First observed
gbfs_get_vehicle_types - First observed
gbfs_list_systems
TDQS
Scored across 6 tools
Each tool targets a distinct GBFS resource and action: system discovery, system metadata, stations, free bikes, alerts, and vehicle types. There is no meaningful overlap that would cause an agent to select the wrong tool.
All tools follow a consistent gbfs_<verb>_<noun> pattern, using list_ for catalog discovery and get_ for fetching specific data. The only minor irregularity is singular 'system' vs plural others, but it is intuitive as it returns a single system.
With 6 tools, the server is well-scoped for a GBFS domain, covering the most commonly needed data feeds without bloat. Each tool serves a distinct, high-value purpose.
Core GBFS feeds such as station status, free bikes, alerts, and vehicle types are covered, and system metadata provides feed endpoints for raw access. The absence of a dedicated station_information tool for static station names/coordinates is a minor gap that agents can work around by consulting feed endpoints.
Maintenance
Related MCP Connectors
Give AI assistants access to real-time data. Search the web, compare flights, find hotels, and more.
Pay-per-use tool marketplace for AI agents. Search, price-check, and call APIs via MCP.
Discover, inspect and run 63,000+ agent tools from one balance. Pay per call, no subscriptions.
Pay-per-use tool API for AI agents. Free tier, x402 USDC micropayments, or API key.
Related MCP Servers
- FlicenseAqualityDmaintenanceProvides access to Bay Wheels realtime bikeshare data, enabling users to find nearest available bikes (standard or ebike) and docking stations with available spaces in the San Francisco Bay Area.2-
- AlicenseNot gradedqualityCmaintenanceProvides access to bike sharing station data from CityBik.es API, enabling queries for station availability and locations without authentication.5 npmMIT
- AlicenseNot gradedqualityCmaintenanceProvides real-time access to Montreal's Bixi bike-sharing data through the GBFS API. Enables querying station information, availability, nearby stations, and system alerts.MIT
- AlicenseNot gradedqualityCmaintenanceEnables querying global transit data including agencies, routes, stops, and departures through a GTFS aggregator.6 npmMIT