Koskamo

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.

Roofer Registry MCP logo, by Roofer RegistryVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Roofer Registry
MCP endpoint (Streamable HTTP)
https://rooferregistry.com/api/mcp
Vendor documentation

What 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

Vendor evidenceRegistry 0.2.0
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
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  }
}

Tools

9 advertised

check_license
Advertised by the server during the last successful anonymous check.

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.

check_license input schema
{
  "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
Advertised by the server during the last successful anonymous check.

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.

search_licensees input schema
{
  "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
Advertised by the server during the last successful anonymous check.

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.

state_rules input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "state"
  ],
  "properties": {
    "state": {
      "type": "string"
    }
  },
  "additionalProperties": false
}
unlicensed_activity
Advertised by the server during the last successful anonymous check.

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.

unlicensed_activity input schema
{
  "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
Advertised by the server during the last successful anonymous check.

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.

enforcement_actions input schema
{
  "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
Advertised by the server during the last successful anonymous check.

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.

compare_rules input schema
{
  "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
Advertised by the server during the last successful anonymous check.

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.

changes_since input schema
{
  "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
Advertised by the server during the last successful anonymous check.

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.

verify_live input schema
{
  "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
Advertised by the server during the last successful anonymous check.

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.

request_contact input schema
{
  "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

No prompt definitions available.

Resources

1 advertised

about

Advertised by the server during the last successful anonymous check.

about URI
https://rooferregistry.com/llms.txt

30-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.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http roofer-registry-mcp https://rooferregistry.com/api/mcp

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add roofer-registry-mcp --url https://rooferregistry.com/api/mcp

Cursor

Merge this server into .cursor/mcp.json in your project, then enable roofer-registry-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "roofer-registry-mcp": {
      "url": "https://rooferregistry.com/api/mcp"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "roofer-registry-mcp": {
      "type": "streamableHttp",
      "url": "https://rooferregistry.com/api/mcp",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start roofer-registry-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "roofer-registry-mcp": {
      "type": "http",
      "url": "https://rooferregistry.com/api/mcp"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http roofer-registry-mcp https://rooferregistry.com/api/mcp

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "roofer-registry-mcp": {
      "url": "https://rooferregistry.com/api/mcp"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "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.

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.

Claim this listing