FactLot
REMOTE · API.FACTLOT.COM · 3 COMPONENTS
Cited CRE facts and deterministic calculators for agents: rent, CAM, debt sizing, IRR, parcel IDs.
Last scanned (1 hour ago)
Scores higher than 57% of remote servers
Reachable. Last reached 5 Nov 2026.
Category Finance and Payments
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score → Why this is hard to score →
Endpoint Security77
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one. See how to fix → View diagnostics → Partial
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- HSTS check failed: the Strict-Transport-Security header is absent. See how to fix → View diagnostics → Fail
- DNSSEC is configured correctly; the domain's records validate against the full chain to the root. View diagnostics → Pass
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability60
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 13270 tokens (~315/item across 42 items; 42 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management7
- Stability observed for 2 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage100
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 100% of tool parameters carry a description.Pass
Tool Safety100
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- We read all 42 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
- An AI judge read all 43 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities100
- Implements a supported MCP spec version (2025-11-25); the latest is 2026-07-28.Pass
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 5 Nov 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 3 to 7. That category is still filling its 30-day observation window: 1 days of observed history at the previous scan, 2 at this one. The score rises as the window fills, whether or not the server changes.
- 4 Nov 26 0
- The server rewrote its instructions, which are the text every model session reads security
- Tool “fetch” rewrote its description, which is the text the model reads security
- Tool “id_entity” rewrote its description, which is the text the model reads security
- Tool “id_parcel” rewrote its description, which is the text the model reads security
- Tool “search” rewrote its description, which is the text the model reads security
- Tool “calc_cam_reconciliation” rewrote its description, which is the text the model reads security
- Tool “calc_compare_proposals” rewrote its description, which is the text the model reads security
- Tool “calc_debt_sizing” rewrote its description, which is the text the model reads security
- Tool “calc_lease_remeasurement_asc842” rewrote its description, which is the text the model reads security
- Tool “calc_net_effective_rent” rewrote its description, which is the text the model reads security
- Tool “calc_rent_schedule” rewrote its description, which is the text the model reads security
- Tool “calc_walt” rewrote its description, which is the text the model reads security
- Tool “fact_validate” rewrote its description, which is the text the model reads security
- Tool “id_space” rewrote its description, which is the text the model reads security
- Schema quality: 201 → 315 ▼ functional
- Schema quality: 201 → 246 ▼ functional
- Stability: unverified → 0.03 ▲ functional
- Server version: 0.2.0 → 0.3.0 functional
- Server version: 0.1.1 → 0.2.0 functional
- New tool “calc_equity_waterfall” functional
- New tool “calc_exchange_1031” functional
- New tool “calc_multifamily_rent_roll” functional
- New tool “doc_check_use_conflict” functional
- New tool “doc_spread_statement” functional
- New tool “calc_cam_reconciliation_batch” functional
- New tool “lease_comp_validate” functional
- New tool “calc_capex_recovery” functional
- New tool “calc_dcf_pro_forma” functional
- New tool “calc_direct_cap” functional
- New tool “calc_amortization_schedule” functional
- New tool “fact_package_create” functional
- New tool “fact_package_verify” functional
- New tool “doc_abstract_lease” functional
- New tool “doc_compare” functional
- New tool “doc_verify_claim” functional
- New tool “doc_verify_facts” functional
- New tool “id_building” functional
- “calc_rent_schedule” added an optional parameter “unit” cosmetic
- “calc_cam_reconciliation” added an optional parameter “admin_fee” cosmetic
- “calc_cam_reconciliation” added an optional parameter “occupancy” cosmetic
- “calc_compare_proposals” added an optional parameter “area_basis” cosmetic
- “calc_debt_sizing” added an optional parameter “existing_loan_balance” cosmetic
- “calc_debt_sizing” added an optional parameter “stress” cosmetic
- “calc_net_effective_rent” reworded the description of “ti_allowance_psf” cosmetic
- “calc_rent_schedule” reworded the description of “area_sf” cosmetic
- “calc_rent_schedule” reworded the description of “starting_rent_psf_annual” cosmetic
- “fetch” reworded the description of “id” cosmetic
- “id_entity” reworded the description of “registry_number” cosmetic
- “id_parcel” reworded the description of “apn” cosmetic
- “calc_compare_proposals” reworded the description of “discount_rate_annual” cosmetic
- “calc_compare_proposals” reworded the description of “perspective” cosmetic
- “calc_walt” reworded the description of “weight_by” cosmetic
- “id_space” reworded the description of “building_urn” cosmetic
- 3 Nov 26 70
First indexed and scored.
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 5 Nov 2026 · Probed https://api.factlot.com/mcp
TLS valid
Negotiated TLS 1.3 with TLS_AES_128_GCM_SHA256 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=factlot.com | CN=WE1,O=Google Trust Services,C=US | 3 Nov 2026 | 1 Feb 2027 | ECDSA 256 | ECDSA-SHA256 | e3d4f1e260539d300efe0ae66616a08e |
| SANs: factlot.com, api.factlot.com, *.api.factlot.com | ||||||
| CN=WE1,O=Google Trust Services,C=US (CA) | CN=GTS Root R4,O=Google Trust Services LLC,C=US | 13 Dec 2023 | 20 Feb 2029 | ECDSA 256 | ECDSA-SHA384 | 7ff31977972c224a76155d13b6d685e3 |
| CN=GTS Root R4,O=Google Trust Services LLC,C=US (CA) | CN=GlobalSign Root CA,OU=Root CA,O=GlobalSign nv-sa,C=BE | 15 Nov 2023 | 28 Jan 2028 | ECDSA 384 | SHA256-RSA | 7fe530bf331343bedd821610493d8a1b |
Background: What to check on a remote MCP endpoint →
DNSSEC secure
Validation of api.factlot.com. — Secure
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| com. | present | 19718 | 13 | Verified |
| factlot.com. | present | 2371 | 13 | Verified |
| api.factlot.com. | Verified address RRset verified with the apex keys |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| content-security-policy | default-src 'none'; frame-ancestors 'none' |
| x-content-type-options | nosniff |
| x-frame-options | DENY |
| referrer-policy | no-referrer |
Background: How OAuth 2.1 works in the 2026 MCP spec →
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://api.factlot.com/mcp | Verified | 200 | |
| http (plaintext) | http://api.factlot.com/mcp | HTTPS enforced | 301 | https://api.factlot.com/mcp |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
calc_amortization_schedule Loan amortization schedule ~521
Period-by-period schedule of a fixed-rate loan, monthly or quarterly: an optional interest-only period, then level payments on an amortization term that can run past maturity (balloon), with 30/360, actual/360, or actual/365 interest (the payment on a 30/360 basis). Rows are in cents that foot: interest is rounded each period, the final payment repays the whole balance, and the totals are the row sums. Deterministic: use this instead of doing the math yourself; cite formula calc.amortization_schedule@1 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| amortization_months | integer | yes | Amortization period in months that sets the level payment after any interest-only period, e.g. 360 for a 30-year schedule; 0 means interest-only to maturity. Must be at least term_months − interest_o… |
| day_count | string | – | Interest day count: "30/360" (each period is 30 days a month: interest = balance × rate ÷ periods a year), "actual/360" or "actual/365" (balance × rate × actual days in the period ÷ 360 or 365; needs… |
| interest_only_months | integer | – | Months of interest-only payments at the start of the loan; amortization over amortization_months begins after them. At most term_months. |
| payment_frequency | string | – | Payment period: monthly (12 a year) or quarterly (4 a year). Term, amortization, and interest-only months must be whole periods. |
| principal | number | yes | Loan amount funded, USD. |
| rate_annual | number | yes | Fixed nominal annual interest rate as a decimal, e.g. 0.065 for 6.5%. |
| start_date | string | – | Funding date, YYYY-MM-DD. Payment k falls k periods later on the same day of the month (clamped to month end); the first period runs from this date to the first payment date. Required for actual/360… |
| term_months | integer | yes | Months from funding to maturity, when any remaining balance (the balloon) is repaid. |
No output schema declared.
No examples provided.
calc_cam_reconciliation CAM / operating expense reconciliation ~399
Reconcile a tenant's annual CAM charge: exclusions, occupancy gross-up of variable expenses, pro rata share, controllable-expense caps (compounding_from_base, simple_from_base, year_over_year), an admin fee (before or after the cap, inside or outside it, with per-line exclusions), base year or expense stop, partial-year occupancy (move-in/move-out prorates share, cap, and base by days), and estimates paid. Returns balance due and a full trace with order-of-operations warnings. Deterministic: use this instead of doing the math yourself; cite formula calc.cam_reconciliation@2 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| admin_fee | object | – | Administrative fee the lease adds to the tenant's share. Omit if the lease has none. |
| cap | object | – | Cap on the tenant's share of controllable expenses. Omit if the lease has no cap. |
| estimates_paid | number | – | Estimated CAM payments the tenant made during the year, USD (total for the year, not monthly). |
| expenses | array | yes | Building operating expense lines for the year. |
| gross_up | object | – | Gross up variable expenses to the target occupancy when actual occupancy is lower. Omit if the lease has no gross-up. |
| occupancy | object | – | Partial-year occupancy: the tenant's share, cap limit, and base-year or stop deduction are prorated by occupied days ÷ period days (both inclusive), so a full-year cap and base are not applied to a p… |
| pro_rata_share | number | yes | Tenant's pro rata share, 0 < share ≤ 1 (e.g. 12,000 / 150,000 = 0.08). |
| structure | – | – | Expense structure from the lease. Default: net. |
| year | integer | yes | Calendar or lease year being reconciled. |
No output schema declared.
No examples provided.
calc_cam_reconciliation_batch CAM reconciliation for every tenant (batch) ~302
Reconcile CAM for a whole building in one call: the expense pool and gross-up once, then up to 500 tenants each with share, base year or expense stop, cap, admin fee, occupancy, estimates paid, and lease-specific excluded categories. Returns each tenant's statement (identical to calc_cam_reconciliation for that tenant, with its trace and warnings) and a building reconciliation: total billed against the recoverable pool, the unrecovered amount, and why (unleased or vacant share, lease exclusions, gross-up, caps, base years and stops, admin fees, zero floor, rounding). Deterministic: use this instead of doing the math yourself; cite formula calc.cam_reconciliation_batch@1 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| expenses | array | yes | The building's operating expense pool for the year, entered once for every tenant: category, amount, controllable, recoverable, variable, admin_fee_applies. |
| gross_up | object | – | Gross up variable expenses to the target occupancy when actual occupancy is lower. Omit if the lease has no gross-up. |
| tenants | array | yes | Every tenant to reconcile (up to 500): each one's share, structure (base year or stop), cap, admin fee, occupancy, estimates paid, and lease-specific exclusions. Each statement equals calc_cam_reconc… |
| year | integer | yes | Calendar or lease year being reconciled. |
No output schema declared.
No examples provided.
calc_capex_recovery Capital expenditure recovery ~510
Recoverable capital expenditure under a lease clause: amortize a capital cost over its useful life or the lease-specified period, straight-line (declining interest) or level payment, with interest on the unamortized balance or none; optionally cap each year's recovery at demonstrated cost savings (with or without carry-forward); and allocate each year to tenants by pro rata share. Every assumption is echoed with an optional lease clause citation. Deterministic: use this instead of doing the math yourself; cite formula calc.capex_recovery@1 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| amortization_years | integer | yes | Years over which the cost is recovered: the useful life, or the amortization period the lease specifies. |
| clauses | object | – | Lease clause behind each assumption, free text, echoed in the result's assumptions so a reviewer can check each against the lease. |
| cost | number | yes | Capital cost of the improvement to recover, USD (building level). |
| cost_savings_cap | object | – | Cost-savings limit: recovery in each year may not exceed the operating-cost savings the improvement demonstrably produces. Omit if the lease has none. |
| first_year | integer | – | Calendar or lease year of the first recovery year, e.g. 2026; labels the schedule rows. Omit to number years 1, 2, 3. |
| interest_rate_annual | number | – | Annual interest on the unamortized balance as a decimal, e.g. 0.08; 0 (default) for none. Charged on the balance at the start of each year. |
| method | string | – | straight_line: equal principal (cost ÷ years) plus interest on the declining unamortized balance, so recovery falls each year. level_payment: a level annual payment like a mortgage, cost × r ÷ (1 − (… |
| period_basis | string | – | Where amortization_years comes from: useful_life (e.g. under GAAP or tax guidance) or lease_specified (a period the lease states). Labels only. |
| tenants | array | – | Tenants to allocate the annual recoverable amount to by pro rata share. Shares may sum to less than 1 (the landlord bears the rest), not more. Omit for the building-level schedule only. |
No output schema declared.
No examples provided.
calc_compare_proposals Compare lease proposals ~372
Rank 2–20 lease proposals with different terms, sizes, free rent, TI, concessions, and operating-expense structures (gross, NNN, base year, expense stop, with opex growth) on one discounted $/SF/yr basis, per rentable or usable SF (load factor): effective occupancy cost (tenant perspective) or discounted net effective rent after landlord-borne opex and optional pre-commencement downtime (landlord perspective). Cash flows monthly in advance at annual rate ÷ 12; warns when the usable-SF ranking differs and when terms differ. schedule.unit (kw, mw, unit, acre, key, room, space, the same for every proposal) ranks per kW, MW, unit, acre, key, room, or space instead of per SF. Deterministic: use this instead of doing the math yourself; cite formula calc.compare_proposals@2 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| area_basis | string | – | Area the $/SF/yr metric is divided by: rentable (schedule.area_sf, the default) or usable (each proposal's usable_sf, or area_sf ÷ load_factor). Rents and expenses stay quoted per rentable SF; use us… |
| discount_rate_annual | number | – | Annual discount rate as a decimal, e.g. 0.08, applied to every proposal (monthly rate = annual ÷ 12, cash flows at the start of each month). |
| perspective | string | – | Whose economics to rank on: tenant (effective occupancy cost, lower is better) or landlord (discounted net effective rent, higher is better). |
| proposals | array | yes | 2–20 proposals to compare. |
No output schema declared.
No examples provided.
calc_dcf_pro_forma Property DCF from a rent roll ~827
Property-level discounted cash flow from an in-place rent roll: each lease's rent, escalations, remaining term, and expense recovery (NNN, gross, base year), then at expiration one blended lease weighted by the renewal probability (renewal vs new-tenant rent, free rent, TI, leasing commissions, and new-tenant downtime, rounded to whole months); market rent growth, general vacancy and credit loss, operating expenses, management fee, and capital reserves. Returns the annual cash-flow table (NOI and cash flow before debt) for the hold plus one year, the exit value at a cap rate on forward (or trailing) NOI less selling costs, the value (PV at the discount rate, end-of-year or mid-year), and with a purchase price the NPV, unlevered IRR, and equity multiple, with every lease event and convention stated. Deterministic: use this instead of doing the math yourself; cite formula calc.dcf_pro_forma@1 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| capital_reserve_psf_annual | number | – | Year-1 capital reserve, USD/SF/yr over the building area, below NOI. Grows with expense_growth_rate. |
| credit_loss_rate | number | – | Credit loss as a share of gross revenue, on top of general vacancy. |
| discount_rate | number | yes | Annual unlevered discount rate, e.g. 0.08. The present value at this rate is the value. |
| exit_cap_rate | number | yes | Exit (terminal) cap rate applied to the exit NOI, e.g. 0.07. |
| exit_noi_basis | string | – | "forward": the NOI of the year after the hold (the usual convention); "trailing": the NOI of the final hold year. |
| expense_growth_rate | number | – | Annual growth of operating expenses and capital reserves, e.g. 0.03: year y = year 1 × (1 + g)^(y − 1). |
| general_vacancy_rate | number | – | General vacancy allowance as a share of gross revenue (base rent after free rent, plus recoveries), on top of the downtime modelled at rollover. |
| hold_years | integer | yes | Holding period in years. The property is sold at the end of the last year; one more year is projected for the forward NOI. |
| leases | array | yes | Rent roll: one entry per lease or vacant suite (at most 200). The building area is the sum of their areas. |
| management_fee_rate | number | – | Management fee as a share of effective gross revenue, e.g. 0.03; not recovered. |
| market_leasing | object | yes | Market leasing assumptions applied at every lease expiration (and to space vacant at the start). A lease's own `leasing` object overrides any of them. |
| market_rent_growth_rate | number | – | Annual market rent growth, e.g. 0.03. Market rent and TI in analysis year y = today's × (1 + g)^(y − 1). |
| non_recoverable_expenses_annual | number | – | Year-1 operating expenses no tenant reimburses, USD/yr. |
| operating_expenses_psf_annual | number | – | Year-1 recoverable operating expenses, USD/SF/yr over the whole building area. |
| purchase_price | number | – | Price paid at the start, USD. Adds the NPV (value − price), the unlevered IRR and the going-in cap rate on price. |
| selling_cost_rate | number | – | Selling costs as a share of the gross sale price, e.g. 0.02. |
| timing | string | – | "end_of_year": each year's cash flow is discounted (1 + r)^y (Excel NPV). "mid_year": operating cash flows at (1 + r)^(y − 0.5); the sale is always discounted at the end of the hold. |
No output schema declared.
No examples provided.
calc_debt_sizing Loan sizing (LTV / DSCR / debt yield) ~396
Size the maximum loan under any combination of max LTV, min DSCR, and min debt yield for a given NOI, rate, and amortization. Reports the binding constraint, debt service, and resulting metrics; optionally a stress table over NOI, rate, and value shocks (max loan, binding constraint, LTV, DSCR, debt yield per scenario) and the refinance shortfall against an existing loan balance. Deterministic: use this instead of doing the math yourself; cite formula calc.debt_sizing@3 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| amortization_years | integer | yes | Amortization in years; 0 means interest-only. |
| existing_loan_balance | number | – | Balance of the loan being refinanced, USD. Adds a refinance result (shortfall or excess proceeds against the max loan) and a shortfall per stress scenario. |
| max_ltv | number | – | Maximum loan-to-value, e.g. 0.65. |
| min_debt_yield | number | – | Minimum debt yield (NOI ÷ loan), e.g. 0.09. |
| min_dscr | number | – | Minimum debt service coverage ratio, e.g. 1.25. |
| noi | number | yes | Underwritten net operating income, USD/yr. |
| rate_annual | number | yes | Annual interest rate, e.g. 0.065. |
| round_down_to | number | – | Round the final loan amount down to this increment (lenders often use 1,000 or 10,000). |
| stress | object | – | Stress table: every combination of the NOI, rate, and value shocks (up to 1,000 scenarios), each sized under the same constraints and rounding. The base result is unchanged. |
| value | number | – | Appraised or underwritten value, USD. Required when max_ltv is set. |
No output schema declared.
No examples provided.
calc_direct_cap Direct capitalization value and implied cap rate ~465
Value by direct capitalization: (NOI − capital reserve) ÷ cap rate, then below-the-line deductions for lease-up costs, free-rent burn-off, and other adjustments to an as-is value (optionally rounded); and the cap rate a price implies, before and after reserves and all-in after the below-the-line costs. Records the NOI basis (trailing, forward, stabilized). Deterministic: use this instead of doing the math yourself; cite formula calc.direct_cap@1 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| area_sf | number | – | Rentable area in SF, for value per SF. Optional. |
| cap_rate | number | – | Capitalization rate as a decimal, e.g. 0.065 for 6.5%. Gives the value. Provide cap_rate, price, or both. |
| capex_reserve_annual | number | – | Annual capital (replacement) reserve deducted from NOI before capitalizing, USD/yr. 0 if the NOI is already after reserves. |
| free_rent_burn_off | number | – | Free rent still to be given under signed leases (rent the stabilized NOI assumes but the owner will not collect), USD, deducted from the capitalized value. |
| lease_up_costs | number | – | One-time costs to reach the stabilized NOI (TI, leasing commissions, lost rent during lease-up), USD, deducted from the capitalized value. |
| noi | number | yes | Net operating income to capitalize, USD/yr, before capital reserves (they are deducted separately below). |
| noi_basis | string | – | What the NOI is: trailing 12 months (T-12), forward 12 months (year 1 of a pro forma), or stabilized. The cap rate must be on the same basis; this is recorded in the steps, not checked. |
| other_adjustments | array | – | Further below-the-line value adjustments, applied after capitalizing. |
| price | number | – | Purchase or asking price, USD. Gives the implied cap rate. Provide cap_rate, price, or both. |
| round_value_to | number | – | Also report the as-is value rounded to this increment (half away from zero), e.g. 100000 as appraisers round. Optional. |
No output schema declared.
No examples provided.
calc_equity_waterfall LP/GP equity distribution waterfall ~445
Split periodic project equity cash flows between LP and GP: preferred return (compounding or simple) and return of capital pro rata to capital in either order, an optional GP catch-up, IRR-hurdle tiers with promote splits measured on the LP's IRR, and a residual split. Returns per-period LP and GP contributions and distributions (with the GP's promote) that foot to the cent, and LP, GP, and project IRRs and multiples, with the conventions to confirm against the operating agreement. Deterministic: use this instead of doing the math yourself; cite formula calc.equity_waterfall@1 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| cash_flows | array | yes | Project-level equity cash flows at t = 0, 1, 2, … periods: negative = capital contributed by the investors, positive = cash available to distribute. At most 600. |
| catch_up | object | – | GP catch-up after the pref and return of capital. Omit for none. |
| distribution_order | string | – | Which comes first from each distribution: accrued pref, then return of capital (the usual order), or capital first. |
| lp_share | number | yes | Share of every contribution funded by the LP, e.g. 0.9; the GP co-invests the rest (1 for no GP capital). Capital, pref, and the non-promote part of every split are shared in this ratio. |
| periods_per_year | integer | – | Cash-flow periods per year: 1 annual, 4 quarterly, 12 monthly. Sets the pref accrual per period and annualizes the IRRs. |
| pref | object | – | Preferred return on unreturned capital, paid to all investors pro rata to capital. Omit for none. |
| residual_promote | number | – | GP promote share of everything after the last tier, e.g. 0.3 for a 70/30 split. |
| tiers | array | – | IRR-hurdle tiers after the catch-up, in increasing until_irr order: each distributes with its promote until the LP's IRR reaches until_irr. |
No output schema declared.
No examples provided.
calc_exchange_1031 1031 exchange deadlines, identification, and boot ~350
Not tax advice: arithmetic only. The 45-day identification and 180-day exchange deadlines of IRC §1031(a)(3) (the exchange period ends earlier at a given tax-return due date), the three-property, 200%, and 95% identification tests of Treas. Reg. §1.1031(k)-1(c)(4), and the cash boot, mortgage boot, debt replacement, and trade-down of an exchange, with the boot-limited gain when the basis is given. Deterministic: use this instead of doing the math yourself; cite formula calc.exchange_1031@1 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| as_of | string | – | Date to count the days remaining from, YYYY-MM-DD. Optional. |
| cash_received_at_sale | number | – | Cash the taxpayer took from the sale proceeds instead of leaving them with the qualified intermediary, USD. |
| identified_properties | array | – | Replacement properties identified in writing. Empty to skip the identification checks. |
| relinquished | object | yes | The property given up. |
| relinquished_transfer_date | string | yes | Date the relinquished property was transferred (closed), YYYY-MM-DD. With several relinquished properties, the earliest transfer starts both periods. |
| replacement | object | – | The property acquired (in total). Omit to check only the deadlines and identification. |
| tax_return_due_date | string | – | Due date, including extensions, of the taxpayer's federal return for the year of the transfer, YYYY-MM-DD. IRC §1031(a)(3)(B) ends the exchange period on this date if it is earlier than day 180. Fact… |
No output schema declared.
No examples provided.
calc_hotel_metrics Hotel operating metrics (USALI) ~532
Occupancy, ADR, RevPAR, TRevPAR, and a USALI-style profit ladder for a period: departmental profit, GOP and margin, GOPPAR, management fees, EBITDA, FF&E reserve, and NOI (EBITDA less replacement reserve). Deterministic: use this instead of doing the math yourself; cite formula calc.hotel_metrics@1 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| departmental_expenses | number | – | Total departmental expenses, USD: rooms, F&B, and other operated departments (USALI Total Departmental Expenses). |
| fb_revenue | number | – | Food and beverage revenue, USD (USALI Food and Beverage department revenue). |
| ffe_reserve_rate | number | – | FF&E replacement reserve as a share of total operating revenue, e.g. 0.04 (USALI Replacement Reserve, below EBITDA). |
| management_fee_fixed | number | – | Fixed or incentive management fee for the period, USD, added to the percentage fee (USALI Management Fees). |
| management_fee_rate | number | – | Base management fee as a share of total operating revenue, e.g. 0.03 (USALI Management Fees). |
| nights | integer | yes | Nights in the period, e.g. 365 for a year or 30 for a month. |
| non_operating_expenses | number | – | Property taxes, insurance, ground rent, and other non-operating expenses, USD (USALI Non-Operating Income and Expenses). |
| other_revenue | number | – | Other operated departments plus miscellaneous income, USD (USALI Other Operated Departments and Miscellaneous Income). |
| room_revenue | number | yes | Rooms revenue for the period, USD (USALI Rooms department revenue, net of taxes and allowances). |
| rooms | integer | yes | Rooms in inventory (keys). |
| rooms_out_of_order | integer | – | Room-nights (rooms × nights, not rooms) taken off the market in the period, e.g. 20 rooms closed for a 30-night renovation = 600. Subtracted from rooms × nights to give rooms available. USALI (11th e… |
| rooms_sold | integer | yes | Room-nights occupied by paying guests in the period (USALI: rooms sold, excluding complimentary rooms). |
| undistributed_expenses | number | – | Total undistributed operating expenses, USD: administrative and general, information and telecommunications, sales and marketing, property operation and maintenance, utilities (USALI Total Undistribu… |
No output schema declared.
No examples provided.
calc_irr Internal rate of return ~220
Periodic and annualized IRR of periodic cash flows, as decimals (0.085 = 8.5%), solved deterministically by scanning a 1-point grid of per-period rates and bisecting each sign change; reports every root it finds when cash flows have multiple IRRs (two roots within one grid step can be missed). Errors when the flows do not change sign or no root lies between -99.99% and 1000% per period. Deterministic: use this instead of doing the math yourself; cite formula calc.irr@2 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| cash_flows | array | yes | Periodic cash flows at t = 0, 1, 2, …; negative for outflows (e.g. purchase price at t = 0). At most 1200. |
| periods_per_year | integer | – | Cash-flow periods per year, used only to annualize the result: 1 for annual flows, 4 for quarterly, 12 for monthly. |
No output schema declared.
No examples provided.
calc_lease_remeasurement_asc842 Lease remeasurement (ASC 842, lessee) ~642
Remeasure a lessee's lease liability and right-of-use asset under ASC 842 after a modification, lease-term reassessment, contingency resolution, or residual value guarantee change: new liability (PV of remaining payments), liability and ROU adjustments with any gain (ASC 842-20-35-4), and the per-period amortization table (operating: straight-line single lease cost; finance: interest plus amortization) in cents that foots: every row rolls forward exactly, totals are the row sums, and the final period trues up liability and ROU asset to zero. Warns where judgment is needed. Deterministic: use this instead of doing the math yourself; cite formula calc.lease_remeasurement_asc842@2 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| classification | string | yes | Lessee classification (ASC 842-10-25-2): operating (single straight-line lease cost) or finance (interest on the liability plus straight-line ROU amortization). |
| discount_rate_annual | number | yes | Annual discount rate applied to the remaining payments, e.g. 0.06. Nominal: the periodic rate is this ÷ periods_per_year. |
| discount_rate_updated | boolean | yes | True when discount_rate_annual was determined at the remeasurement date (ASC 842-10-35-5: required for modifications and lease-term or purchase-option reassessments); false when it is the rate from c… |
| event | string | yes | What triggered the remeasurement: modification_extend_term / modification_shorten_term / modification_change_in_payments (a modification not accounted for as a separate contract, ASC 842-10-25-8 and… |
| liability_before | number | yes | Carrying amount of the lease liability immediately before the remeasurement, USD. |
| payment_timing | string | – | Whether each payment falls at the beginning (in advance) or end (in arrears) of its period. |
| payments | array | yes | Remaining lease payments after the event, in ascending period order. Periods not listed carry no payment (rent-free). |
| periods_per_year | integer | – | Payment periods per year (12 for monthly, 4 for quarterly). |
| remaining_periods | integer | – | Remaining lease term in periods after the event. Defaults to the last period index in payments; set it higher when the final periods are rent-free. |
| rou_asset_before | number | yes | Carrying amount of the right-of-use asset immediately before the remeasurement, USD (after any impairment). |
No output schema declared.
No examples provided.
calc_lease_vs_own Lease vs. own ~217
Compare leasing with buying over a fixed horizon: NPV of each case's annual cash costs (rent, free rent, tenant expenses, and move-in costs versus equity, debt service, owner expenses, reserves, and a sale at the horizon by stated value or exit cap rate), optionally after tax, with the year-by-year tables and the break-even residual value at which owning equals leasing. Deterministic: use this instead of doing the math yourself; cite formula calc.lease_vs_own@2 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| discount_rate_annual | number | yes | Annual discount rate as a decimal, e.g. 0.08, applied to both cases' year-end cash flows (year 0 = closing / move-in). |
| horizon_years | integer | yes | Analysis horizon in years. Both cases are compared over this period; the own case sells at the end of it. |
| lease | object | yes | The lease alternative. |
| own | object | yes | The purchase alternative. |
No output schema declared.
No examples provided.
calc_multifamily_rent_roll Multifamily rent roll ~317
Analyze an apartment rent roll (up to 5,000 units with status occupied, notice, vacant, model, or down; market and lease rent per month; lease dates; concessions as weeks free, months free, or dollars): gross potential rent, vacancy, non-revenue units, loss to lease, concessions amortised straight-line over each lease term, effective rent income, physical and economic occupancy, effective rent per unit and per SF, a lease expiration schedule by month, and a per-unit-type summary. Single-lease mode (lease instead of units) returns the effective monthly rent after a weeks-free or months-free concession. Deterministic: use this instead of doing the math yourself; cite formula calc.multifamily_rent_roll@1 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| as_of | string | – | Rent roll date, YYYY-MM-DD. Required with units: leases that ended before it are month-to-month, and expirations are scheduled from it. |
| include_units | boolean | – | Rent roll mode: include a per-unit table with loss to lease, amortised concession, and effective rent (can be long). |
| lease | object | – | Single-lease mode: the effective monthly rent of one lease after a weeks-free, months-free, or dollar concession. Give units or lease, not both. |
| units | array | – | Rent roll mode: every unit in the property, one row each (up to 5,000). Give units or lease, not both. |
No output schema declared.
No examples provided.
calc_net_effective_rent Net effective rent (NER) ~293
Compute effective rent, straight-line net effective rent, and discounted net effective rent ($/SF/yr) after free rent, TI allowance, leasing commissions, and other landlord concessions. Rent is monthly in advance from the commencement day (no calendar proration), discounted at annual rate ÷ 12. schedule.unit (kw, mw, unit, acre, key, room, space) reports $/kW/yr, $/acre/yr and so on instead of $/SF/yr. Deterministic: use this instead of doing the math yourself; cite formula calc.net_effective_rent@1 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| discount_rate_annual | number | – | Annual discount rate as a decimal, e.g. 0.08 (monthly rate = annual ÷ 12); 0 gives the undiscounted (straight-line) NER. |
| leasing_commissions | number | – | Total leasing commissions paid by landlord, USD. |
| other_concessions | number | – | Any other landlord concessions paid at commencement (moving allowance, buyout), USD. |
| schedule | object | yes | The lease's base-rent terms (same input as calc_rent_schedule). |
| ti_allowance_psf | number | – | Landlord-funded tenant improvement allowance, USD per SF (per schedule.unit when set), paid once at commencement (not per year). |
No output schema declared.
No examples provided.
calc_npv Net present value ~184
NPV of periodic cash flows (t = 0, 1, 2, ...; the t = 0 flow is not discounted) at a per-period discount rate given as a decimal. Deterministic: use this instead of doing the math yourself; cite formula calc.npv@1 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| cash_flows | array | yes | Periodic cash flows at t = 0, 1, 2, …; negative for outflows (e.g. purchase price at t = 0). At most 10000. |
| rate | number | yes | Discount rate per period as a decimal, e.g. 0.08 for 8%. Match the cash-flow period: for monthly flows pass the monthly rate (e.g. 0.06 ÷ 12 = 0.005). |
No output schema declared.
No examples provided.
calc_percentage_rent Retail percentage rent ~251
Percentage (overage) rent for a lease year: net sales after exclusions over a natural or fixed breakpoint, prorated for partial years, less amounts already paid. Deterministic: use this instead of doing the math yourself; cite formula calc.percentage_rent@1 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| base_rent_annual | number | yes | Annual base rent, USD per year (a full lease year, even for a partial period); used for the natural breakpoint. |
| breakpoint | – | – | Breakpoint above which percentage rent applies. Default: natural. |
| gross_sales | number | yes | Gross sales reported for the lease year (or partial year), USD. |
| percentage_rent_paid | number | – | Percentage rent already paid during the period, USD. |
| period_fraction | number | – | Fraction of a full lease year covered (e.g. 0.5 for a six-month partial year). Prorates the breakpoint. |
| rate | number | yes | Percentage rent rate, e.g. 0.06 for 6%. |
| sales_exclusions | number | – | Sales excluded by the lease (returns, sales tax, gift cards, employee sales, …), USD. |
No output schema declared.
No examples provided.
calc_prepayment_and_defeasance Loan prepayment premium and defeasance ~282
Prepayment premium, total payoff, and cost as a share of balance for a fixed-rate amortizing or interest-only loan under yield maintenance (PV of remaining payments or rate differential, with a minimum and an explicit discounting convention), a step-down schedule, a flat percentage, or defeasance (cost of the securities portfolio that funds the remaining payments plus stated costs). Deterministic: use this instead of doing the math yourself; cite formula calc.prepayment_and_defeasance@1 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| accrued_interest | number | – | Accrued but unpaid interest to the payoff date, USD; added to the total payoff. |
| amortization_months | integer | yes | Remaining amortization basis in months at the payoff date (e.g. 300 for a 30-year schedule with 5 years elapsed); 0 for interest-only. Must be at least remaining_term_months. |
| balance | number | yes | Outstanding principal balance at the payoff date, USD. |
| note_rate_annual | number | yes | Fixed annual note rate, e.g. 0.055. |
| prepayment | – | yes | Prepayment provision from the note. |
| remaining_term_months | integer | yes | Months from the payoff date to the loan's maturity date (the balloon is due with the final payment). |
No output schema declared.
No examples provided.
calc_renew_vs_relocate Renew vs. relocate ~250
Compare renewing in place with moving over one horizon: NPV and discounted effective rent of each case (rent schedule with free rent, TI net of allowance, fees, moving, downtime, double rent, termination, and disruption costs), the starting rent at which they break even, and year-by-year cash flows. Deterministic: use this instead of doing the math yourself; cite formula calc.renew_vs_relocate@2 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| current_rent_monthly | number | – | Total monthly rent under the existing lease, USD per month for the whole premises (not $/SF). Prices the double-rent overlap in the relocate case. |
| discount_rate_annual | number | – | Annual discount rate as a decimal, e.g. 0.08, applied to both cases (monthly rate = annual ÷ 12). |
| horizon_months | integer | yes | Analysis horizon in months; both cases run for this term (e.g. 120 for a ten-year renewal versus a ten-year new lease). |
| relocate | object | yes | Move to new premises. |
| renew | object | yes | Stay and renew the existing lease. |
No output schema declared.
No examples provided.
calc_rent_schedule Lease rent schedule ~548
Build a base-rent schedule from commencement date, term, area, starting $/SF/yr, escalations (percent or fixed $/SF), and abated months. Lease months run from the commencement day-of-month with no calendar proration (warns when commencement is mid-month). Returns rent steps, totals, expiration date, and a calculation trace. Optional unit (kw, mw, unit, acre, key, room, space) relabels area and $/SF for data-center, ground, yard, residential, hotel, or parking leases without changing any number. Deterministic: use this instead of doing the math yourself; cite formula calc.rent_schedule@1 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| abated_months | array | – | Fully abated (free) months, 1-based from commencement (e.g. [1,2,3] for three months free up front). Each listed month's base rent is zero. |
| area_sf | number | yes | Rentable square feet, or the quantity leased in unit (kW, MW, units, acres, keys, rooms, spaces) when unit is set. |
| commencement_date | string | yes | Rent commencement date, YYYY-MM-DD. Month n starts on this day-of-month (clamped to month end). |
| escalation | – | – | How base rent escalates. Omit for flat rent. |
| include_monthly | boolean | – | Include a month-by-month table (can be long). |
| round_rate_to_cents | boolean | – | Round each step's $/SF/yr to cents, as many lease rent tables do. |
| starting_rent_psf_annual | number | yes | Year-one base rent in dollars per SF per year (annual, not monthly), e.g. 42.5; per unit per year when unit is set (a $/kW/month quote × 12). |
| term_months | integer | yes | Lease term in months, e.g. 120 for ten years. |
| unit | string | – | What area_sf and the per-SF fields measure: sf (default, square feet), kw or mw (data-center critical load), unit (apartment or other unit), acre (ground or yard lease), key or room (hotel), or space… |
No output schema declared.
No examples provided.
calc_walt Weighted average lease term (WALT) ~157
Weighted average remaining lease term in years as of a date (actual days ÷ 365.25), weighted by each lease's area_sf (weight_by "area") or annual_rent (weight_by "rent"). Deterministic: use this instead of doing the math yourself; cite formula calc.walt@1 and the returned steps, and surface any warnings.
| Name | Type | Req | Description |
|---|---|---|---|
| as_of | string | yes | Date to measure remaining term from, YYYY-MM-DD. |
| leases | array | yes | Leases in the portfolio or building. |
| weight_by | string | – | How each lease is weighted: "area" uses its area_sf, "rent" its annual_rent (that field is then required on every lease). Default "area". |
No output schema declared.
No examples provided.
doc_abstract_lease Lease abstract with amendments ~326
Current-state lease abstract from a lease and its amendments, with amendment precedence. Give each document's pages with the candidates you extracted (checked exactly as doc_verify_facts checks them), or the facts doc_verify_facts already returned for it (without pages only the value against its quote is rechecked, marked quote_on_page: false). The original applies first, then amendments by effective_date (in the order given if any is undated); a later document's value for a predicate controls, and the earlier one moves to history and is linked through supersedes. Each field gives its value, the controlling document, page, quote and fact, the superseded history, conflicts (one document stating two different values) and open_items (a candidate for that predicate in the controlling or a later document that needs review or was rejected, so the value may not be final). FactLot only orders what you extracted: it does not find terms you missed, and an amendment that changes a term without restating it ("extended by 24 months") needs the resulting value extracted with that sentence as its quote, which the quote check will hold for review if the date is not written there.
| Name | Type | Req | Description |
|---|---|---|---|
| as_of | string | yes | Date the facts are stated as of (YYYY-MM-DD), usually today. |
| documents | array | yes | The lease and its amendments. Each needs pages with candidates or facts, or facts alone. |
| subject | string | – | FactLot URN the facts are about, e.g. your lease's fl:lease:… ID. Default: the document ID. |
No output schema declared.
No examples provided.
doc_check_use_conflict Check a proposed use against exclusives ~274
Check a proposed use (a description, plus an optional use category or 2022 NAICS code) against a center's verified lease.exclusive_use and lease.prohibited_uses facts (from doc_verify_facts or doc_abstract_lease; each must pass fact_validate). Deterministic and textual: a restriction is a potential conflict when it shares a use category with the proposed use (FactLot's published use-category vocabulary, matched on keywords, the category given and NAICS codes) or shares words with it (two or more, or every significant word of the restriction). Each hit is labelled "potential conflict — needs human review" and returns the controlling quote and citation, the categories and words that matched, and the exclusive's carve-outs, flagging those that mention the proposed use. FactLot does not interpret the lease, decide whether a carve-out applies, or give legal conclusions; an empty result does not mean there is no conflict. Superseded facts are ignored.
| Name | Type | Req | Description |
|---|---|---|---|
| facts | array | yes | Verified lease.exclusive_use and lease.prohibited_uses facts for the center, from doc_verify_facts or doc_abstract_lease (each must pass fact_validate). Facts another fact supersedes are ignored; oth… |
| proposed_use | object | yes | The use to check. |
No output schema declared.
No examples provided.
doc_compare Compare asserted values with a lease ~215
Compare values another document asserts (an estoppel, rent roll or offering memo, mapped by you to predicates) with verified lease facts from doc_abstract_lease or doc_verify_facts. Each asserted value comes back match, mismatch (with the differing fields), not_in_lease, or ambiguous_in_lease (two current lease facts disagree), with the controlling lease citation (document, page, quote). Values compare exactly as JSON: numbers by value, strings exactly (a name written differently is a mismatch), and for an object only the fields you assert. Facts another fact supersedes are ignored. The lease facts must pass fact_validate; FactLot does not re-read the lease, so pass the facts its document tools returned.
| Name | Type | Req | Description |
|---|---|---|---|
| asserted | array | yes | Values another document states (an estoppel, a rent roll, an OM), mapped to predicates. |
| lease_facts | array | yes | Verified lease facts: the facts from doc_abstract_lease (or doc_verify_facts). Facts another fact supersedes are ignored. |
No output schema declared.
No examples provided.
doc_spread_statement Spread an operating statement ~527
Spread a T-12, operating statement, budget or rent roll summary YOU read, onto FactLot's published chart of accounts (multifamily, commercial, or hotel after the USALI summary), deterministically; FactLot runs no model. Send the pages as text and one line per item: {label, amount, quote, page}, optionally your category, a period column, and for a subtotal the indexes of the lines it sums; give the statement's own totals (effective_gross_income, total_operating_expenses, net_operating_income, ebitda, ...) as lines with that total as category. Each line is checked: the quote is on the page, the amount (as a number, any common written form; (1,200) and -1,200 read as negative) and the label are written in it; a line that fails is excluded with the reason. The label is mapped to the chart by keywords: your category is used when it is in the chart, and an exception flags it for review when the dictionary maps the label elsewhere; an ambiguous or unknown label without a category is excluded. Vacancy, concessions, credit loss and other contra lines are always subtracted. Returns per period the sections, the computed totals (EGI, operating expenses, NOI, capital items, net cash flow; for hotels departmental profit, GOP, EBITDA and NOI after the replacement reserve), whether each total and subtotal the statement states foots (within 0.5 per line added, or your tolerance), every line with its citation (document, page, quote, span) and status, statistics (units, occupancy, ADR), and exceptions to review. Not checked: whether the agent missed lines, and meaning beyond the written amount and label.
| Name | Type | Req | Description |
|---|---|---|---|
| document | object | yes | The statement's pages. |
| lines | array | yes | The statement's lines as you read them: every income, expense and capital line, the statement's own subtotals (with sums) and totals (with a total category), and statistics such as units or occupancy. |
| period | string | – | Default period label for lines that give none. |
| property_type | string | yes | Which chart of accounts to use: multifamily, commercial (office, retail, industrial), or hotel (USALI summary). |
| statement_type | string | – | What the document is; echoed back. |
| tolerance | number | – | Largest difference, in the statement's units, at which a subtotal or total still foots. Default: 0.5 for each line added (rounding). |
No output schema declared.
No examples provided.
doc_verify_claim Verify a claim against a document ~244
Check one claim against a document page: {predicate, value} (anything doc_verify_facts accepts) or a short claim sentence, plus the verbatim quote and page it rests on. Returns supported (the quote is on the page and every checked number, date and name in the claim is written in it), contradicted (the quote is on the page and states other numbers or dates of the same kind, listed in quote_states), or unverifiable (the quote is not on the page, nothing in the claim can be checked, or the quote states no value of that kind), with the evidence (document_id, page, quote, span) and each part checked. Textual, not semantic: for a sentence only its numbers and dates are compared, never its meaning, and a quote that mentions the right number for a different term still supports it.
| Name | Type | Req | Description |
|---|---|---|---|
| claim | object | yes | Either {predicate, value} or {text}. |
| document | object | yes | The document the quote is from. |
| page | integer | yes | 1-based page the quote is on. |
| quote | string | yes | Verbatim text from the page that the claim rests on. |
No output schema declared.
No examples provided.
doc_verify_facts Verify extracted document facts ~466
Check values YOU extracted from a document against its text, deterministically; FactLot runs no model. Send the pages as text and one candidate per value: {predicate, value, quote, page}. Each candidate is checked in order: (1) the value's shape (Ingest predicates such as lease.expiration_date YYYY-MM-DD, lease.pro_rata_share in (0, 1], ordered lease.base_rent_schedule steps; any other dotted predicate needs a non-empty value); (2) the quote, at least 12 characters, is on the cited page, where only whitespace, line breaks, letter case and typographic quotes and dashes may differ (a word hyphenated across a line must keep its hyphen; a quote found on exactly one other page is accepted with the page corrected); (3) every number, date and party name in the value is written in the quote, in any common form: 1250000 matches "$1,250,000.00", 0.03 matches "3%" or "three percent", 2031-06-30 matches "June 30, 2031" or "6/30/2031"; (4) a confidence you give below 0.8 holds it for review. Returns verified (FactLot facts: method extracted, citing document_id, page, quote and character span, plus which value parts were and were not checked), needs_review (the quote is on the page but does not state the value, or low confidence) and rejected (wrong shape; quote missing, too short, or on several pages), each with a reason to act on. Not checked: enums and free-text summaries, meaning (a quote stating the number in another context passes), and whether the pages came from the file whose sha256 you give.
| Name | Type | Req | Description |
|---|---|---|---|
| as_of | string | yes | Date the facts are stated as of (YYYY-MM-DD), usually today. |
| candidates | array | yes | Values you extracted, each with its quote and page. |
| document | object | yes | The document the candidates were read from. |
| subject | string | – | FactLot URN the facts are about, e.g. your lease's fl:lease:… ID. Default: the document ID. |
No output schema declared.
No examples provided.
fact_package_create Create a fact package ~296
Bundle FactLot facts (each must pass fact_validate) into a fact package a counterparty can verify: canonical JSON (RFC 8785) of every fact, an RFC 6962 Merkle tree over the facts, the source documents the facts cite with their sha256 where known, and a digest over all of it. Returns the unsigned package, its digest, and signing_message, the exact text to sign. FactLot never holds private keys: to sign, the holder signs signing_message with their own Ed25519 key on their own machine (factlot.sign_fact_package in Python, signFactPackage in @factlot/tools, or fact_package_sign in the local MCP server). Deterministic: no clock time is added (pass created_at), and the same facts always give the same digest.
| Name | Type | Req | Description |
|---|---|---|---|
| created_at | string | – | When the package was made (ISO 8601 with offset). FactLot adds no clock time, so the same input always gives the same package. |
| created_by | string | – | The organization making the package. |
| documents | array | – | Source documents to describe beyond what the facts cite (a title, the file's sha256). Every document a fact cites is listed automatically. |
| facts | array | yes | The facts to package, in order: verified facts from the doc_* tools or any facts that pass fact_validate. |
| title | string | – | A title for the package. |
No output schema declared.
No examples provided.
fact_package_verify Verify a fact package ~260
Verify a fact package from fact_package_create: recompute every fact's hash, the Merkle root and the digest from the content (any changed fact, title, date or document list shows as a mismatch); check each fact against fact_validate; check the Ed25519 signature, against the public_key you pass (base64url, the signer's key you trust) or, without one, only against the key inside the package (which proves nothing about who signed); and, given the source documents' pages, check every quote is on its cited page. Returns valid plus each check's details. Not checked: that the pages you pass are the original files (pass sha256 to tie them to the file hash), or what the facts mean.
| Name | Type | Req | Description |
|---|---|---|---|
| documents | array | – | Optional: the source documents' pages (with sha256 when the facts cite the file's hash). Each fact's quote is then checked on its cited page. |
| package | object | yes | A fact package from fact_package_create, signed or not. |
| public_key | string | – | The signer's Ed25519 public key you trust: 32 bytes as base64url (a JWK's x). With it the signature must verify for the package to be valid. |
No output schema declared.
No examples provided.
fact_validate Validate a FactLot fact ~259
Check one FactLot fact against the published fact schema (spec/schemas/fact.json): subject URN, dotted predicate, as_of date, provenance, optional rights; unknown fields are rejected at every level. Rules: every fact except a computed one cites at least one source (an inferred fact cites the evidence it was inferred from); a computed fact names its formula or cites a source; valid_from is not after valid_to; a source span does not end before it starts. For Ingest predicates (lease.expiration_date, lease.rentable_area_sf, lease.base_rent_schedule, ...) the value must have the predicate's shape and every source quote must state the value, by the same written-form rules as doc_verify_facts (a quote saying "2,500 square feet" does not support 1000). Not checked: that the quote is in the document, that the document or sha256 exists, that supersedes IDs exist, and quotes for other predicates; doc_verify_facts with the document's pages checks the quote. Returns { valid, issues }. Call before storing or sharing facts.
| Name | Type | Req | Description |
|---|---|---|---|
| fact | object | yes | A FactLot fact: subject, predicate, value, as_of, provenance (with sources), optional rights. |
No output schema declared.
No examples provided.
fetch Fetch a FactLot knowledge document ~122
Fetch the full text of a FactLot knowledge document by the id returned from search. With a registry loaded, a registry fact's source document_id (fl:document:sha256-…) returns that source snapshot: publisher, dataset, URL, retrieval date, as-of date, licence, AI-use and redistribution rights, file name and size.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Document id from search, e.g. tool:calc_cam_reconciliation, or a registry source snapshot's FactLot document ID (fl:document:sha256-…) when a registry is loaded. |
No output schema declared.
No examples provided.
id_building FactLot building ID ~195
Deterministic FactLot ID for a building from its street address: county FIPS, ZIP code, and street line. Every condominium unit, suite, and floor at the address gets the same building ID, offline. Pass it to id_space for a suite, or to registry_get to see the building's parcels.
| Name | Type | Req | Description |
|---|---|---|---|
| county_fips | string | yes | 3-digit county FIPS code, e.g. "001". |
| state_fips | string | yes | 2-digit state FIPS code, e.g. "11" for the District of Columbia. |
| street | string | yes | Street line: house number and street, e.g. "208 Massachusetts Ave NE". A suite, unit or floor is ignored, and so is anything after a comma (city, state). |
| zip | string | yes | 5-digit ZIP code of the address, e.g. "20002" (ZIP+4 accepted). |
No output schema declared.
No examples provided.
id_document FactLot document ID ~81
Content-addressed FactLot ID (SHA-256) for a document such as a lease, amendment, or estoppel.
| Name | Type | Req | Description |
|---|---|---|---|
| content_base64 | string | – | Base64 of the exact file bytes (preferred: every party gets the same ID). |
| text | string | – | Document text, UTF-8 encoded before hashing. Use only when bytes are unavailable. |
No output schema declared.
No examples provided.
id_entity FactLot legal-entity ID ~119
Deterministic FactLot ID for a legal entity (LLC, LP, corporation, trust) from its registry jurisdiction and file number, or from its LEI (an LEI whose ISO 17442 check digits do not match is rejected).
| Name | Type | Req | Description |
|---|---|---|---|
| jurisdiction | string | yes | Registry jurisdiction, e.g. "us-de" for Delaware, or "lei" for a Legal Entity Identifier. |
| registry_number | string | yes | File number issued by that registry, or the 20-character LEI (its ISO 17442 check digits are verified). |
No output schema declared.
No examples provided.
id_parcel FactLot parcel ID ~231
Deterministic FactLot ID for a parcel from state FIPS, county FIPS, and the assessor's parcel number (APN). The same parcel always yields the same ID, offline. Use it as the join key across systems. APNs that differ only in where a separator falls ("12-34", "1-234") get different IDs; in a county with a documented fixed-width format the variants of one APN converge (NYC BBL "3-1234-56" = "3012340056").
| Name | Type | Req | Description |
|---|---|---|---|
| apn | string | yes | Assessor's parcel number exactly as the county prints it. Letter case and the separator characters are normalized; where a separator falls is kept, except in counties with a documented fixed-width fo… |
| county_fips | string | yes | 3-digit county FIPS code, e.g. "037" for Los Angeles County. |
| state_fips | string | yes | 2-digit state FIPS code, e.g. "06" for California. |
No output schema declared.
No examples provided.
id_parse Parse a FactLot ID ~56
Validate a FactLot URN and return its kind, components, and short ID.
| Name | Type | Req | Description |
|---|---|---|---|
| urn | string | yes | A FactLot URN to validate, e.g. fl:parcel:us-06037:5432001012. |
No output schema declared.
No examples provided.
id_space FactLot space (suite) ID ~155
FactLot ID for a suite or unit within a building, given the building's FactLot URN (from id_building). Suite designators are normalized: "Suite 100", "Ste 100" and "#100" agree, while "1-20" and "120" stay distinct.
| Name | Type | Req | Description |
|---|---|---|---|
| building_urn | string | yes | FactLot building URN from id_building, e.g. fl:building:us-11001:20002:208-massachusetts-ave-ne (a minted fl:building:<26-character token> also works). |
| suite | string | yes | Suite or unit as written ("Suite 400", "STE 400", "#400", "3rd Floor" all normalize). |
No output schema declared.
No examples provided.
lease_comp_validate Validate a lease comp and derive its NER ~422
Check a lease comparable one firm shares with others, as a FactLot fact with predicate lease.comp, and derive its net effective rent. The fact goes through fact_validate (schema, citations, rights), then the comp's own rules: shape (spec/schemas/fact.json LeaseComp: area, commencement, term or expiration, starting or current rent, escalation, free rent, TI, leasing commissions, expense basis, confirming party, verification), an expiration after commencement, a term that matches the dates, free rent within the term, no email, phone or ID number in the text. A comp names no person or company. With the default share profile it also needs the deal's starting rent, escalations, free rent, TI, property type, an expense basis other than unknown, and stated rights. When valid and a starting rent is given, ner.fact is a computed lease.net_effective_rent fact (formula calc.net_effective_rent@1, straight-line and discounted at discount_rate_annual, on the comp's own expense basis; no conversion between full service and net). Returns { valid, issues, warnings, ner }. Call before sharing a comp.
| Name | Type | Req | Description |
|---|---|---|---|
| discount_rate_annual | number | – | Annual discount rate for the discounted NER (an assumption, not part of the comp). 0 gives the straight-line NER only. |
| fact | object | yes | A FactLot fact with predicate lease.comp: subject (an fl:lease: URN), value (the comp), as_of, provenance (with at least one source: your own record is fine, cited by document_id or sha256 without sh… |
| profile | string | – | share (default): a comp offered to other firms: needs the deal's starting rent, escalations, free rent, TI, expense basis, property type, a term and stated rights. observed: a rent seen in a public r… |
No output schema declared.
No examples provided.
rules_tx_property_tax_protest_deadline Texas property tax protest deadline ~182
Deadline to file a Texas property tax protest with the appraisal review board: the later of May 15 or 30 days after the notice of appraised value was delivered, rolled past weekends and Texas legal holidays, plus a conservative file-by date. Returns the statute citations and the rule's verification status. Verification status: verified. Cite rule rules.tx.property_tax_protest_deadline@1 and its statutes.
| Name | Type | Req | Description |
|---|---|---|---|
| notice_delivered_date | string | – | Date the appraisal district's notice of appraised value was delivered (Tax Code §25.19), YYYY-MM-DD. A mailed notice is presumed delivered on the day it was deposited in the mail (§1.07(c)). Omit if… |
| tax_year | integer | yes | Tax year being protested, e.g. 2026. |
No output schema declared.
No examples provided.
schema_get FactLot JSON Schemas ~31
Return the FactLot data model (Fact, Provenance, SourceRef, Rights, Relationship) as JSON Schema.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
search Search FactLot knowledge ~89
Search FactLot's knowledge base (tools, inputs, CRE predicates, ID and fact specifications). Returns matching document ids, titles, and URLs; call fetch for full text. A query on a subject the knowledge base does not cover returns no results and a note.
| Name | Type | Req | Description |
|---|---|---|---|
| query | string | yes | What you are looking for, e.g. 'CAM cap non-cumulative' or 'loan sizing DSCR'. |
No output schema declared.
No examples provided.
How do I install the FactLot MCP server?
FactLot is a hosted endpoint at https://api.factlot.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
remote · api.factlot.com
claude mcp add --transport http 9mp96ygnbk-alt-factlot 'https://api.factlot.com/mcp'
What is the FactLot MCP server?
FactLot is an MCP server listed in the public MCP registry as io.github.9mp96ygnbk-alt/factlot. Cited CRE facts and deterministic calculators for agents: rent, CAM, debt sizing, IRR, parcel IDs. This page covers its hosted endpoint (https://api.factlot.com/mcp).
Is the FactLot MCP server safe to use?
FactLot scores 71 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the FactLot MCP server expose?
FactLot exposes 42 tools: calc_rent_schedule, calc_net_effective_rent, calc_compare_proposals, calc_multifamily_rent_roll, calc_percentage_rent, and 37 more. Their descriptions and schemas cost roughly 13,030 tokens of context every time the server is loaded.
Does the FactLot MCP server require authentication?
No. We connected to FactLot without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.
Is the FactLot MCP server still maintained?
FactLot is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.