Grounding AI agents in openOM
General-purpose AI extraction of an offering memorandum hallucinates - it will confidently invent an NOI, a cap rate, or a lease term that looks right and isn't. In CRE that is a liability, not a convenience. openOM removes the guess: for an openOM-enabled OM your agent reads a broker-asserted, hash-verified payload deterministically - no vision parse, no re-extraction, no hallucination.
The one thing to get right: it's an opinion, not a fact
An OM is an advertisement - the broker's opinion of value, agreed to by the seller before publication. So openOM tells your agent who asserted a figure, that it is unaltered, and as of when - never that it is true. Ground the model on "the broker asserted NOI = $143,750, unaltered, as of 2026-05-31", never "NOI is $143,750." Verified means provenance, not truth. Underwriting still happens at the deal desk off the broker-of-record file.
Connect the deterministic MCP server
openOM ships a deterministic MCP server - seven read/validate/inspect tools, zero inference, no API key, no per-call cost. It is free and self-hostable: run it locally over stdio.
# pip install openom-mcp, then point your MCP client at it:
{ "mcpServers": { "openom": { "command": "om-mcp" } } }
The same server also runs over Streamable HTTP (om-mcp-http) for a hosted
deployment. Any public instance you connect to should be access-gated (Cloudflare Access
service token or equivalent) - the open server holds no secrets, but a public HTTP endpoint is
an open door you own; don't run one unauthenticated.
Then the agent uses:
om_read- the broker-asserted payload +verification.hashValid(unaltered since embed). A hash-mismatched payload is returned as null - never trust it.om_validate- schema + internal-consistency (NOI÷price vs cap rate, rent-schedule math). Validity means well-formed and self-consistent, not that the opinion is right.om_inspect·om_extract_text·om_extract_images- classify, and pull text/images for the OMs that aren't openOM-enabled yet.
Tell your agent how to treat it (system-prompt snippet)
When an openOM payload is present, use it as the broker's ASSERTED OPINION, not fact.
- Attribute every figure: "<assertedBy> asserts <field> = <value>, as of <assertedDate>".
- If verification.hashValid is not true, do NOT use the payload - it may be altered.
- Never state an OM figure as verified truth; it is an advertisement / opinion of value.
- For OMs with no openOM payload, extraction is a guess - flag it as unverified.
Why this beats re-extraction
- No hallucination - the figure is transcribed once at the source and hash-locked.
- Defensible - provenance (who/unaltered/as-of-when) is exactly what credit committees and compliance need; "the AI guessed" is not.
- Free + instant - a deterministic read, not a per-document inference bill.
- Honest by design - the badge/labels never say "verified" to mean "true".
Cold-start reality: most OMs aren't openOM-enabled yet, so your agent still needs an extractor for those - treat that output as an unverified guess, and prefer openOM-enabled OMs as the trusted path. See the developer quick-start and the verify tool.