Accept the rent roll as an uploaded CSV or XLSX file; use a spreadsheet parsing library to read all rows, handling merged cells and multi-row headers common in rent roll formats.
Identify the header row automatically by scanning for known column name patterns (unit, tenant, lease start, lease end, monthly rent, market rent, occupancy status).
Map each identified column to a canonical field name in your internal schema, handling common synonyms (e.g., 'Mo. Rent', 'Current Rent', 'Contracted Rent' all map to current_monthly_rent).
Parse and validate each row: parse date strings in multiple formats, convert rent values to numeric by stripping currency symbols and commas, and classify occupancy status to a standard enum (occupied, vacant, notice).
Compute summary statistics: total units, occupied units, vacancy rate, total scheduled rent, total market rent, and weighted average lease term remaining.
Return the normalized rows plus summary as JSON; flag rows with missing required fields for remediation.
Known gotchas
Rent rolls from different property management systems have wildly inconsistent formats; budget for a per-client mapping exercise rather than assuming a single parser will handle all inputs.
Month-to-month tenants often appear with a lease end date in the past or a null lease end date; treat these as a special occupancy class rather than an error.
Security deposit columns are frequently confused with last-month's-rent columns; when both are present, verify the column labels carefully before summing.
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp