Skip to main content
Glama

Server Details

Search Grants.gov funding opportunities and read full records: eligibility, awards, deadlines.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
99.6% over 24 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/grantsgov-mcp-server
GitHub Stars
2
Server Listing
grantsgov-mcp-server

TDQS

A4.4/5.0

Scored across 3 tools

Disambiguation5/5

Each tool has a clearly distinct role: reference-code lookup, opportunity search, and opportunity-record retrieval. The descriptions explicitly clarify boundaries, such as search rows lacking award/eligibility detail and those being read via get_opportunity.

Naming Consistency5/5

All tools use the same grantsgov_ prefix with a snake_case verb_noun pattern: get_opportunity, list_reference, search_opportunities. The convention is predictable and readable.

Tool Count5/5

Three tools are well-scoped for a read-only Grants.gov search/retrieval server: one for filter discovery, one for searching, and one for detailed record retrieval. Each tool earns its place without obvious redundancy.

Completeness4/5

The surface covers the core lifecycle of discovering filters, searching opportunities, and reading detailed opportunity records across statuses. Minor gaps exist around downloading attachments/packages, but the metadata is exposed through get_opportunity.

Available Tools

3 tools
grantsgov_get_opportunityGet Grants.gov OpportunityA
Read-onlyIdempotent
Inspect

Read the Grants.gov record for up to 5 opportunities, given numeric opportunity ids or opportunity numbers: deadline, funding, eligibility, description, assistance listings, contact, attachments, packages, and latest revision metadata. Lists and narratives are bounded independent pages; follow each record pages continuation to retrieve the remaining section. An opportunity number is resolved across all statuses. A miss or an ambiguous number comes back as an unresolved entry with guidance, not an error.

NameRequiredDescriptionDefault
opportunity_idsNoNumeric Grants.gov ids (e.g. 363423, or "363423" as search rows emit them), from grantsgov_search_opportunities opportunity_id. Accepts one whole string or an array, with at most 50 nonblank entries per list and 50 unique ids and numbers combined. Reads the first 5 identifiers, ids before numbers; remaining inputs have an executable continuation.
attachment_offsetNoZero-based attachment offset; defaults to 0. Page size 30.
description_offsetNoZero-based normalized description character offset; defaults to 0. Page size 12,000.
eligibility_offsetNoZero-based normalized eligibility character offset; defaults to 0. Page size 6,000.
opportunity_numbersNoAgency-assigned opportunity numbers (e.g. HRSA-27-005), matched exactly and case-insensitively across all statuses; one pair of surrounding double quotes is removed. Accepts one whole string or an array, with at most 50 nonblank entries per list and 50 unique ids and numbers combined. Reads the first 5 identifiers, ids before numbers; remaining inputs have an executable continuation. A number shared by several opportunities comes back as ambiguous with candidates.
application_package_offsetNoZero-based open package offset; defaults to 0. Page size 10.
related_opportunity_offsetNoZero-based related opportunity offset; defaults to 0. Page size 10.
funding_category_explanation_offsetNoZero-based normalized category explanation character offset; defaults to 0. Page size 2,000.

Output Schema

NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
noticeNoSummary of unresolved inputs and what to call next.
unresolvedNoInputs that did not resolve to exactly one record. Empty when all resolved.
continuationNoNext identifier batch, omitted when the queue is exhausted.
deferred_idsNoUnprocessed ids, omitted when none remain.
opportunitiesNoRecords found, in input order.
deferred_numbersNoUnprocessed numbers, omitted when none remain.

TDQS

A4.1/5.0
Behavior5/5

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

Annotations already cover the safety profile (readOnly, idempotent, openWorld), and the description adds substantial non-obvious behavior: bounded independent pagination per section with a continuation to follow, cross-status exact/case-insensitive number resolution, and the fact that misses and ambiguities return an unresolved entry with guidance rather than an error. That last point materially changes how an agent handles the response.

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?

Four front-loaded sentences whose content maps to purpose, payload, pagination, and edge-case handling, with no filler. The phrasing 'bounded independent pages' and 'follow each record pages continuation' is slightly awkward, but given eight parameters and heavy section paging the length is justified.

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 an output schema present, the description doesn't need to enumerate return fields, and it instead covers the things the schema can't: batch read limit, per-section continuation, cross-status resolution, and non-error handling of misses/ambiguity. An agent has everything needed to select and call this 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 the schema itself is unusually detailed (batch caps, id-vs-number ordering, offset page sizes, quote stripping). The description only echoes the 'up to 5' read limit and identifier kinds, adding no offset or paging semantics beyond what the schema already states, so the baseline of 3 is 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?

The description opens with a specific verb+resource ('Read the Grants.gov record') scoped to a batch ('up to 5 opportunities') and constrained by identifier type (numeric ids or opportunity numbers). It clearly implies a fetch-by-identifier role distinct from searching, but it never names grantsgov_search_opportunities as the sibling that produces those ids, so differentiation is inferential rather than explicit.

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 gives clear context for when this applies (you already hold ids or opportunity numbers) and resolves the common edge cases an agent would otherwise ask about: unresolved misses, ambiguous numbers, and continuation for inputs beyond the first five identifiers. It stops short of explicitly stating when not to use it or naming the search tool as the discovery alternative.

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

grantsgov_list_referenceList Grants.gov Reference CodesA
Read-onlyIdempotent
Inspect

