Skip to main content
Glama

Server Details

WA highway conditions, ferry schedules, vessel locations, toll rates, and border waits via MCP.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
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

A4.7/5.0

Scored across 12 tools

Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count5/5

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.

Completeness5/5

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 tools
wsdot_get_border_waitsGet Border Wait TimesA
Read-only
Inspect

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoOptional notice when no crossing data is available. Absent on normal results.
crossingsNoAll WA/Canada border crossing wait times.
totalCountNoTotal number of crossings returned.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
alertsNoActive ferry service alerts and disruptions.
noticeNoOptional notice when no alerts are active. Absent when alerts are present.
totalCountNoTotal number of active alerts.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tripDateNoDate for which to list routes, in ISO 8601 format (YYYY-MM-DD). Defaults to today if omitted.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoOptional notice when no routes are available for the date. Absent on normal results.
routesNoFerry routes operating on the requested date.
tripDateNoDate for which routes were retrieved (ISO 8601).
totalCountNoTotal number of routes returned.

TDQS

A4.4/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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

For a single-parameter, read-only tool with an output schema, the description covers 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tripDateNoDate in ISO 8601 format (YYYY-MM-DD). Defaults to today if omitted.
remainingOnlyNoWhen true, returns only future sailings for today. Ignored for future dates. Default: false.
arrivingTerminalIdYesNumeric ID of the arriving terminal.
departingTerminalIdYesNumeric ID of the departing terminal. Use wsdot_get_ferry_terminals to look up terminal IDs.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoOptional notice when no sailings are found — e.g. invalid terminal pair or no service for this date. Absent when sailings are present.
sailingsNoScheduled sailings for this route and date.
tripDateNoDate of the schedule (ISO 8601).
annotationsNoNotes 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.
sailingNotesNoA 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.
remainingOnlyNoWhether the result holds only today's remaining sailings. False for any date other than today, whatever was requested.
totalSailingsNoTotal number of sailings returned.
arrivingTerminalNameNoArriving terminal name.
departingTerminalNameNoDeparting terminal name.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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

With an output schema present, 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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoOptional notice when no terminal data is available. Absent on normal results.
terminalsNoAll WSF ferry terminals.
totalCountNoTotal number of terminals returned.

TDQS

A4.9/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoOptional notice when no pass data is available — e.g. API temporarily unavailable. Absent on normal results.
passesNoAll WA mountain pass conditions.
totalCountNoTotal number of passes returned.

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum terminals to return in this page (1–20). Defaults to 5. Counts terminals, not sailings.
offsetNoZero-based index of the first terminal to return, for paging. Defaults to 0.
departingTerminalIdNoFilter to a specific terminal by numeric ID. Omit to return all terminals.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoInformational 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.
hasMoreNoTrue when more terminals remain beyond the current page.
terminalsNoTerminal space availability by terminal.
nextOffsetNoOffset to pass to retrieve the next page, or null when this is the last page.
totalCountNoTotal terminals matching the filter across all pages (not just this page). Counts terminals, not sailings.
terminalFilterNoThe terminal ID filter applied, or absent if no filter was used.

TDQS

A4.8/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum toll rates to return in this page (1–500). Defaults to 50. A large page ends sooner, at the 24,000-byte response budget.
offsetNoZero-based index of the first toll rate to return, for paging. Defaults to 0.
stateRouteNoTolled 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

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
ratesNoCurrent toll rates for the matching tolled facilities.
noticeNoInformational 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.
hasMoreNoTrue when more toll rates remain beyond the current page.
nextOffsetNoOffset to pass to retrieve the next page, or null when this is the last page.
totalCountNoTotal toll rate entries matching the filter across all pages (not just this page).
appliedFiltersNoActive filters applied to the toll rates. Absent when no filter was applied.

TDQS

A4.4/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum corridors to return in this page (1–500). Defaults to 50. A large page ends sooner, at the 24,000-byte response budget.
routeNoOptional 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.
offsetNoZero-based index of the first corridor to return, for paging. Defaults to 0.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoInformational note about the page window, or guidance when no corridors matched the route filter or the offset ran past the end.
hasMoreNoTrue when more corridors remain beyond the current page.
corridorsNoTravel time corridors matching the filter.
nextOffsetNoOffset to pass to retrieve the next page, or null when this is the last page.
totalCountNoTotal corridors matching the filter across all pages (not just this page).
routeFilterNoThe route name filter applied (lowercased), or absent if no filter was used.

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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

