Insurance Underwriting Intelligence

by apifyforge

1 stars
152 downloads
Not rated
GitHub Website

About

Insurance underwriting intelligence for commercial P&C teams — this MCP server delivers multi-peril risk assessment for any property location using 8 live government data sources.

Details

Author
apifyforge
GitHub stars
1
Downloads
152
Categories
Other

- 8 parallel government data sources queried simultaneously
- Composite Peril Score (0–100) from four weighted scoring models
- Four risk tier classifications: Preferred, Standard, Substandard, Decline
- Premium modifier output from 0.8 (discount) to 2.5 (maximum surcharge)
- Automatic geocoding of addresses to latitude/longitude
- Underwriting notes with decision guidance and peril flags
- Spending limit enforcement via Actor.charge() check before every tool call

Setting up with Highlight

This MCP is not yet compatible with Highlight’s one-click setup. However, you can still use it with Highlight by following these steps:

  1. Download and install Highlight from highlightai.com/download
  2. Navigate to the plugins tab and select "Add Custom Plugin"
  3. Configure the plugin with the settings below
    Plugin Name Insurance Underwriting Intelligence
    Command (node, npx, python, etc.)

    Please refer to the README for specific instructions on how to obtain API keys or other required environment variables.

  4. Enable "Start Automatically" if you want the plugin to start when Highlight launches

From the repository

Add the server URL https://ryanclinton--insurance-underwriting-intelligence-mcp.apify.actor/mcp to your MCP client (Claude Desktop, Cursor, Windsurf) with an Apify API token. Then ask your AI assistant to run a risk assessment by providing a property address or region. The server returns a structured JSON brief; the AI summarises key signals in plain language.

Claude Desktop / Cursor

Paste into your MCP client config file to install this server.

{
    "mcpServers": {
        "insurance underwriting intelligence": {
            "insurance-underwriting-intelligence-mcp": {
                "url": "https://ryanclinton--insurance-underwriting-intelligence-mcp.apify.actor/mcp"
            }
        }
    }
}

McpServers

{
    "insurance-underwriting-intelligence-mcp": {
        "url": "https://ryanclinton--insurance-underwriting-intelligence-mcp.apify.actor/mcp"
    }
}

Insurance Underwriting Intelligence MCP Server

> View on ApifyForge | Use on Apify Store

---

Quick Start

Add to your MCP client (Claude Desktop, Cursor, Windsurf):

{
  "mcpServers": {
    "insurance-underwriting-intelligence-mcp": {
      "url": "https://ryanclinton--insurance-underwriting-intelligence-mcp.apify.actor/mcp"
    }
  }
}

---

Insurance underwriting intelligence for commercial P&C teams — this MCP server delivers multi-peril risk assessment for any property location using 8 live government data sources. It produces a Composite Peril Score (0-100), a four-tier risk classification (Preferred / Standard / Substandard / Decline), a premium modifier, and actionable underwriting notes — all from a single tool call.

P&C underwriters, actuarial teams, reinsurers, and risk engineers can query any address or region and receive structured risk intelligence across natural disasters, seismic exposure, flood warnings, weather severity, environmental contamination, crime proximity, and projected climate trajectory at 5, 10, and 25-year horizons. No manual data gathering, no vendor subscriptions — pay only per assessment.

What data can you extract?

| Data Point | Source | Example |
|---|---|---|
| 📋 FEMA major disaster declarations | FEMA Disaster Declarations | 14 DR-type declarations, flood/hurricane dominant |
| 🌊 Active flood warnings with severity | UK Environment Agency | 3 severe flood warnings active within 5km |
| 🌍 Seismic event magnitude distribution | USGS Earthquake Search | 2× Mag 5-6 events, 8× Mag 4-5 within 100km |
| 🌩 NOAA weather alert severity | NOAA Weather Alerts | 2 EXTREME tornado warnings, 1 SEVERE thunderstorm |
| 🏭 Air quality vs WHO guidelines | OpenAQ Air Quality | PM2.5 at 34 µg/m³ — 2.3× WHO threshold exceeded |
| 👮 Crime exposure by category | UK Police Crime Data | 42 violent crimes, 87 property crimes in period |
| 🏠 Property transaction context | UK Land Registry | Median sale price £285,000 — 24 transactions |
| 📍 Geocoded coordinates | Nominatim / OpenStreetMap | 51.5074°N, 0.1278°W resolved from address |
| 📊 Composite Peril Score (0-100) | 4-model scoring engine | Score: 58 — HIGH peril tier |
| 🏷 Risk tier classification | Composite model | SUBSTANDARD — surcharges recommended |
| ⚙️ Premium modifier | Risk-weighted formula | 1.79× base premium |
| 📈 Climate trajectory projections | Historical trend model | 5yr: 64 / 10yr: 71 / 25yr: 86 (WORSENING) |

