Skip to main content

cfr-mcp

CI PyPI

An MCP server that gives AI assistants access to the US Code of Federal Regulations.

Ask "what does 21 CFR 101.9 require?" or "has 40 CFR 261 changed since 2023?" and get the actual regulation text, with citations, instead of a plausible-sounding guess.

Unofficial community project. Not affiliated with or endorsed by the Office of the Federal Register, NARA, or GPO, and uses no government seals or logos.

Install

Requires Python 3.11+. No API key — the eCFR and Federal Register APIs are open.

Claude Code:

claude mcp add cfr -- uvx cfr-mcp

Any other MCP client:

{
  "mcpServers": {
    "cfr": {
      "command": "uvx",
      "args": ["cfr-mcp"]
    }
  }
}

Tools

Tool What it does
lookup_citation Text of a citation — 21 CFR 101.9, 40 CFR 261.4(b)(1), 40 CFR Part 261 Subpart C
search_regulations Full-text search; returns citations and snippets, never bodies
where_does_term_appear Which titles contain a term, with hit counts. Fetches no text
browse_structure The hierarchy of a title or part, no text
what_changed Amendment history for a citation, linking each change to the Federal Register rule that caused it, plus published corrections
compare_versions Diff of a citation's text between two dates — see exactly what an amendment changed
list_agencies Maps agency names to the CFR titles they administer

Point-in-time works throughout: pass date as YYYY-MM-DD to read the CFR as it stood.

Design notes

Context budget is the whole game. The eCFR full endpoint returns an entire downloadable XML document for a title-level request. Every tool here caps output and degrades to an outline rather than dumping text into the model's context. Title-level XML requests are refused outright.

Dates must be resolved, not assumed. Versioner routes 404 on dates that aren't valid issue dates for a title, so the client resolves through titles.json first rather than passing today's date blindly.

Caching is courtesy. The eCFR publishes no rate limit and has no key to identify callers politely, so the client caches to disk (historical dates forever, since point-in-time content is immutable) and self-limits concurrency. The cache lives in ~/.cache/cfr-mcp (respects XDG_CACHE_HOME); set CFR_MCP_CACHE_DIR to relocate it.

Legal

Regulation text is free to reproduce. 1 CFR 2.6 states that any person may reproduce or republish material appearing in the Federal Register, with no restrictions on what is reproduced, who reproduces it, or where. Federal government works are also outside copyright under 17 U.S.C. §105.

Incorporation by reference. Some CFR sections incorporate private standards (ASTM, NFPA, ASHRAE) whose copyright status after incorporation remains unsettled. The eCFR does not contain the text of those standards and neither does this server — it returns the citation only. Obtain standards from the issuing organization or the Office of the Federal Register reading room.

Status of the text. The eCFR is authoritative but unofficial. Anyone relying on it for legal research should verify against the current official CFR, the daily Federal Register, and the List of CFR Sections Affected (LSA).

Not legal advice. This is a retrieval tool. It returns the text of regulations; it does not tell you whether you are compliant with them.

Development

uv sync --extra dev
uv run pytest

MIT licensed.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cfr_mcp-0.2.1.tar.gz (222.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cfr_mcp-0.2.1-py3-none-any.whl (21.4 kB view details)

Uploaded Python 3

File details

Details for the file cfr_mcp-0.2.1.tar.gz.

File metadata

  • Download URL: cfr_mcp-0.2.1.tar.gz
  • Upload date:
  • Size: 222.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for cfr_mcp-0.2.1.tar.gz
Algorithm Hash digest
SHA256 cf11eaec8c05bef0c63d3ef5222d9012dd80d25e824e54a255392385b970e423
MD5 4eca89d4ef74213054d30baca814ee3b
BLAKE2b-256 aebdd6892158d2b78c28be74143bcc31abe46c96dd43d0fc0c435da233432dc2

See more details on using hashes here.

File details

Details for the file cfr_mcp-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: cfr_mcp-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 21.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.12.7 {"installer":{"name":"uv","version":"0.12.7","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for cfr_mcp-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 4811a368b938e81f5d6640b6dfe628761d5f8229e979a0cd9c5d2fcc92e327e3
MD5 92a9d83cb27a3c6170e5e93d865d4fec
BLAKE2b-256 0300703b75ffb1a3271bbf485370b24857bb148b08960610e00f9d4baf444e2e

See more details on using hashes here.

Release history Release notifications | RSS feed

0.2.2

2 files

This release

0.2.1 This release

2 files

0.2.0

2 files

0.1.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page