Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/copilot/src/extension/chatSessions/copilotcli/vscode-node/tools/getDiagnostics.ts
13406 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import * as vscode from 'vscode';
7
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
8
import { z } from 'zod';
9
import { makeTextResult } from './utils';
10
import { ILogger } from '../../../../../platform/log/common/logService';
11
12
export function registerGetDiagnosticsTool(server: McpServer, logger: ILogger): void {
13
const schema = {
14
uri: z.string().optional().describe('File URI to get diagnostics for. Optional. If not provided, returns diagnostics for all files.'),
15
};
16
server.registerTool(
17
'get_diagnostics',
18
{
19
description: 'Gets language diagnostics (errors, warnings, hints) from VS Code',
20
inputSchema: schema,
21
},
22
// @ts-ignore - TS2589: zod type instantiation too deep for server.tool() generics
23
async (args: { uri?: string }) => {
24
const { uri } = args;
25
logger.debug(`Getting diagnostics${uri ? ` for: ${uri}` : ' for all files'}`);
26
let diagnostics: [vscode.Uri, readonly vscode.Diagnostic[]][];
27
28
if (uri) {
29
const fileUri = vscode.Uri.parse(uri);
30
const fileDiagnostics = vscode.languages.getDiagnostics(fileUri);
31
diagnostics = [[fileUri, fileDiagnostics]];
32
} else {
33
diagnostics = vscode.languages.getDiagnostics();
34
}
35
36
const result = diagnostics.map(([fileUri, fileDiagnostics]) => ({
37
uri: fileUri.toString(),
38
filePath: fileUri.fsPath,
39
diagnostics: fileDiagnostics.map(d => ({
40
message: d.message,
41
severity: vscode.DiagnosticSeverity[d.severity].toLowerCase(),
42
range: {
43
start: { line: d.range.start.line, character: d.range.start.character },
44
end: { line: d.range.end.line, character: d.range.end.character },
45
},
46
source: d.source,
47
code: typeof d.code === 'object' ? d.code.value : d.code,
48
})),
49
})).filter(item => item.diagnostics.length > 0);
50
51
logger.trace(`Returning ${result.length} file(s) with diagnostics`);
52
return makeTextResult(result);
53
}
54
);
55
}
56
57