With an output schema present and 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.

Parameters4/5

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.

Purpose5/5

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

The description states a specific verb and resource: '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.

Usage Guidelines4/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoOptional notice when no vessel data is available. Absent on normal results.
vesselsNoAll WSF vessels with real-time position data.
totalCountNoTotal number of vessels returned.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum 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.
offsetNoZero-based index of the first alert to return, for paging. Defaults to 0.
regionNoWSDOT 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.
stateRouteNoState 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.
endMilepostNoEnd of the milepost range. Matched by extent overlap like startMilepost, so an alert beginning inside the range and continuing past it is returned.
startMilepostNoStart 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

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
alertsNoMatching highway alerts.
noticeNoInformational note about the page window, or guidance when no alerts matched the filters or the offset ran past the end.
hasMoreNoTrue when more alerts remain beyond the current page.
nextOffsetNoOffset to pass to retrieve the next page, or null when this is the last page.
totalCountNoTotal alerts matching the filters across all pages (not just this page).
appliedFiltersNoActive filters applied to the alert search.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum cameras to return in this page (1–500). Defaults to 50. A large page ends sooner, at the 24,000-byte response budget.
offsetNoZero-based index of the first camera to return, for paging. Defaults to 0.
regionNoWSDOT 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.
stateRouteNoState 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.
endMilepostNoEnd of the milepost range to filter cameras.
startMilepostNoStart 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.
titleContainsNoWords 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

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoInformational note about the page window, copyright, or empty results. Absent when not applicable.
camerasNoCamera metadata and image URLs. Images are copyright WSDOT.
hasMoreNoTrue when more cameras remain beyond the current page.
nextOffsetNoOffset to pass to retrieve the next page, or null when this is the last page.
totalCountNoTotal cameras matching the filters across all pages (not just this page).
appliedFiltersNoActive filters applied to the camera search.

TDQS

