Skip to main content
Glama

Server Details

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

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
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 tools
onebusaway_find_routesFind Routes Near LocationB
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude of the search center, in [-90, 90].
lonYesLongitude of the search center, in [-180, 180].
queryNoFilter by route name or number (e.g. "44" or "Link Light Rail").
radiusNoSearch radius in meters. Must be positive; capped at 1600m. Defaults to 500m. Ignored when latSpan and lonSpan are both set.
latSpanNoOptional bounding-box height in degrees, as an alternative to radius. Takes effect only when lonSpan is also set, in which case radius is ignored.
lonSpanNoOptional 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

ParametersJSON Schema
NameRequiredDescription
countNoNumber of routes returned.
errorNoPresent when the call failed. Absent on success.
queryNoRoute name/number filter applied to the search, if any.
noticeNoGuidance when no routes matched — e.g. try a larger radius or different query.
routesNoRoutes found near the specified location.
limitExceededNoTrue if more routes exist beyond the returned set; narrow the radius or set latSpan/lonSpan to see all.

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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 LocationA
Read-only
Inspect

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").

ParametersJSON Schema
NameRequiredDescriptionDefault
latYesLatitude of the search center, in [-90, 90].
lonYesLongitude of the search center, in [-180, 180].
queryNoOptional stop code filter (the number printed on the stop sign, e.g. "75403"). When provided, returns only stops matching this code within the radius.
radiusNoSearch radius in meters. Must be positive; capped at 1600m, beyond which results degrade. Defaults to 300m.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNoNumber of stops returned.
errorNoPresent when the call failed. Absent on success.
queryNoStop code filter applied to the search, if any.
stopsNoStops within the search radius.
noticeNoGuidance when results are empty or truncated — e.g. how to narrow the radius or verify the stop code.
limitExceededNoTrue if more stops exist beyond the returned set; narrow the radius to see all.

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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 DetailA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
situationIdYesSituation/alert ID from onebusaway_get_arrivals (situations[].id or arrivals[].situationIds[]).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoSituation ID.
urlNoURL for more information about this alert, or null.
errorNoPresent when the call failed. Absent on success.
reasonNoReason code from TPEG: equipmentReason, environmentReason, personnelReason, miscellaneousReason, securityAlert. Null when not provided.
affectsNoStops, routes, trips, or agencies affected by this alert.
summaryNoShort summary of the service alert.
severityNoSeverity level as reported by the agency, or null.
descriptionNoLonger description of the alert, or null.
consequencesNoOperational consequences of this alert.
activeWindowsNoTime windows when this alert is active.
consequenceMessageNoHuman-readable consequence description (e.g. "Detour in effect"), or null.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ArrivalsA
Read-only
Inspect

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").

ParametersJSON Schema
NameRequiredDescriptionDefault
stopIdYesAgency-prefixed stop ID (e.g. "1_75403" for Metro Transit stop 75403). Use onebusaway_find_stops or onebusaway_search_stops to discover IDs.
minutesAfterNoInclude arrivals expected within the next N minutes. Defaults to 35.
minutesBeforeNoInclude arrivals that departed up to this many minutes ago. Defaults to 5.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNoNumber of arrivals in the time window.
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when no arrivals were found — e.g. try expanding the time window or check for service alerts.
stopIdNoThe queried stop ID.
arrivalsNoArrivals and departures at this stop within the requested time window.
stopNameNoStop name.
situationsNoActive service alerts referenced by arrivals at this stop.
currentTimeNoServer time as Unix milliseconds, for computing countdown timers.
queriedStopNoStop ID queried.
windowMinutesNoTime window used for the arrivals query.

TDQS

A4/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's 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.

Usage Guidelines3/5

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 ScheduleA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
blockIdYesBlock ID from a trip record. Obtain a tripId from onebusaway_get_arrivals, then call onebusaway_get_trip to get the blockId.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
tripsNoAll trips in this block in order.
blockIdNoBlock ID.
activeServiceIdsNoService calendar IDs active for this block today.
inactiveServiceIdsNoService calendar IDs not active for this block today.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 DetailsA
Read-only
Inspect

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").

