Skip to main content
Glama

C4C: Mortgage Industry Regulations

Get obligation

get_obligation
Read-onlyIdempotent

Returns one obligation's (section's) verbatim regulator text with provenance. Inputs: obligation_id; optional offset, limit, compare_versions. verbatim holds the text between <<>> and <<>>. 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)"), or null. Paging: at most 24,000 chars per response; chars_offset + chars_returned is the position within chars_total; next_offset is the offset of the next page, or null when the section ends in this response; truncated means more text follows; started_mid_section means text before chars_offset is not included; paging gives page N of M. currency is null or a version/status signal (dual-version, pending, revision-pending, superseded, expired...) with a one-line headline. An FHA 4000.1 section HUD's Update 18 revises has two obligations, the in-force text and the revision (<id>::update-18); version says which this is and other_version identifies the other. compare_versions: true adds version_changes, the sentences Update 18 deletes and adds. figures is a best-effort extraction of figures in the text; an empty or incomplete list is not evidence that the text states no figure. canonical_id, when set, is the register this one is a same-text copy of.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
limitNoMax chars to return from offset (200-24000; default 24000).
offsetNo
obligation_idYes
compare_versionsNoOn an FHA section Update 18 revises: also return `version_changes`, the sentences Update 18 deletes and adds (verbatim units with offsets).

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
hintNoOn an error: the server's explanation.
kindNo"renumbered": the regulator gave this section a new number; no text is given under the old one.
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.
noticeNoTerms notice: research use only, not legal advice.
pagingNoPage N of M.
resetsNoOn daily_capacity_reached: when capacity resets (00:00 UTC).
statusNoE.g. current, superseded, unknown.
figuresNoBest-effort extraction of figures in the text; an empty or incomplete list is not evidence that the text states no figure.
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).
verbatimNoThe regulator's exact text, between <<<BEGIN VERBATIM>>> and <<<END VERBATIM>>>.
authorityNoThe document and section title as published.
editorialNoReserved; summary is null (the text is not summarized).
truncatedNoMore text follows this response.
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.
next_offsetNoThe next page's offset, or null when the section ends here.
obligationsNoOn kind renumbered: the new register's sections ({obligation_id, section}), no text.
register_idNoThe register (source document) id.
snapshot_idNoThe stored source snapshot.
canonical_idNoSet when this register is a same-text copy of that register.
chars_offsetNoWhere this response starts in the section's text.
content_hashNoHash of the stored text.
requested_idNoOn kind renumbered: the old id asked for.
text_changedNoOn kind renumbered: false when the text moved word for word.
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}).
renumbered_inNoOn kind renumbered: the regulator's posting that renumbered it.
renumbered_onNoOn kind renumbered: when (YYYY-MM).
superseded_byNoThe replacing register, or null.
chars_returnedNoCharacters of text in this response.
effective_dateNoEffective date, or null.
renumbered_fromNoThe old register, when the section was renumbered.
version_changesNoWith compare_versions: sentences Update 18 deletes and adds, or {error: "single_version"}.
canonical_citationNoThe citation in the regulator's style (e.g. "4000.1 II.A.5.d", "B3-3.3-07"), or null.
resolved_from_aliasNoThe retired obligation id requested; its text is now at obligation_id.
started_mid_sectionNoText before chars_offset is not in this response.
renumbered_from_citationNoOn kind renumbered: the section's old citation.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed8 schema fields changed
    • addedOutput schema / properties / kind
      Added value: +{
      +  "description": "\"renumbered\": the regulator gave this section a new number; no text is given under the old one.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / obligations
      Added value: +{
      +  "description": "On kind renumbered: the new register's sections ({obligation_id, section}), no text."
      +}
    • addedOutput schema / properties / renumbered_from
      Added value: +{
      +  "description": "The old register, when the section was renumbered.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / renumbered_from_citation
      Added value: +{
      +  "description": "On kind renumbered: the section's old citation.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / renumbered_in
      Added value: +{
      +  "description": "On kind renumbered: the regulator's posting that renumbered it.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / renumbered_on
      Added value: +{
      +  "description": "On kind renumbered: when (YYYY-MM).",
      +  "type": "string"
      +}
    • addedOutput schema / properties / requested_id
      Added value: +{
      +  "description": "On kind renumbered: the old id asked for.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / text_changed
      Added value: +{
      +  "description": "On kind renumbered: false when the text moved word for word.",
      +  "type": "boolean"
      +}
  2. 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"
      +}
  3. Changed2 schema fields changed
    • changedOutput schema / properties / figures / description
      Previous value: -"Figures stated in the text; empty when it states none."New value: +"Best-effort extraction of figures in the text; an empty or incomplete list is not evidence that the text states no figure."
    • changedOutput schema / properties / figures / items / properties / unit / description
      Previous value: -"percent, currency, duration, ratio, age, day_of_period or temperature."New value: +"percent, percentage_point, currency, duration, ratio, fraction, age, day_of_period, time, count, number or temperature."
  4. Changed2 schema fields changed
    • changedInput schema / properties / limit / description
      Previous value: -"Max chars to return from offset (200-24000; default 24000). With a find_in_section passage offset, a small limit reads just around it."New value: +"Max chars to return from offset (200-24000; default 24000)."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "$schema": "https://json-schema.org/draft/2020-12/schema",
      +  "additionalProperties": {},
      +  "description": "get_obligation 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_offset": {
      +      "description": "Where this response starts in the section's text.",
      +      "type": "number"
      +    },
      +    "chars_returned": {
      +      "description": "Characters of text in this response.",
      +      "type": "number"
      +    },
      +    "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."
      +    },
      +    "editorial": {
      +      "description": "Reserved; summary is null (the text is not summarized)."
      +    },
      +    "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"
      +    },
      +    "figures": {
      +      "description": "Figures stated in the text; empty when it states none.",
      +      "items": {
      +        "additionalProperties": {},
      +        "properties": {
      +          "as_written": {
      +            "description": "The figure as written, when it differs.",
      +            "type": "string"
      +          },
      +          "offset": {
      +            "description": "Position in this response's text.",
      +            "type": "number"
      +          },
      +          "unit": {
      +            "description": "percent, currency, duration, ratio, age, day_of_period or temperature.",
      +            "type": "string"
      +          },
      +          "value": {
      +            "description": "The figure as a number string, e.g. \"43\", \"50/50\".",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "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"
      +    },
      +    "next_offset": {
      +      "description": "The next page's offset, or null when the section ends here.",
      +      "type": [
      +        "number",
      +        "null"
      +      ]
      +    },
      +    "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})."
      +    },
      +    "paging": {
      +      "additionalProperties": {},
      +      "description": "Page N of M.",
      +      "properties": {
      +        "how": {
      +          "description": "The server's paging note.",
      +          "type": "string"
      +        },
      +        "next_offset": {
      +          "description": "The next page's offset, or null at the end.",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "page": {
      +          "description": "This page's number, or null past the end.",
      +          "type": [
      +            "number",
      +            "null"
      +          ]
      +        },
      +        "pages": {
      +          "description": "Total pages at this page size.",
      +          "type": "number"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "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"
      +    },
      +    "started_mid_section": {
      +      "description": "Text before chars_offset is not in this response.",
      +      "type": "boolean"
      +    },
      +    "status": {
      +      "description": "E.g. current, superseded, unknown.",
      +      "type": "string"
      +    },
      +    "superseded_by": {
      +      "description": "The replacing register, or null.",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "truncated": {
      +      "description": "More text follows this response.",
      +      "type": "boolean"
      +    },
      +    "verbatim": {
      +      "description": "The regulator's exact text, between <<<BEGIN VERBATIM>>> and <<<END VERBATIM>>>.",
      +      "type": "string"
      +    },
      +    "version": {
      +      "description": "On a dual-version section: {label: in-force | update-18-optional, dates, note}."
      +    },
      +    "version_changes": {
      +      "description": "With compare_versions: sentences Update 18 deletes and adds, or {error: \"single_version\"}."
      +    }
      +  },
      +  "type": "object"
      +}
  5. Changed1 schema field changed
    • addedInput schema / properties / compare_versions
      Added value: +{
      +  "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"
      +}
  6. First observed

TDQS

A3.7/5.0
Behavior5/5

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

Annotations cover the safety profile (readOnly, idempotent, non-destructive, closed-world), and the description goes well beyond them: page size cap of 24,000 chars, next_offset/truncated/started_mid_section semantics, dual-version behavior for FHA Update 18, what compare_versions adds, and the caveat that an empty figures list is not proof of absence. This is unusually rich behavioral context.

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?

It is dense but front-loaded with the core purpose and then organized by concern (inputs, paging, versioning, figures). Much of the length explains return fields, which an output schema already covers, so some sentences are redundant, but nearly every statement carries non-obvious semantic information.

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

Completeness4/5

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

For a tool with versioning, paging, and dual-version sections, the description covers the mechanics thoroughly and an output schema exists to carry return structure. The one real gap is routing guidance relative to sibling retrieval tools, which leaves the agent to infer when this beats get_reg or find_in_section.

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

Parameters3/5

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

Schema coverage is 50% (limit and compare_versions are documented in-schema; offset and obligation_id are not). The description explains compare_versions in depth and names offset/limit as optional, but never states what offset means as an input (character position), leaving that only implied through the output paging fields. Partial compensation over the schema baseline.

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

Purpose4/5

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

The description states a specific verb and resource: returning one obligation's (section's) verbatim regulator text with provenance, which is concrete and scoped to a single item. It implicitly separates itself from search_regs/find_in_section by emphasizing 'one obligation,' but never names a sibling explicitly, so differentiation is inferred rather than stated.

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

Usage Guidelines2/5

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

The description lists inputs and output fields but gives no when-to-use guidance, no conditions that select it over get_reg, find_in_section, or verify_quote, and no exclusions. The agent must infer that this is the single-section fetch tool from the name and text alone.

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.