Why use Insurance Underwriting Intelligence MCP Server?

Manual underwriting research for a single property submission means opening FEMA's disaster search, USGS earthquake feeds, NOAA alert dashboards, local police statistics, and air quality portals — then reconciling seven data sources into a coherent risk picture. That takes 45-90 minutes per risk. At scale, it is impractical.

This MCP automates the entire workflow. One tool call dispatches parallel requests to all 8 data sources, runs four scoring models, and returns a structured underwriting brief in under 60 seconds. Your AI assistant in Claude, Cursor, or Windsurf can call these tools mid-conversation and surface risk signals instantly.

- Scheduling — run portfolio-wide risk rescoring annually at policy renewal using Apify's scheduler, with no manual intervention
- API access — trigger assessments from Python, JavaScript, or any HTTP client and feed results directly into underwriting workbenches
- Proxy rotation — Apify's built-in proxy infrastructure ensures reliable data retrieval at scale without blocks
- Monitoring — configure Slack or email alerts when assessments complete or when spending limits are reached
- Integrations — connect results to Google Sheets, HubSpot, Zapier, or Make for downstream workflow automation

Features

- 8 parallel data sources — FEMA, USGS, NOAA, UK Flood Warnings, UK Police, OpenAQ, UK Land Registry, and Nominatim geocoder are queried simultaneously via Promise.allSettled, so one source failure does not block the rest
- Composite Peril Score (0-100) — four weighted scoring models combine into a single risk number: Composite Peril 35%, Climate Trajectory 25%, Crime Exposure 20%, Environmental Contamination 20%
- Magnitude-weighted seismic scoring — USGS events are scored by magnitude bucket: Mag 6+ events contribute 10 points each, Mag 5+ contribute 5, Mag 4+ contribute 2, capped at 25 per assessment
- WHO-compliant air quality scoring — six pollutants (PM2.5, PM10, NO2, SO2, O3, CO) are compared to WHO guideline thresholds; exceedances are weighted by their exceedance ratio, not just presence
- Violent vs property crime separation — UK Police data is classified into 7 violent crime types and 6 property crime types with differential underwriting weights (violent: 4pts each; property: 2pts each)
- Climate acceleration model — FEMA disaster declarations are bucketed by year; the ratio of the most recent decade average to the prior decade average determines an acceleration factor that projects risk forward using an exponential growth model
- 4 risk tier classifications — Preferred (0-24), Standard (25-49), Substandard (50-74), Decline (75-100) with corresponding underwriting action guidance
- Premium modifier output — a multiplier from 0.8 (preferred discount) to 2.5 (maximum surcharge) is calculated from the composite risk score using the formula 0.8 + (score / 100) × 1.7
- Automatic geocoding — any address or region name is converted to latitude/longitude via Nominatim before spatial queries to USGS, NOAA, and OpenAQ
- Configurable seismic radiusevaluate_seismic_exposure accepts a radiusKm parameter (default 100km) for proximity-based earthquake analysis
- Underwriting notes generation — the brief includes narrative decision notes flagging: senior underwriter referral triggers, dominant peril exclusions, security requirement recommendations, and environmental endorsement suggestions
- Spending limit enforcement — every tool checks Actor.charge() before executing; if your per-run budget cap is reached, the tool returns a structured error immediately rather than silently failing

Use cases for insurance underwriting intelligence

Commercial property underwriting

