Skip to main content
Glama

Search Opportunities

search_opportunities
Read-onlyIdempotent

Search Grants.gov for currently-open or recently-closed federal funding opportunities. Filter by keyword, opportunity status, agency code, funding category, or date range. Returns opportunity number, title, agency, open/close dates, and assistance listing numbers (formerly CFDA).

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
alnNoAssistance Listing Number / CFDA number (e.g., "10.001")
limitNoRows per page (1-1000, default 25)
agencyNoAlias for `agencies` — a single agency or department code (e.g. "NIH" or "HHS"; see `agencies` for how a bare code is matched).
offsetNo0-based start record (default 0)
statusNoforecasted | posted | closed | archived (default posted; use a pipe to combine, e.g. "posted|forecasted")
keywordNoGrants.gov's own keyword match behaves like an exact/AND phrase across title and synopsis text, not a relevance-ranked full-text search — a compound multi-concept phrase (e.g. joining three unrelated nouns) routinely matches ZERO opportunities even when relevant ones are open (verified live 2026-09-25, fleet #2450: "cancer liquid biopsy diagnostic" -> 0 hits; the single word "SBIR" -> 29 hits including the exact NIH SBIR/STTR hub the compound phrase was trying to find). Prefer ONE short, salient term ("SBIR", "liquid biopsy", "wastewater") and narrow with `agencies`/`funding_categories`/`status` instead of cramming every concept into this field. A zero-hit result is worth one retry with a shorter keyword before concluding nothing is open.
agenciesNoComma-separated agency codes (e.g., "EPA,USDA" or a bare department like "HHS" or "NIH"). Grants.gov itself indexes opportunities under a FULLY-QUALIFIED sub-agency code ("HHS-NIH11", "HHS-CDC1", ...), and its own filter returns ZERO hits for a bare department code (verified live 2026-09-25, fleet #2450) — this tool detects a bare code automatically and matches it client-side against every hit's sub-agency code instead of sending it upstream, so "HHS" still finds NIH/CDC/FDA opportunities. A code you already have in the full "DEPT-SUBAGENCY#" form is sent upstream unchanged.
open_onlyNotrue restricts to currently-open or forthcoming opportunities (same as status "posted|forecasted"); omit or false leaves status at its default. Alias for status when a caller only knows open/not-open, not the exact status vocabulary.
funding_categoriesNoComma-separated category codes (e.g., "ED" education, "ENV" environment, "ST" science)

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
totalYesTotal number of opportunities matching search criteria
returnedYesNumber of opportunities returned in this response
opportunitiesYesList of opportunity search results

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • changedInput schema / properties / agencies / description
      Previous value: -"Comma-separated agency codes (e.g., \"EPA,USDA,NIH\")"New value: +"Comma-separated agency codes (e.g., \"EPA,USDA\" or a bare department like \"HHS\" or \"NIH\"). Grants.gov itself indexes opportunities under a FULLY-QUALIFIED sub-agency code (\"HHS-NIH11\", \"HHS-CDC1\", ...), and its own filter returns ZERO hits for a bare department code (verified live 2026-09-25, fleet #2450) — this tool detects a bare code automatically and matches it client-side against every hit's sub-agency code instead of sending it upstream, so \"HHS\" still finds NIH/CDC/FDA opportunities. A code you already have in the full \"DEPT-SUBAGENCY#\" form is sent upstream unchanged."
    • addedInput schema / properties / agency
      Added value: +{
      +  "description": "Alias for `agencies` — a single agency or department code (e.g. \"NIH\" or \"HHS\"; see `agencies` for how a bare code is matched).",
      +  "type": "string"
      +}
    • changedInput schema / properties / keyword / description
      Previous value: -"Full-text query"New value: +"Grants.gov's own keyword match behaves like an exact/AND phrase across title and synopsis text, not a relevance-ranked full-text search — a compound multi-concept phrase (e.g. joining three unrelated nouns) routinely matches ZERO opportunities even when relevant ones are open (verified live 2026-09-25, fleet #2450: \"cancer liquid biopsy diagnostic\" -> 0 hits; the single word \"SBIR\" -> 29 hits including the exact NIH SBIR/STTR hub the compound phrase was trying to find). Prefer ONE short, salient term (\"SBIR\", \"liquid biopsy\", \"wastewater\") and narrow with `agencies`/`funding_categories`/`status` instead of cramming every concept into this field. A zero-hit result is worth one retry with a shorter keyword before concluding nothing is open."
    • addedInput schema / properties / open_only
      Added value: +{
      +  "description": "true restricts to currently-open or forthcoming opportunities (same as status \"posted|forecasted\"); omit or false leaves status at its default. Alias for status when a caller only knows open/not-open, not the exact status vocabulary.",
      +  "type": "boolean"
      +}
  2. Changed2 schema fields changed
    • addedInput schema / examples
      Added value: +[
      +  {
      +    "agencies": "EPA,NOAA",
      +    "funding_categories": "ENV",
      +    "keyword": "climate resilience",
      +    "limit": 25,
      +    "status": "posted"
      +  },
      +  {
      +    "aln": "47.041",
      +    "keyword": "research",
      +    "limit": 50,
      +    "offset": 0,
      +    "status": "posted|forecasted"
      +  }
      +]
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "opportunities": {
      +      "description": "List of opportunity search results",
      +      "items": {
      +        "properties": {
      +          "agency": {
      +            "description": "Agency name",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "agency_code": {
      +            "description": "Agency code",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "assistance_listing_numbers": {
      +            "description": "Assistance listing numbers (formerly CFDA)",
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "close_date": {
      +            "description": "Opportunity close date",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "doc_type": {
      +            "description": "Document type",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "grants_gov_url": {
      +            "description": "Direct link to opportunity on Grants.gov",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "id": {
      +            "description": "Numeric opportunity ID",
      +            "type": [
      +              "number",
      +              "null"
      +            ]
      +          },
      +          "number": {
      +            "description": "Opportunity number",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "open_date": {
      +            "description": "Opportunity open date",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "status": {
      +            "description": "Opportunity status",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "title": {
      +            "description": "Opportunity title",
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "returned": {
      +      "description": "Number of opportunities returned in this response",
      +      "type": "number"
      +    },
      +    "total": {
      +      "description": "Total number of opportunities matching search criteria",
      +      "type": "number"
      +    }
      +  },
      +  "required": [
      +    "total",
      +    "returned",
      +    "opportunities"
      +  ],
      +  "type": "object"
      +}
  3. First observed

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true and destructiveHint=false, covering the safety and side-effect profile. The description adds the temporal scope of the result set ('currently-open or recently-closed') but no pagination, rate-limit, or result-count behavior; with annotations this is adequate but not rich.

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?

Three tight sentences, front-loaded with the source/scope before the filters and the return shape. No padding, though the 'date range' clause is a wasted/incorrect detail rather than an earned one.

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

Completeness4/5

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

With an output schema present, return values need not be explained, yet the description still names key fields (opportunity number, title, agency, dates, ALNs) helpfully. For a 9-param, zero-required search tool this is nearly complete; only the missing date-range parameter mismatch leaves a small gap.

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 carries the deep semantics (keyword AND-phrase caveat, bare-vs-qualified agency code handling, status pipe syntax). The description merely re-lists the filter dimensions, adding little beyond the schema — and its mention of 'date range' has no matching parameter, which is a mild inaccuracy.

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

Purpose5/5

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

States a specific verb (Search) and a precisely scoped resource ('currently-open or recently-closed federal funding opportunities' on Grants.gov). An agent can distinguish this from the sibling get_opportunity (single-record fetch) without opening either schema.

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

Usage Guidelines4/5

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

Explicitly enumerates the filter dimensions (keyword, status, agency code, funding category, date range) so an agent knows how to narrow. It does not state when NOT to use it or name get_opportunity as the single-record alternative, so it falls short of the top bar.

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.