Roofer Registry MCP
An MCP server that provides access to state-licensed roofing contractor license records, discipline history, and unlicensed activity citations. It allows agents to check licenses, search for contractors, verify live status, and compare state regulations, serving as a data source for verifying contractor legitimacy and compliance.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://rooferregistry.com/api/mcpWhat you can do with it
- Look up a specific roofing license by state and number
- Search for contractors by name, firm, or license number
- Verify live license status with state regulator data
- Check for unlicensed contracting citations or discipline actions
Source and maintenance
- Maintenance checked
Protocol and capabilities
- Server
- Roofer Registry 0.2.0
- MCP protocol
- 2025-06-18
- Tools
- 9 advertised
- Resources
- 1 advertised
- Resource templates
- 0 advertised
- Prompts
- Not advertised
{
"tools": {
"listChanged": true
},
"resources": {
"listChanged": true
}
}Tools
9 advertised
check_license
Look up one roofing contractor license by state and license number. Returns status as published by the state regulator, a machine-readable verdict, licensee name, city, expiration, and provenance (regulator source URL + fetch date). Verdicts: licensed-active (current and active), licensed-not-active (in roster but inactive/suspended/probation), not-in-roster (not in the bulk extract but has discipline records and/or a live regulator result — typically revoked, null/void, or delinquent; includes liveStatus and discipline), not-found (no record anywhere). The verdict is derived from the regulator-published status, not a recommendation. Use this when a user asks "is this roofing contractor licensed" or has a license number from a truck, yard sign, ad, or contract.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"state",
"license_number"
],
"properties": {
"state": {
"type": "string",
"description": "Two-letter state code or state name, e.g. FL, tx, Florida"
},
"license_number": {
"type": "string",
"description": "License number as printed, e.g. CCC1325838 or CGC061405; hyphens/spaces are ignored"
}
},
"additionalProperties": false
}search_licensees
Search roofing contractors by name, firm, or partial license number, optionally within a state and city. Returns up to 50 regulator-sourced records with a true total count. Use this when the user has a name but no license number.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"query"
],
"properties": {
"city": {
"type": "string"
},
"limit": {
"type": "integer",
"default": 10,
"maximum": 50,
"minimum": 1
},
"query": {
"type": "string",
"minLength": 2,
"description": "Name, firm, or license fragment"
},
"state": {
"type": "string"
}
},
"additionalProperties": false
}state_rules
Return what Roofer Registry has verified about a state's rules for roofing contractors: licensing, licenseTypes, deductibleWaiver, depositRule, permit, insurance, unlicensedPenalty, rightToCancel, aob — each { value, quote, citation, url } or null. Plus regulator, lookup URL, active-licensee count. If the state is not yet verified, the response says so — do not state a rule for that state from this source.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"state"
],
"properties": {
"state": {
"type": "string"
}
},
"additionalProperties": false
}unlicensed_activity
List people and companies the state board cited for unlicensed contracting, filtered by county and/or name. Use when the user has a name or company from a truck or flyer but no license number, or asks who was caught working unlicensed after a storm. Republished as filed; a citation is not a judgment. Defaults to roofing-typed citations; set all_trades=true for all construction trades.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"state"
],
"properties": {
"name": {
"type": "string",
"description": "Respondent or DBA name fragment"
},
"limit": {
"type": "integer",
"default": 25,
"maximum": 100,
"minimum": 1
},
"state": {
"type": "string"
},
"county": {
"type": "string",
"description": "e.g. Lee, Miami-Dade, Dade — normalized automatically"
},
"all_trades": {
"type": "boolean",
"default": false,
"description": "false (default) = roofing-typed citations only; true = all trades"
}
},
"additionalProperties": false
}enforcement_actions
Board discipline and unlicensed-activity citations for a state, license number, name, or county. Merges licensed-activity discipline rows and unlicensed-activity citations, newest first. Republished as filed; a citation is an allegation the board acted on, a Final Order is the board's decision.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"state"
],
"properties": {
"name": {
"type": "string",
"description": "Respondent or DBA name fragment"
},
"limit": {
"type": "integer",
"default": 25,
"maximum": 100,
"minimum": 1
},
"since": {
"type": "string",
"description": "ISO date, e.g. 2025-01-01"
},
"state": {
"type": "string"
},
"county": {
"type": "string",
"description": "e.g. Miami-Dade"
},
"all_trades": {
"type": "boolean",
"default": false
},
"license_number": {
"type": "string",
"description": "e.g. CCC1325838"
}
},
"additionalProperties": false
}compare_rules
Compare a specific rule field across 2–10 states. Only states with verified: true carry a rule. Treat null as "not verified", not "no rule". Input formats: states as two-letter codes (FL, GA, TX); field is one of licensing, licenseTypes, deductibleWaiver, depositRule, permit, insurance, unlicensedPenalty, rightToCancel, aob.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"states",
"field"
],
"properties": {
"field": {
"enum": [
"licensing",
"licenseTypes",
"deductibleWaiver",
"depositRule",
"permit",
"insurance",
"unlicensedPenalty",
"rightToCancel",
"aob"
],
"type": "string"
},
"states": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 10,
"minItems": 2,
"description": "Two-letter state codes, e.g. [\"FL\", \"GA\"]"
}
},
"additionalProperties": false
}changes_since
License changes (new, lapsed, status change) since a given date, optionally filtered by state and change type. Changes are tracked starting from the first roster refresh after deploy — no backfill is available. Use when monitoring for new licenses, lapses, or status changes.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"since"
],
"properties": {
"type": {
"enum": [
"new",
"lapsed",
"status",
"expires"
],
"type": "string"
},
"limit": {
"type": "integer",
"default": 100,
"maximum": 500,
"minimum": 1
},
"since": {
"type": "string",
"description": "ISO date, max 90 days back, e.g. 2026-09-01"
},
"state": {
"type": "string"
},
"cursor": {
"type": "string"
}
},
"additionalProperties": false
}verify_live
Fetch the current license status directly from the state regulator (FL only) and compare it with our roster copy. Uses a 24-hour cache; the second call within 24h returns cached: true. Other states return { supported: false, lookupUrl }. Hard cap: 100 live fetches per UTC day.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"state",
"license_number"
],
"properties": {
"state": {
"type": "string"
},
"license_number": {
"type": "string",
"description": "e.g. CCC1325838"
}
},
"additionalProperties": false
}request_contact
Send a contact request to ONE specific licensee the user has chosen, by license number. This creates the same consent-recorded request a person submits on the profile page; it is not lead routing and we never pick the licensee for the user. Only call after the user has seen the record and explicitly chosen this licensee. Required consent text must be shown to the user verbatim before calling.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"state",
"license_number",
"first_name",
"phone",
"email",
"zip",
"project_type",
"timeline",
"insurance_job",
"consent_confirmed"
],
"properties": {
"zip": {
"type": "string",
"maxLength": 10,
"minLength": 5
},
"email": {
"type": "string",
"format": "email"
},
"phone": {
"type": "string",
"minLength": 7
},
"state": {
"type": "string"
},
"timeline": {
"type": "string",
"description": "when needed: emergency, within-month, 1-3-months, just-quotes"
},
"first_name": {
"type": "string",
"minLength": 1
},
"project_type": {
"type": "string",
"description": "project type: replacement, repair-leak, storm, inspection, gutters, new-construction, commercial"
},
"insurance_job": {
"type": "string",
"description": "is this an insurance claim: yes, no, not-sure"
},
"license_number": {
"type": "string"
},
"consent_confirmed": {
"type": "boolean",
"const": true,
"description": "User saw the consent text and agreed"
}
},
"additionalProperties": false
}Prompts
Not advertised
Resources
1 advertised
about
https://rooferregistry.com/llms.txt30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 684 ms
- 95th percentile latency
- 684 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 684 ms · metadata changed · 9 tool(s), 1 resource(s), 0 resource template(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http roofer-registry-mcp https://rooferregistry.com/api/mcpCodex
codex mcp add roofer-registry-mcp --url https://rooferregistry.com/api/mcpCursor
{
"mcpServers": {
"roofer-registry-mcp": {
"url": "https://rooferregistry.com/api/mcp"
}
}
}Cline
{
"mcpServers": {
"roofer-registry-mcp": {
"type": "streamableHttp",
"url": "https://rooferregistry.com/api/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"roofer-registry-mcp": {
"type": "http",
"url": "https://rooferregistry.com/api/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http roofer-registry-mcp https://rooferregistry.com/api/mcpClaude Desktop
{
"mcpServers": {
"roofer-registry-mcp": {
"url": "https://rooferregistry.com/api/mcp"
}
}
}Windsurf
{
"mcpServers": {
"roofer-registry-mcp": {
"serverUrl": "https://rooferregistry.com/api/mcp"
}
}
}Let your agent find its tools
Find servers like Roofer Registry MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other data and analytics servers
Do you run Roofer Registry MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.