Skip to main content
Glama

federal-regulations-mcp-server

regulations_find_comments

regulations_find_comments
Read-only

Fetch public comments on a Federal Register document or a Regulations.gov docket — the unique corpus of what citizens and organizations actually submitted. Provide exactly one targeting parameter: docket_id (all comments in a docket, broadest), document_object_id (comments on one document, by its object ID or document ID), fr_document_number (convenience — resolves the FR number to the Regulations.gov document carrying it), or comment_id (one comment's full detail and attachments). A list narrows by comment text with search_term (each hit then carries the matching passages) and by posted date with posted_after/posted_before. The list endpoint returns no body text or attachment info — call with comment_id to read a comment's body. When a comment's real content is a PDF/DOCX attachment, the body is a stub and attachmentOnly is true; the attachment download URLs are returned. Requires REGULATIONS_GOV_API_KEY (free at https://api.data.gov/signup/).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
pageNoPage number (1–40, default 1). Regulations.gov serves 40 pages, so a list reaches 40 × per_page comments (10,000 at per_page 250); totalPages and nextPage in the response say how far this one goes. To reach past that, take the set one posted_after/posted_before window at a time.
per_pageNoComments per page (5–250, default 25). Regulations.gov requires a minimum page size of 5.
docket_idNoFetch all comments in a docket by Regulations.gov docket ID (e.g. "EPA-HQ-OAR-2025-0194") — regulationsGovDocketId on a regulations_search_rules or regulations_list_open_comments row, or docketId from regulations_get_document, not an entry of the printed docketIds. Broadest scope. Exactly one of docket_id / document_object_id / fr_document_number / comment_id is required — supplying two is rejected, not resolved by precedence.
comment_idNoFetch one comment's full detail and attachments by its Regulations.gov comment ID (e.g. "EPA-HQ-OAR-2025-0194-31102"). Use to read a single comment's body after finding it in a list. Mutually exclusive with the other three targeting parameters — pass it alone, not alongside the docket it came from — and takes none of the list filters.
search_termNoList mode: keep only comments whose text matches, as Regulations.gov full-text search reads it — stemmed, so "flaring" also matches "flare" and "flares". Each hit then carries highlightedContent, the passages that matched.
posted_afterNoList mode: earliest posted date, inclusive, ISO 8601 (YYYY-MM-DD), a real calendar day. Pair with posted_before to take a high-volume set one window at a time.
posted_beforeNoList mode: latest posted date, inclusive, ISO 8601 (YYYY-MM-DD), a real calendar day. The same date as posted_after selects that one day.
document_object_idNoFetch comments on one specific Regulations.gov document, by either handle: its object ID, 16 hex characters (e.g. "0900006485883ec6", the objectId in regulations_get_docket's documents), or its document ID (e.g. "EPA-HQ-OW-2022-0114-0027", the regulationsGovDocumentId from regulations_get_document). Comments usually attach to the docket's primary (proposed-rule) document. Mutually exclusive with the other three targeting parameters.
fr_document_numberNoConvenience: fetch comments on the Regulations.gov document carrying a Federal Register number (e.g. "2023-05471"; older numbers like "E9-25990" too). A Regulations.gov document ID ("EPA-HQ-OW-2022-0114-0027") is not an FR number; pass it as document_object_id. Saves a get_document → get_docket hop. A document that is not on Regulations.gov — a presidential document, for one — answers not_found. Mutually exclusive with the other three targeting parameters.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
capNoThe most comments 40 pages reach at this per_page (40 × per_page); set with truncated (list mode).
modeNoWhich mode produced this result.
errorNoPresent when the call failed. Absent on success.
shownNoComments returned on this page (list mode).
titleNoComment title (detail mode).
noticeNoGuidance — no comments matched, the page is past the end, comments lie beyond the last page, or the substance of a comment is in its attachments.
targetNoWhat was queried — the docket, document, or FR document, with any search_term and posted-date filters (list mode).
bodyTextNoComment body, HTML-stripped. A stub ("See Attached") when content is in attachments; null when empty (detail mode).
commentsNoComments matching the target, this page (list mode). Bodies/attachments require comment_id detail mode.
docketIdNoDocket ID, or null (detail mode).
nextPageNoPage to request next — present only when a later page holds comments (list mode).
commentIdNoComment ID (detail mode).
truncatedNoTrue when more comments matched than 40 pages reach at this per_page, so some are on no page — set on every page of such a set (list mode).
withdrawnNoTrue when the comment was withdrawn (detail mode).
postedDateNoPosted date (detail mode).
totalCountNoTotal comments matching the target (list mode).
totalPagesNoPages of comments at this per_page, at most the 40 Regulations.gov serves; 0 when none matched (list mode).
attachmentsNoAttachment files — substance lives here when attachmentOnly is true (detail mode).
organizationNoSubmitter organization, or null (detail mode).
postmarkDateNoPostmark on a mailed submission, or null — many agencies record none (detail mode).
receivedDateNoDate Regulations.gov received the comment, or null when not recorded (detail mode).
submitterNameNoSubmitter name when public, or null (detail mode).
attachmentOnlyNoTrue when attachments exist and the body is a stub/empty — the substance is in the attachment files (detail mode).
restrictReasonNoReason the comment is restricted, or null (detail mode).
duplicateCommentsNoIdentical submissions this record stands for. 0 or 1 is an ordinary submission, depending on the agency; above 1 marks a mass-mail campaign record standing for that many identical submissions. Null when not recorded (detail mode).
commentOnDocumentIdNoDocument the comment was filed on, or null (detail mode).

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / docket_id / description
      Previous value: -"Fetch all comments in a docket by docket ID (e.g. \"EPA-HQ-OAR-2025-0194\"). Broadest scope. Exactly one of docket_id / document_object_id / fr_document_number / comment_id is required — supplying two is rejected, not resolved by precedence."New value: +"Fetch all comments in a docket by Regulations.gov docket ID (e.g. \"EPA-HQ-OAR-2025-0194\") — regulationsGovDocketId on a regulations_search_rules or regulations_list_open_comments row, or docketId from regulations_get_document, not an entry of the printed docketIds. Broadest scope. Exactly one of docket_id / document_object_id / fr_document_number / comment_id is required — supplying two is rejected, not resolved by precedence."
  2. Changed22 schema fields changed
    • changedInput schema / properties / comment_id / description
      Previous value: -"Fetch one comment's full detail and attachments by its Regulations.gov comment ID (e.g. \"EPA-HQ-OAR-2025-0194-31102\"). Use to read a single comment's body after finding it in a list. Mutually exclusive with the other three targeting parameters — pass it alone, not alongside the docket it came from."New value: +"Fetch one comment's full detail and attachments by its Regulations.gov comment ID (e.g. \"EPA-HQ-OAR-2025-0194-31102\"). Use to read a single comment's body after finding it in a list. Mutually exclusive with the other three targeting parameters — pass it alone, not alongside the docket it came from — and takes none of the list filters."
    • changedInput schema / properties / document_object_id / description
      Previous value: -"Fetch comments on one specific document by its Regulations.gov object ID (the objectId from regulations_get_docket's documents). Comments usually attach to the docket's primary (proposed-rule) document. Mutually exclusive with the other three targeting parameters."New value: +"Fetch comments on one specific Regulations.gov document, by either handle: its object ID, 16 hex characters (e.g. \"0900006485883ec6\", the objectId in regulations_get_docket's documents), or its document ID (e.g. \"EPA-HQ-OW-2022-0114-0027\", the regulationsGovDocumentId from regulations_get_document). Comments usually attach to the docket's primary (proposed-rule) document. Mutually exclusive with the other three targeting parameters."
    • addedInput schema / properties / fr_document_number / anyOf
      Added value: +[
      +  {
      +    "const": "",
      +    "type": "string"
      +  },
      +  {
      +    "description": "Federal Register document number (e.g. \"2023-05471\", \"E9-25990\").",
      +    "pattern": "^[A-Za-z]?[0-9]{1,4}-[0-9]{1,6}(-[0-9]{1,6})?$",
      +    "type": "string"
      +  }
      +]
    • changedInput schema / properties / fr_document_number / description
      Previous value: -"Convenience: fetch comments for a Federal Register document by its FR number (e.g. \"2025-14555\"). Resolves to the Regulations.gov document internally. Saves a get_document → get_docket hop. Mutually exclusive with the other three targeting parameters."New value: +"Convenience: fetch comments on the Regulations.gov document carrying a Federal Register number (e.g. \"2023-05471\"; older numbers like \"E9-25990\" too). A Regulations.gov document ID (\"EPA-HQ-OW-2022-0114-0027\") is not an FR number; pass it as document_object_id. Saves a get_document → get_docket hop. A document that is not on Regulations.gov — a presidential document, for one — answers not_found. Mutually exclusive with the other three targeting parameters."
    • removedInput schema / properties / fr_document_number / type
      Removed value: -"string"
    • changedInput schema / properties / page / description
      Previous value: -"Page number (1-based). Regulations.gov caps a query at 20 pages (5,000 records); for a high-volume docket this surfaces a sample — narrow by document_object_id."New value: +"Page number (1–40, default 1). Regulations.gov serves 40 pages, so a list reaches 40 × per_page comments (10,000 at per_page 250); totalPages and nextPage in the response say how far this one goes. To reach past that, take the set one posted_after/posted_before window at a time."
    • changedInput schema / properties / page / maximum
      Previous value: -20New value: +40
    • addedInput schema / properties / posted_after
      Added value: +{
      +  "anyOf": [
      +    {
      +      "const": "",
      +      "type": "string"
      +    },
      +    {
      +      "description": "ISO 8601 date (YYYY-MM-DD).",
      +      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +      "type": "string"
      +    }
      +  ],
      +  "description": "List mode: earliest posted date, inclusive, ISO 8601 (YYYY-MM-DD), a real calendar day. Pair with posted_before to take a high-volume set one window at a time."
      +}
    • addedInput schema / properties / posted_before
      Added value: +{
      +  "anyOf": [
      +    {
      +      "const": "",
      +      "type": "string"
      +    },
      +    {
      +      "description": "ISO 8601 date (YYYY-MM-DD).",
      +      "pattern": "^\\d{4}-\\d{2}-\\d{2}$",
      +      "type": "string"
      +    }
      +  ],
      +  "description": "List mode: latest posted date, inclusive, ISO 8601 (YYYY-MM-DD), a real calendar day. The same date as posted_after selects that one day."
      +}
    • addedInput schema / properties / search_term
      Added value: +{
      +  "description": "List mode: keep only comments whose text matches, as Regulations.gov full-text search reads it — stemmed, so \"flaring\" also matches \"flare\" and \"flares\". Each hit then carries highlightedContent, the passages that matched.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / cap
      Added value: +{
      +  "description": "The most comments 40 pages reach at this per_page (40 × per_page); set with truncated (list mode).",
      +  "type": "number"
      +}
    • addedOutput schema / properties / comments / items / properties / highlightedContent
      Added value: +{
      +  "description": "The passages of the comment text that matched search_term, as plain text — present only when search_term was given.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / duplicateComments
      Added value: +{
      +  "description": "Identical submissions this record stands for. 0 or 1 is an ordinary submission, depending on the agency; above 1 marks a mass-mail campaign record standing for that many identical submissions. Null when not recorded (detail mode).",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / error / properties / data / properties / reason / description
      Previous value: -"Machine-readable failure mode. Declared by this tool: `auth_required`: REGULATIONS_GOV_API_KEY is not configured, or Regulations.gov rejected the key that is. `target_required`: None of docket_id / document_object_id / fr_document_number / comment_id was given. `multiple_targets`: More than one of docket_id / document_object_id / fr_document_number / comment_id was given. `not_found`: The target docket/document/comment has no comments or does not exist. `rate_limited`: Regulations.gov returned 429. `upstream_unavailable`: Regulations.gov returned a 5xx, timed out, or could not be reached at all. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `auth_required`: REGULATIONS_GOV_API_KEY is not configured, or Regulations.gov rejected the key that is. `target_required`: None of docket_id / document_object_id / fr_document_number / comment_id was given. `multiple_targets`: More than one of docket_id / document_object_id / fr_document_number / comment_id was given. `filter_requires_list_mode`: search_term, posted_after, or posted_before was given with comment_id, which reads one comment and takes no filters. `date_range_inverted`: The start of a date range is later than its end. `not_found`: The target docket, document, or comment does not exist on Regulations.gov, or no Regulations.gov document carries the FR number. `rate_limited`: Regulations.gov returned 429. `upstream_unavailable`: Regulations.gov returned a 5xx, timed out, or could not be reached at all. Other values are possible when a failure originates below the handler."
    • changedOutput schema / properties / error / properties / data / properties / reason / examples
      Previous value: -[
      -  "auth_required",
      -  "target_required",
      -  "multiple_targets",
      -  "not_found",
      -  "rate_limited",
      -  "upstream_unavailable"
      -]New value: +[
      +  "auth_required",
      +  "target_required",
      +  "multiple_targets",
      +  "filter_requires_list_mode",
      +  "date_range_inverted",
      +  "not_found",
      +  "rate_limited",
      +  "upstream_unavailable"
      +]
    • addedOutput schema / properties / nextPage
      Added value: +{
      +  "description": "Page to request next — present only when a later page holds comments (list mode).",
      +  "type": "number"
      +}
    • changedOutput schema / properties / notice / description
      Previous value: -"Guidance — empty results, or that bodies need comment_id detail mode."New value: +"Guidance — no comments matched, the page is past the end, comments lie beyond the last page, or the substance of a comment is in its attachments."
    • addedOutput schema / properties / postmarkDate
      Added value: +{
      +  "description": "Postmark on a mailed submission, or null — many agencies record none (detail mode).",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / receivedDate / description
      Previous value: -"Received date, or null (detail mode)."New value: +"Date Regulations.gov received the comment, or null when not recorded (detail mode)."
    • changedOutput schema / properties / target / description
      Previous value: -"What was queried — docket / document / FR doc (list mode)."New value: +"What was queried — the docket, document, or FR document, with any search_term and posted-date filters (list mode)."
    • addedOutput schema / properties / totalPages
      Added value: +{
      +  "description": "Pages of comments at this per_page, at most the 40 Regulations.gov serves; 0 when none matched (list mode).",
      +  "type": "number"
      +}
    • changedOutput schema / properties / truncated / description
      Previous value: -"True when comments exceed the 5,000-record ceiling (list mode)."New value: +"True when more comments matched than 40 pages reach at this per_page, so some are on no page — set on every page of such a set (list mode)."
  3. Changed18 schema fields changed
    • removedOutput schema / properties / attachments / items / properties / formats / items / properties / size / anyOf
      Removed value: -[
      -  {
      -    "type": "number"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / attachments / items / properties / formats / items / properties / size / type
      Added value: +[
      +  "number",
      +  "null"
      +]
    • removedOutput schema / properties / bodyText / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / bodyText / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / commentOnDocumentId / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / commentOnDocumentId / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / comments / items / properties / agencyId / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / comments / items / properties / agencyId / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / docketId / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / docketId / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / organization / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / organization / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / receivedDate / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / receivedDate / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / restrictReason / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / restrictReason / type
      Added value: +[
      +  "string",
      +  "null"
      +]
    • removedOutput schema / properties / submitterName / anyOf
      Removed value: -[
      -  {
      -    "type": "string"
      -  },
      -  {
      -    "type": "null"
      -  }
      -]
    • addedOutput schema / properties / submitterName / type
      Added value: +[
      +  "string",
      +  "null"
      +]
  4. Changed6 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "mode"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode. Declared by this tool: `auth_required`: REGULATIONS_GOV_API_KEY is not configured, or Regulations.gov rejected the key that is. `target_required`: None of docket_id / document_object_id / fr_document_number / comment_id was given. `multiple_targets`: More than one of docket_id / document_object_id / fr_document_number / comment_id was given. `not_found`: The target docket/document/comment has no comments or does not exist. `rate_limited`: Regulations.gov returned 429. `upstream_unavailable`: Regulations.gov returned a 5xx, timed out, or could not be reached at all. Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "auth_required",
      +            "target_required",
      +            "multiple_targets",
      +            "not_found",
      +            "rate_limited",
      +            "upstream_unavailable"
      +          ],
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "mode"
      -]
  5. Changed4 schema fields changed
    • changedInput schema / properties / comment_id / description
      Previous value: -"Fetch one comment's full detail and attachments by its Regulations.gov comment ID (e.g. \"EPA-HQ-OAR-2025-0194-31102\"). Use to read a single comment's body after finding it in a list."New value: +"Fetch one comment's full detail and attachments by its Regulations.gov comment ID (e.g. \"EPA-HQ-OAR-2025-0194-31102\"). Use to read a single comment's body after finding it in a list. Mutually exclusive with the other three targeting parameters — pass it alone, not alongside the docket it came from."
    • changedInput schema / properties / docket_id / description
      Previous value: -"Fetch all comments in a docket by docket ID (e.g. \"EPA-HQ-OAR-2025-0194\"). Broadest scope. One of docket_id / document_object_id / fr_document_number / comment_id is required."New value: +"Fetch all comments in a docket by docket ID (e.g. \"EPA-HQ-OAR-2025-0194\"). Broadest scope. Exactly one of docket_id / document_object_id / fr_document_number / comment_id is required — supplying two is rejected, not resolved by precedence."
    • changedInput schema / properties / document_object_id / description
      Previous value: -"Fetch comments on one specific document by its Regulations.gov object ID (the objectId from regulations_get_docket's documents). Comments usually attach to the docket's primary (proposed-rule) document."New value: +"Fetch comments on one specific document by its Regulations.gov object ID (the objectId from regulations_get_docket's documents). Comments usually attach to the docket's primary (proposed-rule) document. Mutually exclusive with the other three targeting parameters."
    • changedInput schema / properties / fr_document_number / description
      Previous value: -"Convenience: fetch comments for a Federal Register document by its FR number (e.g. \"2025-14555\"). Resolves to the Regulations.gov document internally. Saves a get_document → get_docket hop."New value: +"Convenience: fetch comments for a Federal Register document by its FR number (e.g. \"2025-14555\"). Resolves to the Regulations.gov document internally. Saves a get_document → get_docket hop. Mutually exclusive with the other three targeting parameters."
  6. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Despite readOnlyHint=true covering the safety profile, the description adds substantial behavioral context: the list endpoint returns no body/attachment info, attachment-only comments return a stub body with attachmentOnly=true and download URLs, the 40-page/10,000-comment ceiling with the windowing workaround, stemmed search semantics, and the REGULATIONS_GOV_API_KEY requirement. This goes well beyond what annotations provide and does not contradict them.

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?

The description is long (~250 words) but densely packed — the core purpose is front-loaded, then targeting modes, then list/detail behavior, then the attachment caveat, then auth. Nearly every sentence earns its place given the genuine complexity of 9 parameters with 4 mutually exclusive targeting modes. It loses a point only because some parameter-level guidance (e.g., mutual exclusivity) is restated in both the description and the schema, creating mild redundancy.

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?

For a tool with this complexity — 9 parameters, four-way mutual exclusion, a list-vs-detail behavioral split, attachment stubs, pagination ceilings, and an auth requirement — the description is remarkably complete. It covers every targeting mode, the list/detail distinction, the pagination workaround, error behavior (not_found), and the API key. An output schema exists, so return-value documentation is not the description's job.

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?

Schema coverage is 100%, so the baseline is 3 with the schema doing the heavy lifting. The description genuinely adds meaning beyond it: the exactly-one-targeting-parameter rule, that supplying two is 'rejected, not resolved by precedence,' the 'broadest scope' ranking, comment_id's post-list use case, and the fr_document_number 'saves a hop' convenience framing. Not a 5 because the schema already documents each parameter's format and examples thoroughly.

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 first sentence states a specific verb (Fetch) and resource (public comments on a Federal Register document or Regulations.gov docket), and the opening clause 'the unique corpus of what citizens and organizations actually submitted' distinguishes it from the sibling tools, all of which deal with regulations/dockets/documents rather than the submitted comments corpus. An agent can tell this apart from list_open_comments and search_rules without examining the 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?

The description gives explicit routing for each targeting mode: docket_id is 'broadest,' fr_document_number is a 'convenience' that 'saves a get_document → get_docket hop,' and comment_id is to be used 'after finding it in a list.' It also names exact sibling tools as ID sources (regulations_search_rules, regulations_list_open_comments, regulations_get_document, regulations_get_docket) and states a negative case ('a presidential document, for one, answers not_found'). Nothing is left to inference.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.