Prototype · Preview: every server in the official registry, synced every 30 minutes. Reviews and accounts come in a later step.
PopNx MCPMCP servers for people who use AI · explained in plain words

Wsdot MCP Server

by cyanheadsversion 0.5.0i★ –iComputer or cloud
Registry nameio.github.cyanheads/wsdot-mcp-server

Install

Overview

Description from the maker (original English)

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

PopNx MCP’s three pillars

These three are never merged into one score: opinions, measurements and popularity are different things.

What you can do with it

We have not written a plain-language summary for this one yet. Below are the facts we read from the registry.

  • Connection: Computer or cloud
  • Transport: stdio, Streamable HTTP
  • Category: Other
  • You need to fill in: WSDOT_ACCESS_CODE

Install

Pick the AI app you use, then copy the settings.

Before you install

  • Basic checks: 3 of 3 passed
  • Runs on the maker’s server: what you ask it goes through their server.
  • Can do 12 things (tools) wsdot_get_mountain_passes, wsdot_search_alerts, wsdot_get_travel_times, wsdot_get_toll_rates …
  • You fill in yourself: WSDOT_ACCESS_CODE, MCP_LOG_LEVEL

You need

  • Runs in the cloudNothing to install; it connects over the internet
  • npmNode.js installed (for the npx command)

Which app do you use?

Pick your app above. We remember it, so next time the button says “Install in …”.

Works in Claude on the web, desktop and mobile:

  1. Open Settings → Connectors
  2. Press Add custom connector
  3. Paste the address below and press Add
  4. If it asks you to sign in, sign in with the maker
SettingsConnectors1+ Add2https://…3
https://wsdot.caseyjhand.com/mcp

Or run it on your computer

Open Claude Desktop → Settings → Developer → Edit Config, and paste this into claude_desktop_config.json

{
  "mcpServers": {
    "wsdot": {
      "command": "npx",
      "args": [
        "-y",
        "@cyanheads/wsdot-mcp-server"
      ],
      "env": {
        "WSDOT_ACCESS_CODE": "your-value",
        "MCP_LOG_LEVEL": "your-value"
      }
    }
  }
}

Run this in your terminal

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

Or run it on your computer

claude mcp add wsdot --env WSDOT_ACCESS_CODE=your-value --env MCP_LOG_LEVEL=your-value -- npx -y @cyanheads/wsdot-mcp-server

Fill in the empty values before running it.

Open in Cursor

Or copy the settings yourself

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

{
  "mcpServers": {
    "wsdot": {
      "url": "https://wsdot.caseyjhand.com/mcp"
    }
  }
}

Or run it on your computer

Open in Cursor

Or copy the settings yourself

Paste into .cursor/mcp.json in your project, or ~/.cursor/mcp.json

