Skip to main content
Glama
Reid-n0rc

fcc-ecfs-mcp

by Reid-n0rc

fcc-ecfs-mcp

codecov

An MCP server for the FCC's Electronic Comment Filing System (ECFS) public API. Implements every endpoint in ECFS's public OpenAPI spec — filings, a single filing, proceedings, a filing's documents, and non-docketed filing inboxes — plus an escape hatch for anything else. Lets an MCP client (Claude Desktop, Claude Code, etc.) search and fetch across all of them.

Tools

Tool

ECFS endpoint

Description

ecfs_search_filings

GET /filings

Search filings by free text, proceeding/docket number, filer name, submission type, or date received.

ecfs_get_filing

GET /filing/{id}

Fetch a single filing by its submission ID.

ecfs_search_proceedings

GET /proceedings

Search proceedings (dockets), e.g. by docket number.

ecfs_get_download_plan

GET /filings?type=downloadplan

Get date-bucketed queries safe for exhaustively paging a large docket (e.g. a heavily-commented NPRM) — plain offset/limit paging over a big result set can return duplicate or missing filings.

ecfs_search_documents

GET /documents

List a filing's document/attachment metadata (filename, page count, byte size, OCR status) by submission ID. Does not return file contents — ECFS's public API is metadata-only.

ecfs_download_document

ECFS website (headless Chrome)

Download a filing's document (PDF) and save it inside your download folder; returns the saved path, size, and SHA-256. See Downloading documents.

ecfs_list_inboxes

GET /inbox

List the available inboxes for non-docketed filings.

ecfs_raw_request

any

Escape hatch: call any ECFS path/query params not covered above. api_key is added automatically.

Related MCP server: mcp-fcc-ecfs

Setup

This repo is a Claude Code plugin — it bundles the MCP server and the slash commands below into a single install, and works from any directory (no manual config editing, no cd-ing into this repo first).

  1. Get a free API key at https://www.fcc.gov/ecfs/help/public_api.

  2. Install the plugin directly from this repo:

    /plugin install Reid-n0rc/fcc-ecfs-mcp

    Claude Code will prompt for your FCC ECFS API key (stored securely, not pasted into a config file) and an optional download folder for ecfs_download_document (default ~/Downloads/ecfs), and register both the fcc-ecfs MCP server and the /fcc-ecfs:* slash commands automatically.

  3. To download documents, have Google Chrome installed.

Option B: Manual MCP server config

For non-Claude-Code MCP clients (Claude Desktop, etc.), or if you'd rather manage the server yourself:

  1. Install dependencies and build:

    npm install
    npm run build
  2. Provide the key via the ECFS_API_KEY environment variable — never commit it or pass it as a tool argument. For local development, copy .env.example to .env (git-ignored) and fill it in. The server reads .env from the root of this checkout, not from the client's working directory, and values in the client's env block always win. If you installed the server with npm or npx instead of cloning it, no .env is read: set everything in the client's env block.

  3. Add to your client's MCP config:

    {
      "mcpServers": {
        "fcc-ecfs": {
          "command": "node",
          "args": ["/absolute/path/to/fcc-ecfs-mcp/dist/index.js"],
          "env": {
            "ECFS_API_KEY": "your-api-key-here",
            "ECFS_DOWNLOAD_DIR": "~/Downloads/ecfs"
          }
        }
      }
    }

    Prefer sourcing ECFS_API_KEY from your OS keychain or a secrets manager (e.g. 1Password, gpg-encrypted dotfiles) rather than pasting it into a config file where possible. ECFS_DOWNLOAD_DIR is optional (default ~/Downloads/ecfs).

Slash commands

commands/ ships Claude Code slash commands that wrap the tools above. Installed as a plugin, they're namespaced under fcc-ecfs:

Command

Description

/fcc-ecfs:fcc-ecfs <query>

General dispatcher — picks the right ECFS tool for the request.

/fcc-ecfs:fcc-search-filings <args>

Search filings by docket, filer, type, date, or text.

/fcc-ecfs:fcc-search-proceedings <docket>

Look up a proceeding/docket by number or name.

/fcc-ecfs:fcc-get-filing <submission id>

