wsdot-mcp-server
Server Details
WA highway conditions, ferry schedules, vessel locations, toll rates, and border waits via MCP.
- Status
- Healthy
- Uptime
- 100.0% over 58 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/wsdot-mcp-server
- GitHub Stars
- 1
- Server Listing
- wsdot-mcp-server
TDQS
Scored across 12 tools
Each tool targets a distinct data domain: border waits, ferry services (alerts, routes, schedules, terminals, space, vessels), mountain passes, tolls, travel times, highway alerts, and cameras. There is no overlap or ambiguity—agents can easily select the correct tool for a query.
All tools follow a consistent lowercase snake_case pattern with the 'wsdot_' prefix and a clear verb: 'get_' for retrievals and 'search_' for filtered queries. This predictable structure makes the tool surface easy to navigate.
With 12 tools, the server covers a broad but well-scoped domain (border, ferries, highways, passes, tolls, travel times, alerts, cameras) without bloat. Each tool is necessary and earns its place; the count is ideal for a transportation data server.
The tool set provides comprehensive read-only coverage for Washington State transportation information: real-time data (border waits, ferry space, vessel locations, tolls, travel times), schedule/route data (ferry routes, schedules, terminals), and conditional data (mountain passes, alerts, cameras). There are no obvious dead ends—related tools reference each other (e.g., terminals for schedules, routes for alerts).
Available Tools
12 toolswsdot_get_border_waitsGet Border Wait TimesARead-onlyInspect
Returns current vehicle wait times at WA→Canada land border crossings: I-5 (Peace Arch, Blaine), SR 543 (Pacific Highway, Blaine), SR 539 (Lynden), and SR 9 (Sumas). Each crossing reports a general-purpose lane and a Nexus lane; SR 539 adds a truck lane and SR 543 adds truck and FAST truck lanes — eleven entries in crossings[], one per lane. crossingName is a route code (e.g. "I5", "I5Nexus", "SR543Trucks"); the readable name is in location.description. Wait times are in minutes. A crossing reporting no current data is still returned — only waitTimeInMinutes is omitted. Use for "how long is the border wait?" questions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Optional notice when no crossing data is available. Absent on normal results. |
| crossings | No | All WA/Canada border crossing wait times. |
| totalCount | No | Total number of crossings returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true. The description goes well beyond that: it explains the exact number of entries (eleven), the naming conventions (crossingName as route code, readable name in location.description), the lane structure for each crossing, and the behavior when no data is available (waitTimeInMinutes omitted). This provides rich behavioral context that an agent needs to interpret results correctly.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is clear and efficient. It front-loads the core purpose, then provides specific structural details (lane counts, naming scheme, data omission behavior) without redundancy. Each sentence adds new information, and the structure flows logically from overview to specifics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters, is read-only, and has an output schema, the description covers everything needed: the specific crossings, lane variations, naming conventions, and missing-data behavior. Even though the output schema exists, the description explains the semantics of the fields, making the tool self-contained and easy to invoke without external context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the description correctly avoids mentioning any. The baseline for 0 params is 4, and the description doesn't need to add parameter semantics. It does provide context about the output structure, which is more relevant than parameter details here.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Returns current vehicle wait times') and a clear resource ('WA→Canada land border crossings'). It lists the exact border crossings and lane types, distinguishing it from sibling tools like ferry alerts, mountain passes, or toll rates. The scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The final sentence explicitly states when to use the tool: 'Use for "how long is the border wait?" questions.' It also clarifies that crossings without current data are still returned, which sets expectations. It doesn't explicitly say when not to use it, but the sibling tools are clearly distinct domains (ferries, passes, tolls), so exclusions are implicitly obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wsdot_get_ferry_alertsGet Ferry AlertsARead-onlyInspect
Returns active WSF ferry service disruptions, delays, and bulletins. Each alert carries a one-line summary plus the bulletin title, kind, and full body — the body is where detail such as a replacement sailing appears. Each alert includes impacted route IDs — cross-reference with wsdot_get_ferry_routes to resolve route IDs to human-readable route names. Some IDs (seasonal, San Juan interisland, or international Sidney B.C. routes) may not appear in wsdot_get_ferry_routes for a given date.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| alerts | No | Active ferry service alerts and disruptions. |
| notice | No | Optional notice when no alerts are active. Absent when alerts are present. |
| totalCount | No | Total number of active alerts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint: true, so the description correctly avoids repeating that. It adds meaningful behavioral context by explaining the structure of each alert, the presence of route IDs, and the caveat about missing routes. This is more than the annotation provides and helps the agent interpret results. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is concise and well-structured. It front-loads the core purpose, then gives a brief overview of content, and finally provides cross-referencing guidance. Every sentence adds value without redundancy. It is appropriately sized for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool has no parameters and an output schema (though not shown), the description fully explains what the agent can expect: each alert's structure and how to resolve route IDs. The caveat about missing routes is a useful edge case. All necessary information for calling and interpreting results is present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so the schema is trivially complete. The description doesn't need to explain parameters. Baseline is 4, and the description adds no irrelevant parameter information, so a 4 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns active WSF ferry service disruptions, delays, and bulletins. It specifies the verb 'Returns', the resource 'WSF ferry service disruptions', and includes details about the alert content (summary, title, kind, body). This distinguishes it from siblings like wsdot_get_ferry_routes and wsdot_get_ferry_schedule.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use this tool (for alerts/disruptions) and provides an important cross-referencing instruction with wsdot_get_ferry_routes. It also notes a caveat about route IDs not appearing. While it doesn't explicitly state when NOT to use it, it implies that this is the go-to for disruptions. The guidance is sufficient for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wsdot_get_ferry_routesGet Ferry RoutesARead-onlyInspect
Returns the main WSF ferry routes operating on a given date, each with the directed terminal pairs it serves that day (terminalPairs) — departing and arriving terminal IDs and names, which are exactly the pairs wsdot_get_ferry_schedule accepts for that date. Route IDs correspond to impactedRouteIds in ferry alerts from wsdot_get_ferry_alerts, though some alert route IDs (seasonal, San Juan interisland, or Sidney B.C.) may not appear in this list. For the full terminal list with coordinates, use wsdot_get_ferry_terminals.
| Name | Required | Description | Default |
|---|---|---|---|
| tripDate | No | Date for which to list routes, in ISO 8601 format (YYYY-MM-DD). Defaults to today if omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Optional notice when no routes are available for the date. Absent on normal results. |
| routes | No | Ferry routes operating on the requested date. |
| tripDate | No | Date for which routes were retrieved (ISO 8601). |
| totalCount | No | Total number of routes returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already covers the safety profile. The description adds meaningful behavioral context: it clarifies the scope (main routes), explains the correspondence to alert route IDs, and warns about exceptions (seasonal, interisland, Sidney B.C.). This goes beyond the annotation and helps an agent anticipate edge cases.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each adding value: the core purpose, the cross-tool relationships, and an explicit alternative. It is front-loaded with the primary function and avoids redundancy, though it could be slightly more compact without losing essential guidance.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter, read-only tool with an output schema, the description covers everything an agent needs: the date handling, the structure of returned terminalPairs, the linkage to schedule and alerts, and the alternative for terminal coordinates. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The sole parameter tripDate is fully documented in the schema (ISO format, default to today). The description does not add parameter-specific details beyond what the schema provides, and schema coverage is 100%, so a baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a clear verb+resource: 'Returns the main WSF ferry routes' and specifies the output structure (terminalPairs with IDs and names). It differentiates from siblings by explicitly linking to wsdot_get_ferry_schedule and wsdot_get_ferry_alerts, so an agent can tell this tool apart without opening other schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly names an alternative tool for full terminal lists ('For the full terminal list with coordinates, use wsdot_get_ferry_terminals') and provides a caveat about which alert route IDs may be absent. It also clarifies that the terminalPairs are exactly what wsdot_get_ferry_schedule accepts, giving concrete routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wsdot_get_ferry_scheduleGet Ferry ScheduleARead-onlyInspect
Returns departure times for a specific WSF ferry route on a given date. Requires numeric terminal IDs — use wsdot_get_ferry_terminals to resolve terminal names to IDs; terminalPairs on wsdot_get_ferry_routes lists the pairs with service on a date. Set remainingOnly to true to show only future departures for today (useful for "next ferry" queries). For future dates, all sailings for that day are returned. Each sailing carries its vessel ID, WSF's loading-rule code, and the pair's annotations that apply to it — notes such as "No interisland vehicles" that decide whether a sailing takes a car. Sailing times are ISO 8601 UTC while tripDate is the Pacific service day, so evening sailings carry the next UTC date — convert to America/Los_Angeles before quoting a clock time. Cancellations are not carried here — WSF drops a cancelled sailing from the schedule instead of flagging it, so a listed sailing is not confirmation that it will run. Check wsdot_get_ferry_alerts for disruptions; those are scoped to a route, not an individual sailing.
| Name | Required | Description | Default |
|---|---|---|---|
| tripDate | No | Date in ISO 8601 format (YYYY-MM-DD). Defaults to today if omitted. | |
| remainingOnly | No | When true, returns only future sailings for today. Ignored for future dates. Default: false. | |
| arrivingTerminalId | Yes | Numeric ID of the arriving terminal. | |
| departingTerminalId | Yes | Numeric ID of the departing terminal. Use wsdot_get_ferry_terminals to look up terminal IDs. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Optional notice when no sailings are found — e.g. invalid terminal pair or no service for this date. Absent when sailings are present. |
| sailings | No | Scheduled sailings for this route and date. |
| tripDate | No | Date of the schedule (ISO 8601). |
| annotations | No | Notes WSF attaches to this pair's sailings (vehicle restrictions, routing, delays), converted from HTML to plain text with link destinations kept as "text (url)". Sailings point at the ones that apply to them through annotationIndexes. Empty when the pair has none. |
| sailingNotes | No | A note covering every sailing on this pair (e.g. a boarding-pass requirement), converted from HTML to plain text. Absent when WSF publishes none, which is the case for most pairs. |
| remainingOnly | No | Whether the result holds only today's remaining sailings. False for any date other than today, whatever was requested. |
| totalSailings | No | Total number of sailings returned. |
| arrivingTerminalName | No | Arriving terminal name. |
| departingTerminalName | No | Departing terminal name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true, so the description carries the burden of behavioral detail. It discloses that cancellations are not carried (a listed sailing is not confirmation it will run) and directs to alerts for disruption info. It also explains the time zone handling (sailings in UTC vs. tripDate Pacific service day) and warns to convert before quoting times. These are critical behavioral traits beyond the read-only annotation, adding substantial value.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core purpose, then prerequisites, then behavioral nuances, followed by cancellation handling and diversion to alerts. Every sentence earns its place, providing necessary information without fluff. It is well-organized and appropriately concise given the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description need not detail return structure. It covers parameter usage, time zone conversion, cancellation behavior, and alternative routing. For a complex ferry schedule tool, this is complete for an agent to invoke correctly without ambiguity. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema covers all parameters (100% description coverage), so the baseline is 3. The description adds meaningful extra semantics: it explains that remainingOnly is specifically for "next ferry" queries and that terminal IDs must be numeric (referencing the terminal lookup tool). It also clarifies how tripDate interacts with time zones for the sailing times. These additions go beyond the schema's literal parameter descriptions, earning a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: "Returns departure times for a specific WSF ferry route on a given date." It unambiguously identifies the tool's function and distinguishes it from siblings by explicitly referencing related tools (wsdot_get_ferry_terminals, wsdot_get_ferry_routes) for context. The purpose is clear and actionable, leaving no ambiguity about what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit when-to-use guidance: it requires numeric terminal IDs and directs the agent to wsdot_get_ferry_terminals for resolution and wsdot_get_ferry_routes for route pairs. It explains when remainingOnly is appropriate ("useful for 'next ferry' queries") and explicitly tells the agent to check wsdot_get_ferry_alerts for disruptions, routing to the correct sibling for that scenario. This is textbook usage guidance with clear alternative selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wsdot_get_ferry_terminalsGet Ferry TerminalsARead-onlyInspect
Returns all WSF ferry terminals with their numeric IDs, names, abbreviations, and coordinates. Call this first to resolve human-readable terminal names (e.g. "Bainbridge Island", "Seattle", "Kingston") to the numeric terminal IDs required by the schedule and space tools. The terminal list is small (20 terminals) and rarely changes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Optional notice when no terminal data is available. Absent on normal results. |
| terminals | No | All WSF ferry terminals. |
| totalCount | No | Total number of terminals returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already flags this as a safe read operation, and the description adds useful behavioral context beyond that: it returns the complete terminal list with no filtering, includes coordinates, and notes that the list is small and rarely changes. This helps set expectations about result size and data stability.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three short sentences with no filler. The first sentence states the core behavior and output, the second gives the practical call sequence, and the third adds data size/stability context. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a no-parameter, read-only list tool with an output schema, the description is complete. It names the returned fields, explains why an agent should call it, and supplies enough context about the terminal list size that an agent can predict the response shape and cost.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters and the schema already documents this with 100% coverage, so there are no parameter semantics to explain. The description reinforces that it returns all terminals, which is consistent with there being no filtering inputs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: it returns all WSF ferry terminals, and names the exact fields included. This clearly distinguishes the tool from siblings like ferry routes, schedules, or terminal space tools without needing to open schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to call this first to resolve human-readable terminal names into the numeric IDs required by schedule and space tools. This gives an agent a clear precondition and workflow context for when the tool should be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wsdot_get_mountain_passesGet Mountain Pass ConditionsARead-onlyInspect
Returns current road conditions for all Washington State mountain passes: status, weather, road condition, traction laws, temperature, and elevation. Includes all 16 passes (Snoqualmie, Stevens, White, Blewett, Cayuse, etc.). Use for "is the pass open?", traction law status, or winter driving planning.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Optional notice when no pass data is available — e.g. API temporarily unavailable. Absent on normal results. |
| passes | No | All WA mountain pass conditions. |
| totalCount | No | Total number of passes returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations carry readOnlyHint=true, so the read-only nature is already declared. The description adds context by specifying the full scope (all 16 passes) and the fields returned, which goes beyond the annotation. No contradictions and no additional behavioral caveats are needed for a simple read-only fetch.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two focused sentences: the first states the operation and output fields, the second offers practical usage examples. The core action and scope are front-loaded, with no filler or redundant phrasing. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has no parameters and no output schema concerns (it exists), and annotations cover safety. The description tells an agent what data it will receive, that it covers all passes, and when to use it. Nothing needed for correct selection or invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the schema already fully defines the input (empty). Per rubric, 0 params baseline is 4. The description adds no parameter information, but none is required because there are no parameters to document.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb and resource: 'Returns current road conditions for all Washington State mountain passes.' It lists the data fields (status, weather, traction laws, etc.) and names example passes, making it unambiguous and distinguishable from sibling tools such as ferry alerts or travel times.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The second sentence explicitly gives use cases: 'Use for "is the pass open?", traction law status, or winter driving planning.' This is clear context, though it does not name alternatives or state exclusions. Since the sibling tools are topically distinct, this is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wsdot_get_terminal_spaceGet Terminal SpaceARead-onlyInspect
Returns real-time drive-up and reservable vehicle space available at WSF terminals for upcoming sailings. Use for "will I make the ferry?" or "how full is the next sailing?" questions. Optionally filter to a specific terminal by ID (use wsdot_get_ferry_terminals for the ID). driveUpSpaceCount is the key field — zero means the drive-up lane is full. Destinations are arrivingTerminalIds, not the itineraryLabel string: a sailing can serve several terminals, and those IDs are what wsdot_get_ferry_schedule accepts. Results are paged by terminal (default 5, max 20): offset/limit select whole terminals and totalCount counts matching terminals, not sailings — every sailing of a returned terminal is included, so page size varies with how many departures each terminal carries.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum terminals to return in this page (1–20). Defaults to 5. Counts terminals, not sailings. | |
| offset | No | Zero-based index of the first terminal to return, for paging. Defaults to 0. | |
| departingTerminalId | No | Filter to a specific terminal by numeric ID. Omit to return all terminals. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Informational note about the page window, or guidance when no terminal space data is available, the filter matched nothing, or the offset ran past the end. |
| hasMore | No | True when more terminals remain beyond the current page. |
| terminals | No | Terminal space availability by terminal. |
| nextOffset | No | Offset to pass to retrieve the next page, or null when this is the last page. |
| totalCount | No | Total terminals matching the filter across all pages (not just this page). Counts terminals, not sailings. |
| terminalFilter | No | The terminal ID filter applied, or absent if no filter was used. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds substantial behavioral context beyond the readOnlyHint annotation: paging is by terminal, offset/limit select whole terminals, totalCount counts terminals not sailings, every sailing of a returned terminal is included, and driveUpSpaceCount of zero means the drive-up lane is full. It also clarifies that destinations are arrivingTerminalIds rather than itineraryLabel strings.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place. It front-loads the core purpose and use cases, then provides critical paging and field semantics. There is no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema exists, the description does not need to explain return values in detail, yet it still highlights the key field driveUpSpaceCount and the paging behavior. It covers usage, terminal ID sourcing, destination ID semantics, and pagination, making it complete for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds meaning beyond the schema: it explains that limit/offset count terminals rather than sailings, that page size varies with the number of departures per terminal, and that departingTerminalId should be obtained from wsdot_get_ferry_terminals. This significantly helps an agent use the parameters correctly.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Returns real-time drive-up and reservable vehicle space available at WSF terminals for upcoming sailings.' It clearly scopes the tool's function and distinguishes it from related ferry tools by explaining that it answers 'will I make the ferry?' questions and that terminal IDs come from wsdot_get_ferry_terminals.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly states when to use the tool: for 'will I make the ferry?' or 'how full is the next sailing?' questions. It also tells the agent to use wsdot_get_ferry_terminals to obtain a terminal ID. It does not explicitly state when not to use the tool versus ferry_schedule, but the use cases are clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wsdot_get_toll_ratesGet Toll RatesARead-onlyInspect
Returns current dynamic toll rates for WA express lanes and tolled facilities: SR 99 (WSDOT Tunnel), SR 167 HOT Lanes, I-405 Express Lanes, SR 509 tolled segment, and the SR 520 Bridge. Rates are time-banded and change dynamically based on traffic conditions. Filter to one facility with stateRoute ("SR 520", "520", "I-405", or "405" all work). Each row reports stateRoute as the bare, zero-padded number the feed carries ("099", "405") — the posted designation is in the rendered text. Results are paged — pass offset/limit to page through the matching set. A page ends at limit or at a 24,000-byte response budget, whichever comes first; the notice reports the next offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum toll rates to return in this page (1–500). Defaults to 50. A large page ends sooner, at the 24,000-byte response budget. | |
| offset | No | Zero-based index of the first toll rate to return, for paging. Defaults to 0. | |
| stateRoute | No | Tolled route to filter by. Accepts natural forms — "SR 520", "520", "0520", "I-405", "405" — matched case- and space-insensitively against each row's posted designation, so a route-type prefix must agree: "SR 405" matches nothing because the I-405 Express Lanes are an Interstate. A route with no tolled facility returns an empty page whose notice names the tolled routes. Omit to include every facility. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| rates | No | Current toll rates for the matching tolled facilities. |
| notice | No | Informational note about the page window, or guidance when no toll rate data is available, the route has no tolled facility, or the offset ran past the end. |
| hasMore | No | True when more toll rates remain beyond the current page. |
| nextOffset | No | Offset to pass to retrieve the next page, or null when this is the last page. |
| totalCount | No | Total toll rate entries matching the filter across all pages (not just this page). |
| appliedFilters | No | Active filters applied to the toll rates. Absent when no filter was applied. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses important behavioral traits: rates are time-banded and dynamic, results are paged via offset/limit, pages cap at a 24,000-byte response budget, stateRoute values are zero-padded like '099', and the notice reports the next offset. This is rich, non-obvious information that materially affects how an agent uses the tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense and information-rich with no fluff. It front-loads the core function and facility list, then moves efficiently through filtering, output formatting, and pagination details. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only paged data tool with a full output schema and fully documented parameters, the description covers the key operational details: facilities, dynamic pricing, filtering, pagination, and the stateRoute output quirk. It is nearly complete, though it does not explicitly address alternative-tool routing, which is a minor gap given the sibling set.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% parameter documentation, including accepted route forms and case-insensitive matching rules, so the baseline applies. The description adds a couple of useful examples and explains the zero-padded stateRoute output, but it does not substantially enhance the parameter semantics beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Returns current dynamic toll rates for WA express lanes and tolled facilities,' then enumerates exactly which facilities are covered. This distinguishes it clearly from the sibling tools, which all address different WSDOT data domains such as ferries, mountain passes, and cameras.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides clear context on what data this tool returns and how to filter it via stateRoute, but it never explicitly states when to choose this tool over a sibling or which sibling to use for other types of transportation data. The domain is obvious enough that an agent can infer the use case, though no exclusions or alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wsdot_get_travel_timesGet Travel TimesARead-onlyInspect
Returns current vs. average travel times for named WA highway corridors (I-5, I-90, SR 520, SR 99, I-405, SR 167, etc.). Use for "how congested is I-5?" or commute time estimates. The route filter matches two ways: a route designation ("I-5", "5", "SR 520") returns every corridor measured on that route, and any text also matches corridor names ("Everett"). When current time exceeds average, the corridor is congested. Results are paged — pass offset/limit to page through the full set. A page ends at limit or at a 24,000-byte response budget, whichever comes first; the notice reports the next offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum corridors to return in this page (1–500). Defaults to 50. A large page ends sooner, at the 24,000-byte response budget. | |
| route | No | Optional filter. A route designation — "I-5", "5", "005", "SR 520", "520" — matches every corridor whose start or end point is on that route, whichever form the feed reports. Any text also matches the corridor name as a case-insensitive substring, so "Everett" finds the Seattle-Everett corridors. Omit to return all corridors. | |
| offset | No | Zero-based index of the first corridor to return, for paging. Defaults to 0. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Informational note about the page window, or guidance when no corridors matched the route filter or the offset ran past the end. |
| hasMore | No | True when more corridors remain beyond the current page. |
| corridors | No | Travel time corridors matching the filter. |
| nextOffset | No | Offset to pass to retrieve the next page, or null when this is the last page. |
| totalCount | No | Total corridors matching the filter across all pages (not just this page). |
| routeFilter | No | The route name filter applied (lowercased), or absent if no filter was used. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=true. The description adds substantial behavior beyond that: route filter dual-matching semantics, congestion interpretation (current > average), pagination via offset/limit, and the 24,000-byte response budget. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: purpose, usage, route filter semantics, congestion rule, and paging. The purpose is front-loaded and there is no padding or repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and readOnlyHint annotation, the description covers all needed invocation details: what the tool returns, how to filter, paging behavior, and how to interpret congestion. Nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by explaining the route parameter's two matching modes (designation vs. corridor-name substring) and how limit interacts with the byte-budget page cutoff, going beyond the schema's per-parameter docs.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Returns current vs. average travel times for named WA highway corridors' with concrete examples (I-5, SR 520). This clearly distinguishes it from ferry, border, toll, and pass tools in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use for "how congested is I-5?" or commute time estimates,' giving clear when-to-use context. It does not provide explicit exclusions or alternatives, but the sibling tools are in obviously different domains, so the guidance is adequate without them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wsdot_get_vessel_locationsGet Vessel LocationsARead-onlyInspect
Returns real-time AIS positions, speed, heading, ETA, and dock status for all active WSF vessels. Use for "where is the ferry now?", vessel tracking, or checking if a vessel is in service. Position data may lag by 30–60 seconds. Many fields are null for vessels not currently operating.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Optional notice when no vessel data is available. Absent on normal results. |
| vessels | No | All WSF vessels with real-time position data. |
| totalCount | No | Total number of vessels returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, so the read-only nature is known. The description adds valuable behavioral context: position data may lag by 30–60 seconds and many fields are null for non-operating vessels, which helps manage expectations about data freshness and completeness.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences efficiently pack the return payload, usage guidance, and data caveats. The main functionality is front-loaded, and every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and readOnlyHint annotation, the description covers all essential aspects: what is returned, when to use it, and important caveats about data lag and nulls. No parameters means nothing else needs explaining.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has 0 parameters, so per the rubric the baseline is 4. The description doesn't need to explain parameters, and no additional parameter-related value is required.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Returns') and resource ('real-time AIS positions, speed, heading, ETA, and dock status for all active WSF vessels'), clearly distinguishing it from sibling tools like ferry schedules or border waits. It also provides concrete use cases ('where is the ferry now?').
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says 'Use for' and lists three clear usage scenarios. It does not mention when not to use or alternatives, but since no sibling tool covers vessel location, this is sufficient context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wsdot_search_alertsSearch Highway AlertsARead-onlyInspect
Returns active WA highway alerts: incidents, construction, closures, and restrictions. Filter by state route ("I-90", "90", "SR 520", or "520" all work), WSDOT region (Northwest, Olympic, Southwest, South Central, North Central, Eastern), or milepost range, matched against the alert's full extent. Omit all filters to return all current statewide alerts. Results are ordered by alertId and paged — pass offset/limit to page through the full set. A page ends at limit or at a 24,000-byte response budget, whichever comes first; the notice reports the next offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum alerts to return in this page (1–500). Defaults to 20. A page of long alerts can end sooner, at the 24,000-byte response budget. | |
| offset | No | Zero-based index of the first alert to return, for paging. Defaults to 0. | |
| region | No | WSDOT region name as it appears in alert data: "Northwest", "Olympic", "Southwest", "South Central", "North Central", or "Eastern". Matching is case-insensitive; any other value is rejected. These are names, not the two-letter codes wsdot_search_cameras takes. | |
| stateRoute | No | State route to filter by. Accepts natural forms — "I-90", "90", "090", "SR 520", "520" — matched case- and space-insensitively to the route number. A route-type prefix is compared only when both sides carry one, so "SR 26" never matches US 26 while a bare "26" matches either. Omit to include all routes. | |
| endMilepost | No | End of the milepost range. Matched by extent overlap like startMilepost, so an alert beginning inside the range and continuing past it is returned. | |
| startMilepost | No | Start of the milepost range. An alert matches when its extent overlaps the range, so a closure running from MP 10 to MP 30 is returned for a range starting at MP 20. Either bound may be given alone; when both are given, startMilepost must not exceed endMilepost. Alerts reporting no milepost are always included. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| alerts | No | Matching highway alerts. |
| notice | No | Informational note about the page window, or guidance when no alerts matched the filters or the offset ran past the end. |
| hasMore | No | True when more alerts remain beyond the current page. |
| nextOffset | No | Offset to pass to retrieve the next page, or null when this is the last page. |
| totalCount | No | Total alerts matching the filters across all pages (not just this page). |
| appliedFilters | No | Active filters applied to the alert search. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With readOnlyHint=true already covering safety, the description adds substantial behavioral detail beyond annotations: results are active, ordered by alertId, paged, capped by a 24,000-byte response budget, and the next offset is reported. This is genuinely useful runtime context an agent would not otherwise know.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence earns its place: the first states the core function, the second covers filters, the third covers the unfiltered case, and the last two explain pagination and the byte-budget edge case. It is dense but well-structured and front-loaded with the most important information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers active status, available filters, default behavior, ordering, pagination, and the non-obvious byte-budget limit that can truncate a page. Since an output schema exists, return-value details are not required here, and nothing needed to call the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All six parameters already have 100% schema coverage with detailed descriptions, so the baseline is met without the tool description. The description's mentions of route forms and extent overlap mostly restate the schema descriptions, adding only a high-level summary rather than new semantic info.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description leads with a strong verb and specific resource: 'Returns active WA highway alerts' and then enumerates the alert types (incidents, construction, closures, restrictions). It also lists the main filtering dimensions, making it immediately clear how this tool differs from sibling search tools like wsdot_search_cameras.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear invocation context, including that omitting all filters returns all current statewide alerts and that offset/limit are used for paging. It does not explicitly name sibling alternatives or say when not to use the tool, but the alert-specific scope and filter guidance are enough to guide an agent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wsdot_search_camerasSearch Highway CamerasARead-onlyInspect
Returns WSDOT highway camera locations, descriptions, and image URLs. Camera images are copyright WSDOT — only metadata and image URLs are returned, not image bytes. Filter by state route ("I-90", "90", "SR 520", or "520" all work), WSDOT region, milepost range, or words in the camera title ("Snoqualmie"). Results are ordered by cameraId and paged — pass offset/limit to page through the full set. A page ends at limit or at a 24,000-byte response budget, whichever comes first; the notice reports the next offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum cameras to return in this page (1–500). Defaults to 50. A large page ends sooner, at the 24,000-byte response budget. | |
| offset | No | Zero-based index of the first camera to return, for paging. Defaults to 0. | |
| region | No | WSDOT region code: NW (Northwest), SW (Southwest), OL (Olympic), ER (Eastern), SC (South Central), NC (North Central), OS (Oregon — the TripCheck cameras around Portland), or WA (airport cameras plus a few ferry-terminal cameras — most ferry-terminal cameras sit in NW and OL). Matching is case-insensitive; any other value is rejected. These are codes, not the region names wsdot_search_alerts takes. | |
| stateRoute | No | State route to filter by. Accepts natural forms — "I-90", "90", "090", "SR 520", "520" — matched case- and space-insensitively to the route number. Camera road names carry a route-type prefix, which is compared when the filter carries one too: "SR 26" excludes US 26, while a bare "26" returns both. A lettered suffix is part of the route, so "US 97" excludes US 97A. Omit to include all routes. | |
| endMilepost | No | End of the milepost range to filter cameras. | |
| startMilepost | No | Start of the milepost range to filter cameras. Either bound may be given alone; when both are given, startMilepost must not exceed endMilepost. Cameras reporting no milepost are always included. | |
| titleContains | No | Words to find in the camera title, as WSDOT wrote it. Case-insensitive; every whitespace-separated word must appear, in any order — "Snoqualmie" returns "Snoqualmie Summit" and "East Snoqualmie Summit" but not a nearby camera titled "Hyak". Most titles lead with route and milepost ("I-90 at MP 52: …"), so filter a route with stateRoute rather than here. Combines with the other filters. Omit to include every title. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| notice | No | Informational note about the page window, copyright, or empty results. Absent when not applicable. |
| cameras | No | Camera metadata and image URLs. Images are copyright WSDOT. |
| hasMore | No | True when more cameras remain beyond the current page. |
| nextOffset | No | Offset to pass to retrieve the next page, or null when this is the last page. |
| totalCount | No | Total cameras matching the filters across all pages (not just this page). |
| appliedFilters | No | Active filters applied to the camera search. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint annotation, the description discloses key behaviors: image bytes are not returned due to copyright, results are ordered by cameraId, paging uses offset/limit, and pages can end early at a 24,000-byte response budget. This is substantial behavioral context that an agent cannot infer from the schema alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: purpose first, then the critical constraint about image bytes, then filters, then paging behavior. Every sentence carries meaningful information with no filler or repetition of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given that all parameters are optional, an output schema exists, and the readOnly annotation is present, the description covers everything needed for correct invocation: filter semantics, paging mechanics, response budget, and ordering. There are no obvious gaps that would cause an agent to misuse the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and each parameter already has a detailed description, so the baseline is 3. The tool description only summarizes the filter dimensions at a high level and adds no parameter semantics beyond what the schema provides. It does not need to compensate, but it also does not elevate the score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Returns WSDOT highway camera locations, descriptions, and image URLs.' It further clarifies the exact scope (metadata and URLs, not image bytes), making the tool's purpose unmistakable and distinct from sibling tools like wsdot_search_alerts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context on when to use the tool: it is for camera metadata, with filtering options by route, region, milepost, and title. It also provides a practical within-tool guideline in the titleContains parameter ('filter a route with stateRoute rather than here') and notes that region codes differ from the names wsdot_search_alerts takes. It does not explicitly state when not to use this tool versus alternatives, but the context is strong.
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.
4 tool updates
- Changed
wsdot_get_ferry_routes2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `api_unavailable`: WSF Ferry API is unreachable or returns a non-2xx response after retries. `invalid_access_code`: WSF rejected the request because WSDOT_ACCESS_CODE is missing, invalid, or not registered. `invalid_date`: The provided tripDate is not a valid ISO 8601 date. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `api_unavailable`: WSF Ferry API is unreachable or returns a non-2xx response after retries. `invalid_access_code`: WSF rejected the request because WSDOT_ACCESS_CODE is missing, invalid, or not registered. `invalid_date`: The tripDate is not a valid YYYY-MM-DD date, or WSF rejects it as outside the dates it has published a schedule for. Other values are possible when a failure originates below the handler." - added
Output schema / properties / routes / items / properties / terminalPairsAdded value: +{ + "description": "Directed terminal pairs this route serves on the requested date; empty when it serves none. Absent only when upstream omits the route ID the lookup needs.", + "items": { + "additionalProperties": false, + "description": "One direction of service between two terminals on the requested date.", + "properties": { + "arrivingTerminalId": { + "description": "Arriving terminal ID — the arrivingTerminalId to pass to wsdot_get_ferry_schedule.", + "type": "number" + }, + "arrivingTerminalName": { + "description": "Arriving terminal name. Absent when upstream omits it.", + "type": "string" + }, + "departingTerminalId": { + "description": "Departing terminal ID — the departingTerminalId to pass to wsdot_get_ferry_schedule.", + "type": "number" + }, + "departingTerminalName": { + "description": "Departing terminal name. Absent when upstream omits it.", + "type": "string" + } + }, + "required": [ + "departingTerminalId", + "arrivingTerminalId" + ], + "type": "object" + }, + "type": "array" +}
- Changed
wsdot_get_ferry_schedule9 fields changed- added
Output schema / properties / annotationsAdded value: +{ + "description": "Notes WSF attaches to this pair's sailings (vehicle restrictions, routing, delays), converted from HTML to plain text with link destinations kept as \"text (url)\". Sailings point at the ones that apply to them through annotationIndexes. Empty when the pair has none.", + "items": { + "description": "One note, as plain text.", + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `api_unavailable`: WSF Ferry API is unreachable or returns a non-2xx response after retries. `invalid_access_code`: WSF rejected the request because WSDOT_ACCESS_CODE is missing, invalid, or not registered. `invalid_terminal_pair`: The terminal ID pair is invalid or does not form a valid ferry route. `invalid_date`: The provided tripDate is not a valid ISO 8601 date. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `api_unavailable`: WSF Ferry API is unreachable or returns a non-2xx response after retries. `invalid_access_code`: WSF rejected the request because WSDOT_ACCESS_CODE is missing, invalid, or not registered. `invalid_terminal_pair`: The terminal ID pair is invalid or does not form a valid ferry route. `invalid_date`: The tripDate is not a valid YYYY-MM-DD date, WSF rejects it as outside the dates it has published a schedule for, or WSF lists no routes on it. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / remainingOnly / descriptionPrevious value: -"Whether the result shows only remaining sailings."New value: +"Whether the result holds only today's remaining sailings. False for any date other than today, whatever was requested." - added
Output schema / properties / sailingNotesAdded value: +{ + "description": "A note covering every sailing on this pair (e.g. a boarding-pass requirement), converted from HTML to plain text. Absent when WSF publishes none, which is the case for most pairs.", + "type": "string" +} - changed
Output schema / properties / sailings / items / descriptionPrevious value: -"One scheduled sailing with departure time and vessel assignment."New value: +"One scheduled sailing with departure time, vessel assignment, and the notes that apply to it." - added
Output schema / properties / sailings / items / properties / annotationIndexesAdded value: +{ + "description": "Positions in annotations of the notes that apply to this sailing; each resolves to an entry. Empty when none apply.", + "items": { + "description": "A position in annotations.", + "type": "number" + }, + "type": "array" +} - added
Output schema / properties / sailings / items / properties / loadingRuleAdded value: +{ + "description": "WSF's loading-rule code for this sailing. WSF does not document the codes: 3 appears on nearly every sailing, and 1 has appeared only on sailings whose annotation restricts vehicles. Read the sailing’s annotations for the restriction itself.", + "type": "number" +} - added
Output schema / properties / sailings / items / properties / vesselHandicapAccessibleAdded value: +{ + "description": "Whether WSF marks the assigned vessel as handicap accessible.", + "type": "boolean" +} - added
Output schema / properties / sailings / items / properties / vesselIdAdded value: +{ + "description": "ID of the assigned vessel — the same vesselId wsdot_get_vessel_locations reports.", + "type": "number" +}
- Changed
wsdot_get_ferry_terminals3 fields changed- changed
Output schema / properties / terminals / items / properties / terminalId / descriptionPrevious value: -"Numeric terminal ID used in schedule and space API calls."New value: +"Numeric terminal ID used in schedule and space API calls. Absent when upstream omits it." - changed
Output schema / properties / terminals / items / properties / terminalName / descriptionPrevious value: -"Full terminal name (e.g. \"Bainbridge Island\")."New value: +"Full terminal name (e.g. \"Bainbridge Island\"). Absent when upstream omits it." - removed
Output schema / properties / terminals / items / requiredRemoved value: -[ - "terminalId", - "terminalName" -]
- Changed
wsdot_get_mountain_passes3 fields changed- changed
Output schema / properties / passes / items / properties / mountainPassId / descriptionPrevious value: -"Numeric identifier for the pass."New value: +"Numeric identifier for the pass. Absent when upstream omits it." - changed
Output schema / properties / passes / items / properties / mountainPassName / descriptionPrevious value: -"Human-readable pass name (e.g. \"Snoqualmie Pass\")."New value: +"Human-readable pass name (e.g. \"Snoqualmie Pass\"). Absent when upstream omits it." - removed
Output schema / properties / passes / items / requiredRemoved value: -[ - "mountainPassId", - "mountainPassName" -]
6 tool updates
- Changed
wsdot_get_ferry_schedule6 fields changed- added
Input schema / properties / arrivingTerminalId / exclusiveMinimumAdded value: +0 - added
Input schema / properties / arrivingTerminalId / maximumAdded value: +9007199254740991 - changed
Input schema / properties / arrivingTerminalId / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / departingTerminalId / exclusiveMinimumAdded value: +0 - added
Input schema / properties / departingTerminalId / maximumAdded value: +9007199254740991 - changed
Input schema / properties / departingTerminalId / typePrevious value: -"number"New value: +"integer"
- Changed
wsdot_get_terminal_space3 fields changed- added
Input schema / properties / departingTerminalId / exclusiveMinimumAdded value: +0 - added
Input schema / properties / departingTerminalId / maximumAdded value: +9007199254740991 - changed
Input schema / properties / departingTerminalId / typePrevious value: -"number"New value: +"integer"
- Changed
wsdot_get_toll_rates8 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum toll rates to return in this page (1–500). Defaults to 50."New value: +"Maximum toll rates to return in this page (1–500). Defaults to 50. A large page ends sooner, at the 24,000-byte response budget." - added
Input schema / properties / stateRouteAdded value: +{ + "description": "Tolled route to filter by. Accepts natural forms — \"SR 520\", \"520\", \"0520\", \"I-405\", \"405\" — matched case- and space-insensitively against each row's posted designation, so a route-type prefix must agree: \"SR 405\" matches nothing because the I-405 Express Lanes are an Interstate. A route with no tolled facility returns an empty page whose notice names the tolled routes. Omit to include every facility.", + "maxLength": 200, + "type": "string" +} - added
Output schema / properties / appliedFiltersAdded value: +{ + "additionalProperties": false, + "description": "Active filters applied to the toll rates. Absent when no filter was applied.", + "properties": { + "stateRoute": { + "description": "State route filter applied.", + "type": "string" + } + }, + "type": "object" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Informational note about the page window, or guidance when no toll rate data is available or the offset ran past the end."New value: +"Informational note about the page window, or guidance when no toll rate data is available, the route has no tolled facility, or the offset ran past the end." - changed
Output schema / properties / rates / descriptionPrevious value: -"Current toll rates for all active tolled facilities."New value: +"Current toll rates for the matching tolled facilities." - changed
Output schema / properties / rates / items / properties / stateRoute / descriptionPrevious value: -"State route number."New value: +"Route number as the feed reports it: bare and zero-padded, with no route type (\"099\", \"405\"). The rendered text shows the posted designation (SR 99, I-405)." - changed
Output schema / properties / rates / items / properties / travelDirection / descriptionPrevious value: -"Travel direction code for this toll segment: N (north), S (south), E (east), W (west)."New value: +"Direction code the feed assigns the toll trip: N, S, E, or W. On SR 99, SR 509, and SR 520 it is one fixed code per facility (S, S, and E) although trips run both ways, so read the direction of travel from the segment ends — startLocationName/endLocationName and startMilepost → endMilepost — not from this code." - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total toll rate entries across all pages (not just this page)."New value: +"Total toll rate entries matching the filter across all pages (not just this page)."
- Changed
wsdot_get_travel_times2 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum corridors to return in this page (1–500). Defaults to 50."New value: +"Maximum corridors to return in this page (1–500). Defaults to 50. A large page ends sooner, at the 24,000-byte response budget." - added
Input schema / properties / route / maxLengthAdded value: +200
- Changed
wsdot_search_alerts7 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum alerts to return in this page (1–500). Defaults to 50."New value: +"Maximum alerts to return in this page (1–500). Defaults to 20. A page of long alerts can end sooner, at the 24,000-byte response budget." - changed
Input schema / properties / region / descriptionPrevious value: -"WSDOT region name as it appears in alert data: \"Northwest\", \"Olympic\", \"Southwest\", \"South Central\", \"North Central\", or \"Eastern\". Matching is case-insensitive."New value: +"WSDOT region name as it appears in alert data: \"Northwest\", \"Olympic\", \"Southwest\", \"South Central\", \"North Central\", or \"Eastern\". Matching is case-insensitive; any other value is rejected. These are names, not the two-letter codes wsdot_search_cameras takes." - added
Input schema / properties / region / maxLengthAdded value: +200 - changed
Input schema / properties / startMilepost / descriptionPrevious value: -"Start of the milepost range. An alert matches when its extent overlaps the range, so a closure running from MP 10 to MP 30 is returned for a range starting at MP 20. Either bound may be given alone. Alerts reporting no milepost are always included."New value: +"Start of the milepost range. An alert matches when its extent overlaps the range, so a closure running from MP 10 to MP 30 is returned for a range starting at MP 20. Either bound may be given alone; when both are given, startMilepost must not exceed endMilepost. Alerts reporting no milepost are always included." - added
Input schema / properties / stateRoute / maxLengthAdded value: +200 - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `api_unavailable`: WSDOT Traffic API is unreachable or returns a non-2xx response after retries. `invalid_access_code`: WSDOT rejected the request because WSDOT_ACCESS_CODE is missing, invalid, or not registered. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `api_unavailable`: WSDOT Traffic API is unreachable or returns a non-2xx response after retries. `invalid_access_code`: WSDOT rejected the request because WSDOT_ACCESS_CODE is missing, invalid, or not registered. `invalid_region`: The region is not one of the WSDOT region names the alerts feed carries. `invalid_milepost_range`: startMilepost is greater than endMilepost. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "api_unavailable", - "invalid_access_code" -]New value: +[ + "api_unavailable", + "invalid_access_code", + "invalid_region", + "invalid_milepost_range" +]
- Changed
wsdot_search_cameras10 fields changed- changed
Input schema / properties / endMilepost / descriptionPrevious value: -"End of milepost range to filter cameras."New value: +"End of the milepost range to filter cameras." - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum cameras to return in this page (1–500). Defaults to 50."New value: +"Maximum cameras to return in this page (1–500). Defaults to 50. A large page ends sooner, at the 24,000-byte response budget." - changed
Input schema / properties / region / descriptionPrevious value: -"WSDOT region code: NW (Northwest), SW (Southwest), OL (Olympic), ER (Eastern), SC (South Central), OS (Olympic South), NC (North Central), or WA (statewide). Matching is case-insensitive."New value: +"WSDOT region code: NW (Northwest), SW (Southwest), OL (Olympic), ER (Eastern), SC (South Central), NC (North Central), OS (Oregon — the TripCheck cameras around Portland), or WA (airport cameras plus a few ferry-terminal cameras — most ferry-terminal cameras sit in NW and OL). Matching is case-insensitive; any other value is rejected. These are codes, not the region names wsdot_search_alerts takes." - added
Input schema / properties / region / maxLengthAdded value: +200 - changed
Input schema / properties / startMilepost / descriptionPrevious value: -"Start of milepost range to filter cameras."New value: +"Start of the milepost range to filter cameras. Either bound may be given alone; when both are given, startMilepost must not exceed endMilepost. Cameras reporting no milepost are always included." - added
Input schema / properties / stateRoute / maxLengthAdded value: +200 - added
Input schema / properties / titleContainsAdded value: +{ + "description": "Words to find in the camera title, as WSDOT wrote it. Case-insensitive; every whitespace-separated word must appear, in any order — \"Snoqualmie\" returns \"Snoqualmie Summit\" and \"East Snoqualmie Summit\" but not a nearby camera titled \"Hyak\". Most titles lead with route and milepost (\"I-90 at MP 52: …\"), so filter a route with stateRoute rather than here. Combines with the other filters. Omit to include every title.", + "maxLength": 200, + "type": "string" +} - added
Output schema / properties / appliedFilters / properties / titleContainsAdded value: +{ + "description": "Title words filter applied.", + "type": "string" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `api_unavailable`: WSDOT Traffic API is unreachable or returns a non-2xx response after retries. `invalid_access_code`: WSDOT rejected the request because WSDOT_ACCESS_CODE is missing, invalid, or not registered. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `api_unavailable`: WSDOT Traffic API is unreachable or returns a non-2xx response after retries. `invalid_access_code`: WSDOT rejected the request because WSDOT_ACCESS_CODE is missing, invalid, or not registered. `invalid_region`: The region is not one of the region codes the camera feed carries. `invalid_milepost_range`: startMilepost is greater than endMilepost. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "api_unavailable", - "invalid_access_code" -]New value: +[ + "api_unavailable", + "invalid_access_code", + "invalid_region", + "invalid_milepost_range" +]
5 tool updates
- Changed
wsdot_get_terminal_space2 fields changed- removed
Output schema / properties / nextOffset / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / nextOffset / typeAdded value: +[ + "number", + "null" +]
- Changed
wsdot_get_toll_rates2 fields changed- removed
Output schema / properties / nextOffset / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / nextOffset / typeAdded value: +[ + "number", + "null" +]
- Changed
wsdot_get_travel_times2 fields changed- removed
Output schema / properties / nextOffset / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / nextOffset / typeAdded value: +[ + "number", + "null" +]
- Changed
wsdot_search_alerts2 fields changed- removed
Output schema / properties / nextOffset / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / nextOffset / typeAdded value: +[ + "number", + "null" +]
- Changed
wsdot_search_cameras2 fields changed- removed
Output schema / properties / nextOffset / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / nextOffset / typeAdded value: +[ + "number", + "null" +]
12 tool updates
- Changed
wsdot_get_border_waits6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "crossings", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `api_unavailable`: WSDOT Traffic API is unreachable or returns a non-2xx response after retries. `invalid_access_code`: WSDOT rejected the request because WSDOT_ACCESS_CODE is missing, invalid, or not registered. Other values are possible when a failure originates below the handler.", + "examples": [ + "api_unavailable", + "invalid_access_code" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "crossings", - "totalCount" -]
- Changed
wsdot_get_ferry_alerts6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "alerts", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `api_unavailable`: WSF Ferry API is unreachable or returns a non-2xx response after retries. `invalid_access_code`: WSF rejected the request because WSDOT_ACCESS_CODE is missing, invalid, or not registered. Other values are possible when a failure originates below the handler.", + "examples": [ + "api_unavailable", + "invalid_access_code" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "alerts", - "totalCount" -]
- Changed
wsdot_get_ferry_routes6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "routes", + "tripDate", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `api_unavailable`: WSF Ferry API is unreachable or returns a non-2xx response after retries. `invalid_access_code`: WSF rejected the request because WSDOT_ACCESS_CODE is missing, invalid, or not registered. `invalid_date`: The provided tripDate is not a valid ISO 8601 date. Other values are possible when a failure originates below the handler.", + "examples": [ + "api_unavailable", + "invalid_access_code", + "invalid_date" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "routes", - "tripDate", - "totalCount" -]
- Changed
wsdot_get_ferry_schedule6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "sailings", + "tripDate", + "remainingOnly", + "totalSailings" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `api_unavailable`: WSF Ferry API is unreachable or returns a non-2xx response after retries. `invalid_access_code`: WSF rejected the request because WSDOT_ACCESS_CODE is missing, invalid, or not registered. `invalid_terminal_pair`: The terminal ID pair is invalid or does not form a valid ferry route. `invalid_date`: The provided tripDate is not a valid ISO 8601 date. Other values are possible when a failure originates below the handler.", + "examples": [ + "api_unavailable", + "invalid_access_code", + "invalid_terminal_pair", + "invalid_date" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "sailings", - "tripDate", - "remainingOnly", - "totalSailings" -]
- Changed
wsdot_get_ferry_terminals6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "terminals", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `api_unavailable`: WSF Ferry API is unreachable or returns a non-2xx response after retries. `invalid_access_code`: WSF rejected the request because WSDOT_ACCESS_CODE is missing, invalid, or not registered. Other values are possible when a failure originates below the handler.", + "examples": [ + "api_unavailable", + "invalid_access_code" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "terminals", - "totalCount" -]
- Changed
wsdot_get_mountain_passes6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "passes", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `api_unavailable`: WSDOT Traffic API is unreachable or returns a non-2xx response after retries. `invalid_access_code`: WSDOT rejected the request because WSDOT_ACCESS_CODE is missing, invalid, or not registered. Other values are possible when a failure originates below the handler.", + "examples": [ + "api_unavailable", + "invalid_access_code" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "passes", - "totalCount" -]
- Changed
wsdot_get_terminal_space6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "terminals", + "totalCount", + "nextOffset", + "hasMore" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `api_unavailable`: WSF Ferry API is unreachable or returns a non-2xx response after retries. `invalid_access_code`: WSF rejected the request because WSDOT_ACCESS_CODE is missing, invalid, or not registered. Other values are possible when a failure originates below the handler.", + "examples": [ + "api_unavailable", + "invalid_access_code" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "terminals", - "totalCount", - "nextOffset", - "hasMore" -]
- Changed
wsdot_get_toll_rates6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "rates", + "totalCount", + "nextOffset", + "hasMore" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `api_unavailable`: WSDOT Traffic API is unreachable or returns a non-2xx response after retries. `invalid_access_code`: WSDOT rejected the request because WSDOT_ACCESS_CODE is missing, invalid, or not registered. Other values are possible when a failure originates below the handler.", + "examples": [ + "api_unavailable", + "invalid_access_code" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "rates", - "totalCount", - "nextOffset", - "hasMore" -]
- Changed
wsdot_get_travel_times6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "corridors", + "totalCount", + "nextOffset", + "hasMore" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `api_unavailable`: WSDOT Traffic API is unreachable or returns a non-2xx response after retries. `invalid_access_code`: WSDOT rejected the request because WSDOT_ACCESS_CODE is missing, invalid, or not registered. Other values are possible when a failure originates below the handler.", + "examples": [ + "api_unavailable", + "invalid_access_code" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "corridors", - "totalCount", - "nextOffset", - "hasMore" -]
- Changed
wsdot_get_vessel_locations6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "vessels", + "totalCount" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `api_unavailable`: WSF Ferry API is unreachable or returns a non-2xx response after retries. `invalid_access_code`: WSF rejected the request because WSDOT_ACCESS_CODE is missing, invalid, or not registered. Other values are possible when a failure originates below the handler.", + "examples": [ + "api_unavailable", + "invalid_access_code" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "vessels", - "totalCount" -]
- Changed
wsdot_search_alerts6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "alerts", + "totalCount", + "nextOffset", + "hasMore", + "appliedFilters" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `api_unavailable`: WSDOT Traffic API is unreachable or returns a non-2xx response after retries. `invalid_access_code`: WSDOT rejected the request because WSDOT_ACCESS_CODE is missing, invalid, or not registered. Other values are possible when a failure originates below the handler.", + "examples": [ + "api_unavailable", + "invalid_access_code" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "alerts", - "totalCount", - "nextOffset", - "hasMore", - "appliedFilters" -]
- Changed
wsdot_search_cameras6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "cameras", + "totalCount", + "nextOffset", + "hasMore", + "appliedFilters" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `api_unavailable`: WSDOT Traffic API is unreachable or returns a non-2xx response after retries. `invalid_access_code`: WSDOT rejected the request because WSDOT_ACCESS_CODE is missing, invalid, or not registered. Other values are possible when a failure originates below the handler.", + "examples": [ + "api_unavailable", + "invalid_access_code" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "cameras", - "totalCount", - "nextOffset", - "hasMore", - "appliedFilters" -]
1 tool update
- Changed
wsdot_get_ferry_schedule2 fields changed- changed
Output schema / properties / sailings / items / properties / arrivalTime / descriptionPrevious value: -"Scheduled arrival time."New value: +"Scheduled arrival time (ISO 8601, UTC), on the same terms as departureTime. Absent on the routes WSF publishes no arrival time for." - changed
Output schema / properties / sailings / items / properties / departureTime / descriptionPrevious value: -"Scheduled departure time."New value: +"Scheduled departure time (ISO 8601, UTC). WSF publishes schedules in Pacific time, so a sailing late in the service day carries the following UTC calendar date and will not match tripDate. Convert to America/Los_Angeles before showing a clock time."
4 tool updates
- Changed
wsdot_get_terminal_space7 fields changed- added
Input schema / properties / limitAdded value: +{ + "description": "Maximum terminals to return in this page (1–20). Defaults to 5. Counts terminals, not sailings.", + "maximum": 20, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Zero-based index of the first terminal to return, for paging. Defaults to 0.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / hasMoreAdded value: +{ + "description": "True when more terminals remain beyond the current page.", + "type": "boolean" +} - added
Output schema / properties / nextOffsetAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Offset to pass to retrieve the next page, or null when this is the last page." +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Optional guidance when no terminal space data is available or the filter matched nothing. Absent on normal results."New value: +"Informational note about the page window, or guidance when no terminal space data is available, the filter matched nothing, or the offset ran past the end." - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Number of terminals returned."New value: +"Total terminals matching the filter across all pages (not just this page). Counts terminals, not sailings." - changed
Output schema / requiredPrevious value: -[ - "terminals", - "totalCount" -]New value: +[ + "terminals", + "totalCount", + "nextOffset", + "hasMore" +]
- Changed
wsdot_get_toll_rates7 fields changed- added
Input schema / properties / limitAdded value: +{ + "description": "Maximum toll rates to return in this page (1–500). Defaults to 50.", + "maximum": 500, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Zero-based index of the first toll rate to return, for paging. Defaults to 0.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / hasMoreAdded value: +{ + "description": "True when more toll rates remain beyond the current page.", + "type": "boolean" +} - added
Output schema / properties / nextOffsetAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Offset to pass to retrieve the next page, or null when this is the last page." +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Optional notice when no toll rate data is available. Absent on normal results."New value: +"Informational note about the page window, or guidance when no toll rate data is available or the offset ran past the end." - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total number of toll rate entries returned."New value: +"Total toll rate entries across all pages (not just this page)." - changed
Output schema / requiredPrevious value: -[ - "rates", - "totalCount" -]New value: +[ + "rates", + "totalCount", + "nextOffset", + "hasMore" +]
- Changed
wsdot_get_travel_times7 fields changed- added
Input schema / properties / limitAdded value: +{ + "description": "Maximum corridors to return in this page (1–500). Defaults to 50.", + "maximum": 500, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Zero-based index of the first corridor to return, for paging. Defaults to 0.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / hasMoreAdded value: +{ + "description": "True when more corridors remain beyond the current page.", + "type": "boolean" +} - added
Output schema / properties / nextOffsetAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Offset to pass to retrieve the next page, or null when this is the last page." +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Optional guidance when no corridors matched the route filter. Absent when results are returned."New value: +"Informational note about the page window, or guidance when no corridors matched the route filter or the offset ran past the end." - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total number of corridors returned."New value: +"Total corridors matching the filter across all pages (not just this page)." - changed
Output schema / requiredPrevious value: -[ - "corridors", - "totalCount" -]New value: +[ + "corridors", + "totalCount", + "nextOffset", + "hasMore" +]
- Changed
wsdot_search_alerts7 fields changed- added
Input schema / properties / limitAdded value: +{ + "description": "Maximum alerts to return in this page (1–500). Defaults to 50.", + "maximum": 500, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Zero-based index of the first alert to return, for paging. Defaults to 0.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - added
Output schema / properties / hasMoreAdded value: +{ + "description": "True when more alerts remain beyond the current page.", + "type": "boolean" +} - added
Output schema / properties / nextOffsetAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Offset to pass to retrieve the next page, or null when this is the last page." +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Optional guidance when no alerts matched — suggests broadening or removing filters. Absent when results are returned."New value: +"Informational note about the page window, or guidance when no alerts matched the filters or the offset ran past the end." - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total number of alerts returned."New value: +"Total alerts matching the filters across all pages (not just this page)." - changed
Output schema / requiredPrevious value: -[ - "alerts", - "totalCount", - "appliedFilters" -]New value: +[ + "alerts", + "totalCount", + "nextOffset", + "hasMore", + "appliedFilters" +]
2 tool updates
- Changed
wsdot_get_ferry_alerts6 fields changed- added
Output schema / properties / alerts / items / properties / affectsAllRoutesAdded value: +{ + "description": "True when the alert applies fleet-wide. A fleet-wide alert need not enumerate routes, so while this is true an empty impactedRouteIds means every route rather than none.", + "type": "boolean" +} - changed
Output schema / properties / alerts / items / properties / alertDescription / descriptionPrevious value: -"Description of the alert or disruption."New value: +"One-line summary of the alert or disruption, as shown on the route pages. Falls back to the title when upstream publishes no summary." - added
Output schema / properties / alerts / items / properties / alertTitleAdded value: +{ + "description": "The bulletin's own title.", + "type": "string" +} - added
Output schema / properties / alerts / items / properties / alertTypeAdded value: +{ + "description": "Alert kind as WSF categorizes it, e.g. \"All Alerts\".", + "type": "string" +} - added
Output schema / properties / alerts / items / properties / bulletinTextAdded value: +{ + "description": "Full bulletin body as plain text, normalized from the upstream HTML — links are rendered inline as \"link text (url)\". Detail that appears nowhere else, such as a replacement sailing, lives here.", + "type": "string" +} - changed
Output schema / properties / alerts / items / properties / impactedRouteIds / descriptionPrevious value: -"Route IDs affected by this alert. Cross-reference with wsdot_get_ferry_routes to get route names; some seasonal or interisland route IDs may not be listed there for a given date."New value: +"Route IDs affected by this alert. Cross-reference with wsdot_get_ferry_routes to get route names; some seasonal or interisland route IDs may not be listed there for a given date. Empty means no specific routes unless affectsAllRoutes is true, which makes it fleet-wide."
- Changed
wsdot_search_alerts2 fields changed- changed
Output schema / properties / alerts / items / properties / extendedDescription / descriptionPrevious value: -"Full description of the alert."New value: +"Full description of the alert, normalized to plain text on the same terms as headlineDescription. Often absent — most alerts carry only a headline." - changed
Output schema / properties / alerts / items / properties / headlineDescription / descriptionPrevious value: -"Short summary of the alert."New value: +"Short summary of the alert, as plain text. Upstream authors these in a rich-text editor, so any markup is normalized away and a link is rendered inline as \"link text (url)\"."
5 tool updates
- Changed
wsdot_get_ferry_schedule1 field changed- removed
Output schema / properties / sailings / items / properties / isCancelledRemoved value: -{ - "description": "Whether this sailing is cancelled.", - "type": "boolean" -}
- Changed
wsdot_get_terminal_space7 fields changed- added
Output schema / properties / terminals / items / properties / departingSpaces / items / properties / arrivingTerminalIdsAdded value: +{ + "description": "Numeric IDs of the terminals this sailing serves — the destinations. Pass one to wsdot_get_ferry_schedule as arrivingTerminalId, or resolve names with wsdot_get_ferry_terminals.", + "items": { + "type": "number" + }, + "type": "array" +} - removed
Output schema / properties / terminals / items / properties / departingSpaces / items / properties / arrivingTerminalNameRemoved value: -{ - "description": "Destination terminal name.", - "type": "string" -} - added
Output schema / properties / terminals / items / properties / departingSpaces / items / properties / displayDriveUpSpaceAdded value: +{ + "description": "Whether WSF publishes a drive-up count for this sailing. False means driveUpSpaceCount is not reported, not that the lane is empty.", + "type": "boolean" +} - added
Output schema / properties / terminals / items / properties / departingSpaces / items / properties / displayReservableSpaceAdded value: +{ + "description": "Whether this sailing takes vehicle reservations. False means reservableSpaceCount does not apply.", + "type": "boolean" +} - changed
Output schema / properties / terminals / items / properties / departingSpaces / items / properties / driveUpSpaceCount / descriptionPrevious value: -"Available drive-up vehicle spaces. Zero means full."New value: +"Available drive-up vehicle spaces. Zero means full — oversubscribed sailings report a negative count upstream and are floored to zero here, so this value is never negative." - added
Output schema / properties / terminals / items / properties / departingSpaces / items / properties / itineraryLabelAdded value: +{ + "description": "Upstream itinerary string for the sailing, e.g. \"Anacortes -> Friday Harbor\". A display label only — it may name the departing terminal or several stops, so do not read it as the destination.", + "type": "string" +} - changed
Output schema / properties / terminals / items / properties / departingSpaces / items / properties / reservableSpaceCount / descriptionPrevious value: -"Available reservable vehicle spaces."New value: +"Available reservable vehicle spaces, floored at zero like driveUpSpaceCount. Zero means no reservable space remains."
- Changed
wsdot_get_travel_times4 fields changed- changed
Input schema / properties / route / descriptionPrevious value: -"Optional text filter applied to corridor names (e.g. \"I-5\", \"SR 520\", \"I-405\"). Case-insensitive. Omit to return all corridors."New value: +"Optional filter. A route designation — \"I-5\", \"5\", \"005\", \"SR 520\", \"520\" — matches every corridor whose start or end point is on that route, whichever form the feed reports. Any text also matches the corridor name as a case-insensitive substring, so \"Everett\" finds the Seattle-Everett corridors. Omit to return all corridors." - changed
Output schema / properties / corridors / items / properties / averageTimeInMinutes / descriptionPrevious value: -"Historical average travel time in minutes."New value: +"Historical average travel time in minutes. Absent when WSDOT reports no measurement for the corridor." - changed
Output schema / properties / corridors / items / properties / currentTimeInMinutes / descriptionPrevious value: -"Current travel time in minutes."New value: +"Current travel time in minutes. Absent when WSDOT reports no measurement for the corridor — a reversible express lane closed in this direction reports none." - changed
Output schema / properties / corridors / items / properties / delayInMinutes / descriptionPrevious value: -"Delay above average in minutes. Positive means congestion."New value: +"Delay above average in minutes. Positive means congestion. Absent when either travel time is unavailable."
- Changed
wsdot_search_alerts3 fields changed- changed
Input schema / properties / endMilepost / descriptionPrevious value: -"End of milepost range to filter alerts."New value: +"End of the milepost range. Matched by extent overlap like startMilepost, so an alert beginning inside the range and continuing past it is returned." - changed
Input schema / properties / startMilepost / descriptionPrevious value: -"Start of milepost range to filter alerts."New value: +"Start of the milepost range. An alert matches when its extent overlaps the range, so a closure running from MP 10 to MP 30 is returned for a range starting at MP 20. Either bound may be given alone. Alerts reporting no milepost are always included." - changed
Input schema / properties / stateRoute / descriptionPrevious value: -"State route to filter by. Accepts natural forms — \"I-90\", \"90\", \"090\", \"SR 520\", \"520\" — matched case- and space-insensitively to the canonical WSDOT route number. Omit to include all routes."New value: +"State route to filter by. Accepts natural forms — \"I-90\", \"90\", \"090\", \"SR 520\", \"520\" — matched case- and space-insensitively to the route number. A route-type prefix is compared only when both sides carry one, so \"SR 26\" never matches US 26 while a bare \"26\" matches either. Omit to include all routes."
- Changed
wsdot_search_cameras1 field changed- changed
Input schema / properties / stateRoute / descriptionPrevious value: -"State route to filter by. Accepts natural forms — \"I-90\", \"90\", \"090\", \"SR 520\", \"520\" — matched case- and space-insensitively to the canonical WSDOT route number. Omit to include all routes."New value: +"State route to filter by. Accepts natural forms — \"I-90\", \"90\", \"090\", \"SR 520\", \"520\" — matched case- and space-insensitively to the route number. Camera road names carry a route-type prefix, which is compared when the filter carries one too: \"SR 26\" excludes US 26, while a bare \"26\" returns both. A lettered suffix is part of the route, so \"US 97\" excludes US 97A. Omit to include all routes."
2 tool updates
- Changed
wsdot_search_alerts1 field changed- changed
Input schema / properties / stateRoute / descriptionPrevious value: -"Zero-padded 3-digit state route number (e.g. \"005\" for I-5, \"090\" for I-90, \"520\" for SR 520)."New value: +"State route to filter by. Accepts natural forms — \"I-90\", \"90\", \"090\", \"SR 520\", \"520\" — matched case- and space-insensitively to the canonical WSDOT route number. Omit to include all routes."
- Changed
wsdot_search_cameras8 fields changed- added
Input schema / properties / limitAdded value: +{ + "description": "Maximum cameras to return in this page (1–500). Defaults to 50.", + "maximum": 500, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "description": "Zero-based index of the first camera to return, for paging. Defaults to 0.", + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / stateRoute / descriptionPrevious value: -"Zero-padded 3-digit state route number (e.g. \"005\" for I-5, \"090\" for I-90)."New value: +"State route to filter by. Accepts natural forms — \"I-90\", \"90\", \"090\", \"SR 520\", \"520\" — matched case- and space-insensitively to the canonical WSDOT route number. Omit to include all routes." - added
Output schema / properties / hasMoreAdded value: +{ + "description": "True when more cameras remain beyond the current page.", + "type": "boolean" +} - added
Output schema / properties / nextOffsetAdded value: +{ + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "description": "Offset to pass to retrieve the next page, or null when this is the last page." +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Informational note about result truncation, copyright, or empty results. Absent when not applicable."New value: +"Informational note about the page window, copyright, or empty results. Absent when not applicable." - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total number of cameras returned."New value: +"Total cameras matching the filters across all pages (not just this page)." - changed
Output schema / requiredPrevious value: -[ - "cameras", - "totalCount", - "appliedFilters" -]New value: +[ + "cameras", + "totalCount", + "nextOffset", + "hasMore", + "appliedFilters" +]
7 tool updates
- Changed
wsdot_get_border_waits6 fields changed- changed
Output schema / properties / crossings / items / properties / crossingName / descriptionPrevious value: -"Name of the border crossing."New value: +"Route-code crossing identifier (e.g. \"I5\", \"I5Nexus\", \"SR539\", \"SR9\"). See location.description for the readable name." - changed
Output schema / properties / crossings / items / properties / location / descriptionPrevious value: -"Geographic location of the crossing."New value: +"Geographic location and readable name of the crossing." - added
Output schema / properties / crossings / items / properties / location / properties / descriptionAdded value: +{ + "description": "Readable crossing/lane name (e.g. \"I-5 General Purpose\", \"I-5 Nexus Lane\").", + "type": "string" +} - changed
Output schema / properties / crossings / items / properties / location / properties / direction / descriptionPrevious value: -"Travel direction."New value: +"Travel direction code (N/S/E/W/B); frequently null for border crossings." - changed
Output schema / properties / crossings / items / properties / updateTime / descriptionPrevious value: -"When this wait time was last updated."New value: +"When this wait time was last updated (ISO 8601)." - changed
Output schema / properties / crossings / items / properties / waitTimeInMinutes / descriptionPrevious value: -"Current vehicle wait time in minutes."New value: +"Current vehicle wait time in minutes. Omitted when the crossing reports no data (WSDOT emits a -1 sentinel for closed/unmonitored crossings)."
- Changed
wsdot_get_ferry_alerts1 field changed- changed
Output schema / properties / alerts / items / properties / impactedRouteIds / descriptionPrevious value: -"Route IDs affected by this alert. Cross-reference with wsdot_get_ferry_routes to get route names."New value: +"Route IDs affected by this alert. Cross-reference with wsdot_get_ferry_routes to get route names; some seasonal or interisland route IDs may not be listed there for a given date."
- Changed
wsdot_get_mountain_passes11 fields changed- changed
Output schema / properties / passes / items / properties / dateUpdated / descriptionPrevious value: -"Timestamp of the last condition update."New value: +"Timestamp of the last condition update (ISO 8601)." - changed
Output schema / properties / passes / items / properties / restrictionOne / descriptionPrevious value: -"Primary travel restriction, if any."New value: +"Primary travel/traction restriction (typically one direction of travel)." - removed
Output schema / properties / passes / items / properties / restrictionOne / properties / commentRemoved value: -{ - "description": "Restriction description (e.g. \"Traction Tires Required\").", - "type": "string" -} - added
Output schema / properties / passes / items / properties / restrictionOne / properties / textAdded value: +{ + "description": "Restriction / traction-law text (e.g. \"Traction Tires Required, Chains Required (Except All Wheel Drive)\"). Reads \"No current information available\" or \"No restrictions\" when nothing is in effect.", + "type": "string" +} - added
Output schema / properties / passes / items / properties / restrictionOne / properties / travelDirectionAdded value: +{ + "description": "Direction this restriction applies to (e.g. \"Northbound\", \"Eastbound\", \"Both directions\").", + "type": "string" +} - removed
Output schema / properties / passes / items / properties / restrictionOne / properties / typeRemoved value: -{ - "description": "Restriction type code.", - "type": "string" -} - changed
Output schema / properties / passes / items / properties / restrictionTwo / descriptionPrevious value: -"Secondary travel restriction, if any."New value: +"Secondary travel/traction restriction (typically the opposite direction)." - removed
Output schema / properties / passes / items / properties / restrictionTwo / properties / commentRemoved value: -{ - "description": "Restriction description.", - "type": "string" -} - added
Output schema / properties / passes / items / properties / restrictionTwo / properties / textAdded value: +{ + "description": "Restriction / traction-law text for the second direction.", + "type": "string" +} - added
Output schema / properties / passes / items / properties / restrictionTwo / properties / travelDirectionAdded value: +{ + "description": "Direction this restriction applies to (e.g. \"Southbound\", \"Westbound\").", + "type": "string" +} - removed
Output schema / properties / passes / items / properties / restrictionTwo / properties / typeRemoved value: -{ - "description": "Restriction type code.", - "type": "string" -}
- Changed
wsdot_get_toll_rates2 fields changed- changed
Output schema / properties / rates / items / properties / timeUpdated / descriptionPrevious value: -"When this toll rate was last updated."New value: +"When this toll rate was last updated (ISO 8601)." - changed
Output schema / properties / rates / items / properties / travelDirection / descriptionPrevious value: -"Travel direction for this toll segment (e.g. \"N\", \"S\", \"E\", \"W\")."New value: +"Travel direction code for this toll segment: N (north), S (south), E (east), W (west)."
- Changed
wsdot_get_travel_times3 fields changed- changed
Output schema / properties / corridors / items / properties / endPoint / properties / direction / descriptionPrevious value: -"Travel direction."New value: +"Travel direction code: N (north), S (south), E (east), W (west)." - changed
Output schema / properties / corridors / items / properties / startPoint / properties / direction / descriptionPrevious value: -"Travel direction."New value: +"Travel direction code: N (north), S (south), E (east), W (west)." - changed
Output schema / properties / corridors / items / properties / timeUpdated / descriptionPrevious value: -"When the travel time data was last updated."New value: +"When the travel time data was last updated (ISO 8601)."
- Changed
wsdot_search_alerts5 fields changed- changed
Output schema / properties / alerts / items / properties / endRoadwayLocation / properties / direction / descriptionPrevious value: -"Travel direction."New value: +"Travel direction code: N/S/E/W, B (both directions), A (alternating); may appear as NB/SB/EB/WB." - changed
Output schema / properties / alerts / items / properties / endTime / descriptionPrevious value: -"When the event is expected to end."New value: +"When the event is expected to end (ISO 8601)." - changed
Output schema / properties / alerts / items / properties / lastUpdatedTime / descriptionPrevious value: -"When this alert was last updated."New value: +"When this alert was last updated (ISO 8601)." - changed
Output schema / properties / alerts / items / properties / startRoadwayLocation / properties / direction / descriptionPrevious value: -"Travel direction."New value: +"Travel direction code: N/S/E/W, B (both directions), A (alternating); may appear as NB/SB/EB/WB." - changed
Output schema / properties / alerts / items / properties / startTime / descriptionPrevious value: -"When the event started or is scheduled to start."New value: +"When the event started or is scheduled to start (ISO 8601)."
- Changed
wsdot_search_cameras1 field changed- changed
Output schema / properties / cameras / items / properties / direction / descriptionPrevious value: -"Traffic direction monitored."New value: +"Traffic-direction code monitored: N/S/E/W, B (both), NB/SB/EB/WB. Some sites use other location-specific markers."
3 tool updates
- Changed
wsdot_get_toll_rates8 fields changed- added
Output schema / properties / rates / items / properties / endLatitudeAdded value: +{ + "description": "Latitude of the segment end point.", + "type": "number" +} - added
Output schema / properties / rates / items / properties / endLongitudeAdded value: +{ + "description": "Longitude of the segment end point.", + "type": "number" +} - changed
Output schema / properties / rates / items / properties / message / descriptionPrevious value: -"Dynamic message shown on toll sign."New value: +"Dynamic message associated with this toll." - removed
Output schema / properties / rates / items / properties / signTextRemoved value: -{ - "description": "Text displayed on the toll rate sign.", - "type": "string" -} - added
Output schema / properties / rates / items / properties / startLatitudeAdded value: +{ + "description": "Latitude of the segment start point.", + "type": "number" +} - added
Output schema / properties / rates / items / properties / startLongitudeAdded value: +{ + "description": "Longitude of the segment start point.", + "type": "number" +} - removed
Output schema / properties / rates / items / properties / tollConditionRemoved value: -{ - "description": "Numeric toll condition code.", - "type": "number" -} - added
Output schema / properties / rates / items / properties / travelDirectionAdded value: +{ + "description": "Travel direction for this toll segment (e.g. \"N\", \"S\", \"E\", \"W\").", + "type": "string" +}
- Changed
wsdot_search_alerts1 field changed- changed
Input schema / properties / region / descriptionPrevious value: -"WSDOT region name: Northwest, Olympic, Southwest, South Central, North Central, or Eastern."New value: +"WSDOT region name as it appears in alert data: \"Northwest\", \"Olympic\", \"Southwest\", \"South Central\", \"North Central\", or \"Eastern\". Matching is case-insensitive."
- Changed
wsdot_search_cameras1 field changed- changed
Input schema / properties / region / descriptionPrevious value: -"WSDOT region name: Northwest, Olympic, Southwest, South Central, North Central, or Eastern."New value: +"WSDOT region code: NW (Northwest), SW (Southwest), OL (Olympic), ER (Eastern), SC (South Central), OS (Olympic South), NC (North Central), or WA (statewide). Matching is case-insensitive."
12 tool updates
- Changed
wsdot_get_border_waits1 field changed- added
Output schema / properties / noticeAdded value: +{ + "description": "Optional notice when no crossing data is available. Absent on normal results.", + "type": "string" +}
- Changed
wsdot_get_ferry_alerts1 field changed- added
Output schema / properties / noticeAdded value: +{ + "description": "Optional notice when no alerts are active. Absent when alerts are present.", + "type": "string" +}
- Changed
wsdot_get_ferry_routes1 field changed- added
Output schema / properties / noticeAdded value: +{ + "description": "Optional notice when no routes are available for the date. Absent on normal results.", + "type": "string" +}
- Changed
wsdot_get_ferry_schedule2 fields changed- added
Output schema / properties / noticeAdded value: +{ + "description": "Optional notice when no sailings are found — e.g. invalid terminal pair or no service for this date. Absent when sailings are present.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "tripDate", - "remainingOnly", - "sailings", - "totalSailings" -]New value: +[ + "sailings", + "tripDate", + "remainingOnly", + "totalSailings" +]
- Changed
wsdot_get_ferry_terminals2 fields changed- added
Output schema / properties / noticeAdded value: +{ + "description": "Optional notice when no terminal data is available. Absent on normal results.", + "type": "string" +} - changed
Output schema / properties / totalCount / descriptionPrevious value: -"Total number of terminals."New value: +"Total number of terminals returned."
- Changed
wsdot_get_mountain_passes3 fields changed- added
Output schema / properties / noticeAdded value: +{ + "description": "Optional notice when no pass data is available — e.g. API temporarily unavailable. Absent on normal results.", + "type": "string" +} - added
Output schema / properties / totalCountAdded value: +{ + "description": "Total number of passes returned.", + "type": "number" +} - changed
Output schema / requiredPrevious value: -[ - "passes" -]New value: +[ + "passes", + "totalCount" +]
- Changed
wsdot_get_terminal_space2 fields changed- added
Output schema / properties / noticeAdded value: +{ + "description": "Optional guidance when no terminal space data is available or the filter matched nothing. Absent on normal results.", + "type": "string" +} - added
Output schema / properties / terminalFilterAdded value: +{ + "description": "The terminal ID filter applied, or absent if no filter was used.", + "type": "number" +}
- Changed
wsdot_get_toll_rates1 field changed- added
Output schema / properties / noticeAdded value: +{ + "description": "Optional notice when no toll rate data is available. Absent on normal results.", + "type": "string" +}
- Changed
wsdot_get_travel_times2 fields changed- added
Output schema / properties / noticeAdded value: +{ + "description": "Optional guidance when no corridors matched the route filter. Absent when results are returned.", + "type": "string" +} - added
Output schema / properties / routeFilterAdded value: +{ + "description": "The route name filter applied (lowercased), or absent if no filter was used.", + "type": "string" +}
- Changed
wsdot_get_vessel_locations1 field changed- added
Output schema / properties / noticeAdded value: +{ + "description": "Optional notice when no vessel data is available. Absent on normal results.", + "type": "string" +}
- Changed
wsdot_search_alerts3 fields changed- added
Output schema / properties / appliedFiltersAdded value: +{ + "additionalProperties": false, + "description": "Active filters applied to the alert search.", + "properties": { + "endMilepost": { + "description": "End milepost filter applied.", + "type": "number" + }, + "region": { + "description": "Region filter applied.", + "type": "string" + }, + "startMilepost": { + "description": "Start milepost filter applied.", + "type": "number" + }, + "stateRoute": { + "description": "State route filter applied.", + "type": "string" + } + }, + "type": "object" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "Optional guidance when no alerts matched — suggests broadening or removing filters. Absent when results are returned.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "alerts", - "totalCount" -]New value: +[ + "alerts", + "totalCount", + "appliedFilters" +]
- Changed
wsdot_search_cameras4 fields changed- added
Output schema / properties / appliedFiltersAdded value: +{ + "additionalProperties": false, + "description": "Active filters applied to the camera search.", + "properties": { + "endMilepost": { + "description": "End milepost filter applied.", + "type": "number" + }, + "region": { + "description": "Region filter applied.", + "type": "string" + }, + "startMilepost": { + "description": "Start milepost filter applied.", + "type": "number" + }, + "stateRoute": { + "description": "State route filter applied.", + "type": "string" + } + }, + "type": "object" +} - removed
Output schema / properties / noteRemoved value: -{ - "description": "Informational note about result truncation or copyright.", - "type": "string" -} - added
Output schema / properties / noticeAdded value: +{ + "description": "Informational note about result truncation, copyright, or empty results. Absent when not applicable.", + "type": "string" +} - changed
Output schema / requiredPrevious value: -[ - "cameras", - "totalCount" -]New value: +[ + "cameras", + "totalCount", + "appliedFilters" +]
Related MCP Connectors
Live road conditions in 37 US states: incidents, closures, chain controls, cameras, wildfires.
Transport for NSW MCP — journey planning, live departures, service alerts
FAA Delays MCP — live US airport operational status (FAA, free, no auth).
Conditions, trip briefs, alerts, permits, roads, hourly, areas, accuracy for WA, OR, BC. No account.
Related MCP Servers
- AlicenseAqualityAmaintenanceProvides live California road conditions, route planning, and an AI assistant over MCP, enabling natural-language queries about traffic, closures, chain controls, and more.104MIT
- AlicenseBqualityDmaintenanceProvides real-time access to BC highway conditions, road closures, weather alerts, and traffic incidents through the Open511-DriveBC API with smart caching.4MIT
- AlicenseAqualityAmaintenanceEnables querying verified-live US traffic cameras by state, route, or named corridor, with camera status and state fleet uptime from official DOT feeds.537 npmMIT
- AlicenseAqualityCmaintenanceMCP server for ANWB traffic information, route planning, and location search in the Netherlands. Provides real-time traffic incidents, route calculation with turn-by-turn directions, and location search via natural language.618 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.