@dcyfr/ai 1.0.2 → 1.0.4
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/CHANGELOG.md +21 -0
- package/LICENSE +27 -1
- package/README.md +359 -23
- package/bin/cli.js +12 -0
- package/bin/tui/config-wizard.js +107 -0
- package/bin/tui/validation-dashboard.js +123 -0
- package/bin/tui.js +259 -0
- package/dist/ai/agents/agent-loader.d.ts.map +1 -1
- package/dist/ai/agents/agent-loader.js +4 -2
- package/dist/ai/agents/agent-loader.js.map +1 -1
- package/dist/ai/index.d.ts +2 -0
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +2 -0
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/mcp/index.d.ts +14 -2
- package/dist/ai/mcp/index.d.ts.map +1 -1
- package/dist/ai/mcp/index.js +11 -1
- package/dist/ai/mcp/index.js.map +1 -1
- package/dist/ai/mcp/servers/analytics/index.d.ts +19 -0
- package/dist/ai/mcp/servers/analytics/index.d.ts.map +1 -0
- package/dist/ai/mcp/servers/analytics/index.js +556 -0
- package/dist/ai/mcp/servers/analytics/index.js.map +1 -0
- package/dist/ai/mcp/servers/content-manager/content-provider.d.ts +61 -0
- package/dist/ai/mcp/servers/content-manager/content-provider.d.ts.map +1 -0
- package/dist/ai/mcp/servers/content-manager/content-provider.js +8 -0
- package/dist/ai/mcp/servers/content-manager/content-provider.js.map +1 -0
- package/dist/ai/mcp/servers/content-manager/index.d.ts +19 -0
- package/dist/ai/mcp/servers/content-manager/index.d.ts.map +1 -0
- package/dist/ai/mcp/servers/content-manager/index.js +236 -0
- package/dist/ai/mcp/servers/content-manager/index.js.map +1 -0
- package/dist/ai/mcp/servers/design-tokens/index.d.ts +19 -0
- package/dist/ai/mcp/servers/design-tokens/index.d.ts.map +1 -0
- package/dist/ai/mcp/servers/design-tokens/index.js +422 -0
- package/dist/ai/mcp/servers/design-tokens/index.js.map +1 -0
- package/dist/ai/mcp/servers/design-tokens/token-provider.d.ts +59 -0
- package/dist/ai/mcp/servers/design-tokens/token-provider.d.ts.map +1 -0
- package/dist/ai/mcp/servers/design-tokens/token-provider.js +8 -0
- package/dist/ai/mcp/servers/design-tokens/token-provider.js.map +1 -0
- package/dist/ai/mcp/servers/promptintel/index.d.ts +19 -0
- package/dist/ai/mcp/servers/promptintel/index.d.ts.map +1 -0
- package/dist/ai/mcp/servers/promptintel/index.js +323 -0
- package/dist/ai/mcp/servers/promptintel/index.js.map +1 -0
- package/dist/ai/mcp/servers/shared/cache.d.ts +62 -0
- package/dist/ai/mcp/servers/shared/cache.d.ts.map +1 -0
- package/dist/ai/mcp/servers/shared/cache.js +117 -0
- package/dist/ai/mcp/servers/shared/cache.js.map +1 -0
- package/dist/ai/mcp/servers/shared/promptintel-client.d.ts +53 -0
- package/dist/ai/mcp/servers/shared/promptintel-client.d.ts.map +1 -0
- package/dist/ai/mcp/servers/shared/promptintel-client.js +185 -0
- package/dist/ai/mcp/servers/shared/promptintel-client.js.map +1 -0
- package/dist/ai/mcp/servers/shared/promptintel-types.d.ts +85 -0
- package/dist/ai/mcp/servers/shared/promptintel-types.d.ts.map +1 -0
- package/dist/ai/mcp/servers/shared/promptintel-types.js +7 -0
- package/dist/ai/mcp/servers/shared/promptintel-types.js.map +1 -0
- package/dist/ai/mcp/servers/shared/rate-limiter.d.ts +54 -0
- package/dist/ai/mcp/servers/shared/rate-limiter.d.ts.map +1 -0
- package/dist/ai/mcp/servers/shared/rate-limiter.js +122 -0
- package/dist/ai/mcp/servers/shared/rate-limiter.js.map +1 -0
- package/dist/ai/mcp/servers/shared/redis-client.d.ts +54 -0
- package/dist/ai/mcp/servers/shared/redis-client.d.ts.map +1 -0
- package/dist/ai/mcp/servers/shared/redis-client.js +225 -0
- package/dist/ai/mcp/servers/shared/redis-client.js.map +1 -0
- package/dist/ai/mcp/servers/shared/types.d.ts +292 -0
- package/dist/ai/mcp/servers/shared/types.d.ts.map +1 -0
- package/dist/ai/mcp/servers/shared/types.js +6 -0
- package/dist/ai/mcp/servers/shared/types.js.map +1 -0
- package/dist/ai/mcp/servers/shared/utils.d.ts +41 -0
- package/dist/ai/mcp/servers/shared/utils.d.ts.map +1 -0
- package/dist/ai/mcp/servers/shared/utils.js +183 -0
- package/dist/ai/mcp/servers/shared/utils.js.map +1 -0
- package/dist/ai/memory/config.d.ts +87 -0
- package/dist/ai/memory/config.d.ts.map +1 -0
- package/dist/ai/memory/config.js +154 -0
- package/dist/ai/memory/config.js.map +1 -0
- package/dist/ai/memory/dcyfr-memory.d.ts +63 -0
- package/dist/ai/memory/dcyfr-memory.d.ts.map +1 -0
- package/dist/ai/memory/dcyfr-memory.js +270 -0
- package/dist/ai/memory/dcyfr-memory.js.map +1 -0
- package/dist/ai/memory/index.d.ts +15 -0
- package/dist/ai/memory/index.d.ts.map +1 -0
- package/dist/ai/memory/index.js +15 -0
- package/dist/ai/memory/index.js.map +1 -0
- package/dist/ai/memory/mem0-client.d.ts +108 -0
- package/dist/ai/memory/mem0-client.d.ts.map +1 -0
- package/dist/ai/memory/mem0-client.js +166 -0
- package/dist/ai/memory/mem0-client.js.map +1 -0
- package/dist/ai/memory/types.d.ts +175 -0
- package/dist/ai/memory/types.d.ts.map +1 -0
- package/dist/ai/memory/types.js +10 -0
- package/dist/ai/memory/types.js.map +1 -0
- package/package.json +46 -8
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* PromptIntel MCP Server
|
|
4
|
+
*
|
|
5
|
+
* Provides AI assistants with direct access to PromptIntel threat intelligence database.
|
|
6
|
+
* Enables real-time security scanning, threat detection, and vulnerability reporting.
|
|
7
|
+
*
|
|
8
|
+
* Tools:
|
|
9
|
+
* - promptintel:searchThreats - Search IoPC database for adversarial prompt patterns
|
|
10
|
+
* - promptintel:getTaxonomy - Fetch threat attack technique taxonomy
|
|
11
|
+
* - promptintel:submitReport - Submit security finding or vulnerability
|
|
12
|
+
*
|
|
13
|
+
* Resources:
|
|
14
|
+
* - promptintel://threats/critical - Critical severity threats
|
|
15
|
+
* - promptintel://taxonomy - Full threat taxonomy
|
|
16
|
+
* - promptintel://health - API health status
|
|
17
|
+
*/
|
|
18
|
+
import { FastMCP } from 'fastmcp';
|
|
19
|
+
import { z } from 'zod';
|
|
20
|
+
import { PromptIntelClient } from '../shared/promptintel-client.js';
|
|
21
|
+
import { handleToolError, logToolExecution, measurePerformance, } from '../shared/utils.js';
|
|
22
|
+
import { SimpleCache } from '../shared/cache.js';
|
|
23
|
+
// ============================================================================
|
|
24
|
+
// Server Configuration
|
|
25
|
+
// ============================================================================
|
|
26
|
+
const server = new FastMCP({
|
|
27
|
+
name: 'dcyfr-promptintel',
|
|
28
|
+
version: '1.0.0',
|
|
29
|
+
instructions: 'Provides access to PromptIntel threat intelligence platform. Use these tools to search IoPC (Indicators of Prompt Compromise), analyze attack patterns, and submit security findings. All data is from collaborative threat intelligence community.',
|
|
30
|
+
});
|
|
31
|
+
// ============================================================================
|
|
32
|
+
// Client Initialization
|
|
33
|
+
// ============================================================================
|
|
34
|
+
const apiKey = process.env.PROMPTINTEL_API_KEY;
|
|
35
|
+
if (!apiKey) {
|
|
36
|
+
throw new Error('PROMPTINTEL_API_KEY environment variable is required. Get your key from https://promptintel.novahunting.ai/account/api-keys');
|
|
37
|
+
}
|
|
38
|
+
const client = new PromptIntelClient({
|
|
39
|
+
apiKey,
|
|
40
|
+
baseUrl: 'https://api.promptintel.novahunting.ai/api/v1',
|
|
41
|
+
timeout: 15000,
|
|
42
|
+
});
|
|
43
|
+
// ============================================================================
|
|
44
|
+
// Cache Configuration (5-minute TTL)
|
|
45
|
+
// ============================================================================
|
|
46
|
+
const promptIntelCache = new SimpleCache(300000);
|
|
47
|
+
// ============================================================================
|
|
48
|
+
// Tool 1: Search Threats
|
|
49
|
+
// ============================================================================
|
|
50
|
+
server.addTool({
|
|
51
|
+
name: 'promptintel:searchThreats',
|
|
52
|
+
description: 'Search IoPC (Indicators of Prompt Compromise) database for adversarial prompt patterns and attack techniques. Filter by severity and category to find relevant threats.',
|
|
53
|
+
parameters: z.object({
|
|
54
|
+
severity: z
|
|
55
|
+
.enum(['critical', 'high', 'medium', 'low', 'info'])
|
|
56
|
+
.optional()
|
|
57
|
+
.describe('Filter by severity level'),
|
|
58
|
+
category: z
|
|
59
|
+
.string()
|
|
60
|
+
.optional()
|
|
61
|
+
.describe('Filter by threat category (e.g., injection, manipulation)'),
|
|
62
|
+
limit: z
|
|
63
|
+
.number()
|
|
64
|
+
.optional()
|
|
65
|
+
.default(20)
|
|
66
|
+
.describe('Maximum number of results (max 100)'),
|
|
67
|
+
}),
|
|
68
|
+
annotations: {
|
|
69
|
+
readOnlyHint: true,
|
|
70
|
+
openWorldHint: false,
|
|
71
|
+
},
|
|
72
|
+
execute: async (args, { log }) => {
|
|
73
|
+
try {
|
|
74
|
+
const { result, durationMs } = await measurePerformance(async () => {
|
|
75
|
+
const cacheKey = `threats:${args.severity}:${args.category}:${args.limit}`;
|
|
76
|
+
const cached = promptIntelCache.get(cacheKey);
|
|
77
|
+
if (cached) {
|
|
78
|
+
log.info('Returning cached threats');
|
|
79
|
+
return cached;
|
|
80
|
+
}
|
|
81
|
+
const threats = await client.getPrompts({
|
|
82
|
+
severity: args.severity,
|
|
83
|
+
category: args.category,
|
|
84
|
+
limit: Math.min(args.limit || 20, 100),
|
|
85
|
+
});
|
|
86
|
+
promptIntelCache.set(cacheKey, threats);
|
|
87
|
+
return threats;
|
|
88
|
+
}, 'searchThreats');
|
|
89
|
+
logToolExecution('promptintel:searchThreats', { severity: args.severity, category: args.category, limit: args.limit }, true, durationMs);
|
|
90
|
+
return JSON.stringify({
|
|
91
|
+
count: Array.isArray(result) ? result.length : 0,
|
|
92
|
+
threats: result,
|
|
93
|
+
}, null, 2);
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
logToolExecution('promptintel:searchThreats', { severity: args.severity, category: args.category }, false);
|
|
97
|
+
return handleToolError(error);
|
|
98
|
+
}
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
// ============================================================================
|
|
102
|
+
// Tool 2: Get Taxonomy
|
|
103
|
+
// ============================================================================
|
|
104
|
+
server.addTool({
|
|
105
|
+
name: 'promptintel:getTaxonomy',
|
|
106
|
+
description: 'Fetch threat taxonomy - hierarchical classification of attack techniques, defense strategies, and security categories.',
|
|
107
|
+
parameters: z.object({
|
|
108
|
+
limit: z
|
|
109
|
+
.number()
|
|
110
|
+
.optional()
|
|
111
|
+
.default(50)
|
|
112
|
+
.describe('Maximum number of taxonomy entries (max 100)'),
|
|
113
|
+
}),
|
|
114
|
+
annotations: {
|
|
115
|
+
readOnlyHint: true,
|
|
116
|
+
openWorldHint: false,
|
|
117
|
+
},
|
|
118
|
+
execute: async (args, { log }) => {
|
|
119
|
+
try {
|
|
120
|
+
const { result, durationMs } = await measurePerformance(async () => {
|
|
121
|
+
const cacheKey = `taxonomy:${args.limit}`;
|
|
122
|
+
const cached = promptIntelCache.get(cacheKey);
|
|
123
|
+
if (cached) {
|
|
124
|
+
log.info('Returning cached taxonomy');
|
|
125
|
+
return cached;
|
|
126
|
+
}
|
|
127
|
+
const taxonomy = await client.getTaxonomy({
|
|
128
|
+
limit: Math.min(args.limit || 50, 100),
|
|
129
|
+
});
|
|
130
|
+
promptIntelCache.set(cacheKey, taxonomy);
|
|
131
|
+
return taxonomy;
|
|
132
|
+
}, 'getTaxonomy');
|
|
133
|
+
const taxonomyArray = Array.isArray(result) ? result : [result];
|
|
134
|
+
const categories = new Set();
|
|
135
|
+
for (const item of taxonomyArray) {
|
|
136
|
+
if (typeof item === 'object' && item !== null && 'category_type' in item) {
|
|
137
|
+
const categoryType = item.category_type;
|
|
138
|
+
if (typeof categoryType === 'string') {
|
|
139
|
+
categories.add(categoryType);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
logToolExecution('promptintel:getTaxonomy', { limit: args.limit }, true, durationMs);
|
|
144
|
+
return JSON.stringify({
|
|
145
|
+
count: taxonomyArray.length,
|
|
146
|
+
categories: Array.from(categories),
|
|
147
|
+
taxonomy: result,
|
|
148
|
+
}, null, 2);
|
|
149
|
+
}
|
|
150
|
+
catch (error) {
|
|
151
|
+
logToolExecution('promptintel:getTaxonomy', { limit: args.limit }, false);
|
|
152
|
+
return handleToolError(error);
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
});
|
|
156
|
+
// ============================================================================
|
|
157
|
+
// Tool 3: Submit Report
|
|
158
|
+
// ============================================================================
|
|
159
|
+
server.addTool({
|
|
160
|
+
name: 'promptintel:submitReport',
|
|
161
|
+
description: 'Submit a security finding or vulnerability report to PromptIntel community. Helps contribute to collaborative threat intelligence.',
|
|
162
|
+
parameters: z.object({
|
|
163
|
+
agentName: z
|
|
164
|
+
.string()
|
|
165
|
+
.describe('Name of the agent or system being reported'),
|
|
166
|
+
title: z.string().describe('Brief title of the finding'),
|
|
167
|
+
description: z.string().describe('Detailed description of the vulnerability'),
|
|
168
|
+
severity: z
|
|
169
|
+
.enum(['critical', 'high', 'medium', 'low'])
|
|
170
|
+
.describe('Severity level'),
|
|
171
|
+
findings: z
|
|
172
|
+
.record(z.unknown())
|
|
173
|
+
.describe('Structured findings data (JSON object)'),
|
|
174
|
+
metadata: z
|
|
175
|
+
.record(z.unknown())
|
|
176
|
+
.optional()
|
|
177
|
+
.describe('Additional metadata'),
|
|
178
|
+
}),
|
|
179
|
+
annotations: {
|
|
180
|
+
readOnlyHint: false,
|
|
181
|
+
openWorldHint: true,
|
|
182
|
+
},
|
|
183
|
+
execute: async (args, { log }) => {
|
|
184
|
+
try {
|
|
185
|
+
const { result, durationMs } = await measurePerformance(async () => {
|
|
186
|
+
return await client.submitReport({
|
|
187
|
+
agent_name: args.agentName,
|
|
188
|
+
title: args.title,
|
|
189
|
+
description: args.description,
|
|
190
|
+
severity: args.severity,
|
|
191
|
+
findings: args.findings,
|
|
192
|
+
metadata: args.metadata || {},
|
|
193
|
+
});
|
|
194
|
+
}, 'submitReport');
|
|
195
|
+
logToolExecution('promptintel:submitReport', { title: args.title, severity: args.severity }, true, durationMs);
|
|
196
|
+
return JSON.stringify({
|
|
197
|
+
success: true,
|
|
198
|
+
report: {
|
|
199
|
+
id: result?.id ?? 'unknown',
|
|
200
|
+
title: result?.title ?? args.title,
|
|
201
|
+
created_at: result?.created_at ?? new Date().toISOString(),
|
|
202
|
+
},
|
|
203
|
+
message: 'Report submitted successfully to PromptIntel community',
|
|
204
|
+
}, null, 2);
|
|
205
|
+
}
|
|
206
|
+
catch (error) {
|
|
207
|
+
logToolExecution('promptintel:submitReport', { title: args.title, severity: args.severity }, false);
|
|
208
|
+
return handleToolError(error);
|
|
209
|
+
}
|
|
210
|
+
},
|
|
211
|
+
});
|
|
212
|
+
// ============================================================================
|
|
213
|
+
// Resource 1: Critical Threats
|
|
214
|
+
// ============================================================================
|
|
215
|
+
server.addResource({
|
|
216
|
+
uri: 'promptintel://threats/critical',
|
|
217
|
+
name: 'Critical Threats',
|
|
218
|
+
description: 'Critical severity threats from PromptIntel',
|
|
219
|
+
mimeType: 'application/json',
|
|
220
|
+
async load() {
|
|
221
|
+
try {
|
|
222
|
+
const cacheKey = 'resource:critical-threats';
|
|
223
|
+
const cached = promptIntelCache.get(cacheKey);
|
|
224
|
+
if (cached) {
|
|
225
|
+
return {
|
|
226
|
+
text: JSON.stringify(cached, null, 2),
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
const threats = await client.getPrompts({
|
|
230
|
+
severity: 'critical',
|
|
231
|
+
limit: 10,
|
|
232
|
+
order: 'created_at.desc',
|
|
233
|
+
});
|
|
234
|
+
promptIntelCache.set(cacheKey, threats);
|
|
235
|
+
return {
|
|
236
|
+
text: JSON.stringify(threats, null, 2),
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
catch (error) {
|
|
240
|
+
return {
|
|
241
|
+
text: JSON.stringify({
|
|
242
|
+
error: 'Failed to fetch critical threats',
|
|
243
|
+
message: error instanceof Error ? error.message : String(error),
|
|
244
|
+
}, null, 2),
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
});
|
|
249
|
+
// ============================================================================
|
|
250
|
+
// Resource 2: Threat Taxonomy
|
|
251
|
+
// ============================================================================
|
|
252
|
+
server.addResource({
|
|
253
|
+
uri: 'promptintel://taxonomy',
|
|
254
|
+
name: 'Threat Taxonomy',
|
|
255
|
+
description: 'Attack techniques and defense strategies taxonomy',
|
|
256
|
+
mimeType: 'application/json',
|
|
257
|
+
async load() {
|
|
258
|
+
try {
|
|
259
|
+
const cacheKey = 'resource:taxonomy';
|
|
260
|
+
const cached = promptIntelCache.get(cacheKey);
|
|
261
|
+
if (cached) {
|
|
262
|
+
return {
|
|
263
|
+
text: JSON.stringify(cached, null, 2),
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
const taxonomy = await client.getTaxonomy({ limit: 50 });
|
|
267
|
+
promptIntelCache.set(cacheKey, taxonomy);
|
|
268
|
+
return {
|
|
269
|
+
text: JSON.stringify(taxonomy, null, 2),
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
catch (error) {
|
|
273
|
+
return {
|
|
274
|
+
text: JSON.stringify({
|
|
275
|
+
error: 'Failed to fetch taxonomy',
|
|
276
|
+
message: error instanceof Error ? error.message : String(error),
|
|
277
|
+
}, null, 2),
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
});
|
|
282
|
+
// ============================================================================
|
|
283
|
+
// Resource 3: API Health Status
|
|
284
|
+
// ============================================================================
|
|
285
|
+
server.addResource({
|
|
286
|
+
uri: 'promptintel://health',
|
|
287
|
+
name: 'PromptIntel API Health',
|
|
288
|
+
description: 'Current status and health of PromptIntel API',
|
|
289
|
+
mimeType: 'application/json',
|
|
290
|
+
async load() {
|
|
291
|
+
try {
|
|
292
|
+
const cacheKey = 'resource:health';
|
|
293
|
+
const cached = promptIntelCache.get(cacheKey);
|
|
294
|
+
if (cached) {
|
|
295
|
+
return {
|
|
296
|
+
text: JSON.stringify(cached, null, 2),
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
const health = await client.healthCheck();
|
|
300
|
+
promptIntelCache.set(cacheKey, health);
|
|
301
|
+
return {
|
|
302
|
+
text: JSON.stringify(health, null, 2),
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
catch (error) {
|
|
306
|
+
return {
|
|
307
|
+
text: JSON.stringify({
|
|
308
|
+
status: 'down',
|
|
309
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
310
|
+
timestamp: new Date().toISOString(),
|
|
311
|
+
}, null, 2),
|
|
312
|
+
};
|
|
313
|
+
}
|
|
314
|
+
},
|
|
315
|
+
});
|
|
316
|
+
// ============================================================================
|
|
317
|
+
// Start Server
|
|
318
|
+
// ============================================================================
|
|
319
|
+
server.start({
|
|
320
|
+
transportType: 'stdio',
|
|
321
|
+
});
|
|
322
|
+
console.warn('✅ PromptIntel MCP Server started (stdio mode)');
|
|
323
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../packages/ai/mcp/servers/promptintel/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC;IACzB,IAAI,EAAE,mBAAmB;IACzB,OAAO,EAAE,OAAO;IAChB,YAAY,EACV,qPAAqP;CACxP,CAAC,CAAC;AAEH,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;AAC/C,IAAI,CAAC,MAAM,EAAE,CAAC;IACZ,MAAM,IAAI,KAAK,CACb,6HAA6H,CAC9H,CAAC;AACJ,CAAC;AAED,MAAM,MAAM,GAAG,IAAI,iBAAiB,CAAC;IACnC,MAAM;IACN,OAAO,EAAE,+CAA+C;IACxD,OAAO,EAAE,KAAK;CACf,CAAC,CAAC;AAEH,+EAA+E;AAC/E,qCAAqC;AACrC,+EAA+E;AAE/E,MAAM,gBAAgB,GAAG,IAAI,WAAW,CAAU,MAAM,CAAC,CAAC;AAE1D,+EAA+E;AAC/E,yBAAyB;AACzB,+EAA+E;AAE/E,MAAM,CAAC,OAAO,CAAC;IACb,IAAI,EAAE,2BAA2B;IACjC,WAAW,EACT,yKAAyK;IAC3K,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,QAAQ,EAAE,CAAC;aACR,IAAI,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;aACnD,QAAQ,EAAE;aACV,QAAQ,CAAC,0BAA0B,CAAC;QACvC,QAAQ,EAAE,CAAC;aACR,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,QAAQ,CAAC,2DAA2D,CAAC;QACxE,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,qCAAqC,CAAC;KACnD,CAAC;IACF,WAAW,EAAE;QACX,YAAY,EAAE,IAAI;QAClB,aAAa,EAAE,KAAK;KACrB;IACD,OAAO,EAAE,KAAK,EACZ,IAA8D,EAC9D,EAAE,GAAG,EAAgB,EACrB,EAAE;QACF,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,kBAAkB,CAAC,KAAK,IAAI,EAAE;gBACjE,MAAM,QAAQ,GAAG,WAAW,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC3E,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAE9C,IAAI,MAAM,EAAE,CAAC;oBACX,GAAG,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;oBACrC,OAAO,MAAM,CAAC;gBAChB,CAAC;gBAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;oBACtC,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,GAAG,CAAC;iBACvC,CAAC,CAAC;gBAEH,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBACxC,OAAO,OAAO,CAAC;YACjB,CAAC,EAAE,eAAe,CAAC,CAAC;YAEpB,gBAAgB,CACd,2BAA2B,EAC3B,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EACvE,IAAI,EACJ,UAAU,CACX,CAAC;YAEF,OAAO,IAAI,CAAC,SAAS,CACnB;gBACE,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBAChD,OAAO,EAAE,MAAM;aAChB,EACD,IAAI,EACJ,CAAC,CACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gBAAgB,CACd,2BAA2B,EAC3B,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EACpD,KAAK,CACN,CAAC;YACF,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,+EAA+E;AAC/E,uBAAuB;AACvB,+EAA+E;AAE/E,MAAM,CAAC,OAAO,CAAC;IACb,IAAI,EAAE,yBAAyB;IAC/B,WAAW,EACT,wHAAwH;IAC1H,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,KAAK,EAAE,CAAC;aACL,MAAM,EAAE;aACR,QAAQ,EAAE;aACV,OAAO,CAAC,EAAE,CAAC;aACX,QAAQ,CAAC,8CAA8C,CAAC;KAC5D,CAAC;IACF,WAAW,EAAE;QACX,YAAY,EAAE,IAAI;QAClB,aAAa,EAAE,KAAK;KACrB;IACD,OAAO,EAAE,KAAK,EACZ,IAAwB,EACxB,EAAE,GAAG,EAAgB,EACrB,EAAE;QACF,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,kBAAkB,CAAC,KAAK,IAAI,EAAE;gBACjE,MAAM,QAAQ,GAAG,YAAY,IAAI,CAAC,KAAK,EAAE,CAAC;gBAC1C,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBAE9C,IAAI,MAAM,EAAE,CAAC;oBACX,GAAG,CAAC,IAAI,CAAC,2BAA2B,CAAC,CAAC;oBACtC,OAAO,MAAM,CAAC;gBAChB,CAAC;gBAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC;oBACxC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,EAAE,GAAG,CAAC;iBACvC,CAAC,CAAC;gBAEH,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;gBACzC,OAAO,QAAQ,CAAC;YAClB,CAAC,EAAE,aAAa,CAAC,CAAC;YAElB,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;YAChE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;YAErC,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,CAAC;gBACjC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,eAAe,IAAI,IAAI,EAAE,CAAC;oBACzE,MAAM,YAAY,GAAI,IAAgC,CAAC,aAAa,CAAC;oBACrE,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;wBACrC,UAAU,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;oBAC/B,CAAC;gBACH,CAAC;YACH,CAAC;YAED,gBAAgB,CACd,yBAAyB,EACzB,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EACrB,IAAI,EACJ,UAAU,CACX,CAAC;YAEF,OAAO,IAAI,CAAC,SAAS,CACnB;gBACE,KAAK,EAAE,aAAa,CAAC,MAAM;gBAC3B,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC;gBAClC,QAAQ,EAAE,MAAM;aACjB,EACD,IAAI,EACJ,CAAC,CACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gBAAgB,CAAC,yBAAyB,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;YAC1E,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E,MAAM,CAAC,OAAO,CAAC;IACb,IAAI,EAAE,0BAA0B;IAChC,WAAW,EACT,oIAAoI;IACtI,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC;QACnB,SAAS,EAAE,CAAC;aACT,MAAM,EAAE;aACR,QAAQ,CAAC,4CAA4C,CAAC;QACzD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,4BAA4B,CAAC;QACxD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2CAA2C,CAAC;QAC7E,QAAQ,EAAE,CAAC;aACR,IAAI,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;aAC3C,QAAQ,CAAC,gBAAgB,CAAC;QAC7B,QAAQ,EAAE,CAAC;aACR,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;aACnB,QAAQ,CAAC,wCAAwC,CAAC;QACrD,QAAQ,EAAE,CAAC;aACR,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;aACnB,QAAQ,EAAE;aACV,QAAQ,CAAC,qBAAqB,CAAC;KACnC,CAAC;IACF,WAAW,EAAE;QACX,YAAY,EAAE,KAAK;QACnB,aAAa,EAAE,IAAI;KACpB;IACD,OAAO,EAAE,KAAK,EACZ,IAOC,EACD,EAAE,GAAG,EAAgB,EACrB,EAAE;QACF,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,kBAAkB,CAAC,KAAK,IAAI,EAAE;gBACjE,OAAO,MAAM,MAAM,CAAC,YAAY,CAAC;oBAC/B,UAAU,EAAE,IAAI,CAAC,SAAS;oBAC1B,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,WAAW,EAAE,IAAI,CAAC,WAAW;oBAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ;oBACvB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;iBAC9B,CAAC,CAAC;YACL,CAAC,EAAE,cAAc,CAAC,CAAC;YAEnB,gBAAgB,CACd,0BAA0B,EAC1B,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAC9C,IAAI,EACJ,UAAU,CACX,CAAC;YAEF,OAAO,IAAI,CAAC,SAAS,CACnB;gBACE,OAAO,EAAE,IAAI;gBACb,MAAM,EAAE;oBACN,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,SAAS;oBAC3B,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK;oBAClC,UAAU,EAAE,MAAM,EAAE,UAAU,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBAC3D;gBACD,OAAO,EAAE,wDAAwD;aAClE,EACD,IAAI,EACJ,CAAC,CACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,gBAAgB,CACd,0BAA0B,EAC1B,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAC9C,KAAK,CACN,CAAC;YACF,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,+EAA+E;AAC/E,+BAA+B;AAC/B,+EAA+E;AAE/E,MAAM,CAAC,WAAW,CAAC;IACjB,GAAG,EAAE,gCAAgC;IACrC,IAAI,EAAE,kBAAkB;IACxB,WAAW,EAAE,4CAA4C;IACzD,QAAQ,EAAE,kBAAkB;IAC5B,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,2BAA2B,CAAC;YAC7C,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAE9C,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO;oBACL,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC,CAAC;YACJ,CAAC;YAED,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC;gBACtC,QAAQ,EAAE,UAAU;gBACpB,KAAK,EAAE,EAAE;gBACT,KAAK,EAAE,iBAAiB;aACzB,CAAC,CAAC;YAEH,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YAExC,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;aACvC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,KAAK,EAAE,kCAAkC;oBACzC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAChE,EACD,IAAI,EACJ,CAAC,CACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,+EAA+E;AAC/E,8BAA8B;AAC9B,+EAA+E;AAE/E,MAAM,CAAC,WAAW,CAAC;IACjB,GAAG,EAAE,wBAAwB;IAC7B,IAAI,EAAE,iBAAiB;IACvB,WAAW,EAAE,mDAAmD;IAChE,QAAQ,EAAE,kBAAkB;IAC5B,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,mBAAmB,CAAC;YACrC,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAE9C,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO;oBACL,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC,CAAC;YACJ,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;YAEzD,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YAEzC,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;aACxC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,KAAK,EAAE,0BAA0B;oBACjC,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;iBAChE,EACD,IAAI,EACJ,CAAC,CACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,+EAA+E;AAC/E,gCAAgC;AAChC,+EAA+E;AAE/E,MAAM,CAAC,WAAW,CAAC;IACjB,GAAG,EAAE,sBAAsB;IAC3B,IAAI,EAAE,wBAAwB;IAC9B,WAAW,EAAE,8CAA8C;IAC3D,QAAQ,EAAE,kBAAkB;IAC5B,KAAK,CAAC,IAAI;QACR,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,iBAAiB,CAAC;YACnC,MAAM,MAAM,GAAG,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAE9C,IAAI,MAAM,EAAE,CAAC;gBACX,OAAO;oBACL,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC,CAAC;YACJ,CAAC;YAED,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC;YAE1C,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAEvC,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;aACtC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,SAAS,CAClB;oBACE,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;oBACjE,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;iBACpC,EACD,IAAI,EACJ,CAAC,CACF;aACF,CAAC;QACJ,CAAC;IACH,CAAC;CACF,CAAC,CAAC;AAEH,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E,MAAM,CAAC,KAAK,CAAC;IACX,aAAa,EAAE,OAAO;CACvB,CAAC,CAAC;AAEH,OAAO,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple in-memory cache for MCP servers
|
|
3
|
+
* Reduces load on Redis and file system for frequently accessed data
|
|
4
|
+
*/
|
|
5
|
+
export declare class SimpleCache<T> {
|
|
6
|
+
private cache;
|
|
7
|
+
private defaultTtl;
|
|
8
|
+
constructor(defaultTtl?: number);
|
|
9
|
+
/**
|
|
10
|
+
* Set a cache entry
|
|
11
|
+
*/
|
|
12
|
+
set(key: string, data: T, ttl?: number): void;
|
|
13
|
+
/**
|
|
14
|
+
* Get a cache entry if valid, null if expired or missing
|
|
15
|
+
*/
|
|
16
|
+
get(key: string): T | null;
|
|
17
|
+
/**
|
|
18
|
+
* Get or compute a cache entry
|
|
19
|
+
*/
|
|
20
|
+
getOrCompute(key: string, compute: () => Promise<T>, ttl?: number): Promise<T>;
|
|
21
|
+
/**
|
|
22
|
+
* Check if cache has a valid entry
|
|
23
|
+
*/
|
|
24
|
+
has(key: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Clear a specific cache entry
|
|
27
|
+
*/
|
|
28
|
+
delete(key: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Clear all cache entries
|
|
31
|
+
*/
|
|
32
|
+
clear(): void;
|
|
33
|
+
/**
|
|
34
|
+
* Clear expired entries
|
|
35
|
+
*/
|
|
36
|
+
clearExpired(): void;
|
|
37
|
+
/**
|
|
38
|
+
* Get cache statistics
|
|
39
|
+
*/
|
|
40
|
+
getStats(): {
|
|
41
|
+
total: number;
|
|
42
|
+
valid: number;
|
|
43
|
+
expired: number;
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Global cache instances for each MCP server
|
|
48
|
+
*/
|
|
49
|
+
export declare const analyticsCache: SimpleCache<unknown>;
|
|
50
|
+
export declare const tokensCache: SimpleCache<unknown>;
|
|
51
|
+
export declare const contentCache: SimpleCache<unknown>;
|
|
52
|
+
/**
|
|
53
|
+
* Semantic Scholar MCP cache instances
|
|
54
|
+
* - scholarPapersCache: Hot cache for paper metadata (1 minute)
|
|
55
|
+
* - scholarSearchCache: Search results cache (5 minutes)
|
|
56
|
+
* - scholarAuthorsCache: Author metadata cache (5 minutes)
|
|
57
|
+
* Note: Long-term persistence (90 days) is handled via Redis in the MCP server
|
|
58
|
+
*/
|
|
59
|
+
export declare const scholarPapersCache: SimpleCache<unknown>;
|
|
60
|
+
export declare const scholarSearchCache: SimpleCache<unknown>;
|
|
61
|
+
export declare const scholarAuthorsCache: SimpleCache<unknown>;
|
|
62
|
+
//# sourceMappingURL=cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.d.ts","sourceRoot":"","sources":["../../../../../packages/ai/mcp/servers/shared/cache.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,qBAAa,WAAW,CAAC,CAAC;IACxB,OAAO,CAAC,KAAK,CAAoC;IACjD,OAAO,CAAC,UAAU,CAAS;gBAEf,UAAU,GAAE,MAAc;IAKtC;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI;IAU7C;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAiB1B;;OAEG;IACG,YAAY,CAChB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACzB,GAAG,CAAC,EAAE,MAAM,GACX,OAAO,CAAC,CAAC,CAAC;IAab;;OAEG;IACH,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIzB;;OAEG;IACH,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIzB;;OAEG;IACH,KAAK,IAAI,IAAI;IAIb;;OAEG;IACH,YAAY,IAAI,IAAI;IAUpB;;OAEG;IACH,QAAQ;;;;;CAmBT;AAED;;GAEG;AACH,eAAO,MAAM,cAAc,sBAAyB,CAAC;AACrD,eAAO,MAAM,WAAW,sBAA0B,CAAC;AACnD,eAAO,MAAM,YAAY,sBAA0B,CAAC;AAEpD;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,sBAAyB,CAAC;AACzD,eAAO,MAAM,kBAAkB,sBAA0B,CAAC;AAC1D,eAAO,MAAM,mBAAmB,sBAA0B,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple in-memory cache for MCP servers
|
|
3
|
+
* Reduces load on Redis and file system for frequently accessed data
|
|
4
|
+
*/
|
|
5
|
+
export class SimpleCache {
|
|
6
|
+
cache = new Map();
|
|
7
|
+
defaultTtl;
|
|
8
|
+
constructor(defaultTtl = 60000) {
|
|
9
|
+
// Default 1 minute
|
|
10
|
+
this.defaultTtl = defaultTtl;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Set a cache entry
|
|
14
|
+
*/
|
|
15
|
+
set(key, data, ttl) {
|
|
16
|
+
const entry = {
|
|
17
|
+
data,
|
|
18
|
+
cachedAt: Date.now(),
|
|
19
|
+
ttl: ttl ?? this.defaultTtl,
|
|
20
|
+
};
|
|
21
|
+
this.cache.set(key, entry);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get a cache entry if valid, null if expired or missing
|
|
25
|
+
*/
|
|
26
|
+
get(key) {
|
|
27
|
+
const entry = this.cache.get(key);
|
|
28
|
+
if (!entry) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const isExpired = Date.now() - entry.cachedAt > entry.ttl;
|
|
32
|
+
if (isExpired) {
|
|
33
|
+
this.cache.delete(key);
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
return entry.data;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Get or compute a cache entry
|
|
40
|
+
*/
|
|
41
|
+
async getOrCompute(key, compute, ttl) {
|
|
42
|
+
const cached = this.get(key);
|
|
43
|
+
if (cached !== null) {
|
|
44
|
+
return cached;
|
|
45
|
+
}
|
|
46
|
+
const data = await compute();
|
|
47
|
+
this.set(key, data, ttl);
|
|
48
|
+
return data;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check if cache has a valid entry
|
|
52
|
+
*/
|
|
53
|
+
has(key) {
|
|
54
|
+
return this.get(key) !== null;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Clear a specific cache entry
|
|
58
|
+
*/
|
|
59
|
+
delete(key) {
|
|
60
|
+
this.cache.delete(key);
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Clear all cache entries
|
|
64
|
+
*/
|
|
65
|
+
clear() {
|
|
66
|
+
this.cache.clear();
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Clear expired entries
|
|
70
|
+
*/
|
|
71
|
+
clearExpired() {
|
|
72
|
+
const now = Date.now();
|
|
73
|
+
for (const [key, entry] of this.cache.entries()) {
|
|
74
|
+
if (now - entry.cachedAt > entry.ttl) {
|
|
75
|
+
this.cache.delete(key);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get cache statistics
|
|
81
|
+
*/
|
|
82
|
+
getStats() {
|
|
83
|
+
let validCount = 0;
|
|
84
|
+
let expiredCount = 0;
|
|
85
|
+
const now = Date.now();
|
|
86
|
+
for (const entry of this.cache.values()) {
|
|
87
|
+
if (now - entry.cachedAt > entry.ttl) {
|
|
88
|
+
expiredCount++;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
validCount++;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return {
|
|
95
|
+
total: this.cache.size,
|
|
96
|
+
valid: validCount,
|
|
97
|
+
expired: expiredCount,
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Global cache instances for each MCP server
|
|
103
|
+
*/
|
|
104
|
+
export const analyticsCache = new SimpleCache(60000); // 1 minute
|
|
105
|
+
export const tokensCache = new SimpleCache(300000); // 5 minutes
|
|
106
|
+
export const contentCache = new SimpleCache(300000); // 5 minutes
|
|
107
|
+
/**
|
|
108
|
+
* Semantic Scholar MCP cache instances
|
|
109
|
+
* - scholarPapersCache: Hot cache for paper metadata (1 minute)
|
|
110
|
+
* - scholarSearchCache: Search results cache (5 minutes)
|
|
111
|
+
* - scholarAuthorsCache: Author metadata cache (5 minutes)
|
|
112
|
+
* Note: Long-term persistence (90 days) is handled via Redis in the MCP server
|
|
113
|
+
*/
|
|
114
|
+
export const scholarPapersCache = new SimpleCache(60000); // 1 minute
|
|
115
|
+
export const scholarSearchCache = new SimpleCache(300000); // 5 minutes
|
|
116
|
+
export const scholarAuthorsCache = new SimpleCache(300000); // 5 minutes
|
|
117
|
+
//# sourceMappingURL=cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cache.js","sourceRoot":"","sources":["../../../../../packages/ai/mcp/servers/shared/cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PromptIntel API Client
|
|
3
|
+
* Handles authentication, rate limiting, and error handling for PostgREST API
|
|
4
|
+
* Supports filtering, ordering, and pagination via PostgREST query parameters
|
|
5
|
+
*/
|
|
6
|
+
import type { PromptIntelIoPC, PromptIntelTaxonomy, PromptIntelAgentReport, PromptIntelSearchParams, PromptIntelClientConfig, PromptIntelHealthResponse } from './promptintel-types.js';
|
|
7
|
+
export declare class PromptIntelClient {
|
|
8
|
+
private baseUrl;
|
|
9
|
+
private apiKey;
|
|
10
|
+
private timeout;
|
|
11
|
+
constructor(config: PromptIntelClientConfig);
|
|
12
|
+
/**
|
|
13
|
+
* Build request headers with authentication
|
|
14
|
+
*/
|
|
15
|
+
private buildHeaders;
|
|
16
|
+
/**
|
|
17
|
+
* Build URL with PostgREST query parameters
|
|
18
|
+
* Supports filtering, ordering, pagination, and column selection
|
|
19
|
+
*/
|
|
20
|
+
private buildUrl;
|
|
21
|
+
/**
|
|
22
|
+
* Fetch with timeout support
|
|
23
|
+
*/
|
|
24
|
+
private fetchWithTimeout;
|
|
25
|
+
/**
|
|
26
|
+
* Handle error responses
|
|
27
|
+
*/
|
|
28
|
+
private handleErrorResponse;
|
|
29
|
+
/**
|
|
30
|
+
* Fetch IoPC (Indicators of Prompt Compromise)
|
|
31
|
+
* Returns adversarial prompt patterns and attack indicators
|
|
32
|
+
*/
|
|
33
|
+
getPrompts(params?: PromptIntelSearchParams): Promise<PromptIntelIoPC[]>;
|
|
34
|
+
/**
|
|
35
|
+
* Fetch threat taxonomy
|
|
36
|
+
* Returns hierarchical classification of attack techniques
|
|
37
|
+
*/
|
|
38
|
+
getTaxonomy(params?: PromptIntelSearchParams): Promise<PromptIntelTaxonomy[]>;
|
|
39
|
+
/**
|
|
40
|
+
* Fetch agent reports (all or user's own)
|
|
41
|
+
*/
|
|
42
|
+
getAgentReports(mine?: boolean, params?: PromptIntelSearchParams): Promise<PromptIntelAgentReport[]>;
|
|
43
|
+
/**
|
|
44
|
+
* Submit a new security finding or vulnerability report
|
|
45
|
+
*/
|
|
46
|
+
submitReport(report: Omit<PromptIntelAgentReport, 'id' | 'created_at'>): Promise<PromptIntelAgentReport>;
|
|
47
|
+
/**
|
|
48
|
+
* Check API health and connectivity
|
|
49
|
+
* Does not require authentication
|
|
50
|
+
*/
|
|
51
|
+
healthCheck(): Promise<PromptIntelHealthResponse>;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=promptintel-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"promptintel-client.d.ts","sourceRoot":"","sources":["../../../../../packages/ai/mcp/servers/shared/promptintel-client.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,EACvB,uBAAuB,EACvB,yBAAyB,EAE1B,MAAM,wBAAwB,CAAC;AAEhC,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAAS;gBAEZ,MAAM,EAAE,uBAAuB;IAU3C;;OAEG;IACH,OAAO,CAAC,YAAY;IAQpB;;;OAGG;IACH,OAAO,CAAC,QAAQ;IAoChB;;OAEG;YACW,gBAAgB;IAoB9B;;OAEG;YACW,mBAAmB;IAuBjC;;;OAGG;IACG,UAAU,CAAC,MAAM,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAgB9E;;;OAGG;IACG,WAAW,CAAC,MAAM,CAAC,EAAE,uBAAuB,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAgBnF;;OAEG;IACG,eAAe,CACnB,IAAI,UAAQ,EACZ,MAAM,CAAC,EAAE,uBAAuB,GAC/B,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAiBpC;;OAEG;IACG,YAAY,CAChB,MAAM,EAAE,IAAI,CAAC,sBAAsB,EAAE,IAAI,GAAG,YAAY,CAAC,GACxD,OAAO,CAAC,sBAAsB,CAAC;IAoBlC;;;OAGG;IACG,WAAW,IAAI,OAAO,CAAC,yBAAyB,CAAC;CAaxD"}
|