An AI assistant asked about a mortgage lender has three options today: recall something from training, scrape a webpage, or estimate. We tested four systems on ten questions with verifiable answers this week and watched all three failure modes — including fabricated lender tables carrying real citations. The scorecard.
This is the fourth option: a Model Context Protocol server that returns the actual federal record. 98 institutions, 319 metropolitan areas, 52 jurisdictions, from the complete 2025 CFPB HMDA file.
Q: What is the FHA annual MIP for a $300,000 loan, 85% LTV, 15-year term, case assigned 2026-02-01? resolve_fha_annual_mip → verdict pass · figure_with_receipt "0.15% ⟦FRC:rule-hud-ml-2023-05-annual-mip:15bps:…⟧" · cell le15 / le726200 / le90 rule frc:rule:hud-ml-2023-05-annual-mip, effective 2023-03-20 · receipt ⟦FRC:rule-hud-ml-2023-05-annual-mip:15bps:…⟧ "For an FHA forward mortgage with a case number assigned on 2026-02-01, base loan amount $300,000 …, the annual MIP is 15 basis points … per HUD Mortgagee Letter 2023-05." Without a source, two Claude models answered this question 0.55% and 0.45% (Stale Rule Index, MP3); the rule says 0.15%. Omit the term → block, CONDITION_MISSING, no number.
Every figure-bearing result carries a Proof Object (id, value, receipt, verify and resolve URLs, vintage, scope). Resolve any FRC id or receipt: https://frc-mcp.ziyetis.workers.dev/resolve/<id>.
Connect any MCP-capable client or agent directly over HTTP — nothing to install. Per-client configs and the instruction block that makes the agent actually use it: use-frc.html. For a person who needs one finding with its receipt: cite.html.
https://frc-mcp.ziyetis.workers.dev
Streamable HTTP; sixteen tools; same hard limit (historical aggregates only, no individual predictions). Speaks MCP 2026-07-28 (stateless requests, server/discover, resultType on every result, cacheable tools/list, multi-round-trip elicitation for missing public conditions) and the 2025 revisions with sessions. Discovery over GET: /server-card — what the server can and cannot answer, machine-readable.
Any MCP host (Claude Desktop, agent frameworks) — add to your MCP config:
{
"mcpServers": {
"financeratecalc": { "command": "npx", "args": ["-y", "github:financeratecalc/frc-mcp"] }
}
}
Sixteen tools: claim certification, the sentence gate, rule tables and the MIP resolver, national, lender, state and metro statistics, the Door Effect and its conditional map, and a counterparty screen (see the table below). Source: github.com/financeratecalc/frc-mcp ·
REST spec: openapi.jsonThe original single-file Python server still works but exposes the older, smaller tool set; prefer the remote endpoint above. Not on PyPI — install from source. It is a single file plus a data file, with one dependency.
git clone https://github.com/financeratecalc/financeratecalc.github.io cd financeratecalc.github.io/mcp pip install mcp python frc_mcp.py
Claude Desktop — add to claude_desktop_config.json:
{
"mcpServers": {
"financeratecalc": {
"command": "python",
"args": ["/full/path/to/mcp/frc_mcp.py"]
}
}
}
Generated from the server source (worker/index.js). Every response carries the same guardrail: historical aggregates from the public 2025 HMDA record, never an individual prediction.
| Tool | What it does | Access |
|---|---|---|
| get_rule | Machine-readable regulatory tables with effective dates (FHA/FHFA 2026 limits, HOEPA/QM 2026 thresholds, VA funding fee, FHA MIP): cells, issuer document, qualifiers, sha256. Omit rule_id to list. | Free |
| resolve_fha_annual_mip | Resolves the exact HUD ML 2023-05 cell from base loan amount, LTV, term and case date; returns bps, the cell, the rule id and a quotable sentence. Missing condition → block, no number (v1.18.0). | Free |
| check_claim_contract | The gate between the number and the sentence. Pass a claim id and either use flags or proposed_sentence, the exact sentence you intend to write; returns pass / needs_qualifier / block with reason codes, the safe wording and the attribution. Sentence mode uses fixed patterns, no model (v1.17.0). Rule mode (v1.31.0): pass a frc:rule: id and the sentence; the cell its qualifiers name is resolved and every dollar or percent figure is classified as current, superseded, another rule's, or absent. | Free |
| get_national_fha_stats | National FHA denial statistics from the 2025 federal record. | Free |
| get_lender_denial_stats | FHA denial statistics for one lender by name, slug, or LEI. | Free |
| list_lenders | List covered FHA lenders sorted by denial rate or volume (2025 span: 1.8% to 78.7%). | Free |
| get_state_denial_stats | FHA denial statistics for a US state. | Free |
| get_door_effect_summary | Door Effect: 38% of explainable variation in FHA denial outcomes is lender identity, not the applicant's file (859,090 decisions; McFadden 0.1712 to 0.2760). | Free |
| get_metro_lender_gap | Per-metro FHA denial-rate gap between high-volume lenders (>=100 decisioned applications in that metro, 2025), returned as a machine-readable claim passport: lowest and highest door with counts, gap in percentage points, source-record sha256, interpretation boundaries, and a link to its Claim Contract. | Free |
| screen_counterparties | Counterparty screen: run a list of public LEIs against the FinanceRateCalc 2025 FHA denial outlier screen (observed vs applicant-mix model expectation). | Free preview; full Evidence Brief by license |
| screen_counterparties_quote | Price and coverage quote BEFORE running a counterparty screen. | Free |
| list_cohorts | Ready-made public cohorts you can screen without uploading anything. | Free |
| run_cohort | Screen a ready-made public cohort by id (see list_cohorts). | Free preview; full Evidence Brief by license |
| get_conditional_door_map | Conditional surface for a lender: how its peer-adjusted denial gap changes across leverage bands inside identical published cells (state x loan amount x income x DTI x CLTV). | Free |
Paid tools return a free preview to any agent. Unlocking a full Evidence Brief requires a license bought by a human on the pricing page; the agent only relays the offer and can never complete a purchase.
A deterministic suite (scripts/frc_mcp_conformance.mjs, 16 tests, no model) runs against the deployed server after every deploy and weekly, and publishes eval/frc-mcp-conformance.json (also at GET /conformance on the endpoint). It checks the MCP 2026-07-28 surface (server/discover, deterministic and cacheable tools/list, resultType), the 2025 fallback, and the behaviour that matters for a financial evidence tool: a missing public condition is asked for (2026 clients) or blocked (2025 clients) and never guessed; borrower attributes such as income or credit score are refused; a rule receipt verifies as current and a tampered one does not; the sentence gate grades the published vectors. The report carries a sha256 of its results. Last run: see the file. Evidence fixtures (53) and the full record: conformance.html. Agent Stress Lab, paired rerun on 1.23.0 (same model without/with the tools: correct rule cell 5/52 → 51/52, receipt on the number 0/56 → 56/56, qualifier survival 21/56 → 55/56): results. Harness: docs/agent-stress-lab.md.
Since v1.17.0 check_claim_contract accepts proposed_sentence. The tool checks the sentence with fixed patterns — no model — for a missing period, missing program scope, a population wider than the claim, second-person prediction, causal wording, lender advice, legal conclusions, and values this publisher has since corrected, and returns the verdict with the sentence it would accept.
Since v1.31.0 the same gate covers the five rule files. Give it a frc:rule: id and the sentence; it resolves the cell the sentence's qualifiers name (year, units, floor or ceiling, first or subsequent use, down-payment band) and classifies every dollar or percent figure against all five tables: current (pass), last year's value (STALE_VALUE), a figure that exists but in a different rule (VALUE_FROM_OTHER_RULE), a wrong year on a right figure (PERIOD_MISMATCH), the wrong cell (VALUE_MISMATCH), or a figure in no table (UNVERIFIED_VALUE). Each figure is bound to the role named in its own clause and compared with that cell (v1.31.1): "the floor is $1,249,125 and the ceiling is $541,287" is two mismatches, not a pass. A passing sentence with at least one bound figure returns a rule receipt that /verify checks against the cell; an unbound figure earns no receipt. Scope, stated plainly: on the supported sentence patterns (one claim per clause, the role and its conditions beside the figure) the gate checks number–role–condition bindings deterministically; a binding it cannot resolve is reported, never counted as verified. It does not understand every English sentence and does not claim to. The cross-rule case is the one search engines get wrong most: on 2026-10-12 a Perplexity answer gave $726,200 as "the FHA loan limit"; that number is the MIP base-loan threshold in HUD ML 2023-05.
{"name":"check_claim_contract","arguments":{"passport_id":"frc:rule:fha-forward-loan-limits-2026",
"proposed_sentence":"The 2026 FHA loan limit is $726,200 for a one-unit home in most counties."}}
→ verdict: block
VALUE_FROM_OTHER_RULE $726,200 is the base_loan bound in frc:rule:hud-ml-2023-05-annual-mip, not a value of the limit table
VALUE_MISMATCH the 1-unit floor cell is $541,287
safe_wording: "For FHA forward mortgages with case numbers assigned in 2026, the 1-unit loan limit is $541,287 in low-cost counties and $1,249,125 in high-cost counties; most counties sit between (HUD Mortgagee Letter 2025-23). Not a county value."
{"name":"resolve_fha_annual_mip","arguments":{"base_loan_amount":300000,"ltv_pct":85,"term_years":15,"case_number_date":"2026-02-01"}}
→ verdict: pass · annual_mip_bps: 15 · matched_cell: le15 / le726200 / le90 · rule: frc:rule:hud-ml-2023-05-annual-mip (effective 2023-03-20)
safe_sentence: "For an FHA forward mortgage with a case number assigned on 2026-02-01, base loan amount $300,000 …, LTV 85% and a 15-year term, the annual MIP is 15 basis points (0.15% …) per HUD Mortgagee Letter 2023-05 …"
(omit term_years → verdict: block, CONDITION_MISSING, no number)
{"name":"check_claim_contract","arguments":{"passport_id":"frc:claim:national-fha-denial-rate-2025",
"proposed_sentence":"About 21.7% of mortgage applications were denied in 2025, so you will probably be rejected."}}
→ verdict: block
STALE_VALUE 21.7 was corrected; current 22.1%
INDIVIDUAL_PREDICTION "you will probably be rejected"
SCOPE_TOO_BROAD "of mortgage applications" (claim covers FHA only)
QUALIFIER_DELETED no FHA; no "decisioned"
safe_wording: In 2025, {value} of decisioned FHA applications were denied (actions 1,2,3; loan_type 2).
The six checks are the ones in the grading sample; the same patterns that grade a model answer after the fact now run before the sentence is written. Agents should call it for every FRC figure they are about to state. Usage is tallied per tool and per day (counts only) and published in the usage snapshot.
Institutions below 1,500 decisioned applications are not served, because the figures would be unstable. Cuts of the data that were computed but withheld from publication for insufficient sample — state × debt-to-income × lender cells, for instance — are not served either. What the site declines to publish, the server declines to return.
Every response carries a verification_status field reading "reproducible; not independently reproduced", along with the universe definition, the method link and the dataset DOI. That is accurate, and attaching it to each response makes it harder to drop in transit than a caveat sitting at the bottom of a webpage.
No figure this server returns has been independently reproduced. The specification for checking any of them, with expected values, is at reconciliation.
The server and its data file are in the site repository: github.com/financeratecalc → /mcp. Read it before you trust it — it is about 250 lines and every figure it serves is already published on this site.
Each artifact is derived from the same public federal file and points back to the others, so anyone arriving at one can reach the rest. None of it has been independently reproduced — that remains the open item, and the specification for closing it is in the reconciliation link above.
Want these figures on your own page? embed widget and JSON API →
Prefer it while you shop? The Chrome extension shows a metro's FHA record on any Zillow, Redfin or Realtor.com listing.
Prices and rates are widely reported. Whether a lender says yes is not. In the complete 2025 federal record, denial rates across the 100 largest FHA lenders ran from 1.8% to 78.7% — same programme, same year.
And it is not simply who applies where: standardizing on state, loan amount, income, debt-to-income and loan-to-value, applicant mix explains only a 2.7× range in expected outcomes.
CFPB HMDA 2025, computed by FinanceRateCalc. Covers the highest-volume lenders published per market, not all lenders. Historical observations, not predictions. CC BY 4.0, not independently reproduced.