fda-mcp-server 0.0.6 → 0.0.7
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/dist/db.d.ts +18 -0
- package/dist/db.d.ts.map +1 -1
- package/dist/db.js +54 -7
- package/dist/db.js.map +1 -1
- package/dist/fda-client.d.ts +29 -54
- package/dist/fda-client.d.ts.map +1 -1
- package/dist/fda-client.js +74 -178
- package/dist/fda-client.js.map +1 -1
- package/dist/index.d.ts +4 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +248 -480
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/db.d.ts
CHANGED
|
@@ -101,5 +101,23 @@ export interface SupplierQualResult {
|
|
|
101
101
|
}[];
|
|
102
102
|
csa_risk: CSARiskResult | null;
|
|
103
103
|
}
|
|
104
|
+
export interface CompanyEnrichedResult {
|
|
105
|
+
warning_letters: {
|
|
106
|
+
issue_date: string;
|
|
107
|
+
center: string;
|
|
108
|
+
regime: string;
|
|
109
|
+
csa_relevant: boolean;
|
|
110
|
+
subject: string;
|
|
111
|
+
}[];
|
|
112
|
+
inspections: {
|
|
113
|
+
inspection_date: string;
|
|
114
|
+
center: string;
|
|
115
|
+
product_area: string;
|
|
116
|
+
csa_relevant: boolean;
|
|
117
|
+
}[];
|
|
118
|
+
total_warning_letters: number;
|
|
119
|
+
total_inspections: number;
|
|
120
|
+
}
|
|
121
|
+
export declare function companyEnrichedProfile(companyName: string): Promise<CompanyEnrichedResult | null>;
|
|
104
122
|
export declare function supplierQualification(companyName: string): Promise<SupplierQualResult | null>;
|
|
105
123
|
//# sourceMappingURL=db.d.ts.map
|
package/dist/db.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|
package/dist/db.js
CHANGED
|
@@ -93,7 +93,7 @@ export async function csaRiskAssessment(companyName) {
|
|
|
93
93
|
JOIN warning_letter wl ON c.letter_id = wl.id
|
|
94
94
|
WHERE LOWER(wl.company_name) LIKE LOWER($1)`, [`%${companyName}%`]);
|
|
95
95
|
// Top CFR citations
|
|
96
|
-
const topCfr = await p.query(`SELECT c.cfr_full, c.normalized_category, COUNT(*) AS cnt
|
|
96
|
+
const topCfr = await p.query(`SELECT COALESCE(c.cfr_full, 'N/A') AS cfr_full, c.normalized_category, COUNT(*) AS cnt
|
|
97
97
|
FROM citation c
|
|
98
98
|
JOIN warning_letter wl ON c.letter_id = wl.id
|
|
99
99
|
WHERE LOWER(wl.company_name) LIKE LOWER($1)
|
|
@@ -180,7 +180,7 @@ export async function citationAnalysis(params) {
|
|
|
180
180
|
const byType = await p.query(`SELECT c.citation_type AS type, COUNT(*) AS cnt
|
|
181
181
|
FROM citation c JOIN warning_letter wl ON c.letter_id = wl.id ${where}
|
|
182
182
|
GROUP BY c.citation_type ORDER BY cnt DESC`, values);
|
|
183
|
-
const byPart = await p.query(`SELECT c.cfr_part AS part, COUNT(*) AS cnt
|
|
183
|
+
const byPart = await p.query(`SELECT COALESCE(c.cfr_part::text, 'N/A') AS part, COUNT(*) AS cnt
|
|
184
184
|
FROM citation c JOIN warning_letter wl ON c.letter_id = wl.id ${where}
|
|
185
185
|
GROUP BY c.cfr_part ORDER BY cnt DESC LIMIT 15`, values);
|
|
186
186
|
const byCategory = await p.query(`SELECT c.normalized_category AS category, COUNT(*) AS cnt,
|
|
@@ -190,7 +190,7 @@ export async function citationAnalysis(params) {
|
|
|
190
190
|
) THEN true ELSE false END AS csa_relevant
|
|
191
191
|
FROM citation c JOIN warning_letter wl ON c.letter_id = wl.id ${where}
|
|
192
192
|
GROUP BY c.normalized_category ORDER BY cnt DESC`, values);
|
|
193
|
-
const topSections = await p.query(`SELECT c.cfr_full, c.normalized_category AS description, COUNT(*) AS cnt
|
|
193
|
+
const topSections = await p.query(`SELECT COALESCE(c.cfr_full, 'N/A') AS cfr_full, c.normalized_category AS description, COUNT(*) AS cnt
|
|
194
194
|
FROM citation c JOIN warning_letter wl ON c.letter_id = wl.id ${where}
|
|
195
195
|
GROUP BY c.cfr_full, c.normalized_category ORDER BY cnt DESC LIMIT 20`, values);
|
|
196
196
|
const total = parseInt(totalResult.rows[0]?.total ?? "0");
|
|
@@ -214,6 +214,48 @@ export async function citationAnalysis(params) {
|
|
|
214
214
|
csa_percentage: total > 0 ? Math.round((csaCount / total) * 100 * 10) / 10 : 0,
|
|
215
215
|
};
|
|
216
216
|
}
|
|
217
|
+
export async function companyEnrichedProfile(companyName) {
|
|
218
|
+
const p = getPool();
|
|
219
|
+
if (!p)
|
|
220
|
+
return null;
|
|
221
|
+
const wlResult = await p.query(`SELECT
|
|
222
|
+
to_char(to_timestamp(issue_date), 'YYYY-MM-DD') AS issue_date,
|
|
223
|
+
center, regime, csa_relevant,
|
|
224
|
+
COALESCE(letter_subject, '') AS subject
|
|
225
|
+
FROM warning_letter
|
|
226
|
+
WHERE LOWER(company_name) LIKE LOWER($1)
|
|
227
|
+
ORDER BY issue_date DESC
|
|
228
|
+
LIMIT 10`, [`%${companyName}%`]);
|
|
229
|
+
const wlCount = await p.query(`SELECT COUNT(*) AS cnt FROM warning_letter WHERE LOWER(company_name) LIKE LOWER($1)`, [`%${companyName}%`]);
|
|
230
|
+
const inspResult = await p.query(`SELECT
|
|
231
|
+
CASE WHEN inspection_end_date IS NOT NULL
|
|
232
|
+
THEN to_char(to_timestamp(inspection_end_date), 'YYYY-MM-DD')
|
|
233
|
+
ELSE ''
|
|
234
|
+
END AS inspection_date,
|
|
235
|
+
center, product_area, csa_relevant
|
|
236
|
+
FROM observation_483
|
|
237
|
+
WHERE LOWER(company_name) LIKE LOWER($1)
|
|
238
|
+
ORDER BY inspection_end_date DESC
|
|
239
|
+
LIMIT 10`, [`%${companyName}%`]);
|
|
240
|
+
const inspCount = await p.query(`SELECT COUNT(*) AS cnt FROM observation_483 WHERE LOWER(company_name) LIKE LOWER($1)`, [`%${companyName}%`]);
|
|
241
|
+
return {
|
|
242
|
+
warning_letters: wlResult.rows.map((r) => ({
|
|
243
|
+
issue_date: r.issue_date ?? "",
|
|
244
|
+
center: r.center ?? "",
|
|
245
|
+
regime: r.regime ?? "",
|
|
246
|
+
csa_relevant: r.csa_relevant ?? false,
|
|
247
|
+
subject: r.subject ?? "",
|
|
248
|
+
})),
|
|
249
|
+
inspections: inspResult.rows.map((r) => ({
|
|
250
|
+
inspection_date: r.inspection_date ?? "",
|
|
251
|
+
center: r.center ?? "",
|
|
252
|
+
product_area: r.product_area ?? "",
|
|
253
|
+
csa_relevant: r.csa_relevant ?? false,
|
|
254
|
+
})),
|
|
255
|
+
total_warning_letters: parseInt(wlCount.rows[0]?.cnt ?? "0"),
|
|
256
|
+
total_inspections: parseInt(inspCount.rows[0]?.cnt ?? "0"),
|
|
257
|
+
};
|
|
258
|
+
}
|
|
217
259
|
export async function supplierQualification(companyName) {
|
|
218
260
|
const p = getPool();
|
|
219
261
|
if (!p)
|
|
@@ -232,14 +274,19 @@ export async function supplierQualification(companyName) {
|
|
|
232
274
|
WHERE LOWER(company_name) LIKE LOWER($1)
|
|
233
275
|
ORDER BY issue_date DESC
|
|
234
276
|
LIMIT 20`, [`%${companyName}%`]);
|
|
235
|
-
// 483 inspections
|
|
236
|
-
const inspResult = await p.query(`SELECT
|
|
277
|
+
// 483 inspections (inspection_end_date is stored as Unix epoch)
|
|
278
|
+
const inspResult = await p.query(`SELECT
|
|
279
|
+
CASE WHEN inspection_end_date IS NOT NULL
|
|
280
|
+
THEN to_char(to_timestamp(inspection_end_date), 'YYYY-MM-DD')
|
|
281
|
+
ELSE ''
|
|
282
|
+
END AS inspection_date,
|
|
283
|
+
center, product_area, csa_relevant
|
|
237
284
|
FROM observation_483
|
|
238
285
|
WHERE LOWER(company_name) LIKE LOWER($1)
|
|
239
286
|
ORDER BY inspection_end_date DESC
|
|
240
287
|
LIMIT 20`, [`%${companyName}%`]);
|
|
241
288
|
// Citation summary
|
|
242
|
-
const citResult = await p.query(`SELECT c.cfr_full, c.normalized_category, COUNT(*) AS cnt
|
|
289
|
+
const citResult = await p.query(`SELECT COALESCE(c.cfr_full, 'N/A') AS cfr_full, c.normalized_category, COUNT(*) AS cnt
|
|
243
290
|
FROM citation c
|
|
244
291
|
JOIN warning_letter wl ON c.letter_id = wl.id
|
|
245
292
|
WHERE LOWER(wl.company_name) LIKE LOWER($1)
|
|
@@ -267,7 +314,7 @@ export async function supplierQualification(companyName) {
|
|
|
267
314
|
url: r.url ?? "",
|
|
268
315
|
})),
|
|
269
316
|
inspections: inspResult.rows.map((r) => ({
|
|
270
|
-
inspection_end_date: r.
|
|
317
|
+
inspection_end_date: r.inspection_date ?? "",
|
|
271
318
|
center: r.center ?? "",
|
|
272
319
|
product_area: r.product_area ?? "",
|
|
273
320
|
csa_relevant: r.csa_relevant ?? false,
|
package/dist/db.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"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"}
|
package/dist/fda-client.d.ts
CHANGED
|
@@ -1,22 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* openFDA API Client
|
|
3
3
|
*
|
|
4
|
-
* Wraps
|
|
5
|
-
* 1.
|
|
6
|
-
* 2.
|
|
7
|
-
* 3. openFDA Enforcement/Recalls API
|
|
4
|
+
* Wraps public openFDA data sources:
|
|
5
|
+
* 1. Enforcement/Recalls (drug, device, food)
|
|
6
|
+
* 2. Device Adverse Events (MAUDE database)
|
|
8
7
|
*/
|
|
9
|
-
export interface WarningLetter {
|
|
10
|
-
posted_date: string;
|
|
11
|
-
issue_date: string;
|
|
12
|
-
company_name: string;
|
|
13
|
-
issuing_office: string;
|
|
14
|
-
subject: string;
|
|
15
|
-
response_letter: string;
|
|
16
|
-
closeout_letter: string;
|
|
17
|
-
excerpt: string;
|
|
18
|
-
url: string;
|
|
19
|
-
}
|
|
20
8
|
export interface EnforcementRecord {
|
|
21
9
|
recall_number: string;
|
|
22
10
|
status: string;
|
|
@@ -37,58 +25,45 @@ export interface EnforcementRecord {
|
|
|
37
25
|
termination_date: string;
|
|
38
26
|
event_id: string;
|
|
39
27
|
}
|
|
40
|
-
export interface
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
url?: string;
|
|
28
|
+
export interface DeviceEventRecord {
|
|
29
|
+
report_number: string;
|
|
30
|
+
event_type: string;
|
|
31
|
+
date_received: string;
|
|
32
|
+
date_of_event: string;
|
|
33
|
+
device_name: string;
|
|
34
|
+
manufacturer: string;
|
|
35
|
+
brand_name: string;
|
|
36
|
+
product_code: string;
|
|
37
|
+
event_description: string;
|
|
38
|
+
patient_outcome: string[];
|
|
39
|
+
device_class: string;
|
|
53
40
|
}
|
|
54
|
-
export declare function
|
|
41
|
+
export declare function searchEnforcement(params: {
|
|
55
42
|
search?: string;
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
offset?: number;
|
|
59
|
-
date_from?: string;
|
|
60
|
-
date_to?: string;
|
|
61
|
-
}): Promise<{
|
|
62
|
-
total: number;
|
|
63
|
-
letters: WarningLetter[];
|
|
64
|
-
}>;
|
|
65
|
-
export declare function get483XlsxUrls(): Record<string, string>;
|
|
66
|
-
export declare function searchInspections(params: {
|
|
67
|
-
firm_name?: string;
|
|
43
|
+
product_type?: "drug" | "device" | "food";
|
|
44
|
+
classification?: "Class I" | "Class II" | "Class III";
|
|
68
45
|
state?: string;
|
|
69
|
-
|
|
70
|
-
project_area?: string;
|
|
71
|
-
limit?: number;
|
|
72
|
-
offset?: number;
|
|
46
|
+
recalling_firm?: string;
|
|
73
47
|
date_from?: string;
|
|
74
48
|
date_to?: string;
|
|
49
|
+
limit?: number;
|
|
50
|
+
skip?: number;
|
|
75
51
|
}): Promise<{
|
|
76
52
|
total: number;
|
|
77
|
-
|
|
78
|
-
note?: string;
|
|
53
|
+
records: EnforcementRecord[];
|
|
79
54
|
}>;
|
|
80
|
-
export declare function
|
|
55
|
+
export declare function searchDeviceEvents(params: {
|
|
81
56
|
search?: string;
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
57
|
+
manufacturer?: string;
|
|
58
|
+
brand_name?: string;
|
|
59
|
+
event_type?: "Injury" | "Malfunction" | "Death" | "Other";
|
|
60
|
+
product_code?: string;
|
|
86
61
|
date_from?: string;
|
|
87
62
|
date_to?: string;
|
|
88
63
|
limit?: number;
|
|
89
64
|
skip?: number;
|
|
90
65
|
}): Promise<{
|
|
91
66
|
total: number;
|
|
92
|
-
|
|
67
|
+
events: DeviceEventRecord[];
|
|
93
68
|
}>;
|
|
94
69
|
//# sourceMappingURL=fda-client.d.ts.map
|
package/dist/fda-client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fda-client.d.ts","sourceRoot":"","sources":["../src/fda-client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"fda-client.d.ts","sourceRoot":"","sources":["../src/fda-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,EAAE,MAAM,CAAC;IACzB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,0BAA0B,EAAE,MAAM,CAAC;IACnC,gBAAgB,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,EAAE,MAAM,CAAC;CACtB;AAID,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC1C,cAAc,CAAC,EAAE,SAAS,GAAG,UAAU,GAAG,WAAW,CAAC;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,iBAAiB,EAAE,CAAA;CAAE,CAAC,CAmE3D;AAID,wBAAsB,kBAAkB,CAAC,MAAM,EAAE;IAC/C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,QAAQ,GAAG,aAAa,GAAG,OAAO,GAAG,OAAO,CAAC;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,iBAAiB,EAAE,CAAA;CAAE,CAAC,CA0E1D"}
|
package/dist/fda-client.js
CHANGED
|
@@ -1,164 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* openFDA API Client
|
|
3
3
|
*
|
|
4
|
-
* Wraps
|
|
5
|
-
* 1.
|
|
6
|
-
* 2.
|
|
7
|
-
* 3. openFDA Enforcement/Recalls API
|
|
4
|
+
* Wraps public openFDA data sources:
|
|
5
|
+
* 1. Enforcement/Recalls (drug, device, food)
|
|
6
|
+
* 2. Device Adverse Events (MAUDE database)
|
|
8
7
|
*/
|
|
9
|
-
const FDA_BASE = "https://www.fda.gov";
|
|
10
8
|
const OPENFDA_BASE = "https://api.fda.gov";
|
|
11
|
-
// ─── Warning Letters (FDA.gov DataTables) ────────────────────────────────────
|
|
12
|
-
// Max pages to fetch when searching by company name (100 rows each).
|
|
13
|
-
// Balances coverage vs response time — 500 rows covers ~15% of the dataset.
|
|
14
|
-
const MAX_SEARCH_PAGES = 5;
|
|
15
|
-
async function fetchWarningLetterPage(search, start, length) {
|
|
16
|
-
const url = new URL("/datatables/views/ajax", FDA_BASE);
|
|
17
|
-
url.searchParams.set("view_name", "warning_letter_solr_index");
|
|
18
|
-
url.searchParams.set("view_display_id", "warning_letter_solr_block");
|
|
19
|
-
url.searchParams.set("view_base_path", "inspections-compliance-enforcement-and-criminal-investigations/compliance-actions-and-activities/warning-letters/datatables-data");
|
|
20
|
-
url.searchParams.set("draw", "1");
|
|
21
|
-
url.searchParams.set("start", String(start));
|
|
22
|
-
url.searchParams.set("length", String(length));
|
|
23
|
-
if (search) {
|
|
24
|
-
url.searchParams.set("search[value]", search);
|
|
25
|
-
}
|
|
26
|
-
const resp = await fetch(url.toString(), {
|
|
27
|
-
headers: {
|
|
28
|
-
Accept: "application/json",
|
|
29
|
-
"User-Agent": "fda-mcp-server/1.0",
|
|
30
|
-
},
|
|
31
|
-
});
|
|
32
|
-
if (!resp.ok) {
|
|
33
|
-
throw new Error(`FDA Warning Letters API returned ${resp.status}: ${resp.statusText}`);
|
|
34
|
-
}
|
|
35
|
-
const data = await resp.json();
|
|
36
|
-
const records = (data.data ?? []).map((row) => parseWarningLetterRow(row));
|
|
37
|
-
return { data, records };
|
|
38
|
-
}
|
|
39
|
-
function applyWarningLetterFilters(records, params) {
|
|
40
|
-
let filtered = records;
|
|
41
|
-
if (params.search) {
|
|
42
|
-
const searchTerm = params.search.toLowerCase();
|
|
43
|
-
filtered = filtered.filter((r) => r.company_name.toLowerCase().includes(searchTerm) ||
|
|
44
|
-
r.subject.toLowerCase().includes(searchTerm) ||
|
|
45
|
-
r.excerpt.toLowerCase().includes(searchTerm));
|
|
46
|
-
}
|
|
47
|
-
if (params.issuing_office) {
|
|
48
|
-
const office = params.issuing_office.toLowerCase();
|
|
49
|
-
filtered = filtered.filter((r) => r.issuing_office.toLowerCase().includes(office));
|
|
50
|
-
}
|
|
51
|
-
if (params.date_from || params.date_to) {
|
|
52
|
-
filtered = filtered.filter((r) => {
|
|
53
|
-
const d = r.issue_date;
|
|
54
|
-
if (params.date_from && d < params.date_from)
|
|
55
|
-
return false;
|
|
56
|
-
if (params.date_to && d > params.date_to)
|
|
57
|
-
return false;
|
|
58
|
-
return true;
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
return filtered;
|
|
62
|
-
}
|
|
63
|
-
export async function searchWarningLetters(params) {
|
|
64
|
-
const userLimit = Math.min(params.limit ?? 25, 100);
|
|
65
|
-
const offset = params.offset ?? 0;
|
|
66
|
-
const hasPostFilters = !!(params.search || params.issuing_office || params.date_from || params.date_to);
|
|
67
|
-
if (!hasPostFilters) {
|
|
68
|
-
// No filters — just fetch the requested page directly
|
|
69
|
-
const { data, records } = await fetchWarningLetterPage(undefined, offset, userLimit);
|
|
70
|
-
return {
|
|
71
|
-
total: data.recordsFiltered ?? data.recordsTotal ?? records.length,
|
|
72
|
-
letters: records,
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
// FDA.gov Solr search[value] only influences relevance ranking, not filtering.
|
|
76
|
-
// We must fetch rows and filter client-side. Page through up to MAX_SEARCH_PAGES
|
|
77
|
-
// batches of 100 to find enough matches.
|
|
78
|
-
const allFiltered = [];
|
|
79
|
-
let serverTotal = 0;
|
|
80
|
-
for (let page = 0; page < MAX_SEARCH_PAGES; page++) {
|
|
81
|
-
const start = offset + page * 100;
|
|
82
|
-
const { data, records } = await fetchWarningLetterPage(params.search, start, 100);
|
|
83
|
-
if (page === 0) {
|
|
84
|
-
serverTotal = data.recordsFiltered ?? data.recordsTotal ?? 0;
|
|
85
|
-
}
|
|
86
|
-
if (records.length === 0)
|
|
87
|
-
break; // no more data
|
|
88
|
-
const matches = applyWarningLetterFilters(records, params);
|
|
89
|
-
allFiltered.push(...matches);
|
|
90
|
-
// Stop early if we have enough results
|
|
91
|
-
if (allFiltered.length >= userLimit)
|
|
92
|
-
break;
|
|
93
|
-
// Stop if we've exhausted the server's data
|
|
94
|
-
if (start + 100 >= serverTotal)
|
|
95
|
-
break;
|
|
96
|
-
}
|
|
97
|
-
return {
|
|
98
|
-
total: allFiltered.length,
|
|
99
|
-
letters: allFiltered.slice(0, userLimit),
|
|
100
|
-
};
|
|
101
|
-
}
|
|
102
|
-
function parseWarningLetterRow(row) {
|
|
103
|
-
// DataTables rows come as arrays or objects depending on config
|
|
104
|
-
if (Array.isArray(row)) {
|
|
105
|
-
return {
|
|
106
|
-
posted_date: stripHtml(row[0] ?? ""),
|
|
107
|
-
issue_date: stripHtml(row[1] ?? ""),
|
|
108
|
-
company_name: stripHtml(row[2] ?? ""),
|
|
109
|
-
issuing_office: stripHtml(row[3] ?? ""),
|
|
110
|
-
subject: stripHtml(row[4] ?? ""),
|
|
111
|
-
response_letter: stripHtml(row[5] ?? ""),
|
|
112
|
-
closeout_letter: stripHtml(row[6] ?? ""),
|
|
113
|
-
excerpt: stripHtml(row[7] ?? ""),
|
|
114
|
-
url: extractHref(row[2] ?? "") || extractHref(row[4] ?? ""),
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
// Object format
|
|
118
|
-
return {
|
|
119
|
-
posted_date: stripHtml(row.field_letter_posted_date ?? row.posted_date ?? ""),
|
|
120
|
-
issue_date: stripHtml(row.field_letter_issue_datetime ?? row.issue_date ?? ""),
|
|
121
|
-
company_name: stripHtml(row.field_company_name_warning_lette ?? row.company_name ?? ""),
|
|
122
|
-
issuing_office: stripHtml(row.field_issuing_office ?? row.issuing_office ?? ""),
|
|
123
|
-
subject: stripHtml(row.field_subject ?? row.subject ?? ""),
|
|
124
|
-
response_letter: stripHtml(row.field_response_letter_date ?? row.response_letter ?? ""),
|
|
125
|
-
closeout_letter: stripHtml(row.field_closeout_letter_date ?? row.closeout_letter ?? ""),
|
|
126
|
-
excerpt: stripHtml(row.field_letter_body ?? row.excerpt ?? ""),
|
|
127
|
-
url: extractHref(row.field_company_name_warning_lette ?? row.field_subject ?? ""),
|
|
128
|
-
};
|
|
129
|
-
}
|
|
130
|
-
// ─── 483 Inspections ─────────────────────────────────────────────────────────
|
|
131
|
-
//
|
|
132
|
-
// FDA removed the DataTables AJAX endpoint for 483 observations. The page now
|
|
133
|
-
// only offers annual XLSX downloads (FY2006–FY2025). Live search is not
|
|
134
|
-
// possible. This function queries the enriched fda-csa-data PostgreSQL dataset
|
|
135
|
-
// when DATABASE_URL is set, or returns a helpful message pointing to XLSX
|
|
136
|
-
// downloads and the enriched dataset.
|
|
137
|
-
const FDA_483_XLSX_URLS = {
|
|
138
|
-
"2025": "https://www.fda.gov/media/190190/download?attachment",
|
|
139
|
-
"2024": "https://www.fda.gov/media/185090/download?attachment",
|
|
140
|
-
"2023": "https://www.fda.gov/media/174101/download?attachment",
|
|
141
|
-
"2022": "https://www.fda.gov/media/163420/download?attachment",
|
|
142
|
-
"2021": "https://www.fda.gov/media/153238/download?attachment",
|
|
143
|
-
};
|
|
144
|
-
export function get483XlsxUrls() {
|
|
145
|
-
return FDA_483_XLSX_URLS;
|
|
146
|
-
}
|
|
147
|
-
export async function searchInspections(params) {
|
|
148
|
-
// FDA removed the live DataTables endpoint — no live search available.
|
|
149
|
-
// Return empty with an explanation so the tool handler can provide guidance.
|
|
150
|
-
return {
|
|
151
|
-
total: 0,
|
|
152
|
-
inspections: [],
|
|
153
|
-
note: "FDA removed the live 483 inspection search endpoint. 483 observation data is now only available as annual XLSX downloads from FDA.gov, or via the enriched fda-csa-data dataset (use csa_risk_assessment or supplier_qualification_report tools for 483 data).",
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
9
|
// ─── openFDA Enforcement (Recalls) ───────────────────────────────────────────
|
|
157
10
|
export async function searchEnforcement(params) {
|
|
158
11
|
const product = params.product_type ?? "drug";
|
|
159
12
|
const limit = Math.min(params.limit ?? 25, 100);
|
|
160
13
|
const skip = params.skip ?? 0;
|
|
161
|
-
// Build openFDA search query
|
|
162
14
|
const searchParts = [];
|
|
163
15
|
if (params.search) {
|
|
164
16
|
searchParts.push(`"${params.search}"`);
|
|
@@ -184,17 +36,14 @@ export async function searchEnforcement(params) {
|
|
|
184
36
|
url.searchParams.set("limit", String(limit));
|
|
185
37
|
url.searchParams.set("skip", String(skip));
|
|
186
38
|
const resp = await fetch(url.toString(), {
|
|
187
|
-
headers: {
|
|
188
|
-
"User-Agent": "fda-mcp-server/1.0",
|
|
189
|
-
},
|
|
39
|
+
headers: { "User-Agent": "fda-mcp-server/1.0" },
|
|
190
40
|
});
|
|
191
41
|
if (!resp.ok) {
|
|
192
|
-
if (resp.status === 404)
|
|
42
|
+
if (resp.status === 404)
|
|
193
43
|
return { total: 0, records: [] };
|
|
194
|
-
}
|
|
195
44
|
throw new Error(`openFDA enforcement API returned ${resp.status}: ${resp.statusText}`);
|
|
196
45
|
}
|
|
197
|
-
const data = await resp.json();
|
|
46
|
+
const data = (await resp.json());
|
|
198
47
|
const records = (data.results ?? []).map((r) => ({
|
|
199
48
|
recall_number: r.recall_number ?? "",
|
|
200
49
|
status: r.status ?? "",
|
|
@@ -220,25 +69,72 @@ export async function searchEnforcement(params) {
|
|
|
220
69
|
records,
|
|
221
70
|
};
|
|
222
71
|
}
|
|
223
|
-
// ───
|
|
224
|
-
function
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
.
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
.
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
if (
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
if (
|
|
241
|
-
|
|
242
|
-
|
|
72
|
+
// ─── openFDA Device Adverse Events (MAUDE) ───────────────────────────────────
|
|
73
|
+
export async function searchDeviceEvents(params) {
|
|
74
|
+
const limit = Math.min(params.limit ?? 25, 100);
|
|
75
|
+
const skip = params.skip ?? 0;
|
|
76
|
+
const searchParts = [];
|
|
77
|
+
if (params.search) {
|
|
78
|
+
searchParts.push(`"${params.search}"`);
|
|
79
|
+
}
|
|
80
|
+
if (params.manufacturer) {
|
|
81
|
+
searchParts.push(`device.manufacturer_d_name:"${params.manufacturer}"`);
|
|
82
|
+
}
|
|
83
|
+
if (params.brand_name) {
|
|
84
|
+
searchParts.push(`device.brand_name:"${params.brand_name}"`);
|
|
85
|
+
}
|
|
86
|
+
if (params.event_type) {
|
|
87
|
+
searchParts.push(`event_type:"${params.event_type}"`);
|
|
88
|
+
}
|
|
89
|
+
if (params.product_code) {
|
|
90
|
+
searchParts.push(`device.generic_name:"${params.product_code}"`);
|
|
91
|
+
}
|
|
92
|
+
if (params.date_from || params.date_to) {
|
|
93
|
+
const from = params.date_from?.replace(/-/g, "") ?? "19000101";
|
|
94
|
+
const to = params.date_to?.replace(/-/g, "") ?? "20991231";
|
|
95
|
+
searchParts.push(`date_received:[${from}+TO+${to}]`);
|
|
96
|
+
}
|
|
97
|
+
const url = new URL("/device/event.json", OPENFDA_BASE);
|
|
98
|
+
if (searchParts.length > 0) {
|
|
99
|
+
url.searchParams.set("search", searchParts.join("+AND+"));
|
|
100
|
+
}
|
|
101
|
+
url.searchParams.set("limit", String(limit));
|
|
102
|
+
url.searchParams.set("skip", String(skip));
|
|
103
|
+
const resp = await fetch(url.toString(), {
|
|
104
|
+
headers: { "User-Agent": "fda-mcp-server/1.0" },
|
|
105
|
+
});
|
|
106
|
+
if (!resp.ok) {
|
|
107
|
+
if (resp.status === 404)
|
|
108
|
+
return { total: 0, events: [] };
|
|
109
|
+
throw new Error(`openFDA device events API returned ${resp.status}: ${resp.statusText}`);
|
|
110
|
+
}
|
|
111
|
+
const data = (await resp.json());
|
|
112
|
+
const events = (data.results ?? []).map((r) => {
|
|
113
|
+
const device = r.device?.[0] ?? {};
|
|
114
|
+
const description = (r.mdr_text ?? [])
|
|
115
|
+
.map((t) => t.text ?? "")
|
|
116
|
+
.filter(Boolean)
|
|
117
|
+
.join(" ")
|
|
118
|
+
.substring(0, 500) || "";
|
|
119
|
+
return {
|
|
120
|
+
report_number: r.report_number ?? "",
|
|
121
|
+
event_type: r.event_type ?? "",
|
|
122
|
+
date_received: r.date_received ?? "",
|
|
123
|
+
date_of_event: r.date_of_event ?? "",
|
|
124
|
+
device_name: device.generic_name ?? "",
|
|
125
|
+
manufacturer: device.manufacturer_d_name ?? "",
|
|
126
|
+
brand_name: device.brand_name ?? "",
|
|
127
|
+
product_code: device.device_report_product_code ?? "",
|
|
128
|
+
event_description: description,
|
|
129
|
+
patient_outcome: r.patient?.[0]?.patient_sequence_number
|
|
130
|
+
? (r.patient ?? []).map((p) => p.sequence_number_outcome?.[0] ?? "").filter(Boolean)
|
|
131
|
+
: [],
|
|
132
|
+
device_class: device.device_class ?? "",
|
|
133
|
+
};
|
|
134
|
+
});
|
|
135
|
+
return {
|
|
136
|
+
total: data.meta?.results?.total ?? events.length,
|
|
137
|
+
events,
|
|
138
|
+
};
|
|
243
139
|
}
|
|
244
140
|
//# sourceMappingURL=fda-client.js.map
|