# eCFR (remote · ecfr.1102tools.com)

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

- Trust score: 68/100 (medium)
- Change this week: +3
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-05

## Components

- remote · `ecfr.1102tools.com`: 68/100 (this document), [markdown](https://verifymcp.io/servers/com-1102tools-ecfr-mcp/ecfr.md), [page](https://verifymcp.io/servers/com-1102tools-ecfr-mcp/ecfr)
- pypi · `ecfr-mcp`: 74/100, [markdown](https://verifymcp.io/servers/com-1102tools-ecfr-mcp/ecfr-mcp.md), [page](https://verifymcp.io/servers/com-1102tools-ecfr-mcp/ecfr-mcp)

## Channel facts

- Endpoint: `https://ecfr.1102tools.com/mcp`
- Transports: `streamable-http`
- Auth: `none`
- Version: `1.1.15`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-05.

- **Endpoint Security**: 63/100
  - The endpoint's TLS certificate is valid, in date, and uses a strong key.
  - No authorisation is required to call this server. Nothing on it is marked destructive, but we can't show that an anonymous caller can only read: full credit needs the server to list at least one tool and every tool to be verifiably read-only. We use a best-effort check of tool names and descriptions to tell read-only tools from tools that change things, so some genuinely read-only tools may not get full credit. Names that start with a read verb (get, list, read, search and similar) and accurate readOnlyHint annotations help. Meet that to earn full credit, or require authorisation.
  - HTTPS enforcement could not be verified: the plaintext port answered with HTTP 405, which proves neither a plaintext path nor enforcement.
  - HSTS check failed: the Strict-Transport-Security header is absent.
  - DNSSEC check failed: this domain isn't protected by DNSSEC.
- **Transport & Reachability**: 100/100
  - Verified streamable-http transport via a live MCP handshake.
- **Schema Quality & AI Usability**: 56/100
  - AI-judged instruction clarity (good).
  - Context-footprint check failed: tool/resource definitions use about 3932 tokens (~302/item across 13 items; 13 tools + 0 resources), over budget; trim descriptions and params.
  - Usage-examples check failed: none of the tools include examples.
- **Stability & Change Management**: 50/100
  - Stability observed for 15 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 71/100
  - 100% of tools have a non-trivial description (not blank, and not just the tool's name).
  - 0% of tool parameters carry a description.
  - Structured output schemas are declared (100% of tools); any adoption earns full credit.
- **Tool Safety**: 100/100
  - No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.
  - We read all 13 captured tool definition(s), and no name or description among them implies an irreversible operation.
  - An AI judge read all 13 captured unit(s) of tool text and found none that tries to manipulate the model reading it.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the eCFR MCP server?

eCFR is a hosted endpoint at https://ecfr.1102tools.com/mcp, so there is nothing to install locally. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add --transport http com-1102tools-ecfr-mcp 'https://ecfr.1102tools.com/mcp'
```

### Cursor

```json
{
  "mcpServers": {
    "com-1102tools-ecfr-mcp": {
      "url": "https://ecfr.1102tools.com/mcp"
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "com-1102tools-ecfr-mcp": {
      "type": "http",
      "url": "https://ecfr.1102tools.com/mcp"
    }
  }
}
```

### Codex

```toml
[mcp_servers.com-1102tools-ecfr-mcp]
url = "https://ecfr.1102tools.com/mcp"
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "com-1102tools-ecfr-mcp": {
      "type": "remote",
      "url": "https://ecfr.1102tools.com/mcp",
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add com-1102tools-ecfr-mcp --url 'https://ecfr.1102tools.com/mcp' --transport streamable-http
```

### Hermes

```yaml
mcp_servers:
  com-1102tools-ecfr-mcp:
    url: "https://ecfr.1102tools.com/mcp"
```

### Netclaw

```json
{
  "McpServers": {
    "com-1102tools-ecfr-mcp": {
      "Transport": "http",
      "Url": "https://ecfr.1102tools.com/mcp"
    }
  }
}
```

### Vellum

```bash
assistant mcp add com-1102tools-ecfr-mcp -t streamable-http -u 'https://ecfr.1102tools.com/mcp'
```

### Other

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

The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-04 (score 68, +1)

No change was recorded against any check on this day. Stability & Change Management went from 43 to 47. That category is still filling its 30-day observation window: 13 days of observed history at the previous scan, 14 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-11-03 (score 67, 0)

- [functional] Server version: 1.1.14 → 1.1.15

### 2026-11-02 (score 67, +1)

No change was recorded against any check on this day. Stability & Change Management went from 37 to 40. That category is still filling its 30-day observation window: 11 days of observed history at the previous scan, 12 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-31 (score 66, +1)

No change was recorded against any check on this day. Stability & Change Management went from 30 to 33. That category is still filling its 30-day observation window: 9 days of observed history at the previous scan, 10 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-29 (score 65, +1)

No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-27 (score 64, +1)

- [functional] Server version: 1.1.13 → 1.1.14

### 2026-10-25 (score 63, +1)

No change was recorded against any check on this day. Stability & Change Management went from 10 to 13. That category is still filling its 30-day observation window: 3 days of observed history at the previous scan, 4 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-23 (score 62, +1)

- [security] Tool “get_cfr_content” rewrote its description, which is the text the model reads
- [functional] Server version: 1.1.12 → 1.1.13

## MCP tools (13)

### `compare_versions` (~287 tokens)

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.

Input parameters:

- `changes_only` (boolean)
- `chapter`
- `date_after` (string, required)
- `date_before` (string, required)
- `section_id` (required)
- `title_number` (integer)

### `find_far_definition` (~334 tokens)

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.

Input parameters:

- `date`
- `max_matches` (integer)
- `term` (string, required)

### `find_recent_changes` (~236 tokens)

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.

Input parameters:

- `chapter`
- `page` (integer)
- `part`
- `per_page` (integer)
- `since_date` (string, required)
- `title` (integer)

### `get_ancestry` (~129 tokens)

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.

Input parameters:

- `appendix`
- `date`
- `part`
- `section`
- `subpart`
- `title_number` (integer)

### `get_cfr_content` (~547 tokens)

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

Input parameters:

- `appendix`
- `chapter`
- `date`
- `page` (integer)
- `part`
- `raw_xml` (boolean)
- `section`
- `subpart`
- `title_number` (integer)

### `get_cfr_structure` (~352 tokens)

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.

Input parameters:

- `appendix`
- `chapter`
- `date`
- `depth`
- `part`
- `subchapter`
- `subpart`
- `title_number` (integer)

### `get_corrections` (~205 tokens)

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.

Input parameters:

- `chapter`
- `limit` (integer)
- `part`
- `section`
- `since_year`
- `title_number` (integer)

### `get_latest_date` (~151 tokens)

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

Input parameters:

- `title_number` (integer)

### `get_version_history` (~366 tokens)

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.

Input parameters:

- `page` (integer)
- `part`
- `per_page` (integer)
- `section`
- `since_date`
- `subpart`
- `title_number` (integer)
- `until_date`

### `list_agencies` (~149 tokens)

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.

Input parameters:

- `summary_only` (boolean)

### `list_sections_in_part` (~314 tokens)

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.

Input parameters:

- `chapter`
- `date`
- `detail` (boolean)
- `page` (integer)
- `part_number` (required)
- `subpart`
- `title_number` (integer)

### `lookup_far_clause` (~347 tokens)

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

Input parameters:

- `chapter`
- `date`
- `page` (integer)
- `section_id` (required)

### `search_cfr` (~515 tokens)

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.

Input parameters:

- `agency_slugs`
- `chapter`
- `current_only` (boolean)
- `last_modified_after`
- `last_modified_before`
- `order`
- `page` (integer)
- `part`
- `per_page` (integer)
- `query` (string, required)
- `section`
- `subpart`
- `title`

## Diagnostics

Captured diagnostic sections: TLS, DNSSEC, Authorisation, Transports. The full working is on the page: https://verifymcp.io/servers/com-1102tools-ecfr-mcp/ecfr#diagnostics

## Score history

- 2026-11-05: 68
- 2026-11-04: 68
- 2026-11-03: 67
- 2026-11-02: 67
- 2026-11-01: 66
- 2026-10-31: 66
- 2026-10-30: 65
- 2026-10-29: 65
- 2026-10-28: 64
- 2026-10-27: 64
- 2026-10-26: 63
- 2026-10-25: 63
- 2026-10-24: 62
- 2026-10-23: 62
- 2026-10-22: 61
- 2026-10-21: 61

## Common questions

### What is the eCFR MCP server?

eCFR is an MCP server listed in the public MCP registry as com.1102tools/ecfr-mcp. Electronic Code of Federal Regulations including FAR, DFARS, and agency supplements. 13 tools. This page covers its hosted endpoint (https://ecfr.1102tools.com/mcp).

### Is the eCFR MCP server safe to use?

eCFR scores 68 out of 100 on VerifyMCP. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the eCFR MCP server expose?

eCFR exposes 13 tools: compare_versions, find_far_definition, find_recent_changes, get_ancestry, get_cfr_content, and 8 more. Their descriptions and schemas cost roughly 3,932 tokens of context every time the server is loaded.

### Does the eCFR MCP server require authentication?

No. We connected to eCFR without credentials and it answered, so anything it exposes is reachable by anyone who knows the address.

### Is the eCFR MCP server still maintained?

eCFR is still listed as active in the MCP registry. We last reached this channel on 5 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What did VerifyMCP test on the eCFR MCP server?

VerifyMCP ran 12 checks on eCFR, covering TLS certificate, Authorization, HSTS header, DNSSEC and 8 more. One item could not be completed, a gap on our side rather than a finding about eCFR: HTTPS. Supply Chain Security and Provenance & Transparency do not apply to a hosted endpoint, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.

## Links

- Remote endpoint: https://ecfr.1102tools.com/mcp
- Repository: https://github.com/1102tools-dev/federal-contracting-mcps
- Website: https://1102tools.com/
- Changelog RSS feed: https://verifymcp.io/servers/com-1102tools-ecfr-mcp/ecfr.xml
- Changelog JSON feed: https://verifymcp.io/servers/com-1102tools-ecfr-mcp/ecfr/changelog.json
- Trust report (JSON): https://verifymcp.io/servers/com-1102tools-ecfr-mcp/ecfr.json
- HTML version of this page: https://verifymcp.io/servers/com-1102tools-ecfr-mcp/ecfr
