Skip to main content
Glama
biocontext-ai

BioContextAI Knowledgebase MCP

Official

bc_get_generic_equivalents

Find generic drug alternatives for brand-name medications by searching ANDA entries with matching active ingredients.

Instructions

Find generic equivalents for a brand name drug. Searches ANDA entries with matching active ingredients.

Returns: dict: Brand drug info, generic_equivalents array, total_generics_found count or error message.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
brand_nameYesBrand name drug to find generics for

Implementation Reference

  • The core handler function for the 'get_generic_equivalents' tool (prefixed to 'bc_get_generic_equivalents' in main app). It fetches the brand drug's active ingredients from OpenFDA and searches for matching ANDA (generic) approvals.
    @core_mcp.tool() def get_generic_equivalents( brand_name: Annotated[str, Field(description="Brand name drug to find generics for")], ) -> dict: """Find generic equivalents for a brand name drug. Searches ANDA entries with matching active ingredients. Returns: dict: Brand drug info, generic_equivalents array, total_generics_found count or error message. """ # First, search for the brand name drug to get its active ingredient brand_query = f"(openfda.brand_name:{brand_name} OR products.brand_name:{brand_name})" base_url = "https://api.fda.gov/drug/drugsfda.json" brand_params: Any = {"search": brand_query, "limit": 1} try: brand_response = requests.get(base_url, params=brand_params) brand_response.raise_for_status() brand_data = brand_response.json() if not brand_data.get("results"): return {"error": f"Brand name drug '{brand_name}' not found in FDA database"} # Extract active ingredients from the brand drug brand_drug = brand_data["results"][0] # Check if we have products and active ingredients if not brand_drug.get("products"): return {"error": f"Could not find product information for '{brand_name}'"} # Search for generic drugs (ANDA applications) with similar active ingredients generic_results = [] # Try to find active ingredients from the first product for product in brand_drug["products"][:1]: # Just check first product if product.get("active_ingredients"): active_ingredients = product["active_ingredients"] # Handle case where active_ingredients might be an object or array if isinstance(active_ingredients, dict): ingredient_name = active_ingredients.get("name", "") if ingredient_name: # Search for ANDA applications with this active ingredient generic_query = ( f"application_number:ANDA* AND products.active_ingredients.name:{ingredient_name}" ) generic_params: Any = {"search": generic_query, "limit": 20} try: generic_response = requests.get(base_url, params=generic_params) generic_response.raise_for_status() generic_data = generic_response.json() if generic_data.get("results"): generic_results.extend(generic_data["results"]) except requests.exceptions.RequestException: continue # Skip this ingredient if search fails elif isinstance(active_ingredients, list): for ingredient in active_ingredients: if isinstance(ingredient, dict): ingredient_name = ingredient.get("name", "") if ingredient_name: # Search for ANDA applications with this active ingredient generic_query = ( f"application_number:ANDA* AND products.active_ingredients.name:{ingredient_name}" ) generic_params = {"search": generic_query, "limit": 20} try: generic_response = requests.get(base_url, params=generic_params) generic_response.raise_for_status() generic_data = generic_response.json() if generic_data.get("results"): generic_results.extend(generic_data["results"]) except requests.exceptions.RequestException: continue # Skip this ingredient if search fails return { "brand_drug": brand_drug, "generic_equivalents": generic_results, "total_generics_found": len(generic_results), } except requests.exceptions.RequestException as e: return {"error": f"Failed to fetch generic equivalents: {e!s}"}
  • Registers the core_mcp (name='BC') into the main mcp_app with prefix slugify('BC')='bc', making tools available as 'bc_*' including 'bc_get_generic_equivalents'.
    for mcp in [core_mcp, *(await get_openapi_mcps())]: await mcp_app.import_server( mcp, slugify(mcp.name), ) logger.info("MCP server setup complete.")
  • Defines core_mcp FastMCP server instance named 'BC' where tools like get_generic_equivalents are decorated and registered.
    core_mcp = FastMCP( # type: ignore "BC", instructions="Provides access to biomedical knowledge bases.", )
  • Pydantic schema for input: brand_name (str, required, description provided). Output: dict with brand_drug, generic_equivalents list, total_generics_found.
    def get_generic_equivalents( brand_name: Annotated[str, Field(description="Brand name drug to find generics for")], ) -> dict:
  • Exports get_generic_equivalents from _advanced_search.py for use in core_mcp.
    from ._advanced_search import ( get_available_pharmacologic_classes, get_generic_equivalents, search_drugs_by_therapeutic_class, )

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