{
  "mcpServers": {
    "wsdot": {
      "command": "npx",
      "args": [
        "-y",
        "@cyanheads/wsdot-mcp-server"
      ],
      "env": {
        "WSDOT_ACCESS_CODE": "your-value",
        "MCP_LOG_LEVEL": "your-value"
      }
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

Open in VS Code

Or copy the settings yourself

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "wsdot": {
      "type": "http",
      "url": "https://wsdot.caseyjhand.com/mcp"
    }
  }
}

Or run it on your computer

Open in VS Code

Or copy the settings yourself

Paste into .vscode/mcp.json in your project

{
  "servers": {
    "wsdot": {
      "type": "stdio",
      "command": "npx",
      "args": [
        "-y",
        "@cyanheads/wsdot-mcp-server"
      ],
      "env": {
        "WSDOT_ACCESS_CODE": "your-value",
        "MCP_LOG_LEVEL": "your-value"
      }
    }
  }
}

Your browser asks to open the app, then the app shows the settings and asks you to confirm. Key values are left empty for you to fill in.

ChatGPT connects only to servers on the internet:

  1. Open ChatGPT on the web → Settings → Connectors (Apps)
  2. Press Create or Add (some plans need Developer mode under Advanced first)
  3. Paste the address below, give it a name and save
  4. If it asks you to sign in, sign in with the maker
SettingsConnectors1+ Create2https://…3
https://wsdot.caseyjhand.com/mcp

Menu names can differ slightly by plan and over time.

Your choice stays on this device in a cookie; no account needed.

Values you fill in

  • WSDOT_ACCESS_CODE required env
    WSDOT Traveler API access code. Register at wsdot.wa.gov/Traffic/api/.
  • MCP_LOG_LEVEL env
    Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').

These settings are generated from the maker’s registry entry. If the README says otherwise, follow the README.

What it can do

Tool names and descriptions exactly as the server reported them on Nov 7, 2026. The maker wrote them, not us; we show them as plain text.

  • wsdot_get_mountain_passes

    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 w

  • wsdot_search_alerts

    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 al

  • wsdot_get_travel_times

    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

  • wsdot_get_toll_rates

    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 facili

  • wsdot_get_border_waits

    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

  • wsdot_search_cameras

    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 c

  • wsdot_get_ferry_terminals

    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 term

  • wsdot_get_ferry_routes

    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

  • wsdot_get_ferry_schedule

    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 sho

  • wsdot_get_vessel_locations

    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 oper

  • wsdot_get_terminal_space

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

  • wsdot_get_ferry_alerts

    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

Basic checksi

We check information anyone can see; we have not read the code. Checks that do not apply are left out of the count. · Checked Nov 7, 2026

  • ✓ Pass

    Maker matches the repo

    The registry name was verified with the GitHub account cyanheads, which owns the repo

  • … Not checked yet

    Still maintained

    We have not read this repo from GitHub yet

  • … Not checked yet

    Has a licence

    We have not read this repo from GitHub yet

  • ✓ Pass

    Endpoint responds

    Responded in 506 ms (HTTP 200)

  • – Not applicable

    Sign-in with OAuth

    No sign-in needed

  • ✓ Pass

    No hidden instructions in tool descriptions

    Read 12 tool descriptions and found no hidden instructions to the AI

Compared with others in Otheri

  • More stars than 0% of the other 32718 servers in this category
  • Published to the registry more recently than 78% of the other 32718 servers in this category
  • Basic checks equal to or better than 100% of the other 32718 servers in this category

Compared with every active server in this category in the registry. Stars count only when the publisher owns the repo.

Common questions

Is Wsdot MCP Server safe?

It passed 3 of 3 applicable basic checks. We have not read the code. Before adding a key or token, see what access the server asks for and use a key with only the permissions you need.

What keys or codes does it need?

You need to fill in: WSDOT_ACCESS_CODE

Does it run on my computer or in the cloud?

Either way works: install it on your computer or connect to the cloud version.

Is it still maintained?

The GitHub repo last changed –, and the latest version (0.5.0) reached the registry 10 days ago.

Which apps can use it?

Apps that support MCP, such as Claude Desktop, Claude Code, Cursor and VS Code. It connects by URL, so apps that accept remote MCP servers work too, such as ChatGPT in developer mode.

What can I use instead?

In the same category: Spec Driven Development, Remote Desktop Commander, MemberVault MCP by usefulapi

Alternatives

Servers in the same category from other makers, sorted by stars.

Reading a card:★ GitHub starsiThree pillars: reviews · checks · usageiUpdated = latest version published to the registryi

Spec Driven Development

by formulahendry

MCP Server that facilitates spec-driven development workflows, not just Vibe Coding.

Runs on your computer★ 440MITUpdated 14 months ago
Install

Remote Desktop Commander

by desktop-commander

Remote Desktop Commander: use files, terminal and processes on your own computers from any AI app.

Runs in the cloud★ 211Updated 2 days ago
Install

README from the maker

Open the README

Copied from the maker’s repo as written. PopNx MCP has not reviewed or endorsed it. HTML, images and scripts are removed. Links lead off this site.

@cyanheads/wsdot-mcp-server Query WA highway conditions, ferry schedules, vessel locations, toll rates, border waits, and alerts via MCP. STDIO or Streamable HTTP. 12 Tools • 1 Skill Resource

Public Hosted Server: https://wsdot.caseyjhand.com/mcp


Overview

Washington State roads and ferries from WSDOT. Check mountain passes, travel times, tolls, border waits, alerts, and traffic cameras, and track ferry schedules, vessel locations, and terminal space.

Tools
ToolDescription
wsdot_get_mountain_passesCurrent conditions for all WA mountain passes: status, road condition, traction laws, temperature, elevation.
wsdot_search_alertsActive highway alerts — incidents, construction, closures — filterable by state route, WSDOT region, and milepost range.
wsdot_get_travel_timesCurrent vs. average travel times for named WA highway corridors (I-5, I-90, SR 520, etc.) with congestion delay.
wsdot_get_toll_ratesDynamic toll rates for WA express lanes and tolled facilities — SR 99, SR 167 HOT, I-405 Express, SR 509, SR 520 — filterable by route.
wsdot_get_border_waitsCurrent vehicle wait times at all WA/Canada land border crossings.
wsdot_search_camerasHighway camera metadata and image URLs, filterable by state route, region, milepost range, and title words.
wsdot_get_ferry_terminalsAll WSF ferry terminals with numeric IDs needed for schedule and space lookups, plus coordinates.
wsdot_get_ferry_routesWSF routes operating on a given date — route ID, abbreviation, description, and the terminal pairs each serves, for route discovery, schedule lookups, and ferry-alert cross-reference.
wsdot_get_ferry_scheduleDeparture times for a specific WSF route — today-remaining or full-day future mode — with each sailing's vessel, loading rule, and notes.
wsdot_get_vessel_locationsReal-time AIS positions, speed, heading, ETA, and dock status for all active WSF vessels.
wsdot_get_terminal_spaceDrive-up and reservable vehicle space available at WSF terminals for upcoming sailings.
wsdot_get_ferry_alertsActive WSF service disruptions and bulletins with impacted route IDs.
Resources
ResourceDescription
skill://wsdot-guide/SKILL.mdFerry trip guidance for combining schedules, alerts, space, and vessel positions.

Capability reference

skill://wsdot-guide/SKILL.md resource
  • Ferry trip guidance for combining schedules, service alerts, live vehicle space, and vessel positions. Also included in plugin installs as wsdot-guide.
wsdot_get_mountain_passes tool
  • No input — current conditions for all 16 WA mountain passes (Snoqualmie, Stevens, White, Blewett, Cayuse, and others) in one call
  • Each pass carries road condition, weather, temperature, elevation, and up to two directional traction/travel restrictions

wsdot_search_alerts tool
  • Optional stateRoute, region (Northwest, Olympic, Southwest, South Central, North Central, Eastern), and startMilepost / endMilepost — an alert matches when its extent overlaps the range; omit all for every statewide alert. Ordered by alertId, paged (default 20, max 500)
  • An unknown region fails as invalid_region and a start above the end as invalid_milepost_range, each with a recovery hint

wsdot_get_travel_times tool
  • Optional route — a route ("I-5", "SR 520") returns every corridor measured on it, any other text matches corridor names ("Everett"); paged (default 50, max 500)
  • Each corridor reports current and average minutes — current above average means congestion, and the delta is the delay. A reversible express-lane corridor closed in the queried direction omits its figures rather than reporting zero

wsdot_get_toll_rates tool
  • Covers SR 99 (WSDOT Tunnel), SR 167 HOT Lanes, I-405 Express Lanes, the SR 509 tolled segment, and the SR 520 Bridge. Optional stateRoute matches the posted designation ("I-405", "SR 520"); a route with no tolled facility returns an empty page whose notice names the tolled routes. Paged (default 50, max 500)
  • Each row leads with its startLocationName → endLocationName segment. stateRoute is the feed's bare zero-padded number ("099") and travelDirection the feed's code, which SR 99, SR 509, and SR 520 fix per facility — read direction from the segment's ends

wsdot_get_border_waits tool
  • No input — eleven lane entries in crossings[] across I-5 (Peace Arch), SR 543 (Pacific Highway), SR 539 (Lynden), and SR 9 (Sumas): a general-purpose and a Nexus lane at each, plus truck lanes at SR 539 and SR 543
  • crossingName is a route code (I5, SR543Trucks) and location.description the readable name; a lane with no current data omits waitTimeInMinutes

wsdot_search_cameras tool
  • Optional stateRoute, region code (NW, SW, OL, ER, SC, NC, OS for the Oregon TripCheck cameras, WA for airport cameras), startMilepost / endMilepost, and titleContains (every word, any order). Ordered by cameraId, paged (default 50, max 500)
  • Returns metadata and image URLs, not image bytes (camera images are copyright WSDOT). An unknown region fails as invalid_region and a reversed range as invalid_milepost_range

wsdot_get_ferry_terminals tool
  • No input — all 20 WSF terminals, each with its numeric ID, abbreviation, and latitude/longitude
  • Resolves names ("Bainbridge Island", "Seattle") to the IDs wsdot_get_ferry_schedule and wsdot_get_terminal_space take

wsdot_get_ferry_routes tool
  • Optional tripDate (YYYY-MM-DD, default today); a date outside the range WSF has published fails as invalid_date stating that range
  • Each route carries its ID (the impactedRouteIds of wsdot_get_ferry_alerts), abbreviation, description, and terminalPairs — the departing → arriving pairs wsdot_get_ferry_schedule accepts that day

wsdot_get_ferry_schedule tool
  • Requires departingTerminalId and arrivingTerminalId (a pair from terminalPairs on wsdot_get_ferry_routes); optional tripDate (default today) and remainingOnly (future departures only, today only)
  • Each sailing carries departureTime / arrivalTime in ISO 8601 UTC (tripDate is the Pacific service day), vesselId, loadingRule, and indexes into the pair's annotations. There is no cancellation flag — WSF drops a cancelled sailing, so check wsdot_get_ferry_alerts
  • A pair with no schedule that day fails as invalid_terminal_pair and a date with none as invalid_date, never as an empty schedule

wsdot_get_vessel_locations tool
  • No input — position, speed, heading, ETA, and dock status for every active WSF vessel
  • Positions may lag 30–60 seconds; many fields are absent for a vessel not in service, and one between assignments reports opRouteAbbrev as none reported

wsdot_get_terminal_space tool
  • Optional departingTerminalId (from wsdot_get_ferry_terminals), else every terminal; paged by terminal (default 5, max 20), with every sailing of a returned terminal included
  • driveUpSpaceCount is the key field — zero means the drive-up lane is full, and an oversubscribed sailing's negative upstream count floors to zero. arrivingTerminalIds chains into wsdot_get_ferry_schedule

wsdot_get_ferry_alerts tool
  • No input — active WSF disruptions, delays, and bulletins, each with alertTitle, a one-line alertDescription, and the full bulletinText (detail such as a replacement sailing appears only in the body)
  • impactedRouteIds map to wsdot_get_ferry_routes; affectsAllRoutes: true marks a fleet-wide alert, whose empty route list then means every route

Features

Built on @cyanheads/mcp-ts-core: stdio and Streamable HTTP transports, pluggable auth (none / jwt / oauth), swappable storage (in-memory, filesystem, Supabase, Cloudflare KV/R2/D1), structured logging with optional OpenTelemetry tracing.

WSDOT-specific:

  • Dual API integration — WSDOT Traffic API and WSF Ferry API share a single WSDOT_ACCESS_CODE
  • Cross-tool linking built into tool descriptions — ferry tools point to wsdot_get_ferry_terminals / wsdot_get_ferry_routes for ID resolution before a lookup
  • Normalized response shapes across both APIs — sparse upstream fields surface as optional rather than omitted or defaulted
  • Stable pagination — the alert and camera feeds return the same set in more than one row order upstream, so results are sorted by ID to keep a given offset reproducible
  • Paged list tools take offset / limit, and a page also ends early at a 24,000-byte response budget, with the notice naming the next offset
  • Route filters take the forms people write — "I-90", "90", "090", "SR 520" — and every text filter accepts at most 200 characters

Agent-friendly output:

  • Typed failure — invalid_access_code and api_unavailable errors carry an explicit recovery hint distinguishing configuration faults from transient upstream ones
  • driveUpSpaceCount: 0 and congestion delta fields (delayInMinutes) give agents actionable signal without string parsing
  • Plain text from HTML — alert descriptions, sailing notes, and bulletins arrive from upstream as HTML and are returned as text, with links inline as link text (url)
  • Partial data preserved — sparse upstream payloads surface null/undefined rather than synthetic defaults (e.g. an omitted waitTimeInMinutes, an absent arrivalTime)
  • content[] and structuredContent carry the same values, not just the same fields

Only the beginning is shown; read the rest in the repo

Ask PopNx