C4C: Mortgage Industry Regulations
Verbatim U.S. mortgage regulatory text with citations and effective dates. Read-only, no sign-in.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"mortgage-regs": {
"url": "https://mcp.claudeforcompliance.com/mcp"
}
}
}Remote endpoints
https://mcp.claudeforcompliance.com/mcpstreamable-httpWhat it can do
Tool inventory
Tools (10)
🟢get_obligation(obligation_id, offset, limit, compare_versions)
Return one obligation's verbatim regulator text with full provenance. Answer with this text: quote it exactly, with its section citation, never a paraphrase (a summary may follow the quotes, labeled as your summary). If `currency` is not null, tell the user its headline (e.g. two versions apply, a pending revision, superseded, expired) and which version you quoted. For specific requirements in a long section, find_in_section is faster: it returns only the paragraphs containing your terms. Paging: at most 24,000 chars per call (`limit` asks for fewer). `paging` says where you are (page N of M) and `paging.how` says exactly what to do next: while `next_offset` is a number, call again with the same obligation_id and offset=next_offset; null means the section ends in this response. chars_offset + chars_returned is your position in chars_total. `truncated` means this response is not the whole section: never assert that the rule does not require something until you have read every page. Two versions: an FHA 4000.1 section Update 18 revises has two obligations, the in-force text and its Update 18 revision (`<id>::update-18`); `version` says which this is and `other_version` gives the other's obligation_id -- quote the one that applies and say which. `compare_versions: true` adds `version_changes`: the sentences Update 18 deletes and adds in this section. `canonical_citation` is the section's citation in the regulator's style (e.g. "4000.1 II.A.5.d", "B3-3.3-07", "38 U.S.C. 3709(b)"; null if not derivable): cite it. If `canonical_id` is set, this register is a same-text copy of that one. If `figures` is empty the section states no figure -- say so rather than supplying one from memory.
Input Schema
{
"type": "object",
"properties": {
"obligation_id": {
"type": "string",
"minLength": 1
},
"offset": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"limit": {
"description": "Max chars to return from offset (200-24000; default 24000). With a find_in_section passage offset, a small limit reads just around it.",
"type": "integer",
"minimum": 1,
"maximum": 24000
},
"compare_versions": {
"description": "On an FHA section Update 18 revises: also return `version_changes`, the sentences Update 18 deletes and adds (verbatim units with offsets).",
"type": "boolean"
}
},
"required": [
"obligation_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢get_reg(register_id)
List the obligations in a register with their sections, sizes, provenance and `currency` (null, or a warning such as two versions apply / pending revision / superseded / expired -- tell the user). Returns a manifest, NOT the regulator text: quote from get_obligation or find_in_section. Use this to decide which sections are worth reading. A dual-version section lists both obligations, each with its `version` ("in-force" or "update-18-optional") and `other_version`.
Input Schema
{
"type": "object",
"properties": {
"register_id": {
"type": "string",
"minLength": 1
}
},
"required": [
"register_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢lookup_citation(citation)
Resolve a regulatory citation (for example '4000.1 II.A.8.d', 'B3-4.3-04', 'Freddie Mac Guide 5306.1', '38 U.S.C. 3737', 'M26-7 Chapter 4 Topic 9', 'SBA Notice 5000-872764', 'SOP 50 10 8 B.Ch1.A.2', 'HB-1-3555 11.3') to a register. A cite that parses but is not in the corpus is `not_found` (with `parsed`). Refuses when a citation is ambiguous rather than guessing -- if you receive an 'ambiguous' error, ask the user which version they mean. Does not suggest near matches. A handbook section resolves to the handbook's own register; documents that cite or amend it (e.g. Mortgagee Letters) are listed separately in `related` and are not the section's text. Identical copies of one section resolve to one register and are listed in `also_at`.
Input Schema
{
"type": "object",
"properties": {
"citation": {
"type": "string",
"minLength": 1
}
},
"required": [
"citation"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢search_regs(query, family, limit, currency_kind)
Search US mortgage regulator text. Prefer the regulator's vocabulary ("debt-to-income ratio"); common abbreviations (DTI, LTV, RSU, IRRRL, W-2, VOE, PITI, BK ...) are expanded for you. Each result gives the section title and a verbatim excerpt; match "partial" means the section lacks the words in `missing_terms` -- if a missing word is the point of the question, that section does not answer it. ORDER: results are sorted by `rank_score`, highest first, with no separate tiers: `score` (text match, title-weighted) x term coverage x title fit (a section or document whose title names the whole query ranks higher), with superseded, pending, incorporated or expired text x0.2 and a special program's section (`special_program`: Home Possible, HomeReady, 203(k), HECM...) x0.5 unless the query names the program. `canonical_citation` is the section's citation in the regulator's own style (null when it cannot be derived): cite it rather than a cite from memory. `currency_kind` filters to sections with that currency signal (e.g. "dual-version" for FHA sections Update 18 revises, "pending", "revision-pending", "expired"; "any" = any signal). If the titles don't fit the question, search again with other terms. A special program's section (HomeStyle, 203(k), IRRRL...) applies only to that program. Excerpts are not the full rule: answer by quoting the regulator's text verbatim with its section citation -- find_in_section returns just the paragraphs with your terms (fastest), get_obligation the whole section. A non-null `currency` is a warning (two versions / revision pending / pending / superseded / predates the statute / incorporated into the handbook / expires / source relocated): tell the user. `version` "update-18-optional" marks HUD's Update 18 revision of an FHA section (optional now, mandatory on `mandatory_date`), "in-force" the text that governs by default; `other_version` is the other text's obligation_id. An empty result: search once more in the regulator's own terms (`guidance` names any shorthand to spell out). If that is also empty, THE CORPUS DOES NOT ADDRESS THIS: say so; do not supply the answer from your own knowledge.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1
},
"family": {
"type": "string",
"enum": [
"hud",
"va",
"fnma",
"fhlmc",
"gnma",
"usda",
"sba"
]
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 25
},
"currency_kind": {
"description": "Only sections carrying this currency signal, e.g. \"dual-version\", \"pending\", \"revision-pending\"; \"any\" for any signal.",
"type": "string",
"enum": [
"any",
"dual-version",
"revision-pending",
"pending",
"expires",
"expired",
"superseded",
"predates-statute",
"incorporated",
"incorporated-update-18",
"revised",
"revised-this-update",
"source-relocated",
"proposed",
"directive-watch",
"vacated-watch"
]
}
},
"required": [
"query"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢find_in_section(obligation_id, terms, max_passages)
Return ONLY the verbatim paragraphs of one obligation (section) that contain your terms -- the fast way to get specific requirements out of a long section, instead of paging through it with get_obligation. terms: 1-6 short words or phrases in the regulator's vocabulary ("cash-out", "credit score", "LTV"); common abbreviations are expanded. Each passage's `verbatim` is the regulator's exact text: quote it with the section citation (`canonical_citation` is the passage's pinpoint cite where derivable; `heading_path` names every heading above it, e.g. "vi. No Cash-Out Refinances > (A) Rate and Term > ... > (i) Standard" -- check it is the program you mean), never paraphrase. `offset` locates it in the section for get_obligation. If `currency` is not null, tell the user (two versions apply, pending revision, superseded, expired). A dual-version section's `version` says which text this is ("in-force" or "update-18-optional") and `other_version` names the other: say which one you quoted. A match inside a table returns the whole table (header and every row, `table: true`): quote the rows that apply. No match does not mean the rule is silent -- try other terms or read the section.
Input Schema
{
"type": "object",
"properties": {
"obligation_id": {
"type": "string",
"minLength": 1,
"maxLength": 300
},
"terms": {
"minItems": 1,
"maxItems": 6,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"description": "1-6 short terms, e.g. [\"cash-out\", \"credit score\"]. Not document text."
},
"max_passages": {
"type": "integer",
"minimum": 1,
"maximum": 20
}
},
"required": [
"obligation_id",
"terms"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢verify_quote(text, register_id)
Check whether a passage of text actually appears in the regulator's source document. Works on text from ANY source, not only text this server returned -- use it to check your own draft answer before presenting it. Outcomes: 'exact' (contiguous in source character for character -- quote marks and dashes as the source writes them; a line break counts as a space), 'normalized' (matches only after typography folding -- straight vs curly quotes, dash kinds, ' vs " -- `typography_folded: true`), 'composed' (every word traceable to source but assembled from non-contiguous pieces in source order -- legitimate for section overviews, and the outcome for a quote whose elisions are marked with an ellipsis ('…' or '...'); ALWAYS check `omissions`, the short source phrases that were skipped, since a dropped 'not' changes meaning), 'not_found' (no source support -- do not present this text as a quotation; `unsupported` lists the spans with no support; on a near miss `differences` names the source words the text lacks and the words it adds, e.g. a dropped 'not'). Passages over 5,000 words are refused as 'not_checked'. Pass register_id when you know it; otherwise up to 3 candidate source documents are located by search, named in `checked_against` (document, edition, retrieval date; ids in `checked_snapshot_ids`). A match also carries `matched_version`: 'current', or 'superseded' when the text is a PRIOR version of the rule (with `superseded_register_id`, `superseded_by` = the current register, and dates) -- quote superseded text only as the prior version, never as current. 'update-18-optional' means the text is HUD's Update 18 revision of an FHA 4000.1 section: optional now, mandatory on `mandatory_date`, not the text in force by default (`in_force_obligation_id`) -- present it as the Update 18 version.
Input Schema
{
"type": "object",
"properties": {
"text": {
"type": "string",
"minLength": 1
},
"register_id": {
"type": "string"
}
},
"required": [
"text"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢list_playbooks
List the guided compliance playbooks this server runs in your chat: the Fannie Mae AI lender letter (LL-2026-04) P&P review -- AI inventory, AI governance policy, risk assessment, P&P updates, change log -- and FHA, VA and USDA loan-file QC against the verbatim handbooks. Returns each playbook's id, what it does, when to use it and what the user must provide. The user's P&Ps and loan files stay in their own chat: never send their text to this server. Playbook tools take only ids.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢start_playbook(id)
Start a guided compliance playbook and get its full instructions -- use this when the user asks to run the FNMA AI lender letter / LL-2026-04 review on their P&Ps, or to QC an FHA, VA or USDA loan file. Returns the workflow to follow, its stages, the references to load per stage, and the rule-kit version. Follow the returned instructions exactly. The user's P&Ps and loan files stay in their own chat: never send their text to this server. Playbook tools take only ids.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"maxLength": 64,
"pattern": "^[a-z0-9-]+$",
"description": "Playbook id: one of fnma-ai-lender-letter, fha-underwriting-qc, va-loan-qc, usda-loan-qc."
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢get_playbook_reference(id, name)
Load one stage reference of a playbook (for example the FNMA playbook's DISCOVERY, RECONCILE, SYNTHESIS, PP-UPDATE, CHANGELOG or UPDATING stage) when the workflow reaches that stage. start_playbook lists the valid names. The user's P&Ps and loan files stay in their own chat: never send their text to this server. Playbook tools take only ids.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"maxLength": 64,
"pattern": "^[a-z0-9-]+$",
"description": "Playbook id: one of fnma-ai-lender-letter, fha-underwriting-qc, va-loan-qc, usda-loan-qc."
},
"name": {
"type": "string",
"maxLength": 64,
"pattern": "^[A-Za-z0-9-]+$",
"description": "Reference name, as listed by start_playbook's `references`."
}
},
"required": [
"id",
"name"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢get_playbook_kit(id, offset)
Get a playbook's rule kit. FNMA AI lender letter: the verbatim LL-2026-04, InfoSec Supplement, ECOA/Reg B/FCRA/AVM rows to cite from, paginated (follow next_offset until null). FHA/VA/USDA QC: the corpus registers each check area grounds in, read with get_reg / get_obligation. The kit block's fingerprint and dates are the currency check. The user's P&Ps and loan files stay in their own chat: never send their text to this server. Playbook tools take only ids.
Input Schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"maxLength": 64,
"pattern": "^[a-z0-9-]+$",
"description": "Playbook id: one of fnma-ai-lender-letter, fha-underwriting-qc, va-loan-qc, usda-loan-qc."
},
"offset": {
"description": "Row offset for the next page (the previous page's next_offset).",
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
}
},
"required": [
"id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence