{"$schema":"https://verifymcp.io/schemas/trust-report.json","schemaVersion":1,"license":{"name":"CC BY-NC 4.0","url":"https://creativecommons.org/licenses/by-nc/4.0/"},"generatedAt":"2026-11-06T16:32:30.376Z","url":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp","markdownUrl":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp.md","server":{"slug":"com-rooferregistry-roofer-registry","name":"Roofer Registry","registryName":"com.rooferregistry/roofer-registry","description":"State-licensed roofing contractors with regulator discipline records and provenance.","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"api-mcp","type":"remote","identifier":"https://rooferregistry.com/api/mcp","withdrawn":false,"url":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp","version":"0.2.0","transport":null,"scoredAt":"2026-11-06T05:20:47.859Z"},"score":{"total":64,"tier":"medium","status":"scored","weekDelta":3,"history":[{"date":"2026-11-06","total":64},{"date":"2026-11-05","total":64},{"date":"2026-11-04","total":63},{"date":"2026-11-03","total":63},{"date":"2026-11-02","total":63},{"date":"2026-11-01","total":62},{"date":"2026-10-31","total":62},{"date":"2026-10-30","total":61},{"date":"2026-10-29","total":61},{"date":"2026-10-28","total":60},{"date":"2026-10-27","total":60},{"date":"2026-10-26","total":59},{"date":"2026-10-25","total":59},{"date":"2026-10-24","total":58},{"date":"2026-10-23","total":58},{"date":"2026-10-22","total":57}]},"categories":[{"name":"Endpoint Security","score":63,"verdict":"fail","reasons":["The endpoint's TLS certificate is valid, in date, and uses a strong key.","Authorisation not fully verified: no authorisation is required to call this server, and 9 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe.","HTTPS is enforced; there's no plaintext access path.","The HSTS (Strict-Transport-Security) header is present.","DNSSEC check failed: this domain isn't protected by DNSSEC."],"codes":[{"code":"tls.valid","args":{}},{"code":"auth.none_undeclared","args":{"undeclared_tools":"9"}},{"code":"https.enforced","args":{}},{"code":"headers.hsts_present","args":{}},{"code":"dnssec.absent","args":{}}]},{"name":"Transport & Reachability","score":100,"verdict":"pass","reasons":["Verified streamable-http transport via a live MCP handshake."],"codes":[{"code":"transport.verified","args":{"transport":"streamable-http"}}]},{"name":"Schema Quality & AI Usability","score":40,"verdict":"fail","reasons":["0% of prompts and resources have a non-trivial description (not blank, and not just the item's name).","AI-judged instruction clarity (good).","Context-footprint check failed: tool/resource definitions use about 1266 tokens (~126/item across 10 items; 9 tools + 1 resources), over budget; trim descriptions and params.","Usage-examples check failed: none of the tools include examples."],"codes":[{"code":"schema.descriptions","args":{"pct":"0"}},{"code":"schema.ai_quality","args":{"band":"good"}},{"code":"schema.footprint_heavy","args":{"avg":"126","items":"10","tools":"9","tokens":"1266","resources":"1"}},{"code":"schema.examples_absent","args":{}}]},{"name":"Stability & Change Management","score":50,"verdict":"partial","reasons":["Stability observed for 15 of 30 days with no destabilising changes; credit accrues until the full window elapses."],"codes":[{"code":"stability.building_history","args":{"days":"15"}}]},{"name":"Tool Coverage","score":82,"verdict":"partial","reasons":["100% of tools have a non-trivial description (not blank, and not just the tool's name).","45% of tool parameters carry a description."],"codes":[{"code":"toolquality.descriptions","args":{"pct":"100"}},{"code":"toolquality.param_docs","args":{"pct":"45"}}]},{"name":"Tool Safety","score":75,"verdict":"fail","reasons":["No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.","0 of 1 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; \"request_contact\" implies \"send\" and declares no destructiveHint at all, which the MCP spec reads as destructive by default.","An AI judge read all 10 captured unit(s) of tool text and found none that tries to manipulate the model reading it."],"codes":[{"code":"toolsafety.injection_clean","args":{}},{"code":"toolsafety.destructive_undeclared","args":{"pct":"0","tool":"request_contact","verb":"send","declared":"none","annotated":"0","destructive":"1"}},{"code":"toolsafety.manipulation_clean","args":{"units":"10","judged":"10"}}]},{"name":"Capabilities","score":100,"verdict":"pass","reasons":["Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28."],"codes":[{"code":"protocol.supported","args":{"latest":"2026-07-28","version":"2025-11-25"}}]}],"inconclusive":["Authorisation not fully verified: no authorisation is required to call this server, and 9 tool(s) never declared a destructiveHint. The MCP spec treats an absent hint as destructive by default, so we cannot call this surface safe."],"malware":[],"components":[{"slug":"api-mcp","type":"remote","identifier":"https://rooferregistry.com/api/mcp","withdrawn":false,"score":64,"current":true,"url":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp","markdownUrl":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp.md"}],"facts":[{"label":"Endpoint","value":"https://rooferregistry.com/api/mcp"},{"label":"Transports","value":"streamable-http"},{"label":"Auth","value":"none"},{"label":"Version","value":"0.2.0"}],"install":{"available":true,"bundleSha256":null},"tools":[{"name":"check_license","title":null,"description":"Look up one roofing contractor license or registration by state and 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 | licensed-not-active (trade license states like FL), registered-active | registered-not-active (registration states like NJ/PA — business registration, not a trade license), not-in-roster, not-found. 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.","inputs":[{"name":"license_number","type":"string","required":true,"description":"License number as printed, e.g. CCC1325838 or CGC061405; hyphens/spaces are ignored"},{"name":"state","type":"string","required":true,"description":"Two-letter state code or state name, e.g. FL, tx, Florida"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":201},{"name":"search_licensees","title":null,"description":"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.","inputs":[{"name":"city","type":"string","required":false,"description":null},{"name":"limit","type":"integer","required":false,"description":null},{"name":"query","type":"string","required":true,"description":"Name, firm, or license fragment"},{"name":"state","type":"string","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":92},{"name":"state_rules","title":null,"description":"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.","inputs":[{"name":"state","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":106},{"name":"unlicensed_activity","title":null,"description":"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.","inputs":[{"name":"all_trades","type":"boolean","required":false,"description":"false (default) = roofing-typed citations only; true = all trades"},{"name":"county","type":"string","required":false,"description":"e.g. Lee, Miami-Dade, Dade — normalized automatically"},{"name":"limit","type":"integer","required":false,"description":null},{"name":"name","type":"string","required":false,"description":"Respondent or DBA name fragment"},{"name":"state","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":161},{"name":"enforcement_actions","title":null,"description":"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.","inputs":[{"name":"all_trades","type":"boolean","required":false,"description":null},{"name":"county","type":"string","required":false,"description":"e.g. Miami-Dade"},{"name":"license_number","type":"string","required":false,"description":"e.g. CCC1325838"},{"name":"limit","type":"integer","required":false,"description":null},{"name":"name","type":"string","required":false,"description":"Respondent or DBA name fragment"},{"name":"since","type":"string","required":false,"description":"ISO date, e.g. 2025-01-01"},{"name":"state","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":153},{"name":"compare_rules","title":null,"description":"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.","inputs":[{"name":"field","type":"string","required":true,"description":null},{"name":"states","type":"array","required":true,"description":"Two-letter state codes, e.g. [\"FL\", \"GA\"]"}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":115},{"name":"changes_since","title":null,"description":"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.","inputs":[{"name":"cursor","type":"string","required":false,"description":null},{"name":"limit","type":"integer","required":false,"description":null},{"name":"since","type":"string","required":true,"description":"ISO date, max 90 days back, e.g. 2026-09-01"},{"name":"state","type":"string","required":false,"description":null},{"name":"type","type":"string","required":false,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":118},{"name":"verify_live","title":null,"description":"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.","inputs":[{"name":"license_number","type":"string","required":true,"description":"e.g. CCC1325838"},{"name":"state","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":94},{"name":"request_contact","title":null,"description":"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.","inputs":[{"name":"consent_confirmed","type":"boolean","required":true,"description":"User saw the consent text and agreed"},{"name":"email","type":"string","required":true,"description":null},{"name":"first_name","type":"string","required":true,"description":null},{"name":"insurance_job","type":"string","required":true,"description":"is this an insurance claim: yes, no, not-sure"},{"name":"license_number","type":"string","required":true,"description":null},{"name":"phone","type":"string","required":true,"description":null},{"name":"project_type","type":"string","required":true,"description":"project type: replacement, repair-leak, storm, inspection, gutters, new-construction, commercial"},{"name":"state","type":"string","required":true,"description":null},{"name":"timeline","type":"string","required":true,"description":"when needed: emergency, within-month, 1-3-months, just-quotes"},{"name":"zip","type":"string","required":true,"description":null}],"outputs":[],"hasOutputSchema":false,"hasExamples":false,"tokenEstimate":222}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-06T05:20:47.000Z","track":"remote","endpoint":"https://rooferregistry.com/api/mcp","declaredUrl":null,"truncated":false,"tls":{"outcome":"valid","label":"Valid","version":"TLS 1.3","cipherSuite":"TLS_AES_128_GCM_SHA256","chainError":null,"certificates":[{"subject":"CN=rooferregistry.com","issuer":"CN=YR2,O=Let's Encrypt,C=US","notBefore":"2026-09-21T17:40:48Z","notAfter":"2026-12-20T17:40:47Z","keyType":"RSA","keyBits":2048,"isCa":false},{"subject":"CN=YR2,O=Let's Encrypt,C=US","issuer":"CN=Root YR,O=ISRG,C=US","notBefore":"2025-09-03T00:00:00Z","notAfter":"2028-09-02T23:59:59Z","keyType":"RSA","keyBits":2048,"isCa":true},{"subject":"CN=Root YR,O=ISRG,C=US","issuer":"CN=ISRG Root X1,O=Internet Security Research Group,C=US","notBefore":"2026-05-13T00:00:00Z","notAfter":"2032-09-02T23:59:59Z","keyType":"RSA","keyBits":4096,"isCa":true}]},"dnssec":{"result":"insecure","label":"Not signed","name":"rooferregistry.com.","steps":[{"zone":".","outcome":"verified","label":"Verified"},{"zone":"com.","outcome":"verified","label":"Verified"},{"zone":"rooferregistry.com.","outcome":"insecure_proven","label":"Unsigned (proven)"}]},"auth":{"outcome":"none","label":"No authorisation required","gate":null,"gateLabel":null,"status":200,"authorizationServers":[]},"httpsRedirect":{"outcome":"https_enforced","label":"HTTPS enforced","status":308},"transports":[{"transport":"streamable-http","outcome":"verified","label":"Verified","status":200,"followed":false}],"provenance":null,"installScripts":[],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":null},"mismatches":[],"changelog":{"trackingSince":"2026-10-22","recent":[{"id":"chg_01a1af4d-6707-72d5-8cbc-30060b6d4337","kind":"score.rubric_changed","summary":"We updated how we score, so this day's move reflects our rubric, not a change to the server","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-06","url":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp#chg-chg_01a1af4d-6707-72d5-8cbc-30060b6d4337"},{"id":"chg_01a1aa26-b8c9-788a-885e-2a87faf27891","kind":"score.total_changed","summary":"Trust score (63 → 64)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp#chg-chg_01a1aa26-b8c9-788a-885e-2a87faf27891"},{"id":"chg_01a19aac-79a4-78c7-bb37-0bf87442463e","kind":"tool.description_changed","summary":"Tool “check_license” rewrote its description, which is the text the model reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-11-02","url":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp#chg-chg_01a19aac-79a4-78c7-bb37-0bf87442463e"},{"id":"chg_01a19aac-79a6-73ac-9f0a-fc27c3d81ae2","kind":"score.total_changed","summary":"Trust score (62 → 63)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-02","url":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp#chg-chg_01a19aac-79a6-73ac-9f0a-fc27c3d81ae2"},{"id":"chg_01a19060-5961-77d3-8ced-5a2dae107043","kind":"tool.description_changed","summary":"Tool “check_license” rewrote its description, which is the text the model reads","materiality":"security","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-31","url":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp#chg-chg_01a19060-5961-77d3-8ced-5a2dae107043"},{"id":"chg_01a19060-5962-7a46-9368-22da6ac3c49b","kind":"score.total_changed","summary":"Trust score (61 → 62)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-31","url":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp#chg-chg_01a19060-5962-7a46-9368-22da6ac3c49b"},{"id":"chg_01a18615-0aa3-72a7-96b8-7d3bcace4eed","kind":"score.total_changed","summary":"Trust score (60 → 61)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-29","url":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp#chg-chg_01a18615-0aa3-72a7-96b8-7d3bcace4eed"},{"id":"chg_01a17bc6-8447-7e84-8823-3f9ec20ac16e","kind":"score.total_changed","summary":"Trust score (59 → 60)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-27","url":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp#chg-chg_01a17bc6-8447-7e84-8823-3f9ec20ac16e"},{"id":"chg_01a17179-bf34-7d3e-a7fa-a9f29437c345","kind":"score.total_changed","summary":"Trust score (58 → 59)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-25","url":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp#chg-chg_01a17179-bf34-7d3e-a7fa-a9f29437c345"},{"id":"chg_01a1672c-9803-7368-a5ef-af074617e558","kind":"check.reverified","summary":"Stability (unverified → 0.03)","materiality":"functional","direction":"improvement","scoreDelta":null,"occurredOn":"2026-10-23","url":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp#chg-chg_01a1672c-9803-7368-a5ef-af074617e558"},{"id":"chg_01a1672c-9803-7a89-bf02-0505f5b9d9cf","kind":"score.total_changed","summary":"Trust score (57 → 58)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-23","url":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp#chg-chg_01a1672c-9803-7a89-bf02-0505f5b9d9cf"},{"id":"chg_01a165d8-0892-7c12-834e-f2029dc21e5e","kind":"score.first_scored","summary":"First indexed and scored","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-22","url":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp#chg-chg_01a165d8-0892-7c12-834e-f2029dc21e5e"}],"truncated":false,"feedUrl":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp/changelog.json"},"links":{"html":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp","markdown":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp.md","changelogJson":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp/changelog.json","changelogRss":"https://verifymcp.io/servers/com-rooferregistry-roofer-registry/api-mcp.xml","external":[{"label":"Remote endpoint","href":"https://rooferregistry.com/api/mcp"},{"label":"Repository","href":"https://github.com/kevincolahan/roofing-directory"},{"label":"Website","href":"https://rooferregistry.com/"}]}}