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

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)
statusNoposted (open for applications now) | forecasted (announced, not yet posted) | closed | archived. Default posted. There is no "open" or "active" status: use "posted". For posted plus forecasted together pass open_only: true.
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

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. Changed3 schema fields changed
    • changedInput schema / examples
      Previous 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"
      -  }
      -]New value: +[
      +  {
      +    "agencies": "EPA,NOAA",
      +    "funding_categories": "ENV",
      +    "keyword": "climate resilience",
      +    "limit": 25,
      +    "status": "posted"
      +  },
      +  {
      +    "aln": "47.041",
      +    "keyword": "research",
      +    "limit": 50,
      +    "offset": 0,
      +    "open_only": true
      +  }
      +]
    • changedInput schema / properties / status / description
      Previous value: -"forecasted | posted | closed | archived (default posted; use a pipe to combine, e.g. \"posted|forecasted\")"New value: +"posted (open for applications now) | forecasted (announced, not yet posted) | closed | archived. Default posted. There is no \"open\" or \"active\" status: use \"posted\". For posted plus forecasted together pass open_only: true."
    • addedInput schema / properties / status / enum
      Added value: +[
      +  "posted",
      +  "closed",
      +  "archived",
      +  "forecasted"
      +]
  2. 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"
      +}
  3. 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"
      +}
  4. First observed

TDQS

A3.8/5.0
Behavior4/5

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

The annotations already declare readOnlyHint=true, idempotentHint=true, and openWorldHint=true, so the safety profile is covered. The description adds useful behavioral context by specifying the Grants.gov scope, the currently-open/recently-closed boundary, and the fields returned. It does not mention pagination limits or rate limits, but those are partly in the schema.

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?

Three sentences, each earning its place: scope, filters, and return fields. The search scope is front-loaded and there is no redundant wording.

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

Completeness4/5

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

For a read-only search tool with full schema coverage, annotations, and an output schema, the description is largely complete. It states what is searched, how it can be filtered, and what comes back. Its main gap is the absence of sibling differentiation for historical or single-opportunity lookups.

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

Parameters3/5

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

Schema description coverage is 100%, so all nine parameters are already documented in detail, including enum values and aliases. The description adds only a high-level list of filter dimensions and does not explain parameter interactions or nuances beyond what the schema already provides. Baseline 3 is appropriate when the schema carries the parameter semantics.

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 states a specific verb and resource: search Grants.gov for open or recently-closed federal funding opportunities. It also lists the filter dimensions and key return fields, making the tool's function clear. However, it does not distinguish this tool from likely siblings such as search_historical_opportunities or get_opportunity.

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

Usage Guidelines3/5

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

Usage is implied by 'currently-open or recently-closed' and the enumerated filters, so an agent can infer that this is the current-opportunity search tool. Yet there is no explicit guidance about when to choose this over search_historical_opportunities, get_opportunity, or agency_posting_trend, and no exclusions are stated.

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.