FactLot
Cited CRE facts and deterministic calculators for agents: rent, CAM, debt sizing, IRR, parcel IDs.
Install
Add this to your client's MCP configuration (Claude Desktop: claude_desktop_config.json; Cursor: .cursor/mcp.json; VS Code and others use the same "mcpServers" shape).
claude mcp add --transport http factlot 'https://api.factlot.com/mcp'
{
"mcpServers": {
"factlot": {
"type": "http",
"url": "https://api.factlot.com/mcp"
}
}
}
ghcr.io/9mp96ygnbk-alt/factlot:0.1.1claude mcp add factlot -- docker run -i --rm ghcr.io/9mp96ygnbk-alt/factlot:0.1.1 node packages/mcp/dist/bin.js
{
"mcpServers": {
"factlot": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"ghcr.io/9mp96ygnbk-alt/factlot:0.1.1",
"node",
"packages/mcp/dist/bin.js"
]
}
}
}
https://github.com/9mp96ygnbk-alt/factlot/releases/download/v0.1.1/factlot-0.1.1.mcpbDocumentation
From the project's README on GitHub, refreshed weekly. Links open on GitHub.
Contents
FactLot
The open fact layer for commercial real estate AI agents.
Install in one line (v0.1.0; no API key, no network calls; listed in the
official MCP Registry as
io.github.9mp96ygnbk-alt/factlot):
# Any MCP client (stdio). For Claude Code: claude mcp add factlot -- npx -y <this URL>
npx -y https://github.com/9mp96ygnbk-alt/factlot/releases/download/v0.1.0/factlot-mcp-standalone-0.1.0.tgz
Claude Desktop: open factlot-0.1.0.mcpb.
REST, OpenAPI and remote MCP: docker run -p 8787:8787 ghcr.io/9mp96ygnbk-alt/factlot:0.1.0.
Python: pip install "git+https://github.com/9mp96ygnbk-alt/factlot.git@v0.1.0#subdirectory=python".
Hosted registry early access: teams that want cited parcel-to-owner-to-entity lookups without self-hosting can email contact@factlot.com. The hosted service is not yet public, and early-access teams help set pricing. Questions and bug reports go in GitHub Discussions and Issues.
Agents doing CRE work get stuck in the same places. They can't trust their own arithmetic, they can't cite where a number came from, and they can't tell that "Suite 400, 123 Main LLC" in one system is the same thing as a parcel number in another.
FactLot gives every agent three things it can use by default:
| Package | What it does | License |
|---|---|---|
@factlot/calc | Deterministic CRE calculators: rent schedules, net effective rent, proposal comparison, percentage rent, CAM reconciliation, loan sizing, ASC 842 lease remeasurement, prepayment and defeasance, WALT, IRR/NPV, lease vs. own, renew vs. relocate, hotel metrics. Every result includes an audit trail and a versioned formula ID. | Apache-2.0 |
@factlot/id | FactLot ID gives canonical IDs for parcels, legal entities, buildings, spaces, leases, and documents. IDs are deterministic wherever the world already has a key, so any agent can compute them offline. | Apache-2.0 |
@factlot/schema | The FactLot data model. A fact is one atomic claim with provenance (source document, page, clause, method) and rights (whether an AI may use or redistribute it). | MIT |
@factlot/tools | The tool catalog, with native tool definitions for Claude, OpenAI, Gemini, Amazon Bedrock, Mistral, and OpenAPI platforms, plus one runTool dispatcher. | MIT |
@factlot/server | The remote connector: Streamable HTTP MCP at /mcp, REST at /v1, and OpenAPI. Runs in Docker. | Apache-2.0 |
@factlot/mcp | An MCP server that exposes all of the above to Claude and any other MCP-capable agent. It runs locally and needs no API key. | Apache-2.0 |
Why
In a simulated survey of 165 CRE agent personas across 20 roles:
- The highest-rated offerings were document-to-facts (3.52/5), deterministic calculators (3.24), and canonical IDs and entity resolution (3.12).
- 95% asked for citations, 51% reported that LLM math was wrong, and 35% said data licensing stops them using data they already pay for.
- Agent-to-agent negotiation scored 0.35/5. Agents want facts they can trust, not more autonomy.
That survey is a hypothesis generator, not market research. The customer discovery plan describes how we validate it. The same personas later reviewed v0.1 as built (also simulated): the calculators, IDs, and the quote-on-page verifier were praised wherever they applied, and most personas were blocked by coverage, which is what the section below is honest about.
What FactLot covers today
Be clear about scope before adopting it:
- Calculators, IDs, and the fact model work anywhere. They need no data and no API key, and they run offline in both SDKs with identical results.
- The registry covers the largest metros, unevenly. Real public-record rolls are loaded for Harris, Dallas, Tarrant, Travis and Collin (Texas), New York City, Los Angeles, Boston, San Francisco, Denver, Charlotte, Minneapolis and the District of Columbia: 708,538 commercial, industrial and multifamily parcels, with 12.9 million registered entities from Texas, New York, Colorado, Pennsylvania and DC for owner resolution. A second tier of 28 more counties is verified with adapters (Monroe, Suffolk, Nassau, Westchester and Erie NY; three Maryland counties; four Massachusetts counties; Denton, Williamson and Fort Bend; Milwaukee, Marion, Oakland, Wake, Davidson, DeKalb, Sacramento, Salt Lake, Utah County, Pierce, Multnomah, and two Pennsylvania counties) and is loaded in full: 517,495 more commercial parcels, 206,130 with an organisation owner of record. Cook County, Florida, Fulton, Maricopa, Wayne, Fairfax, King and much of California wait on a licence decision, a form or a purchase. Commercial, industrial and multifamily parcels only; several public files omit owner names; no sales prices, tenants, debt, zoning, or building specs beyond area and year built. See the registry, the Tier 1 catalog and the Tier 2 index.
- One rules pack, the Texas property-tax protest deadline, verified against the official statute text. Other jurisdictions follow only after a person verifies them.
- Lease ingestion is a prototype: deterministic quote-on-page and value-in-quote checks, OCR for scanned pages through a pluggable backend, but no published accuracy number yet.
- Not yet on npm or PyPI, and no hosted public endpoint. Install from the v0.1.0 release, from git, from source, or with Docker (getting started).
Connect FactLot to any AI platform
| Platform | How to connect |
|---|---|
| Claude | Add a custom connector with https://<host>/mcp, install the one-click Desktop extension (factlot.mcpb), use Claude Code, or call it from the Claude API |
| ChatGPT and OpenAI | Create a ChatGPT app in developer mode (search/fetch make deep research work), import /openapi.json as a Custom GPT Action, use the Responses API's remote MCP, or use function calling |
| Google Gemini | Use Gemini API function declarations, Gemini CLI over MCP, or Vertex AI |
| Microsoft Copilot | Add an MCP tool in Copilot Studio, use the Power Platform connector, or build a Microsoft 365 API plugin |
| Amazon Bedrock | Use the Converse API toolConfig, or a Bedrock Agents action group backed by the Lambda handler |
| Mistral, xAI, Llama, DeepSeek, and others | Use OpenAI-compatible function calling or MCP clients |
Every surface serves the same tools, generated from one catalog. See connectors/.
Quick start: use FactLot from an agent
FactLot is not on npm or PyPI yet. These work without either: they run the stdio MCP server from a GitHub release, from a clone, or in Docker. Each was run end to end (install verification).
# From the GitHub release: one file, dependencies bundled
claude mcp add factlot -- npx -y https://github.com/9mp96ygnbk-alt/factlot/releases/download/v0.1.0/factlot-mcp-standalone-0.1.0.tgz
# From a clone
git clone https://github.com/9mp96ygnbk-alt/factlot.git && cd factlot
npm install && npm run build
claude mcp add factlot -- node "$PWD/packages/mcp/dist/bin.js"
# Remote connector (Streamable HTTP MCP at /mcp, REST at /v1, OpenAPI)
docker run --rm -p 8787:8787 ghcr.io/9mp96ygnbk-alt/factlot:0.1.0
Claude Desktop users can install factlot-0.1.0.mcpb from the
release. For any other MCP client, use the
same command in its config:
{
"mcpServers": {
"factlot": {
"command": "node",
"args": ["/absolute/path/to/factlot/packages/mcp/dist/bin.js"]
}
}
}
After first publish to npm: claude mcp add factlot -- npx -y @factlot/mcp.
Getting started has every option, including the TypeScript libraries
as release tarballs.
The server provides these tools: calc_rent_schedule, calc_net_effective_rent,
calc_compare_proposals, calc_percentage_rent, calc_cam_reconciliation,
calc_debt_sizing, calc_lease_remeasurement_asc842, calc_prepayment_and_defeasance,
calc_walt, calc_npv, calc_irr, calc_lease_vs_own,
calc_renew_vs_relocate, calc_hotel_metrics,
rules_tx_property_tax_protest_deadline,
id_parcel, id_entity, id_space, id_document, id_parse, fact_validate,
search, fetch, and schema_get, plus the six registry_* lookups when a registry database is configured
(FACTLOT_REGISTRY_DB).
Release files, the GHCR image, and
git+httpsinstalls need the repository to be public and a release (herev0.1.0) to exist; from a clone works now.
Quick start: Python agents
pip install "git+https://github.com/9mp96ygnbk-alt/factlot.git#subdirectory=python"
# after first publish to PyPI: pip install factlot
import factlot
tools = factlot.anthropic_tools() # or factlot.openai_tools(); pass these to your model
# When the model calls a tool, run it by name with the model's arguments:
result = factlot.run_tool("calc_npv", {"cash_flows": [-1000, 600, 600], "rate": 0.08})
result["value"]["npv"] # 69.96
The Python SDK has no dependencies and passes the same conformance vectors as the TypeScript packages. A differential test runs random inputs through both SDKs in CI and fails on any difference, down to the last digit. See python/README.md.
Quick start: use the libraries
import { debtSizing } from "@factlot/calc";
import { parcelId } from "@factlot/id";
const loan = debtSizing({
noi: 1_000_000,
value: 15_000_000,
rate_annual: 0.06,
amortization_years: 30,
max_ltv: 0.65,
min_dscr: 1.25,
min_debt_yield: 0.09,
});
loan.value.max_loan; // 9750000
loan.value.binding_constraint; // "ltv"
loan.steps; // every intermediate value, with formulas
loan.formula; // { id: "calc.debt_sizing", version: 2 }
parcelId({ stateFips: "06", countyFips: "037", apn: "5432-001-012" });
// { kind: "parcel", urn: "fl:parcel:us-06037:5432001012", short: "flp_..." }
Develop
This requires Node.js 22.6 or newer.
npm install
npm run check # lint, format check, typecheck, tests, build
How FactLot is built and funded
FactLot follows the Supabase model:
- Open source. The platform code is Apache-2.0. Client-facing schemas and SDKs are MIT. Everything here can be self-hosted, which matters when leases are confidential.
FactLot Cloud (planned). These are hosted services that cost real money to run:
- the FactLot Registry: ID resolution, ownership graph, crosswalks, change webhooks
- Ingest: documents to cited facts
- Rules packs: property tax, zoning, building-performance law
Pricing is usage-based with a free tier.
See docs/business-model.md and docs/roadmap.md.
Docs
- Agent guide: which tool to call when · llms.txt
- Rules packs · Lease ingestion · Registry
- FactLot ID specification
- Fact model: provenance and rights
- Backlog: everything not finished yet
- Roadmap
- Business model
- Customer discovery plan
- Contributing · Security
"FactLot" and the FactLot logo are trademarks of their owner. The open-source licenses cover the code, not the name.
Frequently asked questions
What is FactLot?
Cited CRE facts and deterministic calculators for agents: rent, CAM, debt sizing, IRR, parcel IDs.
How do I install FactLot?
It runs as a remote server. In Claude Code: claude mcp add --transport http factlot 'https://api.factlot.com/mcp'. For other clients, paste the JSON configuration from this page into their MCP settings.
Does FactLot need an API key?
Its registry entry lists no required key or secret. Some features may still need an account with the service it connects to.
Is FactLot open source?
Yes. Its code is on GitHub under the Apache-2.0 license.
Who maintains FactLot?
It is published by 9mp96ygnbk-alt. AI.tn lists it but does not maintain or endorse it.
From the official MCP Registry. Listing is not an endorsement: review a server's code and permissions before giving it access to your data.