Skip to main content
Glama

federal-regulations-mcp-server

regulations_browse_cfr

regulations_browse_cfr
Read-only

Explore the codified Code of Federal Regulations via eCFR in three modes. "structure" lists all 50 titles; with a title, that title's top-level divisions (its chapters, or subtitles); and with a title and part, every section and appendix in the part, flattened and paged, each naming the subpart and subject group it sits under — the way to enumerate a part's sections without reading its text. "search" runs a full-text query across the codified CFR and returns matching sections with their hierarchy path and a snippet, one result per section, paged. "versions" lists the dates a part's or one section's text changed, oldest first per section, paged, with the latest amendment date; with changed_since, what changed across a title. Every mode accepts title and part to narrow the scope, and all three feed regulations_get_cfr_section — a version row's date reads that version. Every search result reports which corpus answered it — the synced local mirror or the live eCFR index — and what that corpus covers, in source and sourceScope.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "mode": "<mode>"
    },
    "name": "regulations_browse_cfr"
  }
}

Input Schema

NameRequiredDescriptionDefault
dateNoPoint-in-time date, ISO 8601 (YYYY-MM-DD). Defaults to current. Structure mode uses it for the historical hierarchy, and rejects a date past the title's up-to-date date. Search mode matches only the section text in effect on that day, so a past date searches the CFR as it read then; eCFR indexes 2017-01-03 onward and rejects a date past its current index date. Ignored in versions mode, where each row carries its own date.
modeYes"structure": list titles, a title's top-level divisions, or a part's sections and appendices, to find a cite. "search": full-text search the codified CFR for sections matching a phrase. "versions": list the dates a part's or section's text changed (title plus part or changed_since).
pageNo1-based page of search results, of a part's listing in structure mode, or of versions (default 1); ignored by a structure listing above a part, which comes back whole. A truncation notice names the next page. Live eCFR search pages through its first 10,000 hits only, so a page starting past them is refused — narrow the query instead of paging deeper.
partNoCFR part within the title, in every mode — structure mode lists every section and appendix in the part, flattened and paged by page/per_page; search mode restricts matches to text inside that part; versions mode lists the part's versions, appendices included. Requires title; a part on its own is rejected. Parts can be alphanumeric ("1203a", "16A") and are matched exactly once a leading "Part" or "Pt." is dropped, so pass the identifier as eCFR writes it — "58" ("Part 58" also reads as 58), not "058".
queryNoFull-text search phrase (search mode, required in that mode). Ignored in structure and versions modes.
titleNoCFR title number (1–50). Structure mode: omit to list all 50 titles; provide it alone to list the title's top-level divisions (chapters, or subtitles) — not the parts beneath them — or with part to list that part. Search mode: optional filter restricting matches to that title — e.g. 40 for environmental rules, 21 for food and drugs. Versions mode: required, with part or changed_since.
sectionNoVersions mode: list one section's versions rather than its part's ("141.61"). Requires part. "61", "§ 141.61", "141.61(c)", and "40 CFR 141.61" resolve to the section, with a notice. Ignored in other modes.
per_pageNoRows per page — search results, nodes of a part's listing in structure mode, or versions (at least 1, default 20, capped at 50 with a notice).
changed_sinceNoVersions mode: keep only versions published by an eCFR issue dated on or after this day (YYYY-MM-DD). With title alone, lists what changed across the title. Ignored in other modes.

Output Schema

