Skip to main content
Glama

Get Ferry Schedule

wsdot_get_ferry_schedule
Read-only

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.

Input Schema

TableJSON 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

TableJSON Schema
NameRequiredDescriptionDefault
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.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed9 schema 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"
      +}
  2. Changed6 schema 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"
  3. Changed6 schema 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"
      -]
  4. Changed2 schema 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."
  5. Changed1 schema field changed
    • removedOutput schema / properties / sailings / items / properties / isCancelled
      Removed value: -{
      -  "description": "Whether this sailing is cancelled.",
      -  "type": "boolean"
      -}
  6. Changed2 schema 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"
      +]
  7. First observed

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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.