@1mcp/agent 0.15.0 → 0.17.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.
- package/README.md +115 -14
- package/build/commands/app/backups.d.ts +17 -0
- package/build/commands/app/backups.d.ts.map +1 -0
- package/build/commands/app/backups.js +162 -0
- package/build/commands/app/backups.js.map +1 -0
- package/build/commands/app/consolidate.d.ts +21 -0
- package/build/commands/app/consolidate.d.ts.map +1 -0
- package/build/commands/app/consolidate.js +383 -0
- package/build/commands/app/consolidate.js.map +1 -0
- package/build/commands/app/discover.d.ts +16 -0
- package/build/commands/app/discover.d.ts.map +1 -0
- package/build/commands/app/discover.js +79 -0
- package/build/commands/app/discover.js.map +1 -0
- package/build/commands/app/index.d.ts +12 -0
- package/build/commands/app/index.d.ts.map +1 -0
- package/build/commands/app/index.js +274 -0
- package/build/commands/app/index.js.map +1 -0
- package/build/commands/app/list.d.ts +16 -0
- package/build/commands/app/list.d.ts.map +1 -0
- package/build/commands/app/list.js +95 -0
- package/build/commands/app/list.js.map +1 -0
- package/build/commands/app/restore.d.ts +21 -0
- package/build/commands/app/restore.d.ts.map +1 -0
- package/build/commands/app/restore.js +265 -0
- package/build/commands/app/restore.js.map +1 -0
- package/build/commands/app/status.d.ts +16 -0
- package/build/commands/app/status.d.ts.map +1 -0
- package/build/commands/app/status.js +224 -0
- package/build/commands/app/status.js.map +1 -0
- package/build/commands/mcp/add.d.ts +19 -0
- package/build/commands/mcp/add.d.ts.map +1 -0
- package/build/commands/mcp/add.js +135 -0
- package/build/commands/mcp/add.js.map +1 -0
- package/build/commands/mcp/enable.d.ts +13 -0
- package/build/commands/mcp/enable.d.ts.map +1 -0
- package/build/commands/mcp/enable.js +100 -0
- package/build/commands/mcp/enable.js.map +1 -0
- package/build/commands/mcp/index.d.ts +12 -0
- package/build/commands/mcp/index.d.ts.map +1 -0
- package/build/commands/mcp/index.js +351 -0
- package/build/commands/mcp/index.js.map +1 -0
- package/build/commands/mcp/list.d.ts +11 -0
- package/build/commands/mcp/list.d.ts.map +1 -0
- package/build/commands/mcp/list.js +144 -0
- package/build/commands/mcp/list.js.map +1 -0
- package/build/commands/mcp/remove.d.ts +10 -0
- package/build/commands/mcp/remove.d.ts.map +1 -0
- package/build/commands/mcp/remove.js +89 -0
- package/build/commands/mcp/remove.js.map +1 -0
- package/build/commands/mcp/status.d.ts +10 -0
- package/build/commands/mcp/status.d.ts.map +1 -0
- package/build/commands/mcp/status.js +243 -0
- package/build/commands/mcp/status.js.map +1 -0
- package/build/commands/mcp/update.d.ts +18 -0
- package/build/commands/mcp/update.d.ts.map +1 -0
- package/build/commands/mcp/update.js +157 -0
- package/build/commands/mcp/update.js.map +1 -0
- package/build/commands/mcp/utils/configUtils.d.ts +64 -0
- package/build/commands/mcp/utils/configUtils.d.ts.map +1 -0
- package/build/commands/mcp/utils/configUtils.js +266 -0
- package/build/commands/mcp/utils/configUtils.js.map +1 -0
- package/build/commands/mcp/utils/doubleHyphenParser.d.ts +32 -0
- package/build/commands/mcp/utils/doubleHyphenParser.d.ts.map +1 -0
- package/build/commands/mcp/utils/doubleHyphenParser.js +61 -0
- package/build/commands/mcp/utils/doubleHyphenParser.js.map +1 -0
- package/build/commands/mcp/utils/validation.d.ts +33 -0
- package/build/commands/mcp/utils/validation.d.ts.map +1 -0
- package/build/commands/mcp/utils/validation.js +235 -0
- package/build/commands/mcp/utils/validation.js.map +1 -0
- package/build/constants.d.ts +12 -2
- package/build/constants.d.ts.map +1 -1
- package/build/constants.js +16 -2
- package/build/constants.js.map +1 -1
- package/build/core/capabilities/asyncLoadingOrchestrator.d.ts +96 -0
- package/build/core/capabilities/asyncLoadingOrchestrator.d.ts.map +1 -0
- package/build/core/capabilities/asyncLoadingOrchestrator.js +256 -0
- package/build/core/capabilities/asyncLoadingOrchestrator.js.map +1 -0
- package/build/core/capabilities/capabilityAggregator.d.ts +114 -0
- package/build/core/capabilities/capabilityAggregator.d.ts.map +1 -0
- package/build/core/capabilities/capabilityAggregator.js +234 -0
- package/build/core/capabilities/capabilityAggregator.js.map +1 -0
- package/build/core/client/clientManager.d.ts +28 -0
- package/build/core/client/clientManager.d.ts.map +1 -1
- package/build/core/client/clientManager.js +120 -0
- package/build/core/client/clientManager.js.map +1 -1
- package/build/core/loading/loadingStateTracker.d.ts +128 -0
- package/build/core/loading/loadingStateTracker.d.ts.map +1 -0
- package/build/core/loading/loadingStateTracker.js +209 -0
- package/build/core/loading/loadingStateTracker.js.map +1 -0
- package/build/core/loading/mcpLoadingManager.d.ts +139 -0
- package/build/core/loading/mcpLoadingManager.d.ts.map +1 -0
- package/build/core/loading/mcpLoadingManager.js +296 -0
- package/build/core/loading/mcpLoadingManager.js.map +1 -0
- package/build/core/notifications/notificationManager.d.ts +111 -0
- package/build/core/notifications/notificationManager.d.ts.map +1 -0
- package/build/core/notifications/notificationManager.js +232 -0
- package/build/core/notifications/notificationManager.js.map +1 -0
- package/build/core/server/agentConfig.d.ts +59 -0
- package/build/core/server/agentConfig.d.ts.map +1 -1
- package/build/core/server/agentConfig.js +82 -1
- package/build/core/server/agentConfig.js.map +1 -1
- package/build/core/server/serverManager.d.ts +1 -0
- package/build/core/server/serverManager.d.ts.map +1 -1
- package/build/core/server/serverManager.js +3 -0
- package/build/core/server/serverManager.js.map +1 -1
- package/build/index.js +123 -31
- package/build/index.js.map +1 -1
- package/build/server.d.ts +23 -2
- package/build/server.d.ts.map +1 -1
- package/build/server.js +83 -10
- package/build/server.js.map +1 -1
- package/build/services/healthService.d.ts +107 -0
- package/build/services/healthService.d.ts.map +1 -0
- package/build/services/healthService.js +294 -0
- package/build/services/healthService.js.map +1 -0
- package/build/transport/http/middlewares/mcpAvailabilityMiddleware.d.ts +79 -0
- package/build/transport/http/middlewares/mcpAvailabilityMiddleware.d.ts.map +1 -0
- package/build/transport/http/middlewares/mcpAvailabilityMiddleware.js +243 -0
- package/build/transport/http/middlewares/mcpAvailabilityMiddleware.js.map +1 -0
- package/build/transport/http/routes/healthRoutes.d.ts +8 -0
- package/build/transport/http/routes/healthRoutes.d.ts.map +1 -0
- package/build/transport/http/routes/healthRoutes.js +282 -0
- package/build/transport/http/routes/healthRoutes.js.map +1 -0
- package/build/transport/http/routes/sseRoutes.d.ts +2 -1
- package/build/transport/http/routes/sseRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/sseRoutes.js +13 -1
- package/build/transport/http/routes/sseRoutes.js.map +1 -1
- package/build/transport/http/routes/streamableHttpRoutes.d.ts +2 -1
- package/build/transport/http/routes/streamableHttpRoutes.d.ts.map +1 -1
- package/build/transport/http/routes/streamableHttpRoutes.js +13 -1
- package/build/transport/http/routes/streamableHttpRoutes.js.map +1 -1
- package/build/transport/http/server.d.ts +7 -1
- package/build/transport/http/server.d.ts.map +1 -1
- package/build/transport/http/server.js +17 -3
- package/build/transport/http/server.js.map +1 -1
- package/build/transport/transportFactory.d.ts +4 -0
- package/build/transport/transportFactory.d.ts.map +1 -1
- package/build/transport/transportFactory.js +1 -1
- package/build/transport/transportFactory.js.map +1 -1
- package/build/utils/appDiscovery.d.ts +75 -0
- package/build/utils/appDiscovery.d.ts.map +1 -0
- package/build/utils/appDiscovery.js +358 -0
- package/build/utils/appDiscovery.js.map +1 -0
- package/build/utils/appPresets.d.ts +88 -0
- package/build/utils/appPresets.d.ts.map +1 -0
- package/build/utils/appPresets.js +430 -0
- package/build/utils/appPresets.js.map +1 -0
- package/build/utils/backupManager.d.ts +61 -0
- package/build/utils/backupManager.d.ts.map +1 -0
- package/build/utils/backupManager.js +314 -0
- package/build/utils/backupManager.js.map +1 -0
- package/build/utils/urlDetection.d.ts +35 -0
- package/build/utils/urlDetection.d.ts.map +1 -0
- package/build/utils/urlDetection.js +115 -0
- package/build/utils/urlDetection.js.map +1 -0
- package/build/utils/validationHelpers.d.ts +62 -0
- package/build/utils/validationHelpers.d.ts.map +1 -0
- package/build/utils/validationHelpers.js +252 -0
- package/build/utils/validationHelpers.js.map +1 -0
- package/package.json +25 -3
|
@@ -6,8 +6,12 @@ import { STREAMABLE_HTTP_ENDPOINT } from '../../../constants.js';
|
|
|
6
6
|
import { ServerStatus } from '../../../core/types/index.js';
|
|
7
7
|
import tagsExtractor from '../middlewares/tagsExtractor.js';
|
|
8
8
|
import { getValidatedTags } from '../middlewares/scopeAuthMiddleware.js';
|
|
9
|
-
export function setupStreamableHttpRoutes(router, serverManager, authMiddleware) {
|
|
9
|
+
export function setupStreamableHttpRoutes(router, serverManager, authMiddleware, availabilityMiddleware, asyncOrchestrator) {
|
|
10
10
|
const middlewares = [tagsExtractor, authMiddleware];
|
|
11
|
+
// Add availability middleware if provided
|
|
12
|
+
if (availabilityMiddleware) {
|
|
13
|
+
middlewares.push(availabilityMiddleware);
|
|
14
|
+
}
|
|
11
15
|
router.post(STREAMABLE_HTTP_ENDPOINT, ...middlewares, async (req, res) => {
|
|
12
16
|
try {
|
|
13
17
|
let transport;
|
|
@@ -23,6 +27,14 @@ export function setupStreamableHttpRoutes(router, serverManager, authMiddleware)
|
|
|
23
27
|
tags,
|
|
24
28
|
enablePagination: req.query.pagination === 'true',
|
|
25
29
|
});
|
|
30
|
+
// Initialize notifications for async loading if enabled
|
|
31
|
+
if (asyncOrchestrator) {
|
|
32
|
+
const inboundConnection = serverManager.getServer(id);
|
|
33
|
+
if (inboundConnection) {
|
|
34
|
+
asyncOrchestrator.initializeNotifications(inboundConnection);
|
|
35
|
+
logger.debug(`Async loading notifications initialized for Streamable HTTP session ${id}`);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
26
38
|
transport.onclose = () => {
|
|
27
39
|
serverManager.disconnectTransport(id);
|
|
28
40
|
// Note: ServerManager already logs the disconnection
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streamableHttpRoutes.js","sourceRoot":"","sources":["../../../../src/transport/http/routes/streamableHttpRoutes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAC/D,OAAO,MAAM,MAAM,2BAA2B,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"streamableHttpRoutes.js","sourceRoot":"","sources":["../../../../src/transport/http/routes/streamableHttpRoutes.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { ServerManager } from '../../core/server/serverManager.js';
|
|
2
|
+
import { McpLoadingManager } from '../../core/loading/mcpLoadingManager.js';
|
|
3
|
+
import { AsyncLoadingOrchestrator } from '../../core/capabilities/asyncLoadingOrchestrator.js';
|
|
2
4
|
/**
|
|
3
5
|
* ExpressServer orchestrates the HTTP/SSE transport layer for the MCP server.
|
|
4
6
|
*
|
|
@@ -15,6 +17,8 @@ import { ServerManager } from '../../core/server/serverManager.js';
|
|
|
15
17
|
export declare class ExpressServer {
|
|
16
18
|
private app;
|
|
17
19
|
private serverManager;
|
|
20
|
+
private loadingManager?;
|
|
21
|
+
private asyncOrchestrator?;
|
|
18
22
|
private oauthProvider;
|
|
19
23
|
private configManager;
|
|
20
24
|
/**
|
|
@@ -24,8 +28,10 @@ export declare class ExpressServer {
|
|
|
24
28
|
* and configures all routes for MCP transport and OAuth endpoints.
|
|
25
29
|
*
|
|
26
30
|
* @param serverManager - The server manager instance for handling MCP operations
|
|
31
|
+
* @param loadingManager - Optional loading manager for async MCP server initialization
|
|
32
|
+
* @param asyncOrchestrator - Optional async loading orchestrator for listChanged notifications
|
|
27
33
|
*/
|
|
28
|
-
constructor(serverManager: ServerManager);
|
|
34
|
+
constructor(serverManager: ServerManager, loadingManager?: McpLoadingManager, asyncOrchestrator?: AsyncLoadingOrchestrator);
|
|
29
35
|
/**
|
|
30
36
|
* Sets up Express middleware including CORS, body parsing, and error handling.
|
|
31
37
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/transport/http/server.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../../src/transport/http/server.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAEnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,yCAAyC,CAAC;AAC5E,OAAO,EAAE,wBAAwB,EAAE,MAAM,qDAAqD,CAAC;AAW/F;;;;;;;;;;;;GAYG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,cAAc,CAAC,CAAoB;IAC3C,OAAO,CAAC,iBAAiB,CAAC,CAA2B;IACrD,OAAO,CAAC,aAAa,CAAyB;IAC9C,OAAO,CAAC,aAAa,CAAqB;IAE1C;;;;;;;;;OASG;gBAED,aAAa,EAAE,aAAa,EAC5B,cAAc,CAAC,EAAE,iBAAiB,EAClC,iBAAiB,CAAC,EAAE,wBAAwB;IAoB9C;;;;;;;;;OASG;IACH,OAAO,CAAC,eAAe;IAiBvB;;;;;;;;;OASG;IACH,OAAO,CAAC,WAAW;IAyEnB;;;;;;;;OAQG;IACI,KAAK,IAAI,IAAI;IASpB;;;;;;;OAOG;IACI,QAAQ,IAAI,IAAI;CAGxB"}
|
|
@@ -10,9 +10,11 @@ import { SDKOAuthServerProvider } from '../../auth/sdkOAuthServerProvider.js';
|
|
|
10
10
|
import { setupStreamableHttpRoutes } from './routes/streamableHttpRoutes.js';
|
|
11
11
|
import { setupSseRoutes } from './routes/sseRoutes.js';
|
|
12
12
|
import createOAuthRoutes from './routes/oauthRoutes.js';
|
|
13
|
+
import createHealthRoutes from './routes/healthRoutes.js';
|
|
13
14
|
import { AgentConfigManager } from '../../core/server/agentConfig.js';
|
|
14
15
|
import { RATE_LIMIT_CONFIG } from '../../constants.js';
|
|
15
16
|
import { createScopeAuthMiddleware } from './middlewares/scopeAuthMiddleware.js';
|
|
17
|
+
import { createMcpAvailabilityMiddleware } from './middlewares/mcpAvailabilityMiddleware.js';
|
|
16
18
|
import { McpConfigManager } from '../../config/mcpConfigManager.js';
|
|
17
19
|
/**
|
|
18
20
|
* ExpressServer orchestrates the HTTP/SSE transport layer for the MCP server.
|
|
@@ -30,6 +32,8 @@ import { McpConfigManager } from '../../config/mcpConfigManager.js';
|
|
|
30
32
|
export class ExpressServer {
|
|
31
33
|
app;
|
|
32
34
|
serverManager;
|
|
35
|
+
loadingManager;
|
|
36
|
+
asyncOrchestrator;
|
|
33
37
|
oauthProvider;
|
|
34
38
|
configManager;
|
|
35
39
|
/**
|
|
@@ -39,10 +43,14 @@ export class ExpressServer {
|
|
|
39
43
|
* and configures all routes for MCP transport and OAuth endpoints.
|
|
40
44
|
*
|
|
41
45
|
* @param serverManager - The server manager instance for handling MCP operations
|
|
46
|
+
* @param loadingManager - Optional loading manager for async MCP server initialization
|
|
47
|
+
* @param asyncOrchestrator - Optional async loading orchestrator for listChanged notifications
|
|
42
48
|
*/
|
|
43
|
-
constructor(serverManager) {
|
|
49
|
+
constructor(serverManager, loadingManager, asyncOrchestrator) {
|
|
44
50
|
this.app = express();
|
|
45
51
|
this.serverManager = serverManager;
|
|
52
|
+
this.loadingManager = loadingManager;
|
|
53
|
+
this.asyncOrchestrator = asyncOrchestrator;
|
|
46
54
|
this.configManager = AgentConfigManager.getInstance();
|
|
47
55
|
// Configure trust proxy setting before any middleware
|
|
48
56
|
this.app.set('trust proxy', this.configManager.getTrustProxy());
|
|
@@ -122,11 +130,17 @@ export class ExpressServer {
|
|
|
122
130
|
this.app.use(authRouter);
|
|
123
131
|
// Setup OAuth management routes (no auth required)
|
|
124
132
|
this.app.use('/oauth', createOAuthRoutes(this.oauthProvider));
|
|
133
|
+
// Setup health check routes (no auth required for monitoring)
|
|
134
|
+
this.app.use('/health', createHealthRoutes(this.loadingManager));
|
|
125
135
|
// Setup MCP transport routes (auth is handled per-route via scopeAuthMiddleware)
|
|
126
136
|
const router = express.Router();
|
|
127
137
|
const scopeAuthMiddleware = createScopeAuthMiddleware(this.oauthProvider);
|
|
128
|
-
|
|
129
|
-
|
|
138
|
+
const availabilityMiddleware = createMcpAvailabilityMiddleware(this.loadingManager, {
|
|
139
|
+
allowPartialAvailability: true,
|
|
140
|
+
includeOAuthServers: false,
|
|
141
|
+
});
|
|
142
|
+
setupStreamableHttpRoutes(router, this.serverManager, scopeAuthMiddleware, availabilityMiddleware, this.asyncOrchestrator);
|
|
143
|
+
setupSseRoutes(router, this.serverManager, scopeAuthMiddleware, availabilityMiddleware, this.asyncOrchestrator);
|
|
130
144
|
this.app.use(router);
|
|
131
145
|
// Log authentication status
|
|
132
146
|
if (this.configManager.isAuthEnabled()) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/transport/http/server.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,UAAU,MAAM,aAAa,CAAC;AACrC,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,aAAa,EAAE,MAAM,iDAAiD,CAAC;AAChF,OAAO,MAAM,MAAM,wBAAwB,CAAC;AAC5C,OAAO,YAAY,MAAM,+BAA+B,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,oCAAoC,CAAC;AAEvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../../src/transport/http/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { AuthProviderTransport } from '../core/types/index.js';
|
|
2
2
|
import { MCPServerParams } from '../core/types/index.js';
|
|
3
|
+
/**
|
|
4
|
+
* Infers transport type from configuration parameters
|
|
5
|
+
*/
|
|
6
|
+
export declare function inferTransportType(params: MCPServerParams, name: string): MCPServerParams;
|
|
3
7
|
/**
|
|
4
8
|
* Creates transport instances from configuration
|
|
5
9
|
* @param config - Configuration object with server parameters
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transportFactory.d.ts","sourceRoot":"","sources":["../../src/transport/transportFactory.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,qBAAqB,EAAyB,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"transportFactory.d.ts","sourceRoot":"","sources":["../../src/transport/transportFactory.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,qBAAqB,EAAyB,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAKzD;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,GAAG,eAAe,CAuBzF;AA4HD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CA2B/G"}
|
|
@@ -10,7 +10,7 @@ import { AgentConfigManager } from '../core/server/agentConfig.js';
|
|
|
10
10
|
/**
|
|
11
11
|
* Infers transport type from configuration parameters
|
|
12
12
|
*/
|
|
13
|
-
function inferTransportType(params, name) {
|
|
13
|
+
export function inferTransportType(params, name) {
|
|
14
14
|
const inferredParams = { ...params };
|
|
15
15
|
if (inferredParams.type) {
|
|
16
16
|
return inferredParams;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transportFactory.js","sourceRoot":"","sources":["../../src/transport/transportFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAyB,MAAM,2CAA2C,CAAC;AACxG,OAAO,EAAE,kBAAkB,EAA6B,MAAM,yCAAyC,CAAC;AACxG,OAAO,EACL,6BAA6B,GAE9B,MAAM,oDAAoD,CAAC;AAC5D,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAC/B,OAAO,MAAM,MAAM,qBAAqB,CAAC;AACzC,OAAO,EAAyB,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAEtF,OAAO,EAAqB,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC9F,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAEnE;;GAEG;AACH,
|
|
1
|
+
{"version":3,"file":"transportFactory.js","sourceRoot":"","sources":["../../src/transport/transportFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Desktop application configuration discovery and validation.
|
|
3
|
+
*
|
|
4
|
+
* Handles multi-location config file discovery, parsing, and validation
|
|
5
|
+
* for supported desktop applications.
|
|
6
|
+
*/
|
|
7
|
+
export interface MCPServerConfig {
|
|
8
|
+
name: string;
|
|
9
|
+
command?: string;
|
|
10
|
+
url?: string;
|
|
11
|
+
args?: string[];
|
|
12
|
+
env?: Record<string, string>;
|
|
13
|
+
}
|
|
14
|
+
export interface ConfigDiscovery {
|
|
15
|
+
app: string;
|
|
16
|
+
configs: Array<{
|
|
17
|
+
path: string;
|
|
18
|
+
level: 'project' | 'user' | 'system';
|
|
19
|
+
servers: MCPServerConfig[];
|
|
20
|
+
priority: number;
|
|
21
|
+
exists: boolean;
|
|
22
|
+
readable: boolean;
|
|
23
|
+
valid: boolean;
|
|
24
|
+
content?: any;
|
|
25
|
+
error?: string;
|
|
26
|
+
}>;
|
|
27
|
+
}
|
|
28
|
+
export interface ConfigStrategy {
|
|
29
|
+
action: 'replace' | 'choose' | 'none';
|
|
30
|
+
target?: ConfigDiscovery['configs'][0];
|
|
31
|
+
options?: ConfigDiscovery['configs'];
|
|
32
|
+
recommendation?: string;
|
|
33
|
+
}
|
|
34
|
+
export interface ConsolidationStatus {
|
|
35
|
+
isConsolidated: boolean;
|
|
36
|
+
consolidatedUrl?: string;
|
|
37
|
+
configPath?: string;
|
|
38
|
+
originalServers?: number;
|
|
39
|
+
message?: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Discover all configuration files for a given application
|
|
43
|
+
*/
|
|
44
|
+
export declare function discoverAppConfigs(appName: string): Promise<ConfigDiscovery>;
|
|
45
|
+
/**
|
|
46
|
+
* Check if an application has already been consolidated to 1mcp
|
|
47
|
+
*/
|
|
48
|
+
export declare function checkConsolidationStatus(appName: string): Promise<ConsolidationStatus>;
|
|
49
|
+
/**
|
|
50
|
+
* Handle multiple configuration files strategy
|
|
51
|
+
*/
|
|
52
|
+
export declare function handleMultipleConfigs(discovery: ConfigDiscovery): ConfigStrategy;
|
|
53
|
+
/**
|
|
54
|
+
* Filter and validate extracted servers
|
|
55
|
+
*/
|
|
56
|
+
export declare function extractAndFilterServers(appConfig: any, format?: string): MCPServerConfig[];
|
|
57
|
+
/**
|
|
58
|
+
* Generate configuration for specific app format
|
|
59
|
+
*/
|
|
60
|
+
export declare function generateAppConfig(appName: string, url: string): any;
|
|
61
|
+
/**
|
|
62
|
+
* Discover all installed apps with MCP configurations
|
|
63
|
+
*/
|
|
64
|
+
export declare function discoverInstalledApps(): Promise<{
|
|
65
|
+
configurable: Array<{
|
|
66
|
+
name: string;
|
|
67
|
+
displayName: string;
|
|
68
|
+
hasConfig: boolean;
|
|
69
|
+
configCount: number;
|
|
70
|
+
serverCount: number;
|
|
71
|
+
paths: string[];
|
|
72
|
+
}>;
|
|
73
|
+
manualOnly: string[];
|
|
74
|
+
}>;
|
|
75
|
+
//# sourceMappingURL=appDiscovery.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"appDiscovery.d.ts","sourceRoot":"","sources":["../../src/utils/appDiscovery.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AAEH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC9B;AAED,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,KAAK,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;QACrC,OAAO,EAAE,eAAe,EAAE,CAAC;QAC3B,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,OAAO,CAAC;QAChB,QAAQ,EAAE,OAAO,CAAC;QAClB,KAAK,EAAE,OAAO,CAAC;QACf,OAAO,CAAC,EAAE,GAAG,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC;IACtC,MAAM,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;IACvC,OAAO,CAAC,EAAE,eAAe,CAAC,SAAS,CAAC,CAAC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,mBAAmB;IAClC,cAAc,EAAE,OAAO,CAAC;IACxB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAiClF;AAED;;GAEG;AACH,wBAAsB,wBAAwB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAsB5F;AAiND;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,eAAe,GAAG,cAAc,CA6BhF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,GAAE,MAAkB,GAAG,eAAe,EAAE,CAwBrG;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,GAAG,CA6CnE;AAED;;GAEG;AACH,wBAAsB,qBAAqB,IAAI,OAAO,CAAC;IACrD,YAAY,EAAE,KAAK,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,OAAO,CAAC;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;QACpB,KAAK,EAAE,MAAM,EAAE,CAAC;KACjB,CAAC,CAAC;IACH,UAAU,EAAE,MAAM,EAAE,CAAC;CACtB,CAAC,CA4BD"}
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import JSON5 from 'json5';
|
|
3
|
+
import { getAppConfigPaths, getAppPreset, isAppConfigurable } from './appPresets.js';
|
|
4
|
+
/**
|
|
5
|
+
* Discover all configuration files for a given application
|
|
6
|
+
*/
|
|
7
|
+
export async function discoverAppConfigs(appName) {
|
|
8
|
+
const preset = getAppPreset(appName);
|
|
9
|
+
if (!preset || !isAppConfigurable(appName)) {
|
|
10
|
+
return {
|
|
11
|
+
app: appName,
|
|
12
|
+
configs: [],
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
const configPaths = getAppConfigPaths(appName);
|
|
16
|
+
const configs = [];
|
|
17
|
+
for (const configPath of configPaths) {
|
|
18
|
+
const configInfo = await analyzeConfigFile(configPath, preset.configFormat);
|
|
19
|
+
// Determine level and priority from preset
|
|
20
|
+
const location = preset.locations.find((loc) => {
|
|
21
|
+
const resolvedPath = configPath;
|
|
22
|
+
return resolvedPath.includes(loc.path.replace('~', '').replace('%APPDATA%', ''));
|
|
23
|
+
});
|
|
24
|
+
configs.push({
|
|
25
|
+
...configInfo,
|
|
26
|
+
path: configPath,
|
|
27
|
+
level: location?.level || 'user',
|
|
28
|
+
priority: location?.priority || 5,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
return {
|
|
32
|
+
app: appName,
|
|
33
|
+
configs: configs.filter((config) => config.exists),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Check if an application has already been consolidated to 1mcp
|
|
38
|
+
*/
|
|
39
|
+
export async function checkConsolidationStatus(appName) {
|
|
40
|
+
const discovery = await discoverAppConfigs(appName);
|
|
41
|
+
// Check each configuration for consolidation patterns
|
|
42
|
+
for (const config of discovery.configs) {
|
|
43
|
+
if (!config.content || !config.valid) {
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
const consolidationInfo = detectConsolidationPattern(config.content);
|
|
47
|
+
if (consolidationInfo.isConsolidated) {
|
|
48
|
+
return {
|
|
49
|
+
isConsolidated: true,
|
|
50
|
+
consolidatedUrl: consolidationInfo.consolidatedUrl,
|
|
51
|
+
configPath: config.path,
|
|
52
|
+
originalServers: consolidationInfo.originalServers,
|
|
53
|
+
message: `Already consolidated to ${consolidationInfo.consolidatedUrl}`,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return { isConsolidated: false };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Detect if a configuration file contains consolidation patterns
|
|
61
|
+
*/
|
|
62
|
+
function detectConsolidationPattern(config) {
|
|
63
|
+
// Check for different config formats
|
|
64
|
+
const serverSections = [
|
|
65
|
+
config.mcpServers, // Claude Desktop format
|
|
66
|
+
config.servers, // Cursor format
|
|
67
|
+
config['mcp.servers'], // VS Code settings.json format
|
|
68
|
+
config['claude.mcpServers'], // VS Code Claude extension format
|
|
69
|
+
config['cline.mcpServers'], // VS Code Cline extension format
|
|
70
|
+
config['continue.mcpServers'], // VS Code Continue extension format
|
|
71
|
+
config.mcp?.servers, // Alternative nested format
|
|
72
|
+
].filter(Boolean);
|
|
73
|
+
for (const servers of serverSections) {
|
|
74
|
+
const serverNames = Object.keys(servers || {});
|
|
75
|
+
// Pattern 1: Only has a single '1mcp' server entry
|
|
76
|
+
if (serverNames.length === 1 && (serverNames[0] === '1mcp' || serverNames[0].includes('1mcp'))) {
|
|
77
|
+
const server = servers[serverNames[0]];
|
|
78
|
+
const url = server.url;
|
|
79
|
+
const command = server.command;
|
|
80
|
+
// Verify it looks like a 1mcp URL or command
|
|
81
|
+
const hasValidUrl = url && (url.includes('/mcp') || url.includes('localhost') || url.includes('1mcp'));
|
|
82
|
+
const hasValidCommand = command && command.includes('@1mcp/agent');
|
|
83
|
+
if (hasValidUrl || hasValidCommand) {
|
|
84
|
+
return {
|
|
85
|
+
isConsolidated: true,
|
|
86
|
+
consolidatedUrl: url || 'detected',
|
|
87
|
+
originalServers: 1,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Pattern 2: Check if all servers point to 1mcp URLs
|
|
92
|
+
if (serverNames.length > 0) {
|
|
93
|
+
const allServersAre1mcp = serverNames.every((name) => {
|
|
94
|
+
const server = servers[name];
|
|
95
|
+
return (name === '1mcp' ||
|
|
96
|
+
name.includes('1mcp') ||
|
|
97
|
+
(server.url && server.url.includes('1mcp')) ||
|
|
98
|
+
(server.command && server.command.includes('@1mcp/agent')));
|
|
99
|
+
});
|
|
100
|
+
if (allServersAre1mcp) {
|
|
101
|
+
const firstServer = servers[serverNames[0]];
|
|
102
|
+
return {
|
|
103
|
+
isConsolidated: true,
|
|
104
|
+
consolidatedUrl: firstServer.url || 'detected',
|
|
105
|
+
originalServers: serverNames.length,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return { isConsolidated: false };
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Analyze a single configuration file
|
|
114
|
+
*/
|
|
115
|
+
async function analyzeConfigFile(configPath, format) {
|
|
116
|
+
try {
|
|
117
|
+
// Check if file exists
|
|
118
|
+
if (!fs.existsSync(configPath)) {
|
|
119
|
+
return {
|
|
120
|
+
servers: [],
|
|
121
|
+
exists: false,
|
|
122
|
+
readable: false,
|
|
123
|
+
valid: false,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
// Check if readable
|
|
127
|
+
try {
|
|
128
|
+
fs.accessSync(configPath, fs.constants.R_OK);
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
return {
|
|
132
|
+
servers: [],
|
|
133
|
+
exists: true,
|
|
134
|
+
readable: false,
|
|
135
|
+
valid: false,
|
|
136
|
+
error: 'File not readable',
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
// Read and parse file
|
|
140
|
+
const content = fs.readFileSync(configPath, 'utf8');
|
|
141
|
+
let parsedContent;
|
|
142
|
+
try {
|
|
143
|
+
// For VS Code settings, use JSON5 parser to handle comments
|
|
144
|
+
parsedContent = format === 'vscode' ? JSON5.parse(content) : JSON.parse(content);
|
|
145
|
+
}
|
|
146
|
+
catch (parseError) {
|
|
147
|
+
return {
|
|
148
|
+
servers: [],
|
|
149
|
+
exists: true,
|
|
150
|
+
readable: true,
|
|
151
|
+
valid: false,
|
|
152
|
+
error: `Invalid JSON: ${parseError}`,
|
|
153
|
+
};
|
|
154
|
+
}
|
|
155
|
+
// Extract servers based on format
|
|
156
|
+
const servers = extractServersFromConfig(parsedContent, format);
|
|
157
|
+
return {
|
|
158
|
+
servers,
|
|
159
|
+
exists: true,
|
|
160
|
+
readable: true,
|
|
161
|
+
valid: true,
|
|
162
|
+
content: parsedContent,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
catch (error) {
|
|
166
|
+
return {
|
|
167
|
+
servers: [],
|
|
168
|
+
exists: false,
|
|
169
|
+
readable: false,
|
|
170
|
+
valid: false,
|
|
171
|
+
error: error.message,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Extract MCP server configurations from parsed config based on format
|
|
177
|
+
*/
|
|
178
|
+
function extractServersFromConfig(config, format) {
|
|
179
|
+
const servers = [];
|
|
180
|
+
try {
|
|
181
|
+
let mcpSection;
|
|
182
|
+
switch (format) {
|
|
183
|
+
case 'claude-desktop':
|
|
184
|
+
mcpSection = config.mcpServers || {};
|
|
185
|
+
break;
|
|
186
|
+
case 'vscode':
|
|
187
|
+
// VS Code stores MCP servers in settings.json under extension-specific keys
|
|
188
|
+
// Common patterns: mcp.servers, mcpServers, or extension-specific keys
|
|
189
|
+
mcpSection =
|
|
190
|
+
config['mcp.servers'] ||
|
|
191
|
+
config.mcpServers ||
|
|
192
|
+
config['claude.mcpServers'] ||
|
|
193
|
+
config['cline.mcpServers'] ||
|
|
194
|
+
config['continue.mcpServers'] ||
|
|
195
|
+
{};
|
|
196
|
+
break;
|
|
197
|
+
case 'cursor':
|
|
198
|
+
mcpSection = config.servers || config.mcpServers || {};
|
|
199
|
+
break;
|
|
200
|
+
case 'generic':
|
|
201
|
+
mcpSection = config.servers || config.mcpServers || config;
|
|
202
|
+
break;
|
|
203
|
+
default:
|
|
204
|
+
mcpSection = config.mcpServers || config.servers || {};
|
|
205
|
+
}
|
|
206
|
+
for (const [name, serverConfig] of Object.entries(mcpSection)) {
|
|
207
|
+
if (typeof serverConfig === 'object' && serverConfig !== null) {
|
|
208
|
+
const server = serverConfig;
|
|
209
|
+
// Skip existing 1mcp entries to avoid circular references
|
|
210
|
+
if (name === '1mcp' ||
|
|
211
|
+
name.includes('1mcp') ||
|
|
212
|
+
(server.url && server.url.includes('1mcp')) ||
|
|
213
|
+
(server.command && server.command.includes('@1mcp/agent'))) {
|
|
214
|
+
continue;
|
|
215
|
+
}
|
|
216
|
+
servers.push({
|
|
217
|
+
name,
|
|
218
|
+
command: server.command,
|
|
219
|
+
url: server.url,
|
|
220
|
+
args: server.args,
|
|
221
|
+
env: server.env,
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
catch (_error) {
|
|
227
|
+
// Return empty array if extraction fails
|
|
228
|
+
}
|
|
229
|
+
return servers;
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Handle multiple configuration files strategy
|
|
233
|
+
*/
|
|
234
|
+
export function handleMultipleConfigs(discovery) {
|
|
235
|
+
const validConfigs = discovery.configs.filter((config) => config.exists && config.readable && config.valid);
|
|
236
|
+
if (validConfigs.length === 0) {
|
|
237
|
+
return { action: 'none' };
|
|
238
|
+
}
|
|
239
|
+
if (validConfigs.length === 1) {
|
|
240
|
+
return {
|
|
241
|
+
action: 'replace',
|
|
242
|
+
target: validConfigs[0],
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
// Multiple configs found - need user choice
|
|
246
|
+
// Sort by priority (highest first), then by number of servers
|
|
247
|
+
validConfigs.sort((a, b) => {
|
|
248
|
+
if (a.priority !== b.priority) {
|
|
249
|
+
return b.priority - a.priority;
|
|
250
|
+
}
|
|
251
|
+
return b.servers.length - a.servers.length;
|
|
252
|
+
});
|
|
253
|
+
return {
|
|
254
|
+
action: 'choose',
|
|
255
|
+
options: validConfigs,
|
|
256
|
+
target: validConfigs[0], // Default to highest priority
|
|
257
|
+
recommendation: 'highest-priority-with-servers',
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Filter and validate extracted servers
|
|
262
|
+
*/
|
|
263
|
+
export function extractAndFilterServers(appConfig, format = 'generic') {
|
|
264
|
+
const servers = extractServersFromConfig(appConfig, format);
|
|
265
|
+
return servers.filter((server) => {
|
|
266
|
+
// Must have either command or url
|
|
267
|
+
if (!server.command && !server.url) {
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
// Skip if it's already a 1mcp server
|
|
271
|
+
if (server.name === '1mcp' || server.name.includes('1mcp')) {
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
if (server.url && server.url.includes('1mcp')) {
|
|
275
|
+
return false;
|
|
276
|
+
}
|
|
277
|
+
if (server.command && server.command.includes('@1mcp/agent')) {
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
return true;
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
/**
|
|
284
|
+
* Generate configuration for specific app format
|
|
285
|
+
*/
|
|
286
|
+
export function generateAppConfig(appName, url) {
|
|
287
|
+
const preset = getAppPreset(appName);
|
|
288
|
+
if (!preset) {
|
|
289
|
+
throw new Error(`Unsupported app: ${appName}`);
|
|
290
|
+
}
|
|
291
|
+
switch (preset.configFormat) {
|
|
292
|
+
case 'vscode':
|
|
293
|
+
return {
|
|
294
|
+
'mcp.servers': {
|
|
295
|
+
'1mcp': {
|
|
296
|
+
url: url,
|
|
297
|
+
},
|
|
298
|
+
},
|
|
299
|
+
};
|
|
300
|
+
case 'augment':
|
|
301
|
+
return {
|
|
302
|
+
'augment.advanced.mcpServers': {
|
|
303
|
+
'1mcp': {
|
|
304
|
+
url: url,
|
|
305
|
+
},
|
|
306
|
+
},
|
|
307
|
+
};
|
|
308
|
+
case 'claude-desktop':
|
|
309
|
+
return {
|
|
310
|
+
mcpServers: {
|
|
311
|
+
'1mcp': {
|
|
312
|
+
command: 'npx',
|
|
313
|
+
args: ['-y', '@1mcp/agent', 'serve', '--transport', 'stdio'],
|
|
314
|
+
},
|
|
315
|
+
},
|
|
316
|
+
};
|
|
317
|
+
case 'generic':
|
|
318
|
+
default:
|
|
319
|
+
return {
|
|
320
|
+
mcpServers: {
|
|
321
|
+
'1mcp': {
|
|
322
|
+
url: url,
|
|
323
|
+
},
|
|
324
|
+
},
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Discover all installed apps with MCP configurations
|
|
330
|
+
*/
|
|
331
|
+
export async function discoverInstalledApps() {
|
|
332
|
+
const configurableApps = [];
|
|
333
|
+
const manualOnlyApps = [];
|
|
334
|
+
const { APP_PRESETS } = await import('./appPresets.js');
|
|
335
|
+
for (const [appName, preset] of Object.entries(APP_PRESETS)) {
|
|
336
|
+
if (preset.configurable) {
|
|
337
|
+
const discovery = await discoverAppConfigs(appName);
|
|
338
|
+
const validConfigs = discovery.configs.filter((c) => c.exists && c.readable);
|
|
339
|
+
const totalServers = validConfigs.reduce((sum, config) => sum + config.servers.length, 0);
|
|
340
|
+
configurableApps.push({
|
|
341
|
+
name: appName,
|
|
342
|
+
displayName: preset.displayName,
|
|
343
|
+
hasConfig: validConfigs.length > 0,
|
|
344
|
+
configCount: validConfigs.length,
|
|
345
|
+
serverCount: totalServers,
|
|
346
|
+
paths: validConfigs.map((c) => c.path),
|
|
347
|
+
});
|
|
348
|
+
}
|
|
349
|
+
else {
|
|
350
|
+
manualOnlyApps.push(appName);
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
return {
|
|
354
|
+
configurable: configurableApps,
|
|
355
|
+
manualOnly: manualOnlyApps,
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
//# sourceMappingURL=appDiscovery.js.map
|