onebusaway-mcp-server
Server Details
Real-time transit stops, routes, arrivals, vehicle positions, and schedules via OneBusAway APIs.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP
- URL
- Repository
- cyanheads/onebusaway-mcp-server
- GitHub Stars
- 1
- Server Listing
- @cyanheads/onebusaway-mcp-server
Available Tools
15 toolsonebusaway_find_routesFind Routes Near LocationBRead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude of the search center, in [-90, 90]. | |
| lon | Yes | Longitude of the search center, in [-180, 180]. | |
| query | No | Filter by route name or number (e.g. "44" or "Link Light Rail"). | |
| radius | No | Search radius in meters. Must be positive; capped at 1600m. Defaults to 500m. Ignored when latSpan and lonSpan are both set. | |
| latSpan | No | 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. | |
| lonSpan | No | 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | Number of routes returned. |
| error | No | Present when the call failed. Absent on success. |
| query | No | Route name/number filter applied to the search, if any. |
| notice | No | Guidance when no routes matched — e.g. try a larger radius or different query. |
| routes | No | Routes found near the specified location. |
| limitExceeded | No | True if more routes exist beyond the returned set; narrow the radius or set latSpan/lonSpan to see all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true, and the description aligns by describing a read-only search that returns data. The description adds modest value by specifying return fields and suggesting further actions, but it does not delve into potential pagination, rate limits, or other behavioral nuances. Given that annotations cover the safety profile, this is adequate but not exceptional.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three concise sentences with no filler. It front-loads the primary purpose, immediately states return contents, and then provides a practical tip for using the output. Every sentence earns its place, and the structure is ideal for quick agent comprehension.
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 geographic search tool with six parameters fully documented in the schema and an output schema present, the description covers the essential context: what it finds, what it returns, and how to use the results. It does not mention potential pagination or result limits, but given the output schema and the relative simplicity of the tool, this is a minor omission. The description is complete enough for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema describes all six parameters thoroughly, achieving 100% coverage, so the description adds little to parameter meaning. It does mention 'filtered by name or number' which maps to the query parameter, and 'near a location' implies lat/lon, but these are already explicit in the schema. The description adds no new semantic depth beyond the schema, so a baseline score of 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?
The description clearly states a specific verb ('Find'), resource ('transit routes'), and context ('near a location') with an optional filter. It also lists the returned fields (IDs, short names, descriptions), making the purpose distinct. However, it does not explicitly differentiate from sibling tools like onebusaway_search_routes, which could also locate routes, so it loses a point for not addressing sibling ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no guidance on when to use this tool versus alternatives such as onebusaway_search_routes or onebusaway_find_stops. It only mentions downstream usage of routeId values, which is helpful for post-call actions but does not help the agent decide between spatially searching routes and other search or retrieval tools. No exclusions or comparative criteria are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
onebusaway_find_stopsFind Stops Near LocationARead-onlyInspect
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").
| Name | Required | Description | Default |
|---|---|---|---|
| lat | Yes | Latitude of the search center, in [-90, 90]. | |
| lon | Yes | Longitude of the search center, in [-180, 180]. | |
| query | No | 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 | No | Search radius in meters. Must be positive; capped at 1600m, beyond which results degrade. Defaults to 300m. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | Number of stops returned. |
| error | No | Present when the call failed. Absent on success. |
| query | No | Stop code filter applied to the search, if any. |
| stops | No | Stops within the search radius. |
| notice | No | Guidance when results are empty or truncated — e.g. how to narrow the radius or verify the stop code. |
| limitExceeded | No | True if more stops exist beyond the returned set; narrow the radius to see all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, so the read-only nature is already disclosed. The description adds value by enumerating the returned fields, which is beyond the annotations, but does not elaborate on potential edge cases (e.g., result limits, error behavior, or pagination). It is adequate but not rich in behavioral disclosure beyond what annotations and schema already provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise — four short sentences, each adding essential information: purpose, return fields, downstream usage, and optional filter. It is front-loaded with the core purpose and avoids redundancy or filler. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's moderate complexity (4 parameters, all documented, output schema present) and the read-only annotation, the description covers everything needed for correct invocation: what it does, what it returns, how to use the results, and the optional filter. No missing guidance for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter is already described in detail (ranges, defaults, exclusivity). The description reiterates the 'stop code' filter ('the number printed on the stop sign') which mirrors the schema. It adds no new semantic meaning beyond the schema; baseline of 3 is appropriate because the schema carries the full load.
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 and resource ('Find bus stops near a location') and lists the returned fields (ID, name, direction, served routes, wheelchair boarding status). This clearly distinguishes it from sibling tools like get_stop (single stop lookup) and search_stops (name/code based search), though it doesn't explicitly name them. The purpose is unambiguous.
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 a location-based use case ('near a location') and provides downstream guidance to use onebusaway_get_arrivals with the returned stopId values. However, it does not explicitly state when to choose this tool over alternatives like search_stops or find_routes. Usage is implied rather than clearly delineated against siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
onebusaway_get_alertGet Service Alert DetailARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| situationId | Yes | Situation/alert ID from onebusaway_get_arrivals (situations[].id or arrivals[].situationIds[]). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Situation ID. |
| url | No | URL for more information about this alert, or null. |
| error | No | Present when the call failed. Absent on success. |
| reason | No | Reason code from TPEG: equipmentReason, environmentReason, personnelReason, miscellaneousReason, securityAlert. Null when not provided. |
| affects | No | Stops, routes, trips, or agencies affected by this alert. |
| summary | No | Short summary of the service alert. |
| severity | No | Severity level as reported by the agency, or null. |
| description | No | Longer description of the alert, or null. |
| consequences | No | Operational consequences of this alert. |
| activeWindows | No | Time windows when this alert is active. |
| consequenceMessage | No | Human-readable consequence description (e.g. "Detour in effect"), or null. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description reinforces the read-only behavior by describing what data is returned. It adds value by enumerating the returned fields (summary, description, reason, affected stops/routes, consequence, active time windows), which goes beyond the annotation's safety-only disclosure.
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, front-loaded with the purpose, followed by return contents and ID source. No filler; every sentence contributes useful 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 a single parameter and the readOnlyHint annotation, the description covers what the tool does, what it returns, and where the input originates. No critical information is missing for invoking it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the parameter is already documented. The description adds provenance ('Situation IDs appear in onebusaway_get_arrivals responses under situationIds and situations[].id'), which gives the agent guidance beyond the schema's type constraint.
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 'Fetch full detail for a service alert (situation) by ID.' This is a specific verb+resource and clearly distinguishes from sibling tools like onebusaway_get_arrivals, which list alerts rather than fetch detail for a single ID.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent where to obtain the situationId (from onebusaway_get_arrivals under situationIds and situations[].id), which is the key usage prerequisite. It doesn't mention when not to use the tool, but the ID requirement 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.
onebusaway_get_arrivalsGet Real-Time ArrivalsARead-onlyInspect
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").
| Name | Required | Description | Default |
|---|---|---|---|
| stopId | Yes | Agency-prefixed stop ID (e.g. "1_75403" for Metro Transit stop 75403). Use onebusaway_find_stops or onebusaway_search_stops to discover IDs. | |
| minutesAfter | No | Include arrivals expected within the next N minutes. Defaults to 35. | |
| minutesBefore | No | Include arrivals that departed up to this many minutes ago. Defaults to 5. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | Number of arrivals in the time window. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when no arrivals were found — e.g. try expanding the time window or check for service alerts. |
| stopId | No | The queried stop ID. |
| arrivals | No | Arrivals and departures at this stop within the requested time window. |
| stopName | No | Stop name. |
| situations | No | Active service alerts referenced by arrivals at this stop. |
| currentTime | No | Server time as Unix milliseconds, for computing countdown timers. |
| queriedStop | No | Stop ID queried. |
| windowMinutes | No | Time window used for the arrivals query. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description explains the meaning of the 'predicted' boolean (GPS-backed vs schedule-only), the return of schedule deviation in seconds, and the presence of vehicle positions and alerts. It also notes that tripId is available for follow-up calls. This adds valuable behavioral context not captured in annotations or output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four compact sentences with no filler. It front-loads the core purpose, then details the key behavioral nuance (predicted boolean), follow-up usage, and a critical formatting rule. Every sentence earns its place.
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 presence of a full output schema and rich parameter descriptions, the description covers the essential behavioral aspects: what real-time data is returned, how to interpret the predicted flag, and how to chain to trip details. It does not explicitly steer users away from schedule-based tools, but that is a minor omission given the clear real-time focus.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides complete descriptions for all parameters (100% coverage), including the stop ID format and default values for minutesAfter and minutesBefore. The description reiterates the stop ID format but adds no new parameter-specific meaning beyond what the schema already documents, so it meets the baseline for schema-covered tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's function: it returns real-time arrivals and departures for a stop, including predicted times, schedule deviation, vehicle positions, and alerts. This distinguishes it from siblings like onebusaway_get_schedule_for_stop (static schedule) and onebusaway_get_stop (stop details) by emphasizing the real-time and predictive nature.
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 real-time usage through terms like 'real-time', 'predicted', and 'GPS tracking', but it does not explicitly state when to use this tool versus alternatives such as onebusaway_get_schedule_for_stop. It offers follow-up guidance (use tripId for onebusaway_get_trip) and stop ID format, but lacks direct exclusions or comparisons to sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
onebusaway_get_blockGet Block ScheduleARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| blockId | Yes | Block ID from a trip record. Obtain a tripId from onebusaway_get_arrivals, then call onebusaway_get_trip to get the blockId. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| trips | No | All trips in this block in order. |
| blockId | No | Block ID. |
| activeServiceIds | No | Service calendar IDs active for this block today. |
| inactiveServiceIds | No | Service calendar IDs not active for this block today. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description adds meaningful behavioral context: it returns all trips in order with stop times and clarifies the block concept. This goes beyond the annotation without contradicting it.
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?
Four concise sentences, front-loaded with the primary action. Each sentence adds distinct value: action, definition, return content, and usage/derivation. No fluff 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 single-parameter, read-only tool with an output schema, the description covers purpose, usage context, and parameter provenance. Nothing essential is missing for a correct invocation.
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% (blockId is described), so baseline is 3. The description adds extra value by explaining how to obtain a valid blockId (from a trip record, with the full chain from arrivals), which is not fully captured in the schema description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action: 'Fetch the full-day block schedule for a vehicle by block ID.' It explains what a block is (ordered sequence of trips) and what is returned (all trips in order with stop times), making it distinct from siblings like onebusaway_get_trip or onebusaway_get_arrivals.
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?
Provides explicit use cases ('when will this bus return?', fleet tracking) and a clear dependency chain: obtain tripId from onebusaway_get_arrivals, then get blockId from onebusaway_get_trip. While it doesn't explicitly compare to alternatives, the workflow is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
onebusaway_get_routeGet Route DetailsARead-onlyInspect
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").
| Name | Required | Description | Default |
|---|---|---|---|
| routeId | Yes | Agency-prefixed route ID (e.g. "1_100259"). Use onebusaway_find_routes or onebusaway_search_routes to discover IDs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | Agency-prefixed route ID. |
| url | No | Agency schedule page URL, or null. |
| type | No | GTFS route type: 0=tram, 1=subway, 2=rail, 3=bus, 4=ferry, 5=cable_car. |
| color | No | Route brand color hex (without #), or null. |
| error | No | Present when the call failed. Absent on success. |
| agencyId | No | Agency ID that operates this route. |
| longName | No | Full route name. |
| shortName | No | The number or short name displayed on vehicles (e.g. "44"). |
| agencyName | No | Agency name that operates this route. |
| description | No | Route description. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the exact return fields (short name, description, agency, route type, schedule URL), which is behavioral context beyond the readOnlyHint annotation. It does not mention errors, rate limits, or side effects, but for a read-only fetch these are less critical. The description adds useful information about what the tool returns without contradicting annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no redundant wording. The core purpose is front-loaded, followed by the key detail (ID format) and the discovery hint. Every word earns its place.
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 only one parameter, a readOnlyHint annotation, and an existing output schema (which covers the return shape), the description fully covers what an agent needs: what the tool does, what it returns, the ID format, and how to get IDs if unknown. No essential information is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides a detailed description for routeId, including the agency-prefixed format, an example, and pointers to discovery tools (100% schema coverage). The description repeats the format example but does not add new meaning beyond the schema. Per the rubric, a score of 3 is appropriate when schema coverage is high and the description offers no additional parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool fetches details for a specific route by ID, and enumerates the returned fields (short name, description, agency, route type, schedule URL). This distinguishes it from sibling tools like onebusaway_list_routes_for_agency (which lists multiple) and onebusaway_search_routes (which is discovery-focused). The ID format and example remove ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage context: it's for retrieving a specific route by ID, and it explicitly directs users to onebusaway_find_routes or onebusaway_search_routes for discovering IDs. It does not explicitly state when NOT to use it, but the 'specific route by ID' framing and the discovery guidance effectively communicate the selection criteria. A clear 'when to use' is present, though the 'when not' is implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
onebusaway_get_schedule_for_routeGet Route ScheduleARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ISO 8601 date (e.g. "2026-05-23"). Defaults to today. | |
| routeId | Yes | Agency-prefixed route ID (e.g. "1_100259"). Use onebusaway_find_routes or onebusaway_search_routes to discover IDs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | No | Date parameter used for the schedule request, if specified. |
| error | No | Present when the call failed. Absent on success. |
| trips | No | All trips for this route on this date, with their stop sequences. |
| notice | No | Guidance when no trips were found — e.g. no service on weekends or holiday schedule in effect. |
| routeId | No | The queried route ID. |
| tripCount | No | Number of trips for this route on this date. |
| queriedRoute | No | Route ID queried. |
| serviceDateMs | No | Service date as Unix milliseconds. |
| routeShortName | No | Route short name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation is already present, and the description adds useful context about the return content (all trips, stop sequences, departure times) and the default date. It doesn't contradict annotations and provides more than just the safety profile, though it doesn't disclose potential response size limits or failure modes. This is adequate given the 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?
The description is two sentences with no wasted words. The first sentence front-loads the core functionality, and the second gives the exclusion. Every part earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity, the existing output schema, and the read-only annotation, the description covers everything an agent needs: what it returns, the default behavior, and the alternative for live data. No critical information is missing for correct usage.
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% — both routeId and date are well-described in the schema, including the default for date and guidance on finding route IDs. The tool description only restates the default behavior and doesn't add meaning beyond the schema, so the baseline score of 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?
The description states a specific verb and resource: 'Full-day schedule for a route' with details on what is included (all trips, stop sequences, departure times). It clearly differentiates itself from the live-predictions tool by naming onebusaway_get_arrivals, making it distinguishable among the many siblings.
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?
Explicit guidance is given: 'For live predictions, use onebusaway_get_arrivals at specific stops instead.' This tells the agent when not to use this tool and names the alternative. The default-date behavior is also mentioned, providing clear context for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
onebusaway_get_schedule_for_stopGet Stop ScheduleARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ISO 8601 date (e.g. "2026-05-23"). Defaults to today in the agency's timezone. | |
| stopId | Yes | Agency-prefixed stop ID (e.g. "1_75403"). Use onebusaway_find_stops or onebusaway_search_stops to discover IDs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| date | No | Date parameter used for the schedule request, if specified. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when no routes were found — e.g. no service on weekends or holiday schedule in effect. |
| routes | No | All routes with departures from this stop on this date. |
| stopId | No | The queried stop ID. |
| stopName | No | Stop name. |
| routeCount | No | Number of routes with departures from this stop on this date. |
| queriedStop | No | Stop ID queried. |
| serviceDateMs | No | Service date as Unix milliseconds (start of service day). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description does not contradict this. It adds meaningful behavior beyond the annotation: the full-day scope, defaulting to today in the agency's timezone, and listing by route and direction. This enriches the operational picture without being verbose.
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 plus a routing sentence, with the core purpose front-loaded. Every sentence earns its place; no fluff. The structure is ideal for quick parsing by an agent.
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 an output schema present and full parameter documentation, nothing is missing for correct invocation. The description covers the functional scope, the date default, and the alternative for live data. This is complete for a read-only schedule lookup tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — both parameters (stopId, date) are documented in the schema. The description adds no extra parameter-level detail beyond the schema, so the baseline 3 applies. It provides no additional syntax or edge-case guidance beyond what the schema already covers.
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 and resource ('full-day departure schedule for a stop') and explicitly differentiates itself from the sibling onebusaway_get_arrivals by noting the alternative for live predictions. An agent can immediately tell what this tool does and how it differs from nearby options.
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?
It provides clear guidance on when to use this tool ('for planning or when real-time data isn't needed') and when not to, explicitly naming the alternative (onebusaway_get_arrivals). This is model routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
onebusaway_get_stopGet Stop DetailsARead-onlyInspect
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).
| Name | Required | Description | Default |
|---|---|---|---|
| stopId | Yes | 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 Schema
| Name | Required | Description |
|---|---|---|
| id | No | Agency-prefixed stop ID. |
| lat | No | Latitude of the stop. |
| lon | No | Longitude of the stop. |
| code | No | The stop code printed on the sign. |
| name | No | Stop name. |
| error | No | Present when the call failed. Absent on success. |
| routeIds | No | IDs of routes that serve this stop. Use with onebusaway_get_arrivals or onebusaway_get_schedule_for_stop. |
| direction | No | Compass direction of travel at this stop (e.g. "NW"). |
| wheelchairBoarding | No | Wheelchair boarding status. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint: true, so the description is not required to state that. It adds value beyond the annotation by enumerating the returned fields and explaining the ID format, giving the agent concrete expectations for the operation's behavior. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste. The action and output summary are front-loaded, followed by the essential ID format detail. Every word earns its place; no redundant qualifiers or filler.
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 single-parameter read-only tool with a complete schema description and output schema present, the description covers everything an agent needs: what the tool does, what it returns, and how to construct the ID. Nothing essential is missing given the low complexity and available structured data.
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 parameter is already documented. The description and parameter text add extras: the agency-prefixed format with examples and pointers to discovery tools, which are not present in the bare schema. This meaningfully enhances understanding of how to fill the parameter correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Fetch details') and the resource ('a specific stop by ID'), lists the returned fields (name, coordinates, direction, served routes, wheelchair accessibility), and differentiates from sibling tools by focusing on a single stop's details rather than schedules, arrivals, or routes.
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?
It gives clear context that this tool is for fetching stop details, and the parameter schema advises using onebusaway_find_stops or onebusaway_search_stops to discover IDs. It does not explicitly contrast with other 'get' siblings like get_schedule_for_stop, but the purpose is unambiguous enough for correct selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
onebusaway_get_tripGet Trip StatusARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| tripId | Yes | Trip ID from an arrivals response or schedule lookup. | |
| serviceDateMs | No | Service date as Unix milliseconds (midnight local time). Only needed for trips from a previous service day. Omit to use today. | |
| includeSchedule | No | Whether to include the full stop sequence with times. Defaults to true. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| status | No | Real-time status of the trip. |
| tripId | No | The queried trip ID. |
| blockId | No | 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. |
| schedule | No | Full stop sequence with times, or null if includeSchedule=false. |
| situations | No | Active situation IDs affecting this trip. |
| tripHeadsign | No | Destination sign text. |
| routeShortName | No | Route short name (e.g. "44"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=true already declares the tool read-only, so the description's main contribution is specifying the return data (position, deviation, phase, remaining stops) and noting that includeSchedule defaults to true. It also discloses that serviceDateMs is only needed for previous service days. These details add context beyond the annotation, helping the agent understand what to expect without contradicting it.
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 with zero fluff. The first sentence immediately conveys the verb, resource, and output, while the second provides actionable usage guidance. Front-loaded with the core purpose, every word earns its place.
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 tool with 3 parameters (1 required), a rich output schema, and read-only annotation, the description is sufficiently complete. It explains what the tool returns and how to source the input. It could optionally mention that tripId is required, but that is already in the schema. The absence of pagination or error details is acceptable given the tool's scope and the presence of an output schema.
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%, with each parameter (tripId, serviceDateMs, includeSchedule) already documented. The description adds minimal extra meaning: it mentions where to obtain tripId (arrivals) but does not elaborate on parameters beyond what the schema provides. Per the guideline, a baseline of 3 is appropriate when the schema does the heavy lifting, and the description offers no further parameter insight.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Real-time status and stop sequence for a trip' and enumerates the specific outputs (vehicle position, schedule deviation, current phase, remaining stops). It also differentiates from siblings by focusing on a single trip and explicitly referencing onebusaway_get_arrivals as the source of tripId, making it distinct from the many search/list tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives a concrete usage scenario: 'Use tripId from onebusaway_get_arrivals to look up a specific vehicle's progress.' This implies when to use the tool (when you have a tripId from arrivals) and clarifies the relationship with a sibling. However, it does not explicitly state when not to use it or compare with other trip-related tools (e.g., get_block, get_route), so a clear exclusion is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
onebusaway_get_vehiclesGet Real-Time Vehicle PositionsARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| routeId | No | Optional agency-prefixed route ID to filter results to one route. Filtering is client-side — all agency vehicles are fetched first. | |
| agencyId | Yes | Agency ID (e.g. "1" for Metro Transit, "40" for Sound Transit). Use onebusaway_list_agencies to discover IDs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | Number of vehicles returned after any route filter. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | 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 | No | Route ID filter applied client-side, if any. |
| agencyId | No | Agency ID queried. |
| vehicles | No | Active vehicles for the agency, optionally filtered by route. |
| limitExceeded | No | True if the upstream capped the vehicle list — some vehicles were omitted. This endpoint has no pagination to retrieve them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses that route filtering is client-side, meaning all agency vehicles are fetched before filtering, which is a performance-relevant behavior. It also enumerates returned fields (GPS coordinates, heading, schedule deviation, current trip), adding value beyond the bare annotation.
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 concise sentences front-load the primary function and optional filter, then add a practical usage example. Every sentence contributes, and there is 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 read-only tool with two parameters (one required), both fully documented in the schema, and an existing output schema, the description covers the essential usage context. It includes the critical client-side behavior and points to agency discovery, leaving no meaningful gaps.
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% — both agencyId and routeId already have detailed descriptions, including the client-side filtering caveat. The tool description adds no new parameter semantics beyond what the schema captures; it only echoes the filter behavior and the agency-listing pointer. This meets the baseline for full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's core function: returning real-time positions of active vehicles for an agency, with an optional route filter. It is specific about the resource (vehicles) and the output (GPS coordinates, heading, schedule deviation, current trip), and it is easily distinguishable from sibling tools like get_arrivals or get_trip.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a concrete use case ('where are all the buses on route X right now?') and directs the agent to onebusaway_list_agencies for agency IDs. It does not explicitly enumerate when not to use this tool or name alternative tools, but the use-case framing gives clear context. Sibling names like get_arrivals imply alternatives without being called out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
onebusaway_list_agenciesList Transit AgenciesARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | Number of transit agencies returned. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when no agencies were returned. |
| agencies | No | All agencies served by this OneBusAway instance. |
| limitExceeded | No | True if the upstream capped the agency list — some agencies were omitted. This endpoint has no pagination to retrieve them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, covering safety and scope. The description adds what data fields the response contains, which is beyond the annotations but not contradictory. It does not discuss pagination or rate limits, but given the simple list nature and closed world, this is sufficient context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences deliver the purpose, return fields, and usage context without redundancy. The core action is front-loaded, and the downstream tool linkage is a practical addition. Every word earns its place.
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 parameterless list tool with an output schema and annotations declaring read-only and closed-world behavior, the description provides the key information: what it returns, and why it matters (agency IDs for other tools). Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing to describe. The schema is empty and coverage is 100% vacuously. Per the rubric, baseline for 0 parameters is 4, and the description does not need to compensate for any parameter documentation gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action ('List all transit agencies') and resource scope ('served by this OneBusAway instance'). It also specifies the return fields (IDs, names, contact info, timezone, coverage center), which distinguishes it from any sibling that might return agency data with different scope. No ambiguity.
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 explicitly notes that agency IDs are needed for two downstream tools, implying when to use this tool (prior to those). It does not mention alternatives because there are none among siblings that list agencies. While it doesn't explicitly say 'use this when you need a list of agencies,' the context is clear and useful for an agent planning a sequence of calls.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
onebusaway_list_routes_for_agencyList Routes for AgencyARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| agencyId | Yes | Agency ID (e.g. "1" for Metro Transit, "40" for Sound Transit). Use onebusaway_list_agencies to discover IDs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| count | No | Number of routes returned for this agency. |
| error | No | Present when the call failed. Absent on success. |
| notice | No | Guidance when no routes were found — verify the agency ID with onebusaway_list_agencies. |
| routes | No | All routes operated by this agency. |
| agencyId | No | Agency ID queried. |
| limitExceeded | No | True if the upstream capped the route list — some routes were omitted. This endpoint has no pagination to retrieve them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, and the description reinforces this by describing a list operation with no side effects. It adds useful behavioral detail beyond annotations by specifying the exact return fields ('route IDs, short names, and descriptions') and the full-scope nature ('all routes'). No contradictions with annotations; the behavior is consistent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four short sentences with no filler. It leads with the core action, then return values, then usage context, then parameter source. Every sentence serves a purpose, and the structure is logical and efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one required parameter), the presence of an output schema, and annotations that cover read-only behavior, the description addresses everything an agent needs: what it lists, what it returns, when to use it, and where to get the parameter. No critical information is missing.
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%, and the parameter description in the schema already includes examples and guidance ('Use onebusaway_list_agencies to discover IDs'). The tool description repeats the same advice without adding new meaning, so it does not go beyond what the schema provides. Baseline of 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?
The description states a specific verb ('List'), a resource ('routes operated by an agency'), and the returned data ('route IDs, short names, and descriptions'). It clearly distinguishes this tool from siblings like search_routes and find_routes by emphasizing the full-service enumeration scope, leaving no ambiguity about what it does.
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 explicitly says 'Use to enumerate an agency's full service before searching for a specific route,' providing clear context for when to call it. It also directs the user to onebusaway_list_agencies for discovering agencyId. However, it does not explicitly name alternatives or state when NOT to use it (e.g., when you already know the route), so it stops short of a perfect 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
onebusaway_search_routesSearch Routes by Name or NumberARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Route name or number (e.g. "44", "Link", or "RapidRide"). | |
| maxCount | No | Maximum number of results to return. A positive integer, at most 100. Defaults to 10. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The maxCount limit applied to truncated results. |
| count | No | Number of routes returned. |
| error | No | Present when the call failed. Absent on success. |
| query | No | Route name/number query sent to the API. |
| shown | No | Number of routes returned when results were truncated. |
| notice | No | Guidance when no routes matched — e.g. try onebusaway_find_routes with coordinates, or onebusaway_list_routes_for_agency. |
| routes | No | Routes matching the search query. |
| truncated | No | True when matching routes exceeded maxCount. |
| limitExceeded | No | True if more routes match than were returned; raise maxCount or refine the query to see all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotation readOnlyHint=true already covers the safety profile. The description adds that it returns matching routes with IDs, which is a basic behavioral trait. It does not disclose other behaviors like pagination, result ordering, or error handling, and since annotations already declare read-only, the description is not heavily burdened. A score of 3 reflects adequate but not rich behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the core purpose ('Search for routes by name or number') followed by a concise usage note. There is zero waste and every word adds value. It is efficiently structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (2 params, clear output schema exists), the description covers the essential context: the tool resolves a short name to an ID and pairs with specific follow-up tools. It does not explain the output format, but that is provided by the output schema. The description is complete for an agent to decide when and how to use it.
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 well documented. The description adds a concrete example '44' and mentions 'route short name', which are also present in the schema. It does not provide new semantic meaning beyond the schema, so the baseline of 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?
The description states the verb 'Search' and the resource 'routes by name or number', and it clearly indicates the purpose: to resolve a route short name to a route ID for further lookups. However, it does not explicitly differentiate from the sibling tool 'onebusaway_find_routes', which may overlap in function. It is specific and actionable, but lacks explicit sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit guidance on when to use this tool: 'Use to resolve a route short name (e.g. "44") to a route ID for schedule or vehicle lookups'. It names the downstream tools (onebusaway_get_vehicles, onebusaway_get_schedule_for_route) that benefit from this resolution. However, it does not mention when not to use it or present alternatives such as find_routes, so it 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.
onebusaway_search_stopsSearch Stops by Name or CodeARead-onlyInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Stop name fragment or stop code (e.g. "University Way" or "75403"). | |
| maxCount | No | Maximum number of results to return. A positive integer, at most 100. Defaults to 10. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The maxCount limit applied to truncated results. |
| count | No | Number of stops returned. |
| error | No | Present when the call failed. Absent on success. |
| query | No | Search query sent to the API. |
| shown | No | Number of stops returned when results were truncated. |
| stops | No | Stops matching the search query. |
| notice | No | Guidance when no stops matched — e.g. try a different name fragment or use onebusaway_find_stops with coordinates. |
| truncated | No | True when matching stops exceeded maxCount. |
| limitExceeded | No | True if more stops match than were returned; raise maxCount or refine the query to see all. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the agent knows this is a safe read operation. The description adds that it returns IDs and coordinates, which is helpful context, but does not disclose any additional behavioral traits such as rate limits, ordering, or edge cases. With annotations covering safety, the extra value is moderate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no fluff. It front-loads the core function, then the use case. Every word earns its place, making it efficient for an agent to parse quickly.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the presence of an output schema (which presumably defines the return structure), the description doesn't need to detail return fields beyond mentioning IDs and coordinates. The required parameter and optional maxCount are clearly defined in the schema. The description provides context for why an agent would call this tool, which is sufficient for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers both parameters fully (100% coverage), with descriptions for 'query' noting it accepts a name fragment or code, and for 'maxCount' including default and limits. The tool description adds no further semantics beyond what the schema already provides, so a baseline score of 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?
The description states a clear verb ('Search'), a specific resource ('stops'), and the distinguishing scope ('by name or code'). It also specifies what is returned ('matching stops with IDs and coordinates'), making it easy to differentiate from other search tools like onebusaway_search_routes.
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 explicitly tells when to use the tool: 'Use to resolve a human-readable stop name or number to a stop ID for arrivals lookups with onebusaway_get_arrivals.' This provides a concrete use case and implies the tool is for obtaining stop IDs, though it does not explicitly mention alternatives or when not to use it.
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. Dates show when Glama detected each change.
15 tool updates
- Changed
onebusaway_find_routes6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "routes", + "limitExceeded", + "count" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode.", + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "routes", - "limitExceeded", - "count" -]
- Changed
onebusaway_find_stops6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "stops", + "limitExceeded", + "count" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode.", + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "stops", - "limitExceeded", - "count" -]
- Changed
onebusaway_get_alert6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "id", + "summary", + "description", + "reason", + "severity", + "consequenceMessage", + "affects", + "consequences", + "activeWindows", + "url" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `situation_not_found`: Situation ID does not exist on this instance. Other values are possible when a failure originates below the handler.", + "examples": [ + "situation_not_found" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "id", - "summary", - "description", - "reason", - "severity", - "consequenceMessage", - "affects", - "consequences", - "activeWindows", - "url" -]
- Changed
onebusaway_get_arrivals6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "stopId", + "stopName", + "currentTime", + "arrivals", + "situations", + "queriedStop", + "count", + "windowMinutes" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `stop_not_found`: Stop ID does not exist on this instance. `rate_limited`: API returned a rate limit response. Other values are possible when a failure originates below the handler.", + "examples": [ + "stop_not_found", + "rate_limited" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "stopId", - "stopName", - "currentTime", - "arrivals", - "situations", - "queriedStop", - "count", - "windowMinutes" -]
- Changed
onebusaway_get_block6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "blockId", + "activeServiceIds", + "inactiveServiceIds", + "trips" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `block_not_found`: Block ID does not exist on this instance. Other values are possible when a failure originates below the handler.", + "examples": [ + "block_not_found" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "blockId", - "activeServiceIds", - "inactiveServiceIds", - "trips" -]
- Changed
onebusaway_get_route6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "id", + "shortName", + "longName", + "description", + "agencyId", + "agencyName", + "type", + "color", + "url" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `route_not_found`: Route ID does not exist on this instance. Other values are possible when a failure originates below the handler.", + "examples": [ + "route_not_found" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "id", - "shortName", - "longName", - "description", - "agencyId", - "agencyName", - "type", - "color", - "url" -]
- Changed
onebusaway_get_schedule_for_route6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "routeId", + "routeShortName", + "serviceDateMs", + "trips", + "queriedRoute", + "tripCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `route_not_found`: Route ID does not exist on this instance. Other values are possible when a failure originates below the handler.", + "examples": [ + "route_not_found" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "routeId", - "routeShortName", - "serviceDateMs", - "trips", - "queriedRoute", - "tripCount" -]
- Changed
onebusaway_get_schedule_for_stop6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "stopId", + "stopName", + "serviceDateMs", + "routes", + "queriedStop", + "routeCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `stop_not_found`: Stop ID does not exist on this instance. Other values are possible when a failure originates below the handler.", + "examples": [ + "stop_not_found" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "stopId", - "stopName", - "serviceDateMs", - "routes", - "queriedStop", - "routeCount" -]
- Changed
onebusaway_get_stop6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "id", + "code", + "name", + "lat", + "lon", + "direction", + "routeIds", + "wheelchairBoarding" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `stop_not_found`: Stop ID does not exist on this instance. Other values are possible when a failure originates below the handler.", + "examples": [ + "stop_not_found" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "id", - "code", - "name", - "lat", - "lon", - "direction", - "routeIds", - "wheelchairBoarding" -]
- Changed
onebusaway_get_trip6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "tripId", + "routeShortName", + "tripHeadsign", + "blockId", + "status", + "schedule", + "situations" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `trip_not_found`: Trip ID not found or not active for the service date. Other values are possible when a failure originates below the handler.", + "examples": [ + "trip_not_found" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "tripId", - "routeShortName", - "tripHeadsign", - "blockId", - "status", - "schedule", - "situations" -]
- Changed
onebusaway_get_vehicles6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "vehicles", + "limitExceeded", + "agencyId", + "count" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `agency_not_found`: Agency ID does not exist on this instance. Other values are possible when a failure originates below the handler.", + "examples": [ + "agency_not_found" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "vehicles", - "limitExceeded", - "agencyId", - "count" -]
- Changed
onebusaway_list_agencies6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "agencies", + "limitExceeded", + "count" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode.", + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "agencies", - "limitExceeded", - "count" -]
- Changed
onebusaway_list_routes_for_agency6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "routes", + "limitExceeded", + "agencyId", + "count" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `agency_not_found`: Agency ID does not exist on this instance. Other values are possible when a failure originates below the handler.", + "examples": [ + "agency_not_found" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "routes", - "limitExceeded", - "agencyId", - "count" -]
- Changed
onebusaway_search_routes9 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "routes", + "limitExceeded", + "query", + "count" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / capAdded value: +{ + "description": "The maxCount limit applied to truncated results.", + "type": "number" +} - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `endpoint_unavailable`: The search/route endpoint returns 404 on this OBA instance (e.g. Puget Sound). Other values are possible when a failure originates below the handler.", + "examples": [ + "endpoint_unavailable" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - added
Output schema / properties / shownAdded value: +{ + "description": "Number of routes returned when results were truncated.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when matching routes exceeded maxCount.", + "type": "boolean" +} - removed
Output schema / requiredRemoved value: -[ - "routes", - "limitExceeded", - "query", - "count" -]
- Changed
onebusaway_search_stops9 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "stops", + "limitExceeded", + "query", + "count" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / capAdded value: +{ + "description": "The maxCount limit applied to truncated results.", + "type": "number" +} - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode.", + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - added
Output schema / properties / shownAdded value: +{ + "description": "Number of stops returned when results were truncated.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "True when matching stops exceeded maxCount.", + "type": "boolean" +} - removed
Output schema / requiredRemoved value: -[ - "stops", - "limitExceeded", - "query", - "count" -]
7 tool updates
- Changed
onebusaway_find_routes13 fields changed- changed
Input schema / properties / lat / descriptionPrevious value: -"Latitude of the search center."New value: +"Latitude of the search center, in [-90, 90]." - added
Input schema / properties / lat / maximumAdded value: +90 - added
Input schema / properties / lat / minimumAdded value: +-90 - added
Input schema / properties / latSpanAdded value: +{ + "description": "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.", + "exclusiveMinimum": 0, + "type": "number" +} - changed
Input schema / properties / lon / descriptionPrevious value: -"Longitude of the search center."New value: +"Longitude of the search center, in [-180, 180]." - added
Input schema / properties / lon / maximumAdded value: +180 - added
Input schema / properties / lon / minimumAdded value: +-180 - added
Input schema / properties / lonSpanAdded value: +{ + "description": "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.", + "exclusiveMinimum": 0, + "type": "number" +} - changed
Input schema / properties / radius / descriptionPrevious value: -"Search radius in meters. Defaults to 500m."New value: +"Search radius in meters. Must be positive; capped at 1600m. Defaults to 500m. Ignored when latSpan and lonSpan are both set." - added
Input schema / properties / radius / exclusiveMinimumAdded value: +0 - added
Input schema / properties / radius / maximumAdded value: +1600 - added
Output schema / properties / limitExceededAdded value: +{ + "description": "True if more routes exist beyond the returned set; narrow the radius or set latSpan/lonSpan to see all.", + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "routes", - "count" -]New value: +[ + "routes", + "limitExceeded", + "count" +]
- Changed
onebusaway_find_stops9 fields changed- changed
Input schema / properties / lat / descriptionPrevious value: -"Latitude of the search center."New value: +"Latitude of the search center, in [-90, 90]." - added
Input schema / properties / lat / maximumAdded value: +90 - added
Input schema / properties / lat / minimumAdded value: +-90 - changed
Input schema / properties / lon / descriptionPrevious value: -"Longitude of the search center."New value: +"Longitude of the search center, in [-180, 180]." - added
Input schema / properties / lon / maximumAdded value: +180 - added
Input schema / properties / lon / minimumAdded value: +-180 - changed
Input schema / properties / radius / descriptionPrevious value: -"Search radius in meters. Defaults to 300m. Max ~1600m before results degrade."New value: +"Search radius in meters. Must be positive; capped at 1600m, beyond which results degrade. Defaults to 300m." - added
Input schema / properties / radius / exclusiveMinimumAdded value: +0 - added
Input schema / properties / radius / maximumAdded value: +1600
- Changed
onebusaway_get_vehicles2 fields changed- added
Output schema / properties / limitExceededAdded value: +{ + "description": "True if the upstream capped the vehicle list — some vehicles were omitted. This endpoint has no pagination to retrieve them.", + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "vehicles", - "agencyId", - "count" -]New value: +[ + "vehicles", + "limitExceeded", + "agencyId", + "count" +]
- Changed
onebusaway_list_agencies2 fields changed- added
Output schema / properties / limitExceededAdded value: +{ + "description": "True if the upstream capped the agency list — some agencies were omitted. This endpoint has no pagination to retrieve them.", + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "agencies", - "count" -]New value: +[ + "agencies", + "limitExceeded", + "count" +]
- Changed
onebusaway_list_routes_for_agency2 fields changed- added
Output schema / properties / limitExceededAdded value: +{ + "description": "True if the upstream capped the route list — some routes were omitted. This endpoint has no pagination to retrieve them.", + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "routes", - "agencyId", - "count" -]New value: +[ + "routes", + "limitExceeded", + "agencyId", + "count" +]
- Changed
onebusaway_search_routes6 fields changed- changed
Input schema / properties / maxCount / descriptionPrevious value: -"Maximum number of results to return. Defaults to 10."New value: +"Maximum number of results to return. A positive integer, at most 100. Defaults to 10." - added
Input schema / properties / maxCount / exclusiveMinimumAdded value: +0 - added
Input schema / properties / maxCount / maximumAdded value: +100 - changed
Input schema / properties / maxCount / typePrevious value: -"number"New value: +"integer" - added
Output schema / properties / limitExceededAdded value: +{ + "description": "True if more routes match than were returned; raise maxCount or refine the query to see all.", + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "routes", - "query", - "count" -]New value: +[ + "routes", + "limitExceeded", + "query", + "count" +]
- Changed
onebusaway_search_stops6 fields changed- changed
Input schema / properties / maxCount / descriptionPrevious value: -"Maximum number of results to return. Defaults to 10."New value: +"Maximum number of results to return. A positive integer, at most 100. Defaults to 10." - added
Input schema / properties / maxCount / exclusiveMinimumAdded value: +0 - added
Input schema / properties / maxCount / maximumAdded value: +100 - changed
Input schema / properties / maxCount / typePrevious value: -"number"New value: +"integer" - added
Output schema / properties / limitExceededAdded value: +{ + "description": "True if more stops match than were returned; raise maxCount or refine the query to see all.", + "type": "boolean" +} - changed
Output schema / requiredPrevious value: -[ - "stops", - "query", - "count" -]New value: +[ + "stops", + "limitExceeded", + "query", + "count" +]
1 tool update
- Changed
onebusaway_get_trip2 fields changed- added
Output schema / properties / blockIdAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "description": "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." +} - changed
Output schema / requiredPrevious value: -[ - "tripId", - "routeShortName", - "tripHeadsign", - "status", - "schedule", - "situations" -]New value: +[ + "tripId", + "routeShortName", + "tripHeadsign", + "blockId", + "status", + "schedule", + "situations" +]
3 tool updates
- Added
onebusaway_get_alert - Added
onebusaway_get_block - Changed
onebusaway_list_routes_for_agency1 field changed- added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance when no routes were found — verify the agency ID with onebusaway_list_agencies.", + "type": "string" +}
10 tool updates
- Changed
onebusaway_find_routes4 fields changed- added
Output schema / properties / countAdded value: +{ + "description": "Number of routes returned.", + "type": "number" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance when no routes matched — e.g. try a larger radius or different query.", + "type": "string" +} - added
Output schema / properties / queryAdded value: +{ + "description": "Route name/number filter applied to the search, if any.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "routes" -]New value: +[ + "routes", + "count" +]
- Changed
onebusaway_find_stops4 fields changed- added
Output schema / properties / countAdded value: +{ + "description": "Number of stops returned.", + "type": "number" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance when results are empty or truncated — e.g. how to narrow the radius or verify the stop code.", + "type": "string" +} - added
Output schema / properties / queryAdded value: +{ + "description": "Stop code filter applied to the search, if any.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "stops", - "limitExceeded" -]New value: +[ + "stops", + "limitExceeded", + "count" +]
- Changed
onebusaway_get_arrivals5 fields changed- added
Output schema / properties / countAdded value: +{ + "description": "Number of arrivals in the time window.", + "type": "number" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance when no arrivals were found — e.g. try expanding the time window or check for service alerts.", + "type": "string" +} - added
Output schema / properties / queriedStopAdded value: +{ + "description": "Stop ID queried.", + "type": "string" +} - added
Output schema / properties / windowMinutesAdded value: +{ + "additionalProperties": false, + "description": "Time window used for the arrivals query.", + "properties": { + "after": { + "description": "Minutes after current time included.", + "type": "number" + }, + "before": { + "description": "Minutes before current time included.", + "type": "number" + } + }, + "required": [ + "before", + "after" + ], + "type": "object" +} - changed
Output schema / requiredPrevious value: -[ - "stopId", - "stopName", - "currentTime", - "arrivals", - "situations" -]New value: +[ + "stopId", + "stopName", + "currentTime", + "arrivals", + "situations", + "queriedStop", + "count", + "windowMinutes" +]
- Changed
onebusaway_get_schedule_for_route5 fields changed- added
Output schema / properties / dateAdded value: +{ + "description": "Date parameter used for the schedule request, if specified.", + "type": "string" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance when no trips were found — e.g. no service on weekends or holiday schedule in effect.", + "type": "string" +} - added
Output schema / properties / queriedRouteAdded value: +{ + "description": "Route ID queried.", + "type": "string" +} - added
Output schema / properties / tripCountAdded value: +{ + "description": "Number of trips for this route on this date.", + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "routeId", - "routeShortName", - "serviceDateMs", - "trips" -]New value: +[ + "routeId", + "routeShortName", + "serviceDateMs", + "trips", + "queriedRoute", + "tripCount" +]
- Changed
onebusaway_get_schedule_for_stop5 fields changed- added
Output schema / properties / dateAdded value: +{ + "description": "Date parameter used for the schedule request, if specified.", + "type": "string" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance when no routes were found — e.g. no service on weekends or holiday schedule in effect.", + "type": "string" +} - added
Output schema / properties / queriedStopAdded value: +{ + "description": "Stop ID queried.", + "type": "string" +} - added
Output schema / properties / routeCountAdded value: +{ + "description": "Number of routes with departures from this stop on this date.", + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "stopId", - "stopName", - "serviceDateMs", - "routes" -]New value: +[ + "stopId", + "stopName", + "serviceDateMs", + "routes", + "queriedStop", + "routeCount" +]
- Changed
onebusaway_get_vehicles5 fields changed- added
Output schema / properties / agencyIdAdded value: +{ + "description": "Agency ID queried.", + "type": "string" +} - added
Output schema / properties / countAdded value: +{ + "description": "Number of vehicles returned after any route filter.", + "type": "number" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance when no vehicles were found — e.g. the route may not be currently active, or the agency may not have real-time data.", + "type": "string" +} - added
Output schema / properties / routeIdAdded value: +{ + "description": "Route ID filter applied client-side, if any.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "vehicles" -]New value: +[ + "vehicles", + "agencyId", + "count" +]
- Changed
onebusaway_list_agencies3 fields changed- added
Output schema / properties / countAdded value: +{ + "description": "Number of transit agencies returned.", + "type": "number" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance when no agencies were returned.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "agencies" -]New value: +[ + "agencies", + "count" +]
- Changed
onebusaway_list_routes_for_agency3 fields changed- added
Output schema / properties / agencyIdAdded value: +{ + "description": "Agency ID queried.", + "type": "string" +} - added
Output schema / properties / countAdded value: +{ + "description": "Number of routes returned for this agency.", + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "routes" -]New value: +[ + "routes", + "agencyId", + "count" +]
- Changed
onebusaway_search_routes4 fields changed- added
Output schema / properties / countAdded value: +{ + "description": "Number of routes returned.", + "type": "number" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance when no routes matched — e.g. try onebusaway_find_routes with coordinates, or onebusaway_list_routes_for_agency.", + "type": "string" +} - added
Output schema / properties / queryAdded value: +{ + "description": "Route name/number query sent to the API.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "routes" -]New value: +[ + "routes", + "query", + "count" +]
- Changed
onebusaway_search_stops4 fields changed- added
Output schema / properties / countAdded value: +{ + "description": "Number of stops returned.", + "type": "number" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance when no stops matched — e.g. try a different name fragment or use onebusaway_find_stops with coordinates.", + "type": "string" +} - added
Output schema / properties / queryAdded value: +{ + "description": "Search query sent to the API.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "stops" -]New value: +[ + "stops", + "query", + "count" +]
13 tool updates
- First observed
onebusaway_find_routes - First observed
onebusaway_find_stops - First observed
onebusaway_get_arrivals - First observed
onebusaway_get_route - First observed
onebusaway_get_schedule_for_route - First observed
onebusaway_get_schedule_for_stop - First observed
onebusaway_get_stop - First observed
onebusaway_get_trip - First observed
onebusaway_get_vehicles - First observed
onebusaway_list_agencies - First observed
onebusaway_list_routes_for_agency - First observed
onebusaway_search_routes - First observed
onebusaway_search_stops
Frequently Asked Questions
Claiming proves that you control a remote MCP connector. It does not move, proxy, or interrupt the server.
Open the connector listing, choose Claim ownership, and sign in to Glama.
Complete one verification method:
GitHub identity — fastest for official registry listings. For a namespace such as
io.github.alice/server, link the matching GitHub user, then choose Claim with GitHub. An organization namespace such asio.github.acme/serveralso needs that organization to have installed the Glama AI GitHub App and approved its permissions, because GitHub discloses organization membership only to apps it has installed. Use HTTP or DNS when it has not.HTTP challenge — works when you can deploy a public file. Generate a token, publish the exact JSON Glama shows at
/.well-known/glama.jsonon the same origin as the connector, then choose Check HTTP challenge.DNS challenge — works when you control DNS but cannot change the server. Generate a token, create the exact TXT record Glama shows, wait for it to propagate, then choose Check DNS challenge.
After verification, Glama sends a confirmation email and gives you access to listing details, thumbnails, health checks, and analytics. Keep the HTTP file or DNS record in place: Glama periodically checks it and ownership remains verified while the token is discoverable.
The HTTP ownership file has this structure:
{
"$schema": "https://glama.ai/mcp/schemas/connector.json",
"claim": "glama_claim_..."
}Claim tokens are opaque, stable, and bound to the signed-in Glama account. They contain no email address or other personal information. If Glama can no longer discover a verified HTTP or DNS token, it starts a seven-day grace period before removing claim-based access. Restore the same token during that period to keep ownership verified. Never publish an email address, Glama session token, GitHub token, or connector credential as ownership proof.
If verification fails, confirm that you copied the current token exactly. The HTTP file must be public, return valid JSON with a successful HTTP response, and stay on the connector's origin. DNS changes may need more time to propagate. A claim cannot transfer to a different origin or hostname: if the connector target changes, Glama starts the grace period and the new target must be claimed separately after the previous claim is released.
For a connector linked to the official MCP Registry, registry updates continue to replace its name, description, and URL by default. After claiming, open Manage connector and enable Use Glama listing details as the source of truth if edits made on Glama should be preserved. Categories and thumbnails are always managed on Glama; registry linkage and technical connection settings continue to sync.
Control your server's listing on Glama, including description and metadata
Access analytics and receive server usage reports
Get monitoring and health status updates for your server
Feature your server to boost visibility and reach more users
To improve your MCP server's ranking:
Claim ownership of the server listing
Complete the server profile with an accurate description and thumbnail
Provide a test profile so Glama can connect to and evaluate the server
Keep tool definitions clear and complete to earn a high Tool Definition Quality Score (TDQS)
Route real usage through the Glama Gateway; more recorded successful server uses also improve the ranking
For users:
Full audit trail – every tool call is logged with inputs and outputs for compliance and debugging
Granular tool control – enable or disable individual tools per connector to limit what your AI agents can do
Centralized credential management – store and rotate API keys and OAuth tokens in one place
Change alerts – get notified when a connector changes its schema, adds or removes tools, or updates tool definitions, so nothing breaks silently
For server owners:
Proven adoption – public usage metrics on your listing show real-world traction and build trust with prospective users
Tool-level analytics – see which tools are being used most, helping you prioritize development and documentation
Direct user feedback – users can report issues and suggest improvements through the listing, giving you a channel you would not have otherwise
The connector status is unhealthy when Glama is unable to successfully connect to the server. This can happen for several reasons:
The server is experiencing an outage
The URL of the server is wrong
Credentials required to access the server are missing or invalid
If you are the owner of this MCP connector and would like to make modifications to the listing, including providing test credentials for accessing the server, please contact support@glama.ai.
Discussions
No comments yet. Be the first to start the discussion!
Related MCP Connectors
Read-only public transit departures, stop search, and city coverage for bus and train users.
Washington Metro real-time + static rail/bus data. Free key required.
Real-time SF Muni departures, routes, alerts, vehicle positions, and schedules.
Get real-time NYC bus arrivals, live vehicle locations, and service alerts. Plan trips between any…
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables real-time access to Boston MBTA transit data (subway, bus, commuter rail, etc.) via the MBTA v3 API.5MIT
- AlicenseNot gradedqualityCmaintenanceEnables real-time Chicago Transit Authority train and bus tracking, including arrivals, positions, and predictions for CTA 'L' trains and buses.14MIT
- FlicenseNot gradedqualityCmaintenanceEnables querying real-time bike-share feed data, including station availability, nearby bikes and docks, route checks, alerts, and system information across many cities.-
- AlicenseNot gradedqualityCmaintenanceEnables querying global transit data including agencies, routes, stops, and departures through a GTFS aggregator.2MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.
TDQS
Every tool targets a distinct operation: find_* for location-based search, search_* for text-based search, get_* for fetching by ID, list_* for enumeration, and get_arrivals for real-time vs get_schedule_for_* for scheduled data. Even similar pairs like find_routes/search_routes are clearly differentiated by their search mode.
All tools follow a uniform `onebusaway_` prefix followed by a consistent verb pattern: find (location search), search (text search), get (retrieve by ID), list (enumerate), plus specific get_schedule_for_route/stop. Naming is entirely snake_case and logically structured.
15 tools cover the full scope of a transit API without bloat: discovery (find/search), details (get), enumeration (list), real-time (arrivals/vehicles/trip), schedules, and alerts. Each tool serves a distinct purpose and fits within a typical well-scoped server.
The surface covers the primary travel workflows: finding routes/stops by location or name, retrieving full details, real-time arrivals/trip/vehicle tracking, scheduled departures for both routes and stops, service alerts, and agency enumeration. There are no obvious dead ends; each lookup provides IDs for follow-up queries.