Skip to content

Commit 278880a

Browse files
authored
mcp: surface task statusMessage notifications in chat progress (#298369)
- When a tool call returns a CreateTaskResult, the MCP server now forwards task statusMessage from notifications/tasks/status into the chat progress stream via the ToolProgress callback - Adds onStatusMessage optional callback to McpTask constructor to report status messages as they come in from server notifications - Updates callTool method signature to accept onStatusMessage callback, passed from _callWithProgress in mcpServer.ts - This allows task-mode MCP tools to communicate progress through the established progress channel without requiring duplicate progress notifications Fixes #298013 (Commit message generated by Copilot)
1 parent 3cfe883 commit 278880a

File tree

2 files changed

+8
-4
lines changed

2 files changed

+8
-4
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1087,7 +1087,7 @@ export class McpTool implements IMcpTool {
10871087
arguments: params,
10881088
task: shouldUseTask ? {} : undefined,
10891089
_meta: meta,
1090-
}, token);
1090+
}, token, progress ? (message) => progress.report({ message }) : undefined);
10911091

10921092
// Wait for tools to refresh for dynamic servers (#261611)
10931093
await this._server.awaitToolRefresh();

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -514,11 +514,11 @@ export class McpServerRequestHandler extends Disposable {
514514
/**
515515
* Call a specific tool. Supports tasks automatically if `task` is set on the request.
516516
*/
517-
async callTool(params: MCP.CallToolRequest['params'] & MCP.Request['params'], token?: CancellationToken): Promise<MCP.CallToolResult> {
517+
async callTool(params: MCP.CallToolRequest['params'] & MCP.Request['params'], token?: CancellationToken, onStatusMessage?: (message: string) => void): Promise<MCP.CallToolResult> {
518518
const response = await this.sendRequest<MCP.CallToolRequest, MCP.CallToolResult | MCP.CreateTaskResult>({ method: 'tools/call', params }, token);
519519

520520
if (isTaskResult(response)) {
521-
const task = new McpTask<MCP.CallToolResult>(response.task, token);
521+
const task = new McpTask<MCP.CallToolResult>(response.task, token, onStatusMessage);
522522
this._taskManager.adoptClientTask(task);
523523
task.setHandler(this);
524524
return task.result.finally(() => {
@@ -603,7 +603,8 @@ export class McpTask<T extends MCP.Result> extends Disposable implements IMcpTas
603603

604604
constructor(
605605
private readonly _task: MCP.Task,
606-
_token: CancellationToken = CancellationToken.None
606+
_token: CancellationToken = CancellationToken.None,
607+
private readonly _onStatusMessage?: (message: string) => void,
607608
) {
608609
super();
609610

@@ -735,6 +736,9 @@ export class McpTask<T extends MCP.Result> extends Disposable implements IMcpTas
735736

736737
onDidUpdateState(task: MCP.Task) {
737738
this._lastTaskState.set(task, undefined);
739+
if (task.statusMessage && this._onStatusMessage) {
740+
this._onStatusMessage(task.statusMessage);
741+
}
738742
}
739743

740744
setHandler(handler: McpServerRequestHandler | undefined): void {

0 commit comments

Comments
 (0)