Skip to main content
Glama

get-drug-by-product-ndc

Retrieve comprehensive drug information using a product NDC code in XXXXX-XXXX format. This tool finds all package variations for a specific pharmaceutical product from the OpenFDA database.

Instructions

Get drug information by product NDC only (XXXXX-XXXX format). This ignores package variations and finds all packages for a product.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
productNDCYesProduct NDC in format XXXXX-XXXX

Implementation Reference

  • The core handler function that implements the 'get-drug-by-product-ndc' tool logic. Validates the product NDC format, constructs OpenFDA API query for exact product NDC match in drug labels, fetches data using makeOpenFDARequest, processes results to include all matching package NDCs, and returns formatted drug information including brand, generic, manufacturer, packages, etc.
    async ({ productNDC }) => { // Validate product NDC format if (!/^\d{5}-\d{4}$/.test(productNDC.trim())) { return { content: [{ type: "text", text: `Invalid product NDC format: "${productNDC}"\n\n✅ Required format: XXXXX-XXXX (e.g., 12345-1234)`, }], }; } const url = new OpenFDABuilder() .context("label") .search(`openfda.product_ndc:"${productNDC.trim()}"`) .limit(1) .build(); const { data: drugData, error } = await makeOpenFDARequest<OpenFDAResponse>(url); if (error) { return { content: [{ type: "text", text: `Failed to retrieve drug data for product NDC "${productNDC}": ${error.message}`, }], }; } if (!drugData || !drugData.results || drugData.results.length === 0) { return { content: [{ type: "text", text: `No drug found with product NDC "${productNDC}".`, }], }; } const drug = drugData.results[0]; // Get all packages for this product const allPackagesForProduct = drug.openfda.package_ndc?.filter(ndc => ndc.startsWith(productNDC.trim()) ) || []; const drugInfo = { product_ndc: productNDC, available_packages: allPackagesForProduct, brand_name: drug.openfda.brand_name || [], generic_name: drug.openfda.generic_name || [], manufacturer_name: drug.openfda.manufacturer_name || [], product_type: drug.openfda.product_type || [], route: drug.openfda.route || [], substance_name: drug.openfda.substance_name || [], active_ingredient: drug.active_ingredient || [], purpose: drug.purpose || [], dosage_and_administration: drug.dosage_and_administration || [] }; return { content: [{ type: "text", text: `✅ Product NDC "${productNDC}" found with ${allPackagesForProduct.length} package variation(s):\n\n${JSON.stringify(drugInfo, null, 2)}`, }], }; }
  • Zod input schema defining the 'productNDC' parameter as a string with description specifying the required XXXXX-XXXX format.
    { productNDC: z.string().describe("Product NDC in format XXXXX-XXXX") },
  • src/index.ts:477-548 (registration)
    MCP tool registration call that registers 'get-drug-by-product-ndc' with McpServer.tool, including name, description, input schema, and handler reference.
    server.tool( "get-drug-by-product-ndc", "Get drug information by product NDC only (XXXXX-XXXX format). This ignores package variations and finds all packages for a product.", { productNDC: z.string().describe("Product NDC in format XXXXX-XXXX") }, async ({ productNDC }) => { // Validate product NDC format if (!/^\d{5}-\d{4}$/.test(productNDC.trim())) { return { content: [{ type: "text", text: `Invalid product NDC format: "${productNDC}"\n\n✅ Required format: XXXXX-XXXX (e.g., 12345-1234)`, }], }; } const url = new OpenFDABuilder() .context("label") .search(`openfda.product_ndc:"${productNDC.trim()}"`) .limit(1) .build(); const { data: drugData, error } = await makeOpenFDARequest<OpenFDAResponse>(url); if (error) { return { content: [{ type: "text", text: `Failed to retrieve drug data for product NDC "${productNDC}": ${error.message}`, }], }; } if (!drugData || !drugData.results || drugData.results.length === 0) { return { content: [{ type: "text", text: `No drug found with product NDC "${productNDC}".`, }], }; } const drug = drugData.results[0]; // Get all packages for this product const allPackagesForProduct = drug.openfda.package_ndc?.filter(ndc => ndc.startsWith(productNDC.trim()) ) || []; const drugInfo = { product_ndc: productNDC, available_packages: allPackagesForProduct, brand_name: drug.openfda.brand_name || [], generic_name: drug.openfda.generic_name || [], manufacturer_name: drug.openfda.manufacturer_name || [], product_type: drug.openfda.product_type || [], route: drug.openfda.route || [], substance_name: drug.openfda.substance_name || [], active_ingredient: drug.active_ingredient || [], purpose: drug.purpose || [], dosage_and_administration: drug.dosage_and_administration || [] }; return { content: [{ type: "text", text: `✅ Product NDC "${productNDC}" found with ${allPackagesForProduct.length} package variation(s):\n\n${JSON.stringify(drugInfo, null, 2)}`, }], }; } );

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/ythalorossy/openfda'

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