Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

FactLot

MCPB · FACTLOT-0.3.0.MCPB · 3 COMPONENTS

Cited CRE facts and deterministic calculators for agents: rent, CAM, debt sizing, IRR, parcel IDs.

39 Trust /100

Last scanned (7 hours ago)

Scores higher than 72% of MCPB servers

Category Finance and Payments

Trust breakdown (7 categories)

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →

Supply Chain Security0
  • No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.Unverified
  • Known CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).Unverified
  • Install-script risk not yet assessed.Unverified
  • Dependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).Unverified
Provenance & Transparency48
  • Source repository is publicly reachable at the declared URL. View diagnostics → Pass
  • Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
  • Clear OSI-approved license (Apache-2.0).Pass
  • Actively maintained (last published 1 days ago).Pass
  • Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability60
  • AI-judged instruction clarity (excellent).Pass
  • Context-footprint check failed: tool/resource definitions use about 13632 tokens (~309/item across 44 items; 44 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 44 captured tool definition(s), and no name or description among them implies an irreversible operation.Pass
  • An AI judge read all 45 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

Unverified: 1 category

A category scored 0 because we could not verify it: a data source with nothing on this package, evidence we could not reach, or a check we could not run. We only credit what we can confirm.

What we tested

Checks we ran (12)

  • Source repository
  • Provenance
  • License
  • Maintenance
  • Security disclosure
  • Schema quality
  • Stability
  • Tool coverage
  • Injection markers
  • Destructive annotations
  • Judged manipulation
  • MCP protocol

Checks we could not complete (4)

These are gaps on our side, not findings about this package. We only credit what we can confirm, so a category made up entirely of them scores 0.

  • Malware scan in Supply Chain Security (scores 0 for this)No malware scan is available for this kind of package: the supply-chain vendors we use do not cover it. This is a permanent gap in our coverage, not a finding about the package.
  • Known CVEs in Supply Chain Security (scores 0 for this)Known CVEs could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).
  • Install scripts in Supply Chain Security (scores 0 for this)Install-script risk not yet assessed.
  • Dependency health in Supply Chain Security (scores 0 for this)Dependency health could not be checked: we found no dependency list to check in this bundle: either it runs a compiled binary, whose bundled manifests we do not read, or none of the package.json, requirements.txt, pyproject.toml or uv.lock files it ships for its runtime declares a dependency we can read (a requirements.txt that only points at a setup.py project, a local path, or a nested requirements file we cannot follow counts as none).

Does not apply to this package (2)

  • Endpoint SecurityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.
  • Transport & ReachabilityScored on hosted endpoints only. A package has no live endpoint of its own for us to probe.

The score does not measure everything. What the score does not measure →

Changelog

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.

  • 4 Nov 26 0
    • Stability: 0.00 → unverified ▼ security
    • Schema quality: 201 → 309 ▼ functional
    • Schema quality: 201 → 246 ▼ functional
  • 3 Nov 26 39

    First indexed and scored.

Diagnostics

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 · Analysed mcpb/https://github.com/9mp96ygnbk-alt/factlot/releases/download/v0.3.0/factlot-0.3.0.mcpb

Provenance No attestation

The registry publishes no build provenance for this version, so there is nothing to verify.

Result No attestation
Ecosystem mcpb
Reason No attestation published

Background: How many MCP packages publish verified provenance →

MCP tools · 44 exposed · ~13,392 tokens

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 →

Tool Tokens
calc_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.

NameTypeReqDescription
amortization_monthsintegeryesAmortization 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_countstring–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_monthsinteger–Months of interest-only payments at the start of the loan; amortization over amortization_months begins after them. At most term_months.
payment_frequencystring–Payment period: monthly (12 a year) or quarterly (4 a year). Term, amortization, and interest-only months must be whole periods.
principalnumberyesLoan amount funded, USD.
rate_annualnumberyesFixed nominal annual interest rate as a decimal, e.g. 0.065 for 6.5%.
start_datestring–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_monthsintegeryesMonths from funding to maturity, when any remaining balance (the balloon) is repaid.

No output schema declared.

No examples provided.

calc_cam_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.