P&C underwriters processing new commercial property submissions spend disproportionate time gathering basic hazard data. This MCP returns a structured risk brief in under 60 seconds via generate_underwriting_brief. Triage a full day's submissions by composite score in minutes, focusing manual review on SUBSTANDARD and DECLINE-tier properties.

Actuarial climate trajectory modeling

Actuarial teams pricing long-tail property risks need forward-looking hazard data, not just current exposure. project_climate_trajectory uses historical FEMA disaster frequency trends to project risk at 5, 10, and 25-year horizons — feeding directly into catastrophe model calibration for climate-adjusted pricing.

Reinsurance portfolio concentration analysis

Reinsurers evaluating treaty submissions need rapid portfolio-level hazard aggregation. Running assess_location_risk across a cedent's property schedule identifies geographic peril concentration and locations where multiple hazards converge — the zones most likely to drive correlated losses.

Risk engineering pre-survey prioritization

Before deploying field engineers, risk engineering teams call evaluate_seismic_exposure and check_flood_risk to identify the highest-hazard properties requiring in-person inspection. Focus field resources on locations signalling MODERATE peril or above.

Environmental liability underwriting

measure_environmental_liability provides location-specific air quality readings against WHO guidelines with per-pollutant exceedance counts. Directly informative for respiratory illness claim exposure and pollution legal liability pricing.

Flood and weather specialty lines

check_flood_risk combines UK Environment Agency active flood warnings with the historical FEMA flood disaster record, building a dual-source flood exposure picture for specialty lines pricing and exclusion decisions.

How to use insurance underwriting risk assessment

1. Connect your MCP client — add the server URL https://insurance-underwriting-intelligence-mcp.apify.actor/mcp to Claude Desktop, Cursor, Windsurf, or any MCP-compatible AI tool. You need an Apify API token.
2. Ask for a risk assessment — tell your AI assistant the property address or region, for example: "Run an underwriting brief for 1400 Brickell Ave, Miami, FL." The AI calls the appropriate tool automatically.
3. Review the structured output — the server returns a JSON brief with composite score, risk tier, premium modifier, and per-peril breakdowns. The AI summarises the key signals in plain language.
4. Download or route results — copy the JSON output into your underwriting workbench, push to Google Sheets via Apify integrations, or trigger a webhook to your policy management system.

Input parameters

This server uses no actor-level input parameters — all inputs are passed as tool arguments when calling each MCP tool. See the tool reference below.

Tool parameters

All tools except analyze_disaster_history accept optional latitude and longitude (number, auto-geocoded if omitted). The table below lists tool-specific parameters only.

| Tool | Parameter | Type | Required | Default | Description |
|------|-----------|------|----------|---------|-------------|
| All tools | location | string | Yes | — | Address, city, state, or region |
| All tools | latitude | number | No | auto | Decimal latitude — skips geocoding step |
| All tools | longitude | number | No | auto | Decimal longitude — skips geocoding step |
| analyze_disaster_history | location | string | Yes | — | State, county, or region for FEMA search |
| evaluate_seismic_exposure | radiusKm | number | No | 100 | Earthquake search radius in kilometres |

Usage tips

- Provide coordinates when you have them — skip geocoding latency by passing latitude and longitude directly alongside the location string for all spatial tools
- Start with assess_location_risk before calling generate_underwriting_brief — the quick assessment takes one-quarter of the time and identifies whether a full brief is warranted
- Use analyze_disaster_history for US states and counties — FEMA data is most complete at state and county level; city-level queries return fewer records for rural areas
- Set radiusKm to 200 in seismically active zones — the default 100km radius may underrepresent fault exposure in areas like California or Turkey where faults extend far from urban centres
- Use score_crime_proximity and check_flood_risk for UK addresses only — these tools source from UK government data; non-UK addresses will return limited or empty results

Output example

Full output from generate_underwriting_brief for a commercial property submission:

