Skip to content

Commit 0bbc5c8

Browse files
authored
mcp: adopt finalized completions API, support resolved args for prompts too (microsoft#250909)
Refs microsoft#248418
1 parent af218df commit 0bbc5c8

File tree

5 files changed

+33
-21
lines changed

5 files changed

+33
-21
lines changed

src/vs/workbench/contrib/mcp/browser/mcpPromptArgumentPick.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ export class McpPromptArgumentPick extends Disposable {
8282
quickPick.activeItems = restore?.activeItems ?? [];
8383
quickPick.buttons = i > 0 ? [this._quickInputService.backButton] : [];
8484

85-
const value = await this._getArg(arg, !!restore, token);
85+
const value = await this._getArg(arg, !!restore, args, token);
8686
if (value.type === 'back') {
8787
i -= 2;
8888
} else if (value.type === 'cancel') {
@@ -102,15 +102,15 @@ export class McpPromptArgumentPick extends Disposable {
102102
return args;
103103
}
104104

105-
private async _getArg(arg: MCP.PromptArgument, didRestoreState: boolean, token?: CancellationToken): Promise<Action> {
105+
private async _getArg(arg: MCP.PromptArgument, didRestoreState: boolean, argsSoFar: Record<string, string | undefined>, token?: CancellationToken): Promise<Action> {
106106
const { quickPick } = this;
107107
const store = new DisposableStore();
108108

109109
const input$ = observableValue(this, quickPick.value);
110110
const asyncPicks = [
111111
{
112112
name: localize('mcp.arg.suggestions', 'Suggestions'),
113-
observer: this._promptCompletions(arg, input$),
113+
observer: this._promptCompletions(arg, input$, argsSoFar),
114114
},
115115
{
116116
name: localize('mcp.arg.files', 'Files'),
@@ -218,9 +218,16 @@ export class McpPromptArgumentPick extends Disposable {
218218
}
219219
}
220220

221-
private _promptCompletions(arg: MCP.PromptArgument, input: IObservable<string>) {
221+
private _promptCompletions(arg: MCP.PromptArgument, input: IObservable<string>, argsSoFar: Record<string, string | undefined>) {
222+
const alreadyResolved: Record<string, string> = {};
223+
for (const [key, value] of Object.entries(argsSoFar)) {
224+
if (value) {
225+
alreadyResolved[key] = value;
226+
}
227+
}
228+
222229
return this._asyncCompletions(input, async (i, t) => {
223-
const items = await this.prompt.complete(arg.name, i, t);
230+
const items = await this.prompt.complete(arg.name, i, alreadyResolved, t);
224231
return items.map((i): PickItem => ({ id: `suggest:${i}`, label: i, action: 'suggest' }));
225232
});
226233
}

src/vs/workbench/contrib/mcp/common/mcpServer.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -668,10 +668,11 @@ class McpPrompt implements IMcpPrompt {
668668
return result.messages;
669669
}
670670

671-
async complete(argument: string, prefix: string, token?: CancellationToken): Promise<string[]> {
671+
async complete(argument: string, prefix: string, alreadyResolved: Record<string, string>, token?: CancellationToken): Promise<string[]> {
672672
const result = await McpServer.callOn(this._server, h => h.complete({
673673
ref: { type: 'ref/prompt', name: this._definition.name },
674-
argument: { name: argument, value: prefix, }
674+
argument: { name: argument, value: prefix },
675+
context: { arguments: alreadyResolved },
675676
}, token), token);
676677
return result.completion.values;
677678
}
@@ -849,7 +850,9 @@ class McpResourceTemplate implements IMcpResourceTemplate {
849850
const result = await McpServer.callOn(this._server, h => h.complete({
850851
ref: { type: 'ref/resource', uri: this._definition.uriTemplate },
851852
argument: { name: templatePart, value: prefix },
852-
resolved: mapValues(alreadyResolved, v => Array.isArray(v) ? v.join('/') : v),
853+
context: {
854+
arguments: mapValues(alreadyResolved, v => Array.isArray(v) ? v.join('/') : v),
855+
},
853856
}, token), token);
854857
return result.completion.values;
855858
}

src/vs/workbench/contrib/mcp/common/mcpServerRequestHandler.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -521,7 +521,7 @@ export class McpServerRequestHandler extends Disposable {
521521
/**
522522
* Find completions for an argument
523523
*/
524-
complete(params: MCP.CompleteRequest2['params'], token?: CancellationToken): Promise<MCP.CompleteResult> {
525-
return this.sendRequest<MCP.CompleteRequest2, MCP.CompleteResult>({ method: 'completion/complete', params }, token);
524+
complete(params: MCP.CompleteRequest['params'], token?: CancellationToken): Promise<MCP.CompleteResult> {
525+
return this.sendRequest<MCP.CompleteRequest, MCP.CompleteResult>({ method: 'completion/complete', params }, token);
526526
}
527527
}

src/vs/workbench/contrib/mcp/common/mcpTypes.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ export interface IMcpPrompt {
330330
readonly arguments: readonly MCP.PromptArgument[];
331331

332332
/** Gets string completions for the given prompt part. */
333-
complete(argument: string, prefix: string, token: CancellationToken): Promise<string[]>;
333+
complete(argument: string, prefix: string, alreadyResolved: Record<string, string>, token: CancellationToken): Promise<string[]>;
334334

335335
resolve(args: Record<string, string | undefined>, token?: CancellationToken): Promise<IMcpPromptMessage[]>;
336336
}

src/vs/workbench/contrib/mcp/common/modelContextProtocol.ts

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,8 @@
1414
*/
1515
export namespace MCP {
1616

17-
// https://github.com/modelcontextprotocol/modelcontextprotocol/pull/598
18-
export interface CompleteRequest2 extends MCP.CompleteRequest {
19-
params: MCP.CompleteRequest['params'] & {
20-
/**
21-
* Previously-resolved variables in a URI template. The keys of the object
22-
* are be the template's variable expressions including surrounding braces.
23-
*/
24-
resolved?: { [key: string]: string };
25-
};
26-
}
17+
// Nothing, yet
18+
2719
}
2820

2921
//#endregion
@@ -1144,6 +1136,16 @@ export namespace MCP {
11441136
*/
11451137
value: string;
11461138
};
1139+
1140+
/**
1141+
* Additional, optional context for completions
1142+
*/
1143+
context?: {
1144+
/**
1145+
* Previously-resolved variables in a URI template or prompt.
1146+
*/
1147+
arguments?: { [key: string]: string };
1148+
};
11471149
};
11481150
}
11491151

0 commit comments

Comments
 (0)