Fetch a single filing by its submission ID.

/fcc-ecfs:fcc-list-documents <submission id(s)>

List document/attachment metadata for one or more filings.

/fcc-ecfs:fcc-download-plan <args>

Get a download plan for exhaustively paging a large docket.

/fcc-ecfs:fcc-download-document <id, URL, or description>

Download a filing's document (PDF) to the download folder.

Development

npm run dev        # run the server directly with tsx
npm test           # run the unit test suite (vitest)
npm run test:live  # run live tests against the real ECFS API (needs ECFS_API_KEY)
npm run test:download  # download a real document via headless Chrome (local only)
npm run typecheck  # type-check without emitting

CI (.github/workflows/ci.yml) runs the unit tests and the live tests on every push to main and every PR, plus weekly and on manual dispatch; docs-only changes skip the test jobs. Live tests use the ECFS_API_KEY secret (gh secret set ECFS_API_KEY, and again with --app dependabot for Dependabot PRs). Fork PRs can't read secrets, so they skip the live tests.

Changes to main go through a pull request that needs an approving review from the repo owner (.github/CODEOWNERS) and a passing ci-ok check, which rolls up every CI job. See CONTRIBUTING.md for the full workflow.

To test the plugin locally before publishing a change, rebuild and point Claude Code at the working tree:

npm run build
claude --plugin-dir .

Note that the plugin loader never runs npm run build on install — it only runs npm ci to fetch dependencies. dist/ must be committed and up to date before pushing.

Downloading documents

