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

A
Description quality
100%
Schema completeness
83%
Naming quality
98%
Poisoning risk
100%
Permission match
100%
Protocol compliance
100%

Based on automated analysis of tool definitions and protocol compliance.

Context Cost

~3,815Tokens (tool definitions)
~1.0 KBTypical response size
Significant attention impact (2.98% of 128k context)

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-http

What it can do

Tool inventory

Tools (10)

🟢 Read-only🟡 Write🔴 Delete⚪ Unknown
🟢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

Rate this Server

Evidence

Recent observations

verifiedversion not recorded10 tools