{
  "location": "1400 Brickell Avenue, Miami, FL",
  "coordinates": { "lat": 25.7589, "lon": -80.1946 },
  "compositeRiskScore": 61,
  "riskTier": "SUBSTANDARD",
  "premiumModifier": 1.84,
  "allSignals": [
    "12 FEMA major disaster declarations in area",
    "Significant seismic activity — 6 events recorded",
    "4 active weather alerts, including severe/extreme",
    "2 severe flood warnings active",
    "3 pollutants exceed WHO guidelines",
    "Disaster frequency accelerating — 50%+ increase over prior decade",
    "2 extreme weather events — elevated climate trajectory"
  ],
  "underwritingNotes": [
    "Dominant peril: Natural Disaster (FEMA) — consider exclusions or sublimits",
    "Climate trajectory rapidly worsening — review at shorter intervals",
    "Multiple pollution exceedances — environmental liability endorsement recommended"
  ],
  "compositePeril": {
    "score": 68,
    "disasterCount": 18,
    "earthquakeRisk": 14.5,
    "weatherAlerts": 4,
    "floodRisk": 3,
    "perilLevel": "HIGH",
    "dominantPeril": "Natural Disaster (FEMA)"
  },
  "environmentalContamination": {
    "score": 44,
    "airQualityIndex": 38,
    "pollutantCount": 5,
    "exceedances": 3,
    "contaminationLevel": "ELEVATED",
    "pollutants": [
      { "parameter": "pm25", "value": 34.2, "unit": "µg/m³" },
      { "parameter": "no2", "value": 41.8, "unit": "µg/m³" },
      { "parameter": "o3", "value": 118.0, "unit": "µg/m³" }
    ]
  },
  "crimeExposure": {
    "score": 38,
    "totalCrimes": 94,
    "violentCrimes": 7,
    "propertyCrimes": 22,
    "exposureLevel": "MODERATE",
    "topCategories": [
      { "category": "theft", "count": 31 },
      { "category": "criminal damage", "count": 18 },
      { "category": "burglary", "count": 14 }
    ]
  },
  "climateTrajectory": {
    "score": 72,
    "projectedRisk5yr": 78,
    "projectedRisk10yr": 84,
    "projectedRisk25yr": 96,
    "trendDirection": "RAPIDLY_WORSENING",
    "climateFactors": ["Accelerating disaster frequency", "Extreme weather patterns"]
  },
  "propertyData": [
    { "price": 4750000, "propertyType": "Commercial", "date": "2025-09-14" }
  ]
}

Output fields

| Field | Type | Description |
|-------|------|-------------|
| location | string | Input location as provided |
| coordinates | object\|null | Geocoded {lat, lon} or null if geocoding failed |
| compositeRiskScore | number | Weighted composite 0-100: Peril 35%, Climate 25%, Crime 20%, Env 20% |
| riskTier | string | PREFERRED / STANDARD / SUBSTANDARD / DECLINE |
| premiumModifier | number | Multiplier 0.80–2.50 computed as 0.80 + (score/100) × 1.70 |
| allSignals | string[] | Consolidated narrative risk signals from all four scoring models |
| underwritingNotes | string[] | Actionable notes: referral triggers, exclusion and endorsement recommendations |
| compositePeril.score | number | Peril sub-score 0-100 (FEMA 30pts + Seismic 25pts + Weather 25pts + Flood 20pts) |
| compositePeril.perilLevel | string | MINIMAL / LOW / MODERATE / HIGH / SEVERE |
| compositePeril.dominantPeril | string | Highest-scoring peril category name |
| compositePeril.disasterCount | number | Total FEMA declarations returned |
| compositePeril.earthquakeRisk | number | Raw seismic score before 25-point cap |
| compositePeril.weatherAlerts | number | NOAA alert count |
| compositePeril.floodRisk | number | UK flood warning count |
| environmentalContamination.score | number | Contamination score 0-100 (AQI 50pts + Exceedances 30pts + Diversity 20pts) |
| environmentalContamination.contaminationLevel | string | CLEAN / ACCEPTABLE / ELEVATED / HAZARDOUS |
| environmentalContamination.exceedances | number | Pollutants exceeding WHO 2021 guidelines |
| environmentalContamination.pollutants | array | Up to 10 readings: {parameter, value, unit} |
| crimeExposure.score | number | Crime score 0-100 (Violent 40pts + Property 30pts + Volume 20pts + ASB 10pts) |
| crimeExposure.exposureLevel | string | LOW / MODERATE / HIGH / EXTREME |
| crimeExposure.violentCrimes | number | Violent crime incident count |
| crimeExposure.propertyCrimes | number | Property crime incident count |
| crimeExposure.topCategories | array | Up to 8 crime categories with counts |
| climateTrajectory.score | number | Climate trajectory score 0-100 |
| climateTrajectory.trendDirection | string | IMPROVING / STABLE / WORSENING / RAPIDLY_WORSENING |
| climateTrajectory.projectedRisk5yr | number | Projected score at 5-year horizon |
| climateTrajectory.projectedRisk10yr | number | Projected score at 10-year horizon |
| climateTrajectory.projectedRisk25yr | number | Projected score at 25-year horizon |
| propertyData | array | Up to 10 UK Land Registry transactions for local valuation context |

