{
  "server": {
    "name": "license-verify",
    "version": "v1"
  },
  "product": "Contractor License Verification API",
  "protocol": "Model Context Protocol over Streamable HTTP (JSON-RPC 2.0). POST JSON-RPC to this URL.",
  "transport": "POST https://license-verify.pages.dev/v1/mcp",
  "tools": [
    {
      "name": "lookup_license",
      "description": "Verify a single US contractor license by its number in a given state (the core verification call). Returns every official record matching that number — license status, expiry, classification, and bond/insurance where the state publishes it — each stamped with source_url + as_of. A number that isn't on file returns found:false (never a fabricated record). Oregon can return multiple endorsement rows per number."
    },
    {
      "name": "search_licenses",
      "description": "Search contractor licenses by business or principal name within one state or across all covered states. Returns compact matching records; call lookup_license with a returned license number for the full cite-stamped record. The query is matched from the first character of the name (it must begin at a name boundary), minimum 2 characters."
    },
    {
      "name": "list_licenses",
      "description": "List a state's licenses as a license-number-sorted page (compact records). Use for browsing/enumeration; each page is a fixed small size. status/city filter WITHIN the returned page only — use search_licenses for cross-page filtered queries."
    },
    {
      "name": "get_coverage",
      "description": "Return the coverage & freshness table: per-state record counts, as_of dates, official source attribution, and honest partial-coverage flags. Call this first to learn which states are covered and how fresh and complete each one is."
    },
    {
      "name": "verify_licenses",
      "description": "Verify a BATCH of contractor licenses in a single call (up to 25). Pass `licenses`: an array of {state, license} objects. Returns one result per item, in the same order, each with found (true/false — never fabricated), count, and the full cite-stamped records, plus a counts summary. Use this instead of calling lookup_license repeatedly when checking a list/portfolio of contractors — the typical lender / insurer / marketplace bulk-verification case. An invalid item (bad state or missing number) is reported per-item with ok:false and does not fail the rest of the batch."
    },
    {
      "name": "get_recent_changes",
      "description": "Monitor license STATUS CHANGES over time: returns dated change records (a license whose status changed, was newly added, or dropped from the official dataset) detected by diffing successive snapshots of the source data. This is the ongoing-monitoring call a one-shot lookup can't answer — use it to re-check a portfolio of contractors for newly suspended / expired licenses. Filter with since (YYYY-MM-DD), state, and type. A change is emitted ONLY when two dated snapshots actually differ (never fabricated); each record carries source_url + as_of. Newest first. On a fresh baseline the ledger is empty and that is reported honestly."
    }
  ],
  "docs": "https://license-verify.pages.dev/v1",
  "integrity": "Every record is reported verbatim from an official public-records source with a source_url and as_of date. Status and dates are never invented, altered, reordered for pay, or editorialized. Partial state coverage is flagged, never hidden."
}