ecfr-mcp
Free, no-auth MCP server exposing the eCFR API as 13 tools to read, search, compare, and track FAR/DFARS and other CFR regulatory text.
Get the latest safe date for a CFR title.
Retrieve parsed regulatory text for sections, subparts, parts, chapters, or appendices, with optional raw XML.
Get hierarchical CFR structure/table of contents.
Get version history and identify substantive vs editorial amendments since 2017.
Get breadcrumb ancestry for a section, part, or appendix.
Full-text search with hierarchy, agency, date, ordering, and pagination filters; defaults to current-only text.
List agencies and their CFR title/chapter references.
Get editorial corrections for a CFR title.
Look up FAR/DFARS clause text with auto-resolved date.
Compare a section's text at two dates.
List all sections in a FAR/DFARS part.
Find a term's definition in FAR 2.101 with context.
Find sections recently amended since a given date.
Install via Claude/ChatGPT directory listings,
uvx,pip, or source; no API key required.
ecfr-mcp
Free, open-source MCP server for the eCFR (Electronic Code of Federal Regulations) API. Read FAR, DFARS, and all agency FAR supplement text with no authentication required.
No API key required, locally or hosted. See Local or hosted.
Regression tests, including live checks against the eCFR API and a check that every piece of text in ten saved eCFR responses comes out exactly once and in order. The October 2026 releases were also checked with realistic contracting questions (clause lookups, FAR definitions, version history, recent changes). See testing.md.
Local or hosted
Local (desktop) | Claude (hosted) | ChatGPT (hosted) |
Local runs it on your computer, inside the Claude or ChatGPT desktop app or another AI app. You get your own full rate limits, and it relies only on the government service. It doesn't update itself, so ask your AI to update it. You don't have to set it up by hand: give your AI this page's link and ask it to set it up or walk you through it.
Hosted is always up to date, needs no setup or keys, and works in Claude or ChatGPT anywhere.
Compare local and hosted · Matching prompts
Related MCP server: mcp-sam-gov
What it does
Exposes the eCFR API as 13 MCP tools covering regulatory text, structure, search, version history, and common acquisition workflows:
Core endpoints
get_latest_date- Get the most recent available date for a CFR title (call before other tools)get_cfr_content- Get parsed regulatory text for a section, subpart, or partget_cfr_structure- Hierarchical table of contentsget_version_history- Amendment history for a section or partget_ancestry- Breadcrumb hierarchy pathsearch_cfr- Full-text search with hierarchy filterslist_agencies- All agencies with their CFR referencesget_corrections- Editorial corrections for a title
Workflow convenience
lookup_far_clause- One-call FAR/DFARS clause text lookup (auto-resolves date)compare_versions- Side-by-side text comparison at two dateslist_sections_in_part- All sections in a FAR/DFARS partfind_far_definition- Search FAR 2.101 for a term definitionfind_recent_changes- Sections modified since a given date
No authentication required
The eCFR API is fully public. No API key, no registration, no auth headers. Just install and use.
Installation
Via uvx (recommended)
uvx ecfr-mcpVia pip
pip install ecfr-mcpFrom source
git clone https://github.com/1102tools-dev/federal-contracting-mcps.git
cd federal-contracting-mcps/servers/ecfr-mcp
pip install -e .Configuration
Use the configuration below as the server definition and adapt its placement to your compatible MCP client. For practical requests using this source, see the prompt library.
{
"mcpServers": {
"ecfr": {
"command": "uvx",
"args": ["--refresh-package", "ecfr-mcp", "--from", "ecfr-mcp", "ecfr-mcp"]
}
}
}The --refresh-package flag tells uv to check PyPI for a newer release each time your client launches the server, so fixes arrive automatically; without it, uv keeps serving whatever version it first cached. It adds a moment of network time at startup, so raise your platform's MCP startup timeout if it enforces a short one.
Restart the client. The ecfr server appears with 13 tools.
Example prompts
"Pull the current text of FAR 15.305 (Proposal Evaluation) and summarize what it requires."
"List all sections in FAR Part 19 (Small Business Programs)."
"Look up the FAR definition of 'commercial product' in 2.101."
"What FAR sections were amended in the last 6 months?"
"Compare FAR 52.212-4 between 2024-01-01 and 2025-01-01 and show me what changed."
"Get the current text of DFARS 252.227-7014 (Rights in Noncommercial Computer Software)."
"Search Title 48 for 'organizational conflict of interest' and show me the relevant sections."
"Which agency owns Chapter 8 in Title 48? Get their FAR supplement structure."
Design notes
XML parsed server-side. The eCFR content endpoint returns raw XML. This server parses it into clean text (headings, paragraphs, citations) before returning to the model, saving significant context tokens.
Automatic date resolution. eCFR lags 1-2 business days behind the Federal Register. Using today's date on versioner endpoints causes 404 errors. All content tools auto-resolve to the latest available date unless you specify one.
Search defaults to current text. Without
date=current, eCFR search returns ALL historical versions including superseded. Defaultcurrent_only=Trueprevents duplicate results.Structure endpoint limitation. The eCFR structure endpoint does not support section-level filtering (returns 400).
list_sections_in_partworks around this by fetching the part structure and walking the tree.FAR 2.101 optimization. The definitions section is ~109KB of XML.
find_far_definitionparses the full section server-side and returns only matching paragraphs with context.
CFR Title 48 quick reference
Chapter | Regulation | Parts |
1 | FAR | 1-99 |
2 | DFARS | 200-299 |
3 | HHSAR | 300-399 |
4 | AGAR | 400-499 |
5 | GSAR | 500-599 |
6 | DOSAR | 600-699 |
7 | AIDAR | 700-799 |
8 | VAAR | 800-899 |
9 | DEAR | 900-999 |
18 | NFS | 1800-1899 |
Data source
All data from ecfr.gov, the continuously updated online Code of Federal Regulations maintained by the Office of the Federal Register. Updated daily, typically 1-2 business days after Federal Register publication. Not an official legal edition; for official citations reference the annual CFR from GPO.
Part of
federal-contracting-mcps: monorepo of 9 MCP servers for federal contracting data. Pair these sources with the MCP prompt library.
License
MIT
Available Tools
13 toolscompare_versionsARead-only
Compare the text of a CFR section at two different dates.
Useful for understanding what changed in a regulatory amendment. Returns 'changes' (each paragraph that was added, removed or changed, with its before and after text; also heading, table and pending-amendment-link changes), 'identical' when nothing differs, and the parsed text at both dates side by side. When both texts together are too long to send, the full texts are left out (texts_omitted) and 'changes' is kept. changes_only=True leaves the full texts out every time: the short answer to "what changed".
Dates must be in YYYY-MM-DD format. Historical snapshot availability varies by title and section, including some dates before 2017. Use get_version_history to discover dates. Both dates must not exceed the title's up_to_date_as_of value.
This tool always returns the section-level XML parsed -- pass a small section_id like '15.305', not a whole part. Whole-part comparisons can exceed 100 KB per side.
| Name | Required | Description | Default |
|---|---|---|---|
| chapter | No | ||
| date_after | Yes | ||
| section_id | Yes | ||
| date_before | Yes | ||
| changes_only | No | ||
| title_number | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the read-only/open-world safety profile, and the description goes well beyond them: return payload keys ('changes', 'identical'), the size-based omission behavior (texts_omitted), the changes_only bypass, date format constraints, snapshot availability variance, and the up_to_date_as_of ceiling. This is substantial disclosure for a read tool.
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 purpose, then return shape, then constraints — a sensible ordering where the 'short answer' framing for changes_only is a nice compression. It runs long across several short paragraphs, and a couple of constraint sentences could be tightened, but nothing is 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?
For a 6-param, 3-required comparison tool with an output schema, the description supplies everything an agent needs that the schema does not: date semantics, sizing caution, omission behavior, and discoverability path. Even though the output schema covers return shapes, the added operational caveats make this feel complete rather than redundant.
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?
With 0% schema description coverage, the description must carry parameter meaning, and it does for the important ones: date format (YYYY-MM-DD), what changes_only=True does, and the size/type constraint on section_id ('15.305', not a whole part). It does not explain the chapter parameter or the significance of title_number (defaulting to 48), leaving two of six params undocumented.
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+scope: 'Compare the text of a CFR section at two different dates.' It immediately differentiates from siblings by framing the task as amendment diffing rather than retrieval, and it names get_version_history as the companion tool for date discovery.
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?
States the use case ('understanding what changed in a regulatory amendment'), names the alternative tool for finding dates ('Use get_version_history to discover dates'), and gives exclusions/limits ('pass a small section_id like 15.305, not a whole part'). An agent knows when to pick this and what not to do with it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_far_definitionARead-only
Find a term's definition in FAR 2.101, the FAR's main definitions section.
Returns each matching definition whole (the defining paragraph and every sub-paragraph under it), first, marked kind='definition'. Matching ignores case, hyphens, spacing, plurals, a trailing "means", and the acronym 2.101 puts in a name, so 'service-disabled veteran-owned small business concern', 'SDVOSB concern', 'COTS', 'commercial services' and 'contract means' all find their definitions. Other 2.101 paragraphs that use the term (whole words only) follow as kind='mention', each naming the definition it sits in.
When 2.101 doesn't define the term, the tool searches the rest of the FAR (chapter 1), then the DFARS (chapter 2), for "" means and returns where it is defined, with the definition text, under defined_elsewhere (for example 19.001 and 52.219-14 for 'similarly situated entity'; 204.7301 for 'covered defense information'), plus did_you_mean suggestions from 2.101.
term must be at least 3 characters. max_matches caps the number of matches returned (default 20, max 100); definitions are never cut, and truncated says whether mentions were left out.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| term | Yes | ||
| max_matches | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only, non-destructive, and open-world, and the description adds substantial behavior beyond them: normalization rules (case, hyphens, spacing, plurals, trailing 'means'), the two result kinds, the fallback chain with did_you_mean, and the truncation flag. This is far more than the structured fields convey.
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?
Dense but front-loaded, leading with the purpose and then the matching and fallback behavior. Every sentence carries information, though the matching-rules sentence is long and a little list-heavy.
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?
Even though an output schema exists, the description defines the meaningful return shape (kind='definition' vs 'mention', defined_elsewhere, did_you_mean, truncated) and the fallback semantics an agent needs to interpret results. Complete for this tool.
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%, so the description must carry the load; it defines term's 3-character minimum and max_matches' default (20) and cap (100), plus the interaction between max_matches and truncation. The third parameter, date, is never mentioned, leaving one 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?
States a specific verb (find) plus resource (a term's definition in FAR 2.101) and scopes it to the FAR's main definitions section. It is clearly distinguishable from siblings like lookup_far_clause or search_cfr, which serve different retrieval needs.
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?
Gives clear context for use, including the fallback path when 2.101 lacks the term (chapter 1 then chapter 2), and shows example inputs. It does not explicitly compare itself to a sibling search tool, but the intended usage is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
find_recent_changesARead-only
Find CFR sections changed since a given date, removals included.
Built on eCFR's version history: every version issued on or after since_date, newest first. Each change says whether the section was amended, removed (change='removed'), or re-issued with no text change (substantive=false). 'summary' counts each kind. A section changed twice appears twice.
since_date must be in YYYY-MM-DD format. Filter with title (default 48), chapter (Title 48: 1 = FAR, 2 = DFARS, 99 = CAS) or part. per_page (default 100, max 5000) and page step through long lists; total_pages says how many pages there are.
Common pattern: find FAR changes since a specific date to check for regulatory updates that might affect ongoing acquisitions.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| part | No | ||
| title | No | ||
| chapter | No | ||
| per_page | No | ||
| since_date | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry the safety profile (readOnly, non-destructive), yet the description adds substantial behavior: removal vs amendment vs re-issue semantics, substantive=false for no-text-change, duplicate rows for twice-changed sections, summary counts, and pagination limits (per_page max 5000, total_pages). This is rich disclosure beyond the 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?
Front-loaded with purpose and change semantics, then parameters, then the common pattern – a sensible order. It is slightly padded by the line-break formatting and the redundant 'summary counts each kind' / 'appears twice' sentences, but nearly every line carries load.
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 the description needn't define return shape, and it still explains the meaningful fields (summary, total_pages) at the business-logic level. Combined with full parameter documentation, an agent has everything needed to invoke and interpret results.
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%, so the description carries the full burden and does so: since_date format (YYYY-MM-DD), title default 48, chapter mapping (1=FAR, 2=DFARS, 99=CAS), part, per_page default/max, and page. Every one of the six parameters gains meaning not present in 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?
States a specific verb+resource (+scope): 'Find CFR sections changed since a given date, removals included,' and immediately distinguishes itself via version-history semantics. An agent can tell this apart from get_version_history or compare_versions without opening a 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?
Provides a concrete usage context ('find FAR changes since a specific date to check for regulatory updates') and the default filters that make that pattern work. It does not explicitly name which sibling to use instead (e.g., get_version_history for a single section), so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_ancestryBRead-only
Get the breadcrumb hierarchy path for a section, part, or appendix.
Returns ancestors from title down to the target node: title > chapter > subchapter > part > subpart > section. Useful for understanding where a section sits in the CFR hierarchy and what regulation it belongs to.
part/subpart/section/appendix accept int or string. The answer says which date it describes.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| part | No | ||
| section | No | ||
| subpart | No | ||
| appendix | No | ||
| title_number | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is covered. The description adds that the response indicates which date it describes, which is genuinely useful, but says nothing about permissions, rate limits, or failure modes for nodes that don't exist.
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 short paragraphs, front-loaded with the core purpose before the return shape and parameter notes. Minor redundancy between the first sentence and the second, which both restate the ancestry concept.
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 needn't be spelled out, and the description covers the main node parameters. However, for a 6-parameter tool with zero schema descriptions, the omission of title_number and any date-format detail leaves the definition partially incomplete.
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% across 6 parameters, so the description carries the full burden. It usefully states that part/subpart/section/appendix accept int or string and ties date to the response, but leaves title_number (default 48), required-ness, and the date parameter's format entirely undocumented.
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 names a specific verb (Get) and resource (ancestry/breadcrumb path) and enumerates the input node types (section, part, appendix). It clearly describes the returned hierarchy shape, but does not distinguish itself from siblings like get_cfr_structure or list_sections_in_part.
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 gives an implied use case ('useful for understanding where a section sits in the CFR hierarchy'), which is clear context, but there is no explicit when-to-use-vs-alternative guidance and no exclusions relative to get_cfr_structure or get_cfr_content.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cfr_contentARead-only
Get the full text of a CFR section, subpart, part, or appendix.
This is the primary workhorse for reading regulatory text. Returns parsed clean text by default: heading, paragraphs and citations, plus tables, notes, examples, images, pending_amendments and editorial_notes when present. Tables, notes and examples are numbered, and a marker like "[See table 1: ...]" sits in the paragraphs where each appears. [fn N] marks a footnote reference. pending_amendments means eCFR links a published amendment that may not be in effect yet. A subpart, part or appendix request returns one object per section under 'sections', each with its own section number and heading. Set raw_xml=True to get the original XML instead.
Answers longer than about 60,000 characters come in pages: the reply says page and total_pages, and page=2 (and so on) returns the rest.
Specify the narrowest scope possible to keep responses manageable:
section='15.305' for a single FAR section
subpart='15.3' for a subpart
part='15' for an entire part (can be large)
chapter='1' for an entire chapter (often >1 MB, avoid)
appendix='Appendix A to Chapter 2' (with chapter='2') for a DFARS appendix
Date auto-resolves to the latest available if not provided. Do NOT use today's date directly -- eCFR lags 1-2 business days and today often 404s.
Title 48 = FAR/DFARS. Chapter 1 = FAR (Parts 1-99), Chapter 2 = DFARS (Parts 200-299). Other chapters = agency FAR supplements (GSAR, VAAR, HSAR, etc.).
For DFARS clauses, use chapter='2' (e.g., section='252.227-7014').
part/subpart/section accept int or string. Common prefix mistakes like section='FAR 15.305' or '48 CFR 15.305' are stripped automatically, and trailing paragraph cites like section='15.305(a)(2)' resolve to the base section '15.305'.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| page | No | ||
| part | No | ||
| chapter | No | ||
| raw_xml | No | ||
| section | No | ||
| subpart | No | ||
| appendix | No | ||
| title_number | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety is covered. The description adds crucial context: eCFR lags 1-2 business days, default returns parsed text with specific markers, pagination behavior for >60k characters, and chapter size warnings. This goes well beyond 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?
Front-loaded with the core purpose, then structured with bullet-point examples for each scope parameter. Every sentence earns its place by providing actionable detail. Despite length, it is information-dense and well-organized.
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?
Has an output schema, so return format is partly covered, but the description supplements with parsing details, marker explanations (e.g., '[fn N]', pending_amendments), and pagination behavior. Covers all complexity for a 9-parameter tool with no required params.
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 compensate. It documents all readable parameters: section, subpart, part, chapter, appendix, raw_xml, date, page, title_number. It provides syntax examples, explains auto-resolution, and warns against today's date. This is comprehensive.
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 (Get) and resource (full text of a CFR section, subpart, part, or appendix). It differentiates from siblings by calling itself 'the primary workhorse for reading regulatory text', contrasting with search_cfr or get_cfr_structure for discovery.
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?
Explicitly names when to use each scope (section for a single section, subpart for a subpart, part for an entire part, chapter for >1MB, appendices). It warns against using today's date due to eCFR lag and advises narrowest scope. This is rich practical guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_cfr_structureARead-only
Get the hierarchical table of contents for a CFR title or subset.
Returns a nested tree of titles, chapters, parts, subparts, and sections with identifiers, descriptions, and byte sizes, plus the date it describes.
IMPORTANT: Does NOT support section-level filtering (returns 400). Use part or subpart, then walk the children to find sections.
Common patterns:
part='15' for FAR Part 15 structure
subpart='15.3' for just that subpart's sections
chapter='1', depth=2 for the FAR's subchapters and parts only
appendix='Appendix A to Part 200' with part='200' (title 2) for one appendix
depth keeps that many levels below the node asked for (part='19', depth=1 gives Part 19's subparts); deeper levels are replaced by 'children_omitted' (how many there were). For the sections of one part, list_sections_in_part is shorter. A tree too large to send at once (a whole chapter is about 1 MB) is cut to the deepest depth that fits, and 'note' says so.
subchapter needs chapter in Title 48 (each chapter has its own subchapter A, B, ...). part/subpart/chapter/appendix accept int or string.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| part | No | ||
| depth | No | ||
| chapter | No | ||
| subpart | No | ||
| appendix | No | ||
| subchapter | No | ||
| title_number | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, non-destructive, open world), yet the description still adds real behavioral detail: the 400 on section-level filtering, depth's replacement of deeper levels with 'children_omitted', automatic truncation of oversized trees with a 'note' field, and the Title 48 subchapter-needs-chapter constraint. These are failure modes an agent cannot infer from 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?
Front-loaded with the purpose and the critical limitation, then organized under a 'Common patterns' header. Slightly long and the parenthetical byte-size aside is nearly filler, but every block conveys distinct usable 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 read-only tool with 8 optional selectors and an output schema handling return values, the description covers selection logic, depth/truncation behavior, and edge cases well. The only meaningful omission is guidance on the date parameter, which determines whether the agent queries get_latest_date first.
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% across 8 parameters, so the description carries the load and mostly does: depth semantics, subchapter/chapter coupling, int-or-string acceptance for part/subpart/chapter/appendix, and worked examples for each selector. It leaves the date parameter's meaning (which point-in-time to request, versus get_latest_date) and why title_number defaults to 48 unexplained.
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 ('Get the hierarchical table of contents for a CFR title or subset') and immediately differentiates itself from the sibling that overlaps most, list_sections_in_part, for getting sections of a single part. An agent can select this over the other 12 siblings without opening a 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?
Explicit exclusions ('Does NOT support section-level filtering (returns 400). Use part or subpart'), a named alternative for the narrowing case, and four concrete invocation patterns covering part, subpart, chapter+depth, and appendix. This is about as prescriptive as usage guidance gets.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_correctionsARead-only
Get editorial corrections for a CFR title, newest first.
Returns corrections with CFR references, corrective actions, error dates, and FR citations, sorted by the date the error was corrected, newest first. Useful for checking whether a section's current text has been corrected since its last amendment.
section (e.g. '52.204-21'), part (e.g. '52') or chapter (e.g. '2' for the DFARS) keeps only corrections that touch it. since_year keeps corrections with year >= since_year. limit caps how many are returned (default 50, max 1000); truncated says whether older ones were left out. Title 48 has ~280 corrections since 2005.
| Name | Required | Description | Default |
|---|---|---|---|
| part | No | ||
| limit | No | ||
| chapter | No | ||
| section | No | ||
| since_year | No | ||
| title_number | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/safe, but the description adds valuable context: the sort order, the truncation flag, the default/max limits, and the approximate data volume ('~280 corrections since 2005'). It does not mention auth or rate limits, but for a read-only tool this is solid added 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 front-loaded with purpose and behavior, then parameters. It is slightly long but every sentence earns its place except perhaps the redundant restatement of sorting behavior.
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, the description needn't detail return values, and it covers purpose, filtering semantics, sort order, limits, truncation, and data scale. An agent can invoke it correctly without further info.
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 parameter meaning. It explains section/part/chapter semantics (hierarchical filtering), since_year (year >= threshold), limit (default 50, max 1000), and truncated, compensating well for the missing schema descriptions, though title_number's default of 48 is left implicit.
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 opens with a specific verb+resource ('Get editorial corrections for a CFR title') and the sorting behavior ('newest first'), which distinguishes it from siblings like get_version_history or find_recent_changes.
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 gives clear context for use ('checking whether a section's current text has been corrected since its last amendment') but does not explicitly name alternatives or state when not to use it versus siblings like get_version_history.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_latest_dateARead-only
Get the most recent available date for a CFR title.
CRITICAL: eCFR lags 1-2 business days behind the Federal Register. Using today's date on versioner endpoints causes 404 errors. Call this first to get the safe date, then pass it to other tools.
Default title 48 = Federal Acquisition Regulations System (FAR, DFARS, and all agency supplements). Other common titles: 2 (Grants/Agreements), 5 (Administrative Personnel), 29 (Labor), 41 (Public Contracts).
Raises ValueError for titles 1-50 that are reserved (no content).
| Name | Required | Description | Default |
|---|---|---|---|
| title_number | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
While annotations already mark the tool as read-only and non-destructive, the description adds crucial behavioral details: the data lag (1-2 business days), the resulting 404 error on versioner endpoints with today's date, and the ValueError on reserved titles. This goes beyond the structured annotations and gives the agent essential knowledge to sequence calls correctly.
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 fairly long, but every portion serves distinct purposes: the warning highlights a critical usage timing, the title mapping gives practical examples, and the error note sets expectations. The layout is clear, starting with the main purpose, then the caution, then defaults/exceptions. Some redundancy exists but overall it remains focused and front-loaded with the most important safety note.
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?
The tool is simple (one parameter) and has an output schema; the description covers all that an agent needs before the call: when to use, what default to rely on, which titles are meaningful, and what exceptions to expect. It does not attempt to describe the return structure (unnecessary due to the output schema) but still completes the contextual picture of why this tool exists and how to safely call it.
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 input schema provides the integer type and default, but no further meaning. The description compensates by clarifying the default is title 48, listing other common titles, and implicitly stating that valid titles are 1-50 via the error condition. This is valuable semantic grounding for an otherwise bare schema, though the description does not explicitly duplicate the parameter name 'title_number'.
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 the tool's specific action: 'Get the most recent available date for a CFR title.' This clearly distinguishes it from siblings like get_version_history or find_recent_changes which focus on changes or versions. It also explicitly mentions the fallback usage as a pre-call for other endpoints.
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 gives explicit when-to-use instructions: 'Call this first to get the safe date, then pass it to other tools' for avoiding 404 errors. It includes a concrete warning about eCFR lag and explains partial error behavior with reserved titles, effectively instructing the agent on the proper invocation context. It also provides default and common titles to manage expectations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_version_historyARead-only
Get the version history of a CFR section, subpart, or part.
Returns content_versions (each with date, amendment_date, issue_date, identifier, name, substantive and removed), every version eCFR lists: all of eCFR's pages are read, so Part 52's 2,264 versions are all there. Versions are grouped by section, oldest first.
since_date/until_date (YYYY-MM-DD) keep versions dated in that range. per_page (default 200, max 1000) and page step through long histories; total_count and total_pages say how many there are.
'substantive' is eCFR's flag: true when the version's text differs from the one before, including editorial edits such as citation fixes and the "Link to an amendment published at ..." notice eCFR adds when a rule is published; false when re-issued with no text change. To see what actually changed, use compare_versions on the dates.
'removed' true means the section was removed on that date.
Version metadata and text snapshots may include dates before 2017. Availability varies by title and section. Use the returned history dates for reads or comparisons; a missing old snapshot produces an availability error. A 2017-01-01 baseline often means unchanged since before 2017.
part/subpart/section accept int or string.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| part | No | ||
| section | No | ||
| subpart | No | ||
| per_page | No | ||
| since_date | No | ||
| until_date | No | ||
| title_number | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/non-destructive, and the description adds real behavioral context beyond them: full read of every eCFR page (Part 52's 2,264 versions), versions grouped by section oldest-first, the meaning of the 'substantive' and 'removed' flags, pagination defaults, and the realistic failure mode (a missing old snapshot yields an availability error). This is unusually thorough disclosure for a read tool.
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 purpose and return shape, then params, then semantics and caveats in short paragraphs. Dense and useful overall, though slightly long and mildly repetitive around the availability/2017-baseline caveat.
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?
Covers the hard parts an agent needs—the return shape, flag semantics, pagination, and the pre-2017 snapshot availability trap. Since an output schema exists it need not describe returns, and the only substantive omission is the undocumented title_number parameter.
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?
With 0% schema description coverage, the description must carry the params and mostly does: date formats for since_date/until_date, per_page default/max, page, and that part/subpart/section accept int or string. It never mentions title_number (default 48) nor whether part/subpart/section are mutually exclusive, leaving a gap in an otherwise strong pass.
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 precise verb+resource+scope: 'Get the version history of a CFR section, subpart, or part.' It also names the sibling to use instead for a related need (compare_versions), so an agent can place it among the 13 siblings without opening a 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?
Clear routing advice: 'To see what actually changed, use compare_versions on the dates,' plus guidance on when since_date/until_date and pagination matter and when a 2017-01-01 baseline implies no change. No explicit when-not-to-use statement, but the conditions are well covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_agenciesARead-only
List all agencies with their CFR title and chapter references.
Returns agency names, slugs, and which CFR titles/chapters they own. Useful for finding which chapter corresponds to an agency's FAR supplement.
summary_only (default True) strips the children and most of
cfr_references to keep the response compact (~20 KB vs ~100 KB).
References owned by child agencies are merged into the parent row, so
chapter lookups like DFARS (chapter 2, on a DoD child agency) still work
in summary mode. Set False for the full raw payload including children.
| Name | Required | Description | Default |
|---|---|---|---|
| summary_only | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool as readOnly and non-destructive; the description goes well beyond this by explaining that summary_only strips children and most cfr_references, merges child-owned references into the parent row, and changes payload size from ~100 KB to ~20 KB. The DFARS example clarifies a subtle consequence of that merging, which is exactly the kind of behavioral nuance an agent needs.
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 five sentences with the core action and return information first, followed by a concrete use case and then parameter details. Each sentence adds distinct value with no 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?
The tool has an output schema and only one optional boolean parameter; the description covers the tool's purpose, return fields, the summary mode's data implications, and how to opt out. Nothing needed to invoke it correctly 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?
The schema only gives the parameter a title and default, with no descriptive text. The description fully explains summary_only: it strips children and most cfr_references, merges child-owned references into the parent row, and setting False returns the full raw payload. This thoroughly compensates for the 0% schema description coverage.
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 opens with a specific verb ('List'), a clear resource ('all agencies'), and a scope ('with their CFR title and chapter references'), more specific than the tool name alone. It further states the return fields (agency names, slugs, CFR titles/chapters), making it easy to distinguish from siblings like get_cfr_content or list_sections_in_part.
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 line 'Useful for finding which chapter corresponds to an agency's FAR supplement' gives a concrete scenario for selecting this tool, which is clear usage guidance. It does not explicitly name alternative tools or say when not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sections_in_partARead-only
List all sections and appendices in a CFR part with their headings.
Returns 'sections' in order, each {identifier, heading}, with type='appendix' on appendices (2 CFR 200's Appendix I-XII, for example) and reserved=true on reserved sections, plus 'subparts' (each with its heading, section_count and first and last section). Useful for seeing the scope of a part before reading specific sections.
The part number alone is enough: chapter is optional (Title 48 parts are unique: 52 = FAR, 252 = DFARS, 552 = GSAR) and the answer reports the chapter the part is in. subpart (e.g. '52.2') lists one subpart. A list too long to send at once (FAR Part 52 has 680 entries) comes in pages: page and total_pages say where you are; page=2 gets the rest. detail=True adds eCFR's label, size and received_on for each entry (received_on is when eCFR processed the text, not when it was amended; get_version_history has amendment dates).
part_number accepts int or string.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| page | No | ||
| detail | No | ||
| chapter | No | ||
| subpart | No | ||
| part_number | Yes | ||
| title_number | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/openWorldHint, so the safety profile is covered. The description adds genuinely useful behavior beyond that: pagination semantics ('page and total_pages say where you are; page=2 gets the rest'), the 680-entry scale warning, and the exact meaning of detail's received_on field. No auth or rate-limit detail, hence not 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?
Front-loaded with the core action and return shape, then layered with parameter guidance. Dense but all sentences carry information; the parenthetical examples (2 CFR 200 Appendix I-XII, 52/252/552) earn their space. Slightly long for the payload.
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-value explanations are technically optional, yet the description still clarifies what an agent needs to paginate and interpret entries. The only substantive hole is the undocumented `date` parameter, which for a versioned regulatory lookup is a real gap.
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 carries the full burden and does explain part_number type flexibility, chapter optionality with FAR/DFARS/GSAR examples, subpart ('52.2'), page, detail, and the title_number default of 48. However, the `date` parameter is never mentioned, leaving one of seven params with no semantics anywhere.
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+scope: 'List all sections and appendices in a CFR part with their headings.' It names concrete return artifacts (sections, subparts, type='appendix', reserved=true) and contrasts against the sibling that reads content ('before reading specific sections'), so an agent can distinguish it from get_cfr_content without opening schemas.
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?
Gives clear usage context ('seeing the scope of a part before reading specific sections') and routes a nuance to a sibling: detail=True's received_on is explicitly not amendment dates, and get_version_history is named as the right tool for those. It stops short of explicit when-not-to-use or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lookup_far_clauseARead-only
Convenience tool: look up the current text of a FAR, DFARS or FAR supplement section or clause.
Pass a section identifier like '15.305', '52.212-4', '2.101', 'DFARS 252.204-7012' or '552.238-81'. The chapter comes from the number (52.x = FAR, 252.x = DFARS, 552.x = GSAR, 852.x = VAAR, 1852.x = NFS, 3052.x = HSAR), so chapter is optional. Prefixes like 'FAR', 'DFARS', '§' and '48 CFR', en dashes, and trailing paragraph cites such as '(d)(11)(xviii)' are handled.
Auto-resolves the latest available date. Returns parsed clean text with heading, paragraphs and citations, plus tables, notes (such as drafting notes, which are not clause text), examples, images and pending_amendments when present; see get_cfr_content. A clause longer than about 60,000 characters comes in pages: use page=2 and so on.
Common FAR sections: 2.101 (Definitions), 9.104-1 (Responsibility), 15.305 (Proposal Evaluation), 19.502-2 (Small Business Set-Asides), 52.212-4 (Commercial Terms), 52.212-5 (Required Commercial Terms).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | ||
| page | No | ||
| chapter | No | ||
| section_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/openWorld/destructive, but the description adds real behavioral value: auto-resolution of the latest date, parsed output contents (headings, paragraphs, tables, notes vs clause text), and a concrete pagination rule ('clause longer than about 60,000 characters comes in pages: use page=2'). The only gap is rate/limit or freshness caveats, which are minor here.
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-loads the one-line purpose, then groups format handling, resolution behavior, output shape, and examples. It is a bit long, and the 'Common FAR sections' list and 'see get_cfr_content' pointer stretch it, but every block is scannable and earns its place for selection.
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 single-lookup tool with an output schema, the description covers selection, identifier formats, pagination, and result composition. The remaining gap is the lack of explicit routing against its closest siblings (search_cfr, get_cfr_content, find_far_definition).
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?
With 0% schema description coverage, the description carries the load and does so well: it demonstrates section_id formats and tolerated prefixes/en-dashes/trailing cites, and derives chapter from the number. page is explained via the pagination rule. date is only described as auto-resolving the latest available date, leaving its override semantics slightly vague.
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 ('look up the current text of a FAR, DFARS or FAR supplement section or clause') and names the sibling it defers to ('see get_cfr_content'). An agent can distinguish it from search_cfr and find_far_definition 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?
Explains the calling context clearly: pass a section identifier, chapter is optional because it derives from the number, and it lists common sections to guide selection. It stops short of explicit when-not-to-use guidance versus search_cfr or find_far_definition, so it is context-clear but not exclusionary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_cfrARead-only
Full-text search across the Code of Federal Regulations.
Returns matching sections with excerpts, headings, scores, and hierarchy.
current_only=True (default) returns only text in effect now. eCFR's own "current" index still lists some superseded and removed versions, so each hit is checked against the section's version history: older copies of a section are dropped, and hits whose text has since been replaced or removed are dropped and listed under current_check ('superseded' with the current version's date, 'removed' with the removal date). Up to 10 parts per page are checked; any hit not checked is marked. current_only=False returns every historical version, so a section amended 5 times appears 5 times.
Search caps at 10,000 total results. Use hierarchy filters (title, chapter, part) to narrow if you hit the cap. chapter/part/subpart/section filters need a title; without one, title 48 is assumed (title_assumed says so). Labels like 'FAR Part 15', 'Subpart 15.3' or '§ 52.212-5' are read as 15, 15.3 and 52.212-5. Most titles other than 48 number chapters in Roman numerals (2 CFR chapter 'II').
order controls result ordering: 'relevance' (default), 'newest_first', 'oldest_first', 'hierarchy', or 'citations'.
agency_slugs filters to one or more agencies (single slug string or a list, e.g. 'defense-acquisition-regulations-system'). Use list_agencies() to find slugs.
last_modified_after/before use YYYY-MM-DD format and filter by the date sections were last amended. Useful for finding recent regulatory changes.
per_page accepts 1 to 5000 (default 20); paginate with page for more.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| part | No | ||
| order | No | ||
| query | Yes | ||
| title | No | ||
| chapter | No | ||
| section | No | ||
| subpart | No | ||
| per_page | No | ||
| agency_slugs | No | ||
| current_only | No | ||
| last_modified_after | No | ||
| last_modified_before | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite readOnly/destructive/openWorld annotations already covering safety, the description adds substantial non-obvious behavior: the current_only version-history filtering, dropping superseded/removed hits with dates, the 'up to 10 parts per page checked' limit and unchecked markers, and the 10,000 result cap. This is exactly the behavioral context annotations can't convey.
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 purpose and return shape, then organized by parameter group. Information density is high and nearly every sentence carries a distinct fact, though the multi-line current_only explanation is somewhat verbose relative to the rest.
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 13-param search tool, the description covers filtering, ordering, pagination, date filtering, result caps, and version-history edge cases. With an output schema present it needn't restate return fields, yet it still flags the current_check structure, leaving nothing essential for correct invocation 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?
With 0% schema description coverage across 13 parameters, the description carries the full burden and does so: order's five enumerable values, agency_slugs format and list-acceptance, YYYY-MM-DD format for last_modified_after/before, per_page 1-5000 (default 20), page pagination, current_only default semantics, and the title-dependency of chapter/part/subpart/section filters.
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?
Starts with a specific verb+resource: 'Full-text search across the Code of Federal Regulations,' and immediately clarifies the return shape (sections with excerpts, headings, scores, hierarchy). An agent can distinguish it from siblings like get_cfr_content or get_cfr_structure 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete usage guidance: use hierarchy filters to narrow when hitting the 10,000 cap, use list_agencies() to find valid agency slugs, and explains the title-assumption fallback. It lacks explicit when-not-to-use / sibling-alternative routing, so it falls short of a 5.
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.
9 tool updates
v1.0.33- Changed
compare_versions1 field changed- added
Input schema / properties / changes_onlyAdded value: +{ + "default": false, + "title": "Changes Only", + "type": "boolean" +}
- Changed
find_recent_changes1 field changed- added
Input schema / properties / pageAdded value: +{ + "default": 1, + "title": "Page", + "type": "integer" +}
- Changed
get_ancestry1 field changed- added
Input schema / properties / subpartAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Subpart" +}
- Changed
get_cfr_content1 field changed- added
Input schema / properties / pageAdded value: +{ + "default": 1, + "title": "Page", + "type": "integer" +}
- Changed
get_cfr_structure1 field changed- added
Input schema / properties / depthAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Depth" +}
- Changed
get_corrections3 fields changed- added
Input schema / properties / chapterAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Chapter" +} - added
Input schema / properties / partAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Part" +} - added
Input schema / properties / sectionAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Section" +}
- Changed
get_version_history4 fields changed- added
Input schema / properties / pageAdded value: +{ + "default": 1, + "title": "Page", + "type": "integer" +} - added
Input schema / properties / per_pageAdded value: +{ + "default": 200, + "title": "Per Page", + "type": "integer" +} - added
Input schema / properties / since_dateAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Since Date" +} - added
Input schema / properties / until_dateAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Until Date" +}
- Changed
list_sections_in_part5 fields changed- changed
Input schema / properties / chapter / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "integer" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / chapter / defaultPrevious value: -"1"New value: +null - added
Input schema / properties / detailAdded value: +{ + "default": false, + "title": "Detail", + "type": "boolean" +} - added
Input schema / properties / pageAdded value: +{ + "default": 1, + "title": "Page", + "type": "integer" +} - added
Input schema / properties / subpartAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Subpart" +}
- Changed
lookup_far_clause3 fields changed- changed
Input schema / properties / chapter / anyOfPrevious value: -[ - { - "type": "string" - }, - { - "type": "integer" - } -]New value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +] - changed
Input schema / properties / chapter / defaultPrevious value: -"1"New value: +null - added
Input schema / properties / pageAdded value: +{ + "default": 1, + "title": "Page", + "type": "integer" +}
9 tool updates
v1.0.7- Changed
compare_versions2 fields changed- added
Input schema / properties / chapter / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / section_id / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + } +]
- Changed
find_recent_changes2 fields changed- added
Input schema / properties / chapter / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / part / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +]
- Changed
get_ancestry3 fields changed- added
Input schema / properties / appendixAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Appendix" +} - added
Input schema / properties / part / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / section / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +]
- Changed
get_cfr_content5 fields changed- added
Input schema / properties / appendixAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Appendix" +} - added
Input schema / properties / chapter / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / part / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / section / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / subpart / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +]
- Changed
get_cfr_structure5 fields changed- added
Input schema / properties / appendixAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Appendix" +} - added
Input schema / properties / chapter / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / part / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / subchapter / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / subpart / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +]
- Changed
get_version_history3 fields changed- added
Input schema / properties / part / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / section / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / subpart / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +]
- Changed
list_sections_in_part2 fields changed- added
Input schema / properties / chapter / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + } +] - added
Input schema / properties / part_number / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + } +]
- Changed
lookup_far_clause2 fields changed- added
Input schema / properties / chapter / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + } +] - added
Input schema / properties / section_id / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + } +]
- Changed
search_cfr6 fields changed- added
Input schema / properties / agency_slugsAdded value: +{ + "anyOf": [ + { + "items": { + "type": "string" + }, + "type": "array" + }, + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Agency Slugs" +} - added
Input schema / properties / chapter / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / orderAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Order" +} - added
Input schema / properties / part / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / section / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +] - added
Input schema / properties / subpart / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "integer" + }, + { + "type": "null" + } +]
13 tool updates
v0.2.6- First observed
compare_versions - First observed
find_far_definition - First observed
find_recent_changes - First observed
get_ancestry - First observed
get_cfr_content - First observed
get_cfr_structure - First observed
get_corrections - First observed
get_latest_date - First observed
get_version_history - First observed
list_agencies - First observed
list_sections_in_part - First observed
lookup_far_clause - First observed
search_cfr
TDQS
Scored across 13 tools
Tools mostly target distinct operations: content retrieval, structure browsing, search, history, comparison, changes, corrections, and definitions. The main overlap is lookup_far_clause, which is explicitly a convenience wrapper over get_cfr_content and could cause misselection for FAR/DFARS section reading. get_cfr_structure and list_sections_in_part also have some structural browsing overlap, but descriptions clarify their different scopes.
All tools use snake_case with a predictable verb_noun or verb_noun_phrase pattern (get_*, list_*, search_*, find_*, compare_*, lookup_*). The naming is readable and consistent throughout, with no mixed conventions.
13 tools is well-scoped for a complex regulatory retrieval server covering lookup, search, structure, history, changes, corrections, and definitions. Each tool has a plausible role, and the count stays within a manageable range.
The server provides broad read-only lifecycle coverage for eCFR/FAR data: current content, structure, section lists, version history, comparisons, recent changes, corrections, agency mappings, and definitions. No obvious retrieval or discovery operation is missing for its stated purpose.
Maintenance
Related MCP Connectors
Source-linked US federal regulations: CFR provision history, obligations, rules, comments.
Six tools over US federal procurement: SAM.gov, FPDS awards, entities, subawards, exclusions.
SAM.gov contracts and USAspending awards. 4 procurement tools.
US federal contracts: solicitations, set-asides, deadlines, awards, contractor profiles. Free.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceFederal procurement intelligence toolkit that searches SAM.gov contract opportunities, analyzes agency spending patterns, tracks competitor wins, and monitors small business set-aside programs (8a, HUBZone, SDVOSB, WOSB). 4 tools using SAM.gov and USASpending.gov data.3-
- AlicenseAqualityAmaintenanceThe most comprehensive keyless federal-data MCP server. 36 tools for SAM.gov + USAspending + Federal Register + eCFR + Grants.gov. No API key, no registration, no signup. Works in Claude Desktop, Claude Code, Codex CLI, Cursor, Continue, Gemini CLI, and any MCP-aware host.153159 npm11MIT
- AlicenseAqualityBmaintenanceA production-quality MCP server that exposes the official eCFR API as structured tools for AI-driven contract compliance, enabling retrieval of relevant Code of Federal Regulations by clauses extracted from contracts.8Academic Free v1.1
- FlicenseNot gradedqualityAmaintenanceFind federal contract opportunities, research awards and vendors, and review exclusion evidence with linked official sources. Public research is free and needs no account.-