C4C: Mortgage Industry Regulations
Server Details
Verbatim U.S. mortgage regulatory text with citations and effective dates. Read-only, no sign-in.
- 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
Scored across 10 tools
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.
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.
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).
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 toolsfind_in_sectionFind in sectionARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| terms | Yes | 1-6 short terms, e.g. ["cash-out", "credit score"]; not document text. | |
| max_passages | No | ||
| obligation_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | On an error: the server's explanation. |
| note | No | A note on this result. |
| error | No | Present only on an error or refusal: not_found, ambiguous, unparsed, empty_terms, unknown_playbook, unknown_reference, offset_out_of_range, daily_capacity_reached. |
| terms | No | Per-term match counts. |
| notice | No | Terms notice: research use only, not legal advice. |
| resets | No | On daily_capacity_reached: when capacity resets (00:00 UTC). |
| status | No | E.g. current, superseded, unknown. |
| section | No | The section designation. |
| version | No | On a dual-version section: {label: in-force | update-18-optional, dates, note}. |
| currency | No | 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. |
| fallback | No | On daily_capacity_reached: where the full corpus can be downloaded. |
| guidance | No | On a refusal or empty search: the server's explanation. |
| page_url | No | The section's page on claudeforcompliance.com (verbatim text, currency notices, link to the regulator). |
| passages | No | Matching verbatim passages, in section order. |
| authority | No | The document and section title as published. |
| truncated | No | More passages matched than were returned. |
| alias_note | No | Explains resolved_from_alias. |
| fetched_at | No | When the source was retrieved. |
| source_url | No | The regulator's URL for the document. |
| chars_total | No | The section's total length. |
| register_id | No | The register (source document) id. |
| snapshot_id | No | The stored source snapshot. |
| toc_omitted | No | The section's table-of-contents line was omitted. |
| canonical_id | No | Set when this register is a same-text copy of that register. |
| content_hash | No | Hash of the stored text. |
| matches_note | No | How total_matches became passages_available. |
| coverage_tier | No | How completely the corpus holds the document. |
| obligation_id | No | The obligation (section) id. |
| other_version | No | On a dual-version section: the other version ({obligation_id, version, dates}). |
| superseded_by | No | The replacing register, or null. |
| total_matches | No | Matching paragraphs. |
| effective_date | No | Effective date, or null. |
| merged_into_lists | No | Matching paragraphs merged into lists with their lead-in. |
| passages_returned | No | Passages in this response. |
| canonical_citation | No | The citation in the regulator's style (e.g. "4000.1 II.A.5.d", "B3-3.3-07"), or null. |
| merged_into_tables | No | Matching paragraphs merged into whole tables. |
| passages_available | No | Passages the matches make (tables and lists merged). |
| resolved_from_alias | No | The retired obligation id requested; its text is now at obligation_id. |
TDQS
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.
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.
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.
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.
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.
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 obligationARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max chars to return from offset (200-24000; default 24000). | |
| offset | No | ||
| obligation_id | Yes | ||
| compare_versions | No | On an FHA section Update 18 revises: also return `version_changes`, the sentences Update 18 deletes and adds (verbatim units with offsets). |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | On an error: the server's explanation. |
| kind | No | "renumbered": the regulator gave this section a new number; no text is given under the old one. |
| note | No | A note on this result. |
| error | No | Present only on an error or refusal: not_found, ambiguous, unparsed, empty_terms, unknown_playbook, unknown_reference, offset_out_of_range, daily_capacity_reached. |
| notice | No | Terms notice: research use only, not legal advice. |
| paging | No | Page N of M. |
| resets | No | On daily_capacity_reached: when capacity resets (00:00 UTC). |
| status | No | E.g. current, superseded, unknown. |
| figures | No | Best-effort extraction of figures in the text; an empty or incomplete list is not evidence that the text states no figure. |
| section | No | The section designation. |
| version | No | On a dual-version section: {label: in-force | update-18-optional, dates, note}. |
| currency | No | 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. |
| fallback | No | On daily_capacity_reached: where the full corpus can be downloaded. |
| guidance | No | On a refusal or empty search: the server's explanation. |
| page_url | No | The section's page on claudeforcompliance.com (verbatim text, currency notices, link to the regulator). |
| verbatim | No | The regulator's exact text, between <<<BEGIN VERBATIM>>> and <<<END VERBATIM>>>. |
| authority | No | The document and section title as published. |
| editorial | No | Reserved; summary is null (the text is not summarized). |
| truncated | No | More text follows this response. |
| alias_note | No | Explains resolved_from_alias. |
| fetched_at | No | When the source was retrieved. |
| source_url | No | The regulator's URL for the document. |
| chars_total | No | The section's total length. |
| next_offset | No | The next page's offset, or null when the section ends here. |
| obligations | No | On kind renumbered: the new register's sections ({obligation_id, section}), no text. |
| register_id | No | The register (source document) id. |
| snapshot_id | No | The stored source snapshot. |
| canonical_id | No | Set when this register is a same-text copy of that register. |
| chars_offset | No | Where this response starts in the section's text. |
| content_hash | No | Hash of the stored text. |
| requested_id | No | On kind renumbered: the old id asked for. |
| text_changed | No | On kind renumbered: false when the text moved word for word. |
| coverage_tier | No | How completely the corpus holds the document. |
| obligation_id | No | The obligation (section) id. |
| other_version | No | On a dual-version section: the other version ({obligation_id, version, dates}). |
| renumbered_in | No | On kind renumbered: the regulator's posting that renumbered it. |
| renumbered_on | No | On kind renumbered: when (YYYY-MM). |
| superseded_by | No | The replacing register, or null. |
| chars_returned | No | Characters of text in this response. |
| effective_date | No | Effective date, or null. |
| renumbered_from | No | The old register, when the section was renumbered. |
| version_changes | No | With compare_versions: sentences Update 18 deletes and adds, or {error: "single_version"}. |
| canonical_citation | No | The citation in the regulator's style (e.g. "4000.1 II.A.5.d", "B3-3.3-07"), or null. |
| resolved_from_alias | No | The retired obligation id requested; its text is now at obligation_id. |
| started_mid_section | No | Text before chars_offset is not in this response. |
| renumbered_from_citation | No | On kind renumbered: the section's old citation. |
TDQS
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.
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.
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.
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.
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.
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 kitARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Playbook id: one of fnma-ai-lender-letter, fha-underwriting-qc, va-loan-qc, usda-loan-qc. | |
| offset | No | Row offset for the next page (the previous page's next_offset). |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The playbook id. |
| kit | No | The kit's kind, source and version. |
| hint | No | On an error: the server's explanation. |
| note | No | A note on this result. |
| rows | No | Kit rows: verbatim rule text with citations. |
| areas | No | For a corpus-register kit: its areas and registers. |
| error | No | Present only on an error or refusal: not_found, ambiguous, unparsed, empty_terms, unknown_playbook, unknown_reference, offset_out_of_range, daily_capacity_reached. |
| notice | No | Terms notice: research use only, not legal advice. |
| offset | No | Where this page starts. |
| resets | No | On daily_capacity_reached: when capacity resets (00:00 UTC). |
| fallback | No | On daily_capacity_reached: where the full corpus can be downloaded. |
| guidance | No | On a refusal or empty search: the server's explanation. |
| valid_ids | No | On unknown_playbook: the valid ids. |
| rows_total | No | Rows in the kit. |
| how_to_read | No | For a corpus-register kit: the server's reading note. |
| next_offset | No | The next page's offset, or null when the kit is complete. |
| rows_returned | No | Rows in this page. |
| search_family | No | For a corpus-register kit: its search family. |
TDQS
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.
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.
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.
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.
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.
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 referenceARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Playbook id: one of fnma-ai-lender-letter, fha-underwriting-qc, va-loan-qc, usda-loan-qc. | |
| name | Yes | Reference name, one of the playbook's `references`. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The playbook id. |
| hint | No | On an error: the server's explanation. |
| name | No | The reference name. |
| note | No | A note on this result. |
| error | No | Present only on an error or refusal: not_found, ambiguous, unparsed, empty_terms, unknown_playbook, unknown_reference, offset_out_of_range, daily_capacity_reached. |
| notice | No | Terms notice: research use only, not legal advice. |
| resets | No | On daily_capacity_reached: when capacity resets (00:00 UTC). |
| content | No | The reference's content. |
| fallback | No | On daily_capacity_reached: where the full corpus can be downloaded. |
| guidance | No | On a refusal or empty search: the server's explanation. |
| valid_ids | No | On unknown_playbook: the valid ids. |
| valid_names | No | On unknown_reference: the valid names. |
TDQS
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.
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.
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.
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.
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.
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 regulationBRead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| register_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | On an error: the server's explanation. |
| kind | No | "renumbered": the regulator gave this section a new number; no text is given under the old one. |
| note | No | A note on this result. |
| error | No | Present only on an error or refusal: not_found, ambiguous, unparsed, empty_terms, unknown_playbook, unknown_reference, offset_out_of_range, daily_capacity_reached. |
| notice | No | Terms notice: research use only, not legal advice. |
| resets | No | On daily_capacity_reached: when capacity resets (00:00 UTC). |
| status | No | E.g. current, superseded, unknown. |
| also_at | No | Same-text copies of this register. |
| currency | No | 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. |
| fallback | No | On daily_capacity_reached: where the full corpus can be downloaded. |
| guidance | No | On a refusal or empty search: the server's explanation. |
| page_url | No | The section's page on claudeforcompliance.com (verbatim text, currency notices, link to the regulator). |
| authority | No | The document title. |
| source_url | No | The regulator's URL for the document. |
| obligations | No | The register's obligations (a manifest, not regulator text). |
| register_id | No | The register id. |
| canonical_id | No | Set when this register is a same-text copy of that register. |
| requested_id | No | On kind renumbered: the old id asked for. |
| text_changed | No | On kind renumbered: false when the text moved word for word. |
| coverage_tier | No | How completely the corpus holds the document. |
| obligation_id | No | Echoed on error. |
| renumbered_in | No | On kind renumbered: the regulator's posting that renumbered it. |
| renumbered_on | No | On kind renumbered: when (YYYY-MM). |
| superseded_by | No | The replacing register, or null. |
| effective_date | No | Effective date, or null. |
| renumbered_from | No | The old register, when the section was renumbered. |
| canonical_citation | No | The citation in the regulator's style (e.g. "4000.1 II.A.5.d", "B3-3.3-07"), or null. |
| renumbered_from_citation | No | On kind renumbered: the section's old citation. |
TDQS
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.
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.
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.
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.
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.
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 playbooksARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | On an error: the server's explanation. |
| next | No | The server's note on the next step. |
| note | No | A note on this result. |
| error | No | Present only on an error or refusal: not_found, ambiguous, unparsed, empty_terms, unknown_playbook, unknown_reference, offset_out_of_range, daily_capacity_reached. |
| notice | No | Terms notice: research use only, not legal advice. |
| resets | No | On daily_capacity_reached: when capacity resets (00:00 UTC). |
| privacy | No | How user material is handled. |
| fallback | No | On daily_capacity_reached: where the full corpus can be downloaded. |
| guidance | No | On a refusal or empty search: the server's explanation. |
| playbooks | No | The available playbooks. |
TDQS
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.
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.
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.
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.
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.
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 citationARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| citation | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | On an error: the server's explanation. |
| kind | No | "renumbered": the regulator gave this section a new number; no text is given under the old one. |
| note | No | A note on this result. |
| error | No | Present only on an error or refusal: not_found, ambiguous, unparsed, empty_terms, unknown_playbook, unknown_reference, offset_out_of_range, daily_capacity_reached. |
| notice | No | Terms notice: research use only, not legal advice. |
| parsed | No | The parse of the citation ({kind, canonical, ...}). |
| resets | No | On daily_capacity_reached: when capacity resets (00:00 UTC). |
| topics | No | Topics under a structured citation. |
| also_at | No | Identical copies of the section (other register ids). |
| related | No | Documents that cite or amend the section ({register_id, relation}); not its text. |
| citation | No | The citation as given (on unparsed). |
| fallback | No | On daily_capacity_reached: where the full corpus can be downloaded. |
| guidance | No | On a refusal or empty search: the server's explanation. |
| handbook | No | When the citation names a whole handbook: its outline. |
| page_url | No | The section's page on claudeforcompliance.com (verbatim text, currency notices, link to the regulator). |
| truncated | No | The candidate scan hit its limit. |
| candidates | No | On ambiguous: the registers the citation could mean. |
| source_url | No | The regulator's URL for the resolved section's document. |
| obligations | No | 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 ...). |
| register_id | No | The register the citation resolves to. |
| also_at_note | No | Explains also_at. |
| canonical_id | No | Set when the register is a same-text copy of that register. |
| related_note | No | Explains related. |
| requested_id | No | On kind renumbered: the old id asked for. |
| text_changed | No | On kind renumbered: false when the text moved word for word. |
| renumbered_in | No | On kind renumbered: the regulator's posting that renumbered it. |
| renumbered_on | No | On kind renumbered: when (YYYY-MM). |
| renumbered_from | No | The old register, when the section was renumbered. |
| superseded_candidates | No | Candidates dropped because a current register replaces them. |
| superseded_register_id | No | The register holding the prior text of this section. |
| renumbered_from_citation | No | On kind renumbered: the section's old citation. |
TDQS
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.
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.
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.
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.
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.
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 regulationsARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| query | Yes | ||
| family | No | 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. | |
| currency_kind | No | Restricts results to sections carrying this currency signal; "any" = any signal. |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | On an error: the server's explanation. |
| note | No | A note on this result. |
| cited | No | When the query is a citation: {citation, register_ids}. |
| error | No | Present only on an error or refusal: not_found, ambiguous, unparsed, empty_terms, unknown_playbook, unknown_reference, offset_out_of_range, daily_capacity_reached. |
| notice | No | Terms notice: research use only, not legal advice. |
| reason | No | With empty results: empty_query, no_match or no_match_above_threshold. |
| resets | No | On daily_capacity_reached: when capacity resets (00:00 UTC). |
| results | No | Ranked sections, highest rank_score first (may be empty). |
| fallback | No | On daily_capacity_reached: where the full corpus can be downloaded. |
| guidance | No | On a refusal or empty search: the server's explanation. |
| handbook | No | When the query names a whole handbook: its outline. |
TDQS
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.
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.
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.
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.
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.
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 playbookARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Playbook id: one of fnma-ai-lender-letter, fha-underwriting-qc, va-loan-qc, usda-loan-qc. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | The playbook id. |
| kit | No | The rule kit ({kind, source, version, load_with}). |
| hint | No | On an error: the server's explanation. |
| note | No | A note on this result. |
| error | No | Present only on an error or refusal: not_found, ambiguous, unparsed, empty_terms, unknown_playbook, unknown_reference, offset_out_of_range, daily_capacity_reached. |
| title | No | The playbook's name. |
| notice | No | Terms notice: research use only, not legal advice. |
| resets | No | On daily_capacity_reached: when capacity resets (00:00 UTC). |
| stages | No | The workflow's stages. |
| privacy | No | How user material is handled. |
| version | No | The playbook's version. |
| fallback | No | On daily_capacity_reached: where the full corpus can be downloaded. |
| guidance | No | On a refusal or empty search: the server's explanation. |
| valid_ids | No | On unknown_playbook: the valid ids. |
| references | No | The playbook's reference names. |
| instructions | No | The playbook's workflow instructions. |
| user_provides | No | What the user supplies. |
| load_reference_with | No | How a reference is loaded, or null when there are none. |
TDQS
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.
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.
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.
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.
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.
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 quoteARead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | ||
| register_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| hint | No | On an error: the server's explanation. |
| note | No | A note on this result. |
| error | No | Present only on an error or refusal: not_found, ambiguous, unparsed, empty_terms, unknown_playbook, unknown_reference, offset_out_of_range, daily_capacity_reached. |
| limit | No | On not_checked: the word limit. |
| words | No | On not_checked: the word count. |
| notice | No | Terms notice: research use only, not legal advice. |
| reason | No | On not_checked: too_long. |
| resets | No | On daily_capacity_reached: when capacity resets (00:00 UTC). |
| outcome | No | 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. |
| coverage | No | Share of the text's words found in the source (0 to 1). |
| elisions | No | On composed: gaps (marked or not). |
| fallback | No | On daily_capacity_reached: where the full corpus can be downloaded. |
| guidance | No | On a refusal or empty search: the server's explanation. |
| page_url | No | The matched section's page on claudeforcompliance.com. |
| segments | No | On composed: source pieces the text is assembled from. |
| omissions | No | On composed: short source phrases skipped between pieces. |
| source_url | No | The regulator's URL for the matched section's document. |
| differences | No | On a near miss: {closest_source, missing_from_quote, extra_in_quote}. |
| register_id | No | Echoed on not_found. |
| unsupported | No | On not_found: spans with no source support. |
| superseded_by | No | On superseded: the current register. |
| mandatory_date | No | On an Update 18 revision: when it becomes mandatory. |
| checked_against | No | Source documents checked (document, edition, retrieval date). |
| matched_against | No | The checked document the text matched. |
| matched_version | No | current, superseded (a prior version) or update-18-optional. |
| spacing_ignored | No | Only spacing differs. |
| furniture_ignored | No | A page footer or running head was ignored. |
| typography_folded | No | Matched after folding quotes and dashes. |
| matched_register_id | No | The register whose stored text contains the passage. |
| checked_snapshot_ids | No | Snapshot ids checked. |
| list_markers_ignored | No | Added list markers were ignored. |
| also_in_obligation_id | No | On a match in an amending issuance: the amended obligation that also carries the text. |
| matched_obligation_id | No | The obligation whose stored text contains the passage. |
| superseded_register_id | No | On superseded: the register holding the prior text. |
TDQS
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.
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.
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.
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.
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.
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.
4 tool updates
- Changed
get_obligation8 fields changed- added
Output schema / properties / kindAdded value: +{ + "description": "\"renumbered\": the regulator gave this section a new number; no text is given under the old one.", + "type": "string" +} - added
Output schema / properties / obligationsAdded value: +{ + "description": "On kind renumbered: the new register's sections ({obligation_id, section}), no text." +} - added
Output schema / properties / renumbered_fromAdded value: +{ + "description": "The old register, when the section was renumbered.", + "type": "string" +} - added
Output schema / properties / renumbered_from_citationAdded value: +{ + "description": "On kind renumbered: the section's old citation.", + "type": "string" +} - added
Output schema / properties / renumbered_inAdded value: +{ + "description": "On kind renumbered: the regulator's posting that renumbered it.", + "type": "string" +} - added
Output schema / properties / renumbered_onAdded value: +{ + "description": "On kind renumbered: when (YYYY-MM).", + "type": "string" +} - added
Output schema / properties / requested_idAdded value: +{ + "description": "On kind renumbered: the old id asked for.", + "type": "string" +} - added
Output schema / properties / text_changedAdded value: +{ + "description": "On kind renumbered: false when the text moved word for word.", + "type": "boolean" +}
- Changed
get_reg7 fields changed- added
Output schema / properties / kindAdded value: +{ + "description": "\"renumbered\": the regulator gave this section a new number; no text is given under the old one.", + "type": "string" +} - added
Output schema / properties / renumbered_fromAdded value: +{ + "description": "The old register, when the section was renumbered.", + "type": "string" +} - added
Output schema / properties / renumbered_from_citationAdded value: +{ + "description": "On kind renumbered: the section's old citation.", + "type": "string" +} - added
Output schema / properties / renumbered_inAdded value: +{ + "description": "On kind renumbered: the regulator's posting that renumbered it.", + "type": "string" +} - added
Output schema / properties / renumbered_onAdded value: +{ + "description": "On kind renumbered: when (YYYY-MM).", + "type": "string" +} - added
Output schema / properties / requested_idAdded value: +{ + "description": "On kind renumbered: the old id asked for.", + "type": "string" +} - added
Output schema / properties / text_changedAdded value: +{ + "description": "On kind renumbered: false when the text moved word for word.", + "type": "boolean" +}
- Changed
lookup_citation6 fields changed- added
Output schema / properties / kindAdded value: +{ + "description": "\"renumbered\": the regulator gave this section a new number; no text is given under the old one.", + "type": "string" +} - added
Output schema / properties / renumbered_from_citationAdded value: +{ + "description": "On kind renumbered: the section's old citation.", + "type": "string" +} - added
Output schema / properties / renumbered_inAdded value: +{ + "description": "On kind renumbered: the regulator's posting that renumbered it.", + "type": "string" +} - added
Output schema / properties / renumbered_onAdded value: +{ + "description": "On kind renumbered: when (YYYY-MM).", + "type": "string" +} - added
Output schema / properties / requested_idAdded value: +{ + "description": "On kind renumbered: the old id asked for.", + "type": "string" +} - added
Output schema / properties / text_changedAdded value: +{ + "description": "On kind renumbered: false when the text moved word for word.", + "type": "boolean" +}
- Changed
search_regs2 fields changed- added
Input schema / properties / family / descriptionAdded 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." - changed
Input schema / properties / family / enumPrevious value: -[ - "hud", - "va", - "fnma", - "fhlmc", - "gnma", - "usda", - "sba" -]New value: +[ + "hud", + "hudmf", + "va", + "fnma", + "fhlmc", + "gnma", + "usda", + "sba" +]
1 tool update
- Changed
lookup_citation1 field changed- added
Output schema / properties / obligationsAdded 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 ...)." +}
6 tool updates
- Changed
find_in_section1 field changed- added
Output schema / properties / page_urlAdded value: +{ + "description": "The section's page on claudeforcompliance.com (verbatim text, currency notices, link to the regulator).", + "type": "string" +}
- Changed
get_obligation1 field changed- added
Output schema / properties / page_urlAdded value: +{ + "description": "The section's page on claudeforcompliance.com (verbatim text, currency notices, link to the regulator).", + "type": "string" +}
- Changed
get_reg2 fields changed- added
Output schema / properties / page_urlAdded value: +{ + "description": "The section's page on claudeforcompliance.com (verbatim text, currency notices, link to the regulator).", + "type": "string" +} - added
Output schema / properties / source_urlAdded value: +{ + "description": "The regulator's URL for the document.", + "type": "string" +}
- Changed
lookup_citation2 fields changed- added
Output schema / properties / page_urlAdded value: +{ + "description": "The section's page on claudeforcompliance.com (verbatim text, currency notices, link to the regulator).", + "type": "string" +} - added
Output schema / properties / source_urlAdded value: +{ + "description": "The regulator's URL for the resolved section's document.", + "type": "string" +}
- Changed
search_regs2 fields changed- added
Output schema / properties / results / items / properties / page_urlAdded value: +{ + "description": "The section's page on claudeforcompliance.com (verbatim text, currency notices, link to the regulator).", + "type": "string" +} - added
Output schema / properties / results / items / properties / source_urlAdded value: +{ + "description": "The regulator's URL for the document.", + "type": "string" +}
- Changed
verify_quote2 fields changed- added
Output schema / properties / page_urlAdded value: +{ + "description": "The matched section's page on claudeforcompliance.com.", + "type": "string" +} - added
Output schema / properties / source_urlAdded value: +{ + "description": "The regulator's URL for the matched section's document.", + "type": "string" +}
1 tool update
- Changed
search_regs1 field changed- changed
Input schema / properties / currency_kind / enumPrevious 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" +]
2 tool updates
- Changed
get_obligation2 fields changed- changed
Output schema / properties / figures / descriptionPrevious 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." - changed
Output schema / properties / figures / items / properties / unit / descriptionPrevious 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."
- Changed
verify_quote4 fields changed- added
Output schema / properties / also_in_obligation_idAdded value: +{ + "description": "On a match in an amending issuance: the amended obligation that also carries the text.", + "type": "string" +} - added
Output schema / properties / matched_againstAdded value: +{ + "description": "The checked document the text matched.", + "type": "string" +} - added
Output schema / properties / matched_obligation_idAdded value: +{ + "description": "The obligation whose stored text contains the passage.", + "type": "string" +} - added
Output schema / properties / matched_register_idAdded value: +{ + "description": "The register whose stored text contains the passage.", + "type": "string" +}
10 tool updates
- Changed
find_in_section2 fields changed- changed
Input schema / properties / terms / descriptionPrevious 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." - changed
Output 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" +}
- Changed
get_obligation2 fields changed- changed
Input schema / properties / limit / descriptionPrevious 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)." - changed
Output 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" +}
- Changed
get_playbook_kit1 field changed- changed
Output 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" +}
- Changed
get_playbook_reference2 fields changed- changed
Input schema / properties / name / descriptionPrevious value: -"Reference name, as listed by start_playbook's `references`."New value: +"Reference name, one of the playbook's `references`." - changed
Output 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" +}
- Changed
get_reg1 field changed- changed
Output 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" +}
- Changed
list_playbooks1 field changed- changed
Output 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" +}
- Changed
lookup_citation1 field changed- changed
Output 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" +}
- Changed
search_regs2 fields changed- changed
Input schema / properties / currency_kind / descriptionPrevious 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." - changed
Output 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" +}
- Changed
start_playbook1 field changed- changed
Output 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" +}
- Changed
verify_quote1 field changed- changed
Output 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" +}
1 tool update
- Changed
search_regs1 field changed- changed
Input schema / properties / currency_kind / enumPrevious 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" +]
1 tool update
- Changed
search_regs1 field changed- changed
Input schema / properties / currency_kind / enumPrevious 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" +]
2 tool updates
- Changed
get_obligation1 field changed- added
Input schema / properties / compare_versionsAdded 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" +}
- Changed
search_regs1 field changed- added
Input schema / properties / currency_kindAdded 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 tool updates
- First observed
find_in_section - First observed
get_obligation - First observed
get_playbook_kit - First observed
get_playbook_reference - First observed
get_reg - First observed
list_playbooks - First observed
lookup_citation - First observed
search_regs - First observed
start_playbook - First observed
verify_quote
Related MCP Connectors
The original text of US federal and state law, with official sources; never a summary or advice.
Read-only U.S. mortgage market, lender, GSE performance, and servicing analytics.
Source-linked US federal regulations: CFR provision history, obligations, rules, comments.
Daily US banking regulation brief, weekly digest, archive and comment-deadline tracker. No key.
Related MCP Servers
- AlicenseAqualityBmaintenanceEnables 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.3MIT
- AlicenseNot gradedqualityBmaintenanceProvides access to US banking and consumer-finance rules (12 CFR) via MCP, enabling AI agents to query regulatory data. Part of the Pipeworx gateway.15 npm1MIT
- AlicenseNot gradedqualityDmaintenanceEnables 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
- AlicenseNot gradedqualityBmaintenanceEnables 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 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.