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
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | Drug name to search for (brand name or generic name) | |
| limit | No | Number of results to return (max 50) |
Input Schema (JSON Schema)
{
"properties": {
"limit": {
"default": 10,
"description": "Number of results to return (max 50)",
"maximum": 50,
"minimum": 1,
"type": "integer"
},
"query": {
"description": "Drug name to search for (brand name or generic name)",
"type": "string"
}
},
"required": [
"query"
],
"type": "object"
}
Implementation Reference
- src/utils.ts:50-63 (handler)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); } }, );
- src/index.ts:46-58 (schema)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)"), },
- src/utils.ts:386-411 (helper)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); }
- src/types.ts:1-18 (schema)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; };