How much does it cost to run insurance underwriting assessments?

This MCP uses pay-per-event pricing — you pay $0.045 per tool call. All 8 tools are priced identically. Platform compute costs are included.

| Scenario | Tool calls | Cost per call | Total cost |
|----------|-----------|---------------|------------|
| Quick test — single location risk | 1 | $0.045 | $0.045 |
| Daily triage — 20 submissions | 20 | $0.045 | $0.90 |
| Weekly batch — 100 risk assessments | 100 | $0.045 | $4.50 |
| Monthly portfolio — 500 assessments | 500 | $0.045 | $22.50 |
| Enterprise — 2,000 renewals/month | 2,000 | $0.045 | $90.00 |

You can set a maximum spending limit per run to control costs. The server stops processing when your budget is reached and returns a structured error for any remaining calls.

Compare this to commercial catastrophe modeling subscriptions (RMS, AIR Worldwide, CoreLogic) which start at $15,000-50,000 per year. For routine triage and pre-screening workflows, most underwriting teams using this MCP spend $20-100 per month with no subscription commitment.

How to connect using the API

Claude Desktop

Add to your claude_desktop_config.json:

{
  "mcpServers": {
    "insurance-underwriting": {
      "url": "https://insurance-underwriting-intelligence-mcp.apify.actor/mcp",
      "headers": {
        "Authorization": "Bearer YOUR_APIFY_TOKEN"
      }
    }
  }
}

Python

import httpx
import json

APIFY_TOKEN = "YOUR_APIFY_TOKEN"
MCP_URL = "https://insurance-underwriting-intelligence-mcp.apify.actor/mcp"

payload = {
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "generate_underwriting_brief",
"arguments": {
"location": "1400 Brickell Avenue, Miami, FL"
}
},
"id": 1
}

response = httpx.post(
MCP_URL,
json=payload,
headers={"Authorization": f"Bearer {APIFY_TOKEN}"}
)

result = response.json()
brief = json.loads(result["result"]["content"][0]["text"])
print(f"Risk Tier: {brief['riskTier']}")
print(f"Composite Score: {brief['compositeRiskScore']}/100")
print(f"Premium Modifier: {brief['premiumModifier']}x")
for note in brief.get("underwritingNotes", []):
print(f" - {note}")

JavaScript

const APIFY_TOKEN = "YOUR_APIFY_TOKEN";
const MCP_URL = "https://insurance-underwriting-intelligence-mcp.apify.actor/mcp";

const response = await fetch(MCP_URL, {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": Bearer ${APIFY_TOKEN}
},
body: JSON.stringify({
jsonrpc: "2.0",
method: "tools/call",
params: {
name: "assess_location_risk",
arguments: {
location: "Houston, TX",
latitude: 29.7604,
longitude: -95.3698
}
},
id: 1
})
});

const result = await response.json();
const peril = JSON.parse(result.result.content[0].text);
console.log(Peril Level: ${peril.compositePeril.perilLevel});
console.log(Score: ${peril.compositePeril.score}/100);
console.log(Dominant Peril: ${peril.compositePeril.dominantPeril});
for (const signal of peril.compositePeril.signals) {
console.log( Signal: ${signal});
}

cURL

```bash

No reviews yet — be the first

Sign in to leave a review

Use Google, GitHub, or an email account so ratings stay tied to real people.

Email sign in

No reviews posted yet.