cfr-free
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| CFR_HOST | No | HTTP bind address | 127.0.0.1 |
| CFR_PORT | No | HTTP bind port | 8787 |
| CFR_AUTO_SYNC | No | Sync at startup when index empty/stale | 1 |
| CFR_LOG_LEVEL | No | Log level: debug | info | warn | error | info |
| CFR_INDEX_PATH | No | SQLite index location | ~/.cfr-free/index.sqlite |
| CFR_ALLOW_REMOTE | No | Set 1 to permit non-loopback binds | unset |
| CFR_MAX_AGE_DAYS | No | Index older than this is reported stale | 7 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| search_regulationsA | Full-text search across the local Title 38 (VA) CFR index using ranked keyword matching. Returns section citations, headings, relevance snippets, bm25 scores (lower is better) and the query terms visible in each hit. The CANDIDATE SET is every provision matching AT LEAST ONE query term, so a provision that answers part of the question stays in the results instead of being excluded by the words it does not use; |
| get_sectionA | Fetch the full text of one Title 38 CFR section or appendix as markdown. Accepts flexible citations: "4.125", "§ 4.125", "38 CFR 4.125", or appendix names like "Appendix A to Part 4". Returns heading, hierarchy path, issue date and an ecfr.gov permalink. |
| browse_title38A | Navigate the Title 38 hierarchy (title → chapter → part → subpart → subject group) and list what exists at a level. With no arguments, returns the chapters. Use this to discover valid parts/subparts before searching. Most sections live inside a subject group: pass the subject_group identifier you saw in a previous response to list the sections it holds. |
| index_statusA | Report how current the local Title 38 index is: eCFR issue date, last sync time, row counts, the corpus receipt hash (a sha256 over the sorted per-provision (citation, text+heading) pairs at rebuild time, null on older indexes) and whether the index is stale relative to CFR_MAX_AGE_DAYS. Check this before relying on search results. |
| list_partsA | Enumerate every Title 38 CFR part present in the local index, with its structure-tree title and section/appendix counts. Use this to discover which parts are searchable. |
| healthA | One-call readiness verdict for the local index: "ready" (query away), "stale" (older than CFR_MAX_AGE_DAYS — verify results against the current eCFR), "degraded" (structure drift — provisions may be missing; verify against the current eCFR), or "empty" (no index yet — run |
| get_section_atA | One Title 38 provision as it stood at a requested date (YYYY-MM-DD, required). eCFR serves the revision IN FORCE on that date, so a date that is not itself an issue date resolves to the revision that was in force then; the upstream does not report which issue date it served, so the response names the REQUESTED date and never a served-revision date. Stateless: the revision is fetched from eCFR on every call — no local index, no cache. eCFR's point-in-time archive starts at 2017-01-01; a date before that is rejected as not_found. Use this for date-of-claim and CUE questions ("what did this section say when the claim was filed?"); for the CURRENT text use get_section. |
| diff_issuesA | Provision-level diff of Title 38 between two eCFR issue dates: which citations changed, which were added, and which were removed between |
| redlineA | Line-level redline of one Title 38 provision between two eCFR issue dates: which lines of |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| cfr_research | Walks a model through searching the local Title 38 index and reading the most relevant sections before answering. |
| cfr_claim_evaluation | Walks a model through the adjudicator workflow: verify index readiness, locate the governing criteria, quote operative text verbatim, follow cross-references, and cite with source URLs and the index issue date. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| index-status | JSON freshness report for the local Title 38 index: eCFR issue date, last sync, row counts, staleness, structure-drift flag and the corpus receipt hash. |
| title38-parts | JSON list of every Title 38 CFR part present in the local index, with structure titles and section/appendix counts. |
| title38-definitions | JSON section detail for 38 CFR § 3.1 — the master definitions section governing the entire title — with full markdown text, source URL, cross-references and freshness flags. |
TDQS
Scored across 9 tools
Two pairs overlap meaningfully: `health` and `index_status` both report index readiness/staleness (health is a verdict, index_status is a report), and `list_parts` and `browse_title38` both serve hierarchy discovery. The temporal tools (get_section vs get_section_at, diff_issues vs redline) are clearly delineated, but the agents still have to guess between the readiness and discovery pairs.
Most tools follow a verb_noun pattern (list_parts, search_regulations, get_section, browse_title38, diff_issues), with `get_section_at` a sensible variant. `health` and `redline` are bare noun/verb outliers that break the pattern, though they remain readable.
Nine tools is well scoped: discovery, search, current and historical retrieval, change detection, and readiness checks each earn their place without bloat.
Coverage is strong across the CFR lifecycle: discovery, full-text search, current and point-in-time retrieval, title-level diff, and line-level redline. Minor gaps remain — no tool to trigger or repair a sync/index rebuild (CLI-only), and historical text is only retrievable per-provision, not searchable.