@mcp-shark/mcp-shark 1.4.2 → 1.5.0

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 (203) hide show
  1. package/README.md +84 -645
  2. package/bin/mcp-shark.js +30 -36
  3. package/mcp-server/index.js +115 -0
  4. package/mcp-server/lib/auditor/audit.js +22 -38
  5. package/mcp-server/lib/common/error.js +1 -1
  6. package/mcp-server/lib/server/external/all.js +5 -6
  7. package/mcp-server/lib/server/external/config.js +1 -3
  8. package/mcp-server/lib/server/external/kv.js +4 -12
  9. package/mcp-server/lib/server/external/single/request.js +3 -6
  10. package/mcp-server/lib/server/external/single/run.js +8 -19
  11. package/mcp-server/lib/server/internal/handlers/prompts-get.js +3 -13
  12. package/mcp-server/lib/server/internal/handlers/prompts-list.js +2 -6
  13. package/mcp-server/lib/server/internal/handlers/resources-list.js +2 -6
  14. package/mcp-server/lib/server/internal/handlers/resources-read.js +3 -12
  15. package/mcp-server/lib/server/internal/handlers/tools-call.js +3 -9
  16. package/mcp-server/lib/server/internal/handlers/tools-list.js +2 -2
  17. package/mcp-server/lib/server/internal/run.js +4 -16
  18. package/mcp-server/lib/server/internal/server.js +6 -7
  19. package/mcp-server/lib/server/internal/session.js +2 -15
  20. package/mcp-server/mcp-shark.js +16 -66
  21. package/package.json +23 -38
  22. package/ui/dist/assets/index-Cc-IUa83.css +1 -0
  23. package/ui/dist/assets/index-srLDlk97.js +35 -0
  24. package/ui/dist/index.html +17 -0
  25. package/ui/dist/og-image.png +0 -0
  26. package/ui/server/routes/backups/deleteBackup.js +54 -0
  27. package/ui/server/routes/backups/index.js +15 -0
  28. package/ui/server/routes/backups/listBackups.js +75 -0
  29. package/ui/server/routes/backups/restoreBackup.js +83 -0
  30. package/ui/server/routes/backups/viewBackup.js +47 -0
  31. package/ui/server/routes/composite/index.js +46 -0
  32. package/ui/server/routes/composite/servers.js +18 -0
  33. package/ui/server/routes/composite/setup.js +129 -0
  34. package/ui/server/routes/composite/status.js +7 -0
  35. package/ui/server/routes/composite/stop.js +39 -0
  36. package/ui/server/routes/composite/utils.js +45 -0
  37. package/ui/server/routes/config.js +34 -30
  38. package/ui/server/routes/conversations.js +3 -3
  39. package/ui/server/routes/help.js +2 -2
  40. package/ui/server/routes/logs.js +5 -5
  41. package/ui/server/routes/playground.js +45 -47
  42. package/ui/server/routes/requests.js +112 -108
  43. package/ui/server/routes/sessions.js +4 -4
  44. package/ui/server/routes/settings.js +199 -0
  45. package/ui/server/routes/smartscan/discover.js +7 -6
  46. package/ui/server/routes/smartscan/scans/clearCache.js +3 -2
  47. package/ui/server/routes/smartscan/scans/createBatchScans.js +4 -3
  48. package/ui/server/routes/smartscan/scans/createScan.js +2 -1
  49. package/ui/server/routes/smartscan/scans/getCachedResults.js +2 -1
  50. package/ui/server/routes/smartscan/scans/getScan.js +2 -1
  51. package/ui/server/routes/smartscan/scans/listScans.js +5 -4
  52. package/ui/server/routes/smartscan/scans.js +3 -3
  53. package/ui/server/routes/smartscan/token.js +4 -3
  54. package/ui/server/routes/smartscan/transport.js +1 -1
  55. package/ui/server/routes/smartscan.js +1 -1
  56. package/ui/server/routes/statistics.js +13 -10
  57. package/ui/server/utils/config-update.js +7 -6
  58. package/ui/server/utils/config.js +4 -4
  59. package/ui/server/utils/logger.js +2 -0
  60. package/ui/server/utils/paths.js +210 -2
  61. package/ui/server/utils/port.js +2 -2
  62. package/ui/server/utils/process.js +0 -67
  63. package/ui/server/utils/scan-cache/all-results.js +76 -59
  64. package/ui/server/utils/scan-cache/directory.js +1 -1
  65. package/ui/server/utils/scan-cache/file-operations.js +19 -16
  66. package/ui/server/utils/scan-cache/server-operations.js +14 -9
  67. package/ui/server/utils/serialization.js +9 -3
  68. package/ui/server/utils/smartscan-token.js +4 -3
  69. package/ui/server.js +86 -41
  70. package/ui/src/App.jsx +5 -5
  71. package/ui/src/CompositeLogs.jsx +20 -20
  72. package/ui/src/CompositeSetup.jsx +9 -9
  73. package/ui/src/HelpGuide/HelpGuideFooter.jsx +1 -0
  74. package/ui/src/HelpGuide/HelpGuideHeader.jsx +2 -1
  75. package/ui/src/HelpGuide.jsx +17 -4
  76. package/ui/src/IntroTour.jsx +19 -5
  77. package/ui/src/LogDetail.jsx +1 -0
  78. package/ui/src/LogTable.jsx +24 -6
  79. package/ui/src/PacketDetail.jsx +21 -16
  80. package/ui/src/PacketFilters.jsx +29 -14
  81. package/ui/src/PacketList.jsx +4 -5
  82. package/ui/src/SmartScan.jsx +5 -5
  83. package/ui/src/TabNavigation.jsx +5 -5
  84. package/ui/src/components/App/HelpButton.jsx +4 -0
  85. package/ui/src/components/App/TrafficTab.jsx +4 -4
  86. package/ui/src/components/App/useAppState.js +118 -24
  87. package/ui/src/components/BackupList.jsx +6 -2
  88. package/ui/src/components/CollapsibleSection.jsx +16 -2
  89. package/ui/src/components/ConfigViewerModal.jsx +17 -3
  90. package/ui/src/components/ConfirmationModal.jsx +20 -3
  91. package/ui/src/components/DetailsTab/BodySection.jsx +3 -1
  92. package/ui/src/components/DetailsTab/CollapsibleRequestResponse.jsx +14 -3
  93. package/ui/src/components/DetailsTab/InfoSection.jsx +4 -2
  94. package/ui/src/components/DetailsTab/RequestDetailsSection.jsx +7 -5
  95. package/ui/src/components/DetailsTab/ResponseDetailsSection.jsx +7 -5
  96. package/ui/src/components/DetectedPathsList.jsx +5 -2
  97. package/ui/src/components/FileInput.jsx +3 -1
  98. package/ui/src/components/GroupHeader.jsx +14 -0
  99. package/ui/src/components/GroupedByMcpView.jsx +3 -4
  100. package/ui/src/components/GroupedByServerView.jsx +1 -1
  101. package/ui/src/components/GroupedBySessionView.jsx +1 -1
  102. package/ui/src/components/HexTab.jsx +17 -4
  103. package/ui/src/components/LogsToolbar.jsx +3 -1
  104. package/ui/src/components/McpPlayground/LoadingModal.jsx +7 -3
  105. package/ui/src/components/McpPlayground/PromptsSection/PromptCallPanel.jsx +5 -0
  106. package/ui/src/components/McpPlayground/PromptsSection/PromptItem.jsx +6 -2
  107. package/ui/src/components/McpPlayground/PromptsSection/PromptsList.jsx +4 -4
  108. package/ui/src/components/McpPlayground/PromptsSection.jsx +2 -1
  109. package/ui/src/components/McpPlayground/ResourcesSection/ResourceCallPanel.jsx +3 -0
  110. package/ui/src/components/McpPlayground/ResourcesSection/ResourceItem.jsx +6 -2
  111. package/ui/src/components/McpPlayground/ResourcesSection/ResourcesList.jsx +4 -4
  112. package/ui/src/components/McpPlayground/ResourcesSection.jsx +2 -1
  113. package/ui/src/components/McpPlayground/ToolsSection/ToolCallPanel.jsx +5 -0
  114. package/ui/src/components/McpPlayground/ToolsSection/ToolItem.jsx +6 -2
  115. package/ui/src/components/McpPlayground/ToolsSection/ToolsList.jsx +4 -4
  116. package/ui/src/components/McpPlayground/ToolsSection.jsx +2 -1
  117. package/ui/src/components/McpPlayground/hooks/useMcpDataLoader.js +9 -9
  118. package/ui/src/components/McpPlayground/hooks/useMcpRequest.js +10 -5
  119. package/ui/src/components/McpPlayground/hooks/useMcpServerStatus.js +43 -23
  120. package/ui/src/components/McpPlayground/useMcpPlayground.js +72 -44
  121. package/ui/src/components/McpPlayground.jsx +5 -2
  122. package/ui/src/components/PacketDetailHeader.jsx +8 -3
  123. package/ui/src/components/PacketFilters/ExportControls.jsx +2 -1
  124. package/ui/src/components/PacketFilters/FilterInput.jsx +1 -1
  125. package/ui/src/components/RawTab.jsx +15 -2
  126. package/ui/src/components/RequestRow/OrphanedResponseRow.jsx +10 -2
  127. package/ui/src/components/RequestRow/RequestRowMain.jsx +12 -3
  128. package/ui/src/components/RequestRow/ResponseRow.jsx +11 -3
  129. package/ui/src/components/RequestRow.jsx +17 -9
  130. package/ui/src/components/ServerControl.jsx +3 -1
  131. package/ui/src/components/ServiceSelector.jsx +2 -0
  132. package/ui/src/components/SmartScan/AnalysisResult.jsx +2 -2
  133. package/ui/src/components/SmartScan/BatchResultsDisplay/BatchResultItem.jsx +2 -1
  134. package/ui/src/components/SmartScan/BatchResultsDisplay/BatchResultsHeader.jsx +1 -1
  135. package/ui/src/components/SmartScan/BatchResultsDisplay.jsx +9 -3
  136. package/ui/src/components/SmartScan/EmptyState.jsx +3 -0
  137. package/ui/src/components/SmartScan/ErrorDisplay.jsx +4 -2
  138. package/ui/src/components/SmartScan/ExpandableSection.jsx +4 -0
  139. package/ui/src/components/SmartScan/FindingsTable.jsx +46 -42
  140. package/ui/src/components/SmartScan/ListViewContent.jsx +2 -2
  141. package/ui/src/components/SmartScan/NotablePatternsSection.jsx +13 -8
  142. package/ui/src/components/SmartScan/OverallSummarySection.jsx +36 -29
  143. package/ui/src/components/SmartScan/RecommendationsSection.jsx +10 -8
  144. package/ui/src/components/SmartScan/ScanDetailHeader.jsx +2 -1
  145. package/ui/src/components/SmartScan/ScanDetailView.jsx +4 -4
  146. package/ui/src/components/SmartScan/ScanListView/ScanListHeader.jsx +2 -1
  147. package/ui/src/components/SmartScan/ScanListView/ScanListItem.jsx +15 -1
  148. package/ui/src/components/SmartScan/ScanOverviewSection.jsx +3 -1
  149. package/ui/src/components/SmartScan/ScanResultsDisplay.jsx +1 -1
  150. package/ui/src/components/SmartScan/ScanViewContent.jsx +2 -2
  151. package/ui/src/components/SmartScan/ScanningProgress.jsx +4 -2
  152. package/ui/src/components/SmartScan/ServerInfoSection.jsx +3 -1
  153. package/ui/src/components/SmartScan/ServerSelectionRow.jsx +4 -2
  154. package/ui/src/components/SmartScan/SingleResultDisplay.jsx +5 -3
  155. package/ui/src/components/SmartScan/SmartScanControls.jsx +11 -7
  156. package/ui/src/components/SmartScan/SmartScanHeader.jsx +1 -1
  157. package/ui/src/components/SmartScan/ViewModeTabs.jsx +2 -0
  158. package/ui/src/components/SmartScan/hooks/useCacheManagement.js +1 -2
  159. package/ui/src/components/SmartScan/hooks/useMcpDiscovery.js +22 -26
  160. package/ui/src/components/SmartScan/hooks/useScanList.js +10 -9
  161. package/ui/src/components/SmartScan/hooks/useScanOperations.js +23 -14
  162. package/ui/src/components/SmartScan/hooks/useServerStatus.js +2 -2
  163. package/ui/src/components/SmartScan/hooks/useTokenManagement.js +2 -2
  164. package/ui/src/components/SmartScan/scanDataUtils.js +22 -17
  165. package/ui/src/components/SmartScan/useSmartScan.js +4 -4
  166. package/ui/src/components/SmartScan/utils.js +3 -1
  167. package/ui/src/components/SmartScanIcons.jsx +6 -3
  168. package/ui/src/components/TabNavigation/DesktopTabs.jsx +8 -3
  169. package/ui/src/components/TabNavigation/MobileDropdown.jsx +3 -1
  170. package/ui/src/components/TabNavigation.jsx +8 -3
  171. package/ui/src/components/TabNavigationIcons.jsx +4 -4
  172. package/ui/src/components/TourOverlay.jsx +1 -1
  173. package/ui/src/components/TourTooltip/TourTooltipButtons.jsx +3 -0
  174. package/ui/src/components/TourTooltip/TourTooltipHeader.jsx +1 -0
  175. package/ui/src/components/TourTooltip/TourTooltipIcons.jsx +9 -0
  176. package/ui/src/components/TourTooltip/useTooltipPosition.js +63 -36
  177. package/ui/src/components/TourTooltip.jsx +11 -3
  178. package/ui/src/components/ViewModeTabs.jsx +3 -1
  179. package/ui/src/config/tourSteps.jsx +0 -2
  180. package/ui/src/hooks/useAnimation.js +15 -12
  181. package/ui/src/hooks/useConfigManagement.js +8 -8
  182. package/ui/src/hooks/useServiceExtraction.js +1 -1
  183. package/ui/src/index.css +3 -8
  184. package/ui/src/theme.js +3 -3
  185. package/ui/src/utils/hexUtils.js +11 -5
  186. package/ui/src/utils/mcpGroupingUtils.js +18 -10
  187. package/ui/src/utils/requestPairing.js +89 -0
  188. package/ui/src/utils/requestUtils.js +32 -101
  189. package/ui/vite.config.js +1 -1
  190. package/mcp-server/.editorconfig +0 -15
  191. package/mcp-server/.prettierignore +0 -11
  192. package/mcp-server/.prettierrc +0 -12
  193. package/mcp-server/README.md +0 -280
  194. package/mcp-server/commitlint.config.cjs +0 -42
  195. package/mcp-server/eslint.config.js +0 -131
  196. package/mcp-server/package-lock.json +0 -4784
  197. package/mcp-server/package.json +0 -30
  198. package/ui/README.md +0 -212
  199. package/ui/package-lock.json +0 -3574
  200. package/ui/package.json +0 -12
  201. package/ui/paths.js +0 -282
  202. package/ui/server/routes/backups.js +0 -251
  203. package/ui/server/routes/composite.js +0 -260
