Skip to main content
Glama

C4C: Mortgage Industry Regulations

Server Details

Verbatim U.S. mortgage regulatory text with citations and effective dates. Read-only, no sign-in.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
99.8% over 21 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
earl-hash/c4c-mcp
GitHub Stars
0
Server Listing
C4C: Mortgage Industry Regulations

TDQS

A3.9/5.0

Scored across 10 tools

Disambiguation4/5

Each tool mostly targets a distinct unit: search_regs searches the whole corpus, find_in_section searches within one obligation, get_obligation fetches full text, get_reg returns a manifest, lookup_citation resolves a citation, and verify_quote checks a passage. The main overlap risk is search_regs vs find_in_section (both text search) and the three playbook tools (list/start/get_kit/get_reference), but the descriptions make the boundaries fairly clear.

Naming Consistency4/5

All names are snake_case with predictable verb_noun form (get_*, list_*, search_*, lookup_*, start_*, verify_*). Minor deviation is find_in_section using a prepositional phrase rather than a plain verb+noun, but overall the set is consistent and readable.

Tool Count5/5

Ten tools is well-scoped for a regulatory retrieval/verification server, with no redundant or filler tools. Each tool covers a distinct capability (search, retrieve, resolve citations, verify quotes, run playbooks).

Completeness4/5

The surface covers the full read-only research lifecycle: citation resolution, full-text and in-section search, full-text retrieval, quote verification, and guided playbook workflows. As an intentionally read-only corpus server, no obvious critical operation is missing, though bulk/section listing beyond manifests is limited.

Available Tools

10 tools
find_in_sectionFind in sectionA
Read-onlyIdempotent
Inspect

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.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
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.

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.

get_obligationGet obligationA
Read-onlyIdempotent
Inspect

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.

ParametersJSON 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

ParametersJSON Schema
NameRequiredDescription
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.

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.

get_playbook_kitGet playbook kitA
Read-onlyIdempotent
Inspect

