Skip to main content
Glama

search-drugs

Find drug information from FDA database by entering brand or generic names to access medication details and specifications.

Instructions

Search for drug information using FDA database

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
queryYesDrug name to search for (brand name or generic name)
limitNoNumber of results to return (max 50)

Implementation Reference

  • Core handler function that queries the FDA OpenFDA drug label API by brand name search term, returning DrugLabel objects.
    export async function searchDrugs( query: string, limit: number = 10, ): Promise<DrugLabel[]> { const res = await superagent .get(`${FDA_API_BASE}/drug/label.json`) .query({ search: `openfda.brand_name:${query}`, limit: limit, }) .set("User-Agent", USER_AGENT); return res.body.results || []; }
  • src/index.ts:43-67 (registration)
    MCP server.tool registration for 'search-drugs', including description, input schema, and wrapper handler calling searchDrugs.
    server.tool( "search-drugs", "Search for drug information using FDA database", { query: z .string() .describe("Drug name to search for (brand name or generic name)"), limit: z .number() .int() .min(1) .max(50) .optional() .default(10) .describe("Number of results to return (max 50)"), }, async ({ query, limit }) => { try { const drugs = await searchDrugs(query, limit); return formatDrugSearchResults(drugs, query); } catch (error: any) { return createErrorResponse("searching drugs", error); } }, );
  • Zod input schema defining 'query' (required string) and 'limit' (optional number, 1-50, default 10).
    { query: z .string() .describe("Drug name to search for (brand name or generic name)"), limit: z .number() .int() .min(1) .max(50) .optional() .default(10) .describe("Number of results to return (max 50)"), },
  • Helper function that formats the raw FDA API drug search results into a formatted text response for MCP.
    export function formatDrugSearchResults(drugs: any[], query: string) { if (drugs.length === 0) { return createMCPResponse( `No drugs found for "${query}". Try a different search term.`, ); } let result = `**Drug Search Results for "${query}"**\n\n`; result += `Found ${drugs.length} drug(s)\n\n`; drugs.forEach((drug, index) => { result += `${index + 1}. **${drug.openfda.brand_name?.[0] || "Unknown Brand"}**\n`; result += ` Generic Name: ${drug.openfda.generic_name?.[0] || "Not specified"}\n`; result += ` Manufacturer: ${drug.openfda.manufacturer_name?.[0] || "Not specified"}\n`; result += ` Route: ${drug.openfda.route?.[0] || "Not specified"}\n`; result += ` Dosage Form: ${drug.openfda.dosage_form?.[0] || "Not specified"}\n`; if (drug.purpose && drug.purpose.length > 0) { result += ` Purpose: ${drug.purpose[0].substring(0, 200)}${drug.purpose[0].length > 200 ? "..." : ""}\n`; } result += ` Last Updated: ${drug.effective_time}\n\n`; }); return createMCPResponse(result); }
  • TypeScript interface defining the structure of FDA DrugLabel objects returned by the search API.
    export type DrugLabel = { openfda: { brand_name?: string[]; generic_name?: string[]; manufacturer_name?: string[]; product_ndc?: string[]; substance_name?: string[]; route?: string[]; dosage_form?: string[]; }; purpose?: string[]; warnings?: string[]; adverse_reactions?: string[]; drug_interactions?: string[]; dosage_and_administration?: string[]; clinical_pharmacology?: string[]; effective_time: string; };

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/JamesANZ/medical-mcp'

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