The ECFS public API is metadata-only: no endpoint returns a document's file bytes or text. A document's location (or a filing's documents[].src) points at https://www.fcc.gov/ecfs/document/{id_submission}/{n} on the ECFS website, which refuses non-browser HTTP clients such as curl with 403 Forbidden.

ecfs_download_document therefore opens that page in headless Google Chrome (via playwright-core, using your installed Chrome — no bundled browser download) and saves the PDF the page loads. Headless Chrome is presented under its regular Chrome user agent, since the site refuses the default HeadlessChrome one. No window is shown.

  • Files are always saved inside ECFS_DOWNLOAD_DIR (plugin setting "Download folder"; default ~/Downloads/ecfs), named {id_submission}_{ECFS filename} and always with a .pdf extension. The model can put a file in a subfolder (output_dir, e.g. one per docket), but can't save outside the download folder. To save elsewhere, change the setting.

  • Re-downloading an identical file reuses the existing copy; a different file with the same name gets a numeric suffix rather than overwriting.

  • Each download takes a few seconds. The tool fetches one document per call; it isn't meant for bulk-downloading whole dockets.

Security notes

  • The API key is read only from process.env.ECFS_API_KEY — it is never accepted as a tool input, so it cannot be echoed back into a model's context or transcript.

  • Error messages and thrown errors redact the api_key query parameter before they are ever logged or returned to a client. Response bodies are also scrubbed of the literal key value before being returned — some ECFS response types (e.g. type=downloadplan) echo the key back verbatim in generated URLs, so URL-only redaction isn't sufficient.

  • .env is git-ignored; only .env.example (no real key) is committed.

  • The server never reads a .env from its working directory, only the checkout's own .env, so it can't pick up unrelated secrets from the project an MCP client was launched in. DOTENV_* variables don't affect it.

  • ecfs_download_document only writes inside the download folder (ECFS_DOWNLOAD_DIR), checked both on the requested path and on its real path after resolving symlinks, and every saved file ends in .pdf. Tool arguments can be influenced by filing text the model has read, so the server doesn't trust output_dir to point anywhere else.

To report a vulnerability, see SECURITY.md.

License

MIT

Available Tools

8 tools
ecfs_download_documentDownload an ECFS documentA

Download one document (usually a PDF) from an ECFS filing and save it to disk, returning the saved file path. Identify it by the filing's submission ID and the document's position in the filing — the {n} in its https://www.fcc.gov/ecfs/document/{id_submission}/{n} location/src URL. Fetches the file through a headless Chrome browser (Google Chrome must be installed), so it takes a few seconds per document. Files are always saved as .pdf inside the user's configured download folder (ECFS_DOWNLOAD_DIR, default ~/Downloads/ecfs).

NameRequiredDescriptionDefault
output_dirNoOptional subfolder of the user's download folder (ECFS_DOWNLOAD_DIR, default ~/Downloads/ecfs) to save into, e.g. "wt-09-209". It's created if missing. Absolute or ~ paths are accepted only if they are inside the download folder; anything outside it is rejected. Omit unless the user asks for a subfolder. The saved file always ends in .pdf.
id_submissionYesThe ECFS submission ID of the filing the document belongs to.
document_numberNo1-based position of the document within the filing — the {n} in its https://www.fcc.gov/ecfs/document/{id_submission}/{n} location URL. Defaults to 1.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does real work: it discloses the headless Chrome dependency, the latency cost, the forced .pdf extension, and the fixed download location (ECFS_DOWNLOAD_DIR, default ~/Downloads/ecfs). It leaves out auth needs, overwrite behavior on repeated downloads, and failure modes, which keeps it below a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The action and outcome are front-loaded in the first sentence, followed by identification semantics, then operational caveats. Four sentences, each carrying distinct information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a side-effecting download with no output schema, the description covers prerequisites, timing, destination, and return value adequately. It stops short of describing error behavior or what happens on filename collisions, which an agent invoking a disk-writing tool would benefit from.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all three parameters are already documented in structured form, including the same {n} URL mapping for document_number and the subfolder rules for output_dir. The description restates the URL-position concept rather than adding syntax or edge-case meaning beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource — 'Download one document (usually a PDF) from an ECFS filing and save it to disk' — and states the return value (saved file path). It is clearly a retrieval/save tool, distinguishable from siblings like ecfs_search_documents or ecfs_get_filing without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains how to select the right document (submission ID plus the {n} position in the document URL) and adds operational context — a headless Chrome requirement and a few seconds per document. It does not name alternatives or explicitly say when to prefer ecfs_get_download_plan or ecfs_search_documents instead, so it falls short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ecfs_get_download_planGet an ECFS download plan for a filings queryA

Get a download plan for a filings search — the same filters as ecfs_search_filings, but instead of a page of results, returns date_submission-range buckets each with a suggested_api_call safe to run to exhaustively page a large docket. Use this before ecfs_search_filings for dockets with thousands of filings (e.g. a heavily-commented NPRM): plain offset/limit paging over a large result set can return duplicate or missing filings, which the download plan's date-bucketed queries avoid.

NameRequiredDescriptionDefault
qNoFree-text search across filing content (e.g. commenter name, keywords).
sortNoSort field and direction, e.g. 'date_disseminated,DESC'.
filers_nameNoFilter by the filer's name. ECFS matches the full registered name exactly (e.g. 'ARRL, the national association for Amateur Radio', not 'ARRL'); if nothing matches, the search is retried as free text and the result carries a `note`.
proceedings_nameNoDocket / proceeding number to filter by, e.g. '17-108'.
date_received_sinceNoISO date (YYYY-MM-DD); only return filings received on or after this date.
date_received_untilNoISO date (YYYY-MM-DD); only return filings received on or before this date.
submissiontype_descriptionNoFilter by submission type, e.g. 'COMMENT', 'REPLY'.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and does well: it discloses the return shape ('date_submission-range buckets each with a suggested_api_call') and the key benefit of avoiding duplicate/missing filings. It implies a safe read operation but never explicitly states that the tool is read-only or has no side effects, which is a minor gap given zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action, then crisp comparative context, then the specific use case and rationale. Every sentence earns its place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that there is no output schema and no annotations, the description explains the returned plan structure and the reason to call it, which is the essential context. A small gap remains because it does not state whether the tool itself is read-only or describe any cost/auth constraints, but overall it is nearly complete for a planning tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all seven filters in detail. The description adds only a general connection ('the same filters as ecfs_search_filings'), which is useful context but does not add parameter-level meaning beyond what the schema provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Get a download plan for a filings search') and immediately distinguishes it from the sibling ecfs_search_filings by contrasting returned paginated results with date-bucketed plans. An agent can tell exactly what this tool produces versus what search_filings returns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says when to use this tool ('before ecfs_search_filings for dockets with thousands of filings') and explains why the alternative, plain offset/limit paging, is unsafe ('can return duplicate or missing filings'). The condition for selecting this tool over its sibling is stated directly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ecfs_get_filingGet an ECFS filing by IDB

Fetch a single ECFS filing by its submission ID.

NameRequiredDescriptionDefault
id_submissionYesThe ECFS submission ID of the filing to fetch.

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. 'Fetch' implies a read-only operation, but the description does not explicitly confirm no side effects, nor does it mention permissions, error behavior, or return characteristics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with zero wasted words. The action and resource are immediately clear.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read tool with full schema coverage, the description is minimally adequate. However, with no annotations and no output schema, it does not explain what the returned filing contains or how errors like a missing submission ID are handled.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input parameter is already documented as the ECFS submission ID. The description's phrase 'by its submission ID' adds no syntax or format detail beyond the schema, making the baseline score of 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Fetch), resource (ECFS filing), and scope (single, by submission ID). This implicitly distinguishes it from ecfs_search_filings, though no sibling is named directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives no guidance on when to use this tool versus alternatives such as ecfs_search_filings or ecfs_download_document. The 'by ID' phrasing implies usage but does not state prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ecfs_list_inboxesList ECFS non-docketed filing inboxesA

List the available inboxes for non-docketed filings in ECFS.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full responsibility. It does disclose the read-only, non-destructive nature of a listing operation, but it omits any mention of authentication, rate limits, or the structure of the returned data. This is minimal but acceptable for a simple list tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler words. It efficiently conveys the action and object without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple with no parameters and no output schema. The description states what it returns (the list of inboxes), which is sufficient for an agent to understand the basic behavior. The lack of return format detail is a minor gap given the low complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the description need not elaborate on parameter usage. The baseline for zero parameters is 4, and no additional parameter context is required.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('List') and the specific resource ('available inboxes for non-docketed filings in ECFS'). It distinguishes itself from sibling search/get tools by its listing nature, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus the sibling tools, such as search_filings or get_filing. It doesn't mention preconditions, alternatives, or exclusions, leaving the agent to infer usage context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ecfs_raw_requestRaw ECFS API requestA

Escape hatch for calling any ECFS public API path/query parameters not covered by the other tools. The api_key is added automatically; do not include it yourself.

NameRequiredDescriptionDefault
pathYesECFS API path to call, relative to https://publicapi.fcc.gov/ecfs (e.g. '/filings', '/filings/{id}', '/proceedings'). Use this for endpoints or parameters not covered by the other tools.
paramsNoQuery parameters to send, excluding api_key (added automatically).

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden. It usefully discloses that the api_key is injected automatically and must not be supplied, but says nothing about auth requirements, rate limits, error behavior, or that the response is a raw ECFS payload. That is modest added context for a pass-through tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences, with the escape-hatch role front-loaded and the credential caveat immediately after. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a generic passthrough whose parameters are fully documented in the schema and which has no output schema, the description covers role and the one gotcha (auto api_key) an agent must know. It could say more about response shape or failure modes, but little is strictly missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both parameters documented (path with base URL and examples, params with api_key exclusion), so the schema does the heavy lifting. The description only restates the api_key auto-injection already in the schema, adding no new syntax or format detail.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('calling any ECFS public API path/query parameters') and explicitly frames itself as the escape hatch for what the other tools don't cover, distinguishing it from all seven siblings by name of function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Clearly says to use it for endpoints or parameters not covered by the other tools, which is a real when-to-use condition. It does not, however, warn when NOT to use it (e.g. prefer a typed sibling when one exists) beyond the implicit 'not covered' clause.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ecfs_search_documentsList documents for an ECFS filingA

List the documents (attachments) associated with one or more ECFS filings, by submission ID. Returns document metadata (filename, page count, byte size, OCR status, and its viewer location) — not the document's file contents. Use ecfs_download_document to save a document's PDF.

NameRequiredDescriptionDefault
id_submissionYesSubmission ID(s) of the filing(s) to list documents for. Comma-separate multiple IDs.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full burden, and it does disclose the important behavioral trait that this is a metadata-only read that will not return file contents. It also enumerates what the response contains (filename, page count, byte size, OCR status, viewer location). It stops short of stating auth requirements, rate limits, or pagination behavior, so it is strong but not complete.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: the first gives purpose and scope, the second gives return shape plus the pointer to the sibling tool. Everything is front-loaded and nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description compensates by describing both what is returned and what is deliberately not returned, plus the alternative for the download case. An agent has everything needed to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and there is a single parameter, so the schema already documents id_submission including the comma-separated multi-ID behavior. The description's 'by submission ID' / 'one or more filings' phrasing largely repeats that, adding little beyond the schema baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the documents (attachments) associated with ECFS filings') with the scoping key (submission ID), and explicitly contrasts itself with the sibling ecfs_download_document. An agent can distinguish it from ecfs_get_filing and the download tool without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent: this tool lists metadata, and 'Use ecfs_download_document to save a document's PDF' names the alternative and the condition that selects it. The 'not the document's file contents' exclusion is exactly the when-not guidance an agent needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ecfs_search_filingsSearch ECFS filingsB