NameRequiredDescriptionDefault
dateNoResolved point-in-time date — the hierarchy snapshot (structure mode), or the day whose section text was searched (search mode).
modeNoWhich mode produced this result.
pageNoThe page served — of search results, a part's listing, or versions.
errorNoPresent when the call failed. Absent on success.
nodesNoStructure mode: the 50 titles, a title's top-level divisions, or this page of a part's sections and appendices in document order.
shownNoRows returned on this page.
noticeNoGuidance: per_page above its ceiling, the next page to request, a page past the end, an empty result, what the count means, or how a section was read.
sourceNoProvenance: the synced mirror index, or the live eCFR search API (search mode).
resultsNoMatching CFR sections and appendices, this page, one row per section however many of its versions matched (search mode).
versionsNoVersions mode: this page of versions in eCFR order — document order by identifier, oldest first within each.
truncatedNoTrue when another page follows this one.
countBasisNoWhat a search totalCount counts. "sections": distinct sections and appendices, one per result row. "section_versions": eCFR's own hit count, which counts every indexed version of each section — an upper bound on the rows the query pages through, reported until the whole hit list has been read.
totalCountNoTotal matches before pagination — search results (see countBasis for what they count), the nodes in a part's listing, or versions.
sourceScopeNoWhat the answering corpus covers — the mirror's title coverage, or the live index and the date it was read at — narrowed by whichever of title and part the call supplied (search mode). Read it before concluding a query found nothing.
latestAmendmentDateNoVersions mode: the newest `date` across every listed version, not just this page; null when none matched.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed21 schema fields changed
    • addedInput schema / properties / changed_since
      Added value: +{
      +  "anyOf": [
      +    {
      +      "const": "",
      +      "type": "string"
      +    },
      +    {
      +      "description": "ISO 8601 date (YYYY-MM-DD).",
      +      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +      "type": "string"
      +    }
      +  ],
      +  "description": "Versions mode: keep only versions published by an eCFR issue dated on or after this day (YYYY-MM-DD). With title alone, lists what changed across the title. Ignored in other modes."
      +}
    • changedInput schema / properties / date / description
      Previous value: -"Point-in-time date, ISO 8601 (YYYY-MM-DD). Defaults to current. Structure mode uses it for the historical hierarchy, and rejects a date past the title's up-to-date date. Search mode matches only the section text in effect on that day, so a past date searches the CFR as it read then; eCFR indexes 2017-01-03 onward and rejects a date past its current index date."New value: +"Point-in-time date, ISO 8601 (YYYY-MM-DD). Defaults to current. Structure mode uses it for the historical hierarchy, and rejects a date past the title's up-to-date date. Search mode matches only the section text in effect on that day, so a past date searches the CFR as it read then; eCFR indexes 2017-01-03 onward and rejects a date past its current index date. Ignored in versions mode, where each row carries its own date."
    • changedInput schema / properties / mode / description
      Previous value: -"\"structure\": list titles, a title's top-level divisions, or a part's sections and appendices, to find a cite. \"search\": full-text search the codified CFR for sections matching a phrase."New value: +"\"structure\": list titles, a title's top-level divisions, or a part's sections and appendices, to find a cite. \"search\": full-text search the codified CFR for sections matching a phrase. \"versions\": list the dates a part's or section's text changed (title plus part or changed_since)."
    • changedInput schema / properties / mode / enum
      Previous value: -[
      -  "structure",
      -  "search"
      -]New value: +[
      +  "structure",
      +  "search",
      +  "versions"
      +]
    • changedInput schema / properties / page / description
      Previous value: -"1-based page of search results, or of a part's listing in structure mode (default 1); ignored by a structure listing above a part, which comes back whole. A truncation notice names the next page. Live eCFR search pages through its first 10,000 hits only, so a page starting past them is refused — narrow the query instead of paging deeper."New value: +"1-based page of search results, of a part's listing in structure mode, or of versions (default 1); ignored by a structure listing above a part, which comes back whole. A truncation notice names the next page. Live eCFR search pages through its first 10,000 hits only, so a page starting past them is refused — narrow the query instead of paging deeper."
    • changedInput schema / properties / part / description
      Previous value: -"CFR part within the title, in both modes — structure mode lists every section and appendix in the part, flattened and paged by page/per_page; search mode restricts matches to text inside that part. Requires title; a part on its own is rejected. Parts can be alphanumeric (\"1203a\", \"16A\") and are matched exactly once a leading \"Part\" or \"Pt.\" is dropped, so pass the identifier as eCFR writes it — \"58\" (\"Part 58\" also reads as 58), not \"058\"."New value: +"CFR part within the title, in every mode — structure mode lists every section and appendix in the part, flattened and paged by page/per_page; search mode restricts matches to text inside that part; versions mode lists the part's versions, appendices included. Requires title; a part on its own is rejected. Parts can be alphanumeric (\"1203a\", \"16A\") and are matched exactly once a leading \"Part\" or \"Pt.\" is dropped, so pass the identifier as eCFR writes it — \"58\" (\"Part 58\" also reads as 58), not \"058\"."
    • changedInput schema / properties / per_page / description
      Previous value: -"Rows per page — search results, or nodes of a part's listing in structure mode (1–50, default 20)."New value: +"Rows per page — search results, nodes of a part's listing in structure mode, or versions (at least 1, default 20, capped at 50 with a notice)."
    • removedInput schema / properties / per_page / maximum
      Removed value: -50
    • addedInput schema / properties / per_page / multipleOf
      Added value: +1
    • changedInput schema / properties / per_page / type
      Previous value: -"integer"New value: +"number"
    • changedInput schema / properties / query / description
      Previous value: -"Full-text search phrase (search mode, required in that mode). Ignored in structure mode."New value: +"Full-text search phrase (search mode, required in that mode). Ignored in structure and versions modes."
    • addedInput schema / properties / section
      Added value: +{
      +  "description": "Versions mode: list one section's versions rather than its part's (\"141.61\"). Requires part. \"61\", \"§ 141.61\", \"141.61(c)\", and \"40 CFR 141.61\" resolve to the section, with a notice. Ignored in other modes.",
      +  "type": "string"
      +}
    • changedInput schema / properties / title / description
      Previous value: -"CFR title number (1–50). Structure mode: omit to list all 50 titles; provide it alone to list the title's top-level divisions (chapters, or subtitles) — not the parts beneath them — or with part to list that part. Search mode: optional filter restricting matches to that title — e.g. 40 for environmental rules, 21 for food and drugs."New value: +"CFR title number (1–50). Structure mode: omit to list all 50 titles; provide it alone to list the title's top-level divisions (chapters, or subtitles) — not the parts beneath them — or with part to list that part. Search mode: optional filter restricting matches to that title — e.g. 40 for environmental rules, 21 for food and drugs. Versions mode: required, with part or changed_since."
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `query_required`: mode=\"search\" with no query phrase. `title_not_found`: Structure mode where eCFR publishes no tree for the title at that date (a reserved title, or a date before its coverage), or where the part is absent from the tree it does publish. `title_required_for_part`: A part was given with no title. Part identifiers repeat across titles, and eCFR rejects a part filter that names no title. `date_out_of_range`: A date past what eCFR serves: in structure mode, past the title's up-to-date date; in search mode, outside the indexed window (before 2017-01-03, or past its current index date). `page_out_of_window`: A live search page that starts past the 10,000 hits eCFR pages through for one query. `upstream_unavailable`: eCFR returned a 5xx, timed out, or served an HTML error page (live path). Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `query_required`: mode=\"search\" with no query phrase. `title_not_found`: Structure mode where eCFR publishes no tree for the title at that date (a reserved title, or a date before its coverage), or where the part is absent from the tree it does publish. `title_required_for_part`: A part was given with no title. Part identifiers repeat across titles, and eCFR rejects a part filter that names no title. `versions_scope_required`: Versions mode with no title; with a title but neither part nor changed_since; or with a section but no part. `conflicting_title`: Versions mode with section written as a full cite (\"21 CFR 141.61\") naming a different title than title. `date_out_of_range`: A date past what eCFR serves: in structure mode, past the title's up-to-date date; in search mode, outside the indexed window (before 2017-01-03, or past its current index date). `page_out_of_window`: A live search page that starts past the 10,000 hits eCFR pages through for one query. `upstream_unavailable`: eCFR returned a 5xx, timed out, or served an HTML error page (live path). Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "query_required",
      -  "title_not_found",
      -  "title_required_for_part",
      -  "date_out_of_range",
      -  "page_out_of_window",
      -  "upstream_unavailable"
      -]New value: +[
      +  "query_required",
      +  "title_not_found",
      +  "title_required_for_part",
      +  "versions_scope_required",
      +  "conflicting_title",
      +  "date_out_of_range",
      +  "page_out_of_window",
      +  "upstream_unavailable"
      +]
    • addedOutput schema / properties / latestAmendmentDate
      Added value: +{
      +  "description": "Versions mode: the newest `date` across every listed version, not just this page; null when none matched.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / mode / enum
      Previous value: -[
      -  "structure",
      -  "search"
      -]New value: +[
      +  "structure",
      +  "search",
      +  "versions"
      +]
    • changedOutput schema / properties / notice / description
      Previous value: -"Guidance: the next page to request, a page past the end, an empty result, or what the count means."New value: +"Guidance: per_page above its ceiling, the next page to request, a page past the end, an empty result, what the count means, or how a section was read."
    • changedOutput schema / properties / page / description
      Previous value: -"The page served — of search results, or of a part's listing."New value: +"The page served — of search results, a part's listing, or versions."
    • changedOutput schema / properties / totalCount / description
      Previous value: -"Total matches before pagination — search results (see countBasis for what they count), or the nodes in a part's listing."New value: +"Total matches before pagination — search results (see countBasis for what they count), the nodes in a part's listing, or versions."
    • addedOutput schema / properties / versions
      Added value: +{
      +  "description": "Versions mode: this page of versions in eCFR order — document order by identifier, oldest first within each.",
      +  "items": {
      +    "additionalProperties": false,
      +    "description": "One version of a section or appendix.",
      +    "properties": {
      +      "cfrCite": {
      +        "description": "Cite → regulations_get_cfr_section, as structure mode cites the same node.",
      +        "type": "string"
      +      },
      +      "date": {
      +        "description": "Day this version took effect: pass it as regulations_get_cfr_section `date` to read it. A row dated before 2017-01-01 is the text in force when eCFR coverage begins, read at 2017-01-01. A removed row's date reads nothing; the previous row's date reads the last text.",
      +        "type": "string"
      +      },
      +      "heading": {
      +        "description": "The section or appendix name, plain text.",
      +        "type": "string"
      +      },
      +      "identifier": {
      +        "description": "Section number (\"141.61\"); on an appendix row, the identifier regulations_get_cfr_section takes as `appendix`, verbatim.",
      +        "type": "string"
      +      },
      +      "issueDate": {
      +        "description": "The eCFR issue that published this version, which can postdate `date`; changed_since filters on it.",
      +        "type": "string"
      +      },
      +      "part": {
      +        "description": "The part it sits in.",
      +        "type": "string"
      +      },
      +      "removed": {
      +        "description": "True on the row that removed the section or appendix.",
      +        "type": "boolean"
      +      },
      +      "subpart": {
      +        "description": "Subpart identifier (\"G\"), or null when in none.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "substantive": {
      +        "description": "False when eCFR flags the version as an editorial re-issue.",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "description": "\"section\" or \"appendix\". Treat an unknown type as passthrough.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "identifier",
      +      "heading",
      +      "part",
      +      "subpart",
      +      "cfrCite",
      +      "date",
      +      "issueDate",
      +      "substantive",
      +      "removed"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  2. Changed3 schema fields changed
    • changedInput schema / properties / part / description
      Previous value: -"CFR part within the title, in both modes — structure mode lists every section and appendix in the part, flattened and paged by page/per_page; search mode restricts matches to text inside that part. Requires title; a part on its own is rejected. Parts can be alphanumeric (\"1203a\", \"16A\") and are matched exactly, so pass the identifier as eCFR writes it — \"58\", not \"Part 58\" or \"058\"."New value: +"CFR part within the title, in both modes — structure mode lists every section and appendix in the part, flattened and paged by page/per_page; search mode restricts matches to text inside that part. Requires title; a part on its own is rejected. Parts can be alphanumeric (\"1203a\", \"16A\") and are matched exactly once a leading \"Part\" or \"Pt.\" is dropped, so pass the identifier as eCFR writes it — \"58\" (\"Part 58\" also reads as 58), not \"058\"."
    • changedOutput schema / properties / date / description
      Previous value: -"Resolved point-in-time date — the hierarchy snapshot (structure mode), or the day whose section text was searched (search mode, live source only)."New value: +"Resolved point-in-time date — the hierarchy snapshot (structure mode), or the day whose section text was searched (search mode)."
    • changedOutput schema / properties / nodes / items / properties / cfrCite / description
      Previous value: -"Assembled cite → regulations_get_cfr_section: \"40 CFR 50.1\" for a section, \"Appendix A-1 to Part 50, Title 40\" for an appendix. Null on a level with no read path (title, subtitle, chapter)."New value: +"Assembled cite → regulations_get_cfr_section: \"40 CFR 50.1\" for a section (\"14 CFR 241 § 25\" for one numbered without its part), \"Appendix A-1 to Part 50, Title 40\" for an appendix. Null on a level with no read path (title, subtitle, chapter)."
  3. Changed23 schema fields changed
    • changedInput schema / properties / date / description
      Previous value: -"Point-in-time date, ISO 8601 (YYYY-MM-DD). Defaults to current. Structure mode uses it for the historical hierarchy. Search mode matches only the section text in effect on that day, so a past date searches the CFR as it read then; eCFR indexes 2017-01-03 onward and rejects a date past its current index date."New value: +"Point-in-time date, ISO 8601 (YYYY-MM-DD). Defaults to current. Structure mode uses it for the historical hierarchy, and rejects a date past the title's up-to-date date. Search mode matches only the section text in effect on that day, so a past date searches the CFR as it read then; eCFR indexes 2017-01-03 onward and rejects a date past its current index date."
    • changedInput schema / properties / mode / description
      Previous value: -"\"structure\": browse the CFR tree (titles, or one title's chapters/parts/sections) to find a cite. \"search\": full-text search the codified CFR for sections matching a phrase."New value: +"\"structure\": list titles, a title's top-level divisions, or a part's sections and appendices, to find a cite. \"search\": full-text search the codified CFR for sections matching a phrase."
    • addedInput schema / properties / page
      Added value: +{
      +  "default": 1,
      +  "description": "1-based page of search results, or of a part's listing in structure mode (default 1); ignored by a structure listing above a part, which comes back whole. A truncation notice names the next page. Live eCFR search pages through its first 10,000 hits only, so a page starting past them is refused — narrow the query instead of paging deeper.",
      +  "maximum": 9007199254740991,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • changedInput schema / properties / part / description
      Previous value: -"CFR part within the title, in both modes — structure mode narrows the returned tree to that part's sections, search mode restricts matches to text inside that part. Requires title; a part on its own is rejected. Parts can be alphanumeric (\"1203a\", \"16A\") and are matched exactly, so pass the identifier as eCFR writes it — \"58\", not \"Part 58\" or \"058\"."New value: +"CFR part within the title, in both modes — structure mode lists every section and appendix in the part, flattened and paged by page/per_page; search mode restricts matches to text inside that part. Requires title; a part on its own is rejected. Parts can be alphanumeric (\"1203a\", \"16A\") and are matched exactly, so pass the identifier as eCFR writes it — \"58\", not \"Part 58\" or \"058\"."
    • changedInput schema / properties / per_page / description
      Previous value: -"Results per page in search mode (1–50, default 20). Ignored in structure mode."New value: +"Rows per page — search results, or nodes of a part's listing in structure mode (1–50, default 20)."
    • changedInput schema / properties / title / description
      Previous value: -"CFR title number (1–50). Structure mode: omit to list all 50 titles, or provide to expand one title. Search mode: optional filter restricting matches to that title — e.g. 40 for environmental rules, 21 for food and drugs."New value: +"CFR title number (1–50). Structure mode: omit to list all 50 titles; provide it alone to list the title's top-level divisions (chapters, or subtitles) — not the parts beneath them — or with part to list that part. Search mode: optional filter restricting matches to that title — e.g. 40 for environmental rules, 21 for food and drugs."
    • addedOutput schema / properties / countBasis
      Added value: +{
      +  "description": "What a search totalCount counts. \"sections\": distinct sections and appendices, one per result row. \"section_versions\": eCFR's own hit count, which counts every indexed version of each section — an upper bound on the rows the query pages through, reported until the whole hit list has been read.",
      +  "enum": [
      +    "sections",
      +    "section_versions"
      +  ],
      +  "type": "string"
      +}
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `query_required`: mode=\"search\" with no query phrase. `title_not_found`: Structure mode where eCFR publishes no tree for the title at that date (a reserved title, or a date outside its coverage), or where the part is absent from the tree it does publish. `title_required_for_part`: A part was given with no title. Part identifiers repeat across titles, and eCFR rejects a part filter that names no title. `date_out_of_range`: Search mode with a date outside eCFR's indexed window (before 2017-01-03, or past its current index date). `upstream_unavailable`: eCFR returned a 5xx, timed out, or served an HTML error page (live path). Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `query_required`: mode=\"search\" with no query phrase. `title_not_found`: Structure mode where eCFR publishes no tree for the title at that date (a reserved title, or a date before its coverage), or where the part is absent from the tree it does publish. `title_required_for_part`: A part was given with no title. Part identifiers repeat across titles, and eCFR rejects a part filter that names no title. `date_out_of_range`: A date past what eCFR serves: in structure mode, past the title's up-to-date date; in search mode, outside the indexed window (before 2017-01-03, or past its current index date). `page_out_of_window`: A live search page that starts past the 10,000 hits eCFR pages through for one query. `upstream_unavailable`: eCFR returned a 5xx, timed out, or served an HTML error page (live path). Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "query_required",
      -  "title_not_found",
      -  "title_required_for_part",
      -  "date_out_of_range",
      -  "upstream_unavailable"
      -]New value: +[
      +  "query_required",
      +  "title_not_found",
      +  "title_required_for_part",
      +  "date_out_of_range",
      +  "page_out_of_window",
      +  "upstream_unavailable"
      +]
    • changedOutput schema / properties / nodes / description
      Previous value: -"Hierarchy nodes at the requested level (structure mode)."New value: +"Structure mode: the 50 titles, a title's top-level divisions, or this page of a part's sections and appendices in document order."
    • changedOutput schema / properties / nodes / items / properties / cfrCite / description
      Previous value: -"Assembled cite → regulations_get_cfr_section: \"40 CFR 50\" / \"40 CFR 50.1\" for a part or section, \"Appendix A-1 to Part 50, Title 40\" for an appendix. Null on a level with no read path (chapter, subchapter, subpart, subject group)."New value: +"Assembled cite → regulations_get_cfr_section: \"40 CFR 50.1\" for a section, \"Appendix A-1 to Part 50, Title 40\" for an appendix. Null on a level with no read path (title, subtitle, chapter)."
    • changedOutput schema / properties / nodes / items / properties / identifier / description
      Previous value: -"Node identifier (e.g. \"40\", \"I\", \"50\", \"50.1\")."New value: +"Node identifier (e.g. \"40\", \"I\", \"50.1\")."
    • changedOutput schema / properties / nodes / items / properties / label / description
      Previous value: -"Human-readable label."New value: +"Human-readable label, plain text."
    • addedOutput schema / properties / nodes / items / properties / subjectGroup
      Added value: +{
      +  "description": "In a part listing, the heading of the subject group the node sits under (a group of sections inside a part or subpart); null when it sits in none, and on every node above a part.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / nodes / items / properties / subpart
      Added value: +{
      +  "description": "In a part listing, the label of the subpart the node sits under (\"Subpart A—General\"); null when no subpart encloses it, and on every node above a part.",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / nodes / items / properties / type / description
      Previous value: -"Node type: title, chapter, subchapter, subpart, part, section, appendix, subject_group, or other (treat unknown types as passthrough)."New value: +"Node type: title, subtitle, or chapter above a part; section or appendix in a part listing. Treat an unknown type as passthrough."
    • changedOutput schema / properties / nodes / items / required
      Previous value: -[
      -  "type",
      -  "identifier",
      -  "label",
      -  "description",
      -  "reserved",
      -  "cfrCite",
      -  "appendix"
      -]New value: +[
      +  "type",
      +  "identifier",
      +  "label",
      +  "description",
      +  "reserved",
      +  "cfrCite",
      +  "appendix",
      +  "subpart",
      +  "subjectGroup"
      +]
    • changedOutput schema / properties / notice / description
      Previous value: -"Guidance when nothing matched."New value: +"Guidance: the next page to request, a page past the end, an empty result, or what the count means."
    • addedOutput schema / properties / page
      Added value: +{
      +  "description": "The page served — of search results, or of a part's listing.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / results / description
      Previous value: -"Matching CFR sections, this page (search mode)."New value: +"Matching CFR sections and appendices, this page, one row per section however many of its versions matched (search mode)."
    • changedOutput schema / properties / shown / description
      Previous value: -"Results returned on this page (search mode)."New value: +"Rows returned on this page."
    • changedOutput schema / properties / totalCount / description
      Previous value: -"Total search matches before pagination (search mode)."New value: +"Total matches before pagination — search results (see countBasis for what they count), or the nodes in a part's listing."
    • changedOutput schema / properties / truncated / description
      Previous value: -"True when search results were capped at per_page."New value: +"True when another page follows this one."
  4. Changed10 schema fields changed
    • removedOutput schema / properties / nodes / items / properties / appendix / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / nodes / items / properties / appendix / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / nodes / items / properties / cfrCite / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / nodes / items / properties / cfrCite / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / nodes / items / properties / description / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / nodes / items / properties / description / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / results / items / properties / appendix / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / results / items / properties / appendix / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / results / items / properties / section / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / results / items / properties / section / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  5. Changed6 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "mode"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode. Declared by this tool: `query_required`: mode=\"search\" with no query phrase. `title_not_found`: Structure mode where eCFR publishes no tree for the title at that date (a reserved title, or a date outside its coverage), or where the part is absent from the tree it does publish. `title_required_for_part`: A part was given with no title. Part identifiers repeat across titles, and eCFR rejects a part filter that names no title. `date_out_of_range`: Search mode with a date outside eCFR's indexed window (before 2017-01-03, or past its current index date). `upstream_unavailable`: eCFR returned a 5xx, timed out, or served an HTML error page (live path). Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "query_required",
      +            "title_not_found",
      +            "title_required_for_part",
      +            "date_out_of_range",
      +            "upstream_unavailable"
      +          ],
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "mode"
      -]
  6. Changed7 schema fields changed
    • addedOutput schema / properties / nodes / items / properties / appendix
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "On an appendix node, the identifier to pass straight back as regulations_get_cfr_section's `appendix` input; null on every other node type. It is free-form prose, not a letter (\"Schedule I to Part 789\", \"Special Federal Aviation Regulation No. 88\"), so pass it verbatim rather than abbreviating it."
      +}
    • changedOutput schema / properties / nodes / items / properties / cfrCite / description
      Previous value: -"Assembled cite for a part/section → regulations_get_cfr_section; null otherwise."New value: +"Assembled cite → regulations_get_cfr_section: \"40 CFR 50\" / \"40 CFR 50.1\" for a part or section, \"Appendix A-1 to Part 50, Title 40\" for an appendix. Null on a level with no read path (chapter, subchapter, subpart, subject group)."
    • changedOutput schema / properties / nodes / items / required
      Previous value: -[
      -  "type",
      -  "identifier",
      -  "label",
      -  "description",
      -  "reserved",
      -  "cfrCite"
      -]New value: +[
      +  "type",
      +  "identifier",
      +  "label",
      +  "description",
      +  "reserved",
      +  "cfrCite",
      +  "appendix"
      +]
    • changedOutput schema / properties / results / items / description
      Previous value: -"One matching CFR section."New value: +"One matching CFR section or appendix."
    • addedOutput schema / properties / results / items / properties / appendix
      Added value: +{
      +  "anyOf": [
      +    {
      +      "type": "string"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "On an appendix hit, the identifier to pass straight back as regulations_get_cfr_section's `appendix` input; null on a section hit. Always null on a mirror hit — the index holds section text only, so mirror-sourced results never match an appendix."
      +}
    • changedOutput schema / properties / results / items / properties / cfrCite / description
      Previous value: -"Assembled cite → regulations_get_cfr_section."New value: +"Assembled cite → regulations_get_cfr_section. A section hit cites the section (\"40 CFR 51.190\"); an appendix hit cites the appendix in eCFR's own form (\"Appendix C to Part 58, Title 40\"), not the part around it, since the part's sections do not contain the matched text."
    • changedOutput schema / properties / results / items / required
      Previous value: -[
      -  "title",
      -  "part",
      -  "section",
      -  "heading",
      -  "hierarchyPath",
      -  "excerpt",
      -  "cfrCite"
      -]New value: +[
      +  "title",
      +  "part",
      +  "section",
      +  "appendix",
      +  "heading",
      +  "hierarchyPath",
      +  "excerpt",
      +  "cfrCite"
      +]
  7. Changed3 schema fields changed
    • changedInput schema / properties / part / description
      Previous value: -"CFR part within the title (structure mode, optional) — narrows the returned tree to one part's sections. Parts can be alphanumeric."New value: +"CFR part within the title, in both modes — structure mode narrows the returned tree to that part's sections, search mode restricts matches to text inside that part. Requires title; a part on its own is rejected. Parts can be alphanumeric (\"1203a\", \"16A\") and are matched exactly, so pass the identifier as eCFR writes it — \"58\", not \"Part 58\" or \"058\"."
    • changedOutput schema / properties / results / items / properties / hierarchyPath / description
      Previous value: -"Structural path down to the match, e.g. \"Title 40 › Chapter I › Part 51 › § 51.190\"."New value: +"Path down to the match. A live hit names the part it sits in — \"Title 40 › Chapter I › Subchapter C › Part 51 — Requirements for Preparation, Adoption, and Submittal of Implementation Plans › § 51.190\" — so the subject matter is readable without a second call. A mirror hit is structural only (\"Title 14 › Part 25 › § 25.1043\"): the index stores no level names. Check `source` before comparing paths across results."
    • changedOutput schema / properties / sourceScope / description
      Previous value: -"What the answering corpus covers — the mirror's title coverage, or the live index and the date it was read at (search mode). Read it before concluding a query found nothing."New value: +"What the answering corpus covers — the mirror's title coverage, or the live index and the date it was read at — narrowed by whichever of title and part the call supplied (search mode). Read it before concluding a query found nothing."
  8. Changed8 schema fields changed
    • changedInput schema / properties / date / description
      Previous value: -"Point-in-time date, ISO 8601 (YYYY-MM-DD). Defaults to current. Structure mode uses this date for historical hierarchy; in search mode, a past date enables point-in-time search."New value: +"Point-in-time date, ISO 8601 (YYYY-MM-DD). Defaults to current. Structure mode uses it for the historical hierarchy. Search mode matches only the section text in effect on that day, so a past date searches the CFR as it read then; eCFR indexes 2017-01-03 onward and rejects a date past its current index date."
    • changedInput schema / properties / title / description
      Previous value: -"CFR title number (1–50). Structure mode: omit to list all 50 titles, or provide to expand one title. Search mode: optional filter to restrict to one title."New value: +"CFR title number (1–50). Structure mode: omit to list all 50 titles, or provide to expand one title. Search mode: optional filter restricting matches to that title — e.g. 40 for environmental rules, 21 for food and drugs."
    • changedOutput schema / properties / date / description
      Previous value: -"Resolved point-in-time date (structure mode)."New value: +"Resolved point-in-time date — the hierarchy snapshot (structure mode), or the day whose section text was searched (search mode, live source only)."
    • changedOutput schema / properties / results / items / properties / heading / description
      Previous value: -"Section/part heading."New value: +"What the matched node is called — the section, appendix, or part heading. Distinct from cfrCite, which is where it lives."
    • changedOutput schema / properties / results / items / properties / hierarchyPath / description
      Previous value: -"Human-readable hierarchy path."New value: +"Structural path down to the match, e.g. \"Title 40 › Chapter I › Part 51 › § 51.190\"."
    • changedOutput schema / properties / results / items / properties / section / description
      Previous value: -"Section identifier, or null."New value: +"Section identifier, or null when the match is an appendix or a whole part."
    • changedOutput schema / properties / source / description
      Previous value: -"Provenance: the synced mirror index, or the live eCFR search fallback (search mode)."New value: +"Provenance: the synced mirror index, or the live eCFR search API (search mode)."
    • addedOutput schema / properties / sourceScope
      Added value: +{
      +  "description": "What the answering corpus covers — the mirror's title coverage, or the live index and the date it was read at (search mode). Read it before concluding a query found nothing.",
      +  "type": "string"
      +}
  9. First observed

TDQS

A4.4/5.0
Behavior5/5

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

Goes well beyond the readOnly/openWorld annotations: it discloses that live eCFR search pages only its first 10,000 hits and refuses deeper pages, that structure mode rejects a date past a title's up-to-date date, that per_page is capped at 50 with a notice, and which corpus (local mirror vs live index) answered via source/sourceScope. These are operational traits an agent must know before calling and cannot get from annotations alone.

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

Conciseness4/5

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

Front-loads the three modes and their outputs before the corpus caveats, and nearly every clause carries distinct information. The prose is dense and hyphen-heavy, with some restatement of mode naming that the enum also conveys, but for a nine-parameter, three-mode tool the length is earned.

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

Completeness5/5

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

Rich annotations, an output schema, and 100% schema coverage mean the description need not explain return payloads, and it fills the remaining gaps: mode behavior, paging caps, date rejection rules, corpus provenance, and handoff to the section reader. Nothing an agent needs to invoke this correctly is missing.

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

Parameters3/5

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

Schema coverage is 100%, so the schema already documents date, page, part, title, section, per_page, and changed_since semantics. The description adds only light framing ('every mode accepts title and part to narrow the scope', a version row's date reads that version) and is even slightly imprecise since versions mode requires title rather than merely accepting it. Baseline 3 applies when the schema does the heavy lifting.

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

Purpose5/5

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

States a specific verb and resource ('Explore the codified Code of Federal Regulations via eCFR') and enumerates the three modes with what each returns. It also names the downstream sibling regulations_get_cfr_section, so an agent can tell it apart from the read-it siblings without opening the schema.

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

Usage Guidelines4/5

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

Gives clear selection guidance per mode, including the purpose-built hint that structure mode is 'the way to enumerate a part's sections without reading its text' and that all modes feed regulations_get_cfr_section. It stops short of explicitly comparing against regulations_search_rules or the comment/docket siblings, so the boundary with them is left to inference.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.