@mcp-shark/mcp-shark 1.5.3 → 1.5.5

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.
Files changed (188) hide show
  1. package/README.md +32 -96
  2. package/bin/mcp-shark.js +1 -1
  3. package/core/configs/codex.js +68 -0
  4. package/core/configs/environment.js +51 -0
  5. package/{lib/common → core}/configs/index.js +16 -1
  6. package/core/constants/Defaults.js +15 -0
  7. package/core/constants/HttpStatus.js +14 -0
  8. package/core/constants/Server.js +20 -0
  9. package/core/constants/StatusCodes.js +25 -0
  10. package/core/constants/index.js +7 -0
  11. package/core/container/DependencyContainer.js +179 -0
  12. package/core/db/init.js +33 -0
  13. package/core/index.js +10 -0
  14. package/{mcp-server/lib/common/error.js → core/libraries/ErrorLibrary.js} +4 -0
  15. package/core/libraries/LoggerLibrary.js +91 -0
  16. package/core/libraries/SerializationLibrary.js +32 -0
  17. package/core/libraries/bootstrap-logger.js +19 -0
  18. package/core/libraries/errors/ApplicationError.js +97 -0
  19. package/core/libraries/index.js +17 -0
  20. package/{mcp-server/lib → core/mcp-server}/auditor/audit.js +77 -53
  21. package/core/mcp-server/index.js +192 -0
  22. package/{mcp-server/lib → core/mcp-server}/server/external/all.js +1 -1
  23. package/core/mcp-server/server/external/config.js +75 -0
  24. package/{mcp-server/lib → core/mcp-server}/server/external/single/client.js +1 -1
  25. package/{mcp-server/lib → core/mcp-server}/server/external/single/request.js +1 -1
  26. package/{mcp-server/lib → core/mcp-server}/server/external/single/run.js +20 -11
  27. package/{mcp-server/lib → core/mcp-server}/server/external/single/transport.js +1 -1
  28. package/{mcp-server/lib → core/mcp-server}/server/internal/handlers/error.js +1 -1
  29. package/core/mcp-server/server/internal/handlers/prompts-get.js +28 -0
  30. package/core/mcp-server/server/internal/handlers/prompts-list.js +21 -0
  31. package/core/mcp-server/server/internal/handlers/resources-list.js +21 -0
  32. package/core/mcp-server/server/internal/handlers/resources-read.js +28 -0
  33. package/core/mcp-server/server/internal/handlers/tools-call.js +44 -0
  34. package/core/mcp-server/server/internal/handlers/tools-list.js +23 -0
  35. package/core/mcp-server/server/internal/run.js +53 -0
  36. package/{mcp-server/lib → core/mcp-server}/server/internal/server.js +11 -1
  37. package/core/models/ConversationFilters.js +31 -0
  38. package/core/models/ExportFormat.js +8 -0
  39. package/core/models/RequestFilters.js +43 -0
  40. package/core/models/SessionFilters.js +23 -0
  41. package/core/models/index.js +8 -0
  42. package/core/repositories/AuditRepository.js +233 -0
  43. package/core/repositories/ConversationRepository.js +182 -0
  44. package/core/repositories/PacketRepository.js +237 -0
  45. package/core/repositories/SchemaRepository.js +107 -0
  46. package/core/repositories/SessionRepository.js +59 -0
  47. package/core/repositories/StatisticsRepository.js +54 -0
  48. package/core/repositories/index.js +10 -0
  49. package/core/services/AuditService.js +144 -0
  50. package/core/services/BackupService.js +222 -0
  51. package/core/services/ConfigDetectionService.js +89 -0
  52. package/core/services/ConfigFileService.js +210 -0
  53. package/core/services/ConfigPatchingService.js +137 -0
  54. package/core/services/ConfigService.js +250 -0
  55. package/core/services/ConfigTransformService.js +178 -0
  56. package/core/services/ConversationService.js +19 -0
  57. package/core/services/ExportService.js +117 -0
  58. package/core/services/LogService.js +64 -0
  59. package/core/services/McpClientService.js +235 -0
  60. package/core/services/McpDiscoveryService.js +107 -0
  61. package/core/services/RequestService.js +56 -0
  62. package/core/services/ScanCacheService.js +242 -0
  63. package/core/services/ScanService.js +167 -0
  64. package/core/services/ServerManagementService.js +206 -0
  65. package/core/services/SessionService.js +34 -0
  66. package/core/services/SettingsService.js +163 -0
  67. package/core/services/StatisticsService.js +64 -0
  68. package/core/services/TokenService.js +94 -0
  69. package/core/services/index.js +25 -0
  70. package/core/services/parsers/ConfigParserFactory.js +113 -0
  71. package/core/services/parsers/JsonConfigParser.js +66 -0
  72. package/core/services/parsers/LegacyJsonConfigParser.js +71 -0
  73. package/core/services/parsers/TomlConfigParser.js +87 -0
  74. package/core/services/parsers/index.js +4 -0
  75. package/{ui/server → core}/utils/scan-cache/directory.js +1 -1
  76. package/core/utils/validation.js +77 -0
  77. package/package.json +14 -11
  78. package/ui/dist/assets/index-CArYxKxS.js +35 -0
  79. package/ui/dist/index.html +1 -1
  80. package/ui/server/controllers/BackupController.js +129 -0
  81. package/ui/server/controllers/ConfigController.js +92 -0
  82. package/ui/server/controllers/ConversationController.js +41 -0
  83. package/ui/server/controllers/LogController.js +44 -0
  84. package/ui/server/controllers/McpClientController.js +60 -0
  85. package/ui/server/controllers/McpDiscoveryController.js +44 -0
  86. package/ui/server/controllers/RequestController.js +129 -0
  87. package/ui/server/controllers/ScanController.js +122 -0
  88. package/ui/server/controllers/ServerManagementController.js +134 -0
  89. package/ui/server/controllers/SessionController.js +57 -0
  90. package/ui/server/controllers/SettingsController.js +24 -0
  91. package/ui/server/controllers/StatisticsController.js +54 -0
  92. package/ui/server/controllers/TokenController.js +58 -0
  93. package/ui/server/controllers/index.js +17 -0
  94. package/ui/server/routes/backups/index.js +15 -9
  95. package/ui/server/routes/composite/index.js +62 -32
  96. package/ui/server/routes/composite/servers.js +20 -15
  97. package/ui/server/routes/config.js +13 -172
  98. package/ui/server/routes/conversations.js +9 -19
  99. package/ui/server/routes/help.js +4 -3
  100. package/ui/server/routes/logs.js +14 -26
  101. package/ui/server/routes/playground.js +11 -174
  102. package/ui/server/routes/requests.js +12 -232
  103. package/ui/server/routes/sessions.js +10 -21
  104. package/ui/server/routes/settings.js +10 -192
  105. package/ui/server/routes/smartscan.js +26 -15
  106. package/ui/server/routes/statistics.js +8 -79
  107. package/ui/server/setup.js +162 -0
  108. package/ui/server/swagger/paths/backups.js +151 -0
  109. package/ui/server/swagger/paths/components.js +76 -0
  110. package/ui/server/swagger/paths/config.js +117 -0
  111. package/ui/server/swagger/paths/conversations.js +29 -0
  112. package/ui/server/swagger/paths/help.js +82 -0
  113. package/ui/server/swagger/paths/logs.js +87 -0
  114. package/ui/server/swagger/paths/playground.js +49 -0
  115. package/ui/server/swagger/paths/requests.js +178 -0
  116. package/ui/server/swagger/paths/serverManagement.js +169 -0
  117. package/ui/server/swagger/paths/sessions.js +61 -0
  118. package/ui/server/swagger/paths/settings.js +31 -0
  119. package/ui/server/swagger/paths/smartScan/discovery.js +97 -0
  120. package/ui/server/swagger/paths/smartScan/index.js +13 -0
  121. package/ui/server/swagger/paths/smartScan/scans.js +151 -0
  122. package/ui/server/swagger/paths/smartScan/token.js +71 -0
  123. package/ui/server/swagger/paths/statistics.js +40 -0
  124. package/ui/server/swagger/paths.js +38 -0
  125. package/ui/server/swagger/swagger.js +37 -0
  126. package/ui/server/utils/cleanup.js +99 -0
  127. package/ui/server/utils/config.js +18 -96
  128. package/ui/server/utils/errorHandler.js +43 -0
  129. package/ui/server/utils/logger.js +2 -2
  130. package/ui/server/utils/paths.js +27 -30
  131. package/ui/server/utils/port.js +21 -21
  132. package/ui/server/utils/process.js +18 -10
  133. package/ui/server/utils/processState.js +17 -0
  134. package/ui/server/utils/signals.js +34 -0
  135. package/ui/server/websocket/broadcast.js +33 -0
  136. package/ui/server/websocket/handler.js +52 -0
  137. package/ui/server.js +51 -230
  138. package/ui/src/App.jsx +2 -0
  139. package/ui/src/CompositeSetup.jsx +23 -9
  140. package/ui/src/PacketFilters.jsx +17 -3
  141. package/ui/src/components/AlertModal.jsx +116 -0
  142. package/ui/src/components/App/ApiDocsButton.jsx +57 -0
  143. package/ui/src/components/App/useAppState.js +43 -1
  144. package/ui/src/components/BackupList.jsx +27 -3
  145. package/ui/src/utils/requestPairing.js +35 -36
  146. package/ui/src/utils/requestUtils.js +1 -0
  147. package/lib/common/db/init.js +0 -132
  148. package/lib/common/db/logger.js +0 -349
  149. package/lib/common/db/query.js +0 -403
  150. package/lib/common/logger.js +0 -90
  151. package/mcp-server/index.js +0 -111
  152. package/mcp-server/lib/server/external/config.js +0 -57
  153. package/mcp-server/lib/server/internal/handlers/prompts-get.js +0 -20
  154. package/mcp-server/lib/server/internal/handlers/prompts-list.js +0 -13
  155. package/mcp-server/lib/server/internal/handlers/resources-list.js +0 -13
  156. package/mcp-server/lib/server/internal/handlers/resources-read.js +0 -20
  157. package/mcp-server/lib/server/internal/handlers/tools-call.js +0 -35
  158. package/mcp-server/lib/server/internal/handlers/tools-list.js +0 -15
  159. package/mcp-server/lib/server/internal/run.js +0 -37
  160. package/mcp-server/mcp-shark.js +0 -22
  161. package/ui/dist/assets/index-CFHeMNwd.js +0 -35
  162. package/ui/server/routes/backups/deleteBackup.js +0 -54
  163. package/ui/server/routes/backups/listBackups.js +0 -75
  164. package/ui/server/routes/backups/restoreBackup.js +0 -83
  165. package/ui/server/routes/backups/viewBackup.js +0 -47
  166. package/ui/server/routes/composite/setup.js +0 -129
  167. package/ui/server/routes/composite/status.js +0 -7
  168. package/ui/server/routes/composite/stop.js +0 -39
  169. package/ui/server/routes/composite/utils.js +0 -45
  170. package/ui/server/routes/smartscan/discover.js +0 -118
  171. package/ui/server/routes/smartscan/scans/clearCache.js +0 -23
  172. package/ui/server/routes/smartscan/scans/createBatchScans.js +0 -124
  173. package/ui/server/routes/smartscan/scans/createScan.js +0 -43
  174. package/ui/server/routes/smartscan/scans/getCachedResults.js +0 -52
  175. package/ui/server/routes/smartscan/scans/getScan.js +0 -42
  176. package/ui/server/routes/smartscan/scans/listScans.js +0 -25
  177. package/ui/server/routes/smartscan/scans.js +0 -13
  178. package/ui/server/routes/smartscan/token.js +0 -57
  179. package/ui/server/utils/config-update.js +0 -240
  180. package/ui/server/utils/scan-cache/all-results.js +0 -197
  181. package/ui/server/utils/scan-cache/file-operations.js +0 -107
  182. package/ui/server/utils/scan-cache/hash.js +0 -47
  183. package/ui/server/utils/scan-cache/server-operations.js +0 -85
  184. package/ui/server/utils/scan-cache.js +0 -12
  185. package/ui/server/utils/smartscan-token.js +0 -43
  186. /package/{mcp-server/lib → core/mcp-server}/server/external/kv.js +0 -0
  187. /package/{mcp-server/lib → core/mcp-server}/server/internal/handlers/common.js +0 -0
  188. /package/{mcp-server/lib → core/mcp-server}/server/internal/session.js +0 -0
