cyanheads avatar

Wsdot Mcp Server

cyanheads/wsdot-mcp-server

Wraps the Washington State Department of Transportation's Traveler and Ferry APIs into twelve MCP tools covering highway conditions, ferry operations, tolls, and border crossings. Pull real-time traffic alerts filtered by route and milepost, check mountain pass conditions and traction laws, query dynamic toll rates for express lanes, or grab ferry schedules and vessel positions via AIS. The terminal space tool tells you drive-up availability for upcoming sailings, which is critical for San Juan or Bainbridge runs during peak times. Supports both stdio and streamable HTTP transports, and there's a public hosted instance at wsdot.caseyjhand.com. Reach for this when you need live Washington State transportation data without stitching together multiple state APIs yourself.

GitHub stars
2
tools
12
auth
Required
transport
STDIO, HTTP
env vars
8
last updated
Nov 12, 2026

Install

From registry metadata
$ npx add-mcp https://wsdot.caseyjhand.com/mcp --name wsdot

Run in your terminal. add-mcp asks which agents to add it to (Claude Code, Codex, Cursor and more). Add -g to install it for every project.

Review the command, arguments and environment values before installing. MCP servers run with your local permissions.

Other ways

Claude Code

$ claude mcp add --transport http wsdot https://wsdot.caseyjhand.com/mcp

Run in your terminal. Add --scope user to make it available in every project.

Tools

Verified live · 12 tools

Verified live against the running server on Nov 6, 2026.

wsdot_get_mountain_passesReturns 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, o...

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, o...

No parameters. Call it with no arguments.

wsdot_search_alertsReturns 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...6 params

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

Parameters* required
endMilepostnumber
End of the milepost range. Matched by extent overlap like startMilepost, so an alert beginning inside the range and continuing past it is returned.
limitinteger
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.
offsetinteger
Zero-based index of the first alert to return, for paging. Defaults to 0.
regionstring
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...
startMilepostnumber
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...
stateRoutestring
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 si...
wsdot_get_travel_timesReturns 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 corri...3 params

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

Parameters* required
limitinteger
Maximum corridors to return in this page (1–500). Defaults to 50. A large page ends sooner, at the 24,000-byte response budget.
offsetinteger
Zero-based index of the first corridor to return, for paging. Defaults to 0.
routestring
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...
wsdot_get_toll_ratesReturns 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 fac...3 params

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

Parameters* required
limitinteger
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.
offsetinteger
Zero-based index of the first toll rate to return, for paging. Defaults to 0.
stateRoutestring
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...
wsdot_get_border_waitsReturns 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 a...

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

No parameters. Call it with no arguments.

wsdot_search_camerasReturns 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 th...7 params

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

Parameters* required
endMilepostnumber
End of the milepost range to filter cameras.
limitinteger
Maximum cameras to return in this page (1–500). Defaults to 50. A large page ends sooner, at the 24,000-byte response budget.
offsetinteger
Zero-based index of the first camera to return, for paging. Defaults to 0.
regionstring
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 pl...
startMilepostnumber
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.
stateRoutestring
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, whic...
titleContainsstring
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 Sum...
wsdot_get_ferry_terminalsReturns 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 t...

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

No parameters. Call it with no arguments.

wsdot_get_ferry_routesReturns 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 correspo...1 params

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

Parameters* required
tripDatestring
Date for which to list routes, in ISO 8601 format (YYYY-MM-DD). Defaults to today if omitted.
wsdot_get_ferry_scheduleReturns 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...4 params

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

Parameters* required
arrivingTerminalId*integer
Numeric ID of the arriving terminal.
departingTerminalId*integer
Numeric ID of the departing terminal. Use wsdot_get_ferry_terminals to look up terminal IDs.
remainingOnlyboolean
When true, returns only future sailings for today. Ignored for future dates. Default: false.
tripDatestring
Date in ISO 8601 format (YYYY-MM-DD). Defaults to today if omitted.
wsdot_get_vessel_locationsReturns 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 o...

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

No parameters. Call it with no arguments.

wsdot_get_terminal_spaceReturns 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). d...3 params

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

Parameters* required
departingTerminalIdinteger
Filter to a specific terminal by numeric ID. Omit to return all terminals.
limitinteger
Maximum terminals to return in this page (1–20). Defaults to 5. Counts terminals, not sailings.
offsetinteger
Zero-based index of the first terminal to return, for paging. Defaults to 0.
wsdot_get_ferry_alertsReturns 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 wi...

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

No parameters. Call it with no arguments.

Sponsors

Configuration

WSDOT_ACCESS_CODE*

WSDOT Traveler API access code. Register at wsdot.wa.gov/Traffic/api/.

WSDOT_CLAMP_LIMITSdefault: true

Clamp a paged tool's limit above its maximum (500; 20 for terminal space) to that maximum, with a notice. Set false to reject it instead.

MCP_LOG_LEVELdefault: info

Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').

MCP_TRANSPORT_TYPEdefault: http

Selects the HTTP transport.

MCP_HTTP_HOSTdefault: 127.0.0.1

The hostname for the HTTP server.

MCP_HTTP_PORTdefault: 3010

The port to run the HTTP server on.

MCP_HTTP_ENDPOINT_PATHdefault: /mcp

The endpoint path for the MCP server.

MCP_AUTH_MODEdefault: none

Authentication mode to use: 'none', 'jwt', or 'oauth'.

Readme

@cyanheads/wsdot-mcp-server

Query WA highway conditions, ferry schedules and fares, vessel locations, toll rates, border waits, and alerts via MCP. STDIO or Streamable HTTP.

13 Tools • 1 Skill Resource

Details

Repository
github.com/cyanheads/wsdot-mcp-server
Package
@cyanheads/wsdot-mcp-server
Transport
STDIO, HTTP
Auth
Required
Registry
MCP registry, active
Resources
1
Tools verified
Nov 6, 2026

More from cyanheads