Search filings submitted to the FCC's Electronic Comment Filing System (ECFS). Filter by proceeding/docket number, filer name, submission type, and date received.

NameRequiredDescriptionDefault
qNoFree-text search across filing content (e.g. commenter name, keywords).
sortNoSort field and direction, e.g. 'date_disseminated,DESC'.
limitNoMax results to return (API max is 100). Defaults to 25.
offsetNoPagination offset. Defaults to 0.
filers_nameNoFilter by the filer's name. ECFS matches the full registered name exactly (e.g. 'ARRL, the national association for Amateur Radio', not 'ARRL'); if nothing matches, the search is retried as free text and the result carries a `note`.
proceedings_nameNoDocket / proceeding number to filter by, e.g. '17-108'.
date_received_sinceNoISO date (YYYY-MM-DD); only return filings received on or after this date.
date_received_untilNoISO date (YYYY-MM-DD); only return filings received on or before this date.
submissiontype_descriptionNoFilter by submission type, e.g. 'COMMENT', 'REPLY'.

TDQS

B3.2/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden, yet it says nothing about authentication, rate limits, result ordering defaults, pagination behavior, or the free-text fallback for filer names. The only behavioral detail in the tool (the retry-as-free-text behavior and the resulting `note`) lives in the schema, not the description.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, with the resource scope front-loaded before the filter list. Efficient, though the second sentence is essentially a restatement of the schema property names.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter read tool with no annotations and no output schema, the description omits what a result looks like, whether pagination metadata is returned, and any auth context. The schema covers parameter detail well, but the description leaves the agent to infer the rest.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description restates the filter categories (docket, filer, submission type, date) that the schema already documents in more depth, adding no format or syntax detail beyond it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Search filings submitted to the FCC's Electronic Comment Filing System') and names the filterable dimensions. It does not explicitly differentiate itself from siblings like ecfs_search_documents or ecfs_search_proceedings, so an agent must infer the boundary, but the resource is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description enumerates usable filters, which implies when the tool is appropriate, but it never says when to prefer it over ecfs_search_documents or ecfs_search_proceedings, nor does it state prerequisites. Usage is implied rather than guided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ecfs_search_proceedingsSearch ECFS proceedingsC

