{
  "markdown": "# @pipeworx/nc-dmv\n\nNorth Carolina DMV MCP — **live** wait times at every NCDMV driver license office and\nlicense plate agency, plus the office directory the same feed carries. Keyless.\n\nPart of [Pipeworx](https://pipeworx.io) — an MCP gateway connecting AI agents to 1476+ live data sources.\n\nNorth Carolina and Oregon are the only two US states whose DMV publishes a\nmachine-readable live wait feed. Every other state's is captcha-gated, blocked to cloud\negress, broken, or only inside a phone app.\n\n## Tools\n\n- `nc_dmv_wait_times(office?, service?, open_only?, sort?, limit?)` — current average wait,\n  longest wait, and open/closed status per office. 148 driver license offices; `service:\n  \"vehicle\"` switches to the vehicle services / license plate agency units.\n- `nc_dmv_offices(office?, city?, zip?, service?, district?, limit?)` — address, city, ZIP,\n  phone, posted hours and NCDMV district. This feed is the only machine-readable NCDMV\n  office directory that exists, so it doubles as the state's office locator.\n\n## Auth\n\nNone. Keyless and unauthenticated.\n\n## Data source\n\n`https://wait.services.ncdot.gov/IWT/IWTWeb/XmlStats.aspx?controller=IWT_UnitsListXML&UnitID=<n>`\n\n| UnitID | Root | Contents |\n|--------|------|----------|\n| `2` | Driver Services | 148 driver license offices |\n| `182` | Vehicle Services | license plate agency units (1 as of 2026-07-29) |\n\n## Gotchas this pack handles for you\n\n### Closed-hours zeros are data, not gaps\n\nOutside posted business hours **every** office reports `OfficeStatus` `Closed` with\n`AvgWT`/`MaxWT` of `0:00:00`. That is NCDMV reporting an idle queue — it is neither an\nerror nor a missing value, and it must not be read as \"walk right in\".\n\nResponses therefore always carry `offices_open`, and when nothing is open the `note` says\nthe wait figures are idle-queue zeros. `sort: \"wait\"` puts open offices ahead of closed\nones for the same reason: a shortest-wait ranking would otherwise be won by 148 closed\noffices tied at zero.\n\n### The feed is a tree, and the sentinel row lies about its parent\n\n`UnitID=2` returns 161 `<Unit>` blocks: one root (`Driver Services`, `UnitLevel` 1), eleven\ndistricts (level 2), the 148 real offices (level 3), and a sentinel named `Invalid`. For\n`UnitID=182` the real unit sits at level 2 instead.\n\nSo the pack keeps **leaves** — any `UnitId` never named as another unit's `ParentUnitId` —\nrather than filtering on `UnitLevel`, which survives NCDOT re-organising the tree.\n\nThe ordering matters: the `Invalid` sentinel hangs off a **real office** (Greensboro West,\n`ParentUnitId=143`). Computing the parent set before dropping `Invalid` demotes that office\nout of the results and yields 147 offices where NCDMV publishes 148. `Invalid` is dropped\nfirst.\n\n### Addresses\n\n`--` is the feed's null. The separate `<ZipCode>` tag is empty on every single unit, so the\nZIP has to be parsed out of the one-line `Address` string\n(`\"521 S. Sandhills Blvd., Aberdeen, NC 28315\"`). That line is not consistently punctuated:\nsome offices embed newlines, omit the comma before the city, or drop `NC` altogether\n(`\"2479 E. Fifth St., Lumberton  28358\"`). The parser peels from the right — ZIP, then the\nstate token, then the city at the last comma — and returns the whole string in `address`\nwith `city: null` when the city cannot be separated from the street safely.\n\nCurrent coverage: 118 of 148 offices carry an address at all (NCDMV leaves 30 blank);\nof those, 118 ZIPs and 116 cities parse. `offices_missing_address` reports the gap.\n\nSome entries are stale on NCDMV's side — `Greensboro Express OLD` still appears in the\nfeed. They are returned as published rather than second-guessed.\n\n### Wait units\n\n`AvgWT` / `MaxWT` are `H:MM:SS`; the pack converts them to whole minutes.\n\n## Related\n\n- `or_dmv_wait_times` / `or_dmv_offices` — Oregon, the other live state wait feed.\n- `ca_dmv_offices` — California field offices (no wait feed published).\n\n## Quick Start\n\nAdd to your MCP client (Claude Desktop, Cursor, Windsurf, etc.):\n\n```json\n{\n  \"mcpServers\": {\n    \"nc-dmv\": {\n      \"url\": \"https://gateway.pipeworx.io/nc-dmv/mcp\"\n    }\n  }\n}\n```\n\n### What this endpoint actually serves\n\n`tools/list` at `https://gateway.pipeworx.io/nc-dmv/mcp` returns the tools in the table\nabove **plus the shared Pipeworx meta-tools** — `ask_pipeworx`,\n`discover_tools`, `search_within`, `remember`/`recall` and the rest of the\ngateway-wide set. So the tool count you see is larger than this table: a\nsingle-pack endpoint currently lists roughly 30 shared tools alongside the\npack's own. The connection's `initialize` response states its exact scope, and\nis the authoritative answer for a given day.\n\nThis is deliberate, not multiplexing by accident. The meta-tools are what let a\nscoped connection answer a question this pack does not cover — via\n`ask_pipeworx`, which routes across the whole catalog — without you adding a\nsecond MCP server. There is currently no way to mount a pack endpoint without\nthem; if the extra schemas cost you more context than the routing is worth,\nconnect to the full gateway once rather than to several pack endpoints.\n\nOr connect to the full Pipeworx gateway to get every pack's tools listed\ndirectly, instead of just this one's:\n\n```json\n{\n  \"mcpServers\": {\n    \"pipeworx\": {\n      \"url\": \"https://gateway.pipeworx.io/mcp\"\n    }\n  }\n}\n```\n\nBoth URLs reach the same gateway and the same 1476+ data sources. The\nonly difference is which pack's tools are listed **directly**; `ask_pipeworx`\nreaches all of them from either one.\n\n## Using with ask_pipeworx\n\nInstead of calling tools directly, you can ask questions in plain English —\nthis works on the pack endpoint above as well as on the full gateway:\n\n```\nask_pipeworx({ question: \"your question about Nc Dmv data\" })\n```\n\nThe gateway picks the right tool and fills the arguments automatically.\n\n## More\n\n- [Docs and guides](https://pipeworx.io/docs)\n- [pipeworx.io](https://pipeworx.io)\n\n## License\n\nMIT\n",
  "bytes": 5955,
  "sha": "de59c623f0b3b0cbe7f3d320004d8593790b95fdbbf9e5e571a5207d6e0b95f4",
  "repo_slug": "pipeworx-io/mcp-nc-dmv",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_pipeworx_io_nc_dmv_bcd1566f/readme"
}