@pipeworx/us-dmv
US state DMV data: vehicle and electric-vehicle registrations, DMV office locators with per-office services, live field-office wait times, and California form and insurer lookups. Keyless.
Why coverage is state-by-state
This pack came out of a survey of all 50 states plus DC (2026-07-29). Roughly 30 states
publish nothing machine-readable about motor vehicles — annual PDFs at best. So each tool
takes a state argument backed by a short, explicit list, and an unsupported state returns
{ found: false, reason: 'state_unsupported', hint, supported_states } rather than an
empty result that reads like a data bug.
Grain differs per state and is not normalisable away, so every response reports grain,
as_of, source, and — where a row list can be cut off — truncated.
Tools
| Tool | States | What it returns |
|---|---|---|
dmv_vehicle_registrations | CA, DE, MD, NY, PA, TX, WA | Registered vehicle counts by county, ZIP, fuel, make, model year or class |
dmv_ev_adoption | CA, CT, DE, HI, MD, NY, PA, WA | Battery-electric and plug-in hybrid counts, plus EV share where a denominator exists |
dmv_wait_times | NC, OR | Live average/max wait, customers queued, open-or-closed per field office |
dmv_offices | CA, DC, IA, IN, MO, NC, NJ, NY, TN, WI | Addresses, hours, coordinates, and which services each office performs |
dmv_ca_forms | CA | Official DMV form name, REG/DL number and download page |
dmv_ca_insurance_lookup | CA | Insurer NAIC codes by company name |
Auth
None. Every upstream is a public state endpoint. _apiKey is accepted on the Socrata-backed
tools and passed as X-App-Token; the public rate limits are ample without it.
Per-state gotchas worth knowing
These are all live-verified behaviours, not guesses:
- WA registrations count transactions, not fleet size.
hmzg-s6q4publishes registration transactions per month (King County runs ~160k/month), so it cannot answer "how many vehicles are registered here". The tool scopes to one fiscal year or month and says so ingrain. For a Washington fleet count of plug-in vehicles usedmv_ev_adoption, which reads the VIN-level EV population file instead. - NY mixes vehicle types.
w4pv-hbktholds trailers, boats and snowmobiles alongside road vehicles; the tool defaults torecord_type=VEH. County names are unabbreviated, so Brooklyn isKINGS. - CA snapshots are one resource per year, 2019–2026, and the rows carry the prior
December 31 as their as-of date. Grouping by ZIP surfaces a literal
OOSbucket (out-of-state registrants) that outranks every real ZIP — filter it out for a ZIP ranking. - CA "OTHER/UNK" make absorbs small-count suppression, so it can outrank real makes.
- MD spells one county two ways:
PRINCE GEORGE'Sin the registration dataset,PRINCE GEORGESin the EV dataset. MD also reports the registrant's county of residence, so a few out-of-state counties appear with small counts. - PA quarters are columns, not rows (
TOTAL_EV_Q1..Q4); the tool picks the latest quarter that actually carries data.TOTAL_EVis BEV + PHEV — conventional hybrids sit inHEV. - NC and OR waits read zero and closed outside business hours. That is the agency feed
reporting an idle queue, not a missing value, so the response flags it in
noterather than erroring. NC's feed is a unit tree (root, districts, then offices); the pack keeps leaf units. - OR has no JSON endpoint — the office array is parsed out of the server-rendered page.
Upstream also ships per-office
ipAddressand machine fields, which are dropped here. - TX was last refreshed in 2023 and is statewide-annual only. CT was last refreshed in
February 2025. Both report this in
noterather than pretending to be current. - NJ's
dmv_officesentries are inspection and emission-repair facilities, not licensing offices, and the upstreamcountycolumn disagrees withcityon some rows. - DC coordinates need reprojection — the layer stores State Plane, so the pack requests
outSR=4326geometry rather than readingXCOORD/YCOORD. - CA form search is the website's own relevance ranking, so a query like "title transfer" can put a vessel-title form first.
- Maryland's WAF is picky about SoQL query shape.
opendata.maryland.govanswers both a wildcardlike '%x%'clause and a two-conditionwherewith a Cloudflare interstitial (403 "Just a moment...") instead of data — reproducibly, and only on that domain: NY, WA and CT accept the identical clauses. It only reproduces from a deployed Worker, never from a laptop, so local testing will not catch it. All four Maryland paths therefore send the one shape that gets through — a singleyear_monthcondition — and narrow to a county or ZIP in code, which is cheap because one month is a few hundred rows. - WisDOT's ArcGIS server is intermittently slow — it overran a 12s budget on the first
production call and answered in ~1s on retry. Every tool retries once and then returns
{ error, hint }telling the caller to retry, rather than reporting an upstream stall as missing data.
Data sources
- California — data.ca.gov Vehicle Fuel Type Count by Zip Code (CKAN
datastore_search_sql), plus thedmv.ca.govWP REST endpoints for field offices, forms and the NAIC insurer lookup - New York — data.ny.gov Socrata
w4pv-hbkt(registrations),9upz-c7xg(offices) - Washington — data.wa.gov Socrata
f6w7-q2d2(EV population),hmzg-s6q4(registration transactions) - Maryland — opendata.maryland.gov Socrata
db8v-9ewn,qtcv-n3tc,tugr-unu9 - Pennsylvania — PennDOT ArcGIS EV registrations by county
- Delaware — data.delaware.gov Socrata
ity3-3688 - Hawaii — opendata.hawaii.gov DBEDT cumulative hybrid/EV series
- Texas — data.texas.gov Socrata
cbmj-zeje - Connecticut — data.ct.gov Socrata
y7ky-5wcz - North Carolina — NCDOT Instant Wait Time service
- Oregon — Oregon DMV wait times
- Missouri — data.mo.gov Socrata
835g-7keg· Wisconsin — WisDOT ArcGIS · Indiana — BMV branch map · Tennessee — TN SAFETY ArcGIS · DC — opendata.dc.gov · Iowa — Iowa DOT ArcGIS · New Jersey — data.nj.gov Socratat6tk-mr48
Quick Start
Add to your MCP client (Claude Desktop, Cursor, Windsurf, etc.):
{
"mcpServers": {
"us-dmv": {
"url": "https://gateway.pipeworx.io/us-dmv/mcp"
}
}
}
Or connect to the full Pipeworx gateway for access to all 1370+ data sources:
{
"mcpServers": {
"pipeworx": {
"url": "https://gateway.pipeworx.io/mcp"
}
}
}
Using with ask_pipeworx
Instead of calling tools directly, you can ask questions in plain English:
ask_pipeworx({ question: "your question about US State DMV data" })
The gateway picks the right tool and fills the arguments automatically.
More
License
MIT