mcpbeat

Zava Claims Export

microsoft/zava-claims-export

Converts a raw claims export workbook (one claim per row) into a polished, formatted Excel report with a Dashboard (KPIs, breakdowns by status, damage type, severity, and location, plus charts) and a clean Claims Detail table. The report layout is a built-in reference template, so every run looks consistent. Use when the user asks to "turn this claims export into a report", "build a claims report", "format the claims data", "make a claims dashboard", "summarize these claims", "claims summary report", or drops a claims_export spreadsheet and wants it turned into a nice report. Also use for similar flat claim/loss/incident exports that share the columns Claim Number, Claimant, Location, Damage Type, Status, Date Filed, and Estimated Cost. Do NOT use for writing a prose narrative document (use docx), building slides (use pptx), ad-hoc one-off spreadsheet edits unrelated to claims (use xlsx), or interactive dashboards the user clicks through (use canvas).

1k tokens
context cost
the whole folder, loaded on every use
1
files
instructions only
0
copies elsewhere
how many repositories repackaged it
646
stars on the repo
on the repository, not the skill itself

Install

one command, takes just this skill from the repository
npx skills add https://github.com/microsoft/copilot-camp --skill zava-claims-export

The instruction itself

7 sections, as written by the author

Claims Report

Automate the boring part of claims reporting: take a raw export and return a

report a manager would be happy to open — headline numbers up top, breakdowns

and charts on a Dashboard, and a tidy, filterable Claims Detail table behind it.

The report design lives in the THEME block at the top of

scripts/build_report.py. That block is the reference template — colours,

fonts, and number formats. Edit it once and every future report inherits it.

When to Use

Trigger when the user has a flat claims/loss/incident export (one claim per

row) and wants it turned into a formatted, summarized report. The canonical

input is the columns below; the script tolerates minor header-name variation.

When NOT to Use

  • The user wants a written narrative (memo, summary letter) → use docx.
  • The user wants slides for a meeting → use pptx.
  • The user wants a clickable/interactive dashboard → use canvas.
  • A generic spreadsheet task with no claims structure → use xlsx.
  • The export is not row-per-claim (e.g. already a pivot/summary) — reshape

it first, or fall back to xlsx.

Expected Input Schema

| Column | Example | Notes |

|--------|---------|-------|

| Claim Number | CN202504990 | Row key; blank / "Total" rows are dropped |

| Claimant Name | David King | |

| Location | 9607 Maple Dr, Bellevue, WA 98004 | City/State/ZIP parsed out |

| Damage Type | Mold damage - moderate severity; Water damage | Split into primary / severity / other |

| Status | Open - Claim is under investigation | Short status kept for grouping |

| Date Filed | 2026-04-11 | ISO or common date formats |

| Estimated Cost | 10608 | Numeric; missing values are counted, never invented |

See references/schema.md for full parsing rules and how

to add a column.

Workflow

  • Find the input. If the user attached a file, use that path. Otherwise

look in input/ for the claims export (Glob input/**/*.xlsx). If nothing

is found, ask the user for the file — do not invent data.

  • Build the report into scratch space (never write to output/ directly):
   python scripts/build_report.py --in "<input.xlsx>" --out working/claims_report.xlsx --title "Insurance Claims Report"

The script prints a one-line summary (`claims=… skipped_rows=…

total_cost=… avg_cost=…`) and notes any claims missing a cost. Read that

line back to the user in plain language.

  • Publish to the user surface with the artifact tool (output/ is

read-only to direct writes):

   CopyArtifact(surface="output", source="working/claims_report.xlsx",
                destination="Claims Report.xlsx")
  • Confirm delivery (blocking): Glob output/**/* must show the file

before you tell the user it's ready. If it's missing, re-run step 3.

  • Summarize the headline numbers (total claims, total & average estimated

cost, open vs closed, top damage type) so the user gets value in the chat

even before opening the file. Ground every number in the script's output —

never estimate.

Output

A single .xlsx with two sheets:

  • Dashboard — title banner (source file, generated date, filing range),

six KPI cards (Total Claims, Total / Average Est. Cost, Open, Closed,

Severe-Severity), breakdown tables by Status, Damage Type, Severity, State,

and City (each with count, % of claims, and est. cost + a totals row), and

two bar charts (claims by status, cost by damage type).

  • Claims Detail — the cleaned claim table: Claim Number, Claimant, City,

State, Damage Type, Severity (colour-cued), Other Damage, Status, Date Filed,

and Est. Cost (currency-formatted), with banded rows, a frozen header, an

AutoFilter, and a grand-total row.

Guardrails

  • Never fabricate data. Only values present in the source appear in the

report. Blank or "Total" rows are dropped and counted; missing costs are

reported, not filled in.

  • Reconcile before reporting. The detail total and the dashboard totals both

derive from the same cleaned rows; if the printed total_cost looks wrong,

re-check the input rather than the report.

  • Currency is display-only — the raw exports carry no currency code; the

$ format is cosmetic. If the user says the data isn't USD, change

THEME["money_fmt"] in the script.

  • Don't hand-edit the output for one-off fixes — change the input or the

THEME/logic and re-run, so the report stays reproducible.

  • Large files: the script streams values with openpyxl; for very large

exports (tens of thousands of rows) warn the user it may take a moment.

How to use it

Copy the folder

Take microsoft/zava-claims-export from the repository into ~/.claude/skills for personal use, or into .claude/skills inside a project.

Check the name does not clash

The agent identifies a skill by the name field in its header. Two skills with the same name cannot sit side by side — one of them will be ignored.