ParametersJSON Schema
NameRequiredDescriptionDefault
routeIdYesAgency-prefixed route ID (e.g. "1_100259"). Use onebusaway_find_routes or onebusaway_search_routes to discover IDs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoAgency-prefixed route ID.
urlNoAgency schedule page URL, or null.
typeNoGTFS route type: 0=tram, 1=subway, 2=rail, 3=bus, 4=ferry, 5=cable_car.
colorNoRoute brand color hex (without #), or null.
errorNoPresent when the call failed. Absent on success.
agencyIdNoAgency ID that operates this route.
longNameNoFull route name.
shortNameNoThe number or short name displayed on vehicles (e.g. "44").
agencyNameNoAgency name that operates this route.
descriptionNoRoute description.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 ScheduleA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoISO 8601 date (e.g. "2026-05-23"). Defaults to today.
routeIdYesAgency-prefixed route ID (e.g. "1_100259"). Use onebusaway_find_routes or onebusaway_search_routes to discover IDs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateNoDate parameter used for the schedule request, if specified.
errorNoPresent when the call failed. Absent on success.
tripsNoAll trips for this route on this date, with their stop sequences.
noticeNoGuidance when no trips were found — e.g. no service on weekends or holiday schedule in effect.
routeIdNoThe queried route ID.
tripCountNoNumber of trips for this route on this date.
queriedRouteNoRoute ID queried.
serviceDateMsNoService date as Unix milliseconds.
routeShortNameNoRoute short name.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 ScheduleA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoISO 8601 date (e.g. "2026-05-23"). Defaults to today in the agency's timezone.
stopIdYesAgency-prefixed stop ID (e.g. "1_75403"). Use onebusaway_find_stops or onebusaway_search_stops to discover IDs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
dateNoDate parameter used for the schedule request, if specified.
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when no routes were found — e.g. no service on weekends or holiday schedule in effect.
routesNoAll routes with departures from this stop on this date.
stopIdNoThe queried stop ID.
stopNameNoStop name.
routeCountNoNumber of routes with departures from this stop on this date.
queriedStopNoStop ID queried.
serviceDateMsNoService date as Unix milliseconds (start of service day).

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 DetailsA
Read-only
Inspect

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
stopIdYesAgency-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

ParametersJSON Schema
NameRequiredDescription
idNoAgency-prefixed stop ID.
latNoLatitude of the stop.
lonNoLongitude of the stop.
codeNoThe stop code printed on the sign.
nameNoStop name.
errorNoPresent when the call failed. Absent on success.
routeIdsNoIDs of routes that serve this stop. Use with onebusaway_get_arrivals or onebusaway_get_schedule_for_stop.
directionNoCompass direction of travel at this stop (e.g. "NW").
wheelchairBoardingNoWheelchair boarding status.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 StatusA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tripIdYesTrip ID from an arrivals response or schedule lookup.
serviceDateMsNoService date as Unix milliseconds (midnight local time). Only needed for trips from a previous service day. Omit to use today.
includeScheduleNoWhether to include the full stop sequence with times. Defaults to true.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
statusNoReal-time status of the trip.
tripIdNoThe queried trip ID.
blockIdNoBlock 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.
scheduleNoFull stop sequence with times, or null if includeSchedule=false.
situationsNoActive situation IDs affecting this trip.
tripHeadsignNoDestination sign text.
routeShortNameNoRoute short name (e.g. "44").

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: '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.

Usage Guidelines4/5

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 PositionsA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
routeIdNoOptional agency-prefixed route ID to filter results to one route. Filtering is client-side — all agency vehicles are fetched first.
agencyIdYesAgency ID (e.g. "1" for Metro Transit, "40" for Sound Transit). Use onebusaway_list_agencies to discover IDs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNoNumber of vehicles returned after any route filter.
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when no vehicles were found — e.g. the route may not be currently active, or the agency may not have real-time data.
routeIdNoRoute ID filter applied client-side, if any.
agencyIdNoAgency ID queried.
vehiclesNoActive vehicles for the agency, optionally filtered by route.
limitExceededNoTrue if the upstream capped the vehicle list — some vehicles were omitted. This endpoint has no pagination to retrieve them.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's 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.

Usage Guidelines4/5

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 AgenciesA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNoNumber of transit agencies returned.
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when no agencies were returned.
agenciesNoAll agencies served by this OneBusAway instance.
limitExceededNoTrue if the upstream capped the agency list — some agencies were omitted. This endpoint has no pagination to retrieve them.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's 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.

Usage Guidelines4/5

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 AgencyA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
agencyIdYesAgency ID (e.g. "1" for Metro Transit, "40" for Sound Transit). Use onebusaway_list_agencies to discover IDs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
countNoNumber of routes returned for this agency.
errorNoPresent when the call failed. Absent on success.
noticeNoGuidance when no routes were found — verify the agency ID with onebusaway_list_agencies.
routesNoAll routes operated by this agency.
agencyIdNoAgency ID queried.
limitExceededNoTrue if the upstream capped the route list — some routes were omitted. This endpoint has no pagination to retrieve them.

TDQS

A4.3/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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 NumberA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesRoute name or number (e.g. "44", "Link", or "RapidRide").
maxCountNoMaximum number of results to return. A positive integer, at most 100. Defaults to 10.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe maxCount limit applied to truncated results.
countNoNumber of routes returned.
errorNoPresent when the call failed. Absent on success.
queryNoRoute name/number query sent to the API.
shownNoNumber of routes returned when results were truncated.
noticeNoGuidance when no routes matched — e.g. try onebusaway_find_routes with coordinates, or onebusaway_list_routes_for_agency.
routesNoRoutes matching the search query.
truncatedNoTrue when matching routes exceeded maxCount.
limitExceededNoTrue if more routes match than were returned; raise maxCount or refine the query to see all.

TDQS

A3.8/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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

Given the tool's simplicity (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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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 CodeA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYesStop name fragment or stop code (e.g. "University Way" or "75403").
maxCountNoMaximum number of results to return. A positive integer, at most 100. Defaults to 10.

Output Schema

ParametersJSON Schema
NameRequiredDescription
capNoThe maxCount limit applied to truncated results.
countNoNumber of stops returned.
errorNoPresent when the call failed. Absent on success.
queryNoSearch query sent to the API.
shownNoNumber of stops returned when results were truncated.
stopsNoStops matching the search query.
noticeNoGuidance when no stops matched — e.g. try a different name fragment or use onebusaway_find_stops with coordinates.
truncatedNoTrue when matching stops exceeded maxCount.
limitExceededNoTrue if more stops match than were returned; raise maxCount or refine the query to see all.

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 15 tool updates
    • Changedonebusaway_find_routes6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "routes",
        +      "limitExceeded",
        +      "count"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "routes",
        -  "limitExceeded",
        -  "count"
        -]
    • Changedonebusaway_find_stops6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "stops",
        +      "limitExceeded",
        +      "count"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "stops",
        -  "limitExceeded",
        -  "count"
        -]
    • Changedonebusaway_get_alert6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "id",
        +      "summary",
        +      "description",
        +      "reason",
        +      "severity",
        +      "consequenceMessage",
        +      "affects",
        +      "consequences",
        +      "activeWindows",
        +      "url"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "id",
        -  "summary",
        -  "description",
        -  "reason",
        -  "severity",
        -  "consequenceMessage",
        -  "affects",
        -  "consequences",
        -  "activeWindows",
        -  "url"
        -]
    • Changedonebusaway_get_arrivals6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "stopId",
        +      "stopName",
        +      "currentTime",
        +      "arrivals",
        +      "situations",
        +      "queriedStop",
        +      "count",
        +      "windowMinutes"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "stopId",
        -  "stopName",
        -  "currentTime",
        -  "arrivals",
        -  "situations",
        -  "queriedStop",
        -  "count",
        -  "windowMinutes"
        -]
    • Changedonebusaway_get_block6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "blockId",
        +      "activeServiceIds",
        +      "inactiveServiceIds",
        +      "trips"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "blockId",
        -  "activeServiceIds",
        -  "inactiveServiceIds",
        -  "trips"
        -]
    • Changedonebusaway_get_route6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "id",
        +      "shortName",
        +      "longName",
        +      "description",
        +      "agencyId",
        +      "agencyName",
        +      "type",
        +      "color",
        +      "url"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "id",
        -  "shortName",
        -  "longName",
        -  "description",
        -  "agencyId",
        -  "agencyName",
        -  "type",
        -  "color",
        -  "url"
        -]
    • Changedonebusaway_get_schedule_for_route6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "routeId",
        +      "routeShortName",
        +      "serviceDateMs",
        +      "trips",
        +      "queriedRoute",
        +      "tripCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "routeId",
        -  "routeShortName",
        -  "serviceDateMs",
        -  "trips",
        -  "queriedRoute",
        -  "tripCount"
        -]
    • Changedonebusaway_get_schedule_for_stop6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "stopId",
        +      "stopName",
        +      "serviceDateMs",
        +      "routes",
        +      "queriedStop",
        +      "routeCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "stopId",
        -  "stopName",
        -  "serviceDateMs",
        -  "routes",
        -  "queriedStop",
        -  "routeCount"
        -]
    • Changedonebusaway_get_stop6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "id",
        +      "code",
        +      "name",
        +      "lat",
        +      "lon",
        +      "direction",
        +      "routeIds",
        +      "wheelchairBoarding"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "id",
        -  "code",
        -  "name",
        -  "lat",
        -  "lon",
        -  "direction",
        -  "routeIds",
        -  "wheelchairBoarding"
        -]
    • Changedonebusaway_get_trip6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "tripId",
        +      "routeShortName",
        +      "tripHeadsign",
        +      "blockId",
        +      "status",
        +      "schedule",
        +      "situations"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "tripId",
        -  "routeShortName",
        -  "tripHeadsign",
        -  "blockId",
        -  "status",
        -  "schedule",
        -  "situations"
        -]
    • Changedonebusaway_get_vehicles6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "vehicles",
        +      "limitExceeded",
        +      "agencyId",
        +      "count"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "vehicles",
        -  "limitExceeded",
        -  "agencyId",
        -  "count"
        -]
    • Changedonebusaway_list_agencies6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "agencies",
        +      "limitExceeded",
        +      "count"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "agencies",
        -  "limitExceeded",
        -  "count"
        -]
    • Changedonebusaway_list_routes_for_agency6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "routes",
        +      "limitExceeded",
        +      "agencyId",
        +      "count"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added 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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "routes",
        -  "limitExceeded",
        -  "agencyId",
        -  "count"
        -]
    • Changedonebusaway_search_routes9 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "routes",
        +      "limitExceeded",
        +      "query",
        +      "count"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The maxCount limit applied to truncated results.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / error
        Added 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"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Number of routes returned when results were truncated.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when matching routes exceeded maxCount.",
        +  "type": "boolean"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "routes",
        -  "limitExceeded",
        -  "query",
        -  "count"
        -]
    • Changedonebusaway_search_stops9 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "stops",
        +      "limitExceeded",
        +      "query",
        +      "count"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "The maxCount limit applied to truncated results.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / error
        Added 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"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Number of stops returned when results were truncated.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when matching stops exceeded maxCount.",
        +  "type": "boolean"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "stops",
        -  "limitExceeded",
        -  "query",
        -  "count"
        -]
  2. 7 tool updates
    • Changedonebusaway_find_routes13 fields changed
      • changedInput schema / properties / lat / description
        Previous value: -"Latitude of the search center."New value: +"Latitude of the search center, in [-90, 90]."
      • addedInput schema / properties / lat / maximum
        Added value: +90
      • addedInput schema / properties / lat / minimum
        Added value: +-90
      • addedInput schema / properties / latSpan
        Added 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"
        +}
      • changedInput schema / properties / lon / description
        Previous value: -"Longitude of the search center."New value: +"Longitude of the search center, in [-180, 180]."
      • addedInput schema / properties / lon / maximum
        Added value: +180
      • addedInput schema / properties / lon / minimum
        Added value: +-180
      • addedInput schema / properties / lonSpan
        Added 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"
        +}
      • changedInput schema / properties / radius / description
        Previous 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."
      • addedInput schema / properties / radius / exclusiveMinimum
        Added value: +0
      • addedInput schema / properties / radius / maximum
        Added value: +1600
      • addedOutput schema / properties / limitExceeded
        Added value: +{
        +  "description": "True if more routes exist beyond the returned set; narrow the radius or set latSpan/lonSpan to see all.",
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "routes",
        -  "count"
        -]New value: +[
        +  "routes",
        +  "limitExceeded",
        +  "count"
        +]
    • Changedonebusaway_find_stops9 fields changed
      • changedInput schema / properties / lat / description
        Previous value: -"Latitude of the search center."New value: +"Latitude of the search center, in [-90, 90]."
      • addedInput schema / properties / lat / maximum
        Added value: +90
      • addedInput schema / properties / lat / minimum
        Added value: +-90
      • changedInput schema / properties / lon / description
        Previous value: -"Longitude of the search center."New value: +"Longitude of the search center, in [-180, 180]."
      • addedInput schema / properties / lon / maximum
        Added value: +180
      • addedInput schema / properties / lon / minimum
        Added value: +-180
      • changedInput schema / properties / radius / description
        Previous 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."
      • addedInput schema / properties / radius / exclusiveMinimum
        Added value: +0
      • addedInput schema / properties / radius / maximum
        Added value: +1600
    • Changedonebusaway_get_vehicles2 fields changed
      • addedOutput schema / properties / limitExceeded
        Added value: +{
        +  "description": "True if the upstream capped the vehicle list — some vehicles were omitted. This endpoint has no pagination to retrieve them.",
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "vehicles",
        -  "agencyId",
        -  "count"
        -]New value: +[
        +  "vehicles",
        +  "limitExceeded",
        +  "agencyId",
        +  "count"
        +]
    • Changedonebusaway_list_agencies2 fields changed
      • addedOutput schema / properties / limitExceeded
        Added value: +{
        +  "description": "True if the upstream capped the agency list — some agencies were omitted. This endpoint has no pagination to retrieve them.",
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "agencies",
        -  "count"
        -]New value: +[
        +  "agencies",
        +  "limitExceeded",
        +  "count"
        +]
    • Changedonebusaway_list_routes_for_agency2 fields changed
      • addedOutput schema / properties / limitExceeded
        Added value: +{
        +  "description": "True if the upstream capped the route list — some routes were omitted. This endpoint has no pagination to retrieve them.",
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "routes",
        -  "agencyId",
        -  "count"
        -]New value: +[
        +  "routes",
        +  "limitExceeded",
        +  "agencyId",
        +  "count"
        +]
    • Changedonebusaway_search_routes6 fields changed
      • changedInput schema / properties / maxCount / description
        Previous 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."
      • addedInput schema / properties / maxCount / exclusiveMinimum
        Added value: +0
      • addedInput schema / properties / maxCount / maximum
        Added value: +100
      • changedInput schema / properties / maxCount / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / limitExceeded
        Added value: +{
        +  "description": "True if more routes match than were returned; raise maxCount or refine the query to see all.",
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "routes",
        -  "query",
        -  "count"
        -]New value: +[
        +  "routes",
        +  "limitExceeded",
        +  "query",
        +  "count"
        +]
    • Changedonebusaway_search_stops6 fields changed
      • changedInput schema / properties / maxCount / description
        Previous 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."
      • addedInput schema / properties / maxCount / exclusiveMinimum
        Added value: +0
      • addedInput schema / properties / maxCount / maximum
        Added value: +100
      • changedInput schema / properties / maxCount / type
        Previous value: -"number"New value: +"integer"
      • addedOutput schema / properties / limitExceeded
        Added value: +{
        +  "description": "True if more stops match than were returned; raise maxCount or refine the query to see all.",
        +  "type": "boolean"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "stops",
        -  "query",
        -  "count"
        -]New value: +[
        +  "stops",
        +  "limitExceeded",
        +  "query",
        +  "count"
        +]
  3. 1 tool update
    • Changedonebusaway_get_trip2 fields changed
      • addedOutput schema / properties / blockId
        Added 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."
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "tripId",
        -  "routeShortName",
        -  "tripHeadsign",
        -  "status",
        -  "schedule",
        -  "situations"
        -]New value: +[
        +  "tripId",
        +  "routeShortName",
        +  "tripHeadsign",
        +  "blockId",
        +  "status",
        +  "schedule",
        +  "situations"
        +]
  4. 3 tool updates
    • Addedonebusaway_get_alert
    • Addedonebusaway_get_block
    • Changedonebusaway_list_routes_for_agency1 field changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance when no routes were found — verify the agency ID with onebusaway_list_agencies.",
        +  "type": "string"
        +}
  5. 10 tool updates
    • Changedonebusaway_find_routes4 fields changed
      • addedOutput schema / properties / count
        Added value: +{
        +  "description": "Number of routes returned.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance when no routes matched — e.g. try a larger radius or different query.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / query
        Added value: +{
        +  "description": "Route name/number filter applied to the search, if any.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "routes"
        -]New value: +[
        +  "routes",
        +  "count"
        +]
    • Changedonebusaway_find_stops4 fields changed
      • addedOutput schema / properties / count
        Added value: +{
        +  "description": "Number of stops returned.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance when results are empty or truncated — e.g. how to narrow the radius or verify the stop code.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / query
        Added value: +{
        +  "description": "Stop code filter applied to the search, if any.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "stops",
        -  "limitExceeded"
        -]New value: +[
        +  "stops",
        +  "limitExceeded",
        +  "count"
        +]
    • Changedonebusaway_get_arrivals5 fields changed
      • addedOutput schema / properties / count
        Added value: +{
        +  "description": "Number of arrivals in the time window.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance when no arrivals were found — e.g. try expanding the time window or check for service alerts.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / queriedStop
        Added value: +{
        +  "description": "Stop ID queried.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / windowMinutes
        Added 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"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "stopId",
        -  "stopName",
        -  "currentTime",
        -  "arrivals",
        -  "situations"
        -]New value: +[
        +  "stopId",
        +  "stopName",
        +  "currentTime",
        +  "arrivals",
        +  "situations",
        +  "queriedStop",
        +  "count",
        +  "windowMinutes"
        +]
    • Changedonebusaway_get_schedule_for_route5 fields changed
      • addedOutput schema / properties / date
        Added value: +{
        +  "description": "Date parameter used for the schedule request, if specified.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance when no trips were found — e.g. no service on weekends or holiday schedule in effect.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / queriedRoute
        Added value: +{
        +  "description": "Route ID queried.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / tripCount
        Added value: +{
        +  "description": "Number of trips for this route on this date.",
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "routeId",
        -  "routeShortName",
        -  "serviceDateMs",
        -  "trips"
        -]New value: +[
        +  "routeId",
        +  "routeShortName",
        +  "serviceDateMs",
        +  "trips",
        +  "queriedRoute",
        +  "tripCount"
        +]
    • Changedonebusaway_get_schedule_for_stop5 fields changed
      • addedOutput schema / properties / date
        Added value: +{
        +  "description": "Date parameter used for the schedule request, if specified.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance when no routes were found — e.g. no service on weekends or holiday schedule in effect.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / queriedStop
        Added value: +{
        +  "description": "Stop ID queried.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / routeCount
        Added value: +{
        +  "description": "Number of routes with departures from this stop on this date.",
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "stopId",
        -  "stopName",
        -  "serviceDateMs",
        -  "routes"
        -]New value: +[
        +  "stopId",
        +  "stopName",
        +  "serviceDateMs",
        +  "routes",
        +  "queriedStop",
        +  "routeCount"
        +]
    • Changedonebusaway_get_vehicles5 fields changed
      • addedOutput schema / properties / agencyId
        Added value: +{
        +  "description": "Agency ID queried.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / count
        Added value: +{
        +  "description": "Number of vehicles returned after any route filter.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / notice
        Added 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"
        +}
      • addedOutput schema / properties / routeId
        Added value: +{
        +  "description": "Route ID filter applied client-side, if any.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "vehicles"
        -]New value: +[
        +  "vehicles",
        +  "agencyId",
        +  "count"
        +]
    • Changedonebusaway_list_agencies3 fields changed
      • addedOutput schema / properties / count
        Added value: +{
        +  "description": "Number of transit agencies returned.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance when no agencies were returned.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "agencies"
        -]New value: +[
        +  "agencies",
        +  "count"
        +]
    • Changedonebusaway_list_routes_for_agency3 fields changed
      • addedOutput schema / properties / agencyId
        Added value: +{
        +  "description": "Agency ID queried.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / count
        Added value: +{
        +  "description": "Number of routes returned for this agency.",
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "routes"
        -]New value: +[
        +  "routes",
        +  "agencyId",
        +  "count"
        +]
    • Changedonebusaway_search_routes4 fields changed
      • addedOutput schema / properties / count
        Added value: +{
        +  "description": "Number of routes returned.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance when no routes matched — e.g. try onebusaway_find_routes with coordinates, or onebusaway_list_routes_for_agency.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / query
        Added value: +{
        +  "description": "Route name/number query sent to the API.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "routes"
        -]New value: +[
        +  "routes",
        +  "query",
        +  "count"
        +]
    • Changedonebusaway_search_stops4 fields changed
      • addedOutput schema / properties / count
        Added value: +{
        +  "description": "Number of stops returned.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Guidance when no stops matched — e.g. try a different name fragment or use onebusaway_find_stops with coordinates.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / query
        Added value: +{
        +  "description": "Search query sent to the API.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "stops"
        -]New value: +[
        +  "stops",
        +  "query",
        +  "count"
        +]
  6. 13 tool updates
    • First observedonebusaway_find_routes
    • First observedonebusaway_find_stops
    • First observedonebusaway_get_arrivals
    • First observedonebusaway_get_route
    • First observedonebusaway_get_schedule_for_route
    • First observedonebusaway_get_schedule_for_stop
    • First observedonebusaway_get_stop
    • First observedonebusaway_get_trip
    • First observedonebusaway_get_vehicles
    • First observedonebusaway_list_agencies
    • First observedonebusaway_list_routes_for_agency
    • First observedonebusaway_search_routes
    • First observedonebusaway_search_stops

Frequently Asked Questions

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.2/5.0
Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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.