om-parser
Parse CRE Offering Memorandums. Extract NOI, cap rate, occupancy, rent roll, property details, financial projections from OMs. Maps extracted data to structured schemas and flags extraction gaps.
SKILL.mdskills/om-parser/SKILL.md
GitHub/om-parser -- CRE Offering Memorandum Parser
Extract structured financial and property data from Commercial Real Estate Offering Memorandums (OMs). Handles PDF, DOCX, and text formats. Maps extracted data to structured property schemas and flags inconsistencies or missing fields.
Before executing, read
_shared/plugin-context.mdfor Nexus domain vocabulary, MCP tool references, and quality standards.
Prerequisites
Required: An OM document -- uploaded PDF, DOCX, pasted text, or a link to a document in a data room.
Optional MCP Connections (enhance automation):
- Nexus MCP (
nexus.syntari-ai.com/api/mcp) --nexus_get_cre_asset,nexus_list_cre_assetsfor cross-referencing extracted data against existing portfolio - Box MCP --
ai_extract_freeform,get_file_contentfor parsing OMs stored in Box data rooms - BigData.com MCP (via
financial-analysisplugin) -- market data for validation of extracted metrics - Egnyte MCP -- data room document access
Graceful Degradation: If MCP tools are not connected, paste OM text directly into the conversation, upload the PDF/DOCX file, or provide key data points manually. The extraction framework and validation logic work identically with manual input.
When to Use
- Ingesting a new CRE deal from a broker-provided OM document
- Populating a deal pipeline from source marketing materials
- Extracting financial metrics for quick screening before full underwriting
- Building a comparable transaction database from OM packages received over time
- Automating bulk OM ingestion from email attachments or data room uploads
- Validating OM-stated metrics against third-party data sources
OM Section Taxonomy
Standard OMs follow this section structure. Extract from each in sequence:
| Section | Key Fields | Extraction Method |
|---|---|---|
| Executive Summary / Investment Highlights | Deal headline, asking price, summary cap rate, investment thesis | First 2-3 pages, bullet points |
| Property Description | Name, address, type, year built, total SF/units, lot size, stories, parking | Property header block |
| Location / Market Overview | Submarket, MSA, proximity to demand drivers, market vacancy, rent trends | Map section, narrative paragraphs |
| T12 Operating Statement | GPR, vacancy loss, EGI, OpEx line items, NOI, cap rate | Financial tables |
| Pro Forma / Projections | Year 1-5 projections, rent growth rate, expense growth, exit cap rate, IRR | Forward-looking tables |
| Rent Roll | Unit mix, unit count by type, current rent, market rent, lease start/end, tenant names | Rent roll table |
| Comparable Sales | Recent sales, address, date, price, price/SF, cap rate | Comps table |
| Debt / Financing | Existing loan balance, rate, maturity, assumability, suggested LTV | Financing section |
Property Detail Fields (Full Extract List)
Physical
- Property name, street address, city, state, zip, county, MSA
- Property type (Multifamily / Office / Retail / Industrial / Mixed-Use / Hospitality)
- Total square footage (gross, net rentable), total units (multifamily), lot size (acres)
- Year built, year renovated, number of stories, number of buildings, parking spaces
Financial
- Asking price, price per SF, price per unit (multifamily)
- Current NOI, pro forma NOI, T12 NOI
- In-place cap rate, pro forma cap rate, market cap rate
- Gross potential rent, vacancy loss, effective gross income
- Operating expense ratio, management fee %, taxes, insurance, maintenance
- Net operating income, DSCR, debt service amount, debt yield
Income
- Average current rent per SF / per unit
- Average market rent per SF / per unit
- Occupancy rate (physical), occupancy rate (economic)
- Rent-to-market gap (upside potential)
Projections
- Annual rent growth assumption (Years 1-5)
- Exit cap rate assumption, hold period
- Projected levered IRR, equity multiple, cash-on-cash return
Data Shapes
OM Extracted Data
interface OMExtractedData {
// Property
propertyName: string | null
address: string | null
city: string | null
state: string | null
propertyType: 'Multifamily' | 'Office' | 'Retail' | 'Industrial' | 'Mixed-Use' | null
yearBuilt: number | null
totalUnits: number | null
totalSqft: number | null
// Financial
askingPrice: number | null
currentNoi: number | null
capRate: number | null
occupancy: number | null
grossPotentialRent: number | null
vacancyLoss: number | null
operatingExpenseRatio: number | null
// Projections
projectedIrr: number | null
exitCapRate: number | null
holdPeriod: number | null
rentGrowthAssumption: number | null
// Rent Roll
rentRoll: Array<{
unitType: string
unitCount: number
sqftPerUnit: number
currentRent: number
marketRent: number
leaseExpiry: string | null
}>
// Extraction Quality
extractionGaps: string[] // Fields that could not be populated
consistencyFlags: string[] // Internal consistency issues found
sourceDocument: string // Document name or reference
}
Workflow
Step 1: Identify Document Format
Determine the OM format and select the appropriate extraction path:
- PDF with text layer: Extract text content directly (use Box MCP
get_file_contentif in data room) - Scanned PDF (image-only): Route to OCR pipeline before extraction
- DOCX: Extract via document parsing
- Already structured text/JSON: Parse directly
- Pasted text: Work with provided content
Step 2: Locate and Extract Sections
Work through the OM Section Taxonomy sequentially:
- Use regex patterns to identify section headers (case-insensitive)
- For each section, apply the appropriate extraction strategy (table vs narrative vs key-value pairs)
- Financial tables: extract all rows as structured arrays, identify header rows
- Narrative sections: apply NLP extraction for key metrics embedded in prose
Step 3: Parse Financial Tables
Extract T12, Pro Forma, and Rent Roll tables:
- Identify column headers (categories) and row labels (line items)
- Normalize line item names to canonical field names (e.g., "Gross Scheduled Income" ->
grossPotentialRent) - Handle multi-column tables (T12 vs Pro Forma side by side)
- Extract rent roll: one row per unit type, columns for count, SF, current rent, market rent, lease expiry
Step 4: Map to Structured Output
Translate extracted data to the OMExtractedData schema:
- Property fields -> top-level fields
- Financial metrics -> financial fields
- Rent roll ->
rentRollarray - Projections -> projection fields
Step 5: Flag Extraction Gaps and Inconsistencies
Before returning, validate the extracted data:
- List all fields from the full extract list that could not be populated
- Check for internal consistency: does (GPR - Vacancy) approximately equal EGI? Does (EGI - OpEx) approximately equal NOI?
- Flag any metrics that seem out of range for the property type and market (e.g., cap rate < 3% for industrial)
- Note any OCR-quality issues (garbled numbers, broken table formatting)
Step 6: Store or Export Results
- With Nexus MCP: Use
nexus_underwrite_creto feed extracted data into the underwriting pipeline - Without Nexus MCP: Output the structured
OMExtractedDataas formatted JSON or markdown tables for the user to consume directly
Sample Output
OM PARSE COMPLETE -- 123 Main Street Multifamily, Austin TX
PROPERTY DETAILS
Name: 123 Main Street Multifamily
Address: 123 Main Street, Austin, TX 78701
Type: Multifamily
Year Built: 2019
Units: 142
Total SF: 127,800 SF (900 SF avg)
FINANCIAL SUMMARY
Asking Price: $28,500,000 ($200,704/unit)
Current NOI: $1,396,500
Cap Rate: 4.90%
Occupancy: 83.2% (physical) 78.1% (economic)
GPR: $2,421,600
Vacancy Loss: ($411,672) (17.0%)
Op Expenses: ($613,428) (35% of EGI)
RENT ROLL (4 unit types extracted)
Unit Type Count SF Current Rent Market Rent Upside
Studio 22 550 $1,450 $1,650 +$200
1BR/1BA 68 800 $1,850 $2,100 +$250
2BR/2BA 44 1,100 $2,400 $2,700 +$300
3BR/2BA 8 1,400 $3,200 $3,600 +$400
EXTRACTION GAPS (3)
- Existing debt terms not found (no financing section in this OM)
- Comparable sales table missing (referenced but not included)
- Year-5 exit cap rate assumption not stated (assumed 5.00% -- flag for underwriter)
CONSISTENCY CHECK
GPR - Vacancy = $2,009,928 vs stated EGI $2,009,928 [OK]
EGI - OpEx = $1,396,500 vs stated NOI $1,396,500 [OK]
NOI / Price = 4.90% vs stated cap rate 4.90% [OK]
Workflow Chain
Position: Step 1 of 4 in the CRE deal chain
Next: /cre-underwriter -- passes extracted property details, T12 data, and rent roll for full underwriting analysis
Related Skills
/cre-underwriter-- Full CRE underwriting model built from the structured data extracted by this skill/deal-screener-- Screen and score the extracted deal against investment criteria/deal-memo-writer-- Write the CRE investment memo using extracted OM data/financial-modeling-- Financial model support for extracted deal metrics/competitive-analysis-- Market and submarket analysis to validate OM claims
Confidence Calibration
Every OM parse must include a calibrated confidence assessment:
## Confidence Assessment
- **Score**: 0.XX (0.0 = no confidence, 1.0 = full confidence)
- **Calibration**: conservative | neutral | optimistic
- **Confidence Drivers**: [what supports the score -- e.g., "clean text-layer PDF", "all 8 sections present", "financial tables well-formatted"]
- **Data Gaps**: [what's missing that would improve confidence -- e.g., "rent roll missing lease expiry dates", "T12 has no line-item detail"]
Typical confidence ranges:
- 0.85+: Clean PDF with all 8 sections, well-formatted tables, consistent financial data
- 0.65-0.84: Most sections present, some tables require interpretation, minor gaps
- 0.40-0.64: Partial OM (missing key sections), OCR quality issues, significant gaps
- Below 0.40: Heavily redacted, image-only without OCR, or summary-only document -- flag for manual review