@cyanheads/openfda-mcp-server 0.1.7 → 0.1.8
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/CLAUDE.md +1 -1
- package/README.md +3 -3
- package/dist/mcp-server/tools/definitions/get-drug-label.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/get-drug-label.tool.js +32 -19
- package/dist/mcp-server/tools/definitions/get-drug-label.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/lookup-ndc.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/lookup-ndc.tool.js +15 -1
- package/dist/mcp-server/tools/definitions/lookup-ndc.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-adverse-events.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-adverse-events.tool.js +68 -29
- package/dist/mcp-server/tools/definitions/search-adverse-events.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-device-clearances.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-device-clearances.tool.js +30 -1
- package/dist/mcp-server/tools/definitions/search-device-clearances.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-drug-approvals.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-drug-approvals.tool.js +19 -1
- package/dist/mcp-server/tools/definitions/search-drug-approvals.tool.js.map +1 -1
- package/dist/mcp-server/tools/definitions/search-recalls.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/definitions/search-recalls.tool.js +16 -7
- package/dist/mcp-server/tools/definitions/search-recalls.tool.js.map +1 -1
- package/dist/mcp-server/tools/format-utils.d.ts +14 -0
- package/dist/mcp-server/tools/format-utils.d.ts.map +1 -0
- package/dist/mcp-server/tools/format-utils.js +31 -0
- package/dist/mcp-server/tools/format-utils.js.map +1 -0
- package/package.json +1 -1
- package/server.json +3 -3
package/CLAUDE.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Agent Protocol
|
|
2
2
|
|
|
3
3
|
**Server:** openfda-mcp-server
|
|
4
|
-
**Version:** 0.1.
|
|
4
|
+
**Version:** 0.1.8
|
|
5
5
|
**Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core)
|
|
6
6
|
|
|
7
7
|
> **Read the framework docs first:** `node_modules/@cyanheads/mcp-ts-core/CLAUDE.md` contains the full API reference — builders, Context, error codes, exports, patterns. This file covers server-specific conventions only.
|
package/README.md
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
<div align="center">
|
|
9
9
|
|
|
10
|
-
[](https://www.npmjs.com/package/@cyanheads/openfda-mcp-server) [](https://www.npmjs.com/package/@cyanheads/openfda-mcp-server) [](./CHANGELOG.md) [](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) [](https://modelcontextprotocol.io/)
|
|
11
11
|
|
|
12
12
|
[](./LICENSE) [](https://www.typescriptlang.org/) [](https://bun.sh/)
|
|
13
13
|
|
|
@@ -42,7 +42,7 @@ Search adverse event reports across drugs, food, and devices. Use to investigate
|
|
|
42
42
|
- Category selection: `drug`, `food`, or `device` — each returns different field schemas
|
|
43
43
|
- Elasticsearch query syntax for filtering by product, reaction, seriousness, date range
|
|
44
44
|
- Pagination via `limit` (up to 1000) and `skip` (up to 25000)
|
|
45
|
-
- Formatted output includes report ID, seriousness, patient demographics, reactions,
|
|
45
|
+
- Formatted output includes report ID, seriousness, patient demographics, reactions, drugs with characterization/indication/route, and all remaining fields
|
|
46
46
|
|
|
47
47
|
---
|
|
48
48
|
|
|
@@ -82,7 +82,7 @@ Search FDA device premarket notifications — 510(k) clearances and PMA approval
|
|
|
82
82
|
Look up FDA drug labeling (package inserts / SPL documents). Check indications, warnings, dosage, contraindications, active ingredients, or any structured label section.
|
|
83
83
|
|
|
84
84
|
- Search by brand name, generic name, manufacturer, or set ID
|
|
85
|
-
- Formatted output
|
|
85
|
+
- Formatted output dynamically renders all label sections and openfda metadata present in the record
|
|
86
86
|
- Large sections are automatically truncated to keep output readable
|
|
87
87
|
- Default limit of 5 — labels are large documents
|
|
88
88
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-drug-label.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-drug-label.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"get-drug-label.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-drug-label.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAMjD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;kBAwH3B,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* @module mcp-server/tools/definitions/get-drug-label
|
|
4
4
|
*/
|
|
5
5
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { humanizeField } from '../../../mcp-server/tools/format-utils.js';
|
|
6
7
|
import { getOpenFdaService } from '../../../services/openfda/openfda-service.js';
|
|
7
8
|
const ENDPOINT = 'drug/label';
|
|
8
9
|
export const getDrugLabelTool = tool('openfda_get_drug_label', {
|
|
@@ -12,7 +13,10 @@ export const getDrugLabelTool = tool('openfda_get_drug_label', {
|
|
|
12
13
|
search: z
|
|
13
14
|
.string()
|
|
14
15
|
.describe('Query targeting label fields. Examples: openfda.brand_name:"aspirin", openfda.generic_name:"metformin", openfda.manufacturer_name:"pfizer", set_id:"uuid".'),
|
|
15
|
-
sort: z
|
|
16
|
+
sort: z
|
|
17
|
+
.string()
|
|
18
|
+
.optional()
|
|
19
|
+
.describe('Sort expression (field:asc or field:desc). Example: effective_time:desc. Unrecognized fields are silently ignored by the API — results return in default order.'),
|
|
16
20
|
limit: z
|
|
17
21
|
.number()
|
|
18
22
|
.min(1)
|
|
@@ -66,33 +70,42 @@ export const getDrugLabelTool = tool('openfda_get_drug_label', {
|
|
|
66
70
|
const lines = [
|
|
67
71
|
`**${result.meta.total.toLocaleString()} total labels** (showing ${result.results.length}, skip: ${result.meta.skip}) | Data updated: ${result.meta.lastUpdated}\n`,
|
|
68
72
|
];
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
['Indications & Usage', 'indications_and_usage'],
|
|
72
|
-
['Dosage & Administration', 'dosage_and_administration'],
|
|
73
|
-
['Warnings', 'warnings'],
|
|
74
|
-
['Contraindications', 'contraindications'],
|
|
75
|
-
['Adverse Reactions', 'adverse_reactions'],
|
|
76
|
-
['Drug Interactions', 'drug_interactions'],
|
|
77
|
-
['Active Ingredient', 'active_ingredient'],
|
|
78
|
-
];
|
|
73
|
+
/** Keys rendered in the header block — skipped during section iteration. */
|
|
74
|
+
const metaKeys = new Set(['openfda', 'set_id', 'id', 'version', 'effective_time']);
|
|
79
75
|
for (const r of result.results) {
|
|
80
|
-
const openfda = r.openfda ?? {};
|
|
76
|
+
const openfda = (r.openfda ?? {});
|
|
81
77
|
const brandName = (openfda.brand_name ?? [])[0] ?? 'Unknown';
|
|
82
78
|
const genericName = (openfda.generic_name ?? [])[0];
|
|
83
79
|
const manufacturer = (openfda.manufacturer_name ?? [])[0];
|
|
84
80
|
lines.push(`### ${brandName}${genericName ? ` (${genericName})` : ''}`);
|
|
85
81
|
if (manufacturer)
|
|
86
82
|
lines.push(`**Manufacturer:** ${manufacturer}`);
|
|
87
|
-
if (
|
|
88
|
-
lines.push(`**
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
83
|
+
if (r.effective_time)
|
|
84
|
+
lines.push(`**Effective date:** ${r.effective_time}`);
|
|
85
|
+
if (r.set_id)
|
|
86
|
+
lines.push(`**Set ID:** ${r.set_id}${r.version ? ` (v${r.version})` : ''}`);
|
|
87
|
+
// All openfda fields beyond the header ones
|
|
88
|
+
const renderedOpenfda = new Set(['brand_name', 'generic_name', 'manufacturer_name']);
|
|
89
|
+
for (const [key, val] of Object.entries(openfda)) {
|
|
90
|
+
if (renderedOpenfda.has(key) || val == null)
|
|
91
|
+
continue;
|
|
92
|
+
const display = Array.isArray(val) ? val.join(', ') : String(val);
|
|
93
|
+
if (display)
|
|
94
|
+
lines.push(`**${humanizeField(key)}:** ${display}`);
|
|
95
|
+
}
|
|
96
|
+
// All label sections present in the record (not just a hardcoded subset)
|
|
97
|
+
for (const [key, value] of Object.entries(r)) {
|
|
98
|
+
if (metaKeys.has(key) || value == null)
|
|
99
|
+
continue;
|
|
100
|
+
const text = Array.isArray(value)
|
|
101
|
+
? value.join('\n')
|
|
102
|
+
: typeof value === 'object'
|
|
103
|
+
? JSON.stringify(value)
|
|
104
|
+
: String(value);
|
|
105
|
+
if (!text)
|
|
92
106
|
continue;
|
|
93
|
-
const text = Array.isArray(val) ? val.join('\n') : String(val);
|
|
94
107
|
const truncated = text.length > 1000 ? `${text.slice(0, 1000)}... (truncated)` : text;
|
|
95
|
-
lines.push(`\n**${
|
|
108
|
+
lines.push(`\n**${humanizeField(key)}:**\n${truncated}`);
|
|
96
109
|
}
|
|
97
110
|
lines.push('\n---\n');
|
|
98
111
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-drug-label.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-drug-label.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE1E,MAAM,QAAQ,GAAG,YAAY,CAAC;AAE9B,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,wBAAwB,EAAE;IAC7D,WAAW,EACT,2KAA2K;IAC7K,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;IAEnC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,CACP,4JAA4J,CAC7J;QACH,IAAI,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"get-drug-label.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/get-drug-label.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE1E,MAAM,QAAQ,GAAG,YAAY,CAAC;AAE9B,MAAM,CAAC,MAAM,gBAAgB,GAAG,IAAI,CAAC,wBAAwB,EAAE;IAC7D,WAAW,EACT,2KAA2K;IAC7K,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;IAEnC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,CACP,4JAA4J,CAC7J;QACH,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,iKAAiK,CAClK;QACH,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,IAAI,CAAC;aACT,OAAO,CAAC,CAAC,CAAC;aACV,QAAQ,CAAC,4EAA4E,CAAC;QACzF,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,GAAG,CAAC,CAAC,CAAC;aACN,GAAG,CAAC,KAAK,CAAC;aACV,OAAO,CAAC,CAAC,CAAC;aACV,QAAQ,CAAC,gEAAgE,CAAC;KAC9E,CAAC;IAEF,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC;QACf,IAAI,EAAE,CAAC;aACJ,MAAM,CAAC;YACN,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;YACpE,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;YACvD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uCAAuC,CAAC;YACnE,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;SACvE,CAAC;aACD,QAAQ,CAAC,oCAAoC,CAAC;QACjD,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,8BAA8B,CAAC;QACxF,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,mDAAmD,CAAC;KAC7F,CAAC;IAEF,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG;QACtB,MAAM,OAAO,GAAG,iBAAiB,EAAE,CAAC;QACpC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,KAAK,CAClC,QAAQ,EACR;YACE,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,IAAI,EAAE,KAAK,CAAC,IAAI;SACjB,EACD,GAAG,CACJ,CAAC;QAEF,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,6BAA6B,EAAE;YAC1C,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK;YAC1B,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM;SAClC,CAAC,CAAC;QAEH,OAAO;YACL,IAAI,EAAE,QAAQ,CAAC,IAAI;YACnB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI;gBACnC,OAAO,EAAE,oBAAoB,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,sHAAsH;aAClM,CAAC;SACH,CAAC;IACJ,CAAC;IAED,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;QACjB,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,MAAM,CAAC,OAAO,IAAI,kBAAkB,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,MAAM,KAAK,GAAa;YACtB,KAAK,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,4BAA4B,MAAM,CAAC,OAAO,CAAC,MAAM,WAAW,MAAM,CAAC,IAAI,CAAC,IAAI,qBAAqB,MAAM,CAAC,IAAI,CAAC,WAAW,IAAI;SACpK,CAAC;QAEF,4EAA4E;QAC5E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC;QAEnF,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAA4B,CAAC;YAC7D,MAAM,SAAS,GAAG,CAAE,OAAO,CAAC,UAAuB,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;YAC3E,MAAM,WAAW,GAAG,CAAE,OAAO,CAAC,YAAyB,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAClE,MAAM,YAAY,GAAG,CAAE,OAAO,CAAC,iBAA8B,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YAExE,KAAK,CAAC,IAAI,CAAC,OAAO,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,KAAK,WAAW,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACxE,IAAI,YAAY;gBAAE,KAAK,CAAC,IAAI,CAAC,qBAAqB,YAAY,EAAE,CAAC,CAAC;YAClE,IAAI,CAAC,CAAC,cAAc;gBAAE,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC;YAC5E,IAAI,CAAC,CAAC,MAAM;gBAAE,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAE1F,4CAA4C;YAC5C,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,CAAC,YAAY,EAAE,cAAc,EAAE,mBAAmB,CAAC,CAAC,CAAC;YACrF,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjD,IAAI,eAAe,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,IAAI;oBAAE,SAAS;gBACtD,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAE,GAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChF,IAAI,OAAO;oBAAE,KAAK,CAAC,IAAI,CAAC,KAAK,aAAa,CAAC,GAAG,CAAC,OAAO,OAAO,EAAE,CAAC,CAAC;YACnE,CAAC;YAED,yEAAyE;YACzE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7C,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI;oBAAE,SAAS;gBACjD,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;oBAC/B,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC;oBAClB,CAAC,CAAC,OAAO,KAAK,KAAK,QAAQ;wBACzB,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;wBACvB,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBACpB,IAAI,CAAC,IAAI;oBAAE,SAAS;gBACpB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC;gBACtF,KAAK,CAAC,IAAI,CAAC,OAAO,aAAa,CAAC,GAAG,CAAC,QAAQ,SAAS,EAAE,CAAC,CAAC;YAC3D,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACxB,CAAC;QAED,OAAO,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lookup-ndc.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/lookup-ndc.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"lookup-ndc.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/lookup-ndc.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAIjD,eAAO,MAAM,aAAa;;;;;;;;;;;;;;kBA8HxB,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* @module mcp-server/tools/definitions/lookup-ndc
|
|
4
4
|
*/
|
|
5
5
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { formatRemainingFields } from '../../../mcp-server/tools/format-utils.js';
|
|
6
7
|
import { getOpenFdaService } from '../../../services/openfda/openfda-service.js';
|
|
7
8
|
export const lookupNdcTool = tool('openfda_lookup_ndc', {
|
|
8
9
|
description: 'Look up drugs in the NDC (National Drug Code) Directory. Identify drug products by NDC code, find active ingredients, packaging details, or manufacturer info.',
|
|
@@ -14,7 +15,7 @@ export const lookupNdcTool = tool('openfda_lookup_ndc', {
|
|
|
14
15
|
sort: z
|
|
15
16
|
.string()
|
|
16
17
|
.optional()
|
|
17
|
-
.describe('Sort field
|
|
18
|
+
.describe('Sort expression (field:asc or field:desc). Example: listing_expiration_date:desc. Unrecognized fields are silently ignored by the API — results return in default order.'),
|
|
18
19
|
limit: z
|
|
19
20
|
.number()
|
|
20
21
|
.min(1)
|
|
@@ -68,6 +69,18 @@ export const lookupNdcTool = tool('openfda_lookup_ndc', {
|
|
|
68
69
|
const lines = [
|
|
69
70
|
`**${result.meta.total.toLocaleString()} total results** (showing ${result.results.length}, skip: ${result.meta.skip}) | Data updated: ${result.meta.lastUpdated}\n`,
|
|
70
71
|
];
|
|
72
|
+
const rendered = new Set([
|
|
73
|
+
'brand_name',
|
|
74
|
+
'generic_name',
|
|
75
|
+
'product_ndc',
|
|
76
|
+
'labeler_name',
|
|
77
|
+
'dosage_form',
|
|
78
|
+
'route',
|
|
79
|
+
'marketing_category',
|
|
80
|
+
'active_ingredients',
|
|
81
|
+
'packaging',
|
|
82
|
+
'listing_expiration_date',
|
|
83
|
+
]);
|
|
71
84
|
for (const r of result.results) {
|
|
72
85
|
const title = r.brand_name ?? r.generic_name ?? r.product_ndc ?? 'Unknown';
|
|
73
86
|
lines.push(`### ${title}`);
|
|
@@ -93,6 +106,7 @@ export const lookupNdcTool = tool('openfda_lookup_ndc', {
|
|
|
93
106
|
}
|
|
94
107
|
if (r.listing_expiration_date)
|
|
95
108
|
lines.push(`**Listing expires:** ${r.listing_expiration_date}`);
|
|
109
|
+
lines.push(...formatRemainingFields(r, rendered));
|
|
96
110
|
lines.push('');
|
|
97
111
|
}
|
|
98
112
|
return [{ type: 'text', text: lines.join('\n') }];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lookup-ndc.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/lookup-ndc.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE1E,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,EAAE;IACtD,WAAW,EACT,gKAAgK;IAClK,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;IAEnC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,CACP,kLAAkL,CACnL;QACH,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,
|
|
1
|
+
{"version":3,"file":"lookup-ndc.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/lookup-ndc.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-adverse-events.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-adverse-events.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"search-adverse-events.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-adverse-events.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAIjD,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;kBAoNlC,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* @module mcp-server/tools/definitions/search-adverse-events
|
|
4
4
|
*/
|
|
5
5
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { formatRemainingFields, truncate } from '../../../mcp-server/tools/format-utils.js';
|
|
6
7
|
import { getOpenFdaService } from '../../../services/openfda/openfda-service.js';
|
|
7
8
|
export const searchAdverseEventsTool = tool('openfda_search_adverse_events', {
|
|
8
9
|
description: 'Search adverse event reports across drugs, food, and devices. Use to investigate safety signals, find reports for a specific product, or explore reactions by demographics.',
|
|
@@ -15,7 +16,10 @@ export const searchAdverseEventsTool = tool('openfda_search_adverse_events', {
|
|
|
15
16
|
.string()
|
|
16
17
|
.optional()
|
|
17
18
|
.describe('Elasticsearch query string. Examples: patient.drug.medicinalproduct:"aspirin", patient.reaction.reactionmeddrapt:"nausea" AND serious:"1". Omit to browse recent.'),
|
|
18
|
-
sort: z
|
|
19
|
+
sort: z
|
|
20
|
+
.string()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe('Sort expression (field:asc or field:desc). Example: receivedate:desc. Unrecognized fields are silently ignored by the API — results return in default order.'),
|
|
19
23
|
limit: z
|
|
20
24
|
.number()
|
|
21
25
|
.min(1)
|
|
@@ -83,26 +87,40 @@ export const searchAdverseEventsTool = tool('openfda_search_adverse_events', {
|
|
|
83
87
|
.map((rx) => rx.reactionmeddrapt)
|
|
84
88
|
.filter(Boolean)
|
|
85
89
|
.join(', ');
|
|
86
|
-
const drugs = (patient.drug ?? [])
|
|
87
|
-
.map((d) => {
|
|
88
|
-
const char = d.drugcharacterization === '1'
|
|
89
|
-
? 'Suspect'
|
|
90
|
-
: d.drugcharacterization === '2'
|
|
91
|
-
? 'Concomitant'
|
|
92
|
-
: d.drugcharacterization === '3'
|
|
93
|
-
? 'Interacting'
|
|
94
|
-
: '';
|
|
95
|
-
return `${d.medicinalproduct ?? 'Unknown'}${char ? ` (${char})` : ''}`;
|
|
96
|
-
})
|
|
97
|
-
.join(', ');
|
|
98
90
|
lines.push(`### Report ${r.safetyreportid ?? 'N/A'}`);
|
|
99
91
|
lines.push(`**Date:** ${r.receivedate ?? 'N/A'} | **Serious:** ${r.serious === '1' ? 'Yes' : r.serious === '2' ? 'No' : (r.serious ?? 'N/A')}`);
|
|
100
92
|
if (patient.patientsex)
|
|
101
93
|
lines.push(`**Patient:** Sex ${patient.patientsex === '1' ? 'Male' : patient.patientsex === '2' ? 'Female' : patient.patientsex}`);
|
|
102
94
|
if (reactions)
|
|
103
95
|
lines.push(`**Reactions:** ${reactions}`);
|
|
104
|
-
|
|
105
|
-
|
|
96
|
+
// Drugs — expanded with indication and route
|
|
97
|
+
const drugList = (patient.drug ?? []);
|
|
98
|
+
if (drugList.length > 0) {
|
|
99
|
+
lines.push('**Drugs:**');
|
|
100
|
+
for (const d of drugList) {
|
|
101
|
+
const char = d.drugcharacterization === '1'
|
|
102
|
+
? 'Suspect'
|
|
103
|
+
: d.drugcharacterization === '2'
|
|
104
|
+
? 'Concomitant'
|
|
105
|
+
: d.drugcharacterization === '3'
|
|
106
|
+
? 'Interacting'
|
|
107
|
+
: '';
|
|
108
|
+
const detail = [
|
|
109
|
+
char,
|
|
110
|
+
d.drugindication ? `for ${d.drugindication}` : null,
|
|
111
|
+
d.drugadministrationroute ? `via ${d.drugadministrationroute}` : null,
|
|
112
|
+
]
|
|
113
|
+
.filter(Boolean)
|
|
114
|
+
.join(', ');
|
|
115
|
+
lines.push(`- ${d.medicinalproduct ?? 'Unknown'}${detail ? ` (${detail})` : ''}`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Remaining patient fields (age, weight, death, etc.)
|
|
119
|
+
const renderedPatient = new Set(['reaction', 'drug', 'patientsex']);
|
|
120
|
+
lines.push(...formatRemainingFields(patient, renderedPatient));
|
|
121
|
+
// Remaining top-level fields (companynumb, sender, primarysource, etc.)
|
|
122
|
+
const renderedTop = new Set(['patient', 'safetyreportid', 'receivedate', 'serious']);
|
|
123
|
+
lines.push(...formatRemainingFields(r, renderedTop));
|
|
106
124
|
}
|
|
107
125
|
// Device adverse events
|
|
108
126
|
else if (r.device) {
|
|
@@ -110,16 +128,25 @@ export const searchAdverseEventsTool = tool('openfda_search_adverse_events', {
|
|
|
110
128
|
if (r.event_type)
|
|
111
129
|
lines.push(`**Event type:** ${r.event_type}`);
|
|
112
130
|
for (const d of Array.isArray(r.device) ? r.device : []) {
|
|
131
|
+
const renderedDevice = new Set(['brand_name', 'generic_name', 'manufacturer_d_name']);
|
|
113
132
|
lines.push(`**Device:** ${d.brand_name ?? d.generic_name ?? 'Unknown'}${d.manufacturer_d_name ? ` by ${d.manufacturer_d_name}` : ''}`);
|
|
133
|
+
lines.push(...formatRemainingFields(d, renderedDevice));
|
|
114
134
|
}
|
|
115
|
-
const
|
|
116
|
-
.
|
|
117
|
-
|
|
118
|
-
.
|
|
119
|
-
|
|
120
|
-
const narrative = texts.join(' ');
|
|
121
|
-
lines.push(`**Narrative:** ${narrative.length > 500 ? `${narrative.slice(0, 500)}...` : narrative}`);
|
|
135
|
+
for (const t of (r.mdr_text ?? [])) {
|
|
136
|
+
if (!t.text)
|
|
137
|
+
continue;
|
|
138
|
+
const label = t.text_type_code ? `Narrative (${t.text_type_code})` : 'Narrative';
|
|
139
|
+
lines.push(`**${label}:** ${truncate(t.text, 500)}`);
|
|
122
140
|
}
|
|
141
|
+
// Remaining top-level fields (date_of_event, source_type, patient, etc.)
|
|
142
|
+
const renderedTop = new Set([
|
|
143
|
+
'device',
|
|
144
|
+
'report_number',
|
|
145
|
+
'mdr_report_key',
|
|
146
|
+
'event_type',
|
|
147
|
+
'mdr_text',
|
|
148
|
+
]);
|
|
149
|
+
lines.push(...formatRemainingFields(r, renderedTop));
|
|
123
150
|
}
|
|
124
151
|
// Food adverse events
|
|
125
152
|
else if (r.products || r.reactions) {
|
|
@@ -128,16 +155,28 @@ export const searchAdverseEventsTool = tool('openfda_search_adverse_events', {
|
|
|
128
155
|
lines.push(`**Reactions:** ${(Array.isArray(r.reactions) ? r.reactions : [r.reactions]).join(', ')}`);
|
|
129
156
|
if (r.outcomes)
|
|
130
157
|
lines.push(`**Outcomes:** ${(Array.isArray(r.outcomes) ? r.outcomes : [r.outcomes]).join(', ')}`);
|
|
131
|
-
const
|
|
132
|
-
|
|
133
|
-
.
|
|
134
|
-
|
|
135
|
-
|
|
158
|
+
const productsList = (r.products ?? []);
|
|
159
|
+
if (productsList.length > 0) {
|
|
160
|
+
lines.push('**Products:**');
|
|
161
|
+
for (const p of productsList) {
|
|
162
|
+
const name = p.name_brand ?? p.industry_name ?? 'Unknown';
|
|
163
|
+
const detail = [
|
|
164
|
+
p.role ? `role: ${p.role}` : null,
|
|
165
|
+
p.industry_code ? `code: ${p.industry_code}` : null,
|
|
166
|
+
]
|
|
167
|
+
.filter(Boolean)
|
|
168
|
+
.join(', ');
|
|
169
|
+
lines.push(`- ${name}${detail ? ` (${detail})` : ''}`);
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
// Remaining top-level fields (date_created, date_started, consumer, etc.)
|
|
173
|
+
const renderedTop = new Set(['report_number', 'reactions', 'outcomes', 'products']);
|
|
174
|
+
lines.push(...formatRemainingFields(r, renderedTop));
|
|
136
175
|
}
|
|
137
|
-
// Fallback
|
|
176
|
+
// Fallback — dump full record
|
|
138
177
|
else {
|
|
139
178
|
lines.push(`### Record`);
|
|
140
|
-
lines.push(`\`\`\`json\n${JSON.stringify(r, null, 2).slice(0,
|
|
179
|
+
lines.push(`\`\`\`json\n${JSON.stringify(r, null, 2).slice(0, 1000)}\n\`\`\``);
|
|
141
180
|
}
|
|
142
181
|
lines.push('');
|
|
143
182
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-adverse-events.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-adverse-events.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE1E,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC,+BAA+B,EAAE;IAC3E,WAAW,EACT,6KAA6K;IAC/K,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;IAEnC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,QAAQ,EAAE,CAAC;aACR,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;aAChC,QAAQ,CAAC,qEAAqE,CAAC;QAClF,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,mKAAmK,CACpK;QACH,IAAI,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"search-adverse-events.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-adverse-events.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-device-clearances.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-device-clearances.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"search-device-clearances.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-device-clearances.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAIjD,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;kBA2JrC,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
* @module mcp-server/tools/definitions/search-device-clearances
|
|
4
4
|
*/
|
|
5
5
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
|
+
import { formatRemainingFields } from '../../../mcp-server/tools/format-utils.js';
|
|
6
7
|
import { getOpenFdaService } from '../../../services/openfda/openfda-service.js';
|
|
7
8
|
export const searchDeviceClearancesTool = tool('openfda_search_device_clearances', {
|
|
8
9
|
description: 'Search FDA device premarket notifications — 510(k) clearances and PMA approvals.',
|
|
@@ -15,7 +16,10 @@ export const searchDeviceClearancesTool = tool('openfda_search_device_clearances
|
|
|
15
16
|
.string()
|
|
16
17
|
.optional()
|
|
17
18
|
.describe('openFDA search query. Examples: applicant:"medtronic", advisory_committee_description:"cardiovascular", product_code:"DXN", openfda.device_name:"catheter". Omit to browse recent.'),
|
|
18
|
-
sort: z
|
|
19
|
+
sort: z
|
|
20
|
+
.string()
|
|
21
|
+
.optional()
|
|
22
|
+
.describe('Sort expression (field:asc or field:desc). Example: decision_date:desc. Unrecognized fields are silently ignored by the API — results return in default order.'),
|
|
19
23
|
limit: z
|
|
20
24
|
.number()
|
|
21
25
|
.min(1)
|
|
@@ -69,6 +73,29 @@ export const searchDeviceClearancesTool = tool('openfda_search_device_clearances
|
|
|
69
73
|
const lines = [
|
|
70
74
|
`**${result.meta.total.toLocaleString()} total results** (showing ${result.results.length}, skip: ${result.meta.skip}) | Data updated: ${result.meta.lastUpdated}\n`,
|
|
71
75
|
];
|
|
76
|
+
const rendered510k = new Set([
|
|
77
|
+
'k_number',
|
|
78
|
+
'device_name',
|
|
79
|
+
'applicant',
|
|
80
|
+
'product_code',
|
|
81
|
+
'decision_description',
|
|
82
|
+
'decision_date',
|
|
83
|
+
'advisory_committee_description',
|
|
84
|
+
'clearance_type',
|
|
85
|
+
'statement_or_summary',
|
|
86
|
+
]);
|
|
87
|
+
const renderedPma = new Set([
|
|
88
|
+
'pma_number',
|
|
89
|
+
'trade_name',
|
|
90
|
+
'generic_name',
|
|
91
|
+
'applicant',
|
|
92
|
+
'product_code',
|
|
93
|
+
'decision_description',
|
|
94
|
+
'decision_code',
|
|
95
|
+
'decision_date',
|
|
96
|
+
'advisory_committee_description',
|
|
97
|
+
'supplement_number',
|
|
98
|
+
]);
|
|
72
99
|
for (const r of result.results) {
|
|
73
100
|
// 510(k)
|
|
74
101
|
if (r.k_number) {
|
|
@@ -83,6 +110,7 @@ export const searchDeviceClearancesTool = tool('openfda_search_device_clearances
|
|
|
83
110
|
const text = String(r.statement_or_summary);
|
|
84
111
|
lines.push(`**Summary:** ${text.length > 500 ? `${text.slice(0, 500)}...` : text}`);
|
|
85
112
|
}
|
|
113
|
+
lines.push(...formatRemainingFields(r, rendered510k));
|
|
86
114
|
}
|
|
87
115
|
// PMA
|
|
88
116
|
else if (r.pma_number) {
|
|
@@ -94,6 +122,7 @@ export const searchDeviceClearancesTool = tool('openfda_search_device_clearances
|
|
|
94
122
|
lines.push(`**Advisory committee:** ${r.advisory_committee_description}`);
|
|
95
123
|
if (r.supplement_number)
|
|
96
124
|
lines.push(`**Supplement:** ${r.supplement_number}`);
|
|
125
|
+
lines.push(...formatRemainingFields(r, renderedPma));
|
|
97
126
|
}
|
|
98
127
|
// Fallback
|
|
99
128
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-device-clearances.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-device-clearances.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE1E,MAAM,CAAC,MAAM,0BAA0B,GAAG,IAAI,CAAC,kCAAkC,EAAE;IACjF,WAAW,EAAE,kFAAkF;IAC/F,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;IAEnC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,OAAO,EAAE,CAAC;aACP,IAAI,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;aACrB,QAAQ,CACP,2FAA2F,CAC5F;QACH,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,oLAAoL,CACrL;QACH,IAAI,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"search-device-clearances.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-device-clearances.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-drug-approvals.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-drug-approvals.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"search-drug-approvals.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-drug-approvals.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAIjD,6DAA6D;AAC7D,eAAO,MAAM,uBAAuB;;;;;;;;;;;;;;kBA0KlC,CAAC"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* @module mcp-server/tools/definitions/search-drug-approvals
|
|
5
5
|
*/
|
|
6
6
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
7
|
+
import { formatRemainingFields } from '../../../mcp-server/tools/format-utils.js';
|
|
7
8
|
import { getOpenFdaService } from '../../../services/openfda/openfda-service.js';
|
|
8
9
|
/** Exported tool definition for searching drug approvals. */
|
|
9
10
|
export const searchDrugApprovalsTool = tool('openfda_search_drug_approvals', {
|
|
@@ -17,7 +18,7 @@ export const searchDrugApprovalsTool = tool('openfda_search_drug_approvals', {
|
|
|
17
18
|
sort: z
|
|
18
19
|
.string()
|
|
19
20
|
.optional()
|
|
20
|
-
.describe('Sort field
|
|
21
|
+
.describe('Sort expression (field:asc or field:desc). Example: submissions.submission_status_date:desc. Unrecognized fields are silently ignored by the API — results return in default order.'),
|
|
21
22
|
limit: z
|
|
22
23
|
.number()
|
|
23
24
|
.min(1)
|
|
@@ -82,6 +83,13 @@ export const searchDrugApprovalsTool = tool('openfda_search_drug_approvals', {
|
|
|
82
83
|
const lines = [
|
|
83
84
|
`**${result.meta.total.toLocaleString()} total results** (showing ${result.results.length}, skip: ${result.meta.skip}) | Data updated: ${result.meta.lastUpdated}\n`,
|
|
84
85
|
];
|
|
86
|
+
const rendered = new Set([
|
|
87
|
+
'openfda',
|
|
88
|
+
'application_number',
|
|
89
|
+
'sponsor_name',
|
|
90
|
+
'products',
|
|
91
|
+
'submissions',
|
|
92
|
+
]);
|
|
85
93
|
for (const r of result.results) {
|
|
86
94
|
const openfda = r.openfda ?? {};
|
|
87
95
|
const brandName = (openfda.brand_name ?? [])[0] ?? '';
|
|
@@ -95,6 +103,15 @@ export const searchDrugApprovalsTool = tool('openfda_search_drug_approvals', {
|
|
|
95
103
|
lines.push(`**Route:** ${openfda.route.join(', ')}`);
|
|
96
104
|
if (openfda.product_type)
|
|
97
105
|
lines.push(`**Type:** ${openfda.product_type.join(', ')}`);
|
|
106
|
+
// Remaining openfda fields (substance_name, rxcui, nui, pharm_class, etc.)
|
|
107
|
+
const renderedOpenfda = new Set([
|
|
108
|
+
'brand_name',
|
|
109
|
+
'generic_name',
|
|
110
|
+
'manufacturer_name',
|
|
111
|
+
'route',
|
|
112
|
+
'product_type',
|
|
113
|
+
]);
|
|
114
|
+
lines.push(...formatRemainingFields(openfda, renderedOpenfda));
|
|
98
115
|
const products = r.products ?? [];
|
|
99
116
|
if (products.length > 0) {
|
|
100
117
|
lines.push('**Products:**');
|
|
@@ -128,6 +145,7 @@ export const searchDrugApprovalsTool = tool('openfda_search_drug_approvals', {
|
|
|
128
145
|
if (submissions.length > 10)
|
|
129
146
|
lines.push(`- ... and ${submissions.length - 10} more`);
|
|
130
147
|
}
|
|
148
|
+
lines.push(...formatRemainingFields(r, rendered));
|
|
131
149
|
lines.push('');
|
|
132
150
|
}
|
|
133
151
|
return [{ type: 'text', text: lines.join('\n') }];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-drug-approvals.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-drug-approvals.tool.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE1E,6DAA6D;AAC7D,MAAM,CAAC,MAAM,uBAAuB,GAAG,IAAI,CAAC,+BAA+B,EAAE;IAC3E,WAAW,EACT,wJAAwJ;IAC1J,WAAW,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE;IAEnC,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC;QACd,MAAM,EAAE,CAAC;aACN,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CACP,2LAA2L,CAC5L;QACH,IAAI,EAAE,CAAC;aACJ,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,
|
|
1
|
+
{"version":3,"file":"search-drug-approvals.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-drug-approvals.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-recalls.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-recalls.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"search-recalls.tool.d.ts","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-recalls.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAQ,CAAC,EAAE,MAAM,wBAAwB,CAAC;AAYjD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;kBA2H5B,CAAC"}
|
|
@@ -4,18 +4,13 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { tool, z } from '@cyanheads/mcp-ts-core';
|
|
6
6
|
import { validationError } from '@cyanheads/mcp-ts-core/errors';
|
|
7
|
+
import { formatRemainingFields, truncate } from '../../../mcp-server/tools/format-utils.js';
|
|
7
8
|
import { getOpenFdaService } from '../../../services/openfda/openfda-service.js';
|
|
8
9
|
const Category = z.enum(['drug', 'food', 'device']).describe('Product category');
|
|
9
10
|
const Endpoint = z
|
|
10
11
|
.enum(['enforcement', 'recall'])
|
|
11
12
|
.default('enforcement')
|
|
12
13
|
.describe('Report type. Default enforcement. The recall endpoint is only available for devices.');
|
|
13
|
-
/** Truncate a string to `max` characters, appending ellipsis when trimmed. */
|
|
14
|
-
function truncate(value, max) {
|
|
15
|
-
if (!value)
|
|
16
|
-
return 'N/A';
|
|
17
|
-
return value.length > max ? `${value.slice(0, max)}...` : value;
|
|
18
|
-
}
|
|
19
14
|
export const searchRecallsTool = tool('openfda_search_recalls', {
|
|
20
15
|
description: 'Search enforcement reports and recall actions across drugs, food, and devices.',
|
|
21
16
|
annotations: { readOnlyHint: true },
|
|
@@ -26,7 +21,10 @@ export const searchRecallsTool = tool('openfda_search_recalls', {
|
|
|
26
21
|
.string()
|
|
27
22
|
.optional()
|
|
28
23
|
.describe('openFDA search query. Examples: classification:"Class I", recalling_firm:"pfizer", reason_for_recall:"undeclared allergen".'),
|
|
29
|
-
sort: z
|
|
24
|
+
sort: z
|
|
25
|
+
.string()
|
|
26
|
+
.optional()
|
|
27
|
+
.describe('Sort expression (field:asc or field:desc). Example: report_date:desc. Unrecognized fields are silently ignored by the API — results return in default order.'),
|
|
30
28
|
limit: z
|
|
31
29
|
.number()
|
|
32
30
|
.min(1)
|
|
@@ -85,6 +83,16 @@ export const searchRecallsTool = tool('openfda_search_recalls', {
|
|
|
85
83
|
];
|
|
86
84
|
}
|
|
87
85
|
const header = `**${result.meta.total.toLocaleString()} total records** (showing ${result.results.length}, offset ${result.meta.skip}) | Last updated: ${result.meta.lastUpdated}\n`;
|
|
86
|
+
const rendered = new Set([
|
|
87
|
+
'recall_number',
|
|
88
|
+
'classification',
|
|
89
|
+
'recalling_firm',
|
|
90
|
+
'product_description',
|
|
91
|
+
'reason_for_recall',
|
|
92
|
+
'status',
|
|
93
|
+
'voluntary_mandated',
|
|
94
|
+
'distribution_pattern',
|
|
95
|
+
]);
|
|
88
96
|
const records = result.results.map((r) => {
|
|
89
97
|
const lines = [
|
|
90
98
|
`**Recall #${r.recall_number ?? 'N/A'}** — ${r.classification ?? 'Unclassified'}`,
|
|
@@ -96,6 +104,7 @@ export const searchRecallsTool = tool('openfda_search_recalls', {
|
|
|
96
104
|
if (r.distribution_pattern) {
|
|
97
105
|
lines.push(`Distribution: ${r.distribution_pattern}`);
|
|
98
106
|
}
|
|
107
|
+
lines.push(...formatRemainingFields(r, rendered));
|
|
99
108
|
return lines.join('\n');
|
|
100
109
|
});
|
|
101
110
|
const body = records.join('\n\n---\n\n');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search-recalls.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-recalls.tool.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE1E,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC,CAAC;AAEjF,MAAM,QAAQ,GAAG,CAAC;KACf,IAAI,CAAC,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;KAC/B,OAAO,CAAC,aAAa,CAAC;KACtB,QAAQ,CAAC,sFAAsF,CAAC,CAAC;AAEpG,
|
|
1
|
+
{"version":3,"file":"search-recalls.tool.js","sourceRoot":"","sources":["../../../../src/mcp-server/tools/definitions/search-recalls.tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Shared formatting helpers for tool format() functions.
|
|
3
|
+
* @module mcp-server/tools/format-utils
|
|
4
|
+
*/
|
|
5
|
+
/** Truncate a string, appending ellipsis when trimmed. */
|
|
6
|
+
export declare function truncate(value: string | undefined | null, max: number): string;
|
|
7
|
+
/** Convert a snake_case field key to a human-readable label. */
|
|
8
|
+
export declare function humanizeField(key: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Render record fields not in the `rendered` set as `**Label:** value` lines.
|
|
11
|
+
* Skips null, undefined, and empty-string values. Objects/arrays are JSON-stringified.
|
|
12
|
+
*/
|
|
13
|
+
export declare function formatRemainingFields(record: Record<string, unknown>, rendered: ReadonlySet<string>, maxLen?: number): string[];
|
|
14
|
+
//# sourceMappingURL=format-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-utils.d.ts","sourceRoot":"","sources":["../../../src/mcp-server/tools/format-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,0DAA0D;AAC1D,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAG9E;AAED,gEAAgE;AAChE,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,EAC7B,MAAM,SAAM,GACX,MAAM,EAAE,CASV"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Shared formatting helpers for tool format() functions.
|
|
3
|
+
* @module mcp-server/tools/format-utils
|
|
4
|
+
*/
|
|
5
|
+
/** Truncate a string, appending ellipsis when trimmed. */
|
|
6
|
+
export function truncate(value, max) {
|
|
7
|
+
if (!value)
|
|
8
|
+
return 'N/A';
|
|
9
|
+
return value.length > max ? `${value.slice(0, max)}...` : value;
|
|
10
|
+
}
|
|
11
|
+
/** Convert a snake_case field key to a human-readable label. */
|
|
12
|
+
export function humanizeField(key) {
|
|
13
|
+
return key.replace(/_/g, ' ').replace(/^./, (c) => c.toUpperCase());
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Render record fields not in the `rendered` set as `**Label:** value` lines.
|
|
17
|
+
* Skips null, undefined, and empty-string values. Objects/arrays are JSON-stringified.
|
|
18
|
+
*/
|
|
19
|
+
export function formatRemainingFields(record, rendered, maxLen = 300) {
|
|
20
|
+
const lines = [];
|
|
21
|
+
for (const [key, value] of Object.entries(record)) {
|
|
22
|
+
if (rendered.has(key) || value == null || value === '')
|
|
23
|
+
continue;
|
|
24
|
+
if (typeof value === 'object' && Object.keys(value).length === 0)
|
|
25
|
+
continue;
|
|
26
|
+
const raw = typeof value === 'string' ? value : JSON.stringify(value);
|
|
27
|
+
lines.push(`**${humanizeField(key)}:** ${truncate(raw, maxLen)}`);
|
|
28
|
+
}
|
|
29
|
+
return lines;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=format-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format-utils.js","sourceRoot":"","sources":["../../../src/mcp-server/tools/format-utils.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,0DAA0D;AAC1D,MAAM,UAAU,QAAQ,CAAC,KAAgC,EAAE,GAAW;IACpE,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,OAAO,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;AAClE,CAAC;AAED,gEAAgE;AAChE,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;AACtE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,MAA+B,EAC/B,QAA6B,EAC7B,MAAM,GAAG,GAAG;IAEZ,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,KAAK,EAAE;YAAE,SAAS;QACjE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACrF,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACtE,KAAK,CAAC,IAAI,CAAC,KAAK,aAAa,CAAC,GAAG,CAAC,OAAO,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cyanheads/openfda-mcp-server",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"mcpName": "io.github.cyanheads/openfda-mcp-server",
|
|
5
5
|
"description": "Query FDA data on drugs, food, devices, and recalls via openFDA. STDIO or Streamable HTTP.",
|
|
6
6
|
"type": "module",
|
package/server.json
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
"url": "https://github.com/cyanheads/openfda-mcp-server",
|
|
7
7
|
"source": "github"
|
|
8
8
|
},
|
|
9
|
-
"version": "0.1.
|
|
9
|
+
"version": "0.1.8",
|
|
10
10
|
"remotes": [
|
|
11
11
|
{
|
|
12
12
|
"type": "streamable-http",
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
20
20
|
"identifier": "@cyanheads/openfda-mcp-server",
|
|
21
21
|
"runtimeHint": "bun",
|
|
22
|
-
"version": "0.1.
|
|
22
|
+
"version": "0.1.8",
|
|
23
23
|
"environmentVariables": [
|
|
24
24
|
{
|
|
25
25
|
"name": "OPENFDA_API_KEY",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
"registryBaseUrl": "https://registry.npmjs.org",
|
|
45
45
|
"identifier": "@cyanheads/openfda-mcp-server",
|
|
46
46
|
"runtimeHint": "bun",
|
|
47
|
-
"version": "0.1.
|
|
47
|
+
"version": "0.1.8",
|
|
48
48
|
"environmentVariables": [
|
|
49
49
|
{
|
|
50
50
|
"name": "OPENFDA_API_KEY",
|