Search proceedings (dockets) registered in the FCC ECFS system, e.g. by docket number.

NameRequiredDescriptionDefault
nameNoDocket / proceeding number to filter by, e.g. '17-108'.
limitNoMax results to return. Defaults to 25.
offsetNoPagination offset. Defaults to 0.

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. 'Search' implies a safe read, but the description does not confirm this is non-mutating, nor does it mention pagination behavior, result shape, or any auth/rate-limit context. Minimal disclosure for a tool with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single well-formed sentence with the resource and scope front-loaded and no filler. It is efficient, though it is arguably under-specified rather than optimally tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only search with zero required parameters and fully described schema, the definition is minimally adequate. No output schema exists, so the description could say more about what results contain, and it offers no routing guidance against seven siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters (name, limit, offset) are already documented with examples and defaults. The description only alludes to the 'name' filter via 'by docket number', adding no new syntax or format detail. Baseline 3 applies when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Search) and resource (proceedings/dockets) in the FCC ECFS system, clarifying that 'proceedings' means dockets. This implicitly distinguishes it from siblings like search_documents and search_filings, though it never names them, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives only an example query ('e.g. by docket number') but no guidance on when to choose this tool over ecfs_search_documents or ecfs_search_filings, and no prerequisites or exclusions. The agent must infer the boundary from the resource noun alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool updatev0.4.1
    • Changedecfs_download_document2 fields changed
      • changedInput schema / properties / output_dir / description
        Previous value: -"Directory to save the file in. Omit to use the server's configured download directory (ECFS_DOWNLOAD_DIR); only set this when the user asks for a specific place."New value: +"Optional subfolder of the user's download folder (ECFS_DOWNLOAD_DIR, default ~/Downloads/ecfs) to save into, e.g. \"wt-09-209\". It's created if missing. Absolute or ~ paths are accepted only if they are inside the download folder; anything outside it is rejected. Omit unless the user asks for a subfolder. The saved file always ends in .pdf."
      • addedInput schema / properties / output_dir / maxLength
        Added value: +255
  2. 7 tool updatesv0.4.0
    • Addedecfs_download_document
    • Changedecfs_get_download_plan2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / filers_name / description
        Previous value: -"Filter by the filer's/commenter's name."New value: +"Filter by the filer's name. ECFS matches the full registered name exactly (e.g. 'ARRL, the national association for Amateur Radio', not 'ARRL'); if nothing matches, the search is retried as free text and the result carries a `note`."
    • Changedecfs_get_filing1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedecfs_raw_request2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / params / propertyNames
        Added value: +{
        +  "type": "string"
        +}
    • Changedecfs_search_documents1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedecfs_search_filings3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • changedInput schema / properties / filers_name / description
        Previous value: -"Filter by the filer's/commenter's name."New value: +"Filter by the filer's name. ECFS matches the full registered name exactly (e.g. 'ARRL, the national association for Amateur Radio', not 'ARRL'); if nothing matches, the search is retried as free text and the result carries a `note`."
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
    • Changedecfs_search_proceedings2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / offset / maximum
        Added value: +9007199254740991
  3. 7 tool updatesv0.3.0
    • First observedecfs_get_download_plan
    • First observedecfs_get_filing
    • First observedecfs_list_inboxes
    • First observedecfs_raw_request
    • First observedecfs_search_documents
    • First observedecfs_search_filings
    • First observedecfs_search_proceedings

