openfda-mcp-server 1.2.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- package/dist/defineProperty-D36W847_.js +1 -0
- package/dist/handlers/bulk-data-handlers.d.ts +13 -13
- package/dist/handlers/bulk-data-handlers.js +1 -1
- package/dist/handlers/bulk-data-handlers.js.map +1 -1
- package/dist/handlers/device-handlers.d.ts +13 -13
- package/dist/handlers/device-handlers.js +1 -1
- package/dist/handlers/device-handlers.js.map +1 -1
- package/dist/handlers/drug-handlers.d.ts +17 -17
- package/dist/handlers/drug-handlers.js +1 -1
- package/dist/handlers/drug-handlers.js.map +1 -1
- package/dist/handlers/query.d.ts +21 -0
- package/dist/handlers/query.js +2 -0
- package/dist/handlers/query.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib.d.ts +6 -2
- package/dist/lib.js +1 -1
- package/dist/server.d.ts +9 -9
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/index.d.ts +35 -36
- package/dist/tools/index.js.map +1 -1
- package/dist/types/fda.d.ts +19 -23
- package/dist/utils/api-client.d.ts +27 -23
- package/dist/utils/api-client.js +1 -1
- package/dist/utils/api-client.js.map +1 -1
- package/dist/utils/bulk-data-client.d.ts +19 -13
- package/dist/utils/bulk-data-client.js +2 -3
- package/dist/utils/bulk-data-client.js.map +1 -1
- package/dist/utils/errors.d.ts +8 -0
- package/dist/utils/errors.js +2 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/fields.d.ts +11 -0
- package/dist/utils/fields.js +2 -0
- package/dist/utils/fields.js.map +1 -0
- package/dist/utils/logger.d.ts +8 -8
- package/dist/utils/logger.js +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/version-BNWZ_jnk.d.ts +7 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.js +2 -0
- package/dist/version.js.map +1 -0
- package/package.json +16 -12
- package/dist/defineProperty-BEGP2H1W.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drug-handlers.js","names":[],"sources":["../../src/handlers/drug-handlers.ts"],"sourcesContent":["/**\n * Drug Handlers\n * Query handlers for FDA drug-related endpoints\n */\n\nimport type {\n DrugAdverseEvent,\n DrugEnforcement,\n DrugLabel,\n DrugNDC,\n DrugsFDA,\n DrugShortage,\n FDAToolResponse,\n SearchParams,\n} from \"../types/fda.js\"\nimport { fdaAPIClient } from \"../utils/api-client.js\"\nimport { loggers } from \"../utils/logger.js\"\n\n// Helper to build date range query\nfunction buildDateQuery(field: string, dateFrom?: string, dateTo?: string): string | undefined {\n if (!dateFrom && !dateTo) return undefined\n\n // FDA date format is YYYYMMDD\n const from = dateFrom?.replace(/-/g, \"\") ?? \"*\"\n const to = dateTo?.replace(/-/g, \"\") ?? \"*\"\n\n return `${field}:[${from}+TO+${to}]`\n}\n\n// Helper to escape special characters in search terms\nfunction escapeSearchTerm(term: string): string {\n // Escape special characters that have meaning in FDA's search syntax\n return term.replace(/[+\\-&|!(){}[\\]^\"~*?:\\\\]/g, \"\\\\$&\").replace(/\\s+/g, \"+\")\n}\n\n// Helper to build a search query from multiple terms\nfunction buildSearchQuery(terms: Array<{ field: string; value?: string }>): string {\n const validTerms = terms.filter((t) => t.value !== undefined && t.value.trim() !== \"\")\n if (validTerms.length === 0) return \"\"\n\n return validTerms.map((t) => `${t.field}:\"${escapeSearchTerm(t.value!)}\"`).join(\"+AND+\")\n}\n\n// Format truncated text\nfunction truncateText(text: string | undefined, maxLength = 200): string | undefined {\n if (!text) return undefined\n return text.length > maxLength ? text.substring(0, maxLength) + \"...\" : text\n}\n\n// Drug Adverse Events Handler\nexport type DrugAdverseEventsParams = {\n safetyReportId?: string\n drugName?: string\n reaction?: string\n manufacturer?: string\n serious?: boolean\n dateFrom?: string\n dateTo?: string\n limit?: number\n skip?: number\n}\n\ntype FormattedDrugAdverseEvent = {\n reportId: string | undefined\n receiveDate: string | undefined\n serious: boolean\n drugs: Array<{\n name: string | undefined\n indication: string | undefined\n route: string | undefined\n }>\n reactions: Array<{\n reaction: string | undefined\n outcome: string | undefined\n }>\n patient: {\n age: string | undefined\n sex: string | undefined\n weight: string | undefined\n }\n}\n\nfunction formatDrugAdverseEvent(event: DrugAdverseEvent): FormattedDrugAdverseEvent {\n return {\n reportId: event.safetyreportid,\n receiveDate: event.receivedate,\n serious: event.serious === \"1\",\n drugs:\n event.patient?.drug?.slice(0, 3).map((d) => ({\n name: d.medicinalproduct ?? d.activesubstance?.activesubstancename,\n indication: d.drugindication,\n route: d.drugadministrationroute,\n })) ?? [],\n reactions:\n event.patient?.reaction?.slice(0, 3).map((r) => ({\n reaction: r.reactionmeddrapt,\n outcome: r.reactionoutcome,\n })) ?? [],\n patient: {\n age: event.patient?.patientonsetage\n ? `${event.patient.patientonsetage} ${event.patient.patientonsetageunit ?? \"\"}`\n : undefined,\n sex: event.patient?.patientsex === \"1\" ? \"Male\" : event.patient?.patientsex === \"2\" ? \"Female\" : undefined,\n weight: event.patient?.patientweight ? `${event.patient.patientweight} kg` : undefined,\n },\n }\n}\n\nexport async function handleSearchDrugAdverseEvents(\n params: DrugAdverseEventsParams,\n): Promise<FDAToolResponse<FormattedDrugAdverseEvent[]>> {\n loggers.tools(\"searchDrugAdverseEvents\", params)\n\n try {\n // If safetyReportId is provided, do a direct lookup\n if (params.safetyReportId) {\n const searchParams: SearchParams = {\n search: `safetyreportid:\"${escapeSearchTerm(params.safetyReportId)}\"`,\n limit: 1,\n }\n\n const response = await fdaAPIClient.searchDrugAdverseEvents(searchParams)\n const results = response.results ?? []\n\n return {\n success: true,\n data: results.map(formatDrugAdverseEvent),\n totalResults: response.meta?.results?.total,\n displayedResults: results.length,\n searchParams,\n apiUsage: fdaAPIClient.getRateLimitInfo(),\n }\n }\n\n const searchTerms: Array<{ field: string; value?: string }> = [\n { field: \"patient.drug.medicinalproduct\", value: params.drugName },\n { field: \"patient.reaction.reactionmeddrapt\", value: params.reaction },\n { field: \"patient.drug.openfda.manufacturer_name\", value: params.manufacturer },\n ]\n\n if (params.serious !== undefined) {\n searchTerms.push({ field: \"serious\", value: params.serious ? \"1\" : \"2\" })\n }\n\n const searchQuery = buildSearchQuery(searchTerms)\n const dateQuery = buildDateQuery(\"receivedate\", params.dateFrom, params.dateTo)\n const fullQuery = [searchQuery, dateQuery].filter(Boolean).join(\"+AND+\")\n\n const searchParams: SearchParams = {\n search: fullQuery || undefined,\n limit: params.limit,\n skip: params.skip,\n }\n\n const response = await fdaAPIClient.searchDrugAdverseEvents(searchParams)\n const results = response.results ?? []\n\n return {\n success: true,\n data: results.map(formatDrugAdverseEvent),\n totalResults: response.meta?.results?.total,\n displayedResults: results.length,\n searchParams,\n apiUsage: fdaAPIClient.getRateLimitInfo(),\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n }\n }\n}\n\n// Drug Labels Handler\nexport type DrugLabelsParams = {\n setId?: string\n drugName?: string\n indication?: string\n activeIngredient?: string\n route?: string\n hasBoxedWarning?: boolean\n sections?: string[]\n limit?: number\n skip?: number\n}\n\ntype FormattedDrugLabel = {\n setId: string | undefined\n brandName: string | undefined\n genericName: string | undefined\n manufacturer: string | undefined\n activeIngredients: string[]\n boxedWarning: string | undefined\n indications: string | undefined\n warnings: string | undefined\n contraindications: string | undefined\n adverseReactions: string | undefined\n drugInteractions: string | undefined\n dosageAndAdministration: string | undefined\n clinicalPharmacology: string | undefined\n mechanismOfAction: string | undefined\n pharmacokinetics: string | undefined\n overdosage: string | undefined\n description: string | undefined\n howSupplied: string | undefined\n storageAndHandling: string | undefined\n route: string[]\n}\n\nfunction formatDrugLabel(label: DrugLabel, sections?: string[]): FormattedDrugLabel {\n // Helper to conditionally include section based on sections filter\n const includeSection = (sectionName: string) => !sections || sections.includes(sectionName)\n\n return {\n setId: label.set_id,\n brandName: label.openfda?.brand_name?.[0],\n genericName: label.openfda?.generic_name?.[0],\n manufacturer: label.openfda?.manufacturer_name?.[0],\n activeIngredients: label.openfda?.substance_name?.slice(0, 5) ?? [],\n boxedWarning: includeSection(\"boxed_warning\") ? truncateText(label.boxed_warning?.[0], 500) : undefined,\n indications: includeSection(\"indications_and_usage\") ? truncateText(label.indications_and_usage?.[0]) : undefined,\n warnings: includeSection(\"warnings\") ? truncateText(label.warnings?.[0]) : undefined,\n contraindications: includeSection(\"contraindications\") ? truncateText(label.contraindications?.[0]) : undefined,\n adverseReactions: includeSection(\"adverse_reactions\") ? truncateText(label.adverse_reactions?.[0]) : undefined,\n drugInteractions: includeSection(\"drug_interactions\") ? truncateText(label.drug_interactions?.[0]) : undefined,\n dosageAndAdministration: includeSection(\"dosage_and_administration\")\n ? truncateText(label.dosage_and_administration?.[0])\n : undefined,\n clinicalPharmacology: includeSection(\"clinical_pharmacology\")\n ? truncateText(label.clinical_pharmacology?.[0])\n : undefined,\n mechanismOfAction: includeSection(\"mechanism_of_action\") ? truncateText(label.mechanism_of_action?.[0]) : undefined,\n pharmacokinetics: includeSection(\"pharmacokinetics\") ? truncateText(label.pharmacokinetics?.[0]) : undefined,\n overdosage: includeSection(\"overdosage\") ? truncateText(label.overdosage?.[0]) : undefined,\n description: includeSection(\"description\") ? truncateText(label.description?.[0]) : undefined,\n howSupplied: includeSection(\"how_supplied\") ? truncateText(label.how_supplied?.[0]) : undefined,\n storageAndHandling: includeSection(\"storage_and_handling\")\n ? truncateText(label.storage_and_handling?.[0])\n : undefined,\n route: label.openfda?.route?.slice(0, 3) ?? [],\n }\n}\n\nexport async function handleSearchDrugLabels(params: DrugLabelsParams): Promise<FDAToolResponse<FormattedDrugLabel[]>> {\n loggers.tools(\"searchDrugLabels\", params)\n\n try {\n // If setId is provided, do a direct lookup\n if (params.setId) {\n const searchParams: SearchParams = {\n search: `set_id:\"${escapeSearchTerm(params.setId)}\"`,\n limit: 1,\n }\n\n const response = await fdaAPIClient.searchDrugLabels(searchParams)\n const results = response.results ?? []\n\n return {\n success: true,\n data: results.map((label) => formatDrugLabel(label, params.sections)),\n totalResults: response.meta?.results?.total,\n displayedResults: results.length,\n searchParams,\n apiUsage: fdaAPIClient.getRateLimitInfo(),\n }\n }\n\n const searchTerms: Array<{ field: string; value?: string }> = [\n { field: \"openfda.brand_name\", value: params.drugName },\n { field: \"indications_and_usage\", value: params.indication },\n { field: \"openfda.substance_name\", value: params.activeIngredient },\n { field: \"openfda.route\", value: params.route },\n ]\n\n const searchQuery = buildSearchQuery(searchTerms)\n\n // Build boxed warning existence query\n const boxedWarningQuery = params.hasBoxedWarning ? \"_exists_:boxed_warning\" : undefined\n\n const fullQuery = [searchQuery, boxedWarningQuery].filter(Boolean).join(\"+AND+\")\n\n const searchParams: SearchParams = {\n search: fullQuery || undefined,\n limit: params.limit,\n skip: params.skip,\n }\n\n const response = await fdaAPIClient.searchDrugLabels(searchParams)\n const results = response.results ?? []\n\n return {\n success: true,\n data: results.map((label) => formatDrugLabel(label, params.sections)),\n totalResults: response.meta?.results?.total,\n displayedResults: results.length,\n searchParams,\n apiUsage: fdaAPIClient.getRateLimitInfo(),\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n }\n }\n}\n\n// Drug NDC Handler\nexport type DrugNDCParams = {\n productNdc?: string\n brandName?: string\n genericName?: string\n labelerName?: string\n dosageForm?: string\n route?: string\n limit?: number\n skip?: number\n}\n\ntype FormattedDrugNDC = {\n productNdc: string | undefined\n brandName: string | undefined\n genericName: string | undefined\n labelerName: string | undefined\n dosageForm: string | undefined\n route: string[]\n activeIngredients: Array<{ name: string | undefined; strength: string | undefined }>\n marketingStartDate: string | undefined\n productType: string | undefined\n}\n\nfunction formatDrugNDC(ndc: DrugNDC): FormattedDrugNDC {\n return {\n productNdc: ndc.product_ndc,\n brandName: ndc.brand_name,\n genericName: ndc.generic_name,\n labelerName: ndc.labeler_name,\n dosageForm: ndc.dosage_form,\n route: ndc.route ?? [],\n activeIngredients:\n ndc.active_ingredients?.slice(0, 3).map((ai) => ({\n name: ai.name,\n strength: ai.strength,\n })) ?? [],\n marketingStartDate: ndc.marketing_start_date,\n productType: ndc.product_type,\n }\n}\n\nexport async function handleSearchDrugNDC(params: DrugNDCParams): Promise<FDAToolResponse<FormattedDrugNDC[]>> {\n loggers.tools(\"searchDrugNDC\", params)\n\n try {\n const searchTerms: Array<{ field: string; value?: string }> = [\n { field: \"product_ndc\", value: params.productNdc },\n { field: \"brand_name\", value: params.brandName },\n { field: \"generic_name\", value: params.genericName },\n { field: \"labeler_name\", value: params.labelerName },\n { field: \"dosage_form\", value: params.dosageForm },\n { field: \"route\", value: params.route },\n ]\n\n const searchQuery = buildSearchQuery(searchTerms)\n\n const searchParams: SearchParams = {\n search: searchQuery || undefined,\n limit: params.limit,\n skip: params.skip,\n }\n\n const response = await fdaAPIClient.searchDrugNDC(searchParams)\n const results = response.results ?? []\n\n return {\n success: true,\n data: results.map(formatDrugNDC),\n totalResults: response.meta?.results?.total,\n displayedResults: results.length,\n searchParams,\n apiUsage: fdaAPIClient.getRateLimitInfo(),\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n }\n }\n}\n\n// Drug Enforcement (Recalls) Handler\nexport type DrugEnforcementParams = {\n recallingFirm?: string\n classification?: \"Class I\" | \"Class II\" | \"Class III\"\n status?: \"Ongoing\" | \"Completed\" | \"Terminated\" | \"Pending\"\n state?: string\n dateFrom?: string\n dateTo?: string\n limit?: number\n skip?: number\n}\n\ntype FormattedDrugEnforcement = {\n recallNumber: string | undefined\n recallingFirm: string | undefined\n classification: string | undefined\n status: string | undefined\n productDescription: string | undefined\n reasonForRecall: string | undefined\n recallInitiationDate: string | undefined\n distributionPattern: string | undefined\n city: string | undefined\n state: string | undefined\n}\n\nfunction formatDrugEnforcement(recall: DrugEnforcement): FormattedDrugEnforcement {\n return {\n recallNumber: recall.recall_number,\n recallingFirm: recall.recalling_firm,\n classification: recall.classification,\n status: recall.status,\n productDescription: truncateText(recall.product_description),\n reasonForRecall: truncateText(recall.reason_for_recall),\n recallInitiationDate: recall.recall_initiation_date,\n distributionPattern: truncateText(recall.distribution_pattern),\n city: recall.city,\n state: recall.state,\n }\n}\n\nexport async function handleSearchDrugEnforcement(\n params: DrugEnforcementParams,\n): Promise<FDAToolResponse<FormattedDrugEnforcement[]>> {\n loggers.tools(\"searchDrugEnforcement\", params)\n\n try {\n const searchTerms: Array<{ field: string; value?: string }> = [\n { field: \"recalling_firm\", value: params.recallingFirm },\n { field: \"classification\", value: params.classification },\n { field: \"status\", value: params.status },\n { field: \"state\", value: params.state },\n ]\n\n const searchQuery = buildSearchQuery(searchTerms)\n const dateQuery = buildDateQuery(\"recall_initiation_date\", params.dateFrom, params.dateTo)\n const fullQuery = [searchQuery, dateQuery].filter(Boolean).join(\"+AND+\")\n\n const searchParams: SearchParams = {\n search: fullQuery || undefined,\n limit: params.limit,\n skip: params.skip,\n }\n\n const response = await fdaAPIClient.searchDrugEnforcement(searchParams)\n const results = response.results ?? []\n\n return {\n success: true,\n data: results.map(formatDrugEnforcement),\n totalResults: response.meta?.results?.total,\n displayedResults: results.length,\n searchParams,\n apiUsage: fdaAPIClient.getRateLimitInfo(),\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n }\n }\n}\n\n// Drugs@FDA Handler\nexport type DrugsFDAParams = {\n sponsorName?: string\n applicationNumber?: string\n brandName?: string\n marketingStatus?: string\n limit?: number\n skip?: number\n}\n\ntype FormattedDrugsFDA = {\n applicationNumber: string | undefined\n sponsorName: string | undefined\n products: Array<{\n brandName: string | undefined\n dosageForm: string | undefined\n route: string | undefined\n marketingStatus: string | undefined\n activeIngredients: Array<{ name: string | undefined; strength: string | undefined }>\n }>\n latestSubmission:\n | {\n type: string | undefined\n status: string | undefined\n statusDate: string | undefined\n }\n | undefined\n}\n\nfunction formatDrugsFDA(drug: DrugsFDA): FormattedDrugsFDA {\n const latestSubmission = drug.submissions?.[0]\n\n return {\n applicationNumber: drug.application_number,\n sponsorName: drug.sponsor_name,\n products:\n drug.products?.slice(0, 3).map((p) => ({\n brandName: p.brand_name,\n dosageForm: p.dosage_form,\n route: p.route,\n marketingStatus: p.marketing_status,\n activeIngredients:\n p.active_ingredients?.slice(0, 3).map((ai) => ({\n name: ai.name,\n strength: ai.strength,\n })) ?? [],\n })) ?? [],\n latestSubmission: latestSubmission\n ? {\n type: latestSubmission.submission_type,\n status: latestSubmission.submission_status,\n statusDate: latestSubmission.submission_status_date,\n }\n : undefined,\n }\n}\n\nexport async function handleSearchDrugsFDA(params: DrugsFDAParams): Promise<FDAToolResponse<FormattedDrugsFDA[]>> {\n loggers.tools(\"searchDrugsFDA\", params)\n\n try {\n const searchTerms: Array<{ field: string; value?: string }> = [\n { field: \"sponsor_name\", value: params.sponsorName },\n { field: \"application_number\", value: params.applicationNumber },\n { field: \"products.brand_name\", value: params.brandName },\n { field: \"products.marketing_status\", value: params.marketingStatus },\n ]\n\n const searchQuery = buildSearchQuery(searchTerms)\n\n const searchParams: SearchParams = {\n search: searchQuery || undefined,\n limit: params.limit,\n skip: params.skip,\n }\n\n const response = await fdaAPIClient.searchDrugsFDA(searchParams)\n const results = response.results ?? []\n\n return {\n success: true,\n data: results.map(formatDrugsFDA),\n totalResults: response.meta?.results?.total,\n displayedResults: results.length,\n searchParams,\n apiUsage: fdaAPIClient.getRateLimitInfo(),\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n }\n }\n}\n\n// Drug Shortages Handler\nexport type DrugShortagesParams = {\n genericName?: string\n status?: \"Current\" | \"Resolved\"\n limit?: number\n skip?: number\n}\n\ntype FormattedDrugShortage = {\n genericName: string | undefined\n proprietaryName: string | undefined\n status: string | undefined\n description: string | undefined\n initialPostingDate: string | undefined\n resolvedShortageDate: string | undefined\n}\n\nfunction formatDrugShortage(shortage: DrugShortage): FormattedDrugShortage {\n return {\n genericName: shortage.generic_name,\n proprietaryName: shortage.proprietary_name,\n status: shortage.status,\n description: truncateText(shortage.description),\n initialPostingDate: shortage.initial_posting_date,\n resolvedShortageDate: shortage.resolved_shortage_date,\n }\n}\n\nexport async function handleSearchDrugShortages(\n params: DrugShortagesParams,\n): Promise<FDAToolResponse<FormattedDrugShortage[]>> {\n loggers.tools(\"searchDrugShortages\", params)\n\n try {\n const searchTerms: Array<{ field: string; value?: string }> = [\n { field: \"generic_name\", value: params.genericName },\n { field: \"status\", value: params.status },\n ]\n\n const searchQuery = buildSearchQuery(searchTerms)\n\n const searchParams: SearchParams = {\n search: searchQuery || undefined,\n limit: params.limit,\n skip: params.skip,\n }\n\n const response = await fdaAPIClient.searchDrugShortages(searchParams)\n const results = response.results ?? []\n\n return {\n success: true,\n data: results.map(formatDrugShortage),\n totalResults: response.meta?.results?.total,\n displayedResults: results.length,\n searchParams,\n apiUsage: fdaAPIClient.getRateLimitInfo(),\n }\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n }\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"drug-handlers.js","names":["formatDrugAdverseEvent","event","d","r","handleSearchDrugAdverseEvents","loggers","params","searchParams","escapeSearchTerm","toSearchResponse","fdaAPIClient","searchTerms","searchQuery","buildSearchQuery","dateQuery","buildDateQuery","joinQueries","formatDrugLabel","includeSection","sections","sectionName","label","truncateText","handleSearchDrugLabels","boxedWarningQuery","Some","None","formatDrugNDC","ndc","ai","handleSearchDrugNDC","formatDrugEnforcement","recall","handleSearchDrugEnforcement","formatDrugsFDA","latestSubmission","drug","p","handleSearchDrugsFDA","formatDrugShortage","shortage","handleSearchDrugShortages"],"sources":["../../src/handlers/drug-handlers.ts"],"sourcesContent":["/**\n * Drug Handlers\n * Query handlers for FDA drug-related endpoints\n */\n\nimport { None, Some } from \"functype\"\n\nimport type {\n DrugAdverseEvent,\n DrugEnforcement,\n DrugLabel,\n DrugNDC,\n DrugsFDA,\n DrugShortage,\n FDAToolResponse,\n SearchParams,\n} from \"../types/fda.js\"\nimport { fdaAPIClient } from \"../utils/api-client.js\"\nimport { loggers } from \"../utils/logger.js\"\nimport {\n buildDateQuery,\n buildSearchQuery,\n escapeSearchTerm,\n joinQueries,\n toSearchResponse,\n truncateText,\n} from \"./query.js\"\n\n// Drug Adverse Events Handler\nexport type DrugAdverseEventsParams = {\n safetyReportId?: string\n drugName?: string\n reaction?: string\n manufacturer?: string\n serious?: boolean\n dateFrom?: string\n dateTo?: string\n limit?: number\n skip?: number\n}\n\ntype FormattedDrugAdverseEvent = {\n reportId: string | undefined\n receiveDate: string | undefined\n serious: boolean\n drugs: Array<{\n name: string | undefined\n indication: string | undefined\n route: string | undefined\n }>\n reactions: Array<{\n reaction: string | undefined\n outcome: string | undefined\n }>\n patient: {\n age: string | undefined\n sex: string | undefined\n weight: string | undefined\n }\n}\n\nfunction formatDrugAdverseEvent(event: DrugAdverseEvent): FormattedDrugAdverseEvent {\n return {\n reportId: event.safetyreportid,\n receiveDate: event.receivedate,\n serious: event.serious === \"1\",\n drugs:\n event.patient?.drug?.slice(0, 3).map((d) => ({\n name: d.medicinalproduct ?? d.activesubstance?.activesubstancename,\n indication: d.drugindication,\n route: d.drugadministrationroute,\n })) ?? [],\n reactions:\n event.patient?.reaction?.slice(0, 3).map((r) => ({\n reaction: r.reactionmeddrapt,\n outcome: r.reactionoutcome,\n })) ?? [],\n patient: {\n age: event.patient?.patientonsetage\n ? `${event.patient.patientonsetage} ${event.patient.patientonsetageunit ?? \"\"}`\n : undefined,\n sex: event.patient?.patientsex === \"1\" ? \"Male\" : event.patient?.patientsex === \"2\" ? \"Female\" : undefined,\n weight: event.patient?.patientweight ? `${event.patient.patientweight} kg` : undefined,\n },\n }\n}\n\nexport async function handleSearchDrugAdverseEvents(\n params: DrugAdverseEventsParams,\n): Promise<FDAToolResponse<FormattedDrugAdverseEvent[]>> {\n loggers.tools(\"searchDrugAdverseEvents\", params)\n\n // If safetyReportId is provided, do a direct lookup\n if (params.safetyReportId) {\n const searchParams: SearchParams = {\n search: `safetyreportid:\"${escapeSearchTerm(params.safetyReportId)}\"`,\n limit: 1,\n }\n\n return toSearchResponse(\n await fdaAPIClient.searchDrugAdverseEvents(searchParams),\n searchParams,\n formatDrugAdverseEvent,\n )\n }\n\n const searchTerms: Array<{ field: string; value?: string }> = [\n { field: \"patient.drug.medicinalproduct\", value: params.drugName },\n { field: \"patient.reaction.reactionmeddrapt\", value: params.reaction },\n { field: \"patient.drug.openfda.manufacturer_name\", value: params.manufacturer },\n ]\n\n if (params.serious !== undefined) {\n searchTerms.push({ field: \"serious\", value: params.serious ? \"1\" : \"2\" })\n }\n\n const searchQuery = buildSearchQuery(searchTerms)\n const dateQuery = buildDateQuery(\"receivedate\", params.dateFrom, params.dateTo)\n const fullQuery = joinQueries(searchQuery, dateQuery)\n\n const searchParams: SearchParams = {\n search: fullQuery || undefined,\n limit: params.limit,\n skip: params.skip,\n }\n\n return toSearchResponse(\n await fdaAPIClient.searchDrugAdverseEvents(searchParams),\n searchParams,\n formatDrugAdverseEvent,\n )\n}\n\n// Drug Labels Handler\nexport type DrugLabelsParams = {\n setId?: string\n drugName?: string\n indication?: string\n activeIngredient?: string\n route?: string\n hasBoxedWarning?: boolean\n sections?: string[]\n limit?: number\n skip?: number\n}\n\ntype FormattedDrugLabel = {\n setId: string | undefined\n brandName: string | undefined\n genericName: string | undefined\n manufacturer: string | undefined\n activeIngredients: string[]\n boxedWarning: string | undefined\n indications: string | undefined\n warnings: string | undefined\n contraindications: string | undefined\n adverseReactions: string | undefined\n drugInteractions: string | undefined\n dosageAndAdministration: string | undefined\n clinicalPharmacology: string | undefined\n mechanismOfAction: string | undefined\n pharmacokinetics: string | undefined\n overdosage: string | undefined\n description: string | undefined\n howSupplied: string | undefined\n storageAndHandling: string | undefined\n route: string[]\n}\n\nfunction formatDrugLabel(label: DrugLabel, sections?: string[]): FormattedDrugLabel {\n // Helper to conditionally include section based on sections filter\n const includeSection = (sectionName: string) => !sections || sections.includes(sectionName)\n\n return {\n setId: label.set_id,\n brandName: label.openfda?.brand_name?.[0],\n genericName: label.openfda?.generic_name?.[0],\n manufacturer: label.openfda?.manufacturer_name?.[0],\n activeIngredients: label.openfda?.substance_name?.slice(0, 5) ?? [],\n boxedWarning: includeSection(\"boxed_warning\")\n ? truncateText(label.boxed_warning?.[0], 500).orUndefined()\n : undefined,\n indications: includeSection(\"indications_and_usage\")\n ? truncateText(label.indications_and_usage?.[0]).orUndefined()\n : undefined,\n warnings: includeSection(\"warnings\") ? truncateText(label.warnings?.[0]).orUndefined() : undefined,\n contraindications: includeSection(\"contraindications\")\n ? truncateText(label.contraindications?.[0]).orUndefined()\n : undefined,\n adverseReactions: includeSection(\"adverse_reactions\")\n ? truncateText(label.adverse_reactions?.[0]).orUndefined()\n : undefined,\n drugInteractions: includeSection(\"drug_interactions\")\n ? truncateText(label.drug_interactions?.[0]).orUndefined()\n : undefined,\n dosageAndAdministration: includeSection(\"dosage_and_administration\")\n ? truncateText(label.dosage_and_administration?.[0]).orUndefined()\n : undefined,\n clinicalPharmacology: includeSection(\"clinical_pharmacology\")\n ? truncateText(label.clinical_pharmacology?.[0]).orUndefined()\n : undefined,\n mechanismOfAction: includeSection(\"mechanism_of_action\")\n ? truncateText(label.mechanism_of_action?.[0]).orUndefined()\n : undefined,\n pharmacokinetics: includeSection(\"pharmacokinetics\")\n ? truncateText(label.pharmacokinetics?.[0]).orUndefined()\n : undefined,\n overdosage: includeSection(\"overdosage\") ? truncateText(label.overdosage?.[0]).orUndefined() : undefined,\n description: includeSection(\"description\") ? truncateText(label.description?.[0]).orUndefined() : undefined,\n howSupplied: includeSection(\"how_supplied\") ? truncateText(label.how_supplied?.[0]).orUndefined() : undefined,\n storageAndHandling: includeSection(\"storage_and_handling\")\n ? truncateText(label.storage_and_handling?.[0]).orUndefined()\n : undefined,\n route: label.openfda?.route?.slice(0, 3) ?? [],\n }\n}\n\nexport async function handleSearchDrugLabels(params: DrugLabelsParams): Promise<FDAToolResponse<FormattedDrugLabel[]>> {\n loggers.tools(\"searchDrugLabels\", params)\n\n // If setId is provided, do a direct lookup\n if (params.setId) {\n const searchParams: SearchParams = {\n search: `set_id:\"${escapeSearchTerm(params.setId)}\"`,\n limit: 1,\n }\n\n return toSearchResponse(await fdaAPIClient.searchDrugLabels(searchParams), searchParams, (label) =>\n formatDrugLabel(label, params.sections),\n )\n }\n\n const searchTerms: Array<{ field: string; value?: string }> = [\n { field: \"openfda.brand_name\", value: params.drugName },\n { field: \"indications_and_usage\", value: params.indication },\n { field: \"openfda.substance_name\", value: params.activeIngredient },\n { field: \"openfda.route\", value: params.route },\n ]\n\n const searchQuery = buildSearchQuery(searchTerms)\n\n // Build boxed warning existence query\n const boxedWarningQuery = params.hasBoxedWarning ? Some(\"_exists_:boxed_warning\") : None<string>()\n\n const fullQuery = joinQueries(searchQuery, boxedWarningQuery)\n\n const searchParams: SearchParams = {\n search: fullQuery || undefined,\n limit: params.limit,\n skip: params.skip,\n }\n\n return toSearchResponse(await fdaAPIClient.searchDrugLabels(searchParams), searchParams, (label) =>\n formatDrugLabel(label, params.sections),\n )\n}\n\n// Drug NDC Handler\nexport type DrugNDCParams = {\n productNdc?: string\n brandName?: string\n genericName?: string\n labelerName?: string\n dosageForm?: string\n route?: string\n limit?: number\n skip?: number\n}\n\ntype FormattedDrugNDC = {\n productNdc: string | undefined\n brandName: string | undefined\n genericName: string | undefined\n labelerName: string | undefined\n dosageForm: string | undefined\n route: string[]\n activeIngredients: Array<{ name: string | undefined; strength: string | undefined }>\n marketingStartDate: string | undefined\n productType: string | undefined\n}\n\nfunction formatDrugNDC(ndc: DrugNDC): FormattedDrugNDC {\n return {\n productNdc: ndc.product_ndc,\n brandName: ndc.brand_name,\n genericName: ndc.generic_name,\n labelerName: ndc.labeler_name,\n dosageForm: ndc.dosage_form,\n route: ndc.route ?? [],\n activeIngredients:\n ndc.active_ingredients?.slice(0, 3).map((ai) => ({\n name: ai.name,\n strength: ai.strength,\n })) ?? [],\n marketingStartDate: ndc.marketing_start_date,\n productType: ndc.product_type,\n }\n}\n\nexport async function handleSearchDrugNDC(params: DrugNDCParams): Promise<FDAToolResponse<FormattedDrugNDC[]>> {\n loggers.tools(\"searchDrugNDC\", params)\n\n const searchTerms: Array<{ field: string; value?: string }> = [\n { field: \"product_ndc\", value: params.productNdc },\n { field: \"brand_name\", value: params.brandName },\n { field: \"generic_name\", value: params.genericName },\n { field: \"labeler_name\", value: params.labelerName },\n { field: \"dosage_form\", value: params.dosageForm },\n { field: \"route\", value: params.route },\n ]\n\n const searchQuery = buildSearchQuery(searchTerms)\n\n const searchParams: SearchParams = {\n search: searchQuery || undefined,\n limit: params.limit,\n skip: params.skip,\n }\n\n return toSearchResponse(await fdaAPIClient.searchDrugNDC(searchParams), searchParams, formatDrugNDC)\n}\n\n// Drug Enforcement (Recalls) Handler\nexport type DrugEnforcementParams = {\n recallingFirm?: string\n classification?: \"Class I\" | \"Class II\" | \"Class III\"\n status?: \"Ongoing\" | \"Completed\" | \"Terminated\" | \"Pending\"\n state?: string\n dateFrom?: string\n dateTo?: string\n limit?: number\n skip?: number\n}\n\ntype FormattedDrugEnforcement = {\n recallNumber: string | undefined\n recallingFirm: string | undefined\n classification: string | undefined\n status: string | undefined\n productDescription: string | undefined\n reasonForRecall: string | undefined\n recallInitiationDate: string | undefined\n distributionPattern: string | undefined\n city: string | undefined\n state: string | undefined\n}\n\nfunction formatDrugEnforcement(recall: DrugEnforcement): FormattedDrugEnforcement {\n return {\n recallNumber: recall.recall_number,\n recallingFirm: recall.recalling_firm,\n classification: recall.classification,\n status: recall.status,\n productDescription: truncateText(recall.product_description).orUndefined(),\n reasonForRecall: truncateText(recall.reason_for_recall).orUndefined(),\n recallInitiationDate: recall.recall_initiation_date,\n distributionPattern: truncateText(recall.distribution_pattern).orUndefined(),\n city: recall.city,\n state: recall.state,\n }\n}\n\nexport async function handleSearchDrugEnforcement(\n params: DrugEnforcementParams,\n): Promise<FDAToolResponse<FormattedDrugEnforcement[]>> {\n loggers.tools(\"searchDrugEnforcement\", params)\n\n const searchTerms: Array<{ field: string; value?: string }> = [\n { field: \"recalling_firm\", value: params.recallingFirm },\n { field: \"classification\", value: params.classification },\n { field: \"status\", value: params.status },\n { field: \"state\", value: params.state },\n ]\n\n const searchQuery = buildSearchQuery(searchTerms)\n const dateQuery = buildDateQuery(\"recall_initiation_date\", params.dateFrom, params.dateTo)\n const fullQuery = joinQueries(searchQuery, dateQuery)\n\n const searchParams: SearchParams = {\n search: fullQuery || undefined,\n limit: params.limit,\n skip: params.skip,\n }\n\n return toSearchResponse(await fdaAPIClient.searchDrugEnforcement(searchParams), searchParams, formatDrugEnforcement)\n}\n\n// Drugs@FDA Handler\nexport type DrugsFDAParams = {\n sponsorName?: string\n applicationNumber?: string\n brandName?: string\n marketingStatus?: string\n limit?: number\n skip?: number\n}\n\ntype FormattedDrugsFDA = {\n applicationNumber: string | undefined\n sponsorName: string | undefined\n products: Array<{\n brandName: string | undefined\n dosageForm: string | undefined\n route: string | undefined\n marketingStatus: string | undefined\n activeIngredients: Array<{ name: string | undefined; strength: string | undefined }>\n }>\n latestSubmission:\n | {\n type: string | undefined\n status: string | undefined\n statusDate: string | undefined\n }\n | undefined\n}\n\nfunction formatDrugsFDA(drug: DrugsFDA): FormattedDrugsFDA {\n const latestSubmission = drug.submissions?.[0]\n\n return {\n applicationNumber: drug.application_number,\n sponsorName: drug.sponsor_name,\n products:\n drug.products?.slice(0, 3).map((p) => ({\n brandName: p.brand_name,\n dosageForm: p.dosage_form,\n route: p.route,\n marketingStatus: p.marketing_status,\n activeIngredients:\n p.active_ingredients?.slice(0, 3).map((ai) => ({\n name: ai.name,\n strength: ai.strength,\n })) ?? [],\n })) ?? [],\n latestSubmission: latestSubmission\n ? {\n type: latestSubmission.submission_type,\n status: latestSubmission.submission_status,\n statusDate: latestSubmission.submission_status_date,\n }\n : undefined,\n }\n}\n\nexport async function handleSearchDrugsFDA(params: DrugsFDAParams): Promise<FDAToolResponse<FormattedDrugsFDA[]>> {\n loggers.tools(\"searchDrugsFDA\", params)\n\n const searchTerms: Array<{ field: string; value?: string }> = [\n { field: \"sponsor_name\", value: params.sponsorName },\n { field: \"application_number\", value: params.applicationNumber },\n { field: \"products.brand_name\", value: params.brandName },\n { field: \"products.marketing_status\", value: params.marketingStatus },\n ]\n\n const searchQuery = buildSearchQuery(searchTerms)\n\n const searchParams: SearchParams = {\n search: searchQuery || undefined,\n limit: params.limit,\n skip: params.skip,\n }\n\n return toSearchResponse(await fdaAPIClient.searchDrugsFDA(searchParams), searchParams, formatDrugsFDA)\n}\n\n// Drug Shortages Handler\nexport type DrugShortagesParams = {\n genericName?: string\n status?: \"Current\" | \"Resolved\"\n limit?: number\n skip?: number\n}\n\ntype FormattedDrugShortage = {\n genericName: string | undefined\n proprietaryName: string | undefined\n status: string | undefined\n description: string | undefined\n initialPostingDate: string | undefined\n resolvedShortageDate: string | undefined\n}\n\nfunction formatDrugShortage(shortage: DrugShortage): FormattedDrugShortage {\n return {\n genericName: shortage.generic_name,\n proprietaryName: shortage.proprietary_name,\n status: shortage.status,\n description: truncateText(shortage.description).orUndefined(),\n initialPostingDate: shortage.initial_posting_date,\n resolvedShortageDate: shortage.resolved_shortage_date,\n }\n}\n\nexport async function handleSearchDrugShortages(\n params: DrugShortagesParams,\n): Promise<FDAToolResponse<FormattedDrugShortage[]>> {\n loggers.tools(\"searchDrugShortages\", params)\n\n const searchTerms: Array<{ field: string; value?: string }> = [\n { field: \"generic_name\", value: params.genericName },\n { field: \"status\", value: params.status },\n ]\n\n const searchQuery = buildSearchQuery(searchTerms)\n\n const searchParams: SearchParams = {\n search: searchQuery || undefined,\n limit: params.limit,\n skip: params.skip,\n }\n\n return toSearchResponse(await fdaAPIClient.searchDrugShortages(searchParams), searchParams, formatDrugShortage)\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query building and response shaping shared by the openFDA API handlers
|
|
3
|
+
*/
|
|
4
|
+
import { FDAResponse, FDAToolResponse, SearchParams } from "../types/fda.js";
|
|
5
|
+
import { Either, Option } from "functype";
|
|
6
|
+
export type SearchTerm = {
|
|
7
|
+
field: string;
|
|
8
|
+
value?: string;
|
|
9
|
+
};
|
|
10
|
+
/** Escape characters that have meaning in openFDA's search syntax */
|
|
11
|
+
export declare function escapeSearchTerm(term: string): string;
|
|
12
|
+
/** AND together the terms that have a non-blank value */
|
|
13
|
+
export declare function buildSearchQuery(terms: readonly SearchTerm[]): string;
|
|
14
|
+
/** A date range clause, or None when neither bound is given. openFDA dates are YYYYMMDD. */
|
|
15
|
+
export declare function buildDateQuery(field: string, dateFrom?: string, dateTo?: string): Option<string>;
|
|
16
|
+
/** Join a search query with optional extra clauses, skipping empty parts */
|
|
17
|
+
export declare function joinQueries(searchQuery: string, ...clauses: readonly Option<string>[]): string;
|
|
18
|
+
/** Shorten long text for display; None for missing or empty text */
|
|
19
|
+
export declare function truncateText(text: string | undefined, maxLength?: number): Option<string>;
|
|
20
|
+
/** Turn a client result into the tool response, formatting each record */
|
|
21
|
+
export declare function toSearchResponse<R, F>(result: Either<Error, FDAResponse<R>>, searchParams: SearchParams, format: (record: R) => F): FDAToolResponse<F[]>;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{fdaAPIClient as e}from"../utils/api-client.js";import{failure as t}from"../utils/errors.js";import{None as n,Option as r,Some as i}from"functype";function a(e){return e.replace(/[+\-&|!(){}[\]^"~*?:\\]/g,`\\$&`).replace(/\s+/g,`+`)}function o(e){return e.flatMap(e=>r(e.value).filter(e=>e.trim()!==``).map(t=>`${e.field}:"${a(t)}"`).toArray()).join(`+AND+`)}function s(e,t,a){let o=e=>r(e).map(e=>e.replace(/-/g,``)).orElse(`*`);return[t,a].some(e=>(e??``)!==``)?i(`${e}:[${o(t)}+TO+${o(a)}]`):n()}function c(e,...t){return[e,...t.flatMap(e=>e.toArray())].filter(e=>e!==``).join(`+AND+`)}function l(e,t=200){return r(e).filter(e=>e!==``).map(e=>e.length>t?`${e.substring(0,t)}...`:e)}function u(n,r,i){return n.fold(t,t=>{let n=t.results??[];return{success:!0,data:n.map(i),totalResults:t.meta?.results?.total,displayedResults:n.length,searchParams:r,apiUsage:e.getRateLimitInfo()}})}export{s as buildDateQuery,o as buildSearchQuery,a as escapeSearchTerm,c as joinQueries,u as toSearchResponse,l as truncateText};
|
|
2
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","names":["escapeSearchTerm","term","buildSearchQuery","terms","Option","value","buildDateQuery","bound","date","d","dateFrom","dateTo","Some","field","None","joinQueries","clauses","searchQuery","clause","part","truncateText","text","t","maxLength","toSearchResponse","result","failure","results","response","format","fdaAPIClient"],"sources":["../../src/handlers/query.ts"],"sourcesContent":["/**\n * Query building and response shaping shared by the openFDA API handlers\n */\n\nimport type { Either } from \"functype\"\nimport { None, Option, Some } from \"functype\"\n\nimport type { FDAResponse, FDAToolResponse, SearchParams } from \"../types/fda.js\"\nimport { fdaAPIClient } from \"../utils/api-client.js\"\nimport { failure } from \"../utils/errors.js\"\n\nexport type SearchTerm = { field: string; value?: string }\n\n/** Escape characters that have meaning in openFDA's search syntax */\nexport function escapeSearchTerm(term: string): string {\n return term.replace(/[+\\-&|!(){}[\\]^\"~*?:\\\\]/g, \"\\\\$&\").replace(/\\s+/g, \"+\")\n}\n\n/** AND together the terms that have a non-blank value */\nexport function buildSearchQuery(terms: readonly SearchTerm[]): string {\n return terms\n .flatMap((term) =>\n Option(term.value)\n .filter((value) => value.trim() !== \"\")\n .map((value) => `${term.field}:\"${escapeSearchTerm(value)}\"`)\n .toArray(),\n )\n .join(\"+AND+\")\n}\n\n/** A date range clause, or None when neither bound is given. openFDA dates are YYYYMMDD. */\nexport function buildDateQuery(field: string, dateFrom?: string, dateTo?: string): Option<string> {\n const bound = (date?: string): string =>\n Option(date)\n .map((d) => d.replace(/-/g, \"\"))\n .orElse(\"*\")\n\n const hasBound = [dateFrom, dateTo].some((date) => (date ?? \"\") !== \"\")\n\n return hasBound ? Some(`${field}:[${bound(dateFrom)}+TO+${bound(dateTo)}]`) : None()\n}\n\n/** Join a search query with optional extra clauses, skipping empty parts */\nexport function joinQueries(searchQuery: string, ...clauses: readonly Option<string>[]): string {\n return [searchQuery, ...clauses.flatMap((clause) => clause.toArray())].filter((part) => part !== \"\").join(\"+AND+\")\n}\n\n/** Shorten long text for display; None for missing or empty text */\nexport function truncateText(text: string | undefined, maxLength = 200): Option<string> {\n return Option(text)\n .filter((t) => t !== \"\")\n .map((t) => (t.length > maxLength ? `${t.substring(0, maxLength)}...` : t))\n}\n\n/** Turn a client result into the tool response, formatting each record */\nexport function toSearchResponse<R, F>(\n result: Either<Error, FDAResponse<R>>,\n searchParams: SearchParams,\n format: (record: R) => F,\n): FDAToolResponse<F[]> {\n return result.fold(failure<F[]>, (response) => {\n const results = response.results ?? []\n return {\n success: true,\n data: results.map(format),\n totalResults: response.meta?.results?.total,\n displayedResults: results.length,\n searchParams,\n apiUsage: fdaAPIClient.getRateLimitInfo(),\n }\n })\n}\n"],"mappings":"A,yJAcA,SAAgBA,EAAiB,EAAsB,CACrD,OAAOC,EAAK,QAAQ,2BAA4B,MAAM,CAAC,CAAC,QAAQ,OAAQ,GAAG,CAC7E,CAGA,SAAgBC,EAAiB,EAAsC,CACrE,OAAOC,EACJ,QAAS,GACRC,EAAOH,EAAK,KAAK,CAAC,CACf,OAAQ,GAAUI,EAAM,KAAK,IAAM,EAAE,CAAC,CACtC,IAAK,GAAU,GAAGJ,EAAK,MAAM,IAAID,EAAiBK,CAAK,EAAE,EAAE,CAAC,CAC5D,QAAQ,CACb,CAAC,CACA,KAAK,OAAO,CACjB,CAGA,SAAgBC,EAAe,EAAe,EAAmB,EAAiC,CAChG,IAAMC,EAAS,GACbH,EAAOI,CAAI,CAAC,CACT,IAAK,GAAMC,EAAE,QAAQ,KAAM,EAAE,CAAC,CAAC,CAC/B,OAAO,GAAG,EAIf,MAFiB,CAACC,EAAUC,CAAM,CAAC,CAAC,KAAM,IAAUH,GAAQ,MAAQ,EAEtD,EAAII,EAAK,GAAGC,EAAM,IAAIN,EAAMG,CAAQ,EAAE,MAAMH,EAAMI,CAAM,EAAE,EAAE,EAAIG,EAAK,CACrF,CAGA,SAAgBC,EAAY,EAAqB,GAAGC,EAA4C,CAC9F,MAAO,CAACC,EAAa,GAAGD,EAAQ,QAAS,GAAWE,EAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAQ,GAASC,IAAS,EAAE,CAAC,CAAC,KAAK,OAAO,CACnH,CAGA,SAAgBC,EAAa,EAA0B,EAAY,IAAqB,CACtF,OAAOhB,EAAOiB,CAAI,CAAC,CAChB,OAAQ,GAAMC,IAAM,EAAE,CAAC,CACvB,IAAK,GAAOA,EAAE,OAASC,EAAY,GAAGD,EAAE,UAAU,EAAGC,CAAS,EAAE,KAAOD,CAAE,CAC9E,CAGA,SAAgBE,EACd,EACA,EACA,EACsB,CACtB,OAAOC,EAAO,KAAKC,EAAe,GAAa,CAC7C,IAAMC,EAAUC,EAAS,SAAW,CAAC,EACrC,MAAO,CACL,QAAS,GACT,KAAMD,EAAQ,IAAIE,CAAM,EACxB,aAAcD,EAAS,MAAM,SAAS,MACtC,iBAAkBD,EAAQ,OAC1B,eACA,SAAUG,EAAa,iBAAiB,CAC1C,CACF,CAAC,CACH,C"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export {}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import{
|
|
2
|
+
import{createOpenFDAServer as e}from"./server.js";import{loggers as t}from"./utils/logger.js";import{VERSION as n}from"./version.js";import{Command as r}from"commander";import{Try as i}from"functype";const a=new r;a.name(`openfda-mcp-server`).description(`MCP server for querying U.S. FDA public datasets`).version(n).option(`-t, --transport <type>`,`Transport type (stdio or http)`,`stdio`).option(`-p, --port <number>`,`Port for HTTP transport`,`3000`).option(`--host <host>`,`Host for HTTP transport`,`localhost`).action(async r=>{let{transport:a,port:o,host:s}=r;t.main(`Starting OpenFDA MCP server with transport: ${a}`);let c=e({name:`openfda-mcp-server`,version:n});(await i.async(()=>{if(a===`http`){let e=parseInt(o,10);return t.main(`Starting HTTP server on ${s}:${e}`),c.start({transportType:`httpStream`,httpStream:{endpoint:`/mcp`,port:e,host:s}}).then(()=>console.error(`OpenFDA MCP server running at http://${s}:${e}/mcp`))}return t.main(`Starting stdio server`),c.start({transportType:`stdio`})})).fold(e=>{console.error(`Failed to start server:`,e),process.exit(1)},()=>void 0)}),a.parse();export{};
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * OpenFDA MCP Server CLI\n * Command-line interface for starting the MCP server\n */\n\nimport { Command } from \"commander\"\n\nimport { createOpenFDAServer } from \"./server.js\"\nimport { loggers } from \"./utils/logger.js\"\n\nconst program = new Command()\n\nprogram\n .name(\"openfda-mcp-server\")\n .description(\"MCP server for querying U.S. FDA public datasets\")\n .version(
|
|
1
|
+
{"version":3,"file":"index.js","names":["program","Command","VERSION","options","loggers","transport","server","createOpenFDAServer","Try","portNum","port","host","error"],"sources":["../src/index.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * OpenFDA MCP Server CLI\n * Command-line interface for starting the MCP server\n */\n\nimport { Command } from \"commander\"\nimport { Try } from \"functype\"\n\nimport { createOpenFDAServer } from \"./server.js\"\nimport { loggers } from \"./utils/logger.js\"\nimport { VERSION } from \"./version.js\"\n\nconst program = new Command()\n\nprogram\n .name(\"openfda-mcp-server\")\n .description(\"MCP server for querying U.S. FDA public datasets\")\n .version(VERSION)\n .option(\"-t, --transport <type>\", \"Transport type (stdio or http)\", \"stdio\")\n .option(\"-p, --port <number>\", \"Port for HTTP transport\", \"3000\")\n .option(\"--host <host>\", \"Host for HTTP transport\", \"localhost\")\n .action(async (options) => {\n const { transport, port, host } = options\n\n loggers.main(`Starting OpenFDA MCP server with transport: ${transport}`)\n\n const server = createOpenFDAServer({ name: \"openfda-mcp-server\", version: VERSION })\n\n const start = (): Promise<void> => {\n if (transport === \"http\") {\n const portNum = parseInt(port, 10)\n loggers.main(`Starting HTTP server on ${host}:${portNum}`)\n return server\n .start({\n transportType: \"httpStream\",\n httpStream: {\n endpoint: \"/mcp\" as `/${string}`,\n port: portNum,\n host,\n },\n })\n .then(() => console.error(`OpenFDA MCP server running at http://${host}:${portNum}/mcp`))\n }\n loggers.main(\"Starting stdio server\")\n return server.start({ transportType: \"stdio\" })\n }\n\n const started = await Try.async(start)\n started.fold(\n (error) => {\n console.error(\"Failed to start server:\", error)\n process.exit(1)\n },\n () => undefined,\n )\n })\n\nprogram.parse()\n"],"mappings":";A,wMAaA,MAAMA,EAAU,IAAIC,EAEpBD,EACG,KAAK,oBAAoB,CAAC,CAC1B,YAAY,kDAAkD,CAAC,CAC/D,QAAQE,CAAO,CAAC,CAChB,OAAO,yBAA0B,iCAAkC,OAAO,CAAC,CAC3E,OAAO,sBAAuB,0BAA2B,MAAM,CAAC,CAChE,OAAO,gBAAiB,0BAA2B,WAAW,CAAC,CAC/D,OAAO,KAAO,IAAY,CACzB,GAAM,CAAE,YAAW,OAAM,QAASC,EAElCC,EAAQ,KAAK,+CAA+CC,GAAW,EAEvE,IAAMC,EAASC,EAAoB,CAAE,KAAM,qBAAsB,QAASL,CAAQ,CAAC,GAsBnF,MADsBM,EAAI,UAnBS,CACjC,GAAIH,IAAc,OAAQ,CACxB,IAAMI,EAAU,SAASC,EAAM,EAAE,EAEjC,OADAN,EAAQ,KAAK,2BAA2BO,EAAK,GAAGF,GAAS,EAClDH,EACJ,MAAM,CACL,cAAe,aACf,WAAY,CACV,SAAU,OACV,KAAMG,EACN,MACF,CACF,CAAC,CAAC,CACD,SAAW,QAAQ,MAAM,wCAAwCE,EAAK,GAAGF,EAAQ,KAAK,CAAC,CAC5F,CAEA,OADAL,EAAQ,KAAK,uBAAuB,EAC7BE,EAAO,MAAM,CAAE,cAAe,OAAQ,CAAC,CAChD,CAEqC,EAAA,CAC7B,KACL,GAAU,CACT,QAAQ,MAAM,0BAA2BM,CAAK,EAC9C,QAAQ,KAAK,CAAC,CAChB,MACM,IAAA,EACR,CACF,CAAC,EAEHZ,EAAQ,MAAM,E"}
|
package/dist/lib.d.ts
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* OpenFDA MCP Server Library Exports
|
|
3
|
+
* For programmatic use and extension
|
|
4
|
+
*/
|
|
5
|
+
import { ServerOptions, createOpenFDAServer } from "./server.js";
|
|
2
6
|
import { DrugPatentExpiryParams, OrangeBookPatentsParams, OrangeBookSearchParams, PurpleBookSearchParams, handleSearchDrugPatentExpiry, handleSearchOrangeBook, handleSearchOrangeBookPatents, handleSearchPurpleBook } from "./handlers/bulk-data-handlers.js";
|
|
3
7
|
import { Device510KParams, DeviceAdverseEventsParams, DeviceClassificationParams, DeviceEnforcementParams, handleSearchDevice510K, handleSearchDeviceAdverseEvents, handleSearchDeviceClassifications, handleSearchDeviceEnforcement } from "./handlers/device-handlers.js";
|
|
4
8
|
import { DrugAdverseEventsParams, DrugEnforcementParams, DrugLabelsParams, DrugNDCParams, DrugShortagesParams, DrugsFDAParams, handleSearchDrugAdverseEvents, handleSearchDrugEnforcement, handleSearchDrugLabels, handleSearchDrugNDC, handleSearchDrugShortages, handleSearchDrugsFDA } from "./handlers/drug-handlers.js";
|
|
5
|
-
import { ServerOptions, createOpenFDAServer } from "./server.js";
|
|
6
9
|
import { toolSchemas } from "./tools/index.js";
|
|
7
10
|
import { FDAAPIClient, fdaAPIClient } from "./utils/api-client.js";
|
|
8
11
|
import { BulkDataClient, bulkDataClient } from "./utils/bulk-data-client.js";
|
|
12
|
+
import { Device510K, DeviceAdverseEvent, DeviceClassification, DeviceEnforcement, DrugAdverseEvent, DrugEnforcement, DrugLabel, DrugNDC, DrugShortage, DrugsFDA, FDAResponse, FDAToolResponse, OpenFDAFields, OrangeBookExclusivity, OrangeBookPatent, OrangeBookProduct, PurpleBookEntry, SearchParams } from "./types/fda.js";
|
|
9
13
|
import { loggers } from "./utils/logger.js";
|
|
10
14
|
export { BulkDataClient, type Device510K, type Device510KParams, type DeviceAdverseEvent, type DeviceAdverseEventsParams, type DeviceClassification, type DeviceClassificationParams, type DeviceEnforcement, type DeviceEnforcementParams, type DrugAdverseEvent, type DrugAdverseEventsParams, type DrugEnforcement, type DrugEnforcementParams, type DrugLabel, type DrugLabelsParams, type DrugNDC, type DrugNDCParams, type DrugPatentExpiryParams, type DrugShortage, type DrugShortagesParams, type DrugsFDA, type DrugsFDAParams, FDAAPIClient, type FDAResponse, type FDAToolResponse, type OpenFDAFields, type OrangeBookExclusivity, type OrangeBookPatent, type OrangeBookPatentsParams, type OrangeBookProduct, type OrangeBookSearchParams, type PurpleBookEntry, type PurpleBookSearchParams, type SearchParams, type ServerOptions, bulkDataClient, createOpenFDAServer, fdaAPIClient, handleSearchDevice510K, handleSearchDeviceAdverseEvents, handleSearchDeviceClassifications, handleSearchDeviceEnforcement, handleSearchDrugAdverseEvents, handleSearchDrugEnforcement, handleSearchDrugLabels, handleSearchDrugNDC, handleSearchDrugPatentExpiry, handleSearchDrugShortages, handleSearchDrugsFDA, handleSearchOrangeBook, handleSearchOrangeBookPatents, handleSearchPurpleBook, loggers, toolSchemas };
|
package/dist/lib.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{createOpenFDAServer as e}from"./server.js";import{handleSearchDrugPatentExpiry as t,handleSearchOrangeBook as n,handleSearchOrangeBookPatents as r,handleSearchPurpleBook as i}from"./handlers/bulk-data-handlers.js";import{handleSearchDevice510K as a,handleSearchDeviceAdverseEvents as o,handleSearchDeviceClassifications as s,handleSearchDeviceEnforcement as c}from"./handlers/device-handlers.js";import{handleSearchDrugAdverseEvents as l,handleSearchDrugEnforcement as u,handleSearchDrugLabels as d,handleSearchDrugNDC as f,handleSearchDrugShortages as p,handleSearchDrugsFDA as m}from"./handlers/drug-handlers.js";import{toolSchemas as h}from"./tools/index.js";import{FDAAPIClient as g,fdaAPIClient as _}from"./utils/api-client.js";import{BulkDataClient as v,bulkDataClient as y}from"./utils/bulk-data-client.js";import{loggers as b}from"./utils/logger.js";export{v as BulkDataClient,g as FDAAPIClient,y as bulkDataClient,e as createOpenFDAServer,_ as fdaAPIClient,a as handleSearchDevice510K,o as handleSearchDeviceAdverseEvents,s as handleSearchDeviceClassifications,c as handleSearchDeviceEnforcement,l as handleSearchDrugAdverseEvents,u as handleSearchDrugEnforcement,d as handleSearchDrugLabels,f as handleSearchDrugNDC,t as handleSearchDrugPatentExpiry,p as handleSearchDrugShortages,m as handleSearchDrugsFDA,n as handleSearchOrangeBook,r as handleSearchOrangeBookPatents,i as handleSearchPurpleBook,b as loggers,h as toolSchemas};
|
package/dist/server.d.ts
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
/**
|
|
2
|
+
* OpenFDA MCP Server
|
|
3
|
+
* SomaMCP server implementation with FDA tools
|
|
4
|
+
*/
|
|
5
|
+
import { t as Semver } from "./version-BNWZ_jnk.js";
|
|
6
|
+
import { SomaServerInstance } from "somamcp/node";
|
|
7
|
+
export type ServerOptions = {
|
|
5
8
|
name?: string;
|
|
6
|
-
version?:
|
|
9
|
+
version?: Semver;
|
|
7
10
|
};
|
|
8
11
|
/**
|
|
9
12
|
* Create and configure the OpenFDA MCP server
|
|
10
13
|
*/
|
|
11
|
-
declare function createOpenFDAServer(options?: ServerOptions):
|
|
12
|
-
//#endregion
|
|
13
|
-
export { ServerOptions, createOpenFDAServer };
|
|
14
|
-
//# sourceMappingURL=server.d.ts.map
|
|
14
|
+
export declare function createOpenFDAServer(options?: ServerOptions): SomaServerInstance;
|
package/dist/server.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{handleSearchDrugPatentExpiry as e,handleSearchOrangeBook as t,handleSearchOrangeBookPatents as n,handleSearchPurpleBook as r}from"./handlers/bulk-data-handlers.js";import{handleSearchDevice510K as i,handleSearchDeviceAdverseEvents as a,handleSearchDeviceClassifications as o,handleSearchDeviceEnforcement as s}from"./handlers/device-handlers.js";import{handleSearchDrugAdverseEvents as c,handleSearchDrugEnforcement as l,handleSearchDrugLabels as u,handleSearchDrugNDC as d,handleSearchDrugShortages as f,handleSearchDrugsFDA as p}from"./handlers/drug-handlers.js";import{searchDevice510KSchema as m,searchDeviceAdverseEventsSchema as h,searchDeviceClassificationsSchema as g,searchDeviceEnforcementSchema as _,searchDrugAdverseEventsSchema as v,searchDrugEnforcementSchema as y,searchDrugLabelsSchema as b,searchDrugNDCSchema as x,searchDrugPatentExpirySchema as S,searchDrugShortagesSchema as C,searchDrugsFDASchema as w,searchOrangeBookPatentsSchema as T,searchOrangeBookSchema as E,searchPurpleBookSchema as D}from"./tools/index.js";import{loggers as O}from"./utils/logger.js";import{VERSION as k}from"./version.js";import{createServer as A}from"somamcp/node";function j(j={}){let{name:M=`openfda-mcp-server`,version:N=k}=j;O.core(`Creating OpenFDA MCP server: ${M} v${N}`);let P=A({name:M,version:N});return P.addTool({name:`search_drug_adverse_events`,description:`Search FDA Adverse Event Reporting System (FAERS) for drug safety reports. Find adverse events by drug name, reaction type, manufacturer, date range, and seriousness. Retrieve a specific report by safetyReportId. Returns patient demographics, drug details, and reported reactions.`,parameters:v,execute:async e=>{O.tools(`Executing search_drug_adverse_events`,e);let t=await c(e);return JSON.stringify(t,null,2)}}),P.addTool({name:`search_drug_labels`,description:`Search FDA drug labeling (SPL) information including prescribing information, indications, warnings, boxed warnings, dosage, and active ingredients. Retrieve a specific label by setId. Filter for drugs with boxed warnings using hasBoxedWarning. Request specific sections (e.g., indications_and_usage, adverse_reactions, boxed_warning) to limit response.`,parameters:b,execute:async e=>{O.tools(`Executing search_drug_labels`,e);let t=await u(e);return JSON.stringify(t,null,2)}}),P.addTool({name:`search_drug_ndc`,description:`Search the National Drug Code (NDC) Directory for drug product identification. Find drugs by NDC, brand name, generic name, labeler, dosage form, or route. Returns product details, active ingredients, and packaging information.`,parameters:x,execute:async e=>{O.tools(`Executing search_drug_ndc`,e);let t=await d(e);return JSON.stringify(t,null,2)}}),P.addTool({name:`search_drug_recalls`,description:`Search FDA drug recall and enforcement reports. Find recalls by company, classification (I-III), status, state, and date range. Class I is most serious (may cause death), Class III is least serious.`,parameters:y,execute:async e=>{O.tools(`Executing search_drug_recalls`,e);let t=await l(e);return JSON.stringify(t,null,2)}}),P.addTool({name:`search_drugs_at_fda`,description:`Search the Drugs@FDA database for approved drug applications. Find approved drugs by sponsor, application number, brand name, or marketing status. Returns application details, products, and submission history.`,parameters:w,execute:async e=>{O.tools(`Executing search_drugs_at_fda`,e);let t=await p(e);return JSON.stringify(t,null,2)}}),P.addTool({name:`search_drug_shortages`,description:`Search the FDA Drug Shortage Database for current and resolved drug shortages. Find shortages by generic drug name or status (Current/Resolved). Returns shortage details, posting dates, and resolution information.`,parameters:C,execute:async e=>{O.tools(`Executing search_drug_shortages`,e);let t=await f(e);return JSON.stringify(t,null,2)}}),P.addTool({name:`search_device_510k`,description:`Search FDA 510(k) premarket notification database for medical device clearances. Find device clearances by device name, applicant, product code, clearance type, or decision date. Returns clearance decisions and device classification details.`,parameters:m,execute:async e=>{O.tools(`Executing search_device_510k`,e);let t=await i(e);return JSON.stringify(t,null,2)}}),P.addTool({name:`search_device_classifications`,description:`Search FDA medical device classification database. Find devices by name, class (1-3), medical specialty, product code, or regulation number. Class 1 is lowest risk, Class 3 is highest risk (implants, life-sustaining).`,parameters:g,execute:async e=>{O.tools(`Executing search_device_classifications`,e);let t=await o(e);return JSON.stringify(t,null,2)}}),P.addTool({name:`search_device_adverse_events`,description:`Search FDA Medical Device Report (MDR) database for device adverse events. Find adverse events by device name, brand, manufacturer, event type (Injury/Death/Malfunction), and date. Retrieve a specific MDR report by reportNumber. Returns device details, event descriptions, and patient outcomes.`,parameters:h,execute:async e=>{O.tools(`Executing search_device_adverse_events`,e);let t=await a(e);return JSON.stringify(t,null,2)}}),P.addTool({name:`search_device_recalls`,description:`Search FDA medical device recall and enforcement reports. Find recalls by company, product description, classification (I-III), status, and date. Class I is most serious (may cause death), Class III is least serious.`,parameters:_,execute:async e=>{O.tools(`Executing search_device_recalls`,e);let t=await s(e);return JSON.stringify(t,null,2)}}),P.addTool({name:`search_fda_orange_book`,description:`Search FDA Orange Book for approved drug products with therapeutic equivalence evaluations. Find drugs by trade name, ingredient, applicant, application number, or TE code. Returns product details, patent counts, and exclusivity counts. Data is downloaded from FDA bulk files and cached for 24 hours.`,parameters:E,execute:async e=>{O.tools(`Executing search_fda_orange_book`,e);let n=await t(e);return JSON.stringify(n,null,2)}}),P.addTool({name:`search_fda_orange_book_patents`,description:`Search FDA Orange Book patent data for drug products. Find patents by drug name, application number, or patent number. Returns patent details including expiry dates, substance/product/use flags, and associated exclusivities.`,parameters:T,execute:async e=>{O.tools(`Executing search_fda_orange_book_patents`,e);let t=await n(e);return JSON.stringify(t,null,2)}}),P.addTool({name:`search_fda_purple_book`,description:`Search FDA Purple Book for licensed biological products. Find biologics by product name, applicant, BLA number, license type (351(a)/351(k)), biosimilar status, or interchangeability. Returns product details, licensing status, and reference product information.`,parameters:D,execute:async e=>{O.tools(`Executing search_fda_purple_book`,e);let t=await r(e);return JSON.stringify(t,null,2)}}),P.addTool({name:`search_fda_drug_patent_expiry`,description:`Unified patent expiry and exclusivity view across FDA Orange Book and optionally Purple Book. Search by drug name or application number. Returns patents sorted by earliest expiry date with associated exclusivity data. Set includePurpleBook=true to also include biologics data.`,parameters:S,execute:async t=>{O.tools(`Executing search_fda_drug_patent_expiry`,t);let n=await e(t);return JSON.stringify(n,null,2)}}),O.core(`OpenFDA MCP server configured with 14 FDA tools plus SomaMCP's info tool`),P}export{j as createOpenFDAServer};
|
|
2
2
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","names":[],"sources":["../src/server.ts"],"sourcesContent":["/**\n * OpenFDA MCP Server\n * FastMCP server implementation with FDA tools\n */\n\nimport { FastMCP } from \"fastmcp\"\n\nimport {\n handleSearchDrugPatentExpiry,\n handleSearchOrangeBook,\n handleSearchOrangeBookPatents,\n handleSearchPurpleBook,\n} from \"./handlers/bulk-data-handlers.js\"\nimport {\n handleSearchDevice510K,\n handleSearchDeviceAdverseEvents,\n handleSearchDeviceClassifications,\n handleSearchDeviceEnforcement,\n} from \"./handlers/device-handlers.js\"\nimport {\n handleSearchDrugAdverseEvents,\n handleSearchDrugEnforcement,\n handleSearchDrugLabels,\n handleSearchDrugNDC,\n handleSearchDrugsFDA,\n handleSearchDrugShortages,\n} from \"./handlers/drug-handlers.js\"\nimport {\n searchDevice510KSchema,\n searchDeviceAdverseEventsSchema,\n searchDeviceClassificationsSchema,\n searchDeviceEnforcementSchema,\n searchDrugAdverseEventsSchema,\n searchDrugEnforcementSchema,\n searchDrugLabelsSchema,\n searchDrugNDCSchema,\n searchDrugPatentExpirySchema,\n searchDrugsFDASchema,\n searchDrugShortagesSchema,\n searchOrangeBookPatentsSchema,\n searchOrangeBookSchema,\n searchPurpleBookSchema,\n} from \"./tools/index.js\"\nimport { loggers } from \"./utils/logger.js\"\n\nexport type ServerOptions = {\n name?: string\n version?: `${number}.${number}.${number}`\n}\n\n/**\n * Create and configure the OpenFDA MCP server\n */\nexport function createOpenFDAServer(options: ServerOptions = {}): FastMCP {\n const { name = \"openfda-mcp-server\", version = \"0.1.0\" as `${number}.${number}.${number}` } = options\n\n loggers.core(`Creating OpenFDA MCP server: ${name} v${version}`)\n\n const server = new FastMCP({\n name,\n version,\n })\n\n // Register Drug Tools\n\n server.addTool({\n name: \"search_drug_adverse_events\",\n description:\n \"Search FDA Adverse Event Reporting System (FAERS) for drug safety reports. \" +\n \"Find adverse events by drug name, reaction type, manufacturer, date range, and seriousness. \" +\n \"Retrieve a specific report by safetyReportId. \" +\n \"Returns patient demographics, drug details, and reported reactions.\",\n parameters: searchDrugAdverseEventsSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_drug_adverse_events\", args)\n const result = await handleSearchDrugAdverseEvents(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_drug_labels\",\n description:\n \"Search FDA drug labeling (SPL) information including prescribing information, \" +\n \"indications, warnings, boxed warnings, dosage, and active ingredients. \" +\n \"Retrieve a specific label by setId. Filter for drugs with boxed warnings using hasBoxedWarning. \" +\n \"Request specific sections (e.g., indications_and_usage, adverse_reactions, boxed_warning) to limit response.\",\n parameters: searchDrugLabelsSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_drug_labels\", args)\n const result = await handleSearchDrugLabels(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_drug_ndc\",\n description:\n \"Search the National Drug Code (NDC) Directory for drug product identification. \" +\n \"Find drugs by NDC, brand name, generic name, labeler, dosage form, or route. \" +\n \"Returns product details, active ingredients, and packaging information.\",\n parameters: searchDrugNDCSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_drug_ndc\", args)\n const result = await handleSearchDrugNDC(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_drug_recalls\",\n description:\n \"Search FDA drug recall and enforcement reports. \" +\n \"Find recalls by company, classification (I-III), status, state, and date range. \" +\n \"Class I is most serious (may cause death), Class III is least serious.\",\n parameters: searchDrugEnforcementSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_drug_recalls\", args)\n const result = await handleSearchDrugEnforcement(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_drugs_at_fda\",\n description:\n \"Search the Drugs@FDA database for approved drug applications. \" +\n \"Find approved drugs by sponsor, application number, brand name, or marketing status. \" +\n \"Returns application details, products, and submission history.\",\n parameters: searchDrugsFDASchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_drugs_at_fda\", args)\n const result = await handleSearchDrugsFDA(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_drug_shortages\",\n description:\n \"Search the FDA Drug Shortage Database for current and resolved drug shortages. \" +\n \"Find shortages by generic drug name or status (Current/Resolved). \" +\n \"Returns shortage details, posting dates, and resolution information.\",\n parameters: searchDrugShortagesSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_drug_shortages\", args)\n const result = await handleSearchDrugShortages(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n // Register Device Tools\n\n server.addTool({\n name: \"search_device_510k\",\n description:\n \"Search FDA 510(k) premarket notification database for medical device clearances. \" +\n \"Find device clearances by device name, applicant, product code, clearance type, or decision date. \" +\n \"Returns clearance decisions and device classification details.\",\n parameters: searchDevice510KSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_device_510k\", args)\n const result = await handleSearchDevice510K(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_device_classifications\",\n description:\n \"Search FDA medical device classification database. \" +\n \"Find devices by name, class (1-3), medical specialty, product code, or regulation number. \" +\n \"Class 1 is lowest risk, Class 3 is highest risk (implants, life-sustaining).\",\n parameters: searchDeviceClassificationsSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_device_classifications\", args)\n const result = await handleSearchDeviceClassifications(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_device_adverse_events\",\n description:\n \"Search FDA Medical Device Report (MDR) database for device adverse events. \" +\n \"Find adverse events by device name, brand, manufacturer, event type (Injury/Death/Malfunction), and date. \" +\n \"Retrieve a specific MDR report by reportNumber. \" +\n \"Returns device details, event descriptions, and patient outcomes.\",\n parameters: searchDeviceAdverseEventsSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_device_adverse_events\", args)\n const result = await handleSearchDeviceAdverseEvents(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_device_recalls\",\n description:\n \"Search FDA medical device recall and enforcement reports. \" +\n \"Find recalls by company, product description, classification (I-III), status, and date. \" +\n \"Class I is most serious (may cause death), Class III is least serious.\",\n parameters: searchDeviceEnforcementSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_device_recalls\", args)\n const result = await handleSearchDeviceEnforcement(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n // Register Bulk Data Tools (Orange Book & Purple Book)\n\n server.addTool({\n name: \"search_fda_orange_book\",\n description:\n \"Search FDA Orange Book for approved drug products with therapeutic equivalence evaluations. \" +\n \"Find drugs by trade name, ingredient, applicant, application number, or TE code. \" +\n \"Returns product details, patent counts, and exclusivity counts. \" +\n \"Data is downloaded from FDA bulk files and cached for 24 hours.\",\n parameters: searchOrangeBookSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_fda_orange_book\", args)\n const result = await handleSearchOrangeBook(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_fda_orange_book_patents\",\n description:\n \"Search FDA Orange Book patent data for drug products. \" +\n \"Find patents by drug name, application number, or patent number. \" +\n \"Returns patent details including expiry dates, substance/product/use flags, and associated exclusivities.\",\n parameters: searchOrangeBookPatentsSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_fda_orange_book_patents\", args)\n const result = await handleSearchOrangeBookPatents(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_fda_purple_book\",\n description:\n \"Search FDA Purple Book for licensed biological products. \" +\n \"Find biologics by product name, applicant, BLA number, license type (351(a)/351(k)), \" +\n \"biosimilar status, or interchangeability. \" +\n \"Returns product details, licensing status, and reference product information.\",\n parameters: searchPurpleBookSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_fda_purple_book\", args)\n const result = await handleSearchPurpleBook(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_fda_drug_patent_expiry\",\n description:\n \"Unified patent expiry and exclusivity view across FDA Orange Book and optionally Purple Book. \" +\n \"Search by drug name or application number. \" +\n \"Returns patents sorted by earliest expiry date with associated exclusivity data. \" +\n \"Set includePurpleBook=true to also include biologics data.\",\n parameters: searchDrugPatentExpirySchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_fda_drug_patent_expiry\", args)\n const result = await handleSearchDrugPatentExpiry(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n loggers.core(\"OpenFDA MCP server configured with 14 tools\")\n\n return server\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"server.js","names":["createOpenFDAServer","VERSION","options","loggers","name","version","server","createServer","searchDrugAdverseEventsSchema","args","result","handleSearchDrugAdverseEvents","searchDrugLabelsSchema","handleSearchDrugLabels","searchDrugNDCSchema","handleSearchDrugNDC","searchDrugEnforcementSchema","handleSearchDrugEnforcement","searchDrugsFDASchema","handleSearchDrugsFDA","searchDrugShortagesSchema","handleSearchDrugShortages","searchDevice510KSchema","handleSearchDevice510K","searchDeviceClassificationsSchema","handleSearchDeviceClassifications","searchDeviceAdverseEventsSchema","handleSearchDeviceAdverseEvents","searchDeviceEnforcementSchema","handleSearchDeviceEnforcement","searchOrangeBookSchema","handleSearchOrangeBook","searchOrangeBookPatentsSchema","handleSearchOrangeBookPatents","searchPurpleBookSchema","handleSearchPurpleBook","searchDrugPatentExpirySchema","handleSearchDrugPatentExpiry"],"sources":["../src/server.ts"],"sourcesContent":["/**\n * OpenFDA MCP Server\n * SomaMCP server implementation with FDA tools\n */\n\nimport { createServer, type SomaServerInstance } from \"somamcp/node\"\n\nimport {\n handleSearchDrugPatentExpiry,\n handleSearchOrangeBook,\n handleSearchOrangeBookPatents,\n handleSearchPurpleBook,\n} from \"./handlers/bulk-data-handlers.js\"\nimport {\n handleSearchDevice510K,\n handleSearchDeviceAdverseEvents,\n handleSearchDeviceClassifications,\n handleSearchDeviceEnforcement,\n} from \"./handlers/device-handlers.js\"\nimport {\n handleSearchDrugAdverseEvents,\n handleSearchDrugEnforcement,\n handleSearchDrugLabels,\n handleSearchDrugNDC,\n handleSearchDrugsFDA,\n handleSearchDrugShortages,\n} from \"./handlers/drug-handlers.js\"\nimport {\n searchDevice510KSchema,\n searchDeviceAdverseEventsSchema,\n searchDeviceClassificationsSchema,\n searchDeviceEnforcementSchema,\n searchDrugAdverseEventsSchema,\n searchDrugEnforcementSchema,\n searchDrugLabelsSchema,\n searchDrugNDCSchema,\n searchDrugPatentExpirySchema,\n searchDrugsFDASchema,\n searchDrugShortagesSchema,\n searchOrangeBookPatentsSchema,\n searchOrangeBookSchema,\n searchPurpleBookSchema,\n} from \"./tools/index.js\"\nimport { loggers } from \"./utils/logger.js\"\nimport { type Semver, VERSION } from \"./version.js\"\n\nexport type ServerOptions = {\n name?: string\n version?: Semver\n}\n\n/**\n * Create and configure the OpenFDA MCP server\n */\nexport function createOpenFDAServer(options: ServerOptions = {}): SomaServerInstance {\n const { name = \"openfda-mcp-server\", version = VERSION } = options\n\n loggers.core(`Creating OpenFDA MCP server: ${name} v${version}`)\n\n const server = createServer({\n name,\n version,\n })\n\n // Register Drug Tools\n\n server.addTool({\n name: \"search_drug_adverse_events\",\n description:\n \"Search FDA Adverse Event Reporting System (FAERS) for drug safety reports. \" +\n \"Find adverse events by drug name, reaction type, manufacturer, date range, and seriousness. \" +\n \"Retrieve a specific report by safetyReportId. \" +\n \"Returns patient demographics, drug details, and reported reactions.\",\n parameters: searchDrugAdverseEventsSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_drug_adverse_events\", args)\n const result = await handleSearchDrugAdverseEvents(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_drug_labels\",\n description:\n \"Search FDA drug labeling (SPL) information including prescribing information, \" +\n \"indications, warnings, boxed warnings, dosage, and active ingredients. \" +\n \"Retrieve a specific label by setId. Filter for drugs with boxed warnings using hasBoxedWarning. \" +\n \"Request specific sections (e.g., indications_and_usage, adverse_reactions, boxed_warning) to limit response.\",\n parameters: searchDrugLabelsSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_drug_labels\", args)\n const result = await handleSearchDrugLabels(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_drug_ndc\",\n description:\n \"Search the National Drug Code (NDC) Directory for drug product identification. \" +\n \"Find drugs by NDC, brand name, generic name, labeler, dosage form, or route. \" +\n \"Returns product details, active ingredients, and packaging information.\",\n parameters: searchDrugNDCSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_drug_ndc\", args)\n const result = await handleSearchDrugNDC(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_drug_recalls\",\n description:\n \"Search FDA drug recall and enforcement reports. \" +\n \"Find recalls by company, classification (I-III), status, state, and date range. \" +\n \"Class I is most serious (may cause death), Class III is least serious.\",\n parameters: searchDrugEnforcementSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_drug_recalls\", args)\n const result = await handleSearchDrugEnforcement(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_drugs_at_fda\",\n description:\n \"Search the Drugs@FDA database for approved drug applications. \" +\n \"Find approved drugs by sponsor, application number, brand name, or marketing status. \" +\n \"Returns application details, products, and submission history.\",\n parameters: searchDrugsFDASchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_drugs_at_fda\", args)\n const result = await handleSearchDrugsFDA(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_drug_shortages\",\n description:\n \"Search the FDA Drug Shortage Database for current and resolved drug shortages. \" +\n \"Find shortages by generic drug name or status (Current/Resolved). \" +\n \"Returns shortage details, posting dates, and resolution information.\",\n parameters: searchDrugShortagesSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_drug_shortages\", args)\n const result = await handleSearchDrugShortages(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n // Register Device Tools\n\n server.addTool({\n name: \"search_device_510k\",\n description:\n \"Search FDA 510(k) premarket notification database for medical device clearances. \" +\n \"Find device clearances by device name, applicant, product code, clearance type, or decision date. \" +\n \"Returns clearance decisions and device classification details.\",\n parameters: searchDevice510KSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_device_510k\", args)\n const result = await handleSearchDevice510K(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_device_classifications\",\n description:\n \"Search FDA medical device classification database. \" +\n \"Find devices by name, class (1-3), medical specialty, product code, or regulation number. \" +\n \"Class 1 is lowest risk, Class 3 is highest risk (implants, life-sustaining).\",\n parameters: searchDeviceClassificationsSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_device_classifications\", args)\n const result = await handleSearchDeviceClassifications(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_device_adverse_events\",\n description:\n \"Search FDA Medical Device Report (MDR) database for device adverse events. \" +\n \"Find adverse events by device name, brand, manufacturer, event type (Injury/Death/Malfunction), and date. \" +\n \"Retrieve a specific MDR report by reportNumber. \" +\n \"Returns device details, event descriptions, and patient outcomes.\",\n parameters: searchDeviceAdverseEventsSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_device_adverse_events\", args)\n const result = await handleSearchDeviceAdverseEvents(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_device_recalls\",\n description:\n \"Search FDA medical device recall and enforcement reports. \" +\n \"Find recalls by company, product description, classification (I-III), status, and date. \" +\n \"Class I is most serious (may cause death), Class III is least serious.\",\n parameters: searchDeviceEnforcementSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_device_recalls\", args)\n const result = await handleSearchDeviceEnforcement(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n // Register Bulk Data Tools (Orange Book & Purple Book)\n\n server.addTool({\n name: \"search_fda_orange_book\",\n description:\n \"Search FDA Orange Book for approved drug products with therapeutic equivalence evaluations. \" +\n \"Find drugs by trade name, ingredient, applicant, application number, or TE code. \" +\n \"Returns product details, patent counts, and exclusivity counts. \" +\n \"Data is downloaded from FDA bulk files and cached for 24 hours.\",\n parameters: searchOrangeBookSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_fda_orange_book\", args)\n const result = await handleSearchOrangeBook(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_fda_orange_book_patents\",\n description:\n \"Search FDA Orange Book patent data for drug products. \" +\n \"Find patents by drug name, application number, or patent number. \" +\n \"Returns patent details including expiry dates, substance/product/use flags, and associated exclusivities.\",\n parameters: searchOrangeBookPatentsSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_fda_orange_book_patents\", args)\n const result = await handleSearchOrangeBookPatents(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_fda_purple_book\",\n description:\n \"Search FDA Purple Book for licensed biological products. \" +\n \"Find biologics by product name, applicant, BLA number, license type (351(a)/351(k)), \" +\n \"biosimilar status, or interchangeability. \" +\n \"Returns product details, licensing status, and reference product information.\",\n parameters: searchPurpleBookSchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_fda_purple_book\", args)\n const result = await handleSearchPurpleBook(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n server.addTool({\n name: \"search_fda_drug_patent_expiry\",\n description:\n \"Unified patent expiry and exclusivity view across FDA Orange Book and optionally Purple Book. \" +\n \"Search by drug name or application number. \" +\n \"Returns patents sorted by earliest expiry date with associated exclusivity data. \" +\n \"Set includePurpleBook=true to also include biologics data.\",\n parameters: searchDrugPatentExpirySchema,\n execute: async (args) => {\n loggers.tools(\"Executing search_fda_drug_patent_expiry\", args)\n const result = await handleSearchDrugPatentExpiry(args)\n return JSON.stringify(result, null, 2)\n },\n })\n\n loggers.core(\"OpenFDA MCP server configured with 14 FDA tools plus SomaMCP's info tool\")\n\n return server\n}\n"],"mappings":"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"}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MCP Tool Definitions
|
|
3
|
+
* Zod schemas for all FDA MCP tools
|
|
4
|
+
*/
|
|
1
5
|
import { z } from "zod";
|
|
2
|
-
|
|
3
|
-
//#region src/tools/index.d.ts
|
|
4
|
-
declare const searchDrugAdverseEventsSchema: z.ZodObject<{
|
|
6
|
+
export declare const searchDrugAdverseEventsSchema: z.ZodObject<{
|
|
5
7
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
6
8
|
skip: z.ZodOptional<z.ZodNumber>;
|
|
7
9
|
dateFrom: z.ZodOptional<z.ZodString>;
|
|
@@ -12,8 +14,8 @@ declare const searchDrugAdverseEventsSchema: z.ZodObject<{
|
|
|
12
14
|
manufacturer: z.ZodOptional<z.ZodString>;
|
|
13
15
|
serious: z.ZodOptional<z.ZodBoolean>;
|
|
14
16
|
}, z.core.$strip>;
|
|
15
|
-
declare const labelSections: readonly ["indications_and_usage", "dosage_and_administration", "contraindications", "warnings", "warnings_and_cautions", "adverse_reactions", "drug_interactions", "clinical_pharmacology", "mechanism_of_action", "pharmacokinetics", "overdosage", "description", "how_supplied", "storage_and_handling", "boxed_warning"];
|
|
16
|
-
declare const searchDrugLabelsSchema: z.ZodObject<{
|
|
17
|
+
export declare const labelSections: readonly ["indications_and_usage", "dosage_and_administration", "contraindications", "warnings", "warnings_and_cautions", "adverse_reactions", "drug_interactions", "clinical_pharmacology", "mechanism_of_action", "pharmacokinetics", "overdosage", "description", "how_supplied", "storage_and_handling", "boxed_warning"];
|
|
18
|
+
export declare const searchDrugLabelsSchema: z.ZodObject<{
|
|
17
19
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
18
20
|
skip: z.ZodOptional<z.ZodNumber>;
|
|
19
21
|
setId: z.ZodOptional<z.ZodString>;
|
|
@@ -40,7 +42,7 @@ declare const searchDrugLabelsSchema: z.ZodObject<{
|
|
|
40
42
|
boxed_warning: "boxed_warning";
|
|
41
43
|
}>>>;
|
|
42
44
|
}, z.core.$strip>;
|
|
43
|
-
declare const searchDrugNDCSchema: z.ZodObject<{
|
|
45
|
+
export declare const searchDrugNDCSchema: z.ZodObject<{
|
|
44
46
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
45
47
|
skip: z.ZodOptional<z.ZodNumber>;
|
|
46
48
|
productNdc: z.ZodOptional<z.ZodString>;
|
|
@@ -50,7 +52,7 @@ declare const searchDrugNDCSchema: z.ZodObject<{
|
|
|
50
52
|
dosageForm: z.ZodOptional<z.ZodString>;
|
|
51
53
|
route: z.ZodOptional<z.ZodString>;
|
|
52
54
|
}, z.core.$strip>;
|
|
53
|
-
declare const searchDrugEnforcementSchema: z.ZodObject<{
|
|
55
|
+
export declare const searchDrugEnforcementSchema: z.ZodObject<{
|
|
54
56
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
55
57
|
skip: z.ZodOptional<z.ZodNumber>;
|
|
56
58
|
dateFrom: z.ZodOptional<z.ZodString>;
|
|
@@ -69,7 +71,7 @@ declare const searchDrugEnforcementSchema: z.ZodObject<{
|
|
|
69
71
|
}>>;
|
|
70
72
|
state: z.ZodOptional<z.ZodString>;
|
|
71
73
|
}, z.core.$strip>;
|
|
72
|
-
declare const searchDrugsFDASchema: z.ZodObject<{
|
|
74
|
+
export declare const searchDrugsFDASchema: z.ZodObject<{
|
|
73
75
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
74
76
|
skip: z.ZodOptional<z.ZodNumber>;
|
|
75
77
|
sponsorName: z.ZodOptional<z.ZodString>;
|
|
@@ -77,7 +79,7 @@ declare const searchDrugsFDASchema: z.ZodObject<{
|
|
|
77
79
|
brandName: z.ZodOptional<z.ZodString>;
|
|
78
80
|
marketingStatus: z.ZodOptional<z.ZodString>;
|
|
79
81
|
}, z.core.$strip>;
|
|
80
|
-
declare const searchDrugShortagesSchema: z.ZodObject<{
|
|
82
|
+
export declare const searchDrugShortagesSchema: z.ZodObject<{
|
|
81
83
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
82
84
|
skip: z.ZodOptional<z.ZodNumber>;
|
|
83
85
|
genericName: z.ZodOptional<z.ZodString>;
|
|
@@ -86,7 +88,7 @@ declare const searchDrugShortagesSchema: z.ZodObject<{
|
|
|
86
88
|
Resolved: "Resolved";
|
|
87
89
|
}>>;
|
|
88
90
|
}, z.core.$strip>;
|
|
89
|
-
declare const searchDevice510KSchema: z.ZodObject<{
|
|
91
|
+
export declare const searchDevice510KSchema: z.ZodObject<{
|
|
90
92
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
91
93
|
skip: z.ZodOptional<z.ZodNumber>;
|
|
92
94
|
deviceName: z.ZodOptional<z.ZodString>;
|
|
@@ -96,7 +98,7 @@ declare const searchDevice510KSchema: z.ZodObject<{
|
|
|
96
98
|
decisionDateFrom: z.ZodOptional<z.ZodString>;
|
|
97
99
|
decisionDateTo: z.ZodOptional<z.ZodString>;
|
|
98
100
|
}, z.core.$strip>;
|
|
99
|
-
declare const searchDeviceClassificationsSchema: z.ZodObject<{
|
|
101
|
+
export declare const searchDeviceClassificationsSchema: z.ZodObject<{
|
|
100
102
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
101
103
|
skip: z.ZodOptional<z.ZodNumber>;
|
|
102
104
|
deviceName: z.ZodOptional<z.ZodString>;
|
|
@@ -109,7 +111,7 @@ declare const searchDeviceClassificationsSchema: z.ZodObject<{
|
|
|
109
111
|
productCode: z.ZodOptional<z.ZodString>;
|
|
110
112
|
regulationNumber: z.ZodOptional<z.ZodString>;
|
|
111
113
|
}, z.core.$strip>;
|
|
112
|
-
declare const searchDeviceAdverseEventsSchema: z.ZodObject<{
|
|
114
|
+
export declare const searchDeviceAdverseEventsSchema: z.ZodObject<{
|
|
113
115
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
114
116
|
skip: z.ZodOptional<z.ZodNumber>;
|
|
115
117
|
dateFrom: z.ZodOptional<z.ZodString>;
|
|
@@ -125,7 +127,7 @@ declare const searchDeviceAdverseEventsSchema: z.ZodObject<{
|
|
|
125
127
|
Other: "Other";
|
|
126
128
|
}>>;
|
|
127
129
|
}, z.core.$strip>;
|
|
128
|
-
declare const searchDeviceEnforcementSchema: z.ZodObject<{
|
|
130
|
+
export declare const searchDeviceEnforcementSchema: z.ZodObject<{
|
|
129
131
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
130
132
|
skip: z.ZodOptional<z.ZodNumber>;
|
|
131
133
|
dateFrom: z.ZodOptional<z.ZodString>;
|
|
@@ -144,7 +146,7 @@ declare const searchDeviceEnforcementSchema: z.ZodObject<{
|
|
|
144
146
|
Pending: "Pending";
|
|
145
147
|
}>>;
|
|
146
148
|
}, z.core.$strip>;
|
|
147
|
-
declare const searchOrangeBookSchema: z.ZodObject<{
|
|
149
|
+
export declare const searchOrangeBookSchema: z.ZodObject<{
|
|
148
150
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
149
151
|
skip: z.ZodOptional<z.ZodNumber>;
|
|
150
152
|
drugName: z.ZodOptional<z.ZodString>;
|
|
@@ -152,14 +154,14 @@ declare const searchOrangeBookSchema: z.ZodObject<{
|
|
|
152
154
|
applNo: z.ZodOptional<z.ZodString>;
|
|
153
155
|
teCode: z.ZodOptional<z.ZodString>;
|
|
154
156
|
}, z.core.$strip>;
|
|
155
|
-
declare const searchOrangeBookPatentsSchema: z.ZodObject<{
|
|
157
|
+
export declare const searchOrangeBookPatentsSchema: z.ZodObject<{
|
|
156
158
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
157
159
|
skip: z.ZodOptional<z.ZodNumber>;
|
|
158
160
|
drugName: z.ZodOptional<z.ZodString>;
|
|
159
161
|
applNo: z.ZodOptional<z.ZodString>;
|
|
160
162
|
patentNo: z.ZodOptional<z.ZodString>;
|
|
161
163
|
}, z.core.$strip>;
|
|
162
|
-
declare const searchPurpleBookSchema: z.ZodObject<{
|
|
164
|
+
export declare const searchPurpleBookSchema: z.ZodObject<{
|
|
163
165
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
164
166
|
skip: z.ZodOptional<z.ZodNumber>;
|
|
165
167
|
productName: z.ZodOptional<z.ZodString>;
|
|
@@ -172,7 +174,7 @@ declare const searchPurpleBookSchema: z.ZodObject<{
|
|
|
172
174
|
biosimilar: z.ZodOptional<z.ZodBoolean>;
|
|
173
175
|
interchangeable: z.ZodOptional<z.ZodBoolean>;
|
|
174
176
|
}, z.core.$strip>;
|
|
175
|
-
declare const searchDrugPatentExpirySchema: z.ZodObject<{
|
|
177
|
+
export declare const searchDrugPatentExpirySchema: z.ZodObject<{
|
|
176
178
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
177
179
|
skip: z.ZodOptional<z.ZodNumber>;
|
|
178
180
|
drugName: z.ZodOptional<z.ZodString>;
|
|
@@ -180,7 +182,7 @@ declare const searchDrugPatentExpirySchema: z.ZodObject<{
|
|
|
180
182
|
includeExclusivity: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
181
183
|
includePurpleBook: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
182
184
|
}, z.core.$strip>;
|
|
183
|
-
declare const toolSchemas: {
|
|
185
|
+
export declare const toolSchemas: {
|
|
184
186
|
searchDrugAdverseEvents: z.ZodObject<{
|
|
185
187
|
limit: z.ZodOptional<z.ZodNumber>;
|
|
186
188
|
skip: z.ZodOptional<z.ZodNumber>;
|
|
@@ -360,21 +362,18 @@ declare const toolSchemas: {
|
|
|
360
362
|
includePurpleBook: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
|
|
361
363
|
}, z.core.$strip>;
|
|
362
364
|
};
|
|
363
|
-
type SearchDrugAdverseEventsParams = z.infer<typeof searchDrugAdverseEventsSchema>;
|
|
364
|
-
type SearchDrugLabelsParams = z.infer<typeof searchDrugLabelsSchema>;
|
|
365
|
-
type SearchDrugNDCParams = z.infer<typeof searchDrugNDCSchema>;
|
|
366
|
-
type SearchDrugEnforcementParams = z.infer<typeof searchDrugEnforcementSchema>;
|
|
367
|
-
type SearchDrugsFDAParams = z.infer<typeof searchDrugsFDASchema>;
|
|
368
|
-
type SearchDrugShortagesParams = z.infer<typeof searchDrugShortagesSchema>;
|
|
369
|
-
type SearchDevice510KParams = z.infer<typeof searchDevice510KSchema>;
|
|
370
|
-
type SearchDeviceClassificationsParams = z.infer<typeof searchDeviceClassificationsSchema>;
|
|
371
|
-
type SearchDeviceAdverseEventsParams = z.infer<typeof searchDeviceAdverseEventsSchema>;
|
|
372
|
-
type SearchDeviceEnforcementParams = z.infer<typeof searchDeviceEnforcementSchema>;
|
|
373
|
-
type SearchOrangeBookParams = z.infer<typeof searchOrangeBookSchema>;
|
|
374
|
-
type SearchOrangeBookPatentsParams = z.infer<typeof searchOrangeBookPatentsSchema>;
|
|
375
|
-
type SearchPurpleBookParams = z.infer<typeof searchPurpleBookSchema>;
|
|
376
|
-
type SearchDrugPatentExpiryParams = z.infer<typeof searchDrugPatentExpirySchema>;
|
|
377
|
-
type LabelSection = (typeof labelSections)[number];
|
|
378
|
-
//#endregion
|
|
379
|
-
export { LabelSection, SearchDevice510KParams, SearchDeviceAdverseEventsParams, SearchDeviceClassificationsParams, SearchDeviceEnforcementParams, SearchDrugAdverseEventsParams, SearchDrugEnforcementParams, SearchDrugLabelsParams, SearchDrugNDCParams, SearchDrugPatentExpiryParams, SearchDrugShortagesParams, SearchDrugsFDAParams, SearchOrangeBookParams, SearchOrangeBookPatentsParams, SearchPurpleBookParams, labelSections, searchDevice510KSchema, searchDeviceAdverseEventsSchema, searchDeviceClassificationsSchema, searchDeviceEnforcementSchema, searchDrugAdverseEventsSchema, searchDrugEnforcementSchema, searchDrugLabelsSchema, searchDrugNDCSchema, searchDrugPatentExpirySchema, searchDrugShortagesSchema, searchDrugsFDASchema, searchOrangeBookPatentsSchema, searchOrangeBookSchema, searchPurpleBookSchema, toolSchemas };
|
|
380
|
-
//# sourceMappingURL=index.d.ts.map
|
|
365
|
+
export type SearchDrugAdverseEventsParams = z.infer<typeof searchDrugAdverseEventsSchema>;
|
|
366
|
+
export type SearchDrugLabelsParams = z.infer<typeof searchDrugLabelsSchema>;
|
|
367
|
+
export type SearchDrugNDCParams = z.infer<typeof searchDrugNDCSchema>;
|
|
368
|
+
export type SearchDrugEnforcementParams = z.infer<typeof searchDrugEnforcementSchema>;
|
|
369
|
+
export type SearchDrugsFDAParams = z.infer<typeof searchDrugsFDASchema>;
|
|
370
|
+
export type SearchDrugShortagesParams = z.infer<typeof searchDrugShortagesSchema>;
|
|
371
|
+
export type SearchDevice510KParams = z.infer<typeof searchDevice510KSchema>;
|
|
372
|
+
export type SearchDeviceClassificationsParams = z.infer<typeof searchDeviceClassificationsSchema>;
|
|
373
|
+
export type SearchDeviceAdverseEventsParams = z.infer<typeof searchDeviceAdverseEventsSchema>;
|
|
374
|
+
export type SearchDeviceEnforcementParams = z.infer<typeof searchDeviceEnforcementSchema>;
|
|
375
|
+
export type SearchOrangeBookParams = z.infer<typeof searchOrangeBookSchema>;
|
|
376
|
+
export type SearchOrangeBookPatentsParams = z.infer<typeof searchOrangeBookPatentsSchema>;
|
|
377
|
+
export type SearchPurpleBookParams = z.infer<typeof searchPurpleBookSchema>;
|
|
378
|
+
export type SearchDrugPatentExpiryParams = z.infer<typeof searchDrugPatentExpirySchema>;
|
|
379
|
+
export type LabelSection = (typeof labelSections)[number];
|