List the codes Grants.gov search filters accept, with labels and live opportunity counts: agencies (top level, or one agency's sub-agencies via parent_code, or matched by name via name_contains), applicant eligibility types, funding categories, funding instruments, statuses, sort options, and keyword syntax. Use the codes as grantsgov_search_opportunities inputs.

NameRequiredDescriptionDefault
limitNoEntries per page; defaults to 50. Requests above the processing cap of 100 are clamped with a notice.
topicYesWhich list to return: agencies (agency codes), eligibilities (two-digit applicant-type codes), funding_categories, funding_instruments, statuses, sort_options, or keyword_syntax.
offsetNoZero-based offset into the complete filtered list; use continuation for the next page.
parent_codeNoAgencies only: list every code under this agency at any depth (e.g. HHS, DOD-DARPA). Case-insensitive. Omit for the top-level list.
name_containsNoKeep only entries whose label or code contains every word given, ignoring case, accents, and punctuation (e.g. "national science", "nih"). For agencies this searches every code, top-level and sub-agency. Works with every topic. A value with no letters or digits matches nothing.

Output Schema

NameRequiredDescription
capNoEffective page size, at most 100.
errorNoPresent when the call failed. Absent on success.
shownNoEntries returned on this page.
topicNoThe topic listed.
noticeNoGuidance when name_contains matched nothing, or when parent_code has no sub-agencies.
entriesNoReference entries.
truncatedNoTrue when matching entries remain after this page.
totalCountNoTotal entries matching the filters before paging.
continuationNoComplete arguments for the next grantsgov_list_reference call; absent when no entries remain.
snapshot_dateNoWhen the live vocabulary was fetched (ISO timestamp); absent for fully static topics.
reference_cacheNoDegraded reference-cache provenance; absent after a healthy refresh.

TDQS

A5/5.0
Behavior5/5

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

The description reveals specific behavioral traits like the inclusion of 'labels and live opportunity counts,' which suggests the data is dynamic and not static IDs. Furthermore, it elaborates on complex filtering behaviors, such as how 'agencies' handles top-level versus sub-agency (via parent_code) and name matching (via name_contains).

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 highly dense and efficient, functioning as a single comprehensive block. Every clause is front-loaded and critical, providing maximum information density without unnecessary fluff.

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?

Given the high complexity of the filtering logic and the presence of a 100% schema coverage, the description provides the necessary depth regarding semantic usage, behavioral constraints, and implementation details (live counts) to make the tool fully actionable.

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

Parameters5/5

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

Although the schema coverage is 100%, the description provides critical semantic context that the schema alone misses. It explains complex parameter behaviors like `parent_code` (covering any depth) and `name_contains` (ignoring case, accents, and punctuation), significantly increasing the agent's understanding of how to utilize the input fields.

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 is highly specific, stating it lists 'the codes Grants.gov search filters accept.' It clearly identifies the resource (reference codes) and the categories of codes it provides (agencies, eligibilities, categories, etc.), distinguishing its role as a lookup tool.

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 provides a direct and mandatory usage guideline: 'Use the codes as grantsgov_search_opportunities inputs.' This clearly establishes the necessary sequence of tool usage (lookup then search) and routes the agent to the appropriate dependent tool.

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

grantsgov_search_opportunitiesSearch Grants.gov OpportunitiesA
Read-onlyIdempotent
Inspect

Search federal funding opportunities on Grants.gov by keyword, agency, applicant eligibility, funding category, funding instrument, assistance listing, opportunity number, posting window (posted_within_days), or closing window (closing_within_days). Returns forecasted and posted opportunities unless statuses says otherwise, each row led by its close date and days remaining, plus facet counts for narrowing. Bare keyword terms are all required; join alternatives with OR, in parentheses when other terms stay required. Rows carry no award amounts or eligibility detail; read those with grantsgov_get_opportunity. Filter codes come from grantsgov_list_reference.

NameRequiredDescriptionDefault
sortNoResult order: relevance (best keyword match; needs keyword, otherwise the order is arbitrary), open_date_desc/open_date_asc (posting date), close_date_asc/close_date_desc (close date; no close date sorts last on asc), opportunity_number_asc/_desc, agency_asc/_desc. Default: relevance with a keyword, else open_date_desc.
limitNoRequested rows per page (1-1,000; default 25). Values above 100 return 100 rows with a notice.
offsetNoZero-based row offset for paging; use next_offset from the previous page.
keywordNoFull-text search over title, description, opportunity number, and agency. Bare terms are all required (rural broadband = rural AND broadband); join alternatives with OR, quote phrases ("mental health"), exclude with NOT or -term, and use a trailing * for prefixes (broad*). OR mixed with AND or with bare terms must be grouped in parentheses, e.g. (rural OR tribal) broadband; an ungrouped mix is rejected. A word with an internal hyphen or period (COVID-19, K-12) is matched as a phrase. Field prefixes (agency:NSF, cfda:93.866) are rejected: use the agencies, assistance_listing, or other filter instead. See grantsgov_list_reference topic keyword_syntax.
agenciesNoAgency codes from grantsgov_list_reference topic agencies (e.g. HHS, HHS-NIH11, NSF). One whole string or an array, up to 10 nonblank entries. A code includes its sub-agencies. Case-insensitive. Any listed agency matches.
statusesNoLifecycle statuses to include: forecasted, posted, closed, archived. One whole string or an array, up to 4 nonblank entries. Default: forecasted and posted.
eligibilitiesNoTwo-digit applicant-type codes from grantsgov_list_reference topic eligibilities (e.g. 12 = nonprofits with 501(c)(3) status, 07 = federally recognized tribal governments). One whole string or an array of strings or numbers, up to 17 nonblank entries. A single digit is zero-padded (7 = 07). Any listed type matches.
include_facetsNoInclude facet counts per filter value. Set false when paging to save space.
assistance_listingNoOne assistance listing number (ALN, formerly CFDA), e.g. 93.866 or 93866, in any case. Only one value is supported.
funding_categoriesNoFunding category codes from grantsgov_list_reference topic funding_categories (e.g. HL = Health, ED = Education). One whole string or an array, up to 28 nonblank entries. Case-insensitive. Any listed category matches.
opportunity_numberNoExact agency-assigned opportunity number (e.g. HRSA-27-005), matched case-insensitively; one pair of surrounding double quotes is removed. Numbers are not unique across agencies, so several rows can match. To look up a number across every status, prefer grantsgov_get_opportunity with opportunity_numbers.
posted_within_daysNoOnly opportunities posted in the last N days (1-3650). Works only with the forecasted and posted statuses.
closing_within_daysNoOnly posted opportunities closing between today and N days from today, US Eastern (0-365; 0 = closing today). Searches posted opportunities in close-date order, so statuses may only be posted and sort only close_date_asc.
funding_instrumentsNoFunding instruments: G (grant), CA (cooperative agreement), PC (procurement contract), O (other). One whole string or an array, up to 4 nonblank entries. Any listed instrument matches.
include_unrestrictedNoWhen eligibilities is set, also match opportunities open to any applicant type (code 99), which the specific codes do not cover. Set false to see only opportunities targeted at the listed types.

Output Schema

NameRequiredDescription
capNoThe limit applied.
errorNoPresent when the call failed. Absent on success.
shownNoRows returned on this page.
facetsNoCounts per filter value for the current filters. Omitted when include_facets is false.
noticeNoZero-hit or window guidance naming the next call.
truncatedNoTrue when more scanned matches remain after this page or a closing-window scan is incomplete, including on an empty page.
totalCountNoMatching opportunities counted. In closing_within_days mode, total_count_kind says whether this is exact or a lower bound.
next_offsetNoOffset for the next reachable page of scanned matches; absent when none remain, even if the closing-window scan is incomplete.
opportunitiesNoMatching opportunities, deadline first.
applied_filtersNoFilters as the server applied them, including defaults and expansions.
reference_cacheNoDegraded reference-cache provenance when a filter uses stale vocabulary.
total_count_kindNoClosing-window count precision: exact after exhaustion or an observed boundary; lower_bound when unscanned rows may still qualify. Omitted in other modes.
effective_keywordNoThe keyword as compiled and sent upstream.

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the read-only and idempotent annotations, the description discloses the default status scope (forecasted and posted), row ordering around close date and days remaining, facet counts, and the absence of award/eligibility detail in results. It also explains key keyword behavior, including required bare terms and OR grouping rules.

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 purpose and filters, then adds return behavior, keyword syntax, detail limitations, and sibling routing. It is appropriately sized for a 15-parameter search tool, with each sentence serving a distinct function.

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?

Given the rich schema, annotations, output schema, and sibling tools, the description provides enough context to search correctly and to know when to switch tools. It covers defaults, result limitations, and filter-code sourcing without needing to restate the full schema.

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 carries the detailed parameter semantics. The description summarizes the filter dimensions and keyword grouping behavior, but mostly repeats information available in the schema rather than adding substantially new parameter meaning.

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 ('Search federal funding opportunities on Grants.gov') and enumerates the main filter dimensions. It also distinguishes the tool from its siblings by routing award/eligibility detail to grantsgov_get_opportunity and filter-code lookup to grantsgov_list_reference.

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 clearly indicates when to use sibling tools: read award amounts or eligibility detail with grantsgov_get_opportunity, and look up filter codes with grantsgov_list_reference. It does not explicitly state when to prefer this search over a direct opportunity lookup, leaving that nuance to the opportunity_number schema text.

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. 2 tool updates
    • Changedgrantsgov_list_reference9 fields changed
      • addedInput schema / properties / limit
        Added value: +{
        +  "default": 50,
        +  "description": "Entries per page; defaults to 50. Requests above the processing cap of 100 are clamped with a notice.",
        +  "maximum": 1000,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Zero-based offset into the complete filtered list; use continuation for the next page.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "topic",
        -      "entries",
        -      "totalCount"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "topic",
        +      "entries",
        +      "totalCount",
        +      "shown",
        +      "cap",
        +      "truncated"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • addedOutput schema / properties / cap
        Added value: +{
        +  "description": "Effective page size, at most 100.",
        +  "type": "number"
        +}
      • addedOutput schema / properties / continuation
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Complete arguments for the next grantsgov_list_reference call; absent when no entries remain.",
        +  "properties": {
        +    "limit": {
        +      "description": "Effective page size.",
        +      "type": "number"
        +    },
        +    "name_contains": {
        +      "description": "The same name filter.",
        +      "type": "string"
        +    },
        +    "offset": {
        +      "description": "Offset of the next page.",
        +      "type": "number"
        +    },
        +    "parent_code": {
        +      "description": "The same agency scope.",
        +      "type": "string"
        +    },
        +    "topic": {
        +      "description": "Topic to list again.",
        +      "enum": [
        +        "agencies",
        +        "eligibilities",
        +        "funding_categories",
        +        "funding_instruments",
        +        "statuses",
        +        "sort_options",
        +        "keyword_syntax"
        +      ],
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "topic",
        +    "limit",
        +    "offset"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / reference_cache
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Degraded reference-cache provenance; absent after a healthy refresh.",
        +  "properties": {
        +    "reason": {
        +      "description": "Sanitized refresh failure reason.",
        +      "enum": [
        +        "upstream_unavailable",
        +        "upstream_route_unavailable",
        +        "rate_limited"
        +      ],
        +      "type": "string"
        +    },
        +    "retry_after": {
        +      "description": "ISO timestamp when a refresh can be attempted again.",
        +      "type": "string"
        +    },
        +    "status": {
        +      "const": "stale",
        +      "description": "The cached vocabulary is expired.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "reason",
        +    "retry_after"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / shown
        Added value: +{
        +  "description": "Entries returned on this page.",
        +  "type": "number"
        +}
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Entries returned."New value: +"Total entries matching the filters before paging."
      • addedOutput schema / properties / truncated
        Added value: +{
        +  "description": "True when matching entries remain after this page.",
        +  "type": "boolean"
        +}
    • Changedgrantsgov_search_opportunities6 fields changed
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `invalid_keyword`: The keyword has unbalanced quotes or parentheses, a leading AND/OR, a trailing or doubled operator, or nothing left after removing unsupported characters. `unknown_agency`: An agencies code is neither a known agency code nor a hyphen-delimited prefix of one. `unknown_eligibility`: An eligibilities code is not in the applicant-type list. `unknown_funding_category`: A funding_categories code is not in the category list. `filter_conflict`: posted_within_days with closed or archived in statuses; closing_within_days with statuses other than posted or a sort other than close_date_asc. `upstream_unavailable`: Grants.gov did not respond, or returned a 5xx, a non-JSON body, a non-zero errorcode, or a backend-unavailable message, after retries. `rate_limited`: Grants.gov answered HTTP 429 (rate limited) through every retry, or asked for a wait longer than the retry budget. `upstream_route_unavailable`: Grants.gov answered HTTP 403 Missing Authentication Token: the search route no longer exists at the gateway. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_keyword`: The keyword has unbalanced quotes or parentheses, a leading AND/OR, a trailing or doubled operator, or nothing left after removing unsupported characters. `unknown_agency`: An agencies code is neither a known agency code nor a hyphen-delimited prefix of one. `unknown_eligibility`: An eligibilities code is not in the applicant-type list. `unknown_funding_category`: A funding_categories code is not in the category list. `filter_conflict`: posted_within_days with closed or archived in statuses; closing_within_days with statuses other than posted or a sort other than close_date_asc. `upstream_unavailable`: Grants.gov returned a malformed search page, or did not respond or returned a 5xx, a non-JSON body, a non-zero errorcode, or a backend-unavailable message after retries. `rate_limited`: Grants.gov answered HTTP 429 (rate limited) through every retry, or asked for a wait longer than the retry budget. `upstream_route_unavailable`: Grants.gov answered HTTP 403 Missing Authentication Token: the search route no longer exists at the gateway. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / next_offset / description
        Previous value: -"Offset for the next page; absent on the last page."New value: +"Offset for the next reachable page of scanned matches; absent when none remain, even if the closing-window scan is incomplete."
      • addedOutput schema / properties / reference_cache
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Degraded reference-cache provenance when a filter uses stale vocabulary.",
        +  "properties": {
        +    "reason": {
        +      "description": "Sanitized refresh failure reason.",
        +      "enum": [
        +        "upstream_unavailable",
        +        "upstream_route_unavailable",
        +        "rate_limited"
        +      ],
        +      "type": "string"
        +    },
        +    "retry_after": {
        +      "description": "ISO timestamp when a refresh can be attempted again.",
        +      "type": "string"
        +    },
        +    "snapshot_date": {
        +      "description": "ISO timestamp of the vocabulary used for validation.",
        +      "type": "string"
        +    },
        +    "status": {
        +      "const": "stale",
        +      "description": "The validation vocabulary is expired.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "status",
        +    "reason",
        +    "retry_after",
        +    "snapshot_date"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / properties / totalCount / description
        Previous value: -"Total matching opportunities (the closing-window count in closing_within_days mode)."New value: +"Matching opportunities counted. In closing_within_days mode, total_count_kind says whether this is exact or a lower bound."
      • addedOutput schema / properties / total_count_kind
        Added value: +{
        +  "description": "Closing-window count precision: exact after exhaustion or an observed boundary; lower_bound when unscanned rows may still qualify. Omitted in other modes.",
        +  "enum": [
        +    "exact",
        +    "lower_bound"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when more rows exist past this page."New value: +"True when more scanned matches remain after this page or a closing-window scan is incomplete, including on an empty page."
  2. 2 tool updates
    • Changedgrantsgov_get_opportunity28 fields changed
      • addedInput schema / properties / application_package_offset
        Added value: +{
        +  "description": "Zero-based open package offset; defaults to 0. Page size 10.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / attachment_offset
        Added value: +{
        +  "description": "Zero-based attachment offset; defaults to 0. Page size 30.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / description_offset
        Added value: +{
        +  "description": "Zero-based normalized description character offset; defaults to 0. Page size 12,000.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / eligibility_offset
        Added value: +{
        +  "description": "Zero-based normalized eligibility character offset; defaults to 0. Page size 6,000.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / funding_category_explanation_offset
        Added value: +{
        +  "description": "Zero-based normalized category explanation character offset; defaults to 0. Page size 2,000.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedInput schema / properties / opportunity_ids / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "anyOf": [
        +        {
        +          "anyOf": [
        +            {
        +              "maximum": 9007199254740991,
        +              "minimum": 1,
        +              "type": "integer"
        +            },
        +            {
        +              "pattern": "^\\s*\\d+\\s*$",
        +              "type": "string"
        +            }
        +          ]
        +        },
        +        {
        +          "pattern": "^\\s*$",
        +          "type": "string"
        +        }
        +      ]
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / opportunity_ids / description
        Previous value: -"Numeric Grants.gov ids (e.g. 363423, or \"363423\" as search rows emit them), from grantsgov_search_opportunities opportunity_id. Up to 5 combined with opportunity_numbers."New value: +"Numeric Grants.gov ids (e.g. 363423, or \"363423\" as search rows emit them), from grantsgov_search_opportunities opportunity_id. Accepts one whole string or an array, with at most 50 nonblank entries per list and 50 unique ids and numbers combined. Reads the first 5 identifiers, ids before numbers; remaining inputs have an executable continuation."
      • removedInput schema / properties / opportunity_ids / items
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "maximum": 9007199254740991,
        -      "minimum": 1,
        -      "type": "integer"
        -    },
        -    {
        -      "pattern": "^\\s*\\d+\\s*$",
        -      "type": "string"
        -    }
        -  ]
        -}
      • removedInput schema / properties / opportunity_ids / maxItems
        Removed value: -5
      • removedInput schema / properties / opportunity_ids / type
        Removed value: -"array"
      • addedInput schema / properties / opportunity_numbers / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "anyOf": [
        +        {
        +          "pattern": "^(?:[^\"]*|\\s*\"[^\"]*\"\\s*)$",
        +          "type": "string"
        +        },
        +        {
        +          "pattern": "^\\s*$",
        +          "type": "string"
        +        }
        +      ]
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / opportunity_numbers / description
        Previous value: -"Agency-assigned opportunity numbers (e.g. HRSA-27-005), matched exactly and case-insensitively across all statuses; one pair of surrounding double quotes is removed. A number shared by several opportunities comes back as ambiguous with candidates. Up to 5 combined with opportunity_ids."New value: +"Agency-assigned opportunity numbers (e.g. HRSA-27-005), matched exactly and case-insensitively across all statuses; one pair of surrounding double quotes is removed. Accepts one whole string or an array, with at most 50 nonblank entries per list and 50 unique ids and numbers combined. Reads the first 5 identifiers, ids before numbers; remaining inputs have an executable continuation. A number shared by several opportunities comes back as ambiguous with candidates."
      • removedInput schema / properties / opportunity_numbers / items
        Removed value: -{
        -  "pattern": "^(?:[^\"]*|\\s*\"[^\"]*\"\\s*)$",
        -  "type": "string"
        -}
      • removedInput schema / properties / opportunity_numbers / maxItems
        Removed value: -5
      • removedInput schema / properties / opportunity_numbers / type
        Removed value: -"array"
      • addedInput schema / properties / related_opportunity_offset
        Added value: +{
        +  "description": "Zero-based related opportunity offset; defaults to 0. Page size 10.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / continuation
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Next identifier batch, omitted when the queue is exhausted.",
        +  "properties": {
        +    "arguments": {
        +      "additionalProperties": false,
        +      "description": "Executable remaining queue with the original section offsets.",
        +      "properties": {
        +        "application_package_offset": {
        +          "description": "Zero-based open package offset; defaults to 0. Page size 10.",
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "attachment_offset": {
        +          "description": "Zero-based attachment offset; defaults to 0. Page size 30.",
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "description_offset": {
        +          "description": "Zero-based normalized description character offset; defaults to 0. Page size 12,000.",
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "eligibility_offset": {
        +          "description": "Zero-based normalized eligibility character offset; defaults to 0. Page size 6,000.",
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "funding_category_explanation_offset": {
        +          "description": "Zero-based normalized category explanation character offset; defaults to 0. Page size 2,000.",
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        },
        +        "opportunity_ids": {
        +          "description": "Unprocessed numeric ids, in order.",
        +          "items": {
        +            "maximum": 9007199254740991,
        +            "minimum": -9007199254740991,
        +            "type": "integer"
        +          },
        +          "type": "array"
        +        },
        +        "opportunity_numbers": {
        +          "description": "Unprocessed opportunity numbers, in order.",
        +          "items": {
        +            "type": "string"
        +          },
        +          "type": "array"
        +        },
        +        "related_opportunity_offset": {
        +          "description": "Zero-based related opportunity offset; defaults to 0. Page size 10.",
        +          "maximum": 9007199254740991,
        +          "minimum": 0,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "opportunity_ids",
        +        "opportunity_numbers"
        +      ],
        +      "type": "object"
        +    },
        +    "tool": {
        +      "const": "grantsgov_get_opportunity",
        +      "description": "Tool to call.",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "tool",
        +    "arguments"
        +  ],
        +  "type": "object"
        +}
      • addedOutput schema / properties / deferred_ids
        Added value: +{
        +  "description": "Unprocessed ids, omitted when none remain.",
        +  "items": {
        +    "maximum": 9007199254740991,
        +    "minimum": -9007199254740991,
        +    "type": "integer"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / deferred_numbers
        Added value: +{
        +  "description": "Unprocessed numbers, omitted when none remain.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `no_identifiers`: Both opportunity_ids and opportunity_numbers are empty or unset. `too_many_identifiers`: More than 5 ids and numbers combined after de-duplication. `upstream_unavailable`: Grants.gov did not respond, or returned a 5xx, a non-JSON body, a non-zero errorcode, or a backend-unavailable message, after retries. `rate_limited`: Grants.gov answered HTTP 429 (rate limited) through every retry, or asked for a wait longer than the retry budget. `upstream_route_unavailable`: Grants.gov answered HTTP 403 Missing Authentication Token on the detail route, or on the search route used to resolve opportunity numbers: the route no longer exists at the gateway. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_identifiers`: Both opportunity_ids and opportunity_numbers are empty or unset. `too_many_identifiers`: More than 50 ids and numbers combined after de-duplication. `upstream_unavailable`: Grants.gov did not respond, or returned a 5xx, a non-JSON body, a non-zero errorcode, or a backend-unavailable message, after retries. `rate_limited`: Grants.gov answered HTTP 429 (rate limited) through every retry, or asked for a wait longer than the retry budget. `upstream_route_unavailable`: Grants.gov answered HTTP 403 Missing Authentication Token on the detail route, or on the search route used to resolve opportunity numbers: the route no longer exists at the gateway. Other values are possible when a failure originates below the handler."
      • addedOutput schema / properties / opportunities / items / properties / attachments / items / properties / created_date
        Added value: +{
        +  "description": "Upstream attachment timestamp unchanged, including its stated timezone.",
        +  "type": "string"
        +}
      • changedOutput schema / properties / opportunities / items / properties / description_truncated / description
        Previous value: -"True when description was cut at 12,000 characters."New value: +"True when the description page omits a prefix or suffix of the full description."
      • changedOutput schema / properties / opportunities / items / properties / eligibility_narrative_truncated / description
        Previous value: -"True when eligibility_narrative was cut at 6,000 characters."New value: +"True when the eligibility page omits a prefix or suffix of the full narrative."
      • changedOutput schema / properties / opportunities / items / properties / funding_category_explanation_truncated / description
        Previous value: -"True when funding_category_explanation was cut at 2,000 characters."New value: +"True when the category explanation page omits a prefix or suffix."
      • addedOutput schema / properties / opportunities / items / properties / last_revision_changed
        Added value: +{
        +  "description": "Changed public field names; unknown names retain the upstream: prefix. Not a computed historical diff.",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedOutput schema / properties / opportunities / items / properties / last_revision_note
        Added value: +{
        +  "description": "Agency note on the latest active synopsis or forecast revision; omitted when unavailable.",
        +  "type": "string"
        +}
      • addedOutput schema / properties / opportunities / items / properties / pages
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Independent bounded pages; execute each continuation literally to retrieve its remaining section.",
        +  "properties": {
        +    "application_package_offset": {
        +      "additionalProperties": false,
        +      "description": "Open application package page.",
        +      "properties": {
        +        "continuation": {
        +          "additionalProperties": false,
        +          "description": "Next call for this section; other offsets default to zero.",
        +          "properties": {
        +            "arguments": {
        +              "additionalProperties": false,
        +              "description": "Executable arguments advancing only this section.",
        +              "properties": {
        +                "application_package_offset": {
        +                  "description": "Zero-based open package offset; defaults to 0. Page size 10.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "attachment_offset": {
        +                  "description": "Zero-based attachment offset; defaults to 0. Page size 30.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "description_offset": {
        +                  "description": "Zero-based normalized description character offset; defaults to 0. Page size 12,000.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "eligibility_offset": {
        +                  "description": "Zero-based normalized eligibility character offset; defaults to 0. Page size 6,000.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "funding_category_explanation_offset": {
        +                  "description": "Zero-based normalized category explanation character offset; defaults to 0. Page size 2,000.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "opportunity_ids": {
        +                  "description": "The single opportunity to continue.",
        +                  "items": {
        +                    "maximum": 9007199254740991,
        +                    "minimum": -9007199254740991,
        +                    "type": "integer"
        +                  },
        +                  "maxItems": 1,
        +                  "minItems": 1,
        +                  "type": "array"
        +                },
        +                "related_opportunity_offset": {
        +                  "description": "Zero-based related opportunity offset; defaults to 0. Page size 10.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                }
        +              },
        +              "required": [
        +                "opportunity_ids"
        +              ],
        +              "type": "object"
        +            },
        +            "tool": {
        +              "const": "grantsgov_get_opportunity",
        +              "description": "Tool to call.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "tool",
        +            "arguments"
        +          ],
        +          "type": "object"
        +        },
        +        "next_offset": {
        +          "description": "Next offset; absent on the final or past-end page.",
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        },
        +        "offset": {
        +          "description": "Requested zero-based offset.",
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        },
        +        "total": {
        +          "description": "Full normalized character or item count. Omitted for an absent narrative.",
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "offset"
        +      ],
        +      "type": "object"
        +    },
        +    "attachment_offset": {
        +      "additionalProperties": false,
        +      "description": "Attachment page.",
        +      "properties": {
        +        "continuation": {
        +          "additionalProperties": false,
        +          "description": "Next call for this section; other offsets default to zero.",
        +          "properties": {
        +            "arguments": {
        +              "additionalProperties": false,
        +              "description": "Executable arguments advancing only this section.",
        +              "properties": {
        +                "application_package_offset": {
        +                  "description": "Zero-based open package offset; defaults to 0. Page size 10.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "attachment_offset": {
        +                  "description": "Zero-based attachment offset; defaults to 0. Page size 30.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "description_offset": {
        +                  "description": "Zero-based normalized description character offset; defaults to 0. Page size 12,000.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "eligibility_offset": {
        +                  "description": "Zero-based normalized eligibility character offset; defaults to 0. Page size 6,000.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "funding_category_explanation_offset": {
        +                  "description": "Zero-based normalized category explanation character offset; defaults to 0. Page size 2,000.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "opportunity_ids": {
        +                  "description": "The single opportunity to continue.",
        +                  "items": {
        +                    "maximum": 9007199254740991,
        +                    "minimum": -9007199254740991,
        +                    "type": "integer"
        +                  },
        +                  "maxItems": 1,
        +                  "minItems": 1,
        +                  "type": "array"
        +                },
        +                "related_opportunity_offset": {
        +                  "description": "Zero-based related opportunity offset; defaults to 0. Page size 10.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                }
        +              },
        +              "required": [
        +                "opportunity_ids"
        +              ],
        +              "type": "object"
        +            },
        +            "tool": {
        +              "const": "grantsgov_get_opportunity",
        +              "description": "Tool to call.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "tool",
        +            "arguments"
        +          ],
        +          "type": "object"
        +        },
        +        "next_offset": {
        +          "description": "Next offset; absent on the final or past-end page.",
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        },
        +        "offset": {
        +          "description": "Requested zero-based offset.",
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        },
        +        "total": {
        +          "description": "Full normalized character or item count. Omitted for an absent narrative.",
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "offset"
        +      ],
        +      "type": "object"
        +    },
        +    "description_offset": {
        +      "additionalProperties": false,
        +      "description": "Description character page.",
        +      "properties": {
        +        "continuation": {
        +          "additionalProperties": false,
        +          "description": "Next call for this section; other offsets default to zero.",
        +          "properties": {
        +            "arguments": {
        +              "additionalProperties": false,
        +              "description": "Executable arguments advancing only this section.",
        +              "properties": {
        +                "application_package_offset": {
        +                  "description": "Zero-based open package offset; defaults to 0. Page size 10.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "attachment_offset": {
        +                  "description": "Zero-based attachment offset; defaults to 0. Page size 30.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "description_offset": {
        +                  "description": "Zero-based normalized description character offset; defaults to 0. Page size 12,000.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "eligibility_offset": {
        +                  "description": "Zero-based normalized eligibility character offset; defaults to 0. Page size 6,000.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "funding_category_explanation_offset": {
        +                  "description": "Zero-based normalized category explanation character offset; defaults to 0. Page size 2,000.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "opportunity_ids": {
        +                  "description": "The single opportunity to continue.",
        +                  "items": {
        +                    "maximum": 9007199254740991,
        +                    "minimum": -9007199254740991,
        +                    "type": "integer"
        +                  },
        +                  "maxItems": 1,
        +                  "minItems": 1,
        +                  "type": "array"
        +                },
        +                "related_opportunity_offset": {
        +                  "description": "Zero-based related opportunity offset; defaults to 0. Page size 10.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                }
        +              },
        +              "required": [
        +                "opportunity_ids"
        +              ],
        +              "type": "object"
        +            },
        +            "tool": {
        +              "const": "grantsgov_get_opportunity",
        +              "description": "Tool to call.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "tool",
        +            "arguments"
        +          ],
        +          "type": "object"
        +        },
        +        "next_offset": {
        +          "description": "Next offset; absent on the final or past-end page.",
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        },
        +        "offset": {
        +          "description": "Requested zero-based offset.",
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        },
        +        "total": {
        +          "description": "Full normalized character or item count. Omitted for an absent narrative.",
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "offset"
        +      ],
        +      "type": "object"
        +    },
        +    "eligibility_offset": {
        +      "additionalProperties": false,
        +      "description": "Eligibility character page.",
        +      "properties": {
        +        "continuation": {
        +          "additionalProperties": false,
        +          "description": "Next call for this section; other offsets default to zero.",
        +          "properties": {
        +            "arguments": {
        +              "additionalProperties": false,
        +              "description": "Executable arguments advancing only this section.",
        +              "properties": {
        +                "application_package_offset": {
        +                  "description": "Zero-based open package offset; defaults to 0. Page size 10.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "attachment_offset": {
        +                  "description": "Zero-based attachment offset; defaults to 0. Page size 30.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "description_offset": {
        +                  "description": "Zero-based normalized description character offset; defaults to 0. Page size 12,000.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "eligibility_offset": {
        +                  "description": "Zero-based normalized eligibility character offset; defaults to 0. Page size 6,000.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "funding_category_explanation_offset": {
        +                  "description": "Zero-based normalized category explanation character offset; defaults to 0. Page size 2,000.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "opportunity_ids": {
        +                  "description": "The single opportunity to continue.",
        +                  "items": {
        +                    "maximum": 9007199254740991,
        +                    "minimum": -9007199254740991,
        +                    "type": "integer"
        +                  },
        +                  "maxItems": 1,
        +                  "minItems": 1,
        +                  "type": "array"
        +                },
        +                "related_opportunity_offset": {
        +                  "description": "Zero-based related opportunity offset; defaults to 0. Page size 10.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                }
        +              },
        +              "required": [
        +                "opportunity_ids"
        +              ],
        +              "type": "object"
        +            },
        +            "tool": {
        +              "const": "grantsgov_get_opportunity",
        +              "description": "Tool to call.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "tool",
        +            "arguments"
        +          ],
        +          "type": "object"
        +        },
        +        "next_offset": {
        +          "description": "Next offset; absent on the final or past-end page.",
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        },
        +        "offset": {
        +          "description": "Requested zero-based offset.",
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        },
        +        "total": {
        +          "description": "Full normalized character or item count. Omitted for an absent narrative.",
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "offset"
        +      ],
        +      "type": "object"
        +    },
        +    "funding_category_explanation_offset": {
        +      "additionalProperties": false,
        +      "description": "Category explanation character page.",
        +      "properties": {
        +        "continuation": {
        +          "additionalProperties": false,
        +          "description": "Next call for this section; other offsets default to zero.",
        +          "properties": {
        +            "arguments": {
        +              "additionalProperties": false,
        +              "description": "Executable arguments advancing only this section.",
        +              "properties": {
        +                "application_package_offset": {
        +                  "description": "Zero-based open package offset; defaults to 0. Page size 10.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "attachment_offset": {
        +                  "description": "Zero-based attachment offset; defaults to 0. Page size 30.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "description_offset": {
        +                  "description": "Zero-based normalized description character offset; defaults to 0. Page size 12,000.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "eligibility_offset": {
        +                  "description": "Zero-based normalized eligibility character offset; defaults to 0. Page size 6,000.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "funding_category_explanation_offset": {
        +                  "description": "Zero-based normalized category explanation character offset; defaults to 0. Page size 2,000.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "opportunity_ids": {
        +                  "description": "The single opportunity to continue.",
        +                  "items": {
        +                    "maximum": 9007199254740991,
        +                    "minimum": -9007199254740991,
        +                    "type": "integer"
        +                  },
        +                  "maxItems": 1,
        +                  "minItems": 1,
        +                  "type": "array"
        +                },
        +                "related_opportunity_offset": {
        +                  "description": "Zero-based related opportunity offset; defaults to 0. Page size 10.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                }
        +              },
        +              "required": [
        +                "opportunity_ids"
        +              ],
        +              "type": "object"
        +            },
        +            "tool": {
        +              "const": "grantsgov_get_opportunity",
        +              "description": "Tool to call.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "tool",
        +            "arguments"
        +          ],
        +          "type": "object"
        +        },
        +        "next_offset": {
        +          "description": "Next offset; absent on the final or past-end page.",
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        },
        +        "offset": {
        +          "description": "Requested zero-based offset.",
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        },
        +        "total": {
        +          "description": "Full normalized character or item count. Omitted for an absent narrative.",
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "offset"
        +      ],
        +      "type": "object"
        +    },
        +    "related_opportunity_offset": {
        +      "additionalProperties": false,
        +      "description": "Related opportunity page.",
        +      "properties": {
        +        "continuation": {
        +          "additionalProperties": false,
        +          "description": "Next call for this section; other offsets default to zero.",
        +          "properties": {
        +            "arguments": {
        +              "additionalProperties": false,
        +              "description": "Executable arguments advancing only this section.",
        +              "properties": {
        +                "application_package_offset": {
        +                  "description": "Zero-based open package offset; defaults to 0. Page size 10.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "attachment_offset": {
        +                  "description": "Zero-based attachment offset; defaults to 0. Page size 30.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "description_offset": {
        +                  "description": "Zero-based normalized description character offset; defaults to 0. Page size 12,000.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "eligibility_offset": {
        +                  "description": "Zero-based normalized eligibility character offset; defaults to 0. Page size 6,000.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "funding_category_explanation_offset": {
        +                  "description": "Zero-based normalized category explanation character offset; defaults to 0. Page size 2,000.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                },
        +                "opportunity_ids": {
        +                  "description": "The single opportunity to continue.",
        +                  "items": {
        +                    "maximum": 9007199254740991,
        +                    "minimum": -9007199254740991,
        +                    "type": "integer"
        +                  },
        +                  "maxItems": 1,
        +                  "minItems": 1,
        +                  "type": "array"
        +                },
        +                "related_opportunity_offset": {
        +                  "description": "Zero-based related opportunity offset; defaults to 0. Page size 10.",
        +                  "maximum": 9007199254740991,
        +                  "minimum": 0,
        +                  "type": "integer"
        +                }
        +              },
        +              "required": [
        +                "opportunity_ids"
        +              ],
        +              "type": "object"
        +            },
        +            "tool": {
        +              "const": "grantsgov_get_opportunity",
        +              "description": "Tool to call.",
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "tool",
        +            "arguments"
        +          ],
        +          "type": "object"
        +        },
        +        "next_offset": {
        +          "description": "Next offset; absent on the final or past-end page.",
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        },
        +        "offset": {
        +          "description": "Requested zero-based offset.",
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        },
        +        "total": {
        +          "description": "Full normalized character or item count. Omitted for an absent narrative.",
        +          "maximum": 9007199254740991,
        +          "minimum": -9007199254740991,
        +          "type": "integer"
        +        }
        +      },
        +      "required": [
        +        "offset"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "required": [
        +    "attachment_offset",
        +    "application_package_offset",
        +    "description_offset",
        +    "eligibility_offset",
        +    "funding_category_explanation_offset",
        +    "related_opportunity_offset"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / properties / opportunities / items / required
        Previous value: -[
        -  "opportunity_id",
        -  "opportunity_number",
        -  "title",
        -  "status",
        -  "doc_type",
        -  "grants_gov_url",
        -  "close_date_kind",
        -  "close_date_is_estimate",
        -  "past_revision_count",
        -  "money_source",
        -  "applicant_types",
        -  "funding_instruments",
        -  "funding_categories",
        -  "assistance_listings",
        -  "attachments",
        -  "attachment_count",
        -  "application_packages",
        -  "application_package_count",
        -  "closed_package_count",
        -  "related_opportunities",
        -  "related_opportunity_count"
        -]New value: +[
        +  "opportunity_id",
        +  "opportunity_number",
        +  "title",
        +  "status",
        +  "doc_type",
        +  "grants_gov_url",
        +  "close_date_kind",
        +  "close_date_is_estimate",
        +  "past_revision_count",
        +  "pages",
        +  "money_source",
        +  "applicant_types",
        +  "funding_instruments",
        +  "funding_categories",
        +  "assistance_listings",
        +  "attachments",
        +  "attachment_count",
        +  "application_packages",
        +  "application_package_count",
        +  "closed_package_count",
        +  "related_opportunities",
        +  "related_opportunity_count"
        +]
    • Changedgrantsgov_search_opportunities28 fields changed
      • addedInput schema / properties / agencies / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "anyOf": [
        +        {
        +          "pattern": "^\\s*(?:(?:[A-Za-z0-9]+(?:[\\s-]+[A-Za-z0-9]+)*)\\s*)?$",
        +          "type": "string"
        +        },
        +        {
        +          "pattern": "^\\s*$",
        +          "type": "string"
        +        }
        +      ]
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / agencies / description
        Previous value: -"Agency codes from grantsgov_list_reference topic agencies (e.g. HHS, HHS-NIH11, NSF). A code includes its sub-agencies. Case-insensitive. Any listed agency matches."New value: +"Agency codes from grantsgov_list_reference topic agencies (e.g. HHS, HHS-NIH11, NSF). One whole string or an array, up to 10 nonblank entries. A code includes its sub-agencies. Case-insensitive. Any listed agency matches."
      • removedInput schema / properties / agencies / items
        Removed value: -{
        -  "pattern": "^\\s*(?:(?:[A-Za-z0-9]+(?:[\\s-]+[A-Za-z0-9]+)*)\\s*)?$",
        -  "type": "string"
        -}
      • removedInput schema / properties / agencies / maxItems
        Removed value: -10
      • removedInput schema / properties / agencies / type
        Removed value: -"array"
      • addedInput schema / properties / eligibilities / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "anyOf": [
        +        {
        +          "anyOf": [
        +            {
        +              "pattern": "^\\s*(?:(?:\\d{1,2})\\s*)?$",
        +              "type": "string"
        +            },
        +            {
        +              "maximum": 99,
        +              "minimum": 0,
        +              "type": "integer"
        +            }
        +          ]
        +        },
        +        {
        +          "pattern": "^\\s*$",
        +          "type": "string"
        +        }
        +      ]
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / eligibilities / description
        Previous value: -"Two-digit applicant-type codes from grantsgov_list_reference topic eligibilities (e.g. 12 = nonprofits with 501(c)(3) status, 07 = federally recognized tribal governments), as strings or numbers. A single digit is zero-padded (7 = 07). Any listed type matches."New value: +"Two-digit applicant-type codes from grantsgov_list_reference topic eligibilities (e.g. 12 = nonprofits with 501(c)(3) status, 07 = federally recognized tribal governments). One whole string or an array of strings or numbers, up to 17 nonblank entries. A single digit is zero-padded (7 = 07). Any listed type matches."
      • removedInput schema / properties / eligibilities / items
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "pattern": "^\\s*(?:(?:\\d{1,2})\\s*)?$",
        -      "type": "string"
        -    },
        -    {
        -      "maximum": 99,
        -      "minimum": 0,
        -      "type": "integer"
        -    }
        -  ]
        -}
      • removedInput schema / properties / eligibilities / maxItems
        Removed value: -17
      • removedInput schema / properties / eligibilities / type
        Removed value: -"array"
      • addedInput schema / properties / funding_categories / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "anyOf": [
        +        {
        +          "pattern": "^\\s*(?:(?:[A-Za-z]{1,4})\\s*)?$",
        +          "type": "string"
        +        },
        +        {
        +          "pattern": "^\\s*$",
        +          "type": "string"
        +        }
        +      ]
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / funding_categories / description
        Previous value: -"Funding category codes from grantsgov_list_reference topic funding_categories (e.g. HL = Health, ED = Education). Case-insensitive. Any listed category matches."New value: +"Funding category codes from grantsgov_list_reference topic funding_categories (e.g. HL = Health, ED = Education). One whole string or an array, up to 28 nonblank entries. Case-insensitive. Any listed category matches."
      • removedInput schema / properties / funding_categories / items
        Removed value: -{
        -  "pattern": "^\\s*(?:(?:[A-Za-z]{1,4})\\s*)?$",
        -  "type": "string"
        -}
      • removedInput schema / properties / funding_categories / maxItems
        Removed value: -28
      • removedInput schema / properties / funding_categories / type
        Removed value: -"array"
      • addedInput schema / properties / funding_instruments / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "anyOf": [
        +        {
        +          "enum": [
        +            "G",
        +            "CA",
        +            "PC",
        +            "O"
        +          ],
        +          "type": "string"
        +        },
        +        {
        +          "pattern": "^\\s*$",
        +          "type": "string"
        +        }
        +      ]
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / funding_instruments / description
        Previous value: -"Funding instruments: G (grant), CA (cooperative agreement), PC (procurement contract), O (other). Any listed instrument matches."New value: +"Funding instruments: G (grant), CA (cooperative agreement), PC (procurement contract), O (other). One whole string or an array, up to 4 nonblank entries. Any listed instrument matches."
      • removedInput schema / properties / funding_instruments / items
        Removed value: -{
        -  "enum": [
        -    "G",
        -    "CA",
        -    "PC",
        -    "O"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / funding_instruments / maxItems
        Removed value: -4
      • removedInput schema / properties / funding_instruments / type
        Removed value: -"array"
      • changedInput schema / properties / limit / description
        Previous value: -"Rows per page (1-100)."New value: +"Requested rows per page (1-1,000; default 25). Values above 100 return 100 rows with a notice."
      • changedInput schema / properties / limit / maximum
        Previous value: -100New value: +1000
      • addedInput schema / properties / statuses / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "items": {
        +      "anyOf": [
        +        {
        +          "enum": [
        +            "forecasted",
        +            "posted",
        +            "closed",
        +            "archived"
        +          ],
        +          "type": "string"
        +        },
        +        {
        +          "pattern": "^\\s*$",
        +          "type": "string"
        +        }
        +      ]
        +    },
        +    "type": "array"
        +  }
        +]
      • changedInput schema / properties / statuses / description
        Previous value: -"Lifecycle statuses to include: forecasted, posted, closed, archived. Default: forecasted and posted."New value: +"Lifecycle statuses to include: forecasted, posted, closed, archived. One whole string or an array, up to 4 nonblank entries. Default: forecasted and posted."
      • removedInput schema / properties / statuses / items
        Removed value: -{
        -  "enum": [
        -    "forecasted",
        -    "posted",
        -    "closed",
        -    "archived"
        -  ],
        -  "type": "string"
        -}
      • removedInput schema / properties / statuses / maxItems
        Removed value: -4
      • removedInput schema / properties / statuses / type
        Removed value: -"array"
      • changedOutput schema / properties / facets / properties / sub_agencies / description
        Previous value: -"Counts per sub-agency code under the top-level agencies in the result. Present only when agencies is set."New value: +"Current-query subtree counts per sub-agency, including known intermediate parents. Present only when agencies is set. Number mode retains upstream facet scope; closing-window facets cover the wider posted set."
  3. 3 tool updates
    • First observedgrantsgov_get_opportunity
    • First observedgrantsgov_list_reference
    • First observedgrantsgov_search_opportunities

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables asking questions in natural language about live grants.gov funding opportunities, with tools to find, filter, check eligibility, track deadlines, and rank matches—while refusing to guess when data is unavailable.
    1
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Read one exact U.S. federal grant opportunity next to its official record with seven MCP tools for cited documents, requirements, amendments, hard gates, award history, and unresolved evidence. Independent UtilityHouse product; limited free beta.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides access to open federal grant opportunities from Grants.gov without authentication. Enables querying and exploring grant data through natural language via Pipeworx gateway.
    207 npm
    1
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    Enables searching SBIR/STTR and federal grant data from Grants.gov, NIH RePORTER, and the NSF Award Search API, including open opportunities, funded projects, similar-project matching, and SBIR/STTR totals by year, agency, and state, with a source URL attached to every result. It is read-only, requires no accounts or API keys, and stores no user data.
    5
    1
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.