openfda-mcp-server 1.1.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 +108 -0
- package/dist/handlers/bulk-data-handlers.js +2 -0
- package/dist/handlers/bulk-data-handlers.js.map +1 -0
- package/dist/handlers/device-handlers.d.ts +13 -14
- package/dist/handlers/device-handlers.js +2 -1
- package/dist/handlers/device-handlers.js.map +1 -0
- package/dist/handlers/drug-handlers.d.ts +17 -18
- package/dist/handlers/drug-handlers.js +2 -1
- package/dist/handlers/drug-handlers.js.map +1 -0
- 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 +9 -3
- package/dist/lib.js +1 -1
- package/dist/server.d.ts +9 -10
- package/dist/server.js +1 -1
- package/dist/server.js.map +1 -1
- package/dist/tools/index.d.ts +231 -409
- package/dist/tools/index.js +2 -1
- package/dist/tools/index.js.map +1 -0
- package/dist/types/fda.d.ts +71 -18
- package/dist/utils/api-client.d.ts +27 -24
- package/dist/utils/api-client.js +2 -1
- package/dist/utils/api-client.js.map +1 -0
- package/dist/utils/bulk-data-client.d.ts +30 -0
- package/dist/utils/bulk-data-client.js +3 -0
- package/dist/utils/bulk-data-client.js.map +1 -0
- 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 +9 -9
- 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 +32 -24
- package/dist/api-client-BGnUXMwX.js +0 -2
- package/dist/api-client-BGnUXMwX.js.map +0 -1
- package/dist/device-handlers-D8AD5oIk.js +0 -2
- package/dist/device-handlers-D8AD5oIk.js.map +0 -1
- package/dist/drug-handlers-D5VxbBCL.js +0 -2
- package/dist/drug-handlers-D5VxbBCL.js.map +0 -1
- package/dist/tools-3M3lSxQv.js +0 -2
- package/dist/tools-3M3lSxQv.js.map +0 -1
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 \"@jordanburke/fastmcp\"\n\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 searchDrugsFDASchema,\n searchDrugShortagesSchema,\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 loggers.core(\"OpenFDA MCP server configured with 10 tools\")\n\n return server\n}\n"],"mappings":"8WA2CA,SAAgB,EAAoB,EAAyB,EAAE,CAAW,CACxE,GAAM,CAAE,OAAO,qBAAsB,UAAU,SAA+C,EAE9F,EAAQ,KAAK,gCAAgC,EAAK,IAAI,IAAU,CAEhE,IAAM,EAAS,IAAI,EAAQ,CACzB,OACA,UACD,CAAC,CAuJF,OAnJA,EAAO,QAAQ,CACb,KAAM,6BACN,YACE,2RAIF,WAAY,EACZ,QAAS,KAAO,IAAS,CACvB,EAAQ,MAAM,uCAAwC,EAAK,CAC3D,IAAM,EAAS,MAAM,EAA8B,EAAK,CACxD,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,EAEzC,CAAC,CAEF,EAAO,QAAQ,CACb,KAAM,qBACN,YACE,oWAIF,WAAY,EACZ,QAAS,KAAO,IAAS,CACvB,EAAQ,MAAM,+BAAgC,EAAK,CACnD,IAAM,EAAS,MAAM,EAAuB,EAAK,CACjD,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,EAEzC,CAAC,CAEF,EAAO,QAAQ,CACb,KAAM,kBACN,YACE,sOAGF,WAAY,EACZ,QAAS,KAAO,IAAS,CACvB,EAAQ,MAAM,4BAA6B,EAAK,CAChD,IAAM,EAAS,MAAM,EAAoB,EAAK,CAC9C,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,EAEzC,CAAC,CAEF,EAAO,QAAQ,CACb,KAAM,sBACN,YACE,yMAGF,WAAY,EACZ,QAAS,KAAO,IAAS,CACvB,EAAQ,MAAM,gCAAiC,EAAK,CACpD,IAAM,EAAS,MAAM,EAA4B,EAAK,CACtD,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,EAEzC,CAAC,CAEF,EAAO,QAAQ,CACb,KAAM,sBACN,YACE,oNAGF,WAAY,EACZ,QAAS,KAAO,IAAS,CACvB,EAAQ,MAAM,gCAAiC,EAAK,CACpD,IAAM,EAAS,MAAM,EAAqB,EAAK,CAC/C,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,EAEzC,CAAC,CAEF,EAAO,QAAQ,CACb,KAAM,wBACN,YACE,wNAGF,WAAY,EACZ,QAAS,KAAO,IAAS,CACvB,EAAQ,MAAM,kCAAmC,EAAK,CACtD,IAAM,EAAS,MAAM,EAA0B,EAAK,CACpD,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,EAEzC,CAAC,CAIF,EAAO,QAAQ,CACb,KAAM,qBACN,YACE,oPAGF,WAAY,EACZ,QAAS,KAAO,IAAS,CACvB,EAAQ,MAAM,+BAAgC,EAAK,CACnD,IAAM,EAAS,MAAM,EAAuB,EAAK,CACjD,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,EAEzC,CAAC,CAEF,EAAO,QAAQ,CACb,KAAM,gCACN,YACE,4NAGF,WAAY,EACZ,QAAS,KAAO,IAAS,CACvB,EAAQ,MAAM,0CAA2C,EAAK,CAC9D,IAAM,EAAS,MAAM,EAAkC,EAAK,CAC5D,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,EAEzC,CAAC,CAEF,EAAO,QAAQ,CACb,KAAM,+BACN,YACE,ySAIF,WAAY,EACZ,QAAS,KAAO,IAAS,CACvB,EAAQ,MAAM,yCAA0C,EAAK,CAC7D,IAAM,EAAS,MAAM,EAAgC,EAAK,CAC1D,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,EAEzC,CAAC,CAEF,EAAO,QAAQ,CACb,KAAM,wBACN,YACE,2NAGF,WAAY,EACZ,QAAS,KAAO,IAAS,CACvB,EAAQ,MAAM,kCAAmC,EAAK,CACtD,IAAM,EAAS,MAAM,EAA8B,EAAK,CACxD,OAAO,KAAK,UAAU,EAAQ,KAAM,EAAE,EAEzC,CAAC,CAEF,EAAQ,KAAK,8CAA8C,CAEpD"}
|
|
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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"}
|