NameTypeReqDescription
admin_feeobject–Administrative fee the lease adds to the tenant's share. Omit if the lease has none.
capobject–Cap on the tenant's share of controllable expenses. Omit if the lease has no cap.
estimates_paidnumber–Estimated CAM payments the tenant made during the year, USD (total for the year, not monthly).
expensesarrayyesBuilding operating expense lines for the year.
gross_upobject–Gross up variable expenses to the target occupancy when actual occupancy is lower. Omit if the lease has no gross-up.
occupancyobject–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_sharenumberyesTenant's pro rata share, 0 < share ≤ 1 (e.g. 12,000 / 150,000 = 0.08).
structure––Expense structure from the lease. Default: net.
yearintegeryesCalendar or lease year being reconciled.

No output schema declared.

No examples provided.

calc_cam_reconciliation_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.

NameTypeReqDescription
expensesarrayyesThe building's operating expense pool for the year, entered once for every tenant: category, amount, controllable, recoverable, variable, admin_fee_applies.
gross_upobject–Gross up variable expenses to the target occupancy when actual occupancy is lower. Omit if the lease has no gross-up.
tenantsarrayyesEvery 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…
yearintegeryesCalendar or lease year being reconciled.

No output schema declared.

No examples provided.

calc_capex_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.

NameTypeReqDescription
amortization_yearsintegeryesYears over which the cost is recovered: the useful life, or the amortization period the lease specifies.
clausesobject–Lease clause behind each assumption, free text, echoed in the result's assumptions so a reviewer can check each against the lease.
costnumberyesCapital cost of the improvement to recover, USD (building level).
cost_savings_capobject–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_yearinteger–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_annualnumber–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.
methodstring–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_basisstring–Where amortization_years comes from: useful_life (e.g. under GAAP or tax guidance) or lease_specified (a period the lease states). Labels only.
tenantsarray–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 ~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.

NameTypeReqDescription
area_basisstring–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_annualnumber–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).
perspectivestring–Whose economics to rank on: tenant (effective occupancy cost, lower is better) or landlord (discounted net effective rent, higher is better).
proposalsarrayyes2–20 proposals to compare.

No output schema declared.

No examples provided.

calc_dcf_pro_forma ~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.

NameTypeReqDescription
capital_reserve_psf_annualnumber–Year-1 capital reserve, USD/SF/yr over the building area, below NOI. Grows with expense_growth_rate.
credit_loss_ratenumber–Credit loss as a share of gross revenue, on top of general vacancy.
discount_ratenumberyesAnnual unlevered discount rate, e.g. 0.08. The present value at this rate is the value.
exit_cap_ratenumberyesExit (terminal) cap rate applied to the exit NOI, e.g. 0.07.
exit_noi_basisstring–"forward": the NOI of the year after the hold (the usual convention); "trailing": the NOI of the final hold year.
expense_growth_ratenumber–Annual growth of operating expenses and capital reserves, e.g. 0.03: year y = year 1 × (1 + g)^(y − 1).
general_vacancy_ratenumber–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_yearsintegeryesHolding period in years. The property is sold at the end of the last year; one more year is projected for the forward NOI.
leasesarrayyesRent roll: one entry per lease or vacant suite (at most 200). The building area is the sum of their areas.
management_fee_ratenumber–Management fee as a share of effective gross revenue, e.g. 0.03; not recovered.
market_leasingobjectyesMarket 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_ratenumber–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_annualnumber–Year-1 operating expenses no tenant reimburses, USD/yr.
operating_expenses_psf_annualnumber–Year-1 recoverable operating expenses, USD/SF/yr over the whole building area.
purchase_pricenumber–Price paid at the start, USD. Adds the NPV (value − price), the unlevered IRR and the going-in cap rate on price.
selling_cost_ratenumber–Selling costs as a share of the gross sale price, e.g. 0.02.
timingstring–"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 ~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.

NameTypeReqDescription
amortization_yearsintegeryesAmortization in years; 0 means interest-only.
existing_loan_balancenumber–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_ltvnumber–Maximum loan-to-value, e.g. 0.65.
min_debt_yieldnumber–Minimum debt yield (NOI ÷ loan), e.g. 0.09.
min_dscrnumber–Minimum debt service coverage ratio, e.g. 1.25.
noinumberyesUnderwritten net operating income, USD/yr.
rate_annualnumberyesAnnual interest rate, e.g. 0.065.
round_down_tonumber–Round the final loan amount down to this increment (lenders often use 1,000 or 10,000).
stressobject–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.
valuenumber–Appraised or underwritten value, USD. Required when max_ltv is set.

