bc_search_grants_gov
Search for U.S. government grant opportunities using keywords, agencies, or eligibility criteria to find funding with deadlines and requirements.
Instructions
Search grants.gov by keyword, agency, or other criteria. Returns opportunity listings with deadlines and eligibility.
Returns: dict: Grant opportunities list with titles, agencies, deadlines, funding amounts, eligibility criteria or error message.
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
| keyword | No | Search keyword | |
| opp_num | No | Opportunity number | |
| eligibilities | No | Eligibilities (comma-separated) | |
| agencies | No | Agency codes (comma-separated) | |
| rows | No | Results to return | |
| opp_statuses | No | 'forecasted|posted' (pipe-separated, default: 'forecasted|posted') | forecasted|posted |
| aln | No | Assistance Listing Number | |
| funding_categories | No | Categories (comma-separated) |
Implementation Reference
- The primary handler function for the 'search_grants_gov' tool (note: tool name is 'search_grants_gov', not 'bc_search_grants_gov'). Decorated with @core_mcp.tool() for MCP registration. Includes input schema via Pydantic Annotated Fields and full implementation of the grants.gov API search logic.@core_mcp.tool() def search_grants_gov( keyword: Annotated[Optional[str], Field(description="Search keyword")] = None, opp_num: Annotated[Optional[str], Field(description="Opportunity number")] = None, eligibilities: Annotated[Optional[str], Field(description="Eligibilities (comma-separated)")] = None, agencies: Annotated[Optional[str], Field(description="Agency codes (comma-separated)")] = None, rows: Annotated[int, Field(description="Results to return")] = 10, opp_statuses: Annotated[ Optional[str], Field(description="'forecasted|posted' (pipe-separated, default: 'forecasted|posted')") ] = "forecasted|posted", aln: Annotated[Optional[str], Field(description="Assistance Listing Number")] = None, funding_categories: Annotated[Optional[str], Field(description="Categories (comma-separated)")] = None, ) -> dict: """Search grants.gov by keyword, agency, or other criteria. Returns opportunity listings with deadlines and eligibility. Returns: dict: Grant opportunities list with titles, agencies, deadlines, funding amounts, eligibility criteria or error message. """ url = "https://api.grants.gov/v1/api/search2" # Build request payload payload = {"rows": rows, "oppStatuses": opp_statuses or "forecasted|posted"} # Add optional parameters if provided if keyword: payload["keyword"] = keyword if opp_num: payload["oppNum"] = opp_num if eligibilities: payload["eligibilities"] = eligibilities if agencies: payload["agencies"] = agencies if aln: payload["aln"] = aln if funding_categories: payload["fundingCategories"] = funding_categories try: headers = {"Content-Type": "application/json"} response = requests.post(url, json=payload, headers=headers) response.raise_for_status() # Return the JSON response return response.json() except requests.exceptions.RequestException as e: return {"error": f"Failed to fetch grants data: {e!s}"}
- src/biocontext_kb/core/__init__.py:10-10 (registration)Wildcard import statement that brings the search_grants_gov tool into the core module. Since the function is decorated with @core_mcp.tool(), this import registers the tool with the core_mcp FastMCP instance.from .grants._search_grants_gov import *
- src/biocontext_kb/core/grants/__init__.py:1-1 (registration)Re-export of the search_grants_gov function from its implementation module, facilitating the wildcard import in core/__init__.py.from ._search_grants_gov import search_grants_gov
- Input schema defined via Pydantic Field descriptions in the function signature parameters.def search_grants_gov( keyword: Annotated[Optional[str], Field(description="Search keyword")] = None, opp_num: Annotated[Optional[str], Field(description="Opportunity number")] = None, eligibilities: Annotated[Optional[str], Field(description="Eligibilities (comma-separated)")] = None, agencies: Annotated[Optional[str], Field(description="Agency codes (comma-separated)")] = None, rows: Annotated[int, Field(description="Results to return")] = 10, opp_statuses: Annotated[ Optional[str], Field(description="'forecasted|posted' (pipe-separated, default: 'forecasted|posted')") ] = "forecasted|posted", aln: Annotated[Optional[str], Field(description="Assistance Listing Number")] = None, funding_categories: Annotated[Optional[str], Field(description="Categories (comma-separated)")] = None, ) -> dict: