
Certificate of insurance tools: build subcontractor insurance requirements, check an ACORD 25.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Recommends the insurance a general contractor should require of a subcontractor, or a property manager or HOA of a vendor: general liability, auto, umbrella and workers' comp limits, additional insured, waiver of subrogation and primary/non-contributory wording, scaled to the trade's risk and the contract size. Returns the reasoning for each limit, contract-ready exhibit text, and a requirements object that check_certificate accepts.
The vendor's trade, and the contexts it is offered in: "general" = General / multi-trade (gc); "carpentry" = Carpentry / framing (gc); "concrete" = Concrete / masonry (gc); "drywall" = Drywall / plaster (gc); "painting" = Painting / finishes (gc/property); "electrical" = Electrical (gc/property); "mechanical" = Plumbing / HVAC (gc/property); "glazing" = Glazing / curtain wall (gc); "roofing" = Roofing (gc/property); "demolition" = Demolition (gc); "steel" = Structural steel / crane work (gc); "excavation" = Excavation / earthwork (gc); "scaffolding" = Scaffolding / shoring (gc); "abatement" = Asbestos / lead abatement (gc); "designbuild" = Design-build / engineering (gc); "landscaping" = Landscaping / grounds (property/gc); "janitorial" = Janitorial / cleaning (property); "pool" = Pool maintenance (property); "pest" = Pest control (property); "snow" = Snow & ice removal (property); "tree" = Tree removal / arborist (property); "elevator" = Elevator maintenance (property); "security" = Security services (property); "pm" = Property management services (property).
"gc" = a contractor hiring a subcontractor; "property" = a property manager or HOA hiring a service vendor.
Contract value band. For "gc": under-50k, 50k-250k, 250k-1m, over-1m. For "property": under-10k, 10k-50k, 50k-250k, over-250k. A band from the other context is mapped to the smallest valid one.
Optional dollar limits that replace the recommended ones, for lines that are already required.
false for a sole proprietor with no employees: workers' comp is replaced by a signed exemption declaration.
Drives to or around the site. false drops commercial auto.
Days of written notice before cancellation. 0 = as the policy provides.
Recommends the insurance a general contractor should require of a subcontractor, or a property manager or HOA of a vendor: general liability, auto, umbrella and workers' comp limits, additional insured, waiver of subrogation and primary/non-contributory wording, scaled to the trade's risk and the contract size. Returns the reasoning for each limit, contract-ready exhibit text, and a requirements object that check_certificate accepts.
| Argument | Type | Description |
|---|---|---|
| trade* | string | The vendor's trade, and the contexts it is offered in: "general" = General / multi-trade (gc); "carpentry" = Carpentry / framing (gc); "concrete" = Concrete / masonry (gc); "drywall" = Drywall / plaster (gc); "painting" = Painting / finishes (gc/property); "electrical" = Electrical (gc/property); "mechanical" = Plumbing / HVAC (gc/property); "glazing" = Glazing / curtain wall (gc); "roofing" = Roofing (gc/property); "demolition" = Demolition (gc); "steel" = Structural steel / crane work (gc); "excavation" = Excavation / earthwork (gc); "scaffolding" = Scaffolding / shoring (gc); "abatement" = Asbestos / lead abatement (gc); "designbuild" = Design-build / engineering (gc); "landscaping" = Landscaping / grounds (property/gc); "janitorial" = Janitorial / cleaning (property); "pool" = Pool maintenance (property); "pest" = Pest control (property); "snow" = Snow & ice removal (property); "tree" = Tree removal / arborist (property); "elevator" = Elevator maintenance (property); "security" = Security services (property); "pm" = Property management services (property). |
| context* | string | "gc" = a contractor hiring a subcontractor; "property" = a property manager or HOA hiring a service vendor. |
| overrides | object | Optional dollar limits that replace the recommended ones, for lines that are already required. |
| contractSize* | string | Contract value band. For "gc": under-50k, 50k-250k, 250k-1m, over-1m. For "property": under-10k, 10k-50k, 50k-250k, over-250k. A band from the other context is mapped to the smallest valid one. |
| hasEmployees | boolean | false for a sole proprietor with no employees: workers' comp is replaced by a signed exemption declaration. |
| usesVehicles | boolean | Drives to or around the site. false drops commercial auto. |
| cancellationNoticeDays | integer | Days of written notice before cancellation. 0 = as the policy provides. |
{
"type": "object",
"required": [
"context",
"trade",
"contractSize"
],
"properties": {
"trade": {
"enum": [
"general",
"carpentry",
"concrete",
"drywall",
"painting",
"electrical",
"mechanical",
"glazing",
"roofing",
"demolition",
"steel",
"excavation",
"scaffolding",
"abatement",
"designbuild",
"landscaping",
"janitorial",
"pool",
"pest",
"snow",
"tree",
"elevator",
"security",
"pm"
],
"type": "string",
"description": "The vendor's trade, and the contexts it is offered in: \"general\" = General / multi-trade (gc); \"carpentry\" = Carpentry / framing (gc); \"concrete\" = Concrete / masonry (gc); \"drywall\" = Drywall / plaster (gc); \"painting\" = Painting / finishes (gc/property); \"electrical\" = Electrical (gc/property); \"mechanical\" = Plumbing / HVAC (gc/property); \"glazing\" = Glazing / curtain wall (gc); \"roofing\" = Roofing (gc/property); \"demolition\" = Demolition (gc); \"steel\" = Structural steel / crane work (gc); \"excavation\" = Excavation / earthwork (gc); \"scaffolding\" = Scaffolding / shoring (gc); \"abatement\" = Asbestos / lead abatement (gc); \"designbuild\" = Design-build / engineering (gc); \"landscaping\" = Landscaping / grounds (property/gc); \"janitorial\" = Janitorial / cleaning (property); \"pool\" = Pool maintenance (property); \"pest\" = Pest control (property); \"snow\" = Snow & ice removal (property); \"tree\" = Tree removal / arborist (property); \"elevator\" = Elevator maintenance (property); \"security\" = Security services (property); \"pm\" = Property management services (property)."
},
"context": {
"enum": [
"gc",
"property"
],
"type": "string",
"description": "\"gc\" = a contractor hiring a subcontractor; \"property\" = a property manager or HOA hiring a service vendor."
},
"overrides": {
"type": "object",
"properties": {
"glAggregate": {
"type": "number",
"exclusiveMinimum": 0
},
"glEachOccurrence": {
"type": "number",
"exclusiveMinimum": 0
},
"wcEachOccurrence": {
"type": "number",
"exclusiveMinimum": 0
},
"autoEachOccurrence": {
"type": "number",
"exclusiveMinimum": 0
},
"umbrellaEachOccurrence": {
"type": "number",
"exclusiveMinimum": 0
}
},
"description": "Optional dollar limits that replace the recommended ones, for lines that are already required.",
"additionalProperties": false
},
"contractSize": {
"enum": [
"under-50k",
"50k-250k",
"250k-1m",
"over-1m",
"under-10k",
"10k-50k",
"over-250k"
],
"type": "string",
"description": "Contract value band. For \"gc\": under-50k, 50k-250k, 250k-1m, over-1m. For \"property\": under-10k, 10k-50k, 50k-250k, over-250k. A band from the other context is mapped to the smallest valid one."
},
"hasEmployees": {
"type": "boolean",
"default": true,
"description": "false for a sole proprietor with no employees: workers' comp is replaced by a signed exemption declaration."
},
"usesVehicles": {
"type": "boolean",
"default": true,
"description": "Drives to or around the site. false drops commercial auto."
},
"cancellationNoticeDays": {
"type": "integer",
"default": 30,
"maximum": 365,
"minimum": 0,
"description": "Days of written notice before cancellation. 0 = as the policy provides."
}
},
"additionalProperties": false
}Checks a certificate of insurance (ACORD 25) against insurance requirements with CertifiKit's deterministic rules engine: coverage present, limits at or above the minimums, policies not expired or expiring too soon, and the required endorsements. Read the certificate yourself and pass what it shows; the verdict (pass, fail or needs_review) and a plain-English reason per requirement come from fixed rules, not a model. Anything unreported, unreadable or below 0.7 confidence is routed to needs_review, never silently passed. Use preset or the requirements object from build_insurance_requirements.
| Argument | Type | Description |
|---|---|---|
| asOf | string | Date to check expiry against, yyyy-mm-dd. Defaults to today. |
| preset | string | "standard-subcontractor" = Typical GC requirements for a trade sub: GL $1M/$2M, auto $1M, workers' comp $1M, additional insured + waiver of subrogation. "property-vendor" = Common requirements for service vendors at managed properties: GL $1M/$2M, workers' comp $500K, additional insured. |
| certificate* | object | What the certificate shows. Report only what is printed; do not infer. Leave out rows the certificate does not have. |
| requirements | object | Custom requirements, e.g. the requirements object returned by build_insurance_requirements. Takes precedence over preset. |
{
"type": "object",
"required": [
"certificate"
],
"properties": {
"asOf": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Date to check expiry against, yyyy-mm-dd. Defaults to today."
},
"preset": {
"enum": [
"standard-subcontractor",
"property-vendor"
],
"type": "string",
"description": "\"standard-subcontractor\" = Typical GC requirements for a trade sub: GL $1M/$2M, auto $1M, workers' comp $1M, additional insured + waiver of subrogation. \"property-vendor\" = Common requirements for service vendors at managed properties: GL $1M/$2M, workers' comp $500K, additional insured."
},
"certificate": {
"type": "object",
"properties": {
"producer": {
"type": [
"string",
"null"
],
"description": "The issuing agent or broker."
},
"umbrella": {
"type": "object",
"required": [
"present"
],
"properties": {
"present": {
"type": "boolean",
"description": "true only if the row has a policy number or limits filled in."
},
"aggregate": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "General aggregate limit in whole dollars as printed (1000000 for $1,000,000). null if blank or unreadable."
},
"confidence": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "How sure you are of this row, 0-1. Defaults to 1. Set it below 0.7 if the row was hard to read, so it is routed to needs_review instead of pass or fail."
},
"policyNumber": {
"type": [
"string",
"null"
]
},
"effectiveDate": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Policy effective date, yyyy-mm-dd. null if blank or unreadable."
},
"eachOccurrence": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Each occurrence limit in whole dollars as printed (1000000 for $1,000,000). null if blank or unreadable."
},
"expirationDate": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Policy expiration date, yyyy-mm-dd. null if blank or unreadable."
}
},
"description": "The Umbrella / Excess Liability row of the ACORD 25. Omit it if the certificate has no such row."
},
"insuredName": {
"type": [
"string",
"null"
]
},
"workersComp": {
"type": "object",
"required": [
"present"
],
"properties": {
"present": {
"type": "boolean",
"description": "true only if the row has a policy number or limits filled in."
},
"aggregate": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "General aggregate limit in whole dollars as printed (1000000 for $1,000,000). null if blank or unreadable."
},
"confidence": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "How sure you are of this row, 0-1. Defaults to 1. Set it below 0.7 if the row was hard to read, so it is routed to needs_review instead of pass or fail."
},
"policyNumber": {
"type": [
"string",
"null"
]
},
"effectiveDate": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Policy effective date, yyyy-mm-dd. null if blank or unreadable."
},
"eachOccurrence": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Employers' liability each accident limit in whole dollars as printed (1000000 for $1,000,000). null if blank or unreadable."
},
"expirationDate": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Policy expiration date, yyyy-mm-dd. null if blank or unreadable."
}
},
"description": "The Workers' Compensation and Employers' Liability row of the ACORD 25. Omit it if the certificate has no such row."
},
"autoLiability": {
"type": "object",
"required": [
"present"
],
"properties": {
"present": {
"type": "boolean",
"description": "true only if the row has a policy number or limits filled in."
},
"aggregate": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "General aggregate limit in whole dollars as printed (1000000 for $1,000,000). null if blank or unreadable."
},
"confidence": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "How sure you are of this row, 0-1. Defaults to 1. Set it below 0.7 if the row was hard to read, so it is routed to needs_review instead of pass or fail."
},
"policyNumber": {
"type": [
"string",
"null"
]
},
"effectiveDate": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Policy effective date, yyyy-mm-dd. null if blank or unreadable."
},
"eachOccurrence": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Combined single limit in whole dollars as printed (1000000 for $1,000,000). null if blank or unreadable."
},
"expirationDate": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Policy expiration date, yyyy-mm-dd. null if blank or unreadable."
}
},
"description": "The Automobile Liability row of the ACORD 25. Omit it if the certificate has no such row."
},
"generalLiability": {
"type": "object",
"required": [
"present"
],
"properties": {
"present": {
"type": "boolean",
"description": "true only if the row has a policy number or limits filled in."
},
"aggregate": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "General aggregate limit in whole dollars as printed (1000000 for $1,000,000). null if blank or unreadable."
},
"confidence": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "How sure you are of this row, 0-1. Defaults to 1. Set it below 0.7 if the row was hard to read, so it is routed to needs_review instead of pass or fail."
},
"policyNumber": {
"type": [
"string",
"null"
]
},
"effectiveDate": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Policy effective date, yyyy-mm-dd. null if blank or unreadable."
},
"eachOccurrence": {
"type": [
"number",
"null"
],
"minimum": 0,
"description": "Each occurrence limit in whole dollars as printed (1000000 for $1,000,000). null if blank or unreadable."
},
"expirationDate": {
"type": [
"string",
"null"
],
"pattern": "^\\d{4}-\\d{2}-\\d{2}$",
"description": "Policy expiration date, yyyy-mm-dd. null if blank or unreadable."
}
},
"description": "The Commercial General Liability row of the ACORD 25. Omit it if the certificate has no such row."
},
"additionalInsured": {
"type": "object",
"required": [
"present"
],
"properties": {
"present": {
"type": "boolean"
},
"confidence": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "How sure you are of this row, 0-1. Defaults to 1. Set it below 0.7 if the row was hard to read, so it is routed to needs_review instead of pass or fail."
},
"formNumber": {
"type": [
"string",
"null"
],
"description": "Endorsement form number if printed, e.g. CG 20 10."
}
},
"description": "Additional insured: from the ADDL INSD / SUBR WVD boxes, the description of operations, or an attached endorsement form."
},
"certificateHolder": {
"type": [
"string",
"null"
]
},
"overallConfidence": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "How legible and complete the whole document was, 0-1. Defaults to 1. Below 0.7, a pass becomes needs_review."
},
"waiverOfSubrogation": {
"type": "object",
"required": [
"present"
],
"properties": {
"present": {
"type": "boolean"
},
"confidence": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "How sure you are of this row, 0-1. Defaults to 1. Set it below 0.7 if the row was hard to read, so it is routed to needs_review instead of pass or fail."
},
"formNumber": {
"type": [
"string",
"null"
],
"description": "Endorsement form number if printed, e.g. CG 20 10."
}
},
"description": "Waiver of subrogation: from the ADDL INSD / SUBR WVD boxes, the description of operations, or an attached endorsement form."
},
"primaryNonContributory": {
"type": "object",
"required": [
"present"
],
"properties": {
"present": {
"type": "boolean"
},
"confidence": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "How sure you are of this row, 0-1. Defaults to 1. Set it below 0.7 if the row was hard to read, so it is routed to needs_review instead of pass or fail."
},
"formNumber": {
"type": [
"string",
"null"
],
"description": "Endorsement form number if printed, e.g. CG 20 10."
}
},
"description": "Primary and non-contributory wording: from the ADDL INSD / SUBR WVD boxes, the description of operations, or an attached endorsement form."
}
},
"description": "What the certificate shows. Report only what is printed; do not infer. Leave out rows the certificate does not have."
},
"requirements": {
"type": "object",
"required": [
"name",
"generalLiability",
"autoLiability",
"umbrella",
"workersComp",
"requireAdditionalInsured",
"requireWaiverOfSubrogation",
"requirePrimaryNonContributory",
"minDaysUntilExpiry"
],
"properties": {
"name": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"umbrella": {
"type": "object",
"required": [
"required"
],
"properties": {
"required": {
"type": "boolean"
},
"minAggregate": {
"type": "number",
"exclusiveMinimum": 0
},
"minEachOccurrence": {
"type": "number",
"exclusiveMinimum": 0
}
}
},
"workersComp": {
"type": "object",
"required": [
"required"
],
"properties": {
"required": {
"type": "boolean"
},
"minAggregate": {
"type": "number",
"exclusiveMinimum": 0
},
"minEachOccurrence": {
"type": "number",
"exclusiveMinimum": 0
}
}
},
"autoLiability": {
"type": "object",
"required": [
"required"
],
"properties": {
"required": {
"type": "boolean"
},
"minAggregate": {
"type": "number",
"exclusiveMinimum": 0
},
"minEachOccurrence": {
"type": "number",
"exclusiveMinimum": 0
}
}
},
"generalLiability": {
"type": "object",
"required": [
"required"
],
"properties": {
"required": {
"type": "boolean"
},
"minAggregate": {
"type": "number",
"exclusiveMinimum": 0
},
"minEachOccurrence": {
"type": "number",
"exclusiveMinimum": 0
}
}
},
"minDaysUntilExpiry": {
"type": "integer",
"maximum": 365,
"minimum": 0,
"description": "Fail policies expiring within this many days. 0 = fail only expired ones."
},
"requireAdditionalInsured": {
"type": "boolean"
},
"requireWaiverOfSubrogation": {
"type": "boolean"
},
"requirePrimaryNonContributory": {
"type": "boolean"
}
},
"description": "Custom requirements, e.g. the requirements object returned by build_insurance_requirements. Takes precedence over preset."
}
},
"additionalProperties": false
}Searches CertifiKit's plain-English guides on certificates of insurance: reading an ACORD 25, additional insured endorsements (CG 20 10), waiver of subrogation, subcontractor and HOA vendor insurance requirements, COI tracking. Returns titles, summaries and links to cite. Leave query empty to list the newest.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| query | string | Topic or question. |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 5,
"maximum": 20,
"minimum": 1
},
"query": {
"type": "string",
"maxLength": 200,
"description": "Topic or question."
}
},
"additionalProperties": false
}The ready-made insurance requirement sets check_certificate accepts as preset: a standard construction subcontractor and a property / HOA vendor, with every limit and endorsement spelled out.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}