No output schema declared.

No examples provided.

calc_direct_cap ~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.

NameTypeReqDescription
area_sfnumber–Rentable area in SF, for value per SF. Optional.
cap_ratenumber–Capitalization rate as a decimal, e.g. 0.065 for 6.5%. Gives the value. Provide cap_rate, price, or both.
capex_reserve_annualnumber–Annual capital (replacement) reserve deducted from NOI before capitalizing, USD/yr. 0 if the NOI is already after reserves.
free_rent_burn_offnumber–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_costsnumber–One-time costs to reach the stabilized NOI (TI, leasing commissions, lost rent during lease-up), USD, deducted from the capitalized value.
noinumberyesNet operating income to capitalize, USD/yr, before capital reserves (they are deducted separately below).
noi_basisstring–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_adjustmentsarray–Further below-the-line value adjustments, applied after capitalizing.
pricenumber–Purchase or asking price, USD. Gives the implied cap rate. Provide cap_rate, price, or both.
round_value_tonumber–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 ~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.

NameTypeReqDescription
cash_flowsarrayyesProject-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_upobject–GP catch-up after the pref and return of capital. Omit for none.
distribution_orderstring–Which comes first from each distribution: accrued pref, then return of capital (the usual order), or capital first.
lp_sharenumberyesShare 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_yearinteger–Cash-flow periods per year: 1 annual, 4 quarterly, 12 monthly. Sets the pref accrual per period and annualizes the IRRs.
prefobject–Preferred return on unreturned capital, paid to all investors pro rata to capital. Omit for none.
residual_promotenumber–GP promote share of everything after the last tier, e.g. 0.3 for a 70/30 split.
tiersarray–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 ~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.

NameTypeReqDescription
as_ofstring–Date to count the days remaining from, YYYY-MM-DD. Optional.
cash_received_at_salenumber–Cash the taxpayer took from the sale proceeds instead of leaving them with the qualified intermediary, USD.
identified_propertiesarray–Replacement properties identified in writing. Empty to skip the identification checks.
relinquishedobjectyesThe property given up.
relinquished_transfer_datestringyesDate the relinquished property was transferred (closed), YYYY-MM-DD. With several relinquished properties, the earliest transfer starts both periods.
replacementobject–The property acquired (in total). Omit to check only the deadlines and identification.
tax_return_due_datestring–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 ~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.

NameTypeReqDescription
departmental_expensesnumber–Total departmental expenses, USD: rooms, F&B, and other operated departments (USALI Total Departmental Expenses).
fb_revenuenumber–Food and beverage revenue, USD (USALI Food and Beverage department revenue).
ffe_reserve_ratenumber–FF&E replacement reserve as a share of total operating revenue, e.g. 0.04 (USALI Replacement Reserve, below EBITDA).
management_fee_fixednumber–Fixed or incentive management fee for the period, USD, added to the percentage fee (USALI Management Fees).
management_fee_ratenumber–Base management fee as a share of total operating revenue, e.g. 0.03 (USALI Management Fees).
nightsintegeryesNights in the period, e.g. 365 for a year or 30 for a month.
non_operating_expensesnumber–Property taxes, insurance, ground rent, and other non-operating expenses, USD (USALI Non-Operating Income and Expenses).
other_revenuenumber–Other operated departments plus miscellaneous income, USD (USALI Other Operated Departments and Miscellaneous Income).
room_revenuenumberyesRooms revenue for the period, USD (USALI Rooms department revenue, net of taxes and allowances).
roomsintegeryesRooms in inventory (keys).
rooms_out_of_orderinteger–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_soldintegeryesRoom-nights occupied by paying guests in the period (USALI: rooms sold, excluding complimentary rooms).
undistributed_expensesnumber–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 ~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.

NameTypeReqDescription
cash_flowsarrayyesPeriodic cash flows at t = 0, 1, 2, …; negative for outflows (e.g. purchase price at t = 0). At most 1200.
periods_per_yearinteger–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 ~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.