A4.5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and each parameter 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 4 tool updates
    • Changedwsdot_get_ferry_routes2 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • addedOutput schema / properties / routes / items / properties / terminalPairs
        Added 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"
        +}
    • Changedwsdot_get_ferry_schedule9 fields changed
      • addedOutput schema / properties / annotations
        Added 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"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / remainingOnly / description
        Previous 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."
      • addedOutput schema / properties / sailingNotes
        Added 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"
        +}
      • changedOutput schema / properties / sailings / items / description
        Previous 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."
      • addedOutput schema / properties / sailings / items / properties / annotationIndexes
        Added 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"
        +}
      • addedOutput schema / properties / sailings / items / properties / loadingRule
        Added 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"
        +}
      • addedOutput schema / properties / sailings / items / properties / vesselHandicapAccessible
        Added value: +{
        +  "description": "Whether WSF marks the assigned vessel as handicap accessible.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / sailings / items / properties / vesselId
        Added value: +{
        +  "description": "ID of the assigned vessel — the same vesselId wsdot_get_vessel_locations reports.",
        +  "type": "number"
        +}
    • Changedwsdot_get_ferry_terminals3 fields changed
      • changedOutput schema / properties / terminals / items / properties / terminalId / description
        Previous 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."
      • changedOutput schema / properties / terminals / items / properties / terminalName / description
        Previous value: -"Full terminal name (e.g. \"Bainbridge Island\")."New value: +"Full terminal name (e.g. \"Bainbridge Island\"). Absent when upstream omits it."
      • removedOutput schema / properties / terminals / items / required
        Removed value: -[
        -  "terminalId",
        -  "terminalName"
        -]
    • Changedwsdot_get_mountain_passes3 fields changed
      • changedOutput schema / properties / passes / items / properties / mountainPassId / description
        Previous value: -"Numeric identifier for the pass."New value: +"Numeric identifier for the pass. Absent when upstream omits it."
      • changedOutput schema / properties / passes / items / properties / mountainPassName / description
        Previous value: -"Human-readable pass name (e.g. \"Snoqualmie Pass\")."New value: +"Human-readable pass name (e.g. \"Snoqualmie Pass\"). Absent when upstream omits it."
      • removedOutput schema / properties / passes / items / required
        Removed value: -[
        -  "mountainPassId",
        -  "mountainPassName"
        -]
  2. 6 tool updates
    • Changedwsdot_get_ferry_schedule6 fields changed
      • addedInput schema / properties / arrivingTerminalId / exclusiveMinimum
        Added value: +0
      • addedInput schema / properties / arrivingTerminalId / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / arrivingTerminalId / type
        Previous value: -"number"New value: +"integer"
      • addedInput schema / properties / departingTerminalId / exclusiveMinimum
        Added value: +0
      • addedInput schema / properties / departingTerminalId / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / departingTerminalId / type
        Previous value: -"number"New value: +"integer"
    • Changedwsdot_get_terminal_space3 fields changed
      • addedInput schema / properties / departingTerminalId / exclusiveMinimum
        Added value: +0
      • addedInput schema / properties / departingTerminalId / maximum
        Added value: +9007199254740991
      • changedInput schema / properties / departingTerminalId / type
        Previous value: -"number"New value: +"integer"
    • Changedwsdot_get_toll_rates8 fields changed
      • changedInput schema / properties / limit / description
        Previous 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."
      • addedInput schema / properties / stateRoute
        Added 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"
        +}
      • addedOutput schema / properties / appliedFilters
        Added 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"
        +}
      • changedOutput schema / properties / notice / description
        Previous 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."
      • changedOutput schema / properties / rates / description
        Previous value: -"Current toll rates for all active tolled facilities."New value: +"Current toll rates for the matching tolled facilities."
      • changedOutput schema / properties / rates / items / properties / stateRoute / description
        Previous 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)."
      • changedOutput schema / properties / rates / items / properties / travelDirection / description
        Previous 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."
      • changedOutput schema / properties / totalCount / description
        Previous 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)."
    • Changedwsdot_get_travel_times2 fields changed
      • changedInput schema / properties / limit / description
        Previous 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."
      • addedInput schema / properties / route / maxLength
        Added value: +200
    • Changedwsdot_search_alerts7 fields changed
      • changedInput schema / properties / limit / description
        Previous 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."
      • changedInput schema / properties / region / description
        Previous 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."
      • addedInput schema / properties / region / maxLength
        Added value: +200
      • changedInput schema / properties / startMilepost / description
        Previous 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."
      • addedInput schema / properties / stateRoute / maxLength
        Added value: +200
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "api_unavailable",
        -  "invalid_access_code"
        -]New value: +[
        +  "api_unavailable",
        +  "invalid_access_code",
        +  "invalid_region",
        +  "invalid_milepost_range"
        +]
    • Changedwsdot_search_cameras10 fields changed
      • changedInput schema / properties / endMilepost / description
        Previous value: -"End of milepost range to filter cameras."New value: +"End of the milepost range to filter cameras."
      • changedInput schema / properties / limit / description
        Previous 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."
      • changedInput schema / properties / region / description
        Previous 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."
      • addedInput schema / properties / region / maxLength
        Added value: +200
      • changedInput schema / properties / startMilepost / description
        Previous 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."
      • addedInput schema / properties / stateRoute / maxLength
        Added value: +200
      • addedInput schema / properties / titleContains
        Added 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"
        +}
      • addedOutput schema / properties / appliedFilters / properties / titleContains
        Added value: +{
        +  "description": "Title words filter applied.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous 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."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "api_unavailable",
        -  "invalid_access_code"
        -]New value: +[
        +  "api_unavailable",
        +  "invalid_access_code",
        +  "invalid_region",
        +  "invalid_milepost_range"
        +]
  3. 5 tool updates
    • Changedwsdot_get_terminal_space2 fields changed
      • removedOutput schema / properties / nextOffset / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / nextOffset / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedwsdot_get_toll_rates2 fields changed
      • removedOutput schema / properties / nextOffset / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / nextOffset / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedwsdot_get_travel_times2 fields changed
      • removedOutput schema / properties / nextOffset / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / nextOffset / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedwsdot_search_alerts2 fields changed
      • removedOutput schema / properties / nextOffset / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / nextOffset / type
        Added value: +[
        +  "number",
        +  "null"
        +]
    • Changedwsdot_search_cameras2 fields changed
      • removedOutput schema / properties / nextOffset / anyOf
        Removed value: -[
        -  {
        -    "type": "number"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • addedOutput schema / properties / nextOffset / type
        Added value: +[
        +  "number",
        +  "null"
        +]
  4. 12 tool updates
    • Changedwsdot_get_border_waits6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "crossings",
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "crossings",
        -  "totalCount"
        -]
    • Changedwsdot_get_ferry_alerts6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "alerts",
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "alerts",
        -  "totalCount"
        -]
    • Changedwsdot_get_ferry_routes6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "routes",
        +      "tripDate",
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "routes",
        -  "tripDate",
        -  "totalCount"
        -]
    • Changedwsdot_get_ferry_schedule6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "sailings",
        +      "tripDate",
        +      "remainingOnly",
        +      "totalSailings"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "sailings",
        -  "tripDate",
        -  "remainingOnly",
        -  "totalSailings"
        -]
    • Changedwsdot_get_ferry_terminals6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "terminals",
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "terminals",
        -  "totalCount"
        -]
    • Changedwsdot_get_mountain_passes6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "passes",
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "passes",
        -  "totalCount"
        -]
    • Changedwsdot_get_terminal_space6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "terminals",
        +      "totalCount",
        +      "nextOffset",
        +      "hasMore"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "terminals",
        -  "totalCount",
        -  "nextOffset",
        -  "hasMore"
        -]
    • Changedwsdot_get_toll_rates6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "rates",
        +      "totalCount",
        +      "nextOffset",
        +      "hasMore"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "rates",
        -  "totalCount",
        -  "nextOffset",
        -  "hasMore"
        -]
    • Changedwsdot_get_travel_times6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "corridors",
        +      "totalCount",
        +      "nextOffset",
        +      "hasMore"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "corridors",
        -  "totalCount",
        -  "nextOffset",
        -  "hasMore"
        -]
    • Changedwsdot_get_vessel_locations6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "vessels",
        +      "totalCount"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "vessels",
        -  "totalCount"
        -]
    • Changedwsdot_search_alerts6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "alerts",
        +      "totalCount",
        +      "nextOffset",
        +      "hasMore",
        +      "appliedFilters"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "alerts",
        -  "totalCount",
        -  "nextOffset",
        -  "hasMore",
        -  "appliedFilters"
        -]
    • Changedwsdot_search_cameras6 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / additionalProperties
        Added value: +false
      • changedOutput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedOutput schema / anyOf
        Added value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "cameras",
        +      "totalCount",
        +      "nextOffset",
        +      "hasMore",
        +      "appliedFilters"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / error
        Added value: +{
        +  "additionalProperties": {},
        +  "description": "Present when the call failed. Absent on success.",
        +  "properties": {
        +    "code": {
        +      "description": "JSON-RPC error code for this failure.",
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    "data": {
        +      "additionalProperties": {},
        +      "properties": {
        +        "reason": {
        +          "description": "Machine-readable failure mode. Declared by this tool: `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"
        +}
      • removedOutput schema / required
        Removed value: -[
        -  "cameras",
        -  "totalCount",
        -  "nextOffset",
        -  "hasMore",
        -  "appliedFilters"
        -]
  5. 1 tool update
    • Changedwsdot_get_ferry_schedule2 fields changed
      • changedOutput schema / properties / sailings / items / properties / arrivalTime / description
        Previous 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."
      • changedOutput schema / properties / sailings / items / properties / departureTime / description
        Previous 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."
  6. 4 tool updates
    • Changedwsdot_get_terminal_space7 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Maximum terminals to return in this page (1–20). Defaults to 5. Counts terminals, not sailings.",
        +  "maximum": 20,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Zero-based index of the first terminal to return, for paging. Defaults to 0.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / hasMore
        Added value: +{
        +  "description": "True when more terminals remain beyond the current page.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Offset to pass to retrieve the next page, or null when this is the last page."
        +}
      • changedOutput schema / properties / notice / description
        Previous 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."
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Number of terminals returned."New value: +"Total terminals matching the filter across all pages (not just this page). Counts terminals, not sailings."
      • changedOutput schema / required
        Previous value: -[
        -  "terminals",
        -  "totalCount"
        -]New value: +[
        +  "terminals",
        +  "totalCount",
        +  "nextOffset",
        +  "hasMore"
        +]
    • Changedwsdot_get_toll_rates7 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Maximum toll rates to return in this page (1–500). Defaults to 50.",
        +  "maximum": 500,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Zero-based index of the first toll rate to return, for paging. Defaults to 0.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / hasMore
        Added value: +{
        +  "description": "True when more toll rates remain beyond the current page.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Offset to pass to retrieve the next page, or null when this is the last page."
        +}
      • changedOutput schema / properties / notice / description
        Previous 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."
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total number of toll rate entries returned."New value: +"Total toll rate entries across all pages (not just this page)."
      • changedOutput schema / required
        Previous value: -[
        -  "rates",
        -  "totalCount"
        -]New value: +[
        +  "rates",
        +  "totalCount",
        +  "nextOffset",
        +  "hasMore"
        +]
    • Changedwsdot_get_travel_times7 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Maximum corridors to return in this page (1–500). Defaults to 50.",
        +  "maximum": 500,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Zero-based index of the first corridor to return, for paging. Defaults to 0.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / hasMore
        Added value: +{
        +  "description": "True when more corridors remain beyond the current page.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Offset to pass to retrieve the next page, or null when this is the last page."
        +}
      • changedOutput schema / properties / notice / description
        Previous 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."
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total number of corridors returned."New value: +"Total corridors matching the filter across all pages (not just this page)."
      • changedOutput schema / required
        Previous value: -[
        -  "corridors",
        -  "totalCount"
        -]New value: +[
        +  "corridors",
        +  "totalCount",
        +  "nextOffset",
        +  "hasMore"
        +]
    • Changedwsdot_search_alerts7 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Maximum alerts to return in this page (1–500). Defaults to 50.",
        +  "maximum": 500,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Zero-based index of the first alert to return, for paging. Defaults to 0.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / hasMore
        Added value: +{
        +  "description": "True when more alerts remain beyond the current page.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Offset to pass to retrieve the next page, or null when this is the last page."
        +}
      • changedOutput schema / properties / notice / description
        Previous 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."
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total number of alerts returned."New value: +"Total alerts matching the filters across all pages (not just this page)."
      • changedOutput schema / required
        Previous value: -[
        -  "alerts",
        -  "totalCount",
        -  "appliedFilters"
        -]New value: +[
        +  "alerts",
        +  "totalCount",
        +  "nextOffset",
        +  "hasMore",
        +  "appliedFilters"
        +]
  7. 2 tool updates
    • Changedwsdot_get_ferry_alerts6 fields changed
      • addedOutput schema / properties / alerts / items / properties / affectsAllRoutes
        Added 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"
        +}
      • changedOutput schema / properties / alerts / items / properties / alertDescription / description
        Previous 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."
      • addedOutput schema / properties / alerts / items / properties / alertTitle
        Added value: +{
        +  "description": "The bulletin's own title.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / alerts / items / properties / alertType
        Added value: +{
        +  "description": "Alert kind as WSF categorizes it, e.g. \"All Alerts\".",
        +  "type": "string"
        +}
      • addedOutput schema / properties / alerts / items / properties / bulletinText
        Added 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"
        +}
      • changedOutput schema / properties / alerts / items / properties / impactedRouteIds / description
        Previous 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."
    • Changedwsdot_search_alerts2 fields changed
      • changedOutput schema / properties / alerts / items / properties / extendedDescription / description
        Previous 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."
      • changedOutput schema / properties / alerts / items / properties / headlineDescription / description
        Previous 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)\"."
  8. 5 tool updates
    • Changedwsdot_get_ferry_schedule1 field changed
      • removedOutput schema / properties / sailings / items / properties / isCancelled
        Removed value: -{
        -  "description": "Whether this sailing is cancelled.",
        -  "type": "boolean"
        -}
    • Changedwsdot_get_terminal_space7 fields changed
      • addedOutput schema / properties / terminals / items / properties / departingSpaces / items / properties / arrivingTerminalIds
        Added 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"
        +}
      • removedOutput schema / properties / terminals / items / properties / departingSpaces / items / properties / arrivingTerminalName
        Removed value: -{
        -  "description": "Destination terminal name.",
        -  "type": "string"
        -}
      • addedOutput schema / properties / terminals / items / properties / departingSpaces / items / properties / displayDriveUpSpace
        Added 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"
        +}
      • addedOutput schema / properties / terminals / items / properties / departingSpaces / items / properties / displayReservableSpace
        Added value: +{
        +  "description": "Whether this sailing takes vehicle reservations. False means reservableSpaceCount does not apply.",
        +  "type": "boolean"
        +}
      • changedOutput schema / properties / terminals / items / properties / departingSpaces / items / properties / driveUpSpaceCount / description
        Previous 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."
      • addedOutput schema / properties / terminals / items / properties / departingSpaces / items / properties / itineraryLabel
        Added 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"
        +}
      • changedOutput schema / properties / terminals / items / properties / departingSpaces / items / properties / reservableSpaceCount / description
        Previous value: -"Available reservable vehicle spaces."New value: +"Available reservable vehicle spaces, floored at zero like driveUpSpaceCount. Zero means no reservable space remains."
    • Changedwsdot_get_travel_times4 fields changed
      • changedInput schema / properties / route / description
        Previous 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."
      • changedOutput schema / properties / corridors / items / properties / averageTimeInMinutes / description
        Previous value: -"Historical average travel time in minutes."New value: +"Historical average travel time in minutes. Absent when WSDOT reports no measurement for the corridor."
      • changedOutput schema / properties / corridors / items / properties / currentTimeInMinutes / description
        Previous 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."
      • changedOutput schema / properties / corridors / items / properties / delayInMinutes / description
        Previous 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."
    • Changedwsdot_search_alerts3 fields changed
      • changedInput schema / properties / endMilepost / description
        Previous 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."
      • changedInput schema / properties / startMilepost / description
        Previous 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."
      • changedInput schema / properties / stateRoute / description
        Previous 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."
    • Changedwsdot_search_cameras1 field changed
      • changedInput schema / properties / stateRoute / description
        Previous 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."
  9. 2 tool updates
    • Changedwsdot_search_alerts1 field changed
      • changedInput schema / properties / stateRoute / description
        Previous 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."
    • Changedwsdot_search_cameras8 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "description": "Maximum cameras to return in this page (1–500). Defaults to 50.",
        +  "maximum": 500,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "description": "Zero-based index of the first camera to return, for paging. Defaults to 0.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedInput schema / properties / stateRoute / description
        Previous 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."
      • addedOutput schema / properties / hasMore
        Added value: +{
        +  "description": "True when more cameras remain beyond the current page.",
        +  "type": "boolean"
        +}
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "number"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "Offset to pass to retrieve the next page, or null when this is the last page."
        +}
      • changedOutput schema / properties / notice / description
        Previous 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."
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total number of cameras returned."New value: +"Total cameras matching the filters across all pages (not just this page)."
      • changedOutput schema / required
        Previous value: -[
        -  "cameras",
        -  "totalCount",
        -  "appliedFilters"
        -]New value: +[
        +  "cameras",
        +  "totalCount",
        +  "nextOffset",
        +  "hasMore",
        +  "appliedFilters"
        +]
  10. 7 tool updates
    • Changedwsdot_get_border_waits6 fields changed
      • changedOutput schema / properties / crossings / items / properties / crossingName / description
        Previous 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."
      • changedOutput schema / properties / crossings / items / properties / location / description
        Previous value: -"Geographic location of the crossing."New value: +"Geographic location and readable name of the crossing."
      • addedOutput schema / properties / crossings / items / properties / location / properties / description
        Added value: +{
        +  "description": "Readable crossing/lane name (e.g. \"I-5 General Purpose\", \"I-5 Nexus Lane\").",
        +  "type": "string"
        +}
      • changedOutput schema / properties / crossings / items / properties / location / properties / direction / description
        Previous value: -"Travel direction."New value: +"Travel direction code (N/S/E/W/B); frequently null for border crossings."
      • changedOutput schema / properties / crossings / items / properties / updateTime / description
        Previous value: -"When this wait time was last updated."New value: +"When this wait time was last updated (ISO 8601)."
      • changedOutput schema / properties / crossings / items / properties / waitTimeInMinutes / description
        Previous 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)."
    • Changedwsdot_get_ferry_alerts1 field changed
      • changedOutput schema / properties / alerts / items / properties / impactedRouteIds / description
        Previous 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."
    • Changedwsdot_get_mountain_passes11 fields changed
      • changedOutput schema / properties / passes / items / properties / dateUpdated / description
        Previous value: -"Timestamp of the last condition update."New value: +"Timestamp of the last condition update (ISO 8601)."
      • changedOutput schema / properties / passes / items / properties / restrictionOne / description
        Previous value: -"Primary travel restriction, if any."New value: +"Primary travel/traction restriction (typically one direction of travel)."
      • removedOutput schema / properties / passes / items / properties / restrictionOne / properties / comment
        Removed value: -{
        -  "description": "Restriction description (e.g. \"Traction Tires Required\").",
        -  "type": "string"
        -}
      • addedOutput schema / properties / passes / items / properties / restrictionOne / properties / text
        Added 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"
        +}
      • addedOutput schema / properties / passes / items / properties / restrictionOne / properties / travelDirection
        Added value: +{
        +  "description": "Direction this restriction applies to (e.g. \"Northbound\", \"Eastbound\", \"Both directions\").",
        +  "type": "string"
        +}
      • removedOutput schema / properties / passes / items / properties / restrictionOne / properties / type
        Removed value: -{
        -  "description": "Restriction type code.",
        -  "type": "string"
        -}
      • changedOutput schema / properties / passes / items / properties / restrictionTwo / description
        Previous value: -"Secondary travel restriction, if any."New value: +"Secondary travel/traction restriction (typically the opposite direction)."
      • removedOutput schema / properties / passes / items / properties / restrictionTwo / properties / comment
        Removed value: -{
        -  "description": "Restriction description.",
        -  "type": "string"
        -}
      • addedOutput schema / properties / passes / items / properties / restrictionTwo / properties / text
        Added value: +{
        +  "description": "Restriction / traction-law text for the second direction.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / passes / items / properties / restrictionTwo / properties / travelDirection
        Added value: +{
        +  "description": "Direction this restriction applies to (e.g. \"Southbound\", \"Westbound\").",
        +  "type": "string"
        +}
      • removedOutput schema / properties / passes / items / properties / restrictionTwo / properties / type
        Removed value: -{
        -  "description": "Restriction type code.",
        -  "type": "string"
        -}
    • Changedwsdot_get_toll_rates2 fields changed
      • changedOutput schema / properties / rates / items / properties / timeUpdated / description
        Previous value: -"When this toll rate was last updated."New value: +"When this toll rate was last updated (ISO 8601)."
      • changedOutput schema / properties / rates / items / properties / travelDirection / description
        Previous 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)."
    • Changedwsdot_get_travel_times3 fields changed
      • changedOutput schema / properties / corridors / items / properties / endPoint / properties / direction / description
        Previous value: -"Travel direction."New value: +"Travel direction code: N (north), S (south), E (east), W (west)."
      • changedOutput schema / properties / corridors / items / properties / startPoint / properties / direction / description
        Previous value: -"Travel direction."New value: +"Travel direction code: N (north), S (south), E (east), W (west)."
      • changedOutput schema / properties / corridors / items / properties / timeUpdated / description
        Previous value: -"When the travel time data was last updated."New value: +"When the travel time data was last updated (ISO 8601)."
    • Changedwsdot_search_alerts5 fields changed
      • changedOutput schema / properties / alerts / items / properties / endRoadwayLocation / properties / direction / description
        Previous value: -"Travel direction."New value: +"Travel direction code: N/S/E/W, B (both directions), A (alternating); may appear as NB/SB/EB/WB."
      • changedOutput schema / properties / alerts / items / properties / endTime / description
        Previous value: -"When the event is expected to end."New value: +"When the event is expected to end (ISO 8601)."
      • changedOutput schema / properties / alerts / items / properties / lastUpdatedTime / description
        Previous value: -"When this alert was last updated."New value: +"When this alert was last updated (ISO 8601)."
      • changedOutput schema / properties / alerts / items / properties / startRoadwayLocation / properties / direction / description
        Previous value: -"Travel direction."New value: +"Travel direction code: N/S/E/W, B (both directions), A (alternating); may appear as NB/SB/EB/WB."
      • changedOutput schema / properties / alerts / items / properties / startTime / description
        Previous value: -"When the event started or is scheduled to start."New value: +"When the event started or is scheduled to start (ISO 8601)."
    • Changedwsdot_search_cameras1 field changed
      • changedOutput schema / properties / cameras / items / properties / direction / description
        Previous 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."
  11. 3 tool updates
    • Changedwsdot_get_toll_rates8 fields changed
      • addedOutput schema / properties / rates / items / properties / endLatitude
        Added value: +{
        +  "description": "Latitude of the segment end point.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / rates / items / properties / endLongitude
        Added value: +{
        +  "description": "Longitude of the segment end point.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / rates / items / properties / message / description
        Previous value: -"Dynamic message shown on toll sign."New value: +"Dynamic message associated with this toll."
      • removedOutput schema / properties / rates / items / properties / signText
        Removed value: -{
        -  "description": "Text displayed on the toll rate sign.",
        -  "type": "string"
        -}
      • addedOutput schema / properties / rates / items / properties / startLatitude
        Added value: +{
        +  "description": "Latitude of the segment start point.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / rates / items / properties / startLongitude
        Added value: +{
        +  "description": "Longitude of the segment start point.",
        +  "type": "number"
        +}
      • removedOutput schema / properties / rates / items / properties / tollCondition
        Removed value: -{
        -  "description": "Numeric toll condition code.",
        -  "type": "number"
        -}
      • addedOutput schema / properties / rates / items / properties / travelDirection
        Added value: +{
        +  "description": "Travel direction for this toll segment (e.g. \"N\", \"S\", \"E\", \"W\").",
        +  "type": "string"
        +}
    • Changedwsdot_search_alerts1 field changed
      • changedInput schema / properties / region / description
        Previous 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."
    • Changedwsdot_search_cameras1 field changed
      • changedInput schema / properties / region / description
        Previous 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. 12 tool updates
    • Changedwsdot_get_border_waits1 field changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Optional notice when no crossing data is available. Absent on normal results.",
        +  "type": "string"
        +}
    • Changedwsdot_get_ferry_alerts1 field changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Optional notice when no alerts are active. Absent when alerts are present.",
        +  "type": "string"
        +}
    • Changedwsdot_get_ferry_routes1 field changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Optional notice when no routes are available for the date. Absent on normal results.",
        +  "type": "string"
        +}
    • Changedwsdot_get_ferry_schedule2 fields changed
      • addedOutput schema / properties / notice
        Added 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"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "tripDate",
        -  "remainingOnly",
        -  "sailings",
        -  "totalSailings"
        -]New value: +[
        +  "sailings",
        +  "tripDate",
        +  "remainingOnly",
        +  "totalSailings"
        +]
    • Changedwsdot_get_ferry_terminals2 fields changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Optional notice when no terminal data is available. Absent on normal results.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total number of terminals."New value: +"Total number of terminals returned."
    • Changedwsdot_get_mountain_passes3 fields changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Optional notice when no pass data is available — e.g. API temporarily unavailable. Absent on normal results.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / totalCount
        Added value: +{
        +  "description": "Total number of passes returned.",
        +  "type": "number"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "passes"
        -]New value: +[
        +  "passes",
        +  "totalCount"
        +]
    • Changedwsdot_get_terminal_space2 fields changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Optional guidance when no terminal space data is available or the filter matched nothing. Absent on normal results.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / terminalFilter
        Added value: +{
        +  "description": "The terminal ID filter applied, or absent if no filter was used.",
        +  "type": "number"
        +}
    • Changedwsdot_get_toll_rates1 field changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Optional notice when no toll rate data is available. Absent on normal results.",
        +  "type": "string"
        +}
    • Changedwsdot_get_travel_times2 fields changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Optional guidance when no corridors matched the route filter. Absent when results are returned.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / routeFilter
        Added value: +{
        +  "description": "The route name filter applied (lowercased), or absent if no filter was used.",
        +  "type": "string"
        +}
    • Changedwsdot_get_vessel_locations1 field changed
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Optional notice when no vessel data is available. Absent on normal results.",
        +  "type": "string"
        +}
    • Changedwsdot_search_alerts3 fields changed
      • addedOutput schema / properties / appliedFilters
        Added 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"
        +}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Optional guidance when no alerts matched — suggests broadening or removing filters. Absent when results are returned.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "alerts",
        -  "totalCount"
        -]New value: +[
        +  "alerts",
        +  "totalCount",
        +  "appliedFilters"
        +]
    • Changedwsdot_search_cameras4 fields changed
      • addedOutput schema / properties / appliedFilters
        Added 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"
        +}
      • removedOutput schema / properties / note
        Removed value: -{
        -  "description": "Informational note about result truncation or copyright.",
        -  "type": "string"
        -}
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Informational note about result truncation, copyright, or empty results. Absent when not applicable.",
        +  "type": "string"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "cameras",
        -  "totalCount"
        -]New value: +[
        +  "cameras",
        +  "totalCount",
        +  "appliedFilters"
        +]

Related MCP Connectors

Related MCP Servers

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.