TDQS

A3.7/5.0

Scored across 8 tools

Disambiguation4/5

Most tools have clearly distinct purposes: filing lookup, document download, document listing, proceeding search, and inbox listing. Minor overlap comes from ecfs_raw_request being a universal escape hatch and from ecfs_get_download_plan sharing filters with ecfs_search_filings, though both descriptions clarify when to use them.

Naming Consistency4/5

All tools use a consistent ecfs_ snake_case prefix and mostly follow a verb_noun pattern such as ecfs_get_filing, ecfs_search_documents, and ecfs_list_inboxes. The main deviation is ecfs_raw_request, which is still readable but does not follow the same action-verb style.

Tool Count5/5

Eight tools is well within the expected range for a focused ECFS API server. Each tool covers a meaningful operation, and the set is not padded with redundant endpoints.

Completeness5/5

For a read-only ECFS research server, the surface covers the core lifecycle: searching proceedings, searching filings, fetching a filing, listing documents, downloading documents, and handling non-docketed inboxes. The raw request tool also provides an escape hatch for any uncovered API paths.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Search and trace US federal rules across the Federal Register (proposed/final rules and notices), the eCFR (codified, point-in-time CFR full text, locally mirrored), and Regulations.gov (rulemaking dockets and public comments) via MCP.
    870 npm
    1
    Apache 2.0
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables querying and exploring FCC Open Data datasets via Socrata SoQL, including dataset search, metadata retrieval, and data querying.
    671 npm
    MIT