NameTypeReqDescription
classificationstringyesLessee 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_annualnumberyesAnnual discount rate applied to the remaining payments, e.g. 0.06. Nominal: the periodic rate is this ÷ periods_per_year.
discount_rate_updatedbooleanyesTrue 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…
eventstringyesWhat 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_beforenumberyesCarrying amount of the lease liability immediately before the remeasurement, USD.
payment_timingstring–Whether each payment falls at the beginning (in advance) or end (in arrears) of its period.
paymentsarrayyesRemaining lease payments after the event, in ascending period order. Periods not listed carry no payment (rent-free).
periods_per_yearinteger–Payment periods per year (12 for monthly, 4 for quarterly).
remaining_periodsinteger–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_beforenumberyesCarrying 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 ~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.

NameTypeReqDescription
discount_rate_annualnumberyesAnnual discount rate as a decimal, e.g. 0.08, applied to both cases' year-end cash flows (year 0 = closing / move-in).
horizon_yearsintegeryesAnalysis horizon in years. Both cases are compared over this period; the own case sells at the end of it.
leaseobjectyesThe lease alternative.
ownobjectyesThe purchase alternative.

No output schema declared.

No examples provided.

calc_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.

NameTypeReqDescription
as_ofstring–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_unitsboolean–Rent roll mode: include a per-unit table with loss to lease, amortised concession, and effective rent (can be long).
leaseobject–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.
unitsarray–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 ~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.

NameTypeReqDescription
discount_rate_annualnumber–Annual discount rate as a decimal, e.g. 0.08 (monthly rate = annual ÷ 12); 0 gives the undiscounted (straight-line) NER.
leasing_commissionsnumber–Total leasing commissions paid by landlord, USD.
other_concessionsnumber–Any other landlord concessions paid at commencement (moving allowance, buyout), USD.
scheduleobjectyesThe lease's base-rent terms (same input as calc_rent_schedule).
ti_allowance_psfnumber–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 ~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.

NameTypeReqDescription
cash_flowsarrayyesPeriodic cash flows at t = 0, 1, 2, …; negative for outflows (e.g. purchase price at t = 0). At most 10000.
ratenumberyesDiscount 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 ~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.

NameTypeReqDescription
base_rent_annualnumberyesAnnual 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_salesnumberyesGross sales reported for the lease year (or partial year), USD.
percentage_rent_paidnumber–Percentage rent already paid during the period, USD.
period_fractionnumber–Fraction of a full lease year covered (e.g. 0.5 for a six-month partial year). Prorates the breakpoint.
ratenumberyesPercentage rent rate, e.g. 0.06 for 6%.
sales_exclusionsnumber–Sales excluded by the lease (returns, sales tax, gift cards, employee sales, …), USD.

No output schema declared.

No examples provided.

calc_prepayment_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.

NameTypeReqDescription
accrued_interestnumber–Accrued but unpaid interest to the payoff date, USD; added to the total payoff.
amortization_monthsintegeryesRemaining 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.
balancenumberyesOutstanding principal balance at the payoff date, USD.
note_rate_annualnumberyesFixed annual note rate, e.g. 0.055.
prepayment–yesPrepayment provision from the note.
remaining_term_monthsintegeryesMonths 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 ~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.

NameTypeReqDescription
current_rent_monthlynumber–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_annualnumber–Annual discount rate as a decimal, e.g. 0.08, applied to both cases (monthly rate = annual ÷ 12).
horizon_monthsintegeryesAnalysis horizon in months; both cases run for this term (e.g. 120 for a ten-year renewal versus a ten-year new lease).
relocateobjectyesMove to new premises.
renewobjectyesStay and renew the existing lease.

No output schema declared.

No examples provided.

calc_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.

NameTypeReqDescription
abated_monthsarray–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_sfnumberyesRentable square feet, or the quantity leased in unit (kW, MW, units, acres, keys, rooms, spaces) when unit is set.
commencement_datestringyesRent 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_monthlyboolean–Include a month-by-month table (can be long).
round_rate_to_centsboolean–Round each step's $/SF/yr to cents, as many lease rent tables do.
starting_rent_psf_annualnumberyesYear-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_monthsintegeryesLease term in months, e.g. 120 for ten years.
unitstring–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 ~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.

NameTypeReqDescription
as_ofstringyesDate to measure remaining term from, YYYY-MM-DD.
leasesarrayyesLeases in the portfolio or building.
weight_bystring–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 ~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.