Returns a playbook's rule kit. FNMA AI lender letter: the verbatim LL-2026-04, InfoSec Supplement and ECOA/Reg B/FCRA/AVM rows with citations, paginated; next_offset is the next page's offset, or null when the kit is complete. FHA/VA/USDA QC: the corpus registers each check area is grounded in. The kit block's fingerprint and dates identify its version. Playbook tools accept only ids and reference names, no document text; the user's P&Ps and loan files stay in their own chat.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPlaybook id: one of fnma-ai-lender-letter, fha-underwriting-qc, va-loan-qc, usda-loan-qc.
offsetNoRow offset for the next page (the previous page's next_offset).

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoThe playbook id.
kitNoThe kit's kind, source and version.
hintNoOn an error: the server's explanation.
noteNoA note on this result.
rowsNoKit rows: verbatim rule text with citations.
areasNoFor a corpus-register kit: its areas and registers.
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.
offsetNoWhere this page starts.
resetsNoOn daily_capacity_reached: when capacity resets (00:00 UTC).
fallbackNoOn daily_capacity_reached: where the full corpus can be downloaded.
guidanceNoOn a refusal or empty search: the server's explanation.
valid_idsNoOn unknown_playbook: the valid ids.
rows_totalNoRows in the kit.
how_to_readNoFor a corpus-register kit: the server's reading note.
next_offsetNoThe next page's offset, or null when the kit is complete.
rows_returnedNoRows in this page.
search_familyNoFor a corpus-register kit: its search family.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already establish read-only/idempotent/non-destructive safety, but the description adds real behavioral context: pagination via next_offset (null when complete), version identity through the kit block's fingerprint and dates, and a privacy boundary that inputs are ids/reference names only with user documents staying in their own chat.

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?

Front-loaded with the core purpose and pagination behavior; each sentence carries content (contents, paging, versioning, input constraints). The middle sentences are dense with domain jargon, which slightly taxes readability but nothing is wasted.

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?

Given an output schema exists, the description needn't restate return values, yet it voluntarily covers pagination semantics, version identification, per-playbook content, and input constraints. It is complete enough for correct invocation, with only the sibling-routing guidance left thin.

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 description coverage is 100%, so id and offset are already documented, establishing the baseline. The description adds meaning to the offset parameter by explaining that next_offset feeds the next page, but it does not add format or syntax beyond the schema.

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?

Opens with a specific verb+resource ('Returns a playbook's rule kit') and then details the actual contents per playbook family (verbatim LL-2026-04, InfoSec Supplement, ECOA/Reg B/FCRA/AVM rows; corpus registers for FHA/VA/USDA). This lets an agent know what it will receive, though it never explicitly contrasts itself with siblings like get_playbook_reference or find_in_section.

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

Usage Guidelines3/5

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

Usage is only implied. The line 'Playbook tools accept only ids and reference names, no document text' sets a boundary but does not say when to choose this tool over get_playbook_reference, get_reg, or get_obligation. No exclusions or alternatives are named.

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

get_playbook_referenceGet playbook referenceA
Read-onlyIdempotent
Inspect

Returns one stage reference document of a playbook (e.g. the FNMA playbook's DISCOVERY, RECONCILE, SYNTHESIS, PP-UPDATE, CHANGELOG or UPDATING stage). Inputs: id, name (one of the playbook's references). Playbook tools accept only ids and reference names, no document text; the user's P&Ps and loan files stay in their own chat.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPlaybook id: one of fnma-ai-lender-letter, fha-underwriting-qc, va-loan-qc, usda-loan-qc.
nameYesReference name, one of the playbook's `references`.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoThe playbook id.
hintNoOn an error: the server's explanation.
nameNoThe reference name.
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.
resetsNoOn daily_capacity_reached: when capacity resets (00:00 UTC).
contentNoThe reference's content.
fallbackNoOn daily_capacity_reached: where the full corpus can be downloaded.
guidanceNoOn a refusal or empty search: the server's explanation.
valid_idsNoOn unknown_playbook: the valid ids.
valid_namesNoOn unknown_reference: the valid names.

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent and non-destructive behavior, so the safety bar is met structurally. The description adds genuine extra context: playbook tools accept only ids and reference names, no document text, and user P&Ps/loan files stay in their own chat — a useful data-boundary disclosure.

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?

Three front-loaded sentences: the return, then the inputs, then the boundary note. Each contributes, though the stage enumeration is slightly long and the input restatement partly duplicates the schema.

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?

An output schema exists, so return values need no explanation, and the description covers what is fetched, the required inputs, and a data-boundary caveat. The only gap is the missing routing guidance versus sibling playbook tools.

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 description coverage is 100% and both params are documented in the schema with patterns and id enumerations. The description reinforces that id/name are the inputs and that name maps to the playbook's `references`, but adds no syntax or format detail beyond the schema, so the baseline 3 applies.

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 ('Returns') and resource ('one stage reference document of a playbook') and pins it down with concrete stage examples (DISCOVERY, RECONCILE, etc.) plus the FNMA playbook. An agent can distinguish this single-stage fetch from get_playbook_kit or list_playbooks without opening any schema.

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

Usage Guidelines3/5

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

The description clarifies what `name` must be ('one of the playbook's `references`') and adds a privacy/origin constraint, which implicitly frames usage. However, it never states when to choose this over the sibling get_playbook_kit or list_playbooks, so selection guidance remains implicit.

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

get_regGet regulationB
Read-onlyIdempotent
Inspect

Returns a manifest of one register (source document): its provenance, currency (null or a version/status signal: dual-version, pending revision, superseded, expired...) and its obligations (sections), each with obligation_id, section, canonical_citation, chars_total and will_truncate (true when the section exceeds one 24,000-char page). The manifest contains no regulator text. A dual-version section lists both obligations, each with version ("in-force" or "update-18-optional") and other_version.

ParametersJSON Schema
NameRequiredDescriptionDefault
register_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
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.
resetsNoOn daily_capacity_reached: when capacity resets (00:00 UTC).
statusNoE.g. current, superseded, unknown.
also_atNoSame-text copies of this register.
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).
authorityNoThe document title.
source_urlNoThe regulator's URL for the document.
obligationsNoThe register's obligations (a manifest, not regulator text).
register_idNoThe register id.
canonical_idNoSet when this register is a same-text copy of that register.
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_idNoEchoed on error.
renumbered_inNoOn kind renumbered: the regulator's posting that renumbered it.
renumbered_onNoOn kind renumbered: when (YYYY-MM).
superseded_byNoThe replacing register, or null.
effective_dateNoEffective date, or null.
renumbered_fromNoThe old register, when the section was renumbered.
canonical_citationNoThe citation in the regulator's style (e.g. "4000.1 II.A.5.d", "B3-3.3-07"), or null.
renumbered_from_citationNoOn kind renumbered: the section's old citation.

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the bar is lower. The description adds genuinely useful behavior: the manifest contains no regulator text, `will_truncate` flags sections exceeding one 24,000-char page, and dual-version sections expose version/other_version semantics.

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?

Effectively one dense, front-loaded sentence with the purpose first and the manifest structure after. It is well-organized, though a portion of the output-field enumeration overlaps with the existing output schema.

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

Completeness3/5

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

Since an output schema exists, the lengthy return-value explanation is partly redundant, and the description omits the input semantics and any usage routing an agent would need. It is adequate for calling the tool but incomplete on selection and parameter sourcing.

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 0% for the single `register_id` parameter, so the description carries the burden. It implies the parameter identifies one register/source document but gives no format, source, or how to obtain a valid id, leaving a real gap.

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: it returns the manifest of one register (source document). It clearly conveys what the tool fetches, though it never differentiates this from siblings like get_obligation or search_regs, and much of the text describes output shape rather than the action itself.

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?

There is no when-to-use guidance, no conditions for selecting this over get_obligation, search_regs, or find_in_section, and no prerequisites. The agent is left to infer the routing entirely from the name and sibling list.

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

list_playbooksList playbooksA
Read-onlyIdempotent
Inspect

Lists the guided compliance playbooks this server provides: 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 it applies and what the user provides. Playbook tools accept only ids and reference names, no document text; the user's P&Ps and loan files stay in their own chat.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
hintNoOn an error: the server's explanation.
nextNoThe server's note on the next step.
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.
resetsNoOn daily_capacity_reached: when capacity resets (00:00 UTC).
privacyNoHow user material is handled.
fallbackNoOn daily_capacity_reached: where the full corpus can be downloaded.
guidanceNoOn a refusal or empty search: the server's explanation.
playbooksNoThe available playbooks.

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint and non-destructive, so the safety profile is covered. The description adds useful behavioral context beyond that: the constraint that playbook tools take only ids/reference names and that the user's P&Ps and loan files remain in their own chat, a data-handling guarantee not captured anywhere in the structured fields.

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?

Front-loaded with the core action, and the long parenthetical inventory of playbook topics is informative but heavier than strictly needed. Every sentence contributes, though the enumeration could be trimmed in a leaner definition.

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?

For a zero-argument, read-only listing tool with full annotation coverage and an output schema, nothing an agent needs is missing: it knows what will be listed, what each entry contains, and the id-only constraint on downstream playbook calls. Return-value details are backed by the output schema.

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?

The tool takes zero parameters, so the baseline is 4. The description instead clarifies the shape of each returned entry (id, what it does, when it applies, what the user provides), which is helpful but is about the return payload rather than argument semantics.

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 ('Lists') and resource ('guided compliance playbooks this server provides') and then enumerates what those playbooks cover, so the agent can tell this catalogue tool apart from start_playbook, get_playbook_kit, and get_playbook_reference without opening a schema. The scope is concrete rather than a restatement of the title.

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 closing sentence about playbook tools accepting only ids and reference names implies this list is the discovery step for obtaining those ids, which is clear context for when to call it. It stops short of explicitly naming alternatives or stating when-not to use it, so it is clear but not fully prescriptive.

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

lookup_citationLook up citationA
Read-onlyIdempotent
Inspect

Resolves a regulatory citation (e.g. '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_id. Errors: not_found (the cite parses but is not in the corpus; parsed shows the parse), ambiguous (it could mean several registers, listed in candidates; no guess is made), unparsed (not recognizable as a citation). Near matches are not suggested. A handbook section resolves to the handbook's own register; documents that cite or amend it (e.g. Mortgagee Letters) are listed in related and are not the section's text. Identical copies of a section resolve to one register and are listed in also_at. A whole-handbook name returns handbook, an outline of its parts. A section the regulator renumbered returns kind "renumbered": register_id is the section under its new number, renumbered_from the old register, and no text is given under the old number.

ParametersJSON Schema
NameRequiredDescriptionDefault
citationYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
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.
parsedNoThe parse of the citation ({kind, canonical, ...}).
resetsNoOn daily_capacity_reached: when capacity resets (00:00 UTC).
topicsNoTopics under a structured citation.
also_atNoIdentical copies of the section (other register ids).
relatedNoDocuments that cite or amend the section ({register_id, relation}); not its text.
citationNoThe citation as given (on unparsed).
fallbackNoOn daily_capacity_reached: where the full corpus can be downloaded.
guidanceNoOn a refusal or empty search: the server's explanation.
handbookNoWhen the citation names a whole handbook: its outline.
page_urlNoThe section's page on claudeforcompliance.com (verbatim text, currency notices, link to the regulator).
truncatedNoThe candidate scan hit its limit.
candidatesNoOn ambiguous: the registers the citation could mean.
source_urlNoThe regulator's URL for the resolved section's document.
obligationsNoThe register's sections ({obligation_id, section}; when no text is inlined, `opening`: the first words of the section's verbatim text, cut and marked with ...).
register_idNoThe register the citation resolves to.
also_at_noteNoExplains also_at.
canonical_idNoSet when the register is a same-text copy of that register.
related_noteNoExplains related.
requested_idNoOn kind renumbered: the old id asked for.
text_changedNoOn kind renumbered: false when the text moved word for word.
renumbered_inNoOn kind renumbered: the regulator's posting that renumbered it.
renumbered_onNoOn kind renumbered: when (YYYY-MM).
renumbered_fromNoThe old register, when the section was renumbered.
superseded_candidatesNoCandidates dropped because a current register replaces them.
superseded_register_idNoThe register holding the prior text of this section.
renumbered_from_citationNoOn kind renumbered: the section's old citation.

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/idempotentHint/openWorldHint=false, so the safety profile is covered. The description goes well beyond that with genuine behavioral policy: no guessing on ambiguity, no near-match suggestions, related/also_at semantics, and renumbered sections returning no text under the old number. Some of this restates output fields the output schema likely already defines, keeping it short of a 5.

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

Conciseness3/5

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

The purpose is front-loaded in the first clause, but the remainder is a dense single paragraph of parentheticals mixing errors, handbook resolution, aliasing and renumbering. It is content-rich but not scannable; the error taxonomy in particular would earn more as discrete structure.

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?

With an output schema present, return values need not be re-explained, and the description still covers input formats, all three error modes, and tricky resolution cases (handbook outline, related/also_at, renumbered). Only the downstream relationship to get_reg/verify_quote is left implicit.

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 0% — the single `citation` parameter has no description in the schema. The description compensates strongly by enumerating accepted citation syntaxes ('4000.1 II.A.8.d', '38 U.S.C. 3737', 'HB-1-3555 11.3'), which is exactly the format information an agent needs to populate the field.

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 (resolves) and resource (regulatory citation) with a concrete output (register_id), and gives eight example citation formats spanning HUD, Fannie, Freddie, VA, SBA and USDA. An agent can immediately distinguish this from siblings like get_reg (which takes an id) or search_regs (which takes free text).

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

Usage Guidelines3/5

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

The examples imply this is the citation-to-register_id front door of a pipeline, but the description never names an alternative or states when to use this versus get_reg/search_regs/find_in_section. Usage is inferred from the input shape rather than stated, and no preconditions or follow-on step are given.

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

search_regsSearch regulationsA
Read-onlyIdempotent
Inspect

Full-text search of US mortgage regulator text (Fannie Mae, Freddie Mac, FHA, VA, USDA, Ginnie Mae, SBA, CFPB). Inputs: query; optional family (one agency), limit (1-25), currency_kind (only sections carrying that currency signal; "any" = any signal). Common abbreviations (DTI, LTV, IRRRL, W-2, VOE, PITI, BK...) are expanded to the regulator's terms. Each result is one section: title, obligation_id, canonical_citation (the citation in the regulator's style, or null) and excerpt, a verbatim fragment near the match, not the whole rule. match is "all_terms" or "partial"; a partial result lists the query words it lacks in missing_terms. Order: rank_score, highest first = text score (title-weighted) x term coverage x title fit, with superseded, pending, incorporated or expired text x0.2, a special program's section (special_program: Home Possible, HomeReady, 203(k), HECM...) x0.5 unless the query names the program, and obligation_type "note" (source-credit notes) or "index" (a chapter heading) x0.2 unless the query asks for them. section_status "deleted" marks a deleted-section stub, ranked last. A query that is a citation returns the cited section first and sets cited; a bare handbook name ("HUD 4000.1") adds handbook, an outline of its parts. currency is null or a version/status signal whose kinds include dual-version, pending, revision-pending, superseded, superseded-in-part (a Mortgagee Letter replaced some provisions, named in headline), modified-by (a later issuance changes it, optional until its mandatory date) and expired. version "in-force" or "update-18-optional" marks the two texts of an FHA section HUD's Update 18 revises (mandatory_date for the revision); other_version is the other text's obligation_id. Empty results carry reason (empty_query, no_match, no_match_above_threshold) and may carry guidance naming shorthand in the query.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
familyNohud = HUD/FHA Single Family (Handbook 4000.1, Mortgagee Letters); hudmf = HUD/FHA Multifamily (MAP Guide 4430.G, multifamily Mortgagee Letters); va; fnma = Fannie Mae; fhlmc = Freddie Mac; gnma = Ginnie Mae; usda; sba.
currency_kindNoRestricts results to sections carrying this currency signal; "any" = any signal.

Output Schema

ParametersJSON Schema
NameRequiredDescription
hintNoOn an error: the server's explanation.
noteNoA note on this result.
citedNoWhen the query is a citation: {citation, register_ids}.
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.
reasonNoWith empty results: empty_query, no_match or no_match_above_threshold.
resetsNoOn daily_capacity_reached: when capacity resets (00:00 UTC).
resultsNoRanked sections, highest rank_score first (may be empty).
fallbackNoOn daily_capacity_reached: where the full corpus can be downloaded.
guidanceNoOn a refusal or empty search: the server's explanation.
handbookNoWhen the query names a whole handbook: its outline.

TDQS

A4/5.0
Behavior5/5

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

Annotations already declare readOnlyHint/idempotent/non-destructive, so the bar is to add context — and this substantially does: the ranking formula, the x0.2/x0.5 penalties for superseded, note/index, and special-program text, deleted-stub handling, citation-query behavior, and `reason` codes for empty results. This is unusually rich behavioral disclosure beyond what annotations provide.

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

Conciseness3/5

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

The purpose is front-loaded, but the body is a dense single block covering ranking internals and return-field details, which is heavy given an output schema already exists. Most sentences earn their place, yet the wall-of-text format and repetition of schema-provided details work against scannability.

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?

For a complex, high-cardinality search tool, the description supplies essentially everything an agent needs: scope, ranking rationale, status/currency handling, citation-query behavior, and empty-result reasons. Return fields are explained even though an output schema exists, so nothing material is missing.

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 50%, so the description must compensate. It does so by giving semantics to several `currency_kind` signals (dual-version, superseded-in-part, modified-by, expired) that the schema enum only lists by name, and explains the abbreviation-expansion behavior of `query`. `family` and `limit` restate the schema, limiting the added value.

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?

It opens with a precise verb+resource — 'Full-text search of US mortgage regulator text' — and enumerates the covered agencies, so the domain is unmistakable. The single-result-is-one-section framing clarifies granularity. It stops short of explicitly contrasting itself with siblings like get_reg, find_in_section, or lookup_citation, so the boundary is inferable 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 Guidelines3/5

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

Usage is implied by the broad-corpus scope, but the description never states when to prefer this over get_reg or lookup_citation, nor when a targeted lookup should replace a search. It covers behavioral edge cases (empty results carry `guidance`) but gives no when-to-use/when-not guidance relative to alternatives.

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

start_playbookStart playbookA
Read-onlyIdempotent
Inspect

Returns one playbook's full workflow instructions, its stages, the stage reference names and the rule-kit version: the Fannie Mae AI lender letter (LL-2026-04) P&P review, or FHA, VA or USDA loan-file QC. Input: the playbook id; an unknown id returns unknown_playbook with valid_ids. Playbook tools accept only ids and reference names, no document text; the user's P&Ps and loan files stay in their own chat.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesPlaybook id: one of fnma-ai-lender-letter, fha-underwriting-qc, va-loan-qc, usda-loan-qc.

Output Schema

ParametersJSON Schema
NameRequiredDescription
idNoThe playbook id.
kitNoThe rule kit ({kind, source, version, load_with}).
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.
titleNoThe playbook's name.
noticeNoTerms notice: research use only, not legal advice.
resetsNoOn daily_capacity_reached: when capacity resets (00:00 UTC).
stagesNoThe workflow's stages.
privacyNoHow user material is handled.
versionNoThe playbook's version.
fallbackNoOn daily_capacity_reached: where the full corpus can be downloaded.
guidanceNoOn a refusal or empty search: the server's explanation.
valid_idsNoOn unknown_playbook: the valid ids.
referencesNoThe playbook's reference names.
instructionsNoThe playbook's workflow instructions.
user_providesNoWhat the user supplies.
load_reference_withNoHow a reference is loaded, or null when there are none.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. Beyond that the description discloses the error contract ('unknown id returns `unknown_playbook` with `valid_ids`') and an important scope constraint: playbook tools accept only ids and reference names, never document text, with P&Ps and loan files staying in the user's chat. That is real behavioral context not available in the schema or annotations.

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 return payload is front-loaded, followed by input and then the no-document-text constraint. It is dense but every clause carries information; a small amount of unpacking into separate sentences would improve scanability.

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?

An output schema exists, so return values need not be explained, yet the description still covers the payload shape, the error case, and the data-boundary constraint. It is essentially complete for a single-parameter read tool, with only sibling differentiation left unaddressed.

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 description coverage is 100% and the single `id` parameter already documents its pattern, max length and the four valid values, so the baseline is 3. The description repeats the id-based input model but adds no format or syntax detail beyond the schema.

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 ('Returns one playbook's full workflow instructions, its stages, the stage reference names and the rule-kit version') and enumerates the covered playbook families. It does not, however, explicitly distinguish itself from siblings like list_playbooks, get_playbook_kit or get_playbook_reference, so the agent must infer the difference.

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

Usage Guidelines3/5

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

It specifies the required input ('the playbook `id`') and the failure mode for an unknown id, which implies when the tool applies. But it never says when to choose this over list_playbooks (to discover ids) or the get_playbook_* siblings (to fetch sub-parts), leaving the routing to inference.

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

verify_quoteVerify quoteA
Read-onlyIdempotent
Inspect

Checks whether a passage appears in a regulator's source document; accepts text from any source. Inputs: text (up to 5,000 words); optional register_id (without it, up to 3 candidate documents are located by search). outcome is one of: exact (contiguous in the source, quote marks and dashes as the source writes them; a line break counts as a space); normalized (matches after folding quote and dash typography, typography_folded; ignoring page footers or running heads, furniture_ignored; spacing where the stored source splits or joins words, spacing_ignored; or added list markers, list_markers_ignored); composed (every word is in the source, in source order, but from non-contiguous pieces, as with an overview or an ellipsis; omissions lists the short source phrases skipped between pieces); not_found (no source support; unsupported lists the unsupported spans, and on a near miss differences gives the closest source text, the source words the text lacks and the words it adds); not_checked (over 5,000 words). coverage is the share of words found. checked_against names the documents checked (document, edition, retrieval date; ids in checked_snapshot_ids); matched_against names the one matched, matched_register_id / matched_obligation_id the stored text containing the passage. matched_version is current; superseded (the text is a prior version of the rule; superseded_by is the current register); or update-18-optional (HUD's Update 18 revision of an FHA 4000.1 section, optional until mandatory_date; in_force_obligation_id is the text in force by default). obligation_currency lists currency signals on the obligation holding the text (e.g. superseded-in-part). rescinded: true (with rescinded_by) means the passage is text a later issuance removed or replaced.

ParametersJSON Schema
NameRequiredDescriptionDefault
textYes
register_idNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
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.
limitNoOn not_checked: the word limit.
wordsNoOn not_checked: the word count.
noticeNoTerms notice: research use only, not legal advice.
reasonNoOn not_checked: too_long.
resetsNoOn daily_capacity_reached: when capacity resets (00:00 UTC).
outcomeNoexact: contiguous in the source; normalized: matches after typography, spacing, footer or list-marker folding; composed: all words in source order, non-contiguous; not_found: no source support; not_checked: over 5,000 words.
coverageNoShare of the text's words found in the source (0 to 1).
elisionsNoOn composed: gaps (marked or not).
fallbackNoOn daily_capacity_reached: where the full corpus can be downloaded.
guidanceNoOn a refusal or empty search: the server's explanation.
page_urlNoThe matched section's page on claudeforcompliance.com.
segmentsNoOn composed: source pieces the text is assembled from.
omissionsNoOn composed: short source phrases skipped between pieces.
source_urlNoThe regulator's URL for the matched section's document.
differencesNoOn a near miss: {closest_source, missing_from_quote, extra_in_quote}.
register_idNoEchoed on not_found.
unsupportedNoOn not_found: spans with no source support.
superseded_byNoOn superseded: the current register.
mandatory_dateNoOn an Update 18 revision: when it becomes mandatory.
checked_againstNoSource documents checked (document, edition, retrieval date).
matched_againstNoThe checked document the text matched.
matched_versionNocurrent, superseded (a prior version) or update-18-optional.
spacing_ignoredNoOnly spacing differs.
furniture_ignoredNoA page footer or running head was ignored.
typography_foldedNoMatched after folding quotes and dashes.
matched_register_idNoThe register whose stored text contains the passage.
checked_snapshot_idsNoSnapshot ids checked.
list_markers_ignoredNoAdded list markers were ignored.
also_in_obligation_idNoOn a match in an amending issuance: the amended obligation that also carries the text.
matched_obligation_idNoThe obligation whose stored text contains the passage.
superseded_register_idNoOn superseded: the register holding the prior text.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds genuine behavioral context beyond that: the 5,000-word ceiling that yields not_checked, and the fallback search behavior when `register_id` is omitted.

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

Conciseness3/5

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

The purpose and inputs are front-loaded, which is good, but the bulk of the text is a dense run-on enumeration of output fields and enum values (outcome, coverage, checked_against, matched_version, rescinded, etc.) crammed into a single paragraph. Since an output schema exists, much of this enumeration risks duplicating structured data.

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?

Inputs, limits, and fallback behavior are all present, and the tool is a read-only check with no destructive side effects to warn about. With an output schema present, the description arguably over-delivers on return values rather than under-delivering.

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 description coverage is 0%, so the description must carry the load, and it does: `text` is bounded at 5,000 words and `register_id` is optional with a defined fallback ('up to 3 candidate documents are located by search'). Format expectations for `register_id` (an id) are only loosely implied.

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 opening sentence gives a specific verb+resource ('checks whether a passage appears in a regulator's source document') and adds scope ('accepts text from any source'). It is clearly distinguishable from siblings like lookup_citation or find_in_section, though it never names them explicitly.

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

Usage Guidelines3/5

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

Usage context is implied rather than stated: it explains what happens with and without `register_id` (up to 3 candidate documents located by search), which hints at when to supply it. There is no explicit when-to-use/when-not or routing to an alternative sibling tool.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 4 tool updates
    • Changedget_obligation8 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"
        +}
    • Changedget_reg7 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 / 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"
        +}
    • Changedlookup_citation6 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 / 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"
        +}
    • Changedsearch_regs2 fields changed
      • addedInput schema / properties / family / description
        Added value: +"hud = HUD/FHA Single Family (Handbook 4000.1, Mortgagee Letters); hudmf = HUD/FHA Multifamily (MAP Guide 4430.G, multifamily Mortgagee Letters); va; fnma = Fannie Mae; fhlmc = Freddie Mac; gnma = Ginnie Mae; usda; sba."
      • changedInput schema / properties / family / enum
        Previous value: -[
        -  "hud",
        -  "va",
        -  "fnma",
        -  "fhlmc",
        -  "gnma",
        -  "usda",
        -  "sba"
        -]New value: +[
        +  "hud",
        +  "hudmf",
        +  "va",
        +  "fnma",
        +  "fhlmc",
        +  "gnma",
        +  "usda",
        +  "sba"
        +]
  2. 1 tool update
    • Changedlookup_citation1 field changed
      • addedOutput schema / properties / obligations
        Added value: +{
        +  "description": "The register's sections ({obligation_id, section}; when no text is inlined, `opening`: the first words of the section's verbatim text, cut and marked with ...)."
        +}
  3. 6 tool updates
    • Changedfind_in_section1 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"
        +}
    • Changedget_obligation1 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"
        +}
    • Changedget_reg2 fields 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"
        +}
      • addedOutput schema / properties / source_url
        Added value: +{
        +  "description": "The regulator's URL for the document.",
        +  "type": "string"
        +}
    • Changedlookup_citation2 fields 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"
        +}
      • addedOutput schema / properties / source_url
        Added value: +{
        +  "description": "The regulator's URL for the resolved section's document.",
        +  "type": "string"
        +}
    • Changedsearch_regs2 fields changed
      • addedOutput schema / properties / results / items / properties / page_url
        Added value: +{
        +  "description": "The section's page on claudeforcompliance.com (verbatim text, currency notices, link to the regulator).",
        +  "type": "string"
        +}
      • addedOutput schema / properties / results / items / properties / source_url
        Added value: +{
        +  "description": "The regulator's URL for the document.",
        +  "type": "string"
        +}
    • Changedverify_quote2 fields changed
      • addedOutput schema / properties / page_url
        Added value: +{
        +  "description": "The matched section's page on claudeforcompliance.com.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / source_url
        Added value: +{
        +  "description": "The regulator's URL for the matched section's document.",
        +  "type": "string"
        +}
  4. 1 tool update
    • Changedsearch_regs1 field changed
      • changedInput schema / properties / currency_kind / enum
        Previous value: -[
        -  "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",
        -  "superseded-in-part",
        -  "modified-by",
        -  "deleted",
        -  "optional-now",
        -  "amends",
        -  "time-limited"
        -]New value: +[
        +  "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",
        +  "superseded-in-part",
        +  "modified-by",
        +  "deleted",
        +  "optional-now",
        +  "amends",
        +  "time-limited",
        +  "note"
        +]
  5. 2 tool updates
    • Changedget_obligation2 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."
    • Changedverify_quote4 fields changed
      • addedOutput schema / properties / also_in_obligation_id
        Added value: +{
        +  "description": "On a match in an amending issuance: the amended obligation that also carries the text.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / matched_against
        Added value: +{
        +  "description": "The checked document the text matched.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / matched_obligation_id
        Added value: +{
        +  "description": "The obligation whose stored text contains the passage.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / matched_register_id
        Added value: +{
        +  "description": "The register whose stored text contains the passage.",
        +  "type": "string"
        +}
  6. 10 tool updates
    • Changedfind_in_section2 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"
        +}
    • Changedget_obligation2 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"
        +}
    • Changedget_playbook_kit1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": {},
        +  "description": "get_playbook_kit result.",
        +  "properties": {
        +    "areas": {
        +      "description": "For a corpus-register kit: its areas and registers."
        +    },
        +    "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"
        +    },
        +    "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"
        +    },
        +    "how_to_read": {
        +      "description": "For a corpus-register kit: the server's reading note.",
        +      "type": "string"
        +    },
        +    "id": {
        +      "description": "The playbook id.",
        +      "type": "string"
        +    },
        +    "kit": {
        +      "description": "The kit's kind, source and version."
        +    },
        +    "next_offset": {
        +      "description": "The next page's offset, or null when the kit is complete.",
        +      "type": [
        +        "number",
        +        "null"
        +      ]
        +    },
        +    "note": {
        +      "description": "A note on this result.",
        +      "type": "string"
        +    },
        +    "notice": {
        +      "description": "Terms notice: research use only, not legal advice.",
        +      "type": "string"
        +    },
        +    "offset": {
        +      "description": "Where this page starts.",
        +      "type": "number"
        +    },
        +    "resets": {
        +      "description": "On daily_capacity_reached: when capacity resets (00:00 UTC).",
        +      "type": "string"
        +    },
        +    "rows": {
        +      "description": "Kit rows: verbatim rule text with citations."
        +    },
        +    "rows_returned": {
        +      "description": "Rows in this page.",
        +      "type": "number"
        +    },
        +    "rows_total": {
        +      "description": "Rows in the kit.",
        +      "type": "number"
        +    },
        +    "search_family": {
        +      "description": "For a corpus-register kit: its search family."
        +    },
        +    "valid_ids": {
        +      "description": "On unknown_playbook: the valid ids.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_playbook_reference2 fields changed
      • changedInput schema / properties / name / description
        Previous value: -"Reference name, as listed by start_playbook's `references`."New value: +"Reference name, one of the playbook's `references`."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": {},
        +  "description": "get_playbook_reference result.",
        +  "properties": {
        +    "content": {
        +      "description": "The reference's content."
        +    },
        +    "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"
        +    },
        +    "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"
        +    },
        +    "id": {
        +      "description": "The playbook id.",
        +      "type": "string"
        +    },
        +    "name": {
        +      "description": "The reference name.",
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "A note on this result.",
        +      "type": "string"
        +    },
        +    "notice": {
        +      "description": "Terms notice: research use only, not legal advice.",
        +      "type": "string"
        +    },
        +    "resets": {
        +      "description": "On daily_capacity_reached: when capacity resets (00:00 UTC).",
        +      "type": "string"
        +    },
        +    "valid_ids": {
        +      "description": "On unknown_playbook: the valid ids.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "valid_names": {
        +      "description": "On unknown_reference: the valid names.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedget_reg1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": {},
        +  "description": "get_reg result.",
        +  "properties": {
        +    "also_at": {
        +      "description": "Same-text copies of this register.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "authority": {
        +      "description": "The document title.",
        +      "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"
        +    },
        +    "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"
        +    },
        +    "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"
        +    },
        +    "note": {
        +      "description": "A note on this result.",
        +      "type": "string"
        +    },
        +    "notice": {
        +      "description": "Terms notice: research use only, not legal advice.",
        +      "type": "string"
        +    },
        +    "obligation_id": {
        +      "description": "Echoed on error.",
        +      "type": "string"
        +    },
        +    "obligations": {
        +      "description": "The register's obligations (a manifest, not regulator text).",
        +      "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_total": {
        +            "description": "Length of the section's text in characters.",
        +            "type": "number"
        +          },
        +          "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."
        +          },
        +          "mandatory_date": {
        +            "description": "On an Update 18 revision: when it becomes mandatory.",
        +            "type": "string"
        +          },
        +          "obligation_id": {
        +            "description": "The obligation (section) id.",
        +            "type": "string"
        +          },
        +          "other_version": {
        +            "description": "On a dual-version section: the other version's obligation_id.",
        +            "type": "string"
        +          },
        +          "section": {
        +            "description": "The section designation or title.",
        +            "type": "string"
        +          },
        +          "version": {
        +            "description": "On a dual-version FHA section: \"in-force\" or \"update-18-optional\".",
        +            "type": "string"
        +          },
        +          "will_truncate": {
        +            "description": "The section exceeds one 24,000-char page.",
        +            "type": "boolean"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "register_id": {
        +      "description": "The register id.",
        +      "type": "string"
        +    },
        +    "resets": {
        +      "description": "On daily_capacity_reached: when capacity resets (00:00 UTC).",
        +      "type": "string"
        +    },
        +    "status": {
        +      "description": "E.g. current, superseded, unknown.",
        +      "type": "string"
        +    },
        +    "superseded_by": {
        +      "description": "The replacing register, or null.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlist_playbooks1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": {},
        +  "description": "list_playbooks result.",
        +  "properties": {
        +    "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"
        +    },
        +    "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": {
        +      "description": "The server's note on the next step.",
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "A note on this result.",
        +      "type": "string"
        +    },
        +    "notice": {
        +      "description": "Terms notice: research use only, not legal advice.",
        +      "type": "string"
        +    },
        +    "playbooks": {
        +      "description": "The available playbooks.",
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "id": {
        +            "description": "The playbook id.",
        +            "type": "string"
        +          },
        +          "prompt": {
        +            "description": "The matching MCP prompt name.",
        +            "type": "string"
        +          },
        +          "title": {
        +            "description": "The playbook's name.",
        +            "type": "string"
        +          },
        +          "user_provides": {
        +            "description": "What the user supplies."
        +          },
        +          "version": {
        +            "description": "The playbook's version."
        +          },
        +          "what": {
        +            "description": "What it does.",
        +            "type": "string"
        +          },
        +          "when": {
        +            "description": "When it applies.",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "privacy": {
        +      "description": "How user material is handled."
        +    },
        +    "resets": {
        +      "description": "On daily_capacity_reached: when capacity resets (00:00 UTC).",
        +      "type": "string"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedlookup_citation1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": {},
        +  "description": "lookup_citation result.",
        +  "properties": {
        +    "also_at": {
        +      "description": "Identical copies of the section (other register ids).",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "also_at_note": {
        +      "description": "Explains also_at.",
        +      "type": "string"
        +    },
        +    "candidates": {
        +      "description": "On ambiguous: the registers the citation could mean.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "canonical_id": {
        +      "description": "Set when the register is a same-text copy of that register.",
        +      "type": "string"
        +    },
        +    "citation": {
        +      "description": "The citation as given (on unparsed).",
        +      "type": "string"
        +    },
        +    "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"
        +    },
        +    "guidance": {
        +      "description": "On a refusal or empty search: the server's explanation.",
        +      "type": "string"
        +    },
        +    "handbook": {
        +      "description": "When the citation names a whole handbook: its outline."
        +    },
        +    "hint": {
        +      "description": "On an error: the server's explanation.",
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "A note on this result.",
        +      "type": "string"
        +    },
        +    "notice": {
        +      "description": "Terms notice: research use only, not legal advice.",
        +      "type": "string"
        +    },
        +    "parsed": {
        +      "description": "The parse of the citation ({kind, canonical, ...})."
        +    },
        +    "register_id": {
        +      "description": "The register the citation resolves to.",
        +      "type": "string"
        +    },
        +    "related": {
        +      "description": "Documents that cite or amend the section ({register_id, relation}); not its text."
        +    },
        +    "related_note": {
        +      "description": "Explains related.",
        +      "type": "string"
        +    },
        +    "renumbered_from": {
        +      "description": "The old register, when the section was renumbered.",
        +      "type": "string"
        +    },
        +    "resets": {
        +      "description": "On daily_capacity_reached: when capacity resets (00:00 UTC).",
        +      "type": "string"
        +    },
        +    "superseded_candidates": {
        +      "description": "Candidates dropped because a current register replaces them.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "superseded_register_id": {
        +      "description": "The register holding the prior text of this section.",
        +      "type": "string"
        +    },
        +    "topics": {
        +      "description": "Topics under a structured citation."
        +    },
        +    "truncated": {
        +      "description": "The candidate scan hit its limit.",
        +      "type": "boolean"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedsearch_regs2 fields changed
      • changedInput schema / properties / currency_kind / description
        Previous value: -"Only sections carrying this currency signal, e.g. \"dual-version\", \"pending\", \"revision-pending\"; \"any\" for any signal."New value: +"Restricts results to sections carrying this currency signal; \"any\" = any signal."
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": {},
        +  "description": "search_regs result.",
        +  "properties": {
        +    "cited": {
        +      "description": "When the query is a citation: {citation, register_ids}."
        +    },
        +    "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"
        +    },
        +    "guidance": {
        +      "description": "On a refusal or empty search: the server's explanation.",
        +      "type": "string"
        +    },
        +    "handbook": {
        +      "description": "When the query names a whole handbook: its outline."
        +    },
        +    "hint": {
        +      "description": "On an error: the server's explanation.",
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "A note on this result.",
        +      "type": "string"
        +    },
        +    "notice": {
        +      "description": "Terms notice: research use only, not legal advice.",
        +      "type": "string"
        +    },
        +    "reason": {
        +      "description": "With empty results: empty_query, no_match or no_match_above_threshold.",
        +      "type": "string"
        +    },
        +    "resets": {
        +      "description": "On daily_capacity_reached: when capacity resets (00:00 UTC).",
        +      "type": "string"
        +    },
        +    "results": {
        +      "description": "Ranked sections, highest rank_score first (may be empty).",
        +      "items": {
        +        "additionalProperties": {},
        +        "properties": {
        +          "also_at": {
        +            "description": "Same-text copies dropped from the list."
        +          },
        +          "authority": {
        +            "description": "The document and section title.",
        +            "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"
        +            ]
        +          },
        +          "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."
        +          },
        +          "excerpt": {
        +            "description": "A verbatim fragment near the match; not the whole rule.",
        +            "type": "string"
        +          },
        +          "mandatory_date": {
        +            "description": "On an Update 18 revision: when it becomes mandatory.",
        +            "type": "string"
        +          },
        +          "match": {
        +            "description": "all_terms or partial.",
        +            "type": "string"
        +          },
        +          "missing_terms": {
        +            "description": "On partial: the query terms this section lacks.",
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "obligation_id": {
        +            "description": "The obligation (section) id.",
        +            "type": "string"
        +          },
        +          "obligation_type": {
        +            "description": "note or index: not rule text.",
        +            "type": "string"
        +          },
        +          "other_version": {
        +            "description": "On a dual-version section: the other version's obligation_id.",
        +            "type": "string"
        +          },
        +          "rank_score": {
        +            "description": "The score results are ordered by.",
        +            "type": "number"
        +          },
        +          "register_id": {
        +            "description": "The register id.",
        +            "type": "string"
        +          },
        +          "section": {
        +            "description": "The section title.",
        +            "type": "string"
        +          },
        +          "section_status": {
        +            "description": "\"deleted\": a deleted-section stub.",
        +            "type": "string"
        +          },
        +          "section_status_date": {
        +            "description": "Date of section_status.",
        +            "type": "string"
        +          },
        +          "special_program": {
        +            "description": "The special program this section belongs to (ranked x0.5).",
        +            "type": "string"
        +          },
        +          "version": {
        +            "description": "On a dual-version FHA section: \"in-force\" or \"update-18-optional\".",
        +            "type": "string"
        +          }
        +        },
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedstart_playbook1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": {},
        +  "description": "start_playbook result.",
        +  "properties": {
        +    "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"
        +    },
        +    "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"
        +    },
        +    "id": {
        +      "description": "The playbook id.",
        +      "type": "string"
        +    },
        +    "instructions": {
        +      "description": "The playbook's workflow instructions."
        +    },
        +    "kit": {
        +      "description": "The rule kit ({kind, source, version, load_with})."
        +    },
        +    "load_reference_with": {
        +      "description": "How a reference is loaded, or null when there are none.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "note": {
        +      "description": "A note on this result.",
        +      "type": "string"
        +    },
        +    "notice": {
        +      "description": "Terms notice: research use only, not legal advice.",
        +      "type": "string"
        +    },
        +    "privacy": {
        +      "description": "How user material is handled."
        +    },
        +    "references": {
        +      "description": "The playbook's reference names.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "resets": {
        +      "description": "On daily_capacity_reached: when capacity resets (00:00 UTC).",
        +      "type": "string"
        +    },
        +    "stages": {
        +      "description": "The workflow's stages."
        +    },
        +    "title": {
        +      "description": "The playbook's name.",
        +      "type": "string"
        +    },
        +    "user_provides": {
        +      "description": "What the user supplies."
        +    },
        +    "valid_ids": {
        +      "description": "On unknown_playbook: the valid ids.",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "version": {
        +      "description": "The playbook's version."
        +    }
        +  },
        +  "type": "object"
        +}
    • Changedverify_quote1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "https://json-schema.org/draft/2020-12/schema",
        +  "additionalProperties": {},
        +  "description": "verify_quote result.",
        +  "properties": {
        +    "checked_against": {
        +      "description": "Source documents checked (document, edition, retrieval date)."
        +    },
        +    "checked_snapshot_ids": {
        +      "description": "Snapshot ids checked."
        +    },
        +    "coverage": {
        +      "description": "Share of the text's words found in the source (0 to 1).",
        +      "type": "number"
        +    },
        +    "differences": {
        +      "description": "On a near miss: {closest_source, missing_from_quote, extra_in_quote}."
        +    },
        +    "elisions": {
        +      "description": "On composed: gaps (marked or not).",
        +      "type": "number"
        +    },
        +    "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"
        +    },
        +    "furniture_ignored": {
        +      "description": "A page footer or running head was ignored.",
        +      "type": "boolean"
        +    },
        +    "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"
        +    },
        +    "limit": {
        +      "description": "On not_checked: the word limit.",
        +      "type": "number"
        +    },
        +    "list_markers_ignored": {
        +      "description": "Added list markers were ignored.",
        +      "type": "boolean"
        +    },
        +    "mandatory_date": {
        +      "description": "On an Update 18 revision: when it becomes mandatory.",
        +      "type": "string"
        +    },
        +    "matched_version": {
        +      "description": "current, superseded (a prior version) or update-18-optional.",
        +      "type": "string"
        +    },
        +    "note": {
        +      "description": "A note on this result.",
        +      "type": "string"
        +    },
        +    "notice": {
        +      "description": "Terms notice: research use only, not legal advice.",
        +      "type": "string"
        +    },
        +    "omissions": {
        +      "description": "On composed: short source phrases skipped between pieces."
        +    },
        +    "outcome": {
        +      "description": "exact: contiguous in the source; normalized: matches after typography, spacing, footer or list-marker folding; composed: all words in source order, non-contiguous; not_found: no source support; not_checked: over 5,000 words.",
        +      "enum": [
        +        "exact",
        +        "normalized",
        +        "composed",
        +        "not_found",
        +        "not_checked"
        +      ],
        +      "type": "string"
        +    },
        +    "reason": {
        +      "description": "On not_checked: too_long.",
        +      "type": "string"
        +    },
        +    "register_id": {
        +      "description": "Echoed on not_found.",
        +      "type": "string"
        +    },
        +    "resets": {
        +      "description": "On daily_capacity_reached: when capacity resets (00:00 UTC).",
        +      "type": "string"
        +    },
        +    "segments": {
        +      "description": "On composed: source pieces the text is assembled from.",
        +      "type": "number"
        +    },
        +    "spacing_ignored": {
        +      "description": "Only spacing differs.",
        +      "type": "boolean"
        +    },
        +    "superseded_by": {
        +      "description": "On superseded: the current register.",
        +      "type": [
        +        "string",
        +        "null"
        +      ]
        +    },
        +    "superseded_register_id": {
        +      "description": "On superseded: the register holding the prior text.",
        +      "type": "string"
        +    },
        +    "typography_folded": {
        +      "description": "Matched after folding quotes and dashes.",
        +      "type": "boolean"
        +    },
        +    "unsupported": {
        +      "description": "On not_found: spans with no source support."
        +    },
        +    "words": {
        +      "description": "On not_checked: the word count.",
        +      "type": "number"
        +    }
        +  },
        +  "type": "object"
        +}
  7. 1 tool update
    • Changedsearch_regs1 field changed
      • changedInput schema / properties / currency_kind / enum
        Previous value: -[
        -  "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",
        -  "superseded-in-part",
        -  "modified-by",
        -  "deleted"
        -]New value: +[
        +  "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",
        +  "superseded-in-part",
        +  "modified-by",
        +  "deleted",
        +  "optional-now",
        +  "amends",
        +  "time-limited"
        +]
  8. 1 tool update
    • Changedsearch_regs1 field changed
      • changedInput schema / properties / currency_kind / enum
        Previous value: -[
        -  "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"
        -]New value: +[
        +  "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",
        +  "superseded-in-part",
        +  "modified-by",
        +  "deleted"
        +]
  9. 2 tool updates
    • Changedget_obligation1 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"
        +}
    • Changedsearch_regs1 field changed
      • addedInput schema / properties / currency_kind
        Added value: +{
        +  "description": "Only sections carrying this currency signal, e.g. \"dual-version\", \"pending\", \"revision-pending\"; \"any\" for any signal.",
        +  "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"
        +  ],
        +  "type": "string"
        +}
  10. 10 tool updates
    • First observedfind_in_section
    • First observedget_obligation
    • First observedget_playbook_kit
    • First observedget_playbook_reference
    • First observedget_reg
    • First observedlist_playbooks
    • First observedlookup_citation
    • First observedsearch_regs
    • First observedstart_playbook
    • First observedverify_quote

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    maintenance
    Enables searching and reading the US Code of Federal Regulations through tools that return excerpts, full text, legal citations, and linked source URLs, with read-only, stateless access.
    3
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables agent clients to perform read-only regulatory retrieval through tools for searching the corpus, retrieving source text, tracing citations, listing authorities, and inspecting recent filings. It is designed to keep regulated actions and workspace changes behind human review gates.
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables searching, browsing, and retrieving current US Code of Federal Regulations text—including full-text search across all 50 titles, title structures, and exact section or part wording—via the official eCFR API.
    20 npm
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.