|
4 | 4 | *--------------------------------------------------------------------------------------------*/
|
5 | 5 |
|
6 | 6 | import { equals } from '../../../../base/common/arrays.js';
|
| 7 | +import { assertNever } from '../../../../base/common/assert.js'; |
7 | 8 | import { DeferredPromise, IntervalTimer } from '../../../../base/common/async.js';
|
8 | 9 | import { CancellationToken } from '../../../../base/common/cancellation.js';
|
9 | 10 | import { CancellationError } from '../../../../base/common/errors.js';
|
@@ -122,6 +123,7 @@ export class McpServerRequestHandler extends Disposable {
|
122 | 123 | }, token);
|
123 | 124 |
|
124 | 125 | mcp._serverInit = initialized;
|
| 126 | + mcp._sendLogLevelToServer(opts.logger.getLevel()); |
125 | 127 |
|
126 | 128 | mcp.sendNotification<MCP.InitializedNotification>({
|
127 | 129 | method: 'notifications/initialized'
|
@@ -166,6 +168,11 @@ export class McpServerRequestHandler extends Disposable {
|
166 | 168 | this.cancelAllRequests();
|
167 | 169 | }
|
168 | 170 | }));
|
| 171 | + |
| 172 | + // Listen for log level changes and forward them to the MCP server |
| 173 | + this._register(logger.onDidChangeLogLevel((logLevel) => { |
| 174 | + this._sendLogLevelToServer(logLevel); |
| 175 | + })); |
169 | 176 | }
|
170 | 177 |
|
171 | 178 | /**
|
@@ -440,6 +447,22 @@ export class McpServerRequestHandler extends Disposable {
|
440 | 447 | super.dispose();
|
441 | 448 | }
|
442 | 449 |
|
| 450 | + /** |
| 451 | + * Forwards log level changes to the MCP server if it supports logging |
| 452 | + */ |
| 453 | + private async _sendLogLevelToServer(logLevel: LogLevel): Promise<void> { |
| 454 | + try { |
| 455 | + // Only send if the server supports logging capabilities |
| 456 | + if (!this.capabilities.logging) { |
| 457 | + return; |
| 458 | + } |
| 459 | + |
| 460 | + await this.setLevel({ level: mapLogLevelToMcp(logLevel) }); |
| 461 | + } catch (error) { |
| 462 | + this.logger.error(`Failed to set MCP server log level: ${error}`); |
| 463 | + } |
| 464 | + } |
| 465 | + |
443 | 466 | /**
|
444 | 467 | * Send an initialize request
|
445 | 468 | */
|
@@ -531,3 +554,26 @@ export class McpServerRequestHandler extends Disposable {
|
531 | 554 | return this.sendRequest<MCP.CompleteRequest, MCP.CompleteResult>({ method: 'completion/complete', params }, token);
|
532 | 555 | }
|
533 | 556 | }
|
| 557 | + |
| 558 | + |
| 559 | +/** |
| 560 | + * Maps VSCode LogLevel to MCP LoggingLevel |
| 561 | + */ |
| 562 | +function mapLogLevelToMcp(logLevel: LogLevel): MCP.LoggingLevel { |
| 563 | + switch (logLevel) { |
| 564 | + case LogLevel.Trace: |
| 565 | + return 'debug'; // MCP doesn't have trace, use debug |
| 566 | + case LogLevel.Debug: |
| 567 | + return 'debug'; |
| 568 | + case LogLevel.Info: |
| 569 | + return 'info'; |
| 570 | + case LogLevel.Warning: |
| 571 | + return 'warning'; |
| 572 | + case LogLevel.Error: |
| 573 | + return 'error'; |
| 574 | + case LogLevel.Off: |
| 575 | + return 'emergency'; // MCP doesn't have off, use emergency |
| 576 | + default: |
| 577 | + return assertNever(logLevel); // Off and other levels are not supported |
| 578 | + } |
| 579 | +} |
0 commit comments