NameTypeReqDescription
as_ofstringyesDate the facts are stated as of (YYYY-MM-DD), usually today.
documentsarrayyesThe lease and its amendments. Each needs pages with candidates or facts, or facts alone.
subjectstring–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 ~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.

NameTypeReqDescription
factsarrayyesVerified 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_useobjectyesThe use to check.

No output schema declared.

No examples provided.

doc_compare ~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.

NameTypeReqDescription
assertedarrayyesValues another document states (an estoppel, a rent roll, an OM), mapped to predicates.
lease_factsarrayyesVerified 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_read_pdf ~243

Local server only. Read a PDF on this machine (a path, or its bytes as base64) into the document input of the doc_* tools: the text layer of each page, OCR through a backend you name (e.g. tesseract) for pages without one, the file's sha256 so document_id is fl:document:sha256-<sha256> (the same ID id_document gives the file), and ocr_pages, the pages whose text came from OCR (facts cited to them carry ocr: true). Needs the FactLot Python SDK with pypdf (pip install 'factlot[pdf]'). Nothing leaves the machine.

NameTypeReqDescription
content_base64string–Or the PDF's bytes as base64.
ocrstring–OCR backend for pages without a text layer, e.g. "tesseract" (needs the tesseract command). Without it, scanned pages come back empty and are listed in pages_without_text.
pathstring–Path of the PDF on this machine (relative paths resolve from the server's working directory).
titlestring–Document title for citations.

No output schema declared.

No examples provided.

doc_spread_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.

NameTypeReqDescription
documentobjectyesThe statement's pages.
linesarrayyesThe 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.
periodstring–Default period label for lines that give none.
property_typestringyesWhich chart of accounts to use: multifamily, commercial (office, retail, industrial), or hotel (USALI summary).
statement_typestring–What the document is; echoed back.
tolerancenumber–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 ~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.

NameTypeReqDescription
claimobjectyesEither {predicate, value} or {text}.
documentobjectyesThe document the quote is from.
pageintegeryes1-based page the quote is on.
quotestringyesVerbatim text from the page that the claim rests on.

No output schema declared.

No examples provided.

doc_verify_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.

NameTypeReqDescription
as_ofstringyesDate the facts are stated as of (YYYY-MM-DD), usually today.
candidatesarrayyesValues you extracted, each with its quote and page.
documentobjectyesThe document the candidates were read from.
subjectstring–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 ~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.

NameTypeReqDescription
created_atstring–When the package was made (ISO 8601 with offset). FactLot adds no clock time, so the same input always gives the same package.
created_bystring–The organization making the package.
documentsarray–Source documents to describe beyond what the facts cite (a title, the file's sha256). Every document a fact cites is listed automatically.
factsarrayyesThe facts to package, in order: verified facts from the doc_* tools or any facts that pass fact_validate.
titlestring–A title for the package.

No output schema declared.

No examples provided.

fact_package_sign ~119

Local server only. Sign a package from fact_package_create with your own Ed25519 private key, read from the file named by the FACTLOT_SIGNING_KEY_FILE environment variable (PKCS#8 PEM); the key never passes through the conversation and nothing leaves the machine. Returns the package with signature {algorithm, public_key, value} and the public key to share for fact_package_verify.

NameTypeReqDescription
key_idstring–A label for the key, stored with the signature.
packageobjectyesThe package from fact_package_create.

No output schema declared.

No examples provided.

fact_package_verify ~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.

NameTypeReqDescription
documentsarray–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.
packageobjectyesA fact package from fact_package_create, signed or not.
public_keystring–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 ~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.

NameTypeReqDescription
factobjectyesA FactLot fact: subject, predicate, value, as_of, provenance (with sources), optional rights.

No output schema declared.

No examples provided.

fetch ~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.

NameTypeReqDescription
idstringyesDocument 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 ~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.

NameTypeReqDescription
county_fipsstringyes3-digit county FIPS code, e.g. "001".
state_fipsstringyes2-digit state FIPS code, e.g. "11" for the District of Columbia.
streetstringyesStreet 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).
zipstringyes5-digit ZIP code of the address, e.g. "20002" (ZIP+4 accepted).

No output schema declared.

No examples provided.

id_document ~81

Content-addressed FactLot ID (SHA-256) for a document such as a lease, amendment, or estoppel.

NameTypeReqDescription
content_base64string–Base64 of the exact file bytes (preferred: every party gets the same ID).
textstring–Document text, UTF-8 encoded before hashing. Use only when bytes are unavailable.

No output schema declared.

No examples provided.

id_entity ~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).

NameTypeReqDescription
jurisdictionstringyesRegistry jurisdiction, e.g. "us-de" for Delaware, or "lei" for a Legal Entity Identifier.
registry_numberstringyesFile 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 ~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").

NameTypeReqDescription
apnstringyesAssessor'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_fipsstringyes3-digit county FIPS code, e.g. "037" for Los Angeles County.
state_fipsstringyes2-digit state FIPS code, e.g. "06" for California.

No output schema declared.

No examples provided.

id_parse ~56

Validate a FactLot URN and return its kind, components, and short ID.

NameTypeReqDescription
urnstringyesA FactLot URN to validate, e.g. fl:parcel:us-06037:5432001012.

No output schema declared.

No examples provided.

id_space ~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.

NameTypeReqDescription
building_urnstringyesFactLot 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).
suitestringyesSuite or unit as written ("Suite 400", "STE 400", "#400", "3rd Floor" all normalize).

