eCFR

com.1102toolsPublished by 1102tools.comOfficial publisherv1.1.15Updated Nov 3, 2026

Electronic Code of Federal Regulations including FAR, DFARS, and agency supplements. 13 tools.

The publisher's own server: Acquisition.gov

VerifiedStreamable HTTPWeb executableKnowledge & MemoryBusiness & Commerce

Overview

eCFR's hosted MCP server (ecfr.1102tools.com), published by 1102tools.com; no sign-in required; Streamable HTTP; 13 tools.

No AI overview yet: these facts come from the registry entry and the server itself.

Publisher
1102tools.com
Endpoint
ecfr.1102tools.com
Last checked

Installation

In SourceWeft

  1. Open eCFR in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/com.1102tools%2Fecfr-mcp/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "ecfr": {
      "type": "http",
      "url": "https://ecfr.1102tools.com/mcp"
    }
  }
}

README

ecfr-mcp

[price: free] [license: MIT] [tools: 13] [regression tests]

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.

Overview, demo video and hosted setup: https://1102tools.com/mcp/ecfr

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 setupInstallInstall
  • 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

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 part
  • get_cfr_structure - Hierarchical table of contents
  • get_version_history - Amendment history for a section or part
  • get_ancestry - Breadcrumb hierarchy path
  • search_cfr - Full-text search with hierarchy filters
  • list_agencies - All agencies with their CFR references
  • get_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 dates
  • list_sections_in_part - All sections in a FAR/DFARS part
  • find_far_definition - Search FAR 2.101 for a term definition
  • find_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)

bash
uvx --refresh-package ecfr-mcp --from ecfr-mcp ecfr-mcp

Via pip

bash
pip install ecfr-mcp

From source

bash
git clone https://github.com/1102tools-dev/federal-contracting-mcps.gitcd federal-contracting-mcps/servers/ecfr-mcppip 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.

json
{  "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. Default current_only=True prevents duplicate results.
  • Structure endpoint limitation. The eCFR structure endpoint does not support section-level filtering (returns 400). list_sections_in_part works around this by fetching the part structure and walking the tree.
  • FAR 2.101 optimization. The definitions section is ~109KB of XML. find_far_definition parses the full section server-side and returns only matching paragraphs with context.

CFR Title 48 quick reference

ChapterRegulationParts
1FAR1-99
2DFARS200-299
3HHSAR300-399
4AGAR400-499
5GSAR500-599
6DOSAR600-699
7AIDAR700-799
8VAAR800-899
9DEAR900-999
18NFS1800-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

Source: servers/ecfr-mcp/readme.md at commit b30d160

Tools

13

compare_versions

Compare Versions

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.

Parameterschapterdate_afterrequiredsection_idrequireddate_beforerequiredchanges_onlytitle_number

find_far_definition

Find FAR Definition

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 "<term>" 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.

Parametersdatetermrequiredmax_matches

find_recent_changes

Find Recent Changes

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.

Parameterspageparttitlechapterper_pagesince_daterequired

get_ancestry

Get Ancestry

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.

Parametersdatepartsectionsubpartappendixtitle_number

get_cfr_content

Get CFR Content

Get the full text of a CFR section, subpart, part, or appendix. 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'.

Parametersdatepagepartchapterraw_xmlsectionsubpartappendixtitle_number

get_cfr_structure

Get CFR Structure

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.

Parametersdatepartdepthchaptersubpartappendixsubchaptertitle_number

get_corrections

Get Corrections

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.

Parameterspartlimitchaptersectionsince_yeartitle_number

get_latest_date

Get Latest Date

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).

Parameterstitle_number

get_version_history

Get Version History

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.

Parameterspagepartsectionsubpartper_pagesince_dateuntil_datetitle_number

list_agencies

List Agencies

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.

Parameterssummary_only

list_sections_in_part

List Sections in Part

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.

Parametersdatepagedetailchaptersubpartpart_numberrequiredtitle_number

lookup_far_clause

Lookup FAR Clause

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).

Parametersdatepagechaptersection_idrequired

search_cfr

Search CFR

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.

Parameterspagepartorderqueryrequiredtitlechaptersectionsubpartper_pageagency_slugscurrent_onlylast_modified_after+1 more

Version history

12
  1. v1.1.15LatestNov 3, 2026
  2. v1.1.14Oct 29, 2026
  3. v1.1.13Oct 23, 2026
  4. v1.1.12Oct 21, 2026
  5. v1.1.11Oct 17, 2026
  6. v1.1.10Oct 12, 2026
  7. v1.1.9Oct 11, 2026
  8. v1.1.8Oct 10, 2026
  9. v1.1.2Oct 10, 2026
  10. v1.0.13Oct 10, 2026
  11. v1.0.11Oct 9, 2026
  12. v1.0.10Sep 16, 2026

Score

100% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

Other 1102tools integrations