ecfr-mcp 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,35 @@
1
+ __pycache__/
2
+ *.py[cod]
3
+ *$py.class
4
+ *.so
5
+ .Python
6
+ build/
7
+ develop-eggs/
8
+ dist/
9
+ downloads/
10
+ eggs/
11
+ .eggs/
12
+ lib/
13
+ lib64/
14
+ parts/
15
+ sdist/
16
+ var/
17
+ wheels/
18
+ *.egg-info/
19
+ .installed.cfg
20
+ *.egg
21
+ MANIFEST
22
+ .env
23
+ .venv
24
+ venv/
25
+ ENV/
26
+ env/
27
+ .pytest_cache/
28
+ .coverage
29
+ .mypy_cache/
30
+ .ruff_cache/
31
+ .DS_Store
32
+ .idea/
33
+ .vscode/
34
+ *.swp
35
+ *.swo
@@ -0,0 +1,14 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0 (2026-04-05)
4
+
5
+ Initial release.
6
+
7
+ - 13 MCP tools covering the eCFR API (admin, versioner, search endpoints)
8
+ - Core: get_latest_date, get_cfr_content, get_cfr_structure, get_version_history, get_ancestry, search_cfr, list_agencies, get_corrections
9
+ - Workflows: lookup_far_clause, compare_versions, list_sections_in_part, find_far_definition, find_recent_changes
10
+ - Server-side XML parsing (Claude never sees raw XML, only clean text with headings, paragraphs, and citations)
11
+ - Automatic date resolution (prevents 404s from eCFR's 1-2 day lag)
12
+ - Search defaults to current-only (prevents historical version duplicates)
13
+ - Actionable error translation for 400/404/406 responses
14
+ - No authentication required
ecfr_mcp-0.1.0/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 1102tools
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,139 @@
1
+ Metadata-Version: 2.4
2
+ Name: ecfr-mcp
3
+ Version: 0.1.0
4
+ Summary: MCP server for the eCFR (Electronic Code of Federal Regulations) API. Read FAR, DFARS, and all agency FAR supplements.
5
+ Project-URL: Homepage, https://1102tools.com
6
+ Project-URL: Repository, https://github.com/1102tools/ecfr-mcp
7
+ Project-URL: Issues, https://github.com/1102tools/ecfr-mcp/issues
8
+ Author: 1102tools
9
+ License: MIT
10
+ License-File: LICENSE
11
+ Keywords: 1102,cfr,dfars,ecfr,far,federal-acquisition,mcp,model-context-protocol,regulations
12
+ Classifier: Development Status :: 3 - Alpha
13
+ Classifier: Intended Audience :: Developers
14
+ Classifier: License :: OSI Approved :: MIT License
15
+ Classifier: Programming Language :: Python :: 3
16
+ Classifier: Programming Language :: Python :: 3.10
17
+ Classifier: Programming Language :: Python :: 3.11
18
+ Classifier: Programming Language :: Python :: 3.12
19
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
20
+ Requires-Python: >=3.10
21
+ Requires-Dist: httpx>=0.27.0
22
+ Requires-Dist: mcp>=1.0.0
23
+ Description-Content-Type: text/markdown
24
+
25
+ # ecfr-mcp
26
+
27
+ MCP server for the eCFR (Electronic Code of Federal Regulations) API. Read FAR, DFARS, and all agency FAR supplement text with no authentication required.
28
+
29
+ Works with any MCP-compatible client (Claude Desktop, Claude Code, Cursor, Cline, Continue, Zed, etc.).
30
+
31
+ ## What it does
32
+
33
+ Exposes the eCFR API as 13 MCP tools covering regulatory text, structure, search, version history, and common acquisition workflows:
34
+
35
+ **Core endpoints**
36
+ - `get_latest_date` - Get the most recent available date for a CFR title (call before other tools)
37
+ - `get_cfr_content` - Get parsed regulatory text for a section, subpart, or part
38
+ - `get_cfr_structure` - Hierarchical table of contents
39
+ - `get_version_history` - Amendment history for a section or part
40
+ - `get_ancestry` - Breadcrumb hierarchy path
41
+ - `search_cfr` - Full-text search with hierarchy filters
42
+ - `list_agencies` - All agencies with their CFR references
43
+ - `get_corrections` - Editorial corrections for a title
44
+
45
+ **Workflow convenience**
46
+ - `lookup_far_clause` - One-call FAR/DFARS clause text lookup (auto-resolves date)
47
+ - `compare_versions` - Side-by-side text comparison at two dates
48
+ - `list_sections_in_part` - All sections in a FAR/DFARS part
49
+ - `find_far_definition` - Search FAR 2.101 for a term definition
50
+ - `find_recent_changes` - Sections modified since a given date
51
+
52
+ ## No authentication required
53
+
54
+ The eCFR API is fully public. No API key, no registration, no auth headers. Just install and use.
55
+
56
+ ## Installation
57
+
58
+ ### Via uvx (recommended)
59
+
60
+ ```bash
61
+ uvx ecfr-mcp
62
+ ```
63
+
64
+ ### Via pip
65
+
66
+ ```bash
67
+ pip install ecfr-mcp
68
+ ```
69
+
70
+ ### From source
71
+
72
+ ```bash
73
+ git clone https://github.com/1102tools/ecfr-mcp.git
74
+ cd ecfr-mcp
75
+ pip install -e .
76
+ ```
77
+
78
+ ## Claude Desktop configuration
79
+
80
+ Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
81
+
82
+ ```json
83
+ {
84
+ "mcpServers": {
85
+ "ecfr": {
86
+ "command": "uvx",
87
+ "args": ["ecfr-mcp"]
88
+ }
89
+ }
90
+ }
91
+ ```
92
+
93
+ Restart Claude Desktop. The `ecfr` server appears in your MCP tools panel with 13 tools.
94
+
95
+ ## Example prompts
96
+
97
+ - "Pull the current text of FAR 15.305 (Proposal Evaluation) and summarize what it requires."
98
+ - "List all sections in FAR Part 19 (Small Business Programs)."
99
+ - "Look up the FAR definition of 'commercial product' in 2.101."
100
+ - "What FAR sections were amended in the last 6 months?"
101
+ - "Compare FAR 52.212-4 between 2024-01-01 and 2025-01-01 and show me what changed."
102
+ - "Get the current text of DFARS 252.227-7014 (Rights in Noncommercial Computer Software)."
103
+ - "Search Title 48 for 'organizational conflict of interest' and show me the relevant sections."
104
+ - "Which agency owns Chapter 8 in Title 48? Get their FAR supplement structure."
105
+
106
+ ## Design notes
107
+
108
+ - **XML parsed server-side.** The eCFR content endpoint returns raw XML. This server parses it into clean text (headings, paragraphs, citations) before returning to Claude, saving significant context tokens.
109
+ - **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.
110
+ - **Search defaults to current text.** Without `date=current`, eCFR search returns ALL historical versions including superseded. Default `current_only=True` prevents duplicate results.
111
+ - **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.
112
+ - **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.
113
+
114
+ ## CFR Title 48 quick reference
115
+
116
+ | Chapter | Regulation | Parts |
117
+ |---|---|---|
118
+ | 1 | FAR | 1-99 |
119
+ | 2 | DFARS | 200-299 |
120
+ | 3 | HHSAR | 300-399 |
121
+ | 4 | AGAR | 400-499 |
122
+ | 5 | GSAR | 500-599 |
123
+ | 6 | DOSAR | 600-699 |
124
+ | 7 | AIDAR | 700-799 |
125
+ | 8 | VAAR | 800-899 |
126
+ | 9 | DEAR | 900-999 |
127
+ | 18 | NFS | 1800-1899 |
128
+
129
+ ## Data source
130
+
131
+ All data from [ecfr.gov](https://www.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.
132
+
133
+ ## Companion skill
134
+
135
+ This MCP mirrors the `ecfr-api` skill from [1102tools.com](https://1102tools.com). The skill is markdown-based for interactive Claude use; the MCP wraps the same API as deterministic tool calls for agent workflows and automation.
136
+
137
+ ## License
138
+
139
+ MIT
@@ -0,0 +1,115 @@
1
+ # ecfr-mcp
2
+
3
+ MCP server for the eCFR (Electronic Code of Federal Regulations) API. Read FAR, DFARS, and all agency FAR supplement text with no authentication required.
4
+
5
+ Works with any MCP-compatible client (Claude Desktop, Claude Code, Cursor, Cline, Continue, Zed, etc.).
6
+
7
+ ## What it does
8
+
9
+ Exposes the eCFR API as 13 MCP tools covering regulatory text, structure, search, version history, and common acquisition workflows:
10
+
11
+ **Core endpoints**
12
+ - `get_latest_date` - Get the most recent available date for a CFR title (call before other tools)
13
+ - `get_cfr_content` - Get parsed regulatory text for a section, subpart, or part
14
+ - `get_cfr_structure` - Hierarchical table of contents
15
+ - `get_version_history` - Amendment history for a section or part
16
+ - `get_ancestry` - Breadcrumb hierarchy path
17
+ - `search_cfr` - Full-text search with hierarchy filters
18
+ - `list_agencies` - All agencies with their CFR references
19
+ - `get_corrections` - Editorial corrections for a title
20
+
21
+ **Workflow convenience**
22
+ - `lookup_far_clause` - One-call FAR/DFARS clause text lookup (auto-resolves date)
23
+ - `compare_versions` - Side-by-side text comparison at two dates
24
+ - `list_sections_in_part` - All sections in a FAR/DFARS part
25
+ - `find_far_definition` - Search FAR 2.101 for a term definition
26
+ - `find_recent_changes` - Sections modified since a given date
27
+
28
+ ## No authentication required
29
+
30
+ The eCFR API is fully public. No API key, no registration, no auth headers. Just install and use.
31
+
32
+ ## Installation
33
+
34
+ ### Via uvx (recommended)
35
+
36
+ ```bash
37
+ uvx ecfr-mcp
38
+ ```
39
+
40
+ ### Via pip
41
+
42
+ ```bash
43
+ pip install ecfr-mcp
44
+ ```
45
+
46
+ ### From source
47
+
48
+ ```bash
49
+ git clone https://github.com/1102tools/ecfr-mcp.git
50
+ cd ecfr-mcp
51
+ pip install -e .
52
+ ```
53
+
54
+ ## Claude Desktop configuration
55
+
56
+ Add to `~/Library/Application Support/Claude/claude_desktop_config.json`:
57
+
58
+ ```json
59
+ {
60
+ "mcpServers": {
61
+ "ecfr": {
62
+ "command": "uvx",
63
+ "args": ["ecfr-mcp"]
64
+ }
65
+ }
66
+ }
67
+ ```
68
+
69
+ Restart Claude Desktop. The `ecfr` server appears in your MCP tools panel with 13 tools.
70
+
71
+ ## Example prompts
72
+
73
+ - "Pull the current text of FAR 15.305 (Proposal Evaluation) and summarize what it requires."
74
+ - "List all sections in FAR Part 19 (Small Business Programs)."
75
+ - "Look up the FAR definition of 'commercial product' in 2.101."
76
+ - "What FAR sections were amended in the last 6 months?"
77
+ - "Compare FAR 52.212-4 between 2024-01-01 and 2025-01-01 and show me what changed."
78
+ - "Get the current text of DFARS 252.227-7014 (Rights in Noncommercial Computer Software)."
79
+ - "Search Title 48 for 'organizational conflict of interest' and show me the relevant sections."
80
+ - "Which agency owns Chapter 8 in Title 48? Get their FAR supplement structure."
81
+
82
+ ## Design notes
83
+
84
+ - **XML parsed server-side.** The eCFR content endpoint returns raw XML. This server parses it into clean text (headings, paragraphs, citations) before returning to Claude, saving significant context tokens.
85
+ - **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.
86
+ - **Search defaults to current text.** Without `date=current`, eCFR search returns ALL historical versions including superseded. Default `current_only=True` prevents duplicate results.
87
+ - **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.
88
+ - **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.
89
+
90
+ ## CFR Title 48 quick reference
91
+
92
+ | Chapter | Regulation | Parts |
93
+ |---|---|---|
94
+ | 1 | FAR | 1-99 |
95
+ | 2 | DFARS | 200-299 |
96
+ | 3 | HHSAR | 300-399 |
97
+ | 4 | AGAR | 400-499 |
98
+ | 5 | GSAR | 500-599 |
99
+ | 6 | DOSAR | 600-699 |
100
+ | 7 | AIDAR | 700-799 |
101
+ | 8 | VAAR | 800-899 |
102
+ | 9 | DEAR | 900-999 |
103
+ | 18 | NFS | 1800-1899 |
104
+
105
+ ## Data source
106
+
107
+ All data from [ecfr.gov](https://www.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.
108
+
109
+ ## Companion skill
110
+
111
+ This MCP mirrors the `ecfr-api` skill from [1102tools.com](https://1102tools.com). The skill is markdown-based for interactive Claude use; the MCP wraps the same API as deterministic tool calls for agent workflows and automation.
112
+
113
+ ## License
114
+
115
+ MIT
@@ -0,0 +1,41 @@
1
+ [build-system]
2
+ requires = ["hatchling"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "ecfr-mcp"
7
+ version = "0.1.0"
8
+ description = "MCP server for the eCFR (Electronic Code of Federal Regulations) API. Read FAR, DFARS, and all agency FAR supplements."
9
+ readme = "README.md"
10
+ requires-python = ">=3.10"
11
+ license = { text = "MIT" }
12
+ authors = [
13
+ { name = "1102tools" }
14
+ ]
15
+ keywords = ["mcp", "model-context-protocol", "ecfr", "cfr", "far", "dfars", "federal-acquisition", "regulations", "1102"]
16
+ classifiers = [
17
+ "Development Status :: 3 - Alpha",
18
+ "Intended Audience :: Developers",
19
+ "License :: OSI Approved :: MIT License",
20
+ "Programming Language :: Python :: 3",
21
+ "Programming Language :: Python :: 3.10",
22
+ "Programming Language :: Python :: 3.11",
23
+ "Programming Language :: Python :: 3.12",
24
+ "Topic :: Software Development :: Libraries :: Python Modules",
25
+ ]
26
+
27
+ dependencies = [
28
+ "mcp>=1.0.0",
29
+ "httpx>=0.27.0",
30
+ ]
31
+
32
+ [project.urls]
33
+ Homepage = "https://1102tools.com"
34
+ Repository = "https://github.com/1102tools/ecfr-mcp"
35
+ Issues = "https://github.com/1102tools/ecfr-mcp/issues"
36
+
37
+ [project.scripts]
38
+ ecfr-mcp = "ecfr_mcp.server:main"
39
+
40
+ [tool.hatch.build.targets.wheel]
41
+ packages = ["src/ecfr_mcp"]
@@ -0,0 +1 @@
1
+ __version__ = "0.1.0"
@@ -0,0 +1,58 @@
1
+ """Constants and reference data for the eCFR MCP server."""
2
+
3
+ BASE_URL = "https://www.ecfr.gov"
4
+ DEFAULT_TIMEOUT_JSON = 15.0
5
+ DEFAULT_TIMEOUT_STRUCTURE = 30.0
6
+ DEFAULT_TIMEOUT_CONTENT = 60.0
7
+ USER_AGENT = "ecfr-mcp/0.1.0"
8
+
9
+ # Search caps
10
+ SEARCH_MAX_PER_PAGE = 5000
11
+ SEARCH_MAX_TOTAL = 10000
12
+
13
+ # Title 48 chapter map (Federal Acquisition Regulations System)
14
+ TITLE_48_CHAPTERS: dict[str, str] = {
15
+ "1": "FAR (Parts 1-99)",
16
+ "2": "DFARS (Parts 200-299)",
17
+ "3": "HHSAR (Parts 300-399)",
18
+ "4": "AGAR (Parts 400-499)",
19
+ "5": "GSAR (Parts 500-599)",
20
+ "6": "DOSAR (Parts 600-699)",
21
+ "7": "AIDAR (Parts 700-799)",
22
+ "8": "VAAR (Parts 800-899)",
23
+ "9": "DEAR (Parts 900-999)",
24
+ "10": "DTAR (Parts 1000-1099)",
25
+ "12": "TAR (Parts 1200-1299)",
26
+ "13": "CAR (Parts 1300-1399)",
27
+ "14": "DIAR (Parts 1400-1499)",
28
+ "15": "EPAAR (Parts 1500-1599)",
29
+ "16": "OPMAR (Parts 1600-1699)",
30
+ "18": "NFS (Parts 1800-1899)",
31
+ "20": "NRCAR (Parts 2000-2099)",
32
+ "23": "SSAAR (Parts 2300-2399)",
33
+ "24": "HUDAR (Parts 2400-2499)",
34
+ "25": "NSFAR (Parts 2500-2599)",
35
+ "28": "JAR (Parts 2800-2899)",
36
+ "29": "DOLAR (Parts 2900-2999)",
37
+ "99": "CAS (Part 9900)",
38
+ }
39
+
40
+ # Common FAR sections for quick reference in tool descriptions
41
+ COMMON_FAR_SECTIONS: dict[str, str] = {
42
+ "2.101": "Definitions",
43
+ "4.1102": "SAM policy",
44
+ "6.302-1": "Only one responsible source",
45
+ "9.104-1": "General standards of responsibility",
46
+ "9.406-2": "Causes for debarment",
47
+ "12.301": "Solicitation provisions (commercial)",
48
+ "13.003": "Simplified acquisition policy",
49
+ "15.305": "Proposal evaluation",
50
+ "15.306": "Exchanges with offerors",
51
+ "19.502-2": "Total small business set-asides",
52
+ "31.205": "Selected costs (allowability)",
53
+ "33.103": "Protests to the agency",
54
+ "42.302": "Contract administration functions",
55
+ "52.212-1": "Instructions to Offerors (Commercial)",
56
+ "52.212-4": "Contract Terms and Conditions (Commercial)",
57
+ "52.212-5": "Required Contract Terms (Commercial)",
58
+ }