Skip to main content
Glama

openfda_approval_searcher

Verify FDA drug approval details by searching the Drugs@FDA database. Retrieve application numbers, drug names, formulations, marketing status, and approval dates to confirm drug status and history.

Instructions

Search FDA drug approval records from Drugs@FDA database.

⚠️ PREREQUISITE: Use the 'think' tool FIRST to plan your research strategy!

Returns information about:
- Application numbers and sponsors
- Brand and generic names
- Product formulations and strengths
- Marketing status and approval dates
- Submission history

Useful for verifying if a drug is FDA-approved and when.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
api_keyNoOptional OpenFDA API key (overrides OPENFDA_API_KEY env var)
application_numberNoNDA or BLA application number
approval_yearNoYear of approval (YYYY format)
drugNoDrug name (brand or generic) to search for
limitNoMaximum number of results
pageNoPage number (1-based)

Implementation Reference

  • The primary MCP tool handler function for 'openfda_approval_searcher'. Registers the tool via @mcp_app.tool(), defines input schema via Pydantic Annotated fields, and implements logic by delegating to the openfda helper module.
    @mcp_app.tool()
    @track_performance("biomcp.openfda_approval_searcher")
    async def openfda_approval_searcher(
        drug: Annotated[
            str | None,
            Field(description="Drug name (brand or generic) to search for"),
        ] = None,
        application_number: Annotated[
            str | None,
            Field(description="NDA or BLA application number"),
        ] = None,
        approval_year: Annotated[
            str | None,
            Field(description="Year of approval (YYYY format)"),
        ] = None,
        limit: Annotated[
            int,
            Field(description="Maximum number of results", ge=1, le=100),
        ] = 25,
        page: Annotated[
            int,
            Field(description="Page number (1-based)", ge=1),
        ] = 1,
        api_key: Annotated[
            str | None,
            Field(
                description="Optional OpenFDA API key (overrides OPENFDA_API_KEY env var)"
            ),
        ] = None,
    ) -> str:
        """Search FDA drug approval records from Drugs@FDA database.
    
        ⚠️ PREREQUISITE: Use the 'think' tool FIRST to plan your research strategy!
    
        Returns information about:
        - Application numbers and sponsors
        - Brand and generic names
        - Product formulations and strengths
        - Marketing status and approval dates
        - Submission history
    
        Useful for verifying if a drug is FDA-approved and when.
        """
        from biomcp.openfda import search_drug_approvals
    
        skip = (page - 1) * limit
        return await search_drug_approvals(
            drug=drug,
            application_number=application_number,
            approval_year=approval_year,
            limit=limit,
            skip=skip,
            api_key=api_key,
        )
  • The supporting helper function that performs the actual OpenFDA API search for drug approvals, constructs search queries, handles pagination, formats results, and includes supporting formatting functions.
    async def search_drug_approvals(
        drug: str | None = None,
        application_number: str | None = None,
        approval_year: str | None = None,
        limit: int = OPENFDA_DEFAULT_LIMIT,
        skip: int = 0,
        api_key: str | None = None,
    ) -> str:
        """
        Search FDA drug approval records from Drugs@FDA.
    
        Args:
            drug: Drug name (brand or generic) to search for
            application_number: NDA or BLA application number
            approval_year: Year of approval (YYYY format)
            limit: Maximum number of results to return
            skip: Number of results to skip (for pagination)
    
            api_key: Optional OpenFDA API key (overrides OPENFDA_API_KEY env var)
    
        Returns:
            Formatted string with drug approval information
        """
        # Build search query
        search_params = {}
    
        if drug:
            # Search both brand and generic names
            search_params["search"] = (
                f'(openfda.brand_name:"{drug}" OR '
                f'openfda.generic_name:"{drug}" OR '
                f'openfda.substance_name:"{drug}")'
            )
        elif application_number:
            search_params["search"] = f'application_number:"{application_number}"'
        elif approval_year:
            # Search for approvals in a specific year
            search_params["search"] = (
                f"products.marketing_status_date:[{approval_year}-01-01 TO {approval_year}-12-31]"
            )
    
        # Add pagination
        search_params["limit"] = str(min(limit, 100))
        search_params["skip"] = str(skip)
    
        # Sort by submission date (most recent first)
        search_params["sort"] = "submissions.submission_status_date:desc"
    
        # Make the request
        response, error = await make_openfda_request(
            OPENFDA_DRUGSFDA_URL, search_params, "openfda_approvals", api_key
        )
    
        if error:
            return f"⚠️ Error searching drug approvals: {error}"
    
        if not response or not response.get("results"):
            return "No drug approval records found matching your criteria."
    
        # Format the results
        results = response["results"]
        total = (
            response.get("meta", {}).get("results", {}).get("total", len(results))
        )
    
        output = ["## FDA Drug Approval Records\n"]
    
        if drug:
            output.append(f"**Drug**: {drug}")
        if application_number:
            output.append(f"**Application**: {application_number}")
        if approval_year:
            output.append(f"**Approval Year**: {approval_year}")
    
        output.append(
            f"**Total Records Found**: {format_count(total, 'record')}\n"
        )
    
        # Show results
        output.append(f"### Results (showing {len(results)} of {total}):\n")
    
        for i, record in enumerate(results, 1):
            output.extend(_format_approval_summary(record, i))
    
        output.append(f"\n{OPENFDA_DISCLAIMER}")
    
        return "\n".join(output)
  • Tool registration via the @mcp_app.tool() decorator applied to the handler function.
    @mcp_app.tool()
    @track_performance("biomcp.openfda_approval_searcher")
    async def openfda_approval_searcher(
        drug: Annotated[
            str | None,
            Field(description="Drug name (brand or generic) to search for"),
        ] = None,
        application_number: Annotated[
            str | None,
            Field(description="NDA or BLA application number"),
        ] = None,
        approval_year: Annotated[
            str | None,
            Field(description="Year of approval (YYYY format)"),
        ] = None,
        limit: Annotated[
            int,
            Field(description="Maximum number of results", ge=1, le=100),
        ] = 25,
        page: Annotated[
            int,
            Field(description="Page number (1-based)", ge=1),
        ] = 1,
        api_key: Annotated[
            str | None,
            Field(
                description="Optional OpenFDA API key (overrides OPENFDA_API_KEY env var)"
            ),
        ] = None,
    ) -> str:
        """Search FDA drug approval records from Drugs@FDA database.
    
        ⚠️ PREREQUISITE: Use the 'think' tool FIRST to plan your research strategy!
    
        Returns information about:
        - Application numbers and sponsors
        - Brand and generic names
        - Product formulations and strengths
        - Marketing status and approval dates
        - Submission history
    
        Useful for verifying if a drug is FDA-approved and when.
        """
        from biomcp.openfda import search_drug_approvals
    
        skip = (page - 1) * limit
        return await search_drug_approvals(
            drug=drug,
            application_number=application_number,
            approval_year=approval_year,
            limit=limit,
            skip=skip,
            api_key=api_key,
        )
  • Input schema definition via function parameters with Pydantic annotations.
        drug: Annotated[
            str | None,
            Field(description="Drug name (brand or generic) to search for"),
        ] = None,
        application_number: Annotated[
            str | None,
            Field(description="NDA or BLA application number"),
        ] = None,
        approval_year: Annotated[
            str | None,
            Field(description="Year of approval (YYYY format)"),
        ] = None,
        limit: Annotated[
            int,
            Field(description="Maximum number of results", ge=1, le=100),
        ] = 25,
        page: Annotated[
            int,
            Field(description="Page number (1-based)", ge=1),
        ] = 1,
        api_key: Annotated[
            str | None,
            Field(
                description="Optional OpenFDA API key (overrides OPENFDA_API_KEY env var)"
            ),
        ] = None,
    ) -> str:

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/genomoncology/biomcp'

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