@@ -1,13 +1,9 @@
1
- import express from 'express';
2
1
  import cors from 'cors';
2
+ import express from 'express';
3
3
 
4
4
  import { withSession } from './session.js';
5
5
 
6
- export function getInternalServer(
7
- serverFactory,
8
- auditLogger,
9
- withAuditRequestResponseHandler
10
- ) {
6
+ export function getInternalServer(serverFactory, auditLogger, withAuditRequestResponseHandler) {
11
7
  const app = express();
12
8
 
13
9
  // Parse JSON body for POST requests
@@ -23,13 +19,7 @@ export function getInternalServer(
23
19
  );
24
20
 
25
21
  app.all('/mcp/*', async (req, res) => {
26
- await withSession(
27
- serverFactory,
28
- withAuditRequestResponseHandler,
29
- req,
30
- res,
31
- auditLogger
32
- );
22
+ await withSession(serverFactory, withAuditRequestResponseHandler, req, res, auditLogger);
33
23
  });
34
24
 
35
25
  // Catch-all for other routes (404)
@@ -42,8 +32,6 @@ export function getInternalServer(
42
32
 
43
33
  export function runInternalServer(logger, port, app) {
44
34
  app.listen(port, '0.0.0.0', () => {
45
- logger.info(
46
- `MCP proxy HTTP server listening on http://localhost:${port}/mcp`
47
- );
35
+ logger.info(`MCP proxy HTTP server listening on http://localhost:${port}/mcp`);
48
36
  });
49
37
  }
@@ -1,20 +1,20 @@
1
1
  import { Server } from '@modelcontextprotocol/sdk/server/index.js';
2
2
 
3
3
  import {
4
- ListToolsRequestSchema,
5
4
  CallToolRequestSchema,
6
- ListPromptsRequestSchema,
7
5
  GetPromptRequestSchema,
6
+ ListPromptsRequestSchema,
8
7
  ListResourcesRequestSchema,
8
+ ListToolsRequestSchema,
9
9
  ReadResourceRequestSchema,
10
10
  } from '@modelcontextprotocol/sdk/types.js';
11
11
 
12
- import { createToolsListHandler } from './handlers/tools-list.js';
13
- import { createToolsCallHandler } from './handlers/tools-call.js';
14
- import { createPromptsListHandler } from './handlers/prompts-list.js';
15
12
  import { createPromptsGetHandler } from './handlers/prompts-get.js';
13
+ import { createPromptsListHandler } from './handlers/prompts-list.js';
16
14
  import { createResourcesListHandler } from './handlers/resources-list.js';
17
15
  import { createResourcesReadHandler } from './handlers/resources-read.js';
16
+ import { createToolsCallHandler } from './handlers/tools-call.js';
17
+ import { createToolsListHandler } from './handlers/tools-list.js';
18
18
 
19
19
  export function createInternalServer(logger, mcpServers, requestedMcpServer) {
20
20
  // create MCP server
@@ -58,6 +58,5 @@ export function createInternalServer(logger, mcpServers, requestedMcpServer) {
58
58
  }
59
59
 
60
60
  export function createInternalServerFactory(logger, mcpServers) {
61
- return requestedMcpServer =>
62
- createInternalServer(logger, mcpServers, requestedMcpServer);
61
+ return (requestedMcpServer) => createInternalServer(logger, mcpServers, requestedMcpServer);
63
62
  }
@@ -13,13 +13,7 @@ function getTransportFromSession(sessionId) {
13
13
  return sessions.get(sessionId);
14
14
  }
15
15
 
16
- export async function withSession(
17
- serverFactory,
18
- requestHandler,
19
- req,
20
- res,
21
- auditLogger
22
- ) {
16
+ export async function withSession(serverFactory, requestHandler, req, res, auditLogger) {
23
17
  const requestedMcpServer = req.params[0];
24
18
  const sessionId = getSessionFromRequest(req);
25
19
  if (!sessionId) {
@@ -32,14 +26,7 @@ export async function withSession(
32
26
  await server.connect(transport);
33
27
  storeTransportInSession(initialSessionId, transport);
34
28
  // Session creation will be logged as part of the request packet in audit.js
35
- return requestHandler(
36
- transport,
37
- req,
38
- res,
39
- auditLogger,
40
- requestedMcpServer,
41
- initialSessionId
42
- );
29
+ return requestHandler(transport, req, res, auditLogger, requestedMcpServer, initialSessionId);
43
30
  }
44
31
 
45
32
  const transport = getTransportFromSession(sessionId);
@@ -1,72 +1,22 @@
1
- import { consola } from 'consola';
2
-
3
- import { runAllExternalServers } from './lib/server/external/all.js';
4
- import { isError } from './lib/common/error.js';
5
-
6
- import { createInternalServerFactory } from './lib/server/internal/server.js';
7
- import {
8
- getInternalServer,
9
- runInternalServer,
10
- } from './lib/server/internal/run.js';
11
- import { initDb } from 'mcp-shark-common/db/init.js';
12
- import { getLogger } from 'mcp-shark-common/db/logger.js';
13
- import {
14
- getDatabaseFile,
15
- getMcpConfigPath,
16
- prepareAppDataSpaces,
17
- } from 'mcp-shark-common/configs/index.js';
18
- import { withAuditRequestResponseHandler } from './lib/auditor/audit.js';
19
-
20
- function initAuditLogger(logger) {
21
- logger.info('Initializing audit logger at', getDatabaseFile());
22
- return getLogger(initDb(getDatabaseFile()));
23
- }
1
+ import logger from '../shared/logger.js';
2
+ // CLI entry point - uses the library
3
+ import { startMcpSharkServer } from './index.js';
24
4
 
25
5
  async function main() {
26
- consola.level = 'info';
27
-
28
- prepareAppDataSpaces();
29
-
30
- const configPath = getMcpConfigPath();
31
- console.log('[MCP-Shark] Starting MCP server...');
32
- console.log(`[MCP-Shark] Config path: ${configPath}`);
33
- console.log(`[MCP-Shark] Database path: ${getDatabaseFile()}`);
34
- console.log(`[MCP-Shark] Working directory: ${process.cwd()}`);
35
- console.log(`[MCP-Shark] PATH: ${process.env.PATH}`);
36
-
37
- const auditLogger = initAuditLogger(consola);
38
- const result = await runAllExternalServers(consola, configPath);
39
- if (isError(result)) {
40
- console.error(JSON.stringify(result));
6
+ try {
7
+ await startMcpSharkServer({
8
+ onReady: () => {
9
+ logger.info('[MCP-Shark] MCP server started successfully');
10
+ },
11
+ onError: (error) => {
12
+ logger.error({ error: error.message, stack: error.stack }, 'Error starting MCP server');
13
+ process.exit(1);
14
+ },
15
+ });
16
+ } catch (error) {
17
+ logger.error({ error: error.message, stack: error.stack }, 'Error starting MCP server');
41
18
  process.exit(1);
42
19
  }
43
-
44
- const internalServerFactory = createInternalServerFactory(consola, result);
45
- const app = getInternalServer(
46
- internalServerFactory,
47
- auditLogger,
48
- withAuditRequestResponseHandler
49
- );
50
- await runInternalServer(consola, 9851, app);
51
20
  }
52
21
 
53
- main()
54
- .then(() => {
55
- const successMsg = 'MCP server started successfully';
56
- console.log(`[MCP-Shark] ${successMsg}`);
57
- consola.info(successMsg);
58
- })
59
- .catch(error => {
60
- const errorMsg = 'Error starting MCP server';
61
- console.error(`[MCP-Shark] ${errorMsg}:`, error);
62
- console.error(`[MCP-Shark] Error message: ${error.message}`);
63
- if (error.stack) {
64
- console.error(`[MCP-Shark] Error stack:`, error.stack);
65
- }
66
- consola.error(errorMsg, error);
67
- consola.error(`Error message: ${error.message}`);
68
- if (error.stack) {
69
- consola.error(`Error stack: ${error.stack}`);
70
- }
71
- process.exit(1);
72
- });
22
+ main();
package/package.json CHANGED
@@ -1,9 +1,13 @@
1
1
  {
2
2
  "name": "@mcp-shark/mcp-shark",
3
- "version": "1.4.2",
3
+ "version": "1.5.0",
4
4
  "description": "Aggregate multiple Model Context Protocol (MCP) servers into a single unified interface with a powerful monitoring UI. Prov deep visibility into every request and response.",
5
5
  "type": "module",
6
6
  "main": "./bin/mcp-shark.js",
7
+ "exports": {
8
+ ".": "./bin/mcp-shark.js",
9
+ "./mcp-server": "./mcp-server/index.js"
10
+ },
7
11
  "bin": {
8
12
  "mcp-shark": "./bin/mcp-shark.js",
9
13
  "@mcp-shark/mcp-shark": "./bin/mcp-shark.js"
@@ -16,40 +20,25 @@
16
20
  "bugs": {
17
21
  "url": "https://github.com/mcp-shark/mcp-shark/issues"
18
22
  },
19
- "files": [
20
- "bin",
21
- "ui",
22
- "mcp-server",
23
- "README.md",
24
- "LICENSE"
25
- ],
23
+ "files": ["bin", "ui", "mcp-server", "README.md", "LICENSE", "package.json"],
26
24
  "scripts": {
27
- "install:all": "npm install",
28
- "start:ui": "cd ui && npm start",
29
- "start": "npm run start:ui",
30
- "dev:ui": "cd ui && npm run dev",
31
- "build:ui": "cd ui && npm run build",
32
- "lint:server": "cd mcp-server && npm run lint",
33
- "lint:fix:server": "cd mcp-server && npm run lint:fix",
34
- "format:server": "cd mcp-server && npm run format",
35
- "lint:ui": "cd ui && (eslint . --ext .js,.jsx,.ts,.tsx || echo 'eslint not available in ui')",
36
- "lint:fix:ui": "cd ui && (eslint . --ext .js,.jsx,.ts,.tsx --fix || echo 'eslint not available in ui')",
37
- "format:ui": "prettier --write \"ui/**/*.{js,jsx,ts,tsx,json,css,md}\"",
38
- "lint:fix:all": "(npm run lint:fix:server || true) && (npm run lint:fix:ui || true)",
39
- "format:all": "(npm run format:server || true) && (npm run format:ui || true)",
40
- "fix:all": "(npm run lint:fix:all || true) && (npm run format:all || true)",
25
+ "start": "node scripts/start-ui.js",
26
+ "predev": "npm run build:ui",
27
+ "dev": "node scripts/start-ui.js'",
28
+ "build": "bash -c 'cd ui && vite build'",
29
+ "build:ui": "bash -c 'cd ui && vite build'",
30
+ "lint": "biome lint .",
31
+ "lint:fix": "biome lint --write .",
32
+ "format": "biome format --write .",
33
+ "check": "biome check .",
34
+ "check:fix": "biome check --write .",
41
35
  "prepare": "husky install || true",
42
- "prepublishOnly": "npm run lint:fix:all && npm run format:all",
36
+ "prepublishOnly": "npm run check:fix && npm run build:ui",
43
37
  "publish:public": "npm publish --access public",
44
38
  "publish:dry-run": "npm publish --dry-run"
45
39
  },
46
40
  "lint-staged": {
47
- "*.{js,jsx,ts,tsx}": [
48
- "prettier --write"
49
- ],
50
- "*.{json,css,md,yml,yaml}": [
51
- "prettier --write"
52
- ]
41
+ "*": ["biome check --write"]
53
42
  },
54
43
  "keywords": [
55
44
  "mcp",
@@ -78,28 +67,24 @@
78
67
  "@modelcontextprotocol/sdk": "^1.20.2",
79
68
  "@tabler/icons-react": "^3.0.0",
80
69
  "animejs": "^3.2.2",
70
+ "commander": "^14.0.2",
81
71
  "consola": "^3.4.2",
82
72
  "cors": "^2.8.5",
83
73
  "express": "^4.18.2",
84
74
  "jsonrpc-lite": "^2.2.0",
85
75
  "mcp-shark-common": "github:mcp-shark/mcp-shark-common",
76
+ "open": "^11.0.0",
86
77
  "react": "^18.2.0",
87
78
  "react-dom": "^18.2.0",
88
- "ws": "^8.16.0",
89
- "open": "^11.0.0",
90
- "commander": "^14.0.2"
79
+ "ws": "^8.16.0"
91
80
  },
92
81
  "devDependencies": {
82
+ "@biomejs/biome": "^1.9.4",
93
83
  "@commitlint/cli": "^19.5.0",
94
84
  "@commitlint/config-conventional": "^19.5.0",
95
- "@eslint/js": "^9.15.0",
96
85
  "@vitejs/plugin-react": "^4.2.1",
97
- "eslint": "^9.15.0",
98
- "eslint-config-prettier": "^9.1.0",
99
- "eslint-plugin-prettier": "^5.2.1",
100
86
  "husky": "^9.1.6",
101
87
  "lint-staged": "^15.2.10",
102
- "prettier": "^3.3.3",
103
- "vite": "^5.1.0"
88
+ "vite": "^7.3.0"
104
89
  }
105
90
  }
@@ -0,0 +1 @@
1
+ @import"https://fonts.googleapis.com/css2?family=Roboto:wght@300;400;500;700&family=Roboto+Mono:wght@400;500&display=swap";*{margin:0;padding:0;box-sizing:border-box}body{font-family:Roboto,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;background:#fff;color:#202124;overflow:hidden;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}code,pre,.monospace{font-family:Roboto Mono,JetBrains Mono,Fira Code,Consolas,monospace}#root{height:100vh;display:flex;flex-direction:column}@keyframes spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}