Skip to main content
Glama
biocontext-ai

BioContextAI Knowledgebase MCP

Official

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
NameRequiredDescriptionDefault
keywordNoSearch keyword
opp_numNoOpportunity number
eligibilitiesNoEligibilities (comma-separated)
agenciesNoAgency codes (comma-separated)
rowsNoResults to return
opp_statusesNo'forecasted|posted' (pipe-separated, default: 'forecasted|posted')forecasted|posted
alnNoAssistance Listing Number
funding_categoriesNoCategories (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}"}
  • 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 *
  • 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:

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/biocontext-ai/knowledgebase-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server