@claude-flow/plugin-healthcare-clinical 3.0.0-alpha.1
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 +280 -0
- package/dist/bridges/gnn-bridge.d.ts +70 -0
- package/dist/bridges/gnn-bridge.d.ts.map +1 -0
- package/dist/bridges/gnn-bridge.js +534 -0
- package/dist/bridges/gnn-bridge.js.map +1 -0
- package/dist/bridges/hnsw-bridge.d.ts +98 -0
- package/dist/bridges/hnsw-bridge.d.ts.map +1 -0
- package/dist/bridges/hnsw-bridge.js +390 -0
- package/dist/bridges/hnsw-bridge.js.map +1 -0
- package/dist/bridges/index.d.ts +8 -0
- package/dist/bridges/index.d.ts.map +1 -0
- package/dist/bridges/index.js +8 -0
- package/dist/bridges/index.js.map +1 -0
- package/dist/index.d.ts +95 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +154 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-tools.d.ts +22 -0
- package/dist/mcp-tools.d.ts.map +1 -0
- package/dist/mcp-tools.js +525 -0
- package/dist/mcp-tools.js.map +1 -0
- package/dist/types.d.ts +638 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +166 -0
- package/dist/types.js.map +1 -0
- package/package.json +103 -0
|
@@ -0,0 +1,525 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Healthcare Clinical MCP Tools
|
|
3
|
+
*
|
|
4
|
+
* HIPAA-compliant clinical decision support tools including:
|
|
5
|
+
* - patient-similarity: Find similar patient cases
|
|
6
|
+
* - drug-interactions: Analyze drug-drug and drug-condition interactions
|
|
7
|
+
* - clinical-pathways: Recommend evidence-based treatment pathways
|
|
8
|
+
* - literature-search: Semantic search across medical literature
|
|
9
|
+
* - ontology-navigate: Navigate medical ontology hierarchies
|
|
10
|
+
*/
|
|
11
|
+
import { PatientSimilarityInputSchema, DrugInteractionsInputSchema, ClinicalPathwaysInputSchema, LiteratureSearchInputSchema, OntologyNavigationInputSchema, successResult, errorResult, HealthcareRolePermissions, HealthcareErrorCodes, } from './types.js';
|
|
12
|
+
import { HealthcareHNSWBridge } from './bridges/hnsw-bridge.js';
|
|
13
|
+
import { HealthcareGNNBridge } from './bridges/gnn-bridge.js';
|
|
14
|
+
// Default logger
|
|
15
|
+
const defaultLogger = {
|
|
16
|
+
debug: (msg, meta) => console.debug(`[healthcare-tools] ${msg}`, meta),
|
|
17
|
+
info: (msg, meta) => console.info(`[healthcare-tools] ${msg}`, meta),
|
|
18
|
+
warn: (msg, meta) => console.warn(`[healthcare-tools] ${msg}`, meta),
|
|
19
|
+
error: (msg, meta) => console.error(`[healthcare-tools] ${msg}`, meta),
|
|
20
|
+
};
|
|
21
|
+
// ============================================================================
|
|
22
|
+
// Authorization Helper
|
|
23
|
+
// ============================================================================
|
|
24
|
+
function checkAuthorization(toolName, context) {
|
|
25
|
+
if (!context?.userRoles)
|
|
26
|
+
return true; // No roles = no RBAC enforcement
|
|
27
|
+
for (const role of context.userRoles) {
|
|
28
|
+
const permissions = HealthcareRolePermissions[role];
|
|
29
|
+
if (permissions?.includes(toolName))
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
async function logAudit(toolName, context, input, success, resultCount, durationMs) {
|
|
35
|
+
if (!context?.auditLogger)
|
|
36
|
+
return;
|
|
37
|
+
const entry = {
|
|
38
|
+
timestamp: new Date().toISOString(),
|
|
39
|
+
userId: context.userId ?? 'anonymous',
|
|
40
|
+
toolName,
|
|
41
|
+
action: 'query',
|
|
42
|
+
patientIdentifiers: [], // Hash patient IDs in production
|
|
43
|
+
queryHash: hashInput(input),
|
|
44
|
+
resultCount,
|
|
45
|
+
ipAddress: 'hashed', // Hash IP in production
|
|
46
|
+
success,
|
|
47
|
+
durationMs,
|
|
48
|
+
};
|
|
49
|
+
await context.auditLogger.log(entry);
|
|
50
|
+
}
|
|
51
|
+
function hashInput(input) {
|
|
52
|
+
const str = JSON.stringify(input);
|
|
53
|
+
let hash = 0;
|
|
54
|
+
for (let i = 0; i < str.length; i++) {
|
|
55
|
+
hash = ((hash << 5) - hash) + str.charCodeAt(i);
|
|
56
|
+
hash = hash & hash;
|
|
57
|
+
}
|
|
58
|
+
return Math.abs(hash).toString(16);
|
|
59
|
+
}
|
|
60
|
+
// ============================================================================
|
|
61
|
+
// Patient Similarity Tool
|
|
62
|
+
// ============================================================================
|
|
63
|
+
async function patientSimilarityHandler(input, context) {
|
|
64
|
+
const logger = context?.logger ?? defaultLogger;
|
|
65
|
+
const startTime = performance.now();
|
|
66
|
+
try {
|
|
67
|
+
// Authorization check
|
|
68
|
+
if (!checkAuthorization('patient-similarity', context)) {
|
|
69
|
+
return errorResult(HealthcareErrorCodes.UNAUTHORIZED_ACCESS);
|
|
70
|
+
}
|
|
71
|
+
// Validate input
|
|
72
|
+
const validation = PatientSimilarityInputSchema.safeParse(input);
|
|
73
|
+
if (!validation.success) {
|
|
74
|
+
return errorResult(`Invalid input: ${validation.error.message}`);
|
|
75
|
+
}
|
|
76
|
+
const { patientFeatures, topK, cohortFilter } = validation.data;
|
|
77
|
+
// Initialize bridge if needed
|
|
78
|
+
const hnswBridge = context?.bridge?.hnsw ?? new HealthcareHNSWBridge();
|
|
79
|
+
if (!hnswBridge.initialized) {
|
|
80
|
+
await hnswBridge.initialize();
|
|
81
|
+
}
|
|
82
|
+
// Search for similar patients
|
|
83
|
+
const similarPatients = await hnswBridge.searchByFeatures(patientFeatures, topK, cohortFilter);
|
|
84
|
+
const result = {
|
|
85
|
+
query: patientFeatures,
|
|
86
|
+
similarPatients,
|
|
87
|
+
searchTime: performance.now() - startTime,
|
|
88
|
+
cohortSize: await hnswBridge.count(),
|
|
89
|
+
confidence: similarPatients.length > 0
|
|
90
|
+
? similarPatients.reduce((sum, p) => sum + p.similarity, 0) / similarPatients.length
|
|
91
|
+
: 0,
|
|
92
|
+
};
|
|
93
|
+
const duration = performance.now() - startTime;
|
|
94
|
+
await logAudit('patient-similarity', context, input, true, similarPatients.length, duration);
|
|
95
|
+
logger.info('Patient similarity search completed', {
|
|
96
|
+
resultCount: similarPatients.length,
|
|
97
|
+
durationMs: duration,
|
|
98
|
+
});
|
|
99
|
+
return successResult(result, { durationMs: duration, wasmUsed: !!context?.bridge?.hnsw });
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
const duration = performance.now() - startTime;
|
|
103
|
+
await logAudit('patient-similarity', context, input, false, 0, duration);
|
|
104
|
+
logger.error('Patient similarity search failed', { error: String(error) });
|
|
105
|
+
return errorResult(error instanceof Error ? error : new Error(String(error)));
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
export const patientSimilarityTool = {
|
|
109
|
+
name: 'healthcare/patient-similarity',
|
|
110
|
+
description: 'Find similar patient cases based on clinical features for treatment guidance. Uses HNSW vector search for 150x faster similarity matching.',
|
|
111
|
+
category: 'healthcare',
|
|
112
|
+
version: '1.0.0',
|
|
113
|
+
tags: ['patient', 'similarity', 'clinical', 'hipaa', 'hnsw'],
|
|
114
|
+
cacheable: false, // PHI should not be cached
|
|
115
|
+
cacheTTL: 0,
|
|
116
|
+
inputSchema: {
|
|
117
|
+
type: 'object',
|
|
118
|
+
properties: {
|
|
119
|
+
patientFeatures: {
|
|
120
|
+
type: 'object',
|
|
121
|
+
description: 'Clinical features (diagnoses, labs, vitals, medications)',
|
|
122
|
+
},
|
|
123
|
+
topK: { type: 'number', description: 'Number of similar patients to return (default: 5)' },
|
|
124
|
+
cohortFilter: { type: 'string', description: 'Filter by patient cohort' },
|
|
125
|
+
},
|
|
126
|
+
required: ['patientFeatures'],
|
|
127
|
+
},
|
|
128
|
+
handler: patientSimilarityHandler,
|
|
129
|
+
};
|
|
130
|
+
// ============================================================================
|
|
131
|
+
// Drug Interactions Tool
|
|
132
|
+
// ============================================================================
|
|
133
|
+
async function drugInteractionsHandler(input, context) {
|
|
134
|
+
const logger = context?.logger ?? defaultLogger;
|
|
135
|
+
const startTime = performance.now();
|
|
136
|
+
try {
|
|
137
|
+
// Authorization check
|
|
138
|
+
if (!checkAuthorization('drug-interactions', context)) {
|
|
139
|
+
return errorResult(HealthcareErrorCodes.UNAUTHORIZED_ACCESS);
|
|
140
|
+
}
|
|
141
|
+
// Validate input
|
|
142
|
+
const validation = DrugInteractionsInputSchema.safeParse(input);
|
|
143
|
+
if (!validation.success) {
|
|
144
|
+
return errorResult(`Invalid input: ${validation.error.message}`);
|
|
145
|
+
}
|
|
146
|
+
const { medications, conditions, severity } = validation.data;
|
|
147
|
+
// Initialize GNN bridge
|
|
148
|
+
const gnnBridge = context?.bridge?.gnn ?? new HealthcareGNNBridge();
|
|
149
|
+
if (!gnnBridge.initialized) {
|
|
150
|
+
await gnnBridge.initialize();
|
|
151
|
+
}
|
|
152
|
+
// Check drug-drug interactions
|
|
153
|
+
const drugDrugInteractions = gnnBridge.checkDrugInteractions(medications, severity);
|
|
154
|
+
// Check drug-condition interactions (simplified)
|
|
155
|
+
const drugConditionInteractions = conditions?.map(condition => ({
|
|
156
|
+
drug: medications[0] ?? '',
|
|
157
|
+
condition,
|
|
158
|
+
severity: 'moderate',
|
|
159
|
+
description: `Potential interaction between medication and ${condition}`,
|
|
160
|
+
recommendation: 'Consult clinical pharmacist',
|
|
161
|
+
})) ?? [];
|
|
162
|
+
// Calculate risk score
|
|
163
|
+
const riskScore = calculateRiskScore(drugDrugInteractions);
|
|
164
|
+
// Generate recommendations
|
|
165
|
+
const recommendations = generateRecommendations(drugDrugInteractions);
|
|
166
|
+
const result = {
|
|
167
|
+
medications,
|
|
168
|
+
drugDrugInteractions,
|
|
169
|
+
drugConditionInteractions,
|
|
170
|
+
riskScore,
|
|
171
|
+
recommendations,
|
|
172
|
+
analysisTime: performance.now() - startTime,
|
|
173
|
+
};
|
|
174
|
+
const duration = performance.now() - startTime;
|
|
175
|
+
await logAudit('drug-interactions', context, input, true, drugDrugInteractions.length, duration);
|
|
176
|
+
logger.info('Drug interaction analysis completed', {
|
|
177
|
+
medications: medications.length,
|
|
178
|
+
interactions: drugDrugInteractions.length,
|
|
179
|
+
riskScore,
|
|
180
|
+
durationMs: duration,
|
|
181
|
+
});
|
|
182
|
+
return successResult(result, { durationMs: duration, wasmUsed: !!context?.bridge?.gnn });
|
|
183
|
+
}
|
|
184
|
+
catch (error) {
|
|
185
|
+
const duration = performance.now() - startTime;
|
|
186
|
+
await logAudit('drug-interactions', context, input, false, 0, duration);
|
|
187
|
+
logger.error('Drug interaction analysis failed', { error: String(error) });
|
|
188
|
+
return errorResult(error instanceof Error ? error : new Error(String(error)));
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
function calculateRiskScore(interactions) {
|
|
192
|
+
if (interactions.length === 0)
|
|
193
|
+
return 0;
|
|
194
|
+
const severityWeights = {
|
|
195
|
+
contraindicated: 1.0,
|
|
196
|
+
major: 0.8,
|
|
197
|
+
moderate: 0.4,
|
|
198
|
+
minor: 0.1,
|
|
199
|
+
};
|
|
200
|
+
const totalWeight = interactions.reduce((sum, i) => sum + (severityWeights[i.severity] ?? 0.5), 0);
|
|
201
|
+
return Math.min(totalWeight / interactions.length, 1);
|
|
202
|
+
}
|
|
203
|
+
function generateRecommendations(interactions) {
|
|
204
|
+
const recommendations = new Set();
|
|
205
|
+
for (const interaction of interactions) {
|
|
206
|
+
if (interaction.management) {
|
|
207
|
+
recommendations.add(interaction.management);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
if (interactions.some(i => i.severity === 'contraindicated')) {
|
|
211
|
+
recommendations.add('URGENT: Review with clinical pharmacist before administration');
|
|
212
|
+
}
|
|
213
|
+
if (interactions.some(i => i.severity === 'major')) {
|
|
214
|
+
recommendations.add('Monitor patient closely for adverse effects');
|
|
215
|
+
}
|
|
216
|
+
return Array.from(recommendations);
|
|
217
|
+
}
|
|
218
|
+
export const drugInteractionsTool = {
|
|
219
|
+
name: 'healthcare/drug-interactions',
|
|
220
|
+
description: 'Analyze drug-drug and drug-condition interactions using GNN on drug interaction graph. Supports severity filtering.',
|
|
221
|
+
category: 'healthcare',
|
|
222
|
+
version: '1.0.0',
|
|
223
|
+
tags: ['drugs', 'interactions', 'safety', 'pharmacology', 'gnn'],
|
|
224
|
+
cacheable: true,
|
|
225
|
+
cacheTTL: 300000, // 5 minutes
|
|
226
|
+
inputSchema: {
|
|
227
|
+
type: 'object',
|
|
228
|
+
properties: {
|
|
229
|
+
medications: { type: 'array', items: { type: 'string' }, description: 'List of medications' },
|
|
230
|
+
conditions: { type: 'array', items: { type: 'string' }, description: 'Patient conditions' },
|
|
231
|
+
severity: { type: 'string', enum: ['all', 'major', 'moderate', 'minor'], description: 'Filter by severity' },
|
|
232
|
+
},
|
|
233
|
+
required: ['medications'],
|
|
234
|
+
},
|
|
235
|
+
handler: drugInteractionsHandler,
|
|
236
|
+
};
|
|
237
|
+
// ============================================================================
|
|
238
|
+
// Clinical Pathways Tool
|
|
239
|
+
// ============================================================================
|
|
240
|
+
async function clinicalPathwaysHandler(input, context) {
|
|
241
|
+
const logger = context?.logger ?? defaultLogger;
|
|
242
|
+
const startTime = performance.now();
|
|
243
|
+
try {
|
|
244
|
+
// Authorization check
|
|
245
|
+
if (!checkAuthorization('clinical-pathways', context)) {
|
|
246
|
+
return errorResult(HealthcareErrorCodes.UNAUTHORIZED_ACCESS);
|
|
247
|
+
}
|
|
248
|
+
// Validate input
|
|
249
|
+
const validation = ClinicalPathwaysInputSchema.safeParse(input);
|
|
250
|
+
if (!validation.success) {
|
|
251
|
+
return errorResult(`Invalid input: ${validation.error.message}`);
|
|
252
|
+
}
|
|
253
|
+
const { primaryDiagnosis, constraints } = validation.data;
|
|
254
|
+
// Initialize GNN bridge
|
|
255
|
+
const gnnBridge = context?.bridge?.gnn ?? new HealthcareGNNBridge();
|
|
256
|
+
if (!gnnBridge.initialized) {
|
|
257
|
+
await gnnBridge.initialize();
|
|
258
|
+
}
|
|
259
|
+
// Find clinical pathway
|
|
260
|
+
const pathway = gnnBridge.getClinicalPathway(primaryDiagnosis);
|
|
261
|
+
const recommendedPathways = pathway ? [pathway] : [];
|
|
262
|
+
const alternativePathways = [];
|
|
263
|
+
const contraindicated = [];
|
|
264
|
+
// Check for contraindications based on constraints
|
|
265
|
+
if (constraints?.excludeMedications && pathway) {
|
|
266
|
+
for (const step of pathway.steps) {
|
|
267
|
+
if (step.type === 'intervention' && constraints.excludeMedications.some(med => step.description.toLowerCase().includes(med.toLowerCase()))) {
|
|
268
|
+
contraindicated.push(step.name);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
const result = {
|
|
273
|
+
primaryDiagnosis,
|
|
274
|
+
recommendedPathways,
|
|
275
|
+
alternativePathways,
|
|
276
|
+
contraindicated,
|
|
277
|
+
constraints: constraints ?? {},
|
|
278
|
+
confidence: recommendedPathways.length > 0 ? 0.85 : 0.3,
|
|
279
|
+
analysisTime: performance.now() - startTime,
|
|
280
|
+
};
|
|
281
|
+
const duration = performance.now() - startTime;
|
|
282
|
+
await logAudit('clinical-pathways', context, input, true, recommendedPathways.length, duration);
|
|
283
|
+
logger.info('Clinical pathway analysis completed', {
|
|
284
|
+
diagnosis: primaryDiagnosis,
|
|
285
|
+
pathwaysFound: recommendedPathways.length,
|
|
286
|
+
durationMs: duration,
|
|
287
|
+
});
|
|
288
|
+
return successResult(result, { durationMs: duration, wasmUsed: !!context?.bridge?.gnn });
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
const duration = performance.now() - startTime;
|
|
292
|
+
await logAudit('clinical-pathways', context, input, false, 0, duration);
|
|
293
|
+
logger.error('Clinical pathway analysis failed', { error: String(error) });
|
|
294
|
+
return errorResult(error instanceof Error ? error : new Error(String(error)));
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
export const clinicalPathwaysTool = {
|
|
298
|
+
name: 'healthcare/clinical-pathways',
|
|
299
|
+
description: 'Suggest evidence-based clinical pathways based on diagnosis and patient history. Uses GNN for pathway optimization.',
|
|
300
|
+
category: 'healthcare',
|
|
301
|
+
version: '1.0.0',
|
|
302
|
+
tags: ['pathways', 'treatment', 'evidence-based', 'clinical', 'gnn'],
|
|
303
|
+
cacheable: true,
|
|
304
|
+
cacheTTL: 600000, // 10 minutes
|
|
305
|
+
inputSchema: {
|
|
306
|
+
type: 'object',
|
|
307
|
+
properties: {
|
|
308
|
+
primaryDiagnosis: { type: 'string', description: 'ICD-10 or SNOMED code' },
|
|
309
|
+
patientHistory: { type: 'object', description: 'Patient clinical history' },
|
|
310
|
+
constraints: { type: 'object', description: 'Pathway constraints (excluded medications, cost sensitivity, etc.)' },
|
|
311
|
+
},
|
|
312
|
+
required: ['primaryDiagnosis'],
|
|
313
|
+
},
|
|
314
|
+
handler: clinicalPathwaysHandler,
|
|
315
|
+
};
|
|
316
|
+
// ============================================================================
|
|
317
|
+
// Literature Search Tool
|
|
318
|
+
// ============================================================================
|
|
319
|
+
async function literatureSearchHandler(input, context) {
|
|
320
|
+
const logger = context?.logger ?? defaultLogger;
|
|
321
|
+
const startTime = performance.now();
|
|
322
|
+
try {
|
|
323
|
+
// Authorization check
|
|
324
|
+
if (!checkAuthorization('literature-search', context)) {
|
|
325
|
+
return errorResult(HealthcareErrorCodes.UNAUTHORIZED_ACCESS);
|
|
326
|
+
}
|
|
327
|
+
// Validate input
|
|
328
|
+
const validation = LiteratureSearchInputSchema.safeParse(input);
|
|
329
|
+
if (!validation.success) {
|
|
330
|
+
return errorResult(`Invalid input: ${validation.error.message}`);
|
|
331
|
+
}
|
|
332
|
+
const { query, sources, dateRange, evidenceLevel, maxResults } = validation.data;
|
|
333
|
+
// Simulated literature search results
|
|
334
|
+
// In production, integrate with PubMed, Cochrane, etc.
|
|
335
|
+
const articles = generateSampleArticles(query, sources ?? ['pubmed'], maxResults);
|
|
336
|
+
// Filter by evidence level if specified
|
|
337
|
+
const filteredArticles = evidenceLevel && evidenceLevel !== 'any'
|
|
338
|
+
? articles.filter(a => a.evidenceLevel === evidenceLevel)
|
|
339
|
+
: articles;
|
|
340
|
+
const result = {
|
|
341
|
+
query,
|
|
342
|
+
articles: filteredArticles,
|
|
343
|
+
totalResults: filteredArticles.length,
|
|
344
|
+
searchTime: performance.now() - startTime,
|
|
345
|
+
sources: sources ?? ['pubmed'],
|
|
346
|
+
filters: { dateRange, evidenceLevel },
|
|
347
|
+
};
|
|
348
|
+
const duration = performance.now() - startTime;
|
|
349
|
+
await logAudit('literature-search', context, input, true, filteredArticles.length, duration);
|
|
350
|
+
logger.info('Literature search completed', {
|
|
351
|
+
query,
|
|
352
|
+
resultCount: filteredArticles.length,
|
|
353
|
+
durationMs: duration,
|
|
354
|
+
});
|
|
355
|
+
return successResult(result, { durationMs: duration });
|
|
356
|
+
}
|
|
357
|
+
catch (error) {
|
|
358
|
+
const duration = performance.now() - startTime;
|
|
359
|
+
await logAudit('literature-search', context, input, false, 0, duration);
|
|
360
|
+
logger.error('Literature search failed', { error: String(error) });
|
|
361
|
+
return errorResult(error instanceof Error ? error : new Error(String(error)));
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
function generateSampleArticles(query, sources, maxResults) {
|
|
365
|
+
// Generate sample articles for demonstration
|
|
366
|
+
const evidenceLevels = ['systematic-review', 'rct', 'cohort', 'case-control'];
|
|
367
|
+
const articles = [];
|
|
368
|
+
for (let i = 0; i < Math.min(maxResults, 10); i++) {
|
|
369
|
+
articles.push({
|
|
370
|
+
id: `article-${i + 1}`,
|
|
371
|
+
title: `${query}: A ${evidenceLevels[i % evidenceLevels.length]} Study`,
|
|
372
|
+
authors: ['Author A', 'Author B', 'Author C'],
|
|
373
|
+
abstract: `This study examines ${query.toLowerCase()} using rigorous methodology...`,
|
|
374
|
+
source: sources[i % sources.length],
|
|
375
|
+
publicationDate: new Date(2024, i % 12, 1).toISOString(),
|
|
376
|
+
evidenceLevel: evidenceLevels[i % evidenceLevels.length],
|
|
377
|
+
relevanceScore: 0.95 - (i * 0.05),
|
|
378
|
+
pmid: `${30000000 + i}`,
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
return articles;
|
|
382
|
+
}
|
|
383
|
+
export const literatureSearchTool = {
|
|
384
|
+
name: 'healthcare/literature-search',
|
|
385
|
+
description: 'Search medical literature with semantic understanding. Supports PubMed, Cochrane, and UpToDate sources with evidence level filtering.',
|
|
386
|
+
category: 'healthcare',
|
|
387
|
+
version: '1.0.0',
|
|
388
|
+
tags: ['literature', 'search', 'pubmed', 'evidence', 'research'],
|
|
389
|
+
cacheable: true,
|
|
390
|
+
cacheTTL: 3600000, // 1 hour
|
|
391
|
+
inputSchema: {
|
|
392
|
+
type: 'object',
|
|
393
|
+
properties: {
|
|
394
|
+
query: { type: 'string', description: 'Search query' },
|
|
395
|
+
sources: { type: 'array', items: { type: 'string' }, description: 'Literature sources to search' },
|
|
396
|
+
dateRange: { type: 'object', description: 'Date range filter' },
|
|
397
|
+
evidenceLevel: { type: 'string', description: 'Filter by evidence level' },
|
|
398
|
+
maxResults: { type: 'number', description: 'Maximum results to return' },
|
|
399
|
+
},
|
|
400
|
+
required: ['query'],
|
|
401
|
+
},
|
|
402
|
+
handler: literatureSearchHandler,
|
|
403
|
+
};
|
|
404
|
+
// ============================================================================
|
|
405
|
+
// Ontology Navigation Tool
|
|
406
|
+
// ============================================================================
|
|
407
|
+
async function ontologyNavigateHandler(input, context) {
|
|
408
|
+
const logger = context?.logger ?? defaultLogger;
|
|
409
|
+
const startTime = performance.now();
|
|
410
|
+
try {
|
|
411
|
+
// Authorization check
|
|
412
|
+
if (!checkAuthorization('ontology-navigate', context)) {
|
|
413
|
+
return errorResult(HealthcareErrorCodes.UNAUTHORIZED_ACCESS);
|
|
414
|
+
}
|
|
415
|
+
// Validate input
|
|
416
|
+
const validation = OntologyNavigationInputSchema.safeParse(input);
|
|
417
|
+
if (!validation.success) {
|
|
418
|
+
return errorResult(`Invalid input: ${validation.error.message}`);
|
|
419
|
+
}
|
|
420
|
+
const { code, ontology, direction, depth } = validation.data;
|
|
421
|
+
// Simulated ontology navigation
|
|
422
|
+
// In production, integrate with SNOMED CT, ICD-10, LOINC, RxNorm APIs
|
|
423
|
+
const sourceNode = {
|
|
424
|
+
code,
|
|
425
|
+
display: getCodeDisplay(code, ontology),
|
|
426
|
+
ontology,
|
|
427
|
+
definition: `Definition for ${code}`,
|
|
428
|
+
};
|
|
429
|
+
const results = generateOntologyResults(code, ontology, direction, depth);
|
|
430
|
+
const result = {
|
|
431
|
+
sourceCode: code,
|
|
432
|
+
sourceNode,
|
|
433
|
+
direction,
|
|
434
|
+
results,
|
|
435
|
+
depth,
|
|
436
|
+
totalNodes: results.length,
|
|
437
|
+
navigationTime: performance.now() - startTime,
|
|
438
|
+
};
|
|
439
|
+
const duration = performance.now() - startTime;
|
|
440
|
+
await logAudit('ontology-navigate', context, input, true, results.length, duration);
|
|
441
|
+
logger.info('Ontology navigation completed', {
|
|
442
|
+
code,
|
|
443
|
+
ontology,
|
|
444
|
+
direction,
|
|
445
|
+
resultCount: results.length,
|
|
446
|
+
durationMs: duration,
|
|
447
|
+
});
|
|
448
|
+
return successResult(result, { durationMs: duration });
|
|
449
|
+
}
|
|
450
|
+
catch (error) {
|
|
451
|
+
const duration = performance.now() - startTime;
|
|
452
|
+
await logAudit('ontology-navigate', context, input, false, 0, duration);
|
|
453
|
+
logger.error('Ontology navigation failed', { error: String(error) });
|
|
454
|
+
return errorResult(error instanceof Error ? error : new Error(String(error)));
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
function getCodeDisplay(code, ontology) {
|
|
458
|
+
// Sample code displays
|
|
459
|
+
const displays = {
|
|
460
|
+
'E11': 'Type 2 diabetes mellitus',
|
|
461
|
+
'I10': 'Essential (primary) hypertension',
|
|
462
|
+
'J45': 'Asthma',
|
|
463
|
+
'M54.5': 'Low back pain',
|
|
464
|
+
'F32': 'Depressive episode',
|
|
465
|
+
};
|
|
466
|
+
return displays[code] ?? `${ontology.toUpperCase()} Code: ${code}`;
|
|
467
|
+
}
|
|
468
|
+
function generateOntologyResults(code, ontology, _direction, depth) {
|
|
469
|
+
const results = [];
|
|
470
|
+
const count = Math.min(depth * 3, 10);
|
|
471
|
+
for (let i = 0; i < count; i++) {
|
|
472
|
+
results.push({
|
|
473
|
+
code: `${code}.${i + 1}`,
|
|
474
|
+
display: `Related ${ontology.toUpperCase()} concept ${i + 1}`,
|
|
475
|
+
ontology,
|
|
476
|
+
depth: Math.floor(i / 3) + 1,
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
return results;
|
|
480
|
+
}
|
|
481
|
+
export const ontologyNavigateTool = {
|
|
482
|
+
name: 'healthcare/ontology-navigate',
|
|
483
|
+
description: 'Navigate ICD-10, SNOMED-CT, LOINC, and RxNorm hierarchies using hyperbolic embeddings for efficient ontology traversal.',
|
|
484
|
+
category: 'healthcare',
|
|
485
|
+
version: '1.0.0',
|
|
486
|
+
tags: ['ontology', 'icd10', 'snomed', 'loinc', 'rxnorm', 'hyperbolic'],
|
|
487
|
+
cacheable: true,
|
|
488
|
+
cacheTTL: 86400000, // 24 hours
|
|
489
|
+
inputSchema: {
|
|
490
|
+
type: 'object',
|
|
491
|
+
properties: {
|
|
492
|
+
code: { type: 'string', description: 'Medical code to explore' },
|
|
493
|
+
ontology: { type: 'string', enum: ['icd10', 'snomed', 'loinc', 'rxnorm'], description: 'Ontology system' },
|
|
494
|
+
direction: { type: 'string', enum: ['ancestors', 'descendants', 'siblings', 'related'], description: 'Navigation direction' },
|
|
495
|
+
depth: { type: 'number', description: 'Traversal depth (default: 2)' },
|
|
496
|
+
},
|
|
497
|
+
required: ['code', 'ontology'],
|
|
498
|
+
},
|
|
499
|
+
handler: ontologyNavigateHandler,
|
|
500
|
+
};
|
|
501
|
+
// ============================================================================
|
|
502
|
+
// Export All Tools
|
|
503
|
+
// ============================================================================
|
|
504
|
+
export const healthcareTools = [
|
|
505
|
+
patientSimilarityTool,
|
|
506
|
+
drugInteractionsTool,
|
|
507
|
+
clinicalPathwaysTool,
|
|
508
|
+
literatureSearchTool,
|
|
509
|
+
ontologyNavigateTool,
|
|
510
|
+
];
|
|
511
|
+
export const toolHandlers = new Map([
|
|
512
|
+
['healthcare/patient-similarity', patientSimilarityHandler],
|
|
513
|
+
['healthcare/drug-interactions', drugInteractionsHandler],
|
|
514
|
+
['healthcare/clinical-pathways', clinicalPathwaysHandler],
|
|
515
|
+
['healthcare/literature-search', literatureSearchHandler],
|
|
516
|
+
['healthcare/ontology-navigate', ontologyNavigateHandler],
|
|
517
|
+
]);
|
|
518
|
+
export function getTool(name) {
|
|
519
|
+
return healthcareTools.find(t => t.name === name);
|
|
520
|
+
}
|
|
521
|
+
export function getToolNames() {
|
|
522
|
+
return healthcareTools.map(t => t.name);
|
|
523
|
+
}
|
|
524
|
+
export default healthcareTools;
|
|
525
|
+
//# sourceMappingURL=mcp-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-tools.js","sourceRoot":"","sources":["../src/mcp-tools.ts"],"names":[],"mappings":"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"}
|