# io.github.cyanheads/onebusaway-mcp-server (remote · onebusaway.caseyjhand.com)

Real-time transit stops, routes, arrivals, vehicle positions, and schedules via OneBusAway APIs.

- Trust score: 72/100 (medium)
- Change this week: +4
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-08-03

## Components

- remote · `onebusaway.caseyjhand.com`: 72/100 (this document), [markdown](https://verifymcp.io/servers/cyanheads-onebusaway-mcp-server/onebusaway.md), [page](https://verifymcp.io/servers/cyanheads-onebusaway-mcp-server/onebusaway)
- npm · `@cyanheads/onebusaway-mcp-server`: 35/100, [markdown](https://verifymcp.io/servers/cyanheads-onebusaway-mcp-server/cyanheads-onebusaway-mcp-server.md), [page](https://verifymcp.io/servers/cyanheads-onebusaway-mcp-server/cyanheads-onebusaway-mcp-server)

## Channel facts

- Endpoint: `https://onebusaway.caseyjhand.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `0.1.13`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-08-03.

- **Endpoint Security**: 66/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - Authorisation not fully verified: no authorisation is required to call this server, and 15 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.
  - HTTPS is enforced; there's no plaintext access path.
  - The HSTS (Strict-Transport-Security) header is present.
  - DNSSEC is configured correctly; the domain's records validate against the full chain to the root.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 84/100
  - 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).
  - AI-judged instruction clarity (excellent).
  - Context-footprint check failed: tool/resource definitions use about 2279 tokens (~134/item across 17 items; 15 tools + 2 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 27/100
  - Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 100/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 100% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Capabilities**: 100/100
  - Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.

## Install

### Claude

```bash
claude mcp add --transport http cyanheads-onebusaway-mcp-server https://onebusaway.caseyjhand.com/mcp
```

### Codex

```toml
[mcp_servers.cyanheads-onebusaway-mcp-server]
url = "https://onebusaway.caseyjhand.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "cyanheads-onebusaway-mcp-server": {
      "type": "remote",
      "url": "https://onebusaway.caseyjhand.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add cyanheads-onebusaway-mcp-server --url https://onebusaway.caseyjhand.com/mcp --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  cyanheads-onebusaway-mcp-server:
    url: "https://onebusaway.caseyjhand.com/mcp"
```

### Other

```json
{
  "mcpServers": {
    "cyanheads-onebusaway-mcp-server": {
      "type": "http",
      "url": "https://onebusaway.caseyjhand.com/mcp"
    }
  }
}
```

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-08-02 (score 72, +1)

No change was recorded against any check on this day. Stability & Change Management went from 20 to 23. That category is still filling its 30-day observation window: 6 days of observed history at the previous scan, 7 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-31 (score 71, +1)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-30 (score 70, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-29 (score 70, +1)

No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-28 (score 69, +1)

No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-07-27 (score 68, 0)

- [functional] We updated how we score, so this day's move reflects our rubric, not a change to the server

### 2026-07-26 (score 68)

First indexed and scored.

## MCP tools (15)

### `onebusaway_list_agencies` (~61 tokens)

List Transit Agencies

List all transit agencies served by this OneBusAway instance. Returns agency IDs, names, contact info, timezone, and geographic coverage center. Agency IDs are needed for onebusaway_list_routes_for_agency and onebusaway_get_vehicles.

Output parameters:

- `agencies` (array): All agencies served by this OneBusAway instance.
- `count` (number): Number of transit agencies returned.
- `limitExceeded` (boolean): True if the upstream capped the agency list — some agencies were omitted. This endpoint has no pagination to retrieve them.
- `notice` (string): Guidance when no agencies were returned.

### `onebusaway_find_stops` (~192 tokens)

Find Stops Near Location

Find bus stops near a location. Returns stops within a radius, each with ID, name, direction, served routes, and wheelchair boarding status. Use stopId values from results to fetch real-time arrivals with onebusaway_get_arrivals. Optionally filter by stop code (the number printed on the stop sign, e.g. "75403").

Input parameters:

- `lat` (number, required): Latitude of the search center, in [-90, 90].
- `lon` (number, required): Longitude of the search center, in [-180, 180].
- `query` (string): Optional stop code filter (the number printed on the stop sign, e.g. "75403"). When provided, returns only stops matching this code within the radius.
- `radius` (number): Search radius in meters. Must be positive; capped at 1600m, beyond which results degrade. Defaults to 300m.

Output parameters:

- `count` (number): Number of stops returned.
- `limitExceeded` (boolean): True if more stops exist beyond the returned set; narrow the radius to see all.
- `notice` (string): Guidance when results are empty or truncated — e.g. how to narrow the radius or verify the stop code.
- `query` (string): Stop code filter applied to the search, if any.
- `stops` (array): Stops within the search radius.

### `onebusaway_find_routes` (~227 tokens)

Find Routes Near Location

Find transit routes near a location, optionally filtered by name or number. Returns routes with IDs, short names, and descriptions. Use routeId values to fetch schedules, vehicles, or stop sequences.

Input parameters:

- `lat` (number, required): Latitude of the search center, in [-90, 90].
- `latSpan` (number): Optional bounding-box height in degrees, as an alternative to radius. Takes effect only when lonSpan is also set, in which case radius is ignored.
- `lon` (number, required): Longitude of the search center, in [-180, 180].
- `lonSpan` (number): Optional bounding-box width in degrees, as an alternative to radius. Takes effect only when latSpan is also set, in which case radius is ignored.
- `query` (string): Filter by route name or number (e.g. "44" or "Link Light Rail").
- `radius` (number): Search radius in meters. Must be positive; capped at 1600m. Defaults to 500m. Ignored when latSpan and lonSpan are both set.

Output parameters:

- `count` (number): Number of routes returned.
- `limitExceeded` (boolean): True if more routes exist beyond the returned set; narrow the radius or set latSpan/lonSpan to see all.
- `notice` (string): Guidance when no routes matched — e.g. try a larger radius or different query.
- `query` (string): Route name/number filter applied to the search, if any.
- `routes` (array): Routes found near the specified location.

### `onebusaway_search_stops` (~107 tokens)

Search Stops by Name or Code

Search for stops by name or code. Returns matching stops with IDs and coordinates. Use to resolve a human-readable stop name or number to a stop ID for arrivals lookups with onebusaway_get_arrivals.

Input parameters:

- `maxCount` (integer): Maximum number of results to return. A positive integer, at most 100. Defaults to 10.
- `query` (string, required): Stop name fragment or stop code (e.g. "University Way" or "75403").

Output parameters:

- `count` (number): Number of stops returned.
- `limitExceeded` (boolean): True if more stops match than were returned; raise maxCount or refine the query to see all.
- `notice` (string): Guidance when no stops matched — e.g. try a different name fragment or use onebusaway_find_stops with coordinates.
- `query` (string): Search query sent to the API.
- `stops` (array): Stops matching the search query.

### `onebusaway_search_routes` (~118 tokens)

Search Routes by Name or Number

Search for routes by name or number. Returns matching routes with IDs. Use to resolve a route short name (e.g. "44") to a route ID for schedule or vehicle lookups with onebusaway_get_vehicles or onebusaway_get_schedule_for_route.

Input parameters:

- `maxCount` (integer): Maximum number of results to return. A positive integer, at most 100. Defaults to 10.
- `query` (string, required): Route name or number (e.g. "44", "Link", or "RapidRide").

Output parameters:

- `count` (number): Number of routes returned.
- `limitExceeded` (boolean): True if more routes match than were returned; raise maxCount or refine the query to see all.
- `notice` (string): Guidance when no routes matched — e.g. try onebusaway_find_routes with coordinates, or onebusaway_list_routes_for_agency.
- `query` (string): Route name/number query sent to the API.
- `routes` (array): Routes matching the search query.

### `onebusaway_get_stop` (~128 tokens)

Get Stop Details

Fetch details for a specific stop by ID. Returns the stop's name, coordinates, direction, served routes, and wheelchair accessibility. Stop IDs use agency-prefixed format: {agencyId}_{localId} (e.g. "1_75403" for Metro Transit stop 75403).

Input parameters:

- `stopId` (string, required): Agency-prefixed stop ID (e.g. "1_75403" for Metro Transit stop 75403, "40_100239" for Sound Transit). Use onebusaway_find_stops or onebusaway_search_stops to discover IDs.

Output parameters:

- `code` (string): The stop code printed on the sign.
- `direction` (string): Compass direction of travel at this stop (e.g. "NW").
- `id` (string): Agency-prefixed stop ID.
- `lat` (number): Latitude of the stop.
- `lon` (number): Longitude of the stop.
- `name` (string): Stop name.
- `routeIds` (array): IDs of routes that serve this stop. Use with onebusaway_get_arrivals or onebusaway_get_schedule_for_stop.
- `wheelchairBoarding` (string): Wheelchair boarding status.

### `onebusaway_get_route` (~98 tokens)

Get Route Details

Fetch details for a specific route by ID. Returns short name, description, agency, route type, and schedule URL. Route IDs use agency-prefixed format: {agencyId}_{localId} (e.g. "1_100259").

Input parameters:

- `routeId` (string, required): Agency-prefixed route ID (e.g. "1_100259"). Use onebusaway_find_routes or onebusaway_search_routes to discover IDs.

Output parameters:

- `agencyId` (string): Agency ID that operates this route.
- `agencyName` (string): Agency name that operates this route.
- `color`: Route brand color hex (without #), or null.
- `description` (string): Route description.
- `id` (string): Agency-prefixed route ID.
- `longName` (string): Full route name.
- `shortName` (string): The number or short name displayed on vehicles (e.g. "44").
- `type` (number): GTFS route type: 0=tram, 1=subway, 2=rail, 3=bus, 4=ferry, 5=cable_car.
- `url`: Agency schedule page URL, or null.

### `onebusaway_list_routes_for_agency` (~97 tokens)

List Routes for Agency

List all routes operated by an agency. Returns route IDs, short names, and descriptions. Use to enumerate an agency's full service before searching for a specific route. Get agencyId values from onebusaway_list_agencies.

Input parameters:

- `agencyId` (string, required): Agency ID (e.g. "1" for Metro Transit, "40" for Sound Transit). Use onebusaway_list_agencies to discover IDs.

Output parameters:

- `agencyId` (string): Agency ID queried.
- `count` (number): Number of routes returned for this agency.
- `limitExceeded` (boolean): True if the upstream capped the route list — some routes were omitted. This endpoint has no pagination to retrieve them.
- `notice` (string): Guidance when no routes were found — verify the agency ID with onebusaway_list_agencies.
- `routes` (array): All routes operated by this agency.

### `onebusaway_get_arrivals` (~197 tokens)

Get Real-Time Arrivals

Real-time arrivals and departures at a stop. Returns predicted arrival times, schedule deviation (how many seconds late/early), vehicle positions, and any active service alerts. The predicted boolean on each arrival indicates whether GPS tracking backs the estimate — predicted=false means schedule-only. Use tripId from results for follow-up onebusaway_get_trip calls. Stop IDs use agency-prefixed format: {agencyId}_{localId} (e.g. "1_75403").

Input parameters:

- `minutesAfter` (number): Include arrivals expected within the next N minutes. Defaults to 35.
- `minutesBefore` (number): Include arrivals that departed up to this many minutes ago. Defaults to 5.
- `stopId` (string, required): Agency-prefixed stop ID (e.g. "1_75403" for Metro Transit stop 75403). Use onebusaway_find_stops or onebusaway_search_stops to discover IDs.

Output parameters:

- `arrivals` (array): Arrivals and departures at this stop within the requested time window.
- `count` (number): Number of arrivals in the time window.
- `currentTime` (number): Server time as Unix milliseconds, for computing countdown timers.
- `notice` (string): Guidance when no arrivals were found — e.g. try expanding the time window or check for service alerts.
- `queriedStop` (string): Stop ID queried.
- `situations` (array): Active service alerts referenced by arrivals at this stop.
- `stopId` (string): The queried stop ID.
- `stopName` (string): Stop name.
- `windowMinutes` (object): Time window used for the arrivals query.

### `onebusaway_get_alert` (~104 tokens)

Get Service Alert Detail

Fetch full detail for a service alert (situation) by ID. Returns the summary, description, reason (e.g. detour, construction), affected stops and routes, consequence description, and active time windows. Situation IDs appear in onebusaway_get_arrivals responses under situationIds and situations[].id.

Input parameters:

- `situationId` (string, required): Situation/alert ID from onebusaway_get_arrivals (situations[].id or arrivals[].situationIds[]).

Output parameters:

- `activeWindows` (array): Time windows when this alert is active.
- `affects` (array): Stops, routes, trips, or agencies affected by this alert.
- `consequenceMessage`: Human-readable consequence description (e.g. "Detour in effect"), or null.
- `consequences` (array): Operational consequences of this alert.
- `description`: Longer description of the alert, or null.
- `id` (string): Situation ID.
- `reason`: Reason code from TPEG: equipmentReason, environmentReason, personnelReason, miscellaneousReason, securityAlert. Null when not provided.
- `severity`: Severity level as reported by the agency, or null.
- `summary` (string): Short summary of the service alert.
- `url`: URL for more information about this alert, or null.

### `onebusaway_get_trip` (~127 tokens)

Get Trip Status

Real-time status and stop sequence for a trip. Returns vehicle position, schedule deviation, current phase, and remaining stops. Use tripId from onebusaway_get_arrivals to look up a specific vehicle's progress.

Input parameters:

- `includeSchedule` (boolean): Whether to include the full stop sequence with times. Defaults to true.
- `serviceDateMs` (number): Service date as Unix milliseconds (midnight local time). Only needed for trips from a previous service day. Omit to use today.
- `tripId` (string, required): Trip ID from an arrivals response or schedule lookup.

Output parameters:

- `blockId`: Block ID grouping this trip with the others the same vehicle runs back-to-back. Pass to onebusaway_get_block for the full block schedule. Null when the trip has no block.
- `routeShortName` (string): Route short name (e.g. "44").
- `schedule`: Full stop sequence with times, or null if includeSchedule=false.
- `situations` (array): Active situation IDs affecting this trip.
- `status` (object): Real-time status of the trip.
- `tripHeadsign` (string): Destination sign text.
- `tripId` (string): The queried trip ID.

### `onebusaway_get_block` (~132 tokens)

Get Block Schedule

Fetch the full-day block schedule for a vehicle by block ID. A block is the ordered sequence of trips a single vehicle makes in one service day. Returns all trips in order with their stop times. Useful for 'when will this bus return?' and fleet tracking. Block IDs appear in onebusaway_get_trip responses under the schedule block field; obtain a tripId from onebusaway_get_arrivals first.

Input parameters:

- `blockId` (string, required): Block ID from a trip record. Obtain a tripId from onebusaway_get_arrivals, then call onebusaway_get_trip to get the blockId.

Output parameters:

- `activeServiceIds` (array): Service calendar IDs active for this block today.
- `blockId` (string): Block ID.
- `inactiveServiceIds` (array): Service calendar IDs not active for this block today.
- `trips` (array): All trips in this block in order.

### `onebusaway_get_vehicles` (~143 tokens)

Get Real-Time Vehicle Positions

Real-time positions of all active vehicles for an agency. Optionally filter to a single route (client-side). Returns GPS coordinates, heading, schedule deviation, and current trip. Useful for "where are all the buses on route X right now?" Use agencyId values from onebusaway_list_agencies.

Input parameters:

- `agencyId` (string, required): Agency ID (e.g. "1" for Metro Transit, "40" for Sound Transit). Use onebusaway_list_agencies to discover IDs.
- `routeId` (string): Optional agency-prefixed route ID to filter results to one route. Filtering is client-side — all agency vehicles are fetched first.

Output parameters:

- `agencyId` (string): Agency ID queried.
- `count` (number): Number of vehicles returned after any route filter.
- `limitExceeded` (boolean): True if the upstream capped the vehicle list — some vehicles were omitted. This endpoint has no pagination to retrieve them.
- `notice` (string): Guidance when no vehicles were found — e.g. the route may not be currently active, or the agency may not have real-time data.
- `routeId` (string): Route ID filter applied client-side, if any.
- `vehicles` (array): Active vehicles for the agency, optionally filtered by route.

### `onebusaway_get_schedule_for_stop` (~133 tokens)

Get Stop Schedule

Full-day departure schedule for a stop. Lists every departure by route and direction for the specified date (defaults to today). Useful for planning or when real-time data isn't needed. For live predictions, use onebusaway_get_arrivals instead.

Input parameters:

- `date` (string): ISO 8601 date (e.g. "2026-05-23"). Defaults to today in the agency's timezone.
- `stopId` (string, required): Agency-prefixed stop ID (e.g. "1_75403"). Use onebusaway_find_stops or onebusaway_search_stops to discover IDs.

Output parameters:

- `date` (string): Date parameter used for the schedule request, if specified.
- `notice` (string): Guidance when no routes were found — e.g. no service on weekends or holiday schedule in effect.
- `queriedStop` (string): Stop ID queried.
- `routeCount` (number): Number of routes with departures from this stop on this date.
- `routes` (array): All routes with departures from this stop on this date.
- `serviceDateMs` (number): Service date as Unix milliseconds (start of service day).
- `stopId` (string): The queried stop ID.
- `stopName` (string): Stop name.

### `onebusaway_get_schedule_for_route` (~128 tokens)

Get Route Schedule

Full-day schedule for a route — all trips, stop sequences, and departure times for the specified date (defaults to today). Returns up to all trips for the route. For live predictions, use onebusaway_get_arrivals at specific stops instead.

Input parameters:

- `date` (string): ISO 8601 date (e.g. "2026-05-23"). Defaults to today.
- `routeId` (string, required): Agency-prefixed route ID (e.g. "1_100259"). Use onebusaway_find_routes or onebusaway_search_routes to discover IDs.

Output parameters:

- `date` (string): Date parameter used for the schedule request, if specified.
- `notice` (string): Guidance when no trips were found — e.g. no service on weekends or holiday schedule in effect.
- `queriedRoute` (string): Route ID queried.
- `routeId` (string): The queried route ID.
- `routeShortName` (string): Route short name.
- `serviceDateMs` (number): Service date as Unix milliseconds.
- `tripCount` (number): Number of trips for this route on this date.
- `trips` (array): All trips for this route on this date, with their stop sequences.

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/cyanheads-onebusaway-mcp-server/onebusaway#diagnostics

## Score history

- 2026-08-03: 72
- 2026-08-02: 72
- 2026-08-01: 71
- 2026-07-31: 71
- 2026-07-30: 70
- 2026-07-29: 70
- 2026-07-28: 69
- 2026-07-27: 68
- 2026-07-26: 68

## Links

- Remote endpoint: https://onebusaway.caseyjhand.com/mcp
- Repository: https://github.com/cyanheads/onebusaway-mcp-server
- Changelog RSS feed: https://verifymcp.io/servers/cyanheads-onebusaway-mcp-server/onebusaway/changelog.xml
- Changelog JSON feed: https://verifymcp.io/servers/cyanheads-onebusaway-mcp-server/onebusaway/changelog.json
- HTML version of this page: https://verifymcp.io/servers/cyanheads-onebusaway-mcp-server/onebusaway
