@codingame/monaco-vscode-mcp-service-override 26.2.2 → 28.0.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/index.js +8 -2
- package/package.json +2 -2
- package/vscode/src/vs/base/common/jsonRpcProtocol.d.ts +66 -0
- package/vscode/src/vs/base/common/jsonRpcProtocol.js +216 -0
- package/vscode/src/vs/platform/mcp/common/allowedMcpServersService.js +1 -1
- package/vscode/src/vs/platform/mcp/common/mcpGalleryService.js +2 -2
- package/vscode/src/vs/platform/mcp/common/mcpGateway.d.ts +39 -0
- package/vscode/src/vs/platform/mcp/common/mcpGateway.js +6 -0
- package/vscode/src/vs/platform/mcp/common/mcpResourceScannerService.d.ts +3 -1
- package/vscode/src/vs/platform/mcp/common/mcpResourceScannerService.js +12 -5
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcp.contribution.js +15 -5
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpAddContextContribution.js +2 -2
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpCommands.js +58 -58
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpElicitationService.js +27 -28
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpGatewayService.d.ts +20 -0
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpGatewayService.js +51 -0
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpGatewayToolBrokerContribution.d.ts +7 -0
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpGatewayToolBrokerContribution.js +16 -0
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpLanguageFeatures.js +18 -18
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpMigration.js +4 -4
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpResourceQuickAccess.js +8 -8
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServersView.d.ts +4 -1
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServersView.js +42 -24
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpWorkbenchService.d.ts +1 -1
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpWorkbenchService.js +13 -12
- package/vscode/src/vs/workbench/contrib/mcp/common/discovery/extensionMcpDiscovery.js +4 -4
- package/vscode/src/vs/workbench/contrib/mcp/common/discovery/installedMcpServersDiscovery.js +3 -1
- package/vscode/src/vs/workbench/contrib/mcp/common/discovery/nativeMcpDiscoveryAbstract.js +1 -1
- package/vscode/src/vs/workbench/contrib/mcp/common/discovery/nativeMcpDiscoveryAdapters.js +2 -1
- package/vscode/src/vs/workbench/contrib/mcp/common/discovery/pluginMcpDiscovery.d.ts +15 -0
- package/vscode/src/vs/workbench/contrib/mcp/common/discovery/pluginMcpDiscovery.js +106 -0
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpContextKeys.js +4 -4
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpGatewayToolBrokerChannel.d.ts +39 -0
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpGatewayToolBrokerChannel.js +302 -0
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpLanguageModelToolContribution.js +25 -17
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpRegistry.d.ts +3 -1
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpRegistry.js +27 -18
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpSamplingLog.js +1 -1
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpSamplingService.d.ts +1 -0
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpSamplingService.js +28 -18
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpSandboxService.d.ts +47 -0
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpSandboxService.js +385 -0
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpServerConnection.d.ts +6 -1
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpServerConnection.js +61 -3
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpServerRequestHandler.d.ts +4 -20
- package/vscode/src/vs/workbench/contrib/mcp/common/mcpServerRequestHandler.js +95 -145
- package/vscode/src/vs/workbench/services/authentication/browser/authenticationMcpService.js +9 -9
- package/vscode/src/vs/workbench/services/mcp/browser/mcpWorkbenchManagementService.d.ts +1 -1
- package/vscode/src/vs/workbench/services/mcp/browser/mcpWorkbenchManagementService.js +2 -2
- package/vscode/src/vs/platform/mcp/common/mcpManagementIpc.d.ts +0 -42
- package/vscode/src/vs/platform/mcp/common/mcpManagementIpc.js +0 -105
- package/vscode/src/vs/platform/mcp/common/mcpManagementService.d.ts +0 -130
- package/vscode/src/vs/platform/mcp/common/mcpManagementService.js +0 -665
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServerActions.d.ts +0 -259
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServerActions.js +0 -1225
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServerEditor.d.ts +0 -72
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServerEditor.js +0 -996
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServerEditorInput.d.ts +0 -17
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServerEditorInput.js +0 -49
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServerIcons.d.ts +0 -5
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServerIcons.js +0 -12
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServerWidgets.d.ts +0 -88
- package/vscode/src/vs/workbench/contrib/mcp/browser/mcpServerWidgets.js +0 -464
- package/vscode/src/vs/workbench/contrib/mcp/browser/media/mcpServerEditor.css +0 -94
- package/vscode/src/vs/workbench/services/mcp/common/mcpWorkbenchManagementService.d.ts +0 -87
- package/vscode/src/vs/workbench/services/mcp/common/mcpWorkbenchManagementService.js +0 -702
package/index.js
CHANGED
|
@@ -7,12 +7,12 @@ import { McpGalleryService } from './vscode/src/vs/platform/mcp/common/mcpGaller
|
|
|
7
7
|
import { IAllowedMcpServersService, IMcpGalleryService } from '@codingame/monaco-vscode-api/vscode/vs/platform/mcp/common/mcpManagement.service';
|
|
8
8
|
import { McpResourceScannerService } from './vscode/src/vs/platform/mcp/common/mcpResourceScannerService.js';
|
|
9
9
|
import { IMcpResourceScannerService } from '@codingame/monaco-vscode-api/vscode/vs/platform/mcp/common/mcpResourceScannerService.service';
|
|
10
|
-
import './vscode/src/vs/workbench/contrib/mcp/browser/mcp.contribution.js';
|
|
11
10
|
import { McpElicitationService } from './vscode/src/vs/workbench/contrib/mcp/browser/mcpElicitationService.js';
|
|
12
11
|
import { McpWorkbenchService } from './vscode/src/vs/workbench/contrib/mcp/browser/mcpWorkbenchService.js';
|
|
13
12
|
import { McpRegistry } from './vscode/src/vs/workbench/contrib/mcp/common/mcpRegistry.js';
|
|
14
13
|
import { IMcpRegistry } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/mcp/common/mcpRegistryTypes.service';
|
|
15
14
|
import { McpSamplingService } from './vscode/src/vs/workbench/contrib/mcp/common/mcpSamplingService.js';
|
|
15
|
+
import { IMcpSandboxService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/mcp/common/mcpSandboxService.service';
|
|
16
16
|
import { McpService } from './vscode/src/vs/workbench/contrib/mcp/common/mcpService.js';
|
|
17
17
|
import { IMcpElicitationService, IMcpSamplingService, IMcpWorkbenchService, IMcpService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/mcp/common/mcpTypes.service';
|
|
18
18
|
import { AuthenticationMcpAccessService } from './vscode/src/vs/workbench/services/authentication/browser/authenticationMcpAccessService.js';
|
|
@@ -24,6 +24,10 @@ import { IAuthenticationMcpUsageService } from '@codingame/monaco-vscode-api/vsc
|
|
|
24
24
|
import { WorkbenchMcpGalleryManifestService } from './vscode/src/vs/workbench/services/mcp/browser/mcpGalleryManifestService.js';
|
|
25
25
|
import { WorkbenchMcpManagementService } from './vscode/src/vs/workbench/services/mcp/browser/mcpWorkbenchManagementService.js';
|
|
26
26
|
import { IWorkbenchMcpManagementService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/services/mcp/common/mcpWorkbenchManagementService.service';
|
|
27
|
+
import { McpSandboxService } from './vscode/src/vs/workbench/contrib/mcp/common/mcpSandboxService.js';
|
|
28
|
+
import { IWorkbenchMcpGatewayService } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/mcp/common/mcpGatewayService.service';
|
|
29
|
+
import { BrowserMcpGatewayService } from './vscode/src/vs/workbench/contrib/mcp/browser/mcpGatewayService.js';
|
|
30
|
+
import './vscode/src/vs/workbench/contrib/mcp/browser/mcp.contribution.js';
|
|
27
31
|
|
|
28
32
|
function getServiceOverride() {
|
|
29
33
|
return {
|
|
@@ -39,7 +43,9 @@ function getServiceOverride() {
|
|
|
39
43
|
[IMcpElicitationService.toString()]: new SyncDescriptor(McpElicitationService, [], true),
|
|
40
44
|
[IWorkbenchMcpManagementService.toString()]: new SyncDescriptor(WorkbenchMcpManagementService, [], true),
|
|
41
45
|
[IAllowedMcpServersService.toString()]: new SyncDescriptor(AllowedMcpServersService, [], true),
|
|
42
|
-
[IMcpGalleryManifestService.toString()]: new SyncDescriptor(WorkbenchMcpGalleryManifestService, [], true)
|
|
46
|
+
[IMcpGalleryManifestService.toString()]: new SyncDescriptor(WorkbenchMcpGalleryManifestService, [], true),
|
|
47
|
+
[IMcpSandboxService.toString()]: new SyncDescriptor(McpSandboxService, [], true),
|
|
48
|
+
[IWorkbenchMcpGatewayService.toString()]: new SyncDescriptor(BrowserMcpGatewayService, [], true)
|
|
43
49
|
};
|
|
44
50
|
}
|
|
45
51
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@codingame/monaco-vscode-mcp-service-override",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "28.0.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "VSCode public API plugged on the monaco editor - mcp service-override",
|
|
6
6
|
"keywords": [],
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
},
|
|
16
16
|
"type": "module",
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@codingame/monaco-vscode-api": "
|
|
18
|
+
"@codingame/monaco-vscode-api": "28.0.0"
|
|
19
19
|
},
|
|
20
20
|
"main": "index.js",
|
|
21
21
|
"module": "index.js",
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { CancellationToken } from "@codingame/monaco-vscode-api/vscode/vs/base/common/cancellation";
|
|
2
|
+
import { Disposable } from "@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle";
|
|
3
|
+
export type JsonRpcId = string | number;
|
|
4
|
+
export interface IJsonRpcError {
|
|
5
|
+
code: number;
|
|
6
|
+
message: string;
|
|
7
|
+
data?: unknown;
|
|
8
|
+
}
|
|
9
|
+
export interface IJsonRpcRequest {
|
|
10
|
+
jsonrpc: "2.0";
|
|
11
|
+
id: JsonRpcId;
|
|
12
|
+
method: string;
|
|
13
|
+
params?: unknown;
|
|
14
|
+
}
|
|
15
|
+
export interface IJsonRpcNotification {
|
|
16
|
+
jsonrpc: "2.0";
|
|
17
|
+
method: string;
|
|
18
|
+
params?: unknown;
|
|
19
|
+
}
|
|
20
|
+
export interface IJsonRpcSuccessResponse {
|
|
21
|
+
jsonrpc: "2.0";
|
|
22
|
+
id: JsonRpcId;
|
|
23
|
+
result: unknown;
|
|
24
|
+
}
|
|
25
|
+
export interface IJsonRpcErrorResponse {
|
|
26
|
+
jsonrpc: "2.0";
|
|
27
|
+
id?: JsonRpcId;
|
|
28
|
+
error: IJsonRpcError;
|
|
29
|
+
}
|
|
30
|
+
export type JsonRpcMessage = IJsonRpcRequest | IJsonRpcNotification | IJsonRpcSuccessResponse | IJsonRpcErrorResponse;
|
|
31
|
+
export interface IJsonRpcProtocolHandlers {
|
|
32
|
+
handleRequest?(request: IJsonRpcRequest, token: CancellationToken): Promise<unknown> | unknown;
|
|
33
|
+
handleNotification?(notification: IJsonRpcNotification): void;
|
|
34
|
+
}
|
|
35
|
+
export declare class JsonRpcError extends Error {
|
|
36
|
+
readonly code: number;
|
|
37
|
+
readonly data?: unknown | undefined;
|
|
38
|
+
constructor(code: number, message: string, data?: unknown | undefined);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Generic JSON-RPC 2.0 protocol helper.
|
|
42
|
+
*/
|
|
43
|
+
export declare class JsonRpcProtocol extends Disposable {
|
|
44
|
+
private readonly _send;
|
|
45
|
+
private readonly _handlers;
|
|
46
|
+
private static readonly ParseError;
|
|
47
|
+
private static readonly MethodNotFound;
|
|
48
|
+
private static readonly InternalError;
|
|
49
|
+
private _nextRequestId;
|
|
50
|
+
private readonly _pendingRequests;
|
|
51
|
+
constructor(_send: (message: JsonRpcMessage) => void, _handlers: IJsonRpcProtocolHandlers);
|
|
52
|
+
sendNotification(notification: Omit<IJsonRpcNotification, "jsonrpc">): void;
|
|
53
|
+
sendRequest<T = unknown>(request: Omit<IJsonRpcRequest, "jsonrpc" | "id">, token?: CancellationToken, onCancel?: (id: JsonRpcId) => void): Promise<T>;
|
|
54
|
+
handleMessage(message: JsonRpcMessage | JsonRpcMessage[]): Promise<void>;
|
|
55
|
+
cancelPendingRequest(id: JsonRpcId): void;
|
|
56
|
+
cancelAllRequests(): void;
|
|
57
|
+
private _handleMessage;
|
|
58
|
+
private _handleResult;
|
|
59
|
+
private _handleError;
|
|
60
|
+
private _handleRequest;
|
|
61
|
+
dispose(): void;
|
|
62
|
+
static createParseError(message: string, data?: unknown): IJsonRpcErrorResponse;
|
|
63
|
+
}
|
|
64
|
+
export declare function isJsonRpcRequest(message: JsonRpcMessage): message is IJsonRpcRequest;
|
|
65
|
+
export declare function isJsonRpcResponse(message: JsonRpcMessage): message is IJsonRpcSuccessResponse | IJsonRpcErrorResponse;
|
|
66
|
+
export declare function isJsonRpcNotification(message: JsonRpcMessage): message is IJsonRpcNotification;
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
|
|
2
|
+
import { DeferredPromise } from '@codingame/monaco-vscode-api/vscode/vs/base/common/async';
|
|
3
|
+
import { CancellationToken, CancellationTokenSource } from '@codingame/monaco-vscode-api/vscode/vs/base/common/cancellation';
|
|
4
|
+
import { CancellationError } from '@codingame/monaco-vscode-api/vscode/vs/base/common/errors';
|
|
5
|
+
import { Disposable, toDisposable } from '@codingame/monaco-vscode-api/vscode/vs/base/common/lifecycle';
|
|
6
|
+
import { hasKey } from '@codingame/monaco-vscode-api/vscode/vs/base/common/types';
|
|
7
|
+
|
|
8
|
+
class JsonRpcError extends Error {
|
|
9
|
+
constructor(code, message, data) {
|
|
10
|
+
super(message);
|
|
11
|
+
this.code = code;
|
|
12
|
+
this.data = data;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
class JsonRpcProtocol extends Disposable {
|
|
16
|
+
static {
|
|
17
|
+
this.ParseError = -32700;
|
|
18
|
+
}
|
|
19
|
+
static {
|
|
20
|
+
this.MethodNotFound = -32601;
|
|
21
|
+
}
|
|
22
|
+
static {
|
|
23
|
+
this.InternalError = -32603;
|
|
24
|
+
}
|
|
25
|
+
constructor(_send, _handlers) {
|
|
26
|
+
super();
|
|
27
|
+
this._send = _send;
|
|
28
|
+
this._handlers = _handlers;
|
|
29
|
+
this._nextRequestId = 1;
|
|
30
|
+
this._pendingRequests = ( new Map());
|
|
31
|
+
}
|
|
32
|
+
sendNotification(notification) {
|
|
33
|
+
this._send({
|
|
34
|
+
jsonrpc: "2.0",
|
|
35
|
+
...notification
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
sendRequest(request, token = CancellationToken.None, onCancel) {
|
|
39
|
+
if (this._store.isDisposed) {
|
|
40
|
+
return Promise.reject(( new CancellationError()));
|
|
41
|
+
}
|
|
42
|
+
const id = this._nextRequestId++;
|
|
43
|
+
const promise = ( new DeferredPromise());
|
|
44
|
+
const cts = ( new CancellationTokenSource());
|
|
45
|
+
this._pendingRequests.set(id, {
|
|
46
|
+
promise,
|
|
47
|
+
cts
|
|
48
|
+
});
|
|
49
|
+
const cancelListener = token.onCancellationRequested(() => {
|
|
50
|
+
if (!promise.isSettled) {
|
|
51
|
+
this._pendingRequests.delete(id);
|
|
52
|
+
cts.cancel();
|
|
53
|
+
onCancel?.(id);
|
|
54
|
+
promise.cancel();
|
|
55
|
+
}
|
|
56
|
+
cancelListener.dispose();
|
|
57
|
+
});
|
|
58
|
+
this._send({
|
|
59
|
+
jsonrpc: "2.0",
|
|
60
|
+
id,
|
|
61
|
+
...request
|
|
62
|
+
});
|
|
63
|
+
return promise.p.finally(() => {
|
|
64
|
+
cancelListener.dispose();
|
|
65
|
+
this._pendingRequests.delete(id);
|
|
66
|
+
cts.dispose(true);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
async handleMessage(message) {
|
|
70
|
+
if (Array.isArray(message)) {
|
|
71
|
+
for (const single of message) {
|
|
72
|
+
await this._handleMessage(single);
|
|
73
|
+
}
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
await this._handleMessage(message);
|
|
77
|
+
}
|
|
78
|
+
cancelPendingRequest(id) {
|
|
79
|
+
const request = this._pendingRequests.get(id);
|
|
80
|
+
if (request) {
|
|
81
|
+
this._pendingRequests.delete(id);
|
|
82
|
+
request.cts.cancel();
|
|
83
|
+
request.promise.cancel();
|
|
84
|
+
request.cts.dispose(true);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
cancelAllRequests() {
|
|
88
|
+
for (const [id, pending] of this._pendingRequests) {
|
|
89
|
+
this._pendingRequests.delete(id);
|
|
90
|
+
pending.cts.cancel();
|
|
91
|
+
pending.promise.cancel();
|
|
92
|
+
pending.cts.dispose(true);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async _handleMessage(message) {
|
|
96
|
+
if (isJsonRpcResponse(message)) {
|
|
97
|
+
if (hasKey(message, {
|
|
98
|
+
result: true
|
|
99
|
+
})) {
|
|
100
|
+
this._handleResult(message);
|
|
101
|
+
} else {
|
|
102
|
+
this._handleError(message);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (isJsonRpcRequest(message)) {
|
|
106
|
+
await this._handleRequest(message);
|
|
107
|
+
}
|
|
108
|
+
if (isJsonRpcNotification(message)) {
|
|
109
|
+
this._handlers.handleNotification?.(message);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
_handleResult(response) {
|
|
113
|
+
const request = this._pendingRequests.get(response.id);
|
|
114
|
+
if (request) {
|
|
115
|
+
this._pendingRequests.delete(response.id);
|
|
116
|
+
request.promise.complete(response.result);
|
|
117
|
+
request.cts.dispose(true);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
_handleError(response) {
|
|
121
|
+
if (response.id === undefined) {
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const request = this._pendingRequests.get(response.id);
|
|
125
|
+
if (request) {
|
|
126
|
+
this._pendingRequests.delete(response.id);
|
|
127
|
+
request.promise.error(( new JsonRpcError(response.error.code, response.error.message, response.error.data)));
|
|
128
|
+
request.cts.dispose(true);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
async _handleRequest(request) {
|
|
132
|
+
if (!this._handlers.handleRequest) {
|
|
133
|
+
this._send({
|
|
134
|
+
jsonrpc: "2.0",
|
|
135
|
+
id: request.id,
|
|
136
|
+
error: {
|
|
137
|
+
code: JsonRpcProtocol.MethodNotFound,
|
|
138
|
+
message: `Method not found: ${request.method}`
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const cts = ( new CancellationTokenSource());
|
|
144
|
+
this._register(toDisposable(() => cts.dispose(true)));
|
|
145
|
+
try {
|
|
146
|
+
const resultOrThenable = this._handlers.handleRequest(request, cts.token);
|
|
147
|
+
const result = isThenable(resultOrThenable) ? await resultOrThenable : resultOrThenable;
|
|
148
|
+
this._send({
|
|
149
|
+
jsonrpc: "2.0",
|
|
150
|
+
id: request.id,
|
|
151
|
+
result
|
|
152
|
+
});
|
|
153
|
+
} catch (error) {
|
|
154
|
+
if (error instanceof JsonRpcError) {
|
|
155
|
+
this._send({
|
|
156
|
+
jsonrpc: "2.0",
|
|
157
|
+
id: request.id,
|
|
158
|
+
error: {
|
|
159
|
+
code: error.code,
|
|
160
|
+
message: error.message,
|
|
161
|
+
data: error.data
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
} else {
|
|
165
|
+
this._send({
|
|
166
|
+
jsonrpc: "2.0",
|
|
167
|
+
id: request.id,
|
|
168
|
+
error: {
|
|
169
|
+
code: JsonRpcProtocol.InternalError,
|
|
170
|
+
message: error instanceof Error ? error.message : "Internal error"
|
|
171
|
+
}
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
} finally {
|
|
175
|
+
cts.dispose(true);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
dispose() {
|
|
179
|
+
this.cancelAllRequests();
|
|
180
|
+
super.dispose();
|
|
181
|
+
}
|
|
182
|
+
static createParseError(message, data) {
|
|
183
|
+
return {
|
|
184
|
+
jsonrpc: "2.0",
|
|
185
|
+
error: {
|
|
186
|
+
code: JsonRpcProtocol.ParseError,
|
|
187
|
+
message,
|
|
188
|
+
data
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
function isJsonRpcRequest(message) {
|
|
194
|
+
return "method" in message && "id" in message && (typeof message.id === "string" || typeof message.id === "number");
|
|
195
|
+
}
|
|
196
|
+
function isJsonRpcResponse(message) {
|
|
197
|
+
return hasKey(message, {
|
|
198
|
+
id: true,
|
|
199
|
+
result: true
|
|
200
|
+
}) || hasKey(message, {
|
|
201
|
+
id: true,
|
|
202
|
+
error: true
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
function isJsonRpcNotification(message) {
|
|
206
|
+
return hasKey(message, {
|
|
207
|
+
method: true
|
|
208
|
+
}) && !hasKey(message, {
|
|
209
|
+
id: true
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
function isThenable(value) {
|
|
213
|
+
return typeof value === "object" && value !== null && "then" in value && typeof value.then === "function";
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
export { JsonRpcError, JsonRpcProtocol, isJsonRpcNotification, isJsonRpcRequest, isJsonRpcResponse };
|
|
@@ -27,7 +27,7 @@ let AllowedMcpServersService = class AllowedMcpServersService extends Disposable
|
|
|
27
27
|
query: `@id:${mcpAccessConfig}`
|
|
28
28
|
}).toString());
|
|
29
29
|
return (new MarkdownString(localize(
|
|
30
|
-
|
|
30
|
+
2035,
|
|
31
31
|
"Model Context Protocol servers are disabled in the Editor. Please check your [settings]({0}).",
|
|
32
32
|
settingsCommandLink
|
|
33
33
|
)));
|
|
@@ -456,7 +456,7 @@ let McpGalleryService = class McpGalleryService extends Disposable {
|
|
|
456
456
|
async getReadme(gallery, token) {
|
|
457
457
|
const readmeUrl = gallery.readmeUrl;
|
|
458
458
|
if (!readmeUrl) {
|
|
459
|
-
return Promise.resolve(( localize(
|
|
459
|
+
return Promise.resolve(( localize(2036, "No README available")));
|
|
460
460
|
}
|
|
461
461
|
const uri = ( URI.parse(readmeUrl));
|
|
462
462
|
if (uri.scheme === Schemas.file) {
|
|
@@ -468,7 +468,7 @@ let McpGalleryService = class McpGalleryService extends Disposable {
|
|
|
468
468
|
}
|
|
469
469
|
}
|
|
470
470
|
if (uri.authority !== "raw.githubusercontent.com") {
|
|
471
|
-
return ( new MarkdownString(( localize(
|
|
471
|
+
return ( new MarkdownString(( localize(2037, "You can find information about this server [here]({0})", readmeUrl)))).value;
|
|
472
472
|
}
|
|
473
473
|
const context = await this.requestService.request({
|
|
474
474
|
type: "GET",
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { Event } from "@codingame/monaco-vscode-api/vscode/vs/base/common/event";
|
|
2
|
+
import { URI } from "@codingame/monaco-vscode-api/vscode/vs/base/common/uri";
|
|
3
|
+
import { MCP } from "@codingame/monaco-vscode-api/vscode/vs/platform/mcp/common/modelContextProtocol";
|
|
4
|
+
export declare const McpGatewayChannelName = "mcpGateway";
|
|
5
|
+
export declare const McpGatewayToolBrokerChannelName = "mcpGatewayToolBroker";
|
|
6
|
+
export interface IGatewayCallToolResult {
|
|
7
|
+
result: MCP.CallToolResult;
|
|
8
|
+
serverIndex: number;
|
|
9
|
+
}
|
|
10
|
+
export interface IGatewayServerResources {
|
|
11
|
+
serverIndex: number;
|
|
12
|
+
resources: readonly MCP.Resource[];
|
|
13
|
+
}
|
|
14
|
+
export interface IGatewayServerResourceTemplates {
|
|
15
|
+
serverIndex: number;
|
|
16
|
+
resourceTemplates: readonly MCP.ResourceTemplate[];
|
|
17
|
+
}
|
|
18
|
+
export interface IMcpGatewayToolInvoker {
|
|
19
|
+
readonly onDidChangeTools: Event<void>;
|
|
20
|
+
readonly onDidChangeResources: Event<void>;
|
|
21
|
+
listTools(): Promise<readonly MCP.Tool[]>;
|
|
22
|
+
callTool(name: string, args: Record<string, unknown>): Promise<IGatewayCallToolResult>;
|
|
23
|
+
listResources(): Promise<readonly IGatewayServerResources[]>;
|
|
24
|
+
readResource(serverIndex: number, uri: string): Promise<MCP.ReadResourceResult>;
|
|
25
|
+
listResourceTemplates(): Promise<readonly IGatewayServerResourceTemplates[]>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Result of creating an MCP gateway.
|
|
29
|
+
*/
|
|
30
|
+
export interface IMcpGatewayInfo {
|
|
31
|
+
/**
|
|
32
|
+
* The address of the HTTP endpoint for this gateway.
|
|
33
|
+
*/
|
|
34
|
+
readonly address: URI;
|
|
35
|
+
/**
|
|
36
|
+
* The unique identifier for this gateway, used for disposal.
|
|
37
|
+
*/
|
|
38
|
+
readonly gatewayId: string;
|
|
39
|
+
}
|
|
@@ -6,11 +6,12 @@ import { ConfigurationTarget } from "@codingame/monaco-vscode-api/vscode/vs/plat
|
|
|
6
6
|
import { IFileService } from "@codingame/monaco-vscode-api/vscode/vs/platform/files/common/files.service";
|
|
7
7
|
import { IUriIdentityService } from "@codingame/monaco-vscode-api/vscode/vs/platform/uriIdentity/common/uriIdentity.service";
|
|
8
8
|
import { IInstallableMcpServer } from "@codingame/monaco-vscode-api/vscode/vs/platform/mcp/common/mcpManagement";
|
|
9
|
-
import { IMcpServerConfiguration, IMcpServerVariable } from "@codingame/monaco-vscode-api/vscode/vs/platform/mcp/common/mcpPlatformTypes";
|
|
9
|
+
import { IMcpSandboxConfiguration, IMcpServerConfiguration, IMcpServerVariable } from "@codingame/monaco-vscode-api/vscode/vs/platform/mcp/common/mcpPlatformTypes";
|
|
10
10
|
import { IMcpResourceScannerService } from "@codingame/monaco-vscode-api/vscode/vs/platform/mcp/common/mcpResourceScannerService.service";
|
|
11
11
|
export interface IScannedMcpServers {
|
|
12
12
|
servers?: IStringDictionary<Mutable<IMcpServerConfiguration>>;
|
|
13
13
|
inputs?: IMcpServerVariable[];
|
|
14
|
+
sandbox?: IMcpSandboxConfiguration;
|
|
14
15
|
}
|
|
15
16
|
export type McpResourceTarget = ConfigurationTarget.USER | ConfigurationTarget.WORKSPACE | ConfigurationTarget.WORKSPACE_FOLDER;
|
|
16
17
|
export declare class McpResourceScannerService extends Disposable implements IMcpResourceScannerService {
|
|
@@ -21,6 +22,7 @@ export declare class McpResourceScannerService extends Disposable implements IMc
|
|
|
21
22
|
constructor(fileService: IFileService, uriIdentityService: IUriIdentityService);
|
|
22
23
|
scanMcpServers(mcpResource: URI, target?: McpResourceTarget): Promise<IScannedMcpServers>;
|
|
23
24
|
addMcpServers(servers: IInstallableMcpServer[], mcpResource: URI, target?: McpResourceTarget): Promise<void>;
|
|
25
|
+
updateSandboxConfig(updateFn: (data: IScannedMcpServers) => IScannedMcpServers, mcpResource: URI, target?: McpResourceTarget): Promise<void>;
|
|
24
26
|
removeMcpServers(serverNames: string[], mcpResource: URI, target?: McpResourceTarget): Promise<void>;
|
|
25
27
|
private withProfileMcpServers;
|
|
26
28
|
private writeScannedMcpServers;
|
|
@@ -42,10 +42,14 @@ let McpResourceScannerService = class McpResourceScannerService extends Disposab
|
|
|
42
42
|
}
|
|
43
43
|
return {
|
|
44
44
|
servers: existingServers,
|
|
45
|
-
inputs: updatedInputs
|
|
45
|
+
inputs: updatedInputs,
|
|
46
|
+
sandbox: scannedMcpServers.sandbox
|
|
46
47
|
};
|
|
47
48
|
});
|
|
48
49
|
}
|
|
50
|
+
async updateSandboxConfig(updateFn, mcpResource, target) {
|
|
51
|
+
await this.withProfileMcpServers(mcpResource, target, updateFn);
|
|
52
|
+
}
|
|
49
53
|
async removeMcpServers(serverNames, mcpResource, target) {
|
|
50
54
|
await this.withProfileMcpServers(mcpResource, target, scannedMcpServers => {
|
|
51
55
|
for (const serverName of serverNames) {
|
|
@@ -101,7 +105,7 @@ let McpResourceScannerService = class McpResourceScannerService extends Disposab
|
|
|
101
105
|
});
|
|
102
106
|
}
|
|
103
107
|
async writeScannedMcpServers(mcpResource, scannedMcpServers) {
|
|
104
|
-
if ((scannedMcpServers.servers && ( Object.keys(scannedMcpServers.servers)).length > 0) || (scannedMcpServers.inputs && scannedMcpServers.inputs.length > 0)) {
|
|
108
|
+
if ((scannedMcpServers.servers && ( Object.keys(scannedMcpServers.servers)).length > 0) || (scannedMcpServers.inputs && scannedMcpServers.inputs.length > 0) || scannedMcpServers.sandbox !== undefined) {
|
|
105
109
|
await this.fileService.writeFile(
|
|
106
110
|
mcpResource,
|
|
107
111
|
VSBuffer.fromString(JSON.stringify(scannedMcpServers, null, "\t"))
|
|
@@ -147,7 +151,8 @@ let McpResourceScannerService = class McpResourceScannerService extends Disposab
|
|
|
147
151
|
}
|
|
148
152
|
fromUserMcpServers(scannedMcpServers) {
|
|
149
153
|
const userMcpServers = {
|
|
150
|
-
inputs: scannedMcpServers.inputs
|
|
154
|
+
inputs: scannedMcpServers.inputs,
|
|
155
|
+
sandbox: scannedMcpServers.sandbox
|
|
151
156
|
};
|
|
152
157
|
const servers = Object.entries(scannedMcpServers.servers ?? {});
|
|
153
158
|
if (servers.length > 0) {
|
|
@@ -160,13 +165,15 @@ let McpResourceScannerService = class McpResourceScannerService extends Disposab
|
|
|
160
165
|
}
|
|
161
166
|
fromWorkspaceFolderMcpServers(scannedWorkspaceFolderMcpServers) {
|
|
162
167
|
const scannedMcpServers = {
|
|
163
|
-
inputs: scannedWorkspaceFolderMcpServers.inputs
|
|
168
|
+
inputs: scannedWorkspaceFolderMcpServers.inputs,
|
|
169
|
+
sandbox: scannedWorkspaceFolderMcpServers.sandbox
|
|
164
170
|
};
|
|
165
171
|
const servers = Object.entries(scannedWorkspaceFolderMcpServers.servers ?? {});
|
|
166
172
|
if (servers.length > 0) {
|
|
167
173
|
scannedMcpServers.servers = {};
|
|
168
174
|
for (const [serverName, config] of servers) {
|
|
169
|
-
|
|
175
|
+
const serverConfig = this.sanitizeServer(config);
|
|
176
|
+
scannedMcpServers.servers[serverName] = serverConfig;
|
|
170
177
|
}
|
|
171
178
|
}
|
|
172
179
|
return scannedMcpServers;
|
|
@@ -17,6 +17,7 @@ import { ExtensionMcpDiscovery } from '../common/discovery/extensionMcpDiscovery
|
|
|
17
17
|
import { InstalledMcpServersDiscovery } from '../common/discovery/installedMcpServersDiscovery.js';
|
|
18
18
|
import { mcpDiscoveryRegistry } from '../common/discovery/mcpDiscovery.js';
|
|
19
19
|
import { RemoteNativeMpcDiscovery } from '../common/discovery/nativeMcpRemoteDiscovery.js';
|
|
20
|
+
import { PluginMcpDiscovery } from '../common/discovery/pluginMcpDiscovery.js';
|
|
20
21
|
import { CursorWorkspaceMcpDiscoveryAdapter } from '../common/discovery/workspaceMcpDiscoveryAdapter.js';
|
|
21
22
|
import { McpCommandIds } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/mcp/common/mcpCommandIds';
|
|
22
23
|
import { mcpServerSchema } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/mcp/common/mcpConfiguration';
|
|
@@ -25,9 +26,12 @@ import '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/mcp/common/mcpD
|
|
|
25
26
|
import '@codingame/monaco-vscode-api/vscode/vs/platform/instantiation/common/instantiation';
|
|
26
27
|
import { McpLanguageModelToolContribution } from '../common/mcpLanguageModelToolContribution.js';
|
|
27
28
|
import '../common/mcpRegistry.js';
|
|
29
|
+
import '../common/mcpSandboxService.js';
|
|
28
30
|
import { McpResourceFilesystem } from '../common/mcpResourceFilesystem.js';
|
|
29
31
|
import '../common/mcpSamplingService.js';
|
|
30
32
|
import '../common/mcpService.js';
|
|
33
|
+
import './mcpGatewayService.js';
|
|
34
|
+
import { McpGatewayToolBrokerContribution } from './mcpGatewayToolBrokerContribution.js';
|
|
31
35
|
import { McpAddContextContribution } from './mcpAddContextContribution.js';
|
|
32
36
|
import { ListMcpServerCommand, McpServerOptionsCommand, McpConfirmationServerOptionsCommand, ResetMcpTrustCommand, ResetMcpCachedTools, AddConfigurationAction, InstallFromManifestAction, RemoveStoredInput, EditStoredInput, StartServer, StopServer, ShowOutput, RestartServer, ShowConfiguration, McpBrowseCommand, OpenUserMcpResourceCommand, OpenRemoteUserMcpResourceCommand, OpenWorkspaceMcpResourceCommand, OpenWorkspaceFolderMcpResourceCommand, ShowInstalledMcpServersCommand, McpBrowseResourcesCommand, McpConfigureSamplingModels, McpStartPromptingServerCommand, McpSkipCurrentAutostartCommand, MCPServerActionRendering } from './mcpCommands.js';
|
|
33
37
|
import { McpDiscovery } from './mcpDiscovery.js';
|
|
@@ -35,8 +39,8 @@ import './mcpElicitationService.js';
|
|
|
35
39
|
import { McpLanguageFeatures } from './mcpLanguageFeatures.js';
|
|
36
40
|
import { McpConfigMigrationContribution } from './mcpMigration.js';
|
|
37
41
|
import { McpResourceQuickAccess } from './mcpResourceQuickAccess.js';
|
|
38
|
-
import { McpServerEditor } from '
|
|
39
|
-
import { McpServerEditorInput } from '
|
|
42
|
+
import { McpServerEditor } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/mcp/browser/mcpServerEditor';
|
|
43
|
+
import { McpServerEditorInput } from '@codingame/monaco-vscode-api/vscode/vs/workbench/contrib/mcp/browser/mcpServerEditorInput';
|
|
40
44
|
import { McpServersViewsContribution } from './mcpServersView.js';
|
|
41
45
|
import { MCPContextsInitialisation } from './mcpWorkbenchService.js';
|
|
42
46
|
|
|
@@ -44,6 +48,7 @@ mcpDiscoveryRegistry.register(( new SyncDescriptor(RemoteNativeMpcDiscovery)));
|
|
|
44
48
|
mcpDiscoveryRegistry.register(( new SyncDescriptor(InstalledMcpServersDiscovery)));
|
|
45
49
|
mcpDiscoveryRegistry.register(( new SyncDescriptor(ExtensionMcpDiscovery)));
|
|
46
50
|
mcpDiscoveryRegistry.register(( new SyncDescriptor(CursorWorkspaceMcpDiscoveryAdapter)));
|
|
51
|
+
mcpDiscoveryRegistry.register(( new SyncDescriptor(PluginMcpDiscovery)));
|
|
47
52
|
registerWorkbenchContribution2("mcpDiscovery", McpDiscovery, WorkbenchPhase.AfterRestored);
|
|
48
53
|
registerWorkbenchContribution2("mcpContextKeys", McpContextKeysController, WorkbenchPhase.BlockRestore);
|
|
49
54
|
registerWorkbenchContribution2("mcpLanguageFeatures", McpLanguageFeatures, WorkbenchPhase.Eventually);
|
|
@@ -57,6 +62,11 @@ registerWorkbenchContribution2(
|
|
|
57
62
|
McpLanguageModelToolContribution,
|
|
58
63
|
WorkbenchPhase.AfterRestored
|
|
59
64
|
);
|
|
65
|
+
registerWorkbenchContribution2(
|
|
66
|
+
"mcpGatewayToolBrokerRemote",
|
|
67
|
+
McpGatewayToolBrokerContribution,
|
|
68
|
+
WorkbenchPhase.AfterRestored
|
|
69
|
+
);
|
|
60
70
|
registerAction2(ListMcpServerCommand);
|
|
61
71
|
registerAction2(McpServerOptionsCommand);
|
|
62
72
|
registerAction2(McpConfirmationServerOptionsCommand);
|
|
@@ -105,16 +115,16 @@ registerWorkbenchContribution2(
|
|
|
105
115
|
const jsonRegistry = ( Registry.as(Extensions.JSONContribution));
|
|
106
116
|
jsonRegistry.registerSchema(mcpSchemaId, mcpServerSchema);
|
|
107
117
|
( Registry.as(EditorExtensions.EditorPane)).registerEditorPane(
|
|
108
|
-
EditorPaneDescriptor.create(McpServerEditor, McpServerEditor.ID, ( localize(
|
|
118
|
+
EditorPaneDescriptor.create(McpServerEditor, McpServerEditor.ID, ( localize(10094, "MCP Server"))),
|
|
109
119
|
[( new SyncDescriptor(McpServerEditorInput))]
|
|
110
120
|
);
|
|
111
121
|
( Registry.as(Extensions$1.Quickaccess)).registerQuickAccessProvider({
|
|
112
122
|
ctor: McpResourceQuickAccess,
|
|
113
123
|
prefix: McpResourceQuickAccess.PREFIX,
|
|
114
124
|
when: ChatContextKeys.enabled,
|
|
115
|
-
placeholder: ( localize(
|
|
125
|
+
placeholder: ( localize(10095, "Filter to an MCP resource")),
|
|
116
126
|
helpEntries: [{
|
|
117
|
-
description: ( localize(
|
|
127
|
+
description: ( localize(10096, "MCP Server Resources")),
|
|
118
128
|
commandId: McpCommandIds.AddConfiguration
|
|
119
129
|
}]
|
|
120
130
|
});
|
|
@@ -43,7 +43,7 @@ let McpAddContextContribution = class McpAddContextContribution extends Disposab
|
|
|
43
43
|
_registerAddContextMenu() {
|
|
44
44
|
this._addContextMenu.value = this._chatContextPickService.registerChatContextItem({
|
|
45
45
|
type: "pickerPick",
|
|
46
|
-
label: ( localize(
|
|
46
|
+
label: ( localize(10097, "MCP Resources...")),
|
|
47
47
|
icon: Codicon.mcp,
|
|
48
48
|
isEnabled(widget) {
|
|
49
49
|
return !!widget.attachmentCapabilities.supportsMCPAttachments;
|
|
@@ -51,7 +51,7 @@ let McpAddContextContribution = class McpAddContextContribution extends Disposab
|
|
|
51
51
|
asPicker: () => {
|
|
52
52
|
const helper = this._instantiationService.createInstance(McpResourcePickHelper);
|
|
53
53
|
return {
|
|
54
|
-
placeholder: ( localize(
|
|
54
|
+
placeholder: ( localize(10098, "Select MCP Resource...")),
|
|
55
55
|
picks: (_query, token) => this._getResourcePicks(token, helper),
|
|
56
56
|
goBack: () => {
|
|
57
57
|
return helper.navigateBack();
|