@theia/ai-mcp 1.66.0-next.41 → 1.66.0-next.67
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/lib/browser/mcp-frontend-module.d.ts.map +1 -1
- package/lib/browser/mcp-frontend-module.js +48 -1
- package/lib/browser/mcp-frontend-module.js.map +1 -1
- package/lib/browser/mcp-server-manager-server-client.d.ts +12 -0
- package/lib/browser/mcp-server-manager-server-client.d.ts.map +1 -0
- package/lib/browser/mcp-server-manager-server-client.js +80 -0
- package/lib/browser/mcp-server-manager-server-client.js.map +1 -0
- package/lib/common/mcp-protocol.d.ts +52 -0
- package/lib/common/mcp-protocol.d.ts.map +1 -0
- package/lib/common/mcp-protocol.js +30 -0
- package/lib/common/mcp-protocol.js.map +1 -0
- package/lib/common/mcp-server-manager.d.ts +10 -0
- package/lib/common/mcp-server-manager.d.ts.map +1 -1
- package/lib/common/mcp-server-manager.js.map +1 -1
- package/lib/node/mcp-backend-module.d.ts.map +1 -1
- package/lib/node/mcp-backend-module.js +8 -0
- package/lib/node/mcp-backend-module.js.map +1 -1
- package/lib/node/mcp-server-manager-impl.d.ts.map +1 -1
- package/lib/node/mcp-server-manager-impl.js +8 -0
- package/lib/node/mcp-server-manager-impl.js.map +1 -1
- package/lib/node/mcp-server-manager-server.d.ts +9 -0
- package/lib/node/mcp-server-manager-server.d.ts.map +1 -0
- package/lib/node/mcp-server-manager-server.js +53 -0
- package/lib/node/mcp-server-manager-server.js.map +1 -0
- package/package.json +4 -4
- package/src/browser/mcp-frontend-module.ts +59 -2
- package/src/browser/mcp-server-manager-server-client.ts +82 -0
- package/src/common/mcp-protocol.ts +75 -0
- package/src/common/mcp-server-manager.ts +11 -0
- package/src/node/mcp-backend-module.ts +15 -1
- package/src/node/mcp-server-manager-impl.ts +8 -0
- package/src/node/mcp-server-manager-server.ts +49 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-frontend-module.d.ts","sourceRoot":"","sources":["../../src/browser/mcp-frontend-module.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;;
|
|
1
|
+
{"version":3,"file":"mcp-frontend-module.d.ts","sourceRoot":"","sources":["../../src/browser/mcp-frontend-module.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;;AAc/D,wBA2DG"}
|
|
@@ -21,14 +21,61 @@ const mcp_server_manager_1 = require("../common/mcp-server-manager");
|
|
|
21
21
|
const mcp_frontend_application_contribution_1 = require("./mcp-frontend-application-contribution");
|
|
22
22
|
const mcp_frontend_service_1 = require("./mcp-frontend-service");
|
|
23
23
|
const mcp_frontend_notification_service_1 = require("./mcp-frontend-notification-service");
|
|
24
|
+
const mcp_server_manager_server_client_1 = require("./mcp-server-manager-server-client");
|
|
25
|
+
const mcp_protocol_1 = require("../common/mcp-protocol");
|
|
24
26
|
exports.default = new inversify_1.ContainerModule(bind => {
|
|
25
27
|
bind(browser_1.FrontendApplicationContribution).to(mcp_frontend_application_contribution_1.McpFrontendApplicationContribution).inSingletonScope();
|
|
26
28
|
bind(mcp_server_manager_1.MCPFrontendService).to(mcp_frontend_service_1.MCPFrontendServiceImpl).inSingletonScope();
|
|
27
29
|
bind(mcp_server_manager_1.MCPFrontendNotificationService).to(mcp_frontend_notification_service_1.MCPFrontendNotificationServiceImpl).inSingletonScope();
|
|
30
|
+
bind(mcp_protocol_1.MCPServerManagerServerClient).to(mcp_server_manager_server_client_1.MCPServerManagerServerClientImpl).inSingletonScope();
|
|
31
|
+
bind(mcp_protocol_1.MCPServerManagerServer).toDynamicValue(ctx => {
|
|
32
|
+
const connection = ctx.container.get(browser_1.RemoteConnectionProvider);
|
|
33
|
+
const client = ctx.container.get(mcp_protocol_1.MCPServerManagerServerClient);
|
|
34
|
+
return connection.createProxy(mcp_protocol_1.MCPServerManagerServerPath, client);
|
|
35
|
+
}).inSingletonScope();
|
|
28
36
|
bind(mcp_server_manager_1.MCPServerManager).toDynamicValue(ctx => {
|
|
37
|
+
const mgrServer = ctx.container.get(mcp_protocol_1.MCPServerManagerServer);
|
|
29
38
|
const connection = ctx.container.get(browser_1.RemoteConnectionProvider);
|
|
30
39
|
const client = ctx.container.get(mcp_server_manager_1.MCPFrontendNotificationService);
|
|
31
|
-
|
|
40
|
+
const serverClient = ctx.container.get(mcp_protocol_1.MCPServerManagerServerClient);
|
|
41
|
+
const backendServerManager = connection.createProxy(mcp_server_manager_1.MCPServerManagerPath, client);
|
|
42
|
+
// Listen to server updates to clean up removed servers
|
|
43
|
+
client.onDidUpdateMCPServers(() => backendServerManager.getServerNames()
|
|
44
|
+
.then(names => serverClient.cleanServers(names))
|
|
45
|
+
.catch((error) => {
|
|
46
|
+
console.error('Error cleaning server descriptions:', error);
|
|
47
|
+
}));
|
|
48
|
+
// We proxy the MCPServerManager to override addOrUpdateServer and getServerDescription
|
|
49
|
+
// to handle the resolve functions via the MCPServerManagerServerClient.
|
|
50
|
+
return new Proxy(backendServerManager, {
|
|
51
|
+
get(target, prop, receiver) {
|
|
52
|
+
// override addOrUpdateServer to store the original description in the MCPServerManagerServerClient
|
|
53
|
+
// to be used in resolveServerDescription if a resolve function is provided
|
|
54
|
+
if (prop === 'addOrUpdateServer') {
|
|
55
|
+
return async function (...args) {
|
|
56
|
+
const updated = serverClient.addServerDescription(args[0]);
|
|
57
|
+
await mgrServer.addOrUpdateServer(updated);
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
// override getServerDescription to mix in the resolve function from the client
|
|
61
|
+
if (prop === 'getServerDescription') {
|
|
62
|
+
return async function (name) {
|
|
63
|
+
const description = await Reflect.apply(target.getServerDescription, target, [name]);
|
|
64
|
+
if (description) {
|
|
65
|
+
const resolveFunction = serverClient.getResolveFunction(name);
|
|
66
|
+
if (resolveFunction) {
|
|
67
|
+
return {
|
|
68
|
+
...description,
|
|
69
|
+
resolve: resolveFunction
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return description;
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
return Reflect.get(target, prop, receiver);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
32
79
|
}).inSingletonScope();
|
|
33
80
|
});
|
|
34
81
|
//# sourceMappingURL=mcp-frontend-module.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-frontend-module.js","sourceRoot":"","sources":["../../src/browser/mcp-frontend-module.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;AAEhF,4DAA+D;AAC/D,qDAA+H;AAC/H,
|
|
1
|
+
{"version":3,"file":"mcp-frontend-module.js","sourceRoot":"","sources":["../../src/browser/mcp-frontend-module.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { MCPServerDescription } from '../common';
|
|
2
|
+
import { MCPServerDescriptionRCP, MCPServerManagerServerClient } from '../common/mcp-protocol';
|
|
3
|
+
type StoredServerInfo = Pick<MCPServerDescription, 'name' | 'resolve'>;
|
|
4
|
+
export declare class MCPServerManagerServerClientImpl implements MCPServerManagerServerClient {
|
|
5
|
+
protected serverDescriptions: Map<string, StoredServerInfo>;
|
|
6
|
+
addServerDescription(description: MCPServerDescription): MCPServerDescriptionRCP;
|
|
7
|
+
getResolveFunction(name: string): MCPServerDescription['resolve'];
|
|
8
|
+
resolveServerDescription(description: MCPServerDescriptionRCP): Promise<MCPServerDescription>;
|
|
9
|
+
cleanServers(serverNames: string[]): void;
|
|
10
|
+
}
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=mcp-server-manager-server-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server-manager-server-client.d.ts","sourceRoot":"","sources":["../../src/browser/mcp-server-manager-server-client.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,oBAAoB,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,EAA0B,uBAAuB,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAEvH,KAAK,gBAAgB,GAAG,IAAI,CAAC,oBAAoB,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAEvE,qBACa,gCAAiC,YAAW,4BAA4B;IAEjF,SAAS,CAAC,kBAAkB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAa;IAExE,oBAAoB,CAAC,WAAW,EAAE,oBAAoB,GAAG,uBAAuB;IAoBhF,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC;IAS3D,wBAAwB,CAAC,WAAW,EAAE,uBAAuB,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAcnG,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI;CAU5C"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2025 Dirk Fauth and others.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.MCPServerManagerServerClientImpl = void 0;
|
|
19
|
+
const tslib_1 = require("tslib");
|
|
20
|
+
const inversify_1 = require("@theia/core/shared/inversify");
|
|
21
|
+
const uuid_1 = require("@theia/core/lib/common/uuid");
|
|
22
|
+
const mcp_protocol_1 = require("../common/mcp-protocol");
|
|
23
|
+
let MCPServerManagerServerClientImpl = class MCPServerManagerServerClientImpl {
|
|
24
|
+
constructor() {
|
|
25
|
+
this.serverDescriptions = new Map();
|
|
26
|
+
}
|
|
27
|
+
addServerDescription(description) {
|
|
28
|
+
if (description.resolve) {
|
|
29
|
+
const serverDescription = {
|
|
30
|
+
...description,
|
|
31
|
+
resolveId: (0, uuid_1.generateUuid)(),
|
|
32
|
+
};
|
|
33
|
+
// store only the name and resolve function
|
|
34
|
+
if (serverDescription.resolveId) {
|
|
35
|
+
this.serverDescriptions.set(serverDescription.resolveId, {
|
|
36
|
+
name: description.name,
|
|
37
|
+
resolve: description.resolve
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
return serverDescription;
|
|
41
|
+
}
|
|
42
|
+
return description;
|
|
43
|
+
}
|
|
44
|
+
getResolveFunction(name) {
|
|
45
|
+
for (const storedInfo of this.serverDescriptions.values()) {
|
|
46
|
+
if (storedInfo.name === name) {
|
|
47
|
+
return storedInfo.resolve;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
async resolveServerDescription(description) {
|
|
53
|
+
const cleanDescription = (0, mcp_protocol_1.cleanServerDescription)(description);
|
|
54
|
+
if (description.resolveId) {
|
|
55
|
+
const storedInfo = this.serverDescriptions.get(description.resolveId);
|
|
56
|
+
if (storedInfo === null || storedInfo === void 0 ? void 0 : storedInfo.resolve) {
|
|
57
|
+
const updated = await storedInfo.resolve(cleanDescription);
|
|
58
|
+
if (updated) {
|
|
59
|
+
return updated;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return cleanDescription;
|
|
64
|
+
}
|
|
65
|
+
cleanServers(serverNames) {
|
|
66
|
+
const currentNamesSet = new Set(serverNames);
|
|
67
|
+
// Remove descriptions for servers that no longer exist
|
|
68
|
+
for (const [resolveId, storedInfo] of this.serverDescriptions.entries()) {
|
|
69
|
+
if (storedInfo.name && !currentNamesSet.has(storedInfo.name)) {
|
|
70
|
+
console.debug('Removing a frontend stored resolve function because the corresponding MCP server was removed', storedInfo);
|
|
71
|
+
this.serverDescriptions.delete(resolveId);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
exports.MCPServerManagerServerClientImpl = MCPServerManagerServerClientImpl;
|
|
77
|
+
exports.MCPServerManagerServerClientImpl = MCPServerManagerServerClientImpl = tslib_1.__decorate([
|
|
78
|
+
(0, inversify_1.injectable)()
|
|
79
|
+
], MCPServerManagerServerClientImpl);
|
|
80
|
+
//# sourceMappingURL=mcp-server-manager-server-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server-manager-server-client.js","sourceRoot":"","sources":["../../src/browser/mcp-server-manager-server-client.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,4CAA4C;AAC5C,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,4DAA0D;AAE1D,sDAA2D;AAC3D,yDAAuH;AAKhH,IAAM,gCAAgC,GAAtC,MAAM,gCAAgC;IAAtC;QAEO,uBAAkB,GAAkC,IAAI,GAAG,EAAE,CAAC;IAuD5E,CAAC;IArDG,oBAAoB,CAAC,WAAiC;QAClD,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACtB,MAAM,iBAAiB,GAA4B;gBAC/C,GAAG,WAAW;gBACd,SAAS,EAAE,IAAA,mBAAY,GAAE;aAC5B,CAAC;YAEF,2CAA2C;YAC3C,IAAI,iBAAiB,CAAC,SAAS,EAAE,CAAC;gBAC9B,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,iBAAiB,CAAC,SAAS,EAAE;oBACrD,IAAI,EAAE,WAAW,CAAC,IAAI;oBACtB,OAAO,EAAE,WAAW,CAAC,OAAO;iBAC/B,CAAC,CAAC;YACP,CAAC;YAED,OAAO,iBAAiB,CAAC;QAC7B,CAAC;QACD,OAAO,WAAW,CAAC;IACvB,CAAC;IAED,kBAAkB,CAAC,IAAY;QAC3B,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC;YACxD,IAAI,UAAU,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBAC3B,OAAO,UAAU,CAAC,OAAO,CAAC;YAC9B,CAAC;QACL,CAAC;QACD,OAAO,SAAS,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,wBAAwB,CAAC,WAAoC;QAC/D,MAAM,gBAAgB,GAAG,IAAA,qCAAsB,EAAC,WAAW,CAAC,CAAC;QAC7D,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;YACxB,MAAM,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;YACtE,IAAI,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,OAAO,EAAE,CAAC;gBACtB,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;gBAC3D,IAAI,OAAO,EAAE,CAAC;oBACV,OAAO,OAAO,CAAC;gBACnB,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,gBAAgB,CAAC;IAC5B,CAAC;IAED,YAAY,CAAC,WAAqB;QAC9B,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;QAC7C,uDAAuD;QACvD,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,EAAE,CAAC;YACtE,IAAI,UAAU,CAAC,IAAI,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3D,OAAO,CAAC,KAAK,CAAC,8FAA8F,EAAE,UAAU,CAAC,CAAC;gBAC1H,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC9C,CAAC;QACL,CAAC;IACL,CAAC;CACJ,CAAA;AAzDY,4EAAgC;2CAAhC,gCAAgC;IAD5C,IAAA,sBAAU,GAAE;GACA,gCAAgC,CAyD5C"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { MCPServerDescription } from './mcp-server-manager';
|
|
2
|
+
/**
|
|
3
|
+
* MCPServerDescriptionRCP is a version of MCPServerDescription that can be sent over RCP.
|
|
4
|
+
* It omits the 'resolve' function and instead includes an optional 'resolveId' to identify
|
|
5
|
+
* the resolve function on the client side.
|
|
6
|
+
*/
|
|
7
|
+
export type MCPServerDescriptionRCP = Omit<MCPServerDescription, 'resolve'> & {
|
|
8
|
+
resolveId?: string;
|
|
9
|
+
};
|
|
10
|
+
export declare const MCPServerManagerServer: unique symbol;
|
|
11
|
+
export declare const MCPServerManagerServerPath = "/services/mcpservermanagerserver";
|
|
12
|
+
/**
|
|
13
|
+
* The MCPServerManagerServer handles the RCP specialties of adding server descriptions from the frontend
|
|
14
|
+
*/
|
|
15
|
+
export interface MCPServerManagerServer {
|
|
16
|
+
addOrUpdateServer(description: MCPServerDescriptionRCP): Promise<void>;
|
|
17
|
+
setClient(client: MCPServerManagerServerClient): void;
|
|
18
|
+
}
|
|
19
|
+
export declare const MCPServerManagerServerClient: unique symbol;
|
|
20
|
+
export interface MCPServerManagerServerClient {
|
|
21
|
+
/**
|
|
22
|
+
* Adds a server description to the client. If the description contains a resolve function,
|
|
23
|
+
* a unique resolveId is generated and only the name and resolve function are stored.
|
|
24
|
+
* @param description The server description to add.
|
|
25
|
+
* @returns The server description with a unique resolveId if a resolve function is provided
|
|
26
|
+
* or the given description if no resolve function is provided.
|
|
27
|
+
*/
|
|
28
|
+
addServerDescription(description: MCPServerDescription): MCPServerDescriptionRCP;
|
|
29
|
+
/**
|
|
30
|
+
* Retrieves the resolve function for a given server name.
|
|
31
|
+
* @param name The name of the server to retrieve the resolve function for.
|
|
32
|
+
* @returns The resolve function if found, or undefined if not found.
|
|
33
|
+
*/
|
|
34
|
+
getResolveFunction(name: string): MCPServerDescription['resolve'];
|
|
35
|
+
/**
|
|
36
|
+
* Resolves the server description by calling the resolve function if it exists.
|
|
37
|
+
* @param description The server description to resolve.
|
|
38
|
+
* @returns The resolved server description.
|
|
39
|
+
*/
|
|
40
|
+
resolveServerDescription(description: MCPServerDescriptionRCP): Promise<MCPServerDescription>;
|
|
41
|
+
/**
|
|
42
|
+
* Removes server descriptions that are no longer present in the MCPServerManager.
|
|
43
|
+
*
|
|
44
|
+
* @param serverNames The current list of server names from the MCPServerManager.
|
|
45
|
+
*/
|
|
46
|
+
cleanServers(serverNames: string[]): void;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Util function to convert a MCPServerDescriptionRCP to a MCPServerDescription by removing the resolveId.
|
|
50
|
+
*/
|
|
51
|
+
export declare const cleanServerDescription: (description: MCPServerDescriptionRCP) => MCPServerDescription;
|
|
52
|
+
//# sourceMappingURL=mcp-protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-protocol.d.ts","sourceRoot":"","sources":["../../src/common/mcp-protocol.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE5D;;;;GAIG;AACH,MAAM,MAAM,uBAAuB,GAAG,IAAI,CAAC,oBAAoB,EAAE,SAAS,CAAC,GAAG;IAC1E,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,eAAO,MAAM,sBAAsB,eAAmC,CAAC;AACvE,eAAO,MAAM,0BAA0B,qCAAqC,CAAC;AAE7E;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACnC,iBAAiB,CAAC,WAAW,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvE,SAAS,CAAC,MAAM,EAAE,4BAA4B,GAAG,IAAI,CAAA;CACxD;AAED,eAAO,MAAM,4BAA4B,eAAyC,CAAC;AACnF,MAAM,WAAW,4BAA4B;IACzC;;;;;;OAMG;IACH,oBAAoB,CAAC,WAAW,EAAE,oBAAoB,GAAG,uBAAuB,CAAC;IACjF;;;;OAIG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;IAClE;;;;OAIG;IACH,wBAAwB,CAAC,WAAW,EAAE,uBAAuB,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC9F;;;;OAIG;IACH,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAC7C;AAED;;GAEG;AACH,eAAO,MAAM,sBAAsB,gBAAiB,uBAAuB,KAAG,oBAG7E,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2025 EclipseSource GmbH.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.cleanServerDescription = exports.MCPServerManagerServerClient = exports.MCPServerManagerServerPath = exports.MCPServerManagerServer = void 0;
|
|
19
|
+
exports.MCPServerManagerServer = Symbol('MCPServerManagerServer');
|
|
20
|
+
exports.MCPServerManagerServerPath = '/services/mcpservermanagerserver';
|
|
21
|
+
exports.MCPServerManagerServerClient = Symbol('MCPServerManagerServerClient');
|
|
22
|
+
/**
|
|
23
|
+
* Util function to convert a MCPServerDescriptionRCP to a MCPServerDescription by removing the resolveId.
|
|
24
|
+
*/
|
|
25
|
+
const cleanServerDescription = (description) => {
|
|
26
|
+
const { resolveId, ...descriptionProperties } = description;
|
|
27
|
+
return { ...descriptionProperties };
|
|
28
|
+
};
|
|
29
|
+
exports.cleanServerDescription = cleanServerDescription;
|
|
30
|
+
//# sourceMappingURL=mcp-protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-protocol.js","sourceRoot":"","sources":["../../src/common/mcp-protocol.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;AAanE,QAAA,sBAAsB,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAC1D,QAAA,0BAA0B,GAAG,kCAAkC,CAAC;AAUhE,QAAA,4BAA4B,GAAG,MAAM,CAAC,8BAA8B,CAAC,CAAC;AA8BnF;;GAEG;AACI,MAAM,sBAAsB,GAAG,CAAC,WAAoC,EAAwB,EAAE;IACjG,MAAM,EAAE,SAAS,EAAE,GAAG,qBAAqB,EAAE,GAAG,WAAW,CAAC;IAC5D,OAAO,EAAE,GAAG,qBAAqB,EAA0B,CAAC;AAChE,CAAC,CAAC;AAHW,QAAA,sBAAsB,0BAGjC"}
|
|
@@ -75,6 +75,16 @@ export interface BaseMCPServerDescription {
|
|
|
75
75
|
* List of available tools for the server. Returns the name and description if available.
|
|
76
76
|
*/
|
|
77
77
|
tools?: ToolInformation[];
|
|
78
|
+
/**
|
|
79
|
+
* Optional resolve function that gets called during server definition resolution.
|
|
80
|
+
* This function can be used to dynamically modify server configurations,
|
|
81
|
+
* resolve environment variables, validate configurations, or perform any
|
|
82
|
+
* necessary preprocessing before the server starts.
|
|
83
|
+
*
|
|
84
|
+
* @param description The current server description
|
|
85
|
+
* @returns A promise that resolves to the processed server description
|
|
86
|
+
*/
|
|
87
|
+
resolve?: (description: MCPServerDescription) => Promise<MCPServerDescription>;
|
|
78
88
|
}
|
|
79
89
|
export interface LocalMCPServerDescription extends BaseMCPServerDescription {
|
|
80
90
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server-manager.d.ts","sourceRoot":"","sources":["../../src/common/mcp-server-manager.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAChI,OAAO,EAAE,KAAK,EAAE,MAAM,8BAA8B,CAAC;AAErD,eAAO,MAAM,kBAAkB,eAA+B,CAAC;AAC/D,MAAM,WAAW,kBAAkB;IAC/B,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAChD,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtD,iCAAiC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACnD,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,iBAAiB,CAAC,WAAW,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpC,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAAC;IAC9E,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;IACnE,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAAC;CACnD;AAED,eAAO,MAAM,8BAA8B,eAA2C,CAAC;AACvF,MAAM,WAAW,8BAA8B;IAC3C,QAAQ,CAAC,qBAAqB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;IAC5C,mBAAmB,IAAI,IAAI,CAAC;CAC/B;AAED,MAAM,WAAW,SAAS;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACxE,QAAQ,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC;IACrC,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC9D,YAAY,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAC7C,WAAW,EAAE,oBAAoB,CAAC;CACrC;AAED,MAAM,WAAW,gBAAgB;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAC5F,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,iBAAiB,CAAC,WAAW,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC3D,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IACvD,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACpC,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAAC;IAC9E,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvC,SAAS,CAAC,MAAM,EAAE,8BAA8B,GAAG,IAAI,CAAC;IACxD,gBAAgB,CAAC,MAAM,EAAE,8BAA8B,GAAG,IAAI,CAAC;IAC/D,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAClF,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC;CAClE;AAED,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,oBAAY,eAAe;IACvB,UAAU,gBAAgB;IAC1B,YAAY,kBAAkB;IAC9B,QAAQ,aAAa;IACrB,UAAU,eAAe;IACzB,OAAO,YAAY;IACnB,SAAS,cAAc;IACvB,OAAO,YAAY;CACtB;AAED,MAAM,WAAW,wBAAwB;IACrC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;OAEG;IACH,MAAM,CAAC,EAAE,eAAe,CAAC;IAEzB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;OAEG;IACH,KAAK,CAAC,EAAE,eAAe,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-server-manager.d.ts","sourceRoot":"","sources":["../../src/common/mcp-server-manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server-manager.js","sourceRoot":"","sources":["../../src/common/mcp-server-manager.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;AAKnE,QAAA,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAelD,QAAA,8BAA8B,GAAG,MAAM,CAAC,gCAAgC,CAAC,CAAC;AAmCvF,IAAY,eAQX;AARD,WAAY,eAAe;IACvB,6CAA0B,CAAA;IAC1B,iDAA8B,CAAA;IAC9B,wCAAqB,CAAA;IACrB,4CAAyB,CAAA;IACzB,sCAAmB,CAAA;IACnB,0CAAuB,CAAA;IACvB,sCAAmB,CAAA;AACvB,CAAC,EARW,eAAe,+BAAf,eAAe,QAQ1B;
|
|
1
|
+
{"version":3,"file":"mcp-server-manager.js","sourceRoot":"","sources":["../../src/common/mcp-server-manager.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;AAKnE,QAAA,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC;AAelD,QAAA,8BAA8B,GAAG,MAAM,CAAC,gCAAgC,CAAC,CAAC;AAmCvF,IAAY,eAQX;AARD,WAAY,eAAe;IACvB,6CAA0B,CAAA;IAC1B,iDAA8B,CAAA;IAC9B,wCAAqB,CAAA;IACrB,4CAAyB,CAAA;IACzB,sCAAmB,CAAA;IACnB,0CAAuB,CAAA;IACvB,sCAAmB,CAAA;AACvB,CAAC,EARW,eAAe,+BAAf,eAAe,QAQ1B;AAiFD,SAAgB,2BAA2B,CAAC,WAAiC;IACzE,OAAQ,WAAyC,CAAC,OAAO,KAAK,SAAS,CAAC;AAC5E,CAAC;AAFD,kEAEC;AACD,SAAgB,4BAA4B,CAAC,WAAiC;IAC1E,OAAQ,WAA0C,CAAC,SAAS,KAAK,SAAS,CAAC;AAC/E,CAAC;AAFD,oEAEC;AAEY,QAAA,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAC9C,QAAA,oBAAoB,GAAG,4BAA4B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-backend-module.d.ts","sourceRoot":"","sources":["../../src/node/mcp-backend-module.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;;
|
|
1
|
+
{"version":3,"file":"mcp-backend-module.d.ts","sourceRoot":"","sources":["../../src/node/mcp-backend-module.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;;AAkC/D,wBAGG"}
|
|
@@ -21,6 +21,8 @@ const mcp_server_manager_impl_1 = require("./mcp-server-manager-impl");
|
|
|
21
21
|
const mcp_server_manager_1 = require("../common/mcp-server-manager");
|
|
22
22
|
const connection_container_module_1 = require("@theia/core/lib/node/messaging/connection-container-module");
|
|
23
23
|
const mcp_preferences_1 = require("../common/mcp-preferences");
|
|
24
|
+
const mcp_server_manager_server_1 = require("./mcp-server-manager-server");
|
|
25
|
+
const mcp_protocol_1 = require("../common/mcp-protocol");
|
|
24
26
|
// We use a connection module to handle AI services separately for each frontend.
|
|
25
27
|
const mcpConnectionModule = connection_container_module_1.ConnectionContainerModule.create(({ bind, bindBackendService, bindFrontendService }) => {
|
|
26
28
|
bind(mcp_server_manager_1.MCPServerManager).to(mcp_server_manager_impl_1.MCPServerManagerImpl).inSingletonScope();
|
|
@@ -30,6 +32,12 @@ const mcpConnectionModule = connection_container_module_1.ConnectionContainerMod
|
|
|
30
32
|
client.onDidCloseConnection(() => server.disconnectClient(client));
|
|
31
33
|
return server;
|
|
32
34
|
})).inSingletonScope();
|
|
35
|
+
bind(mcp_protocol_1.MCPServerManagerServer).to(mcp_server_manager_server_1.MCPServerManagerServerImpl).inSingletonScope();
|
|
36
|
+
bind(core_1.ConnectionHandler).toDynamicValue(ctx => new core_1.RpcConnectionHandler(mcp_protocol_1.MCPServerManagerServerPath, client => {
|
|
37
|
+
const server = ctx.container.get(mcp_protocol_1.MCPServerManagerServer);
|
|
38
|
+
server.setClient(client);
|
|
39
|
+
return server;
|
|
40
|
+
})).inSingletonScope();
|
|
33
41
|
});
|
|
34
42
|
exports.default = new inversify_1.ContainerModule(bind => {
|
|
35
43
|
bind(core_1.PreferenceContribution).toConstantValue({ schema: mcp_preferences_1.McpServersPreferenceSchema });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-backend-module.js","sourceRoot":"","sources":["../../src/node/mcp-backend-module.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;AAEhF,4DAA+D;AAC/D,sCAA8F;AAC9F,uEAAiE;AACjE,
|
|
1
|
+
{"version":3,"file":"mcp-backend-module.js","sourceRoot":"","sources":["../../src/node/mcp-backend-module.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;AAEhF,4DAA+D;AAC/D,sCAA8F;AAC9F,uEAAiE;AACjE,qEAIsC;AACtC,4GAAuG;AACvG,+DAAuE;AACvE,2EAAyE;AACzE,yDAA0H;AAE1H,iFAAiF;AACjF,MAAM,mBAAmB,GAAG,uDAAyB,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,EAAE,EAAE;IAC/G,IAAI,CAAC,qCAAgB,CAAC,CAAC,EAAE,CAAC,8CAAoB,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACnE,IAAI,CAAC,wBAAiB,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,2BAAoB,CAClE,yCAAoB,EAAE,MAAM,CAAC,EAAE;QAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAmB,qCAAgB,CAAC,CAAC;QACrE,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzB,MAAM,CAAC,oBAAoB,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC;QACnE,OAAO,MAAM,CAAC;IAClB,CAAC,CACJ,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACtB,IAAI,CAAC,qCAAsB,CAAC,CAAC,EAAE,CAAC,sDAA0B,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAC/E,IAAI,CAAC,wBAAiB,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,2BAAoB,CAClE,yCAA0B,EAAE,MAAM,CAAC,EAAE;QACjC,MAAM,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAyB,qCAAsB,CAAC,CAAC;QACjF,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACzB,OAAO,MAAM,CAAC;IAClB,CAAC,CACJ,CAAC,CAAC,gBAAgB,EAAE,CAAC;AAC1B,CAAC,CAAC,CAAC;AAEH,kBAAe,IAAI,2BAAe,CAAC,IAAI,CAAC,EAAE;IACtC,IAAI,CAAC,6BAAsB,CAAC,CAAC,eAAe,CAAC,EAAE,MAAM,EAAE,4CAA0B,EAAE,CAAC,CAAC;IACrF,IAAI,CAAC,uDAAyB,CAAC,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC;AACzE,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server-manager-impl.d.ts","sourceRoot":"","sources":["../../src/node/mcp-server-manager-impl.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AACtH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7G,qBACa,oBAAqB,YAAW,gBAAgB;IAEzD,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAa;IACtD,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,8BAA8B,CAAC,CAAM;IAC9D,SAAS,CAAC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAa;IAEzD,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7C,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAU5C,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAQrF,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-server-manager-impl.d.ts","sourceRoot":"","sources":["../../src/node/mcp-server-manager-impl.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AACtH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,MAAM,oCAAoC,CAAC;AAE7G,qBACa,oBAAqB,YAAW,gBAAgB;IAEzD,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,CAAa;IACtD,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,8BAA8B,CAAC,CAAM;IAC9D,SAAS,CAAC,eAAe,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,CAAC,CAAa;IAEzD,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAU7C,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAU5C,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,CAAC;IAQrF,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB9C,cAAc,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAInC,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC;IAKtE,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAQ5E,iBAAiB,CAAC,WAAW,EAAE,oBAAoB,GAAG,IAAI;IAoB1D,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAkBhC,SAAS,CAAC,MAAM,EAAE,8BAA8B,GAAG,IAAI;IAIvD,gBAAgB,CAAC,MAAM,EAAE,8BAA8B,GAAG,IAAI;IAU9D,OAAO,CAAC,aAAa;IAIrB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAQjF,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC;CAOjE"}
|
|
@@ -55,6 +55,14 @@ let MCPServerManagerImpl = class MCPServerManagerImpl {
|
|
|
55
55
|
if (!server) {
|
|
56
56
|
throw new Error(`MCP server "${serverName}" not found.`);
|
|
57
57
|
}
|
|
58
|
+
const description = await server.getDescription();
|
|
59
|
+
if (description.resolve) {
|
|
60
|
+
const resolved = await description.resolve(description);
|
|
61
|
+
const isEqual = JSON.stringify(description) === JSON.stringify(resolved);
|
|
62
|
+
if (!isEqual) {
|
|
63
|
+
server.update(resolved);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
58
66
|
await server.start();
|
|
59
67
|
this.notifyClients();
|
|
60
68
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-server-manager-impl.js","sourceRoot":"","sources":["../../src/node/mcp-server-manager-impl.ts"],"names":[],"mappings":";;;;AAAA,gFAAgF;AAChF,yCAAyC;AACzC,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;AAChF,4DAA0D;AAE1D,6CAAyC;AAKlC,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAA1B;QAEO,YAAO,GAA2B,IAAI,GAAG,EAAE,CAAC;QAC5C,YAAO,GAA0C,EAAE,CAAC;QACpD,oBAAe,GAA4B,IAAI,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-server-manager-impl.js","sourceRoot":"","sources":["../../src/node/mcp-server-manager-impl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { MCPServerManager } from '../common';
|
|
2
|
+
import { MCPServerDescriptionRCP, MCPServerManagerServer, MCPServerManagerServerClient } from '../common/mcp-protocol';
|
|
3
|
+
export declare class MCPServerManagerServerImpl implements MCPServerManagerServer {
|
|
4
|
+
protected readonly mcpServerManager: MCPServerManager;
|
|
5
|
+
protected client: MCPServerManagerServerClient;
|
|
6
|
+
setClient(client: MCPServerManagerServerClient): void;
|
|
7
|
+
addOrUpdateServer(descriptionRCP: MCPServerDescriptionRCP): Promise<void>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=mcp-server-manager-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server-manager-server.d.ts","sourceRoot":"","sources":["../../src/node/mcp-server-manager-server.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAwB,gBAAgB,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EAA0B,uBAAuB,EAAE,sBAAsB,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAC;AAE/I,qBACa,0BAA2B,YAAW,sBAAsB;IAGrE,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAEtD,SAAS,CAAC,MAAM,EAAE,4BAA4B,CAAC;IAE/C,SAAS,CAAC,MAAM,EAAE,4BAA4B,GAAG,IAAI;IAI/C,iBAAiB,CAAC,cAAc,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC;CAgBlF"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2025 Dirk Fauth and others.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.MCPServerManagerServerImpl = void 0;
|
|
19
|
+
const tslib_1 = require("tslib");
|
|
20
|
+
const inversify_1 = require("@theia/core/shared/inversify");
|
|
21
|
+
const common_1 = require("../common");
|
|
22
|
+
const mcp_protocol_1 = require("../common/mcp-protocol");
|
|
23
|
+
let MCPServerManagerServerImpl = class MCPServerManagerServerImpl {
|
|
24
|
+
setClient(client) {
|
|
25
|
+
this.client = client;
|
|
26
|
+
}
|
|
27
|
+
async addOrUpdateServer(descriptionRCP) {
|
|
28
|
+
const description = (0, mcp_protocol_1.cleanServerDescription)(descriptionRCP);
|
|
29
|
+
if (descriptionRCP.resolveId) {
|
|
30
|
+
description.resolve = async (desc) => {
|
|
31
|
+
if (this.client) {
|
|
32
|
+
const descRCP = {
|
|
33
|
+
...desc,
|
|
34
|
+
resolveId: descriptionRCP.resolveId
|
|
35
|
+
};
|
|
36
|
+
return this.client.resolveServerDescription(descRCP);
|
|
37
|
+
}
|
|
38
|
+
return desc; // Fallback if no client is set
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
;
|
|
42
|
+
this.mcpServerManager.addOrUpdateServer(description);
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
exports.MCPServerManagerServerImpl = MCPServerManagerServerImpl;
|
|
46
|
+
tslib_1.__decorate([
|
|
47
|
+
(0, inversify_1.inject)(common_1.MCPServerManager),
|
|
48
|
+
tslib_1.__metadata("design:type", Object)
|
|
49
|
+
], MCPServerManagerServerImpl.prototype, "mcpServerManager", void 0);
|
|
50
|
+
exports.MCPServerManagerServerImpl = MCPServerManagerServerImpl = tslib_1.__decorate([
|
|
51
|
+
(0, inversify_1.injectable)()
|
|
52
|
+
], MCPServerManagerServerImpl);
|
|
53
|
+
//# sourceMappingURL=mcp-server-manager-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server-manager-server.js","sourceRoot":"","sources":["../../src/node/mcp-server-manager-server.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,4CAA4C;AAC5C,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;;AAEhF,4DAAkE;AAClE,sCAAmE;AACnE,yDAA+I;AAGxI,IAAM,0BAA0B,GAAhC,MAAM,0BAA0B;IAOnC,SAAS,CAAC,MAAoC;QAC1C,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,cAAuC;QAC3D,MAAM,WAAW,GAAG,IAAA,qCAAsB,EAAC,cAAc,CAAC,CAAC;QAC3D,IAAI,cAAc,CAAC,SAAS,EAAE,CAAC;YAC3B,WAAW,CAAC,OAAO,GAAG,KAAK,EAAE,IAA0B,EAAE,EAAE;gBACvD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;oBACd,MAAM,OAAO,GAA4B;wBACrC,GAAG,IAAI;wBACP,SAAS,EAAE,cAAc,CAAC,SAAS;qBACtC,CAAC;oBACF,OAAO,IAAI,CAAC,MAAM,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;gBACzD,CAAC;gBACD,OAAO,IAAI,CAAC,CAAC,+BAA+B;YAChD,CAAC,CAAC;QACN,CAAC;QAAA,CAAC;QACF,IAAI,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACzD,CAAC;CACJ,CAAA;AA3BY,gEAA0B;AAGhB;IADlB,IAAA,kBAAM,EAAC,yBAAgB,CAAC;;oEAC6B;qCAH7C,0BAA0B;IADtC,IAAA,sBAAU,GAAE;GACA,0BAA0B,CA2BtC"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/ai-mcp",
|
|
3
|
-
"version": "1.66.0-next.
|
|
3
|
+
"version": "1.66.0-next.67+6fae23c43",
|
|
4
4
|
"description": "Theia - MCP Integration",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@modelcontextprotocol/sdk": "^1.15.1",
|
|
7
|
-
"@theia/ai-core": "1.66.0-next.
|
|
8
|
-
"@theia/core": "1.66.0-next.
|
|
7
|
+
"@theia/ai-core": "1.66.0-next.67+6fae23c43",
|
|
8
|
+
"@theia/core": "1.66.0-next.67+6fae23c43"
|
|
9
9
|
},
|
|
10
10
|
"publishConfig": {
|
|
11
11
|
"access": "public"
|
|
@@ -47,5 +47,5 @@
|
|
|
47
47
|
"nyc": {
|
|
48
48
|
"extends": "../../configs/nyc.json"
|
|
49
49
|
},
|
|
50
|
-
"gitHead": "
|
|
50
|
+
"gitHead": "6fae23c43f4e850ef4dd6f7c85aa0422077f70e2"
|
|
51
51
|
}
|
|
@@ -16,18 +16,75 @@
|
|
|
16
16
|
|
|
17
17
|
import { ContainerModule } from '@theia/core/shared/inversify';
|
|
18
18
|
import { FrontendApplicationContribution, RemoteConnectionProvider, ServiceConnectionProvider } from '@theia/core/lib/browser';
|
|
19
|
-
import {
|
|
19
|
+
import {
|
|
20
|
+
MCPFrontendService,
|
|
21
|
+
MCPServerManager,
|
|
22
|
+
MCPServerManagerPath,
|
|
23
|
+
MCPFrontendNotificationService
|
|
24
|
+
} from '../common/mcp-server-manager';
|
|
20
25
|
import { McpFrontendApplicationContribution } from './mcp-frontend-application-contribution';
|
|
21
26
|
import { MCPFrontendServiceImpl } from './mcp-frontend-service';
|
|
22
27
|
import { MCPFrontendNotificationServiceImpl } from './mcp-frontend-notification-service';
|
|
28
|
+
import { MCPServerManagerServerClientImpl } from './mcp-server-manager-server-client';
|
|
29
|
+
import { MCPServerManagerServer, MCPServerManagerServerClient, MCPServerManagerServerPath } from '../common/mcp-protocol';
|
|
23
30
|
|
|
24
31
|
export default new ContainerModule(bind => {
|
|
25
32
|
bind(FrontendApplicationContribution).to(McpFrontendApplicationContribution).inSingletonScope();
|
|
26
33
|
bind(MCPFrontendService).to(MCPFrontendServiceImpl).inSingletonScope();
|
|
27
34
|
bind(MCPFrontendNotificationService).to(MCPFrontendNotificationServiceImpl).inSingletonScope();
|
|
35
|
+
bind(MCPServerManagerServerClient).to(MCPServerManagerServerClientImpl).inSingletonScope();
|
|
36
|
+
|
|
37
|
+
bind(MCPServerManagerServer).toDynamicValue(ctx => {
|
|
38
|
+
const connection = ctx.container.get<ServiceConnectionProvider>(RemoteConnectionProvider);
|
|
39
|
+
const client = ctx.container.get<MCPServerManagerServerClient>(MCPServerManagerServerClient);
|
|
40
|
+
return connection.createProxy<MCPServerManagerServer>(MCPServerManagerServerPath, client);
|
|
41
|
+
}).inSingletonScope();
|
|
42
|
+
|
|
28
43
|
bind(MCPServerManager).toDynamicValue(ctx => {
|
|
44
|
+
const mgrServer = ctx.container.get<MCPServerManagerServer>(MCPServerManagerServer);
|
|
29
45
|
const connection = ctx.container.get<ServiceConnectionProvider>(RemoteConnectionProvider);
|
|
30
46
|
const client = ctx.container.get<MCPFrontendNotificationService>(MCPFrontendNotificationService);
|
|
31
|
-
|
|
47
|
+
const serverClient = ctx.container.get<MCPServerManagerServerClient>(MCPServerManagerServerClient);
|
|
48
|
+
const backendServerManager = connection.createProxy<MCPServerManager>(MCPServerManagerPath, client);
|
|
49
|
+
|
|
50
|
+
// Listen to server updates to clean up removed servers
|
|
51
|
+
client.onDidUpdateMCPServers(() =>
|
|
52
|
+
backendServerManager.getServerNames()
|
|
53
|
+
.then(names => serverClient.cleanServers(names))
|
|
54
|
+
.catch((error: unknown) => {
|
|
55
|
+
console.error('Error cleaning server descriptions:', error);
|
|
56
|
+
}));
|
|
57
|
+
|
|
58
|
+
// We proxy the MCPServerManager to override addOrUpdateServer and getServerDescription
|
|
59
|
+
// to handle the resolve functions via the MCPServerManagerServerClient.
|
|
60
|
+
return new Proxy(backendServerManager, {
|
|
61
|
+
get(target: MCPServerManager, prop: PropertyKey, receiver: unknown): unknown {
|
|
62
|
+
// override addOrUpdateServer to store the original description in the MCPServerManagerServerClient
|
|
63
|
+
// to be used in resolveServerDescription if a resolve function is provided
|
|
64
|
+
if (prop === 'addOrUpdateServer') {
|
|
65
|
+
return async function (this: MCPServerManager, ...args: [serverDescription: Parameters<MCPServerManager['addOrUpdateServer']>[0]]): Promise<void> {
|
|
66
|
+
const updated = serverClient.addServerDescription(args[0]);
|
|
67
|
+
await mgrServer.addOrUpdateServer(updated);
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
// override getServerDescription to mix in the resolve function from the client
|
|
71
|
+
if (prop === 'getServerDescription') {
|
|
72
|
+
return async function (this: MCPServerManager, name: string): ReturnType<MCPServerManager['getServerDescription']> {
|
|
73
|
+
const description = await Reflect.apply(target.getServerDescription, target, [name]);
|
|
74
|
+
if (description) {
|
|
75
|
+
const resolveFunction = serverClient.getResolveFunction(name);
|
|
76
|
+
if (resolveFunction) {
|
|
77
|
+
return {
|
|
78
|
+
...description,
|
|
79
|
+
resolve: resolveFunction
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return description;
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
return Reflect.get(target, prop, receiver);
|
|
87
|
+
}
|
|
88
|
+
});
|
|
32
89
|
}).inSingletonScope();
|
|
33
90
|
});
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2025 Dirk Fauth and others.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// This Source Code may also be made available under the following Secondary
|
|
9
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
// with the GNU Classpath Exception which is available at
|
|
12
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
//
|
|
14
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
|
|
17
|
+
import { injectable } from '@theia/core/shared/inversify';
|
|
18
|
+
import { MCPServerDescription } from '../common';
|
|
19
|
+
import { generateUuid } from '@theia/core/lib/common/uuid';
|
|
20
|
+
import { cleanServerDescription, MCPServerDescriptionRCP, MCPServerManagerServerClient } from '../common/mcp-protocol';
|
|
21
|
+
|
|
22
|
+
type StoredServerInfo = Pick<MCPServerDescription, 'name' | 'resolve'>;
|
|
23
|
+
|
|
24
|
+
@injectable()
|
|
25
|
+
export class MCPServerManagerServerClientImpl implements MCPServerManagerServerClient {
|
|
26
|
+
|
|
27
|
+
protected serverDescriptions: Map<string, StoredServerInfo> = new Map();
|
|
28
|
+
|
|
29
|
+
addServerDescription(description: MCPServerDescription): MCPServerDescriptionRCP {
|
|
30
|
+
if (description.resolve) {
|
|
31
|
+
const serverDescription: MCPServerDescriptionRCP = {
|
|
32
|
+
...description,
|
|
33
|
+
resolveId: generateUuid(),
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
// store only the name and resolve function
|
|
37
|
+
if (serverDescription.resolveId) {
|
|
38
|
+
this.serverDescriptions.set(serverDescription.resolveId, {
|
|
39
|
+
name: description.name,
|
|
40
|
+
resolve: description.resolve
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return serverDescription;
|
|
45
|
+
}
|
|
46
|
+
return description;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
getResolveFunction(name: string): MCPServerDescription['resolve'] {
|
|
50
|
+
for (const storedInfo of this.serverDescriptions.values()) {
|
|
51
|
+
if (storedInfo.name === name) {
|
|
52
|
+
return storedInfo.resolve;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async resolveServerDescription(description: MCPServerDescriptionRCP): Promise<MCPServerDescription> {
|
|
59
|
+
const cleanDescription = cleanServerDescription(description);
|
|
60
|
+
if (description.resolveId) {
|
|
61
|
+
const storedInfo = this.serverDescriptions.get(description.resolveId);
|
|
62
|
+
if (storedInfo?.resolve) {
|
|
63
|
+
const updated = await storedInfo.resolve(cleanDescription);
|
|
64
|
+
if (updated) {
|
|
65
|
+
return updated;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
return cleanDescription;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
cleanServers(serverNames: string[]): void {
|
|
73
|
+
const currentNamesSet = new Set(serverNames);
|
|
74
|
+
// Remove descriptions for servers that no longer exist
|
|
75
|
+
for (const [resolveId, storedInfo] of this.serverDescriptions.entries()) {
|
|
76
|
+
if (storedInfo.name && !currentNamesSet.has(storedInfo.name)) {
|
|
77
|
+
console.debug('Removing a frontend stored resolve function because the corresponding MCP server was removed', storedInfo);
|
|
78
|
+
this.serverDescriptions.delete(resolveId);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2025 EclipseSource GmbH.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// This Source Code may also be made available under the following Secondary
|
|
9
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
// with the GNU Classpath Exception which is available at
|
|
12
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
//
|
|
14
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
|
|
17
|
+
import { MCPServerDescription } from './mcp-server-manager';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* MCPServerDescriptionRCP is a version of MCPServerDescription that can be sent over RCP.
|
|
21
|
+
* It omits the 'resolve' function and instead includes an optional 'resolveId' to identify
|
|
22
|
+
* the resolve function on the client side.
|
|
23
|
+
*/
|
|
24
|
+
export type MCPServerDescriptionRCP = Omit<MCPServerDescription, 'resolve'> & {
|
|
25
|
+
resolveId?: string;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export const MCPServerManagerServer = Symbol('MCPServerManagerServer');
|
|
29
|
+
export const MCPServerManagerServerPath = '/services/mcpservermanagerserver';
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* The MCPServerManagerServer handles the RCP specialties of adding server descriptions from the frontend
|
|
33
|
+
*/
|
|
34
|
+
export interface MCPServerManagerServer {
|
|
35
|
+
addOrUpdateServer(description: MCPServerDescriptionRCP): Promise<void>;
|
|
36
|
+
setClient(client: MCPServerManagerServerClient): void
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export const MCPServerManagerServerClient = Symbol('MCPServerManagerServerClient');
|
|
40
|
+
export interface MCPServerManagerServerClient {
|
|
41
|
+
/**
|
|
42
|
+
* Adds a server description to the client. If the description contains a resolve function,
|
|
43
|
+
* a unique resolveId is generated and only the name and resolve function are stored.
|
|
44
|
+
* @param description The server description to add.
|
|
45
|
+
* @returns The server description with a unique resolveId if a resolve function is provided
|
|
46
|
+
* or the given description if no resolve function is provided.
|
|
47
|
+
*/
|
|
48
|
+
addServerDescription(description: MCPServerDescription): MCPServerDescriptionRCP;
|
|
49
|
+
/**
|
|
50
|
+
* Retrieves the resolve function for a given server name.
|
|
51
|
+
* @param name The name of the server to retrieve the resolve function for.
|
|
52
|
+
* @returns The resolve function if found, or undefined if not found.
|
|
53
|
+
*/
|
|
54
|
+
getResolveFunction(name: string): MCPServerDescription['resolve'];
|
|
55
|
+
/**
|
|
56
|
+
* Resolves the server description by calling the resolve function if it exists.
|
|
57
|
+
* @param description The server description to resolve.
|
|
58
|
+
* @returns The resolved server description.
|
|
59
|
+
*/
|
|
60
|
+
resolveServerDescription(description: MCPServerDescriptionRCP): Promise<MCPServerDescription>;
|
|
61
|
+
/**
|
|
62
|
+
* Removes server descriptions that are no longer present in the MCPServerManager.
|
|
63
|
+
*
|
|
64
|
+
* @param serverNames The current list of server names from the MCPServerManager.
|
|
65
|
+
*/
|
|
66
|
+
cleanServers(serverNames: string[]): void;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Util function to convert a MCPServerDescriptionRCP to a MCPServerDescription by removing the resolveId.
|
|
71
|
+
*/
|
|
72
|
+
export const cleanServerDescription = (description: MCPServerDescriptionRCP): MCPServerDescription => {
|
|
73
|
+
const { resolveId, ...descriptionProperties } = description;
|
|
74
|
+
return { ...descriptionProperties } as MCPServerDescription;
|
|
75
|
+
};
|
|
@@ -102,6 +102,17 @@ export interface BaseMCPServerDescription {
|
|
|
102
102
|
* List of available tools for the server. Returns the name and description if available.
|
|
103
103
|
*/
|
|
104
104
|
tools?: ToolInformation[];
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Optional resolve function that gets called during server definition resolution.
|
|
108
|
+
* This function can be used to dynamically modify server configurations,
|
|
109
|
+
* resolve environment variables, validate configurations, or perform any
|
|
110
|
+
* necessary preprocessing before the server starts.
|
|
111
|
+
*
|
|
112
|
+
* @param description The current server description
|
|
113
|
+
* @returns A promise that resolves to the processed server description
|
|
114
|
+
*/
|
|
115
|
+
resolve?: (description: MCPServerDescription) => Promise<MCPServerDescription>;
|
|
105
116
|
}
|
|
106
117
|
|
|
107
118
|
export interface LocalMCPServerDescription extends BaseMCPServerDescription {
|
|
@@ -17,9 +17,15 @@
|
|
|
17
17
|
import { ContainerModule } from '@theia/core/shared/inversify';
|
|
18
18
|
import { ConnectionHandler, PreferenceContribution, RpcConnectionHandler } from '@theia/core';
|
|
19
19
|
import { MCPServerManagerImpl } from './mcp-server-manager-impl';
|
|
20
|
-
import {
|
|
20
|
+
import {
|
|
21
|
+
MCPFrontendNotificationService,
|
|
22
|
+
MCPServerManager,
|
|
23
|
+
MCPServerManagerPath
|
|
24
|
+
} from '../common/mcp-server-manager';
|
|
21
25
|
import { ConnectionContainerModule } from '@theia/core/lib/node/messaging/connection-container-module';
|
|
22
26
|
import { McpServersPreferenceSchema } from '../common/mcp-preferences';
|
|
27
|
+
import { MCPServerManagerServerImpl } from './mcp-server-manager-server';
|
|
28
|
+
import { MCPServerManagerServer, MCPServerManagerServerClient, MCPServerManagerServerPath } from '../common/mcp-protocol';
|
|
23
29
|
|
|
24
30
|
// We use a connection module to handle AI services separately for each frontend.
|
|
25
31
|
const mcpConnectionModule = ConnectionContainerModule.create(({ bind, bindBackendService, bindFrontendService }) => {
|
|
@@ -32,6 +38,14 @@ const mcpConnectionModule = ConnectionContainerModule.create(({ bind, bindBacken
|
|
|
32
38
|
return server;
|
|
33
39
|
}
|
|
34
40
|
)).inSingletonScope();
|
|
41
|
+
bind(MCPServerManagerServer).to(MCPServerManagerServerImpl).inSingletonScope();
|
|
42
|
+
bind(ConnectionHandler).toDynamicValue(ctx => new RpcConnectionHandler<MCPServerManagerServerClient>(
|
|
43
|
+
MCPServerManagerServerPath, client => {
|
|
44
|
+
const server = ctx.container.get<MCPServerManagerServer>(MCPServerManagerServer);
|
|
45
|
+
server.setClient(client);
|
|
46
|
+
return server;
|
|
47
|
+
}
|
|
48
|
+
)).inSingletonScope();
|
|
35
49
|
});
|
|
36
50
|
|
|
37
51
|
export default new ContainerModule(bind => {
|
|
@@ -59,6 +59,14 @@ export class MCPServerManagerImpl implements MCPServerManager {
|
|
|
59
59
|
if (!server) {
|
|
60
60
|
throw new Error(`MCP server "${serverName}" not found.`);
|
|
61
61
|
}
|
|
62
|
+
const description = await server.getDescription();
|
|
63
|
+
if (description.resolve) {
|
|
64
|
+
const resolved = await description.resolve(description);
|
|
65
|
+
const isEqual = JSON.stringify(description) === JSON.stringify(resolved);
|
|
66
|
+
if (!isEqual) {
|
|
67
|
+
server.update(resolved);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
62
70
|
await server.start();
|
|
63
71
|
this.notifyClients();
|
|
64
72
|
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2025 Dirk Fauth and others.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// This Source Code may also be made available under the following Secondary
|
|
9
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
// with the GNU Classpath Exception which is available at
|
|
12
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
//
|
|
14
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
|
|
17
|
+
import { inject, injectable } from '@theia/core/shared/inversify';
|
|
18
|
+
import { MCPServerDescription, MCPServerManager } from '../common';
|
|
19
|
+
import { cleanServerDescription, MCPServerDescriptionRCP, MCPServerManagerServer, MCPServerManagerServerClient } from '../common/mcp-protocol';
|
|
20
|
+
|
|
21
|
+
@injectable()
|
|
22
|
+
export class MCPServerManagerServerImpl implements MCPServerManagerServer {
|
|
23
|
+
|
|
24
|
+
@inject(MCPServerManager)
|
|
25
|
+
protected readonly mcpServerManager: MCPServerManager;
|
|
26
|
+
|
|
27
|
+
protected client: MCPServerManagerServerClient;
|
|
28
|
+
|
|
29
|
+
setClient(client: MCPServerManagerServerClient): void {
|
|
30
|
+
this.client = client;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async addOrUpdateServer(descriptionRCP: MCPServerDescriptionRCP): Promise<void> {
|
|
34
|
+
const description = cleanServerDescription(descriptionRCP);
|
|
35
|
+
if (descriptionRCP.resolveId) {
|
|
36
|
+
description.resolve = async (desc: MCPServerDescription) => {
|
|
37
|
+
if (this.client) {
|
|
38
|
+
const descRCP: MCPServerDescriptionRCP = {
|
|
39
|
+
...desc,
|
|
40
|
+
resolveId: descriptionRCP.resolveId
|
|
41
|
+
};
|
|
42
|
+
return this.client.resolveServerDescription(descRCP);
|
|
43
|
+
}
|
|
44
|
+
return desc; // Fallback if no client is set
|
|
45
|
+
};
|
|
46
|
+
};
|
|
47
|
+
this.mcpServerManager.addOrUpdateServer(description);
|
|
48
|
+
}
|
|
49
|
+
}
|