No output schema declared.

No examples provided.

lease_comp_validate ~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.

NameTypeReqDescription
discount_rate_annualnumber–Annual discount rate for the discounted NER (an assumption, not part of the comp). 0 gives the straight-line NER only.
factobjectyesA 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…
profilestring–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 ~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.

NameTypeReqDescription
notice_delivered_datestring–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_yearintegeryesTax year being protested, e.g. 2026.

No output schema declared.

No examples provided.

schema_get ~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 ~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.

NameTypeReqDescription
querystringyesWhat you are looking for, e.g. 'CAM cap non-cumulative' or 'loan sizing DSCR'.

No output schema declared.

No examples provided.

Install

How do I install the FactLot MCP server?

FactLot ships as an MCPB bundle, a single file you download and open in an MCP host that supports MCPB bundles, such as Claude Desktop. The host reads the launch command from the bundle's own manifest, so there is no command to copy. Before opening it, check the file's SHA-256 matches the one the MCP registry declares for it, 9efb25143166a73c155d7c77cbc42e0606996136018e35a6d9b1efadaf8af30f; the commands to do that are on this page. If it does not match, do not open it.

mcpb · factlot-0.3.0.mcpb

Download bundle

Check the download matches the SHA-256 the MCP registry declares before you open it. If it does not match, do not open the file.

SHA-256

9efb25143166a73c155d7c77cbc42e0606996136018e35a6d9b1efadaf8af30f

macOS / Linux

echo "9efb25143166a73c155d7c77cbc42e0606996136018e35a6d9b1efadaf8af30f  factlot-0.3.0.mcpb" | shasum -a 256 -c

Windows (PowerShell)

(Get-FileHash -Algorithm SHA256 .\factlot-0.3.0.mcpb).Hash -eq "9efb25143166a73c155d7c77cbc42e0606996136018e35a6d9b1efadaf8af30f"

Run it in the folder you saved the bundle to, then open the file with an MCPB-capable host such as Claude Desktop.

Common questions

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 MCPB bundle (https://github.com/9mp96ygnbk-alt/factlot/releases/download/v0.3.0/factlot-0.3.0.mcpb).

Is the FactLot MCP server safe to use?

FactLot scores 39 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 44 tools: calc_rent_schedule, calc_net_effective_rent, calc_compare_proposals, calc_multifamily_rent_roll, calc_percentage_rent, and 39 more. Their descriptions and schemas cost roughly 13,392 tokens of context every time the server is loaded.

What licence is the FactLot MCP server under?

FactLot declares the Apache-2.0 licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

What did VerifyMCP test on the FactLot MCP server?

VerifyMCP ran 12 checks on FactLot, covering Source repository, Provenance, License, Maintenance and 8 more. 4 items could not be completed, a gap on our side rather than a finding about FactLot: Malware scan, Known CVEs, Install scripts and Dependency health. One category scores 0 for that reason, because we only credit what we can confirm. Endpoint Security and Transport & Reachability do not apply to an MCPB bundle, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.