@@ -1,349 +0,0 @@
1
- /**
2
- * Helper functions for logging HTTP packets to the database for forensic analysis
3
- */
4
-
5
- function getTimestampNs() {
6
- return Number(process.hrtime.bigint());
7
- }
8
-
9
- function getTimestampISO() {
10
- return new Date().toISOString();
11
- }
12
-
13
- function calculateDurationMs(startNs, endNs) {
14
- return (endNs - startNs) / 1_000_000;
15
- }
16
-
17
- /**
18
- * Normalize session ID from various header formats
19
- * Supports: mcp-session-id, Mcp-Session-Id, X-MCP-Session-Id
20
- */
21
- function normalizeSessionId(headers) {
22
- if (!headers || typeof headers !== 'object') {
23
- return null;
24
- }
25
-
26
- // Check all possible header formats (case-insensitive)
27
- const sessionHeaderKeys = [
28
- 'mcp-session-id',
29
- 'Mcp-Session-Id',
30
- 'X-MCP-Session-Id',
31
- 'x-mcp-session-id',
32
- 'MCP-Session-Id',
33
- ];
34
-
35
- for (const key of sessionHeaderKeys) {
36
- if (headers[key]) {
37
- return headers[key];
38
- }
39
- }
40
-
41
- return null;
42
- }
43
-
44
- /**
45
- * Extract JSON-RPC metadata from body
46
- */
47
- function extractJsonRpcMetadata(bodyJson) {
48
- if (!bodyJson) {
49
- return { id: null, method: null, result: null, error: null };
50
- }
51
-
52
- try {
53
- const parsed = typeof bodyJson === 'string' ? JSON.parse(bodyJson) : bodyJson;
54
- return {
55
- id: parsed.id !== undefined ? String(parsed.id) : null,
56
- method: parsed.method || null,
57
- result: parsed.result ? JSON.stringify(parsed.result) : null,
58
- error: parsed.error ? JSON.stringify(parsed.error) : null,
59
- };
60
- } catch {
61
- return { id: null, method: null, result: null, error: null };
62
- }
63
- }
64
-
65
- /**
66
- * Generate info summary for quick packet identification
67
- */
68
- function generateInfo(direction, method, url, statusCode, jsonrpcMethod) {
69
- if (direction === 'request') {
70
- const rpcInfo = jsonrpcMethod ? ` ${jsonrpcMethod}` : '';
71
- return `${method} ${url}${rpcInfo}`;
72
- }
73
-
74
- const rpcInfo = jsonrpcMethod ? ` ${jsonrpcMethod}` : '';
75
- return `${statusCode}${rpcInfo}`;
76
- }
77
-
78
- /**
79
- * Log an HTTP request packet
80
- */
81
- function logRequestPacket(db, options) {
82
- const { method, url, headers = {}, body, userAgent = null, remoteAddress = null } = options;
83
-
84
- const timestampNs = getTimestampNs();
85
- const timestampISO = getTimestampISO();
86
- const sessionId = normalizeSessionId(headers);
87
- const host = headers.host || headers.Host || null;
88
-
89
- // Prepare body data
90
- const { bodyRaw, bodyJson } = (() => {
91
- if (!body) {
92
- return { bodyRaw: '', bodyJson: null };
93
- }
94
- if (typeof body === 'string') {
95
- return { bodyRaw: body, bodyJson: body };
96
- }
97
- if (typeof body === 'object') {
98
- const raw = JSON.stringify(body);
99
- return { bodyRaw: raw, bodyJson: raw };
100
- }
101
- return { bodyRaw: '', bodyJson: null };
102
- })();
103
- const headersJson = JSON.stringify(headers);
104
-
105
- // Extract JSON-RPC metadata
106
- const jsonrpc = extractJsonRpcMetadata(bodyJson || bodyRaw);
107
- const jsonrpcId = jsonrpc.id;
108
- const jsonrpcMethod = jsonrpc.method;
109
-
110
- // Calculate packet length
111
- const length = Buffer.byteLength(headersJson, 'utf8') + Buffer.byteLength(bodyRaw, 'utf8');
112
-
113
- // Generate info summary
114
- const info = generateInfo('request', method, url, null, jsonrpcMethod);
115
-
116
- const stmt = db.prepare(`
117
- INSERT INTO packets (
118
- timestamp_ns,
119
- timestamp_iso,
120
- direction,
121
- protocol,
122
- session_id,
123
- method,
124
- url,
125
- headers_json,
126
- body_raw,
127
- body_json,
128
- jsonrpc_id,
129
- jsonrpc_method,
130
- length,
131
- info,
132
- user_agent,
133
- remote_address,
134
- host
135
- ) VALUES (?, ?, 'request', 'HTTP', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
136
- `);
137
-
138
- const result = stmt.run(
139
- timestampNs,
140
- timestampISO,
141
- sessionId,
142
- method,
143
- url,
144
- headersJson,
145
- bodyRaw,
146
- bodyJson,
147
- jsonrpcId,
148
- jsonrpcMethod,
149
- length,
150
- info,
151
- userAgent,
152
- remoteAddress,
153
- host
154
- );
155
-
156
- const frameNumber = result.lastInsertRowid;
157
-
158
- // Update or create session record
159
- if (sessionId) {
160
- const sessionStmt = db.prepare(`
161
- INSERT INTO sessions (session_id, first_seen_ns, last_seen_ns, packet_count, user_agent, remote_address, host)
162
- VALUES (?, ?, ?, 1, ?, ?, ?)
163
- ON CONFLICT(session_id) DO UPDATE SET
164
- last_seen_ns = excluded.last_seen_ns,
165
- packet_count = packet_count + 1,
166
- user_agent = COALESCE(excluded.user_agent, user_agent),
167
- remote_address = COALESCE(excluded.remote_address, remote_address),
168
- host = COALESCE(excluded.host, host)
169
- `);
170
- sessionStmt.run(sessionId, timestampNs, timestampNs, userAgent, remoteAddress, host);
171
- }
172
-
173
- // Create conversation entry for request
174
- if (jsonrpcId) {
175
- const convStmt = db.prepare(`
176
- INSERT INTO conversations (
177
- request_frame_number,
178
- session_id,
179
- jsonrpc_id,
180
- method,
181
- request_timestamp_ns,
182
- status
183
- ) VALUES (?, ?, ?, ?, ?, 'pending')
184
- `);
185
- convStmt.run(frameNumber, sessionId, jsonrpcId, jsonrpcMethod || method, timestampNs);
186
- }
187
-
188
- return { frameNumber, timestampNs };
189
- }
190
-
191
- /**
192
- * Log an HTTP response packet
193
- */
194
- function logResponsePacket(db, options) {
195
- const {
196
- statusCode,
197
- headers = {},
198
- body,
199
- requestFrameNumber = null,
200
- requestTimestampNs = null,
201
- jsonrpcId = null,
202
- userAgent = null,
203
- remoteAddress = null,
204
- } = options;
205
-
206
- const timestampNs = getTimestampNs();
207
- const timestampISO = getTimestampISO();
208
- const sessionId = normalizeSessionId(headers);
209
- const host = headers.host || headers.Host || null;
210
-
211
- // Prepare body data
212
- const { bodyRaw, bodyJson } = (() => {
213
- if (!body) {
214
- return { bodyRaw: '', bodyJson: null };
215
- }
216
- if (typeof body === 'string') {
217
- return { bodyRaw: body, bodyJson: body };
218
- }
219
- if (typeof body === 'object') {
220
- const raw = JSON.stringify(body);
221
- return { bodyRaw: raw, bodyJson: raw };
222
- }
223
- return { bodyRaw: '', bodyJson: null };
224
- })();
225
- const headersJson = JSON.stringify(headers);
226
-
227
- // Extract JSON-RPC metadata
228
- const jsonrpc = extractJsonRpcMetadata(bodyJson || bodyRaw);
229
- const jsonrpcIdFromBody = jsonrpc.id || jsonrpcId;
230
- const jsonrpcMethod = jsonrpc.method;
231
- const jsonrpcResult = jsonrpc.result;
232
- const jsonrpcError = jsonrpc.error;
233
-
234
- // Calculate packet length
235
- const length = Buffer.byteLength(headersJson, 'utf8') + Buffer.byteLength(bodyRaw, 'utf8');
236
-
237
- // Generate info summary
238
- const info = generateInfo('response', null, null, statusCode, jsonrpcMethod);
239
-
240
- const stmt = db.prepare(`
241
- INSERT INTO packets (
242
- timestamp_ns,
243
- timestamp_iso,
244
- direction,
245
- protocol,
246
- session_id,
247
- status_code,
248
- headers_json,
249
- body_raw,
250
- body_json,
251
- jsonrpc_id,
252
- jsonrpc_method,
253
- jsonrpc_result,
254
- jsonrpc_error,
255
- length,
256
- info,
257
- user_agent,
258
- remote_address,
259
- host
260
- ) VALUES (?, ?, 'response', 'HTTP', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
261
- `);
262
-
263
- const result = stmt.run(
264
- timestampNs,
265
- timestampISO,
266
- sessionId,
267
- statusCode,
268
- headersJson,
269
- bodyRaw,
270
- bodyJson,
271
- jsonrpcIdFromBody,
272
- jsonrpcMethod,
273
- jsonrpcResult,
274
- jsonrpcError,
275
- length,
276
- info,
277
- userAgent,
278
- remoteAddress,
279
- host
280
- );
281
-
282
- const frameNumber = result.lastInsertRowid;
283
-
284
- // Update session record
285
- if (sessionId) {
286
- const sessionStmt = db.prepare(`
287
- INSERT INTO sessions (session_id, first_seen_ns, last_seen_ns, packet_count, user_agent, remote_address, host)
288
- VALUES (?, ?, ?, 1, ?, ?, ?)
289
- ON CONFLICT(session_id) DO UPDATE SET
290
- last_seen_ns = excluded.last_seen_ns,
291
- packet_count = packet_count + 1,
292
- user_agent = COALESCE(excluded.user_agent, user_agent),
293
- remote_address = COALESCE(excluded.remote_address, remote_address),
294
- host = COALESCE(excluded.host, host)
295
- `);
296
- sessionStmt.run(sessionId, timestampNs, timestampNs, userAgent, remoteAddress, host);
297
- }
298
-
299
- // Update conversation entry with response
300
- if (jsonrpcIdFromBody || requestFrameNumber) {
301
- const durationMs = requestTimestampNs
302
- ? calculateDurationMs(requestTimestampNs, timestampNs)
303
- : null;
304
-
305
- const status = statusCode >= 200 && statusCode < 300 ? 'completed' : 'error';
306
-
307
- if (requestFrameNumber) {
308
- // Update existing conversation
309
- const updateConvStmt = db.prepare(`
310
- UPDATE conversations
311
- SET response_frame_number = ?,
312
- response_timestamp_ns = ?,
313
- duration_ms = ?,
314
- status = ?
315
- WHERE request_frame_number = ?
316
- `);
317
- updateConvStmt.run(frameNumber, timestampNs, durationMs, status, requestFrameNumber);
318
- } else if (jsonrpcIdFromBody) {
319
- // Try to find conversation by JSON-RPC ID
320
- const findConvStmt = db.prepare(`
321
- SELECT request_frame_number FROM conversations
322
- WHERE jsonrpc_id = ? AND response_frame_number IS NULL
323
- ORDER BY request_timestamp_ns DESC
324
- LIMIT 1
325
- `);
326
- const conv = findConvStmt.get(jsonrpcIdFromBody);
327
- if (conv) {
328
- const updateConvStmt = db.prepare(`
329
- UPDATE conversations
330
- SET response_frame_number = ?,
331
- response_timestamp_ns = ?,
332
- duration_ms = ?,
333
- status = ?
334
- WHERE request_frame_number = ?
335
- `);
336
- updateConvStmt.run(frameNumber, timestampNs, durationMs, status, conv.request_frame_number);
337
- }
338
- }
339
- }
340
-
341
- return frameNumber;
342
- }
343
-
344
- export function getLogger(db) {
345
- return {
346
- logRequestPacket: logRequestPacket.bind(null, db),
347
- logResponsePacket: logResponsePacket.bind(null, db),
348
- };
349
- }