Skip to main content
Glama

C4C: Mortgage Industry Regulations

Find in section

find_in_section
Read-onlyIdempotent

Returns only the verbatim paragraphs of one obligation (section) that contain the given terms. Inputs: obligation_id; terms, 1-6 short words or phrases ("cash-out", "credit score", "LTV"; abbreviations are expanded; numbers match as words or digits, so "five years" finds "five (5) years"); optional max_passages. Each passage has verbatim (the regulator's exact text), offset (its position in the section's text), canonical_citation (the pinpoint cite, where derivable) and heading_path (every heading above it, e.g. "vi. No Cash-Out Refinances > (A) Rate and Term > (i) Standard"). A match inside a table returns the whole table (table: true; table_layout: "flattened" when the source lost its layout and cells may not line up). A passage ending in a colon includes the list it introduces (list_included: true). truncated means more passages matched than were returned. No passages means no paragraph contains the terms as given; it is not a statement about the rule. currency is null or a version/status signal (dual-version, pending, revision-pending, superseded, expired...). On an FHA section HUD's Update 18 revises, version ("in-force" or "update-18-optional") says which text this is and other_version identifies the other.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
termsYes1-6 short terms, e.g. ["cash-out", "credit score"]; not document text.
max_passagesNo
obligation_idYes

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
hintNoOn an error: the server's explanation.
noteNoA note on this result.
errorNoPresent only on an error or refusal: not_found, ambiguous, unparsed, empty_terms, unknown_playbook, unknown_reference, offset_out_of_range, daily_capacity_reached.
termsNoPer-term match counts.
noticeNoTerms notice: research use only, not legal advice.
resetsNoOn daily_capacity_reached: when capacity resets (00:00 UTC).
statusNoE.g. current, superseded, unknown.
sectionNoThe section designation.
versionNoOn a dual-version section: {label: in-force | update-18-optional, dates, note}.
currencyNonull, or a version/status signal {kind, headline, detail, effective_date, mandatory_date, expires_on, as_of, links}; kind e.g. dual-version, pending, revision-pending, superseded, superseded-in-part, modified-by, expired.
fallbackNoOn daily_capacity_reached: where the full corpus can be downloaded.
guidanceNoOn a refusal or empty search: the server's explanation.
page_urlNoThe section's page on claudeforcompliance.com (verbatim text, currency notices, link to the regulator).
passagesNoMatching verbatim passages, in section order.
authorityNoThe document and section title as published.
truncatedNoMore passages matched than were returned.
alias_noteNoExplains resolved_from_alias.
fetched_atNoWhen the source was retrieved.
source_urlNoThe regulator's URL for the document.
chars_totalNoThe section's total length.
register_idNoThe register (source document) id.
snapshot_idNoThe stored source snapshot.
toc_omittedNoThe section's table-of-contents line was omitted.
canonical_idNoSet when this register is a same-text copy of that register.
content_hashNoHash of the stored text.
matches_noteNoHow total_matches became passages_available.
coverage_tierNoHow completely the corpus holds the document.
obligation_idNoThe obligation (section) id.
other_versionNoOn a dual-version section: the other version ({obligation_id, version, dates}).
superseded_byNoThe replacing register, or null.
total_matchesNoMatching paragraphs.
effective_dateNoEffective date, or null.
merged_into_listsNoMatching paragraphs merged into lists with their lead-in.
passages_returnedNoPassages in this response.
canonical_citationNoThe citation in the regulator's style (e.g. "4000.1 II.A.5.d", "B3-3.3-07"), or null.
merged_into_tablesNoMatching paragraphs merged into whole tables.
passages_availableNoPassages the matches make (tables and lists merged).
resolved_from_aliasNoThe retired obligation id requested; its text is now at obligation_id.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / page_url
      Added value: +{
      +  "description": "The section's page on claudeforcompliance.com (verbatim text, currency notices, link to the regulator).",
      +  "type": "string"
      +}
  2. Changed2 schema fields changed
    • changedInput schema / properties / terms / description
      Previous value: -"1-6 short terms, e.g. [\"cash-out\", \"credit score\"]. Not document text."New value: +"1-6 short terms, e.g. [\"cash-out\", \"credit score\"]; not document text."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "https://json-schema.org/draft/2020-12/schema",
      +  "additionalProperties": {},
      +  "description": "find_in_section result.",
      +  "properties": {
      +    "alias_note": {
      +      "description": "Explains resolved_from_alias.",
      +      "type": "string"
      +    },
      +    "authority": {
      +      "description": "The document and section title as published.",
      +      "type": "string"
      +    },
      +    "canonical_citation": {
      +      "description": "The citation in the regulator's style (e.g. \"4000.1 II.A.5.d\", \"B3-3.3-07\"), or null.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "canonical_id": {
      +      "description": "Set when this register is a same-text copy of that register.",
      +      "type": "string"
      +    },
      +    "chars_total": {
      +      "description": "The section's total length.",
      +      "type": "number"
      +    },
      +    "content_hash": {
      +      "description": "Hash of the stored text.",
      +      "type": "string"
      +    },
      +    "coverage_tier": {
      +      "description": "How completely the corpus holds the document.",
      +      "type": "string"
      +    },
      +    "currency": {
      +      "description": "null, or a version/status signal {kind, headline, detail, effective_date, mandatory_date, expires_on, as_of, links}; kind e.g. dual-version, pending, revision-pending, superseded, superseded-in-part, modified-by, expired."
      +    },
      +    "effective_date": {
      +      "description": "Effective date, or null.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "error": {
      +      "description": "Present only on an error or refusal: not_found, ambiguous, unparsed, empty_terms, unknown_playbook, unknown_reference, offset_out_of_range, daily_capacity_reached.",
      +      "type": "string"
      +    },
      +    "fallback": {
      +      "description": "On daily_capacity_reached: where the full corpus can be downloaded.",
      +      "type": "string"
      +    },
      +    "fetched_at": {
      +      "description": "When the source was retrieved.",
      +      "type": "string"
      +    },
      +    "guidance": {
      +      "description": "On a refusal or empty search: the server's explanation.",
      +      "type": "string"
      +    },
      +    "hint": {
      +      "description": "On an error: the server's explanation.",
      +      "type": "string"
      +    },
      +    "matches_note": {
      +      "description": "How total_matches became passages_available.",
      +      "type": "string"
      +    },
      +    "merged_into_lists": {
      +      "description": "Matching paragraphs merged into lists with their lead-in.",
      +      "type": "number"
      +    },
      +    "merged_into_tables": {
      +      "description": "Matching paragraphs merged into whole tables.",
      +      "type": "number"
      +    },
      +    "note": {
      +      "description": "A note on this result.",
      +      "type": "string"
      +    },
      +    "notice": {
      +      "description": "Terms notice: research use only, not legal advice.",
      +      "type": "string"
      +    },
      +    "obligation_id": {
      +      "description": "The obligation (section) id.",
      +      "type": "string"
      +    },
      +    "other_version": {
      +      "description": "On a dual-version section: the other version ({obligation_id, version, dates})."
      +    },
      +    "passages": {
      +      "description": "Matching verbatim passages, in section order.",
      +      "items": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "canonical_citation": {
      +            "description": "The citation in the regulator's style (e.g. \"4000.1 II.A.5.d\", \"B3-3.3-07\"), or null.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "chars": {
      +            "description": "The passage's length.",
      +            "type": "number"
      +          },
      +          "continues_at": {
      +            "description": "Offset where the table continues, when table_complete is false.",
      +            "type": "number"
      +          },
      +          "heading": {
      +            "description": "The nearest heading above (verbatim), or null.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "heading_path": {
      +            "description": "Every heading above, joined by \" > \", or null.",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "list_included": {
      +            "description": "The passage ends in a colon and includes the list it introduces.",
      +            "type": "boolean"
      +          },
      +          "matched_terms": {
      +            "description": "The terms this passage matched.",
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "offset": {
      +            "description": "Where the passage starts in the section's text.",
      +            "type": "number"
      +          },
      +          "table": {
      +            "description": "The passage is a whole table.",
      +            "type": "boolean"
      +          },
      +          "table_complete": {
      +            "description": "false when the table may continue past the passage.",
      +            "type": "boolean"
      +          },
      +          "table_layout": {
      +            "description": "\"flattened\": the source lost its table layout; cells may not line up.",
      +            "type": "string"
      +          },
      +          "verbatim": {
      +            "description": "The regulator's exact text.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "passages_available": {
      +      "description": "Passages the matches make (tables and lists merged).",
      +      "type": "number"
      +    },
      +    "passages_returned": {
      +      "description": "Passages in this response.",
      +      "type": "number"
      +    },
      +    "register_id": {
      +      "description": "The register (source document) id.",
      +      "type": "string"
      +    },
      +    "resets": {
      +      "description": "On daily_capacity_reached: when capacity resets (00:00 UTC).",
      +      "type": "string"
      +    },
      +    "resolved_from_alias": {
      +      "description": "The retired obligation id requested; its text is now at obligation_id.",
      +      "type": "string"
      +    },
      +    "section": {
      +      "description": "The section designation.",
      +      "type": "string"
      +    },
      +    "snapshot_id": {
      +      "description": "The stored source snapshot.",
      +      "type": "string"
      +    },
      +    "source_url": {
      +      "description": "The regulator's URL for the document.",
      +      "type": "string"
      +    },
      +    "status": {
      +      "description": "E.g. current, superseded, unknown.",
      +      "type": "string"
      +    },
      +    "superseded_by": {
      +      "description": "The replacing register, or null.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "terms": {
      +      "description": "Per-term match counts.",
      +      "items": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "expanded_to": {
      +            "description": "Spellings and abbreviations it expanded to."
      +          },
      +          "paragraphs": {
      +            "description": "Paragraphs containing it.",
      +            "type": "number"
      +          },
      +          "term": {
      +            "description": "The term as given.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "toc_omitted": {
      +      "description": "The section's table-of-contents line was omitted.",
      +      "type": "boolean"
      +    },
      +    "total_matches": {
      +      "description": "Matching paragraphs.",
      +      "type": "number"
      +    },
      +    "truncated": {
      +      "description": "More passages matched than were returned.",
      +      "type": "boolean"
      +    },
      +    "version": {
      +      "description": "On a dual-version section: {label: in-force | update-18-optional, dates, note}."
      +    }
      +  },
      +  "type": "object"
      +}
  3. First observed

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the safe-read profile (readOnly, idempotent, non-destructive, closed-world), and the description adds substantial behavioral context beyond them: match semantics (abbreviations expanded, numbers as words or digits), table handling (whole table returned, layout flattening), list inclusion on trailing colons, truncation meaning, and currency/version status signals including the FHA Update 18 dual-version case. This is exactly the extra disclosure the annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but front-loaded with the core purpose, and nearly every sentence carries functional information about matching, output fields, or version signals. It is dense and could be trimmed slightly, but there is little pure filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complex output semantics, the description is complete: even though an output schema exists, it still maps the meaningful fields (verbatim, offset, canonical_citation, heading_path, table, list_included, truncated, currency, version) and clarifies the important negative case ('No passages means no paragraph contains the terms... not a statement about the rule').

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is only 33% (only `terms` is documented in the schema), so the description must compensate and largely does: it details `terms` (1-6 short words or phrases, abbreviation expansion, number matching) and implies `max_passages` via the `truncated` explanation. `obligation_id` gets no elaboration beyond its name, which keeps it from a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Returns only the verbatim paragraphs of one obligation (section) that contain the given terms') and scopes it tightly to one section with matching terms. This is clearly distinguishable from siblings like search_regs (cross-document search), get_obligation (whole section retrieval), and verify_quote (quote validation).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the use case clear: find specific terms within a known section, returning only matching paragraphs rather than the whole section. This implicitly routes the agent away from get_obligation for targeted lookups. However, it never names an alternative or states an explicit when-not condition, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.