import type { Tool } from '@modelcontextprotocol/sdk/types.js';
import { LintingUtils } from '../utils/linting-utils.js';
import { Formatters } from '../utils/formatters.js';
import { FileReader } from '../utils/file-reader.js';
export const lintingTools: Tool[] = [
{
name: 'lint_code',
description: 'Lint code files using ESLint',
inputSchema: {
type: 'object',
properties: {
files: {
type: 'array',
items: { type: 'string' },
description: 'File paths to lint',
},
},
required: ['files'],
},
},
{
name: 'format_code',
description: 'Format code files using Prettier',
inputSchema: {
type: 'object',
properties: {
files: {
type: 'array',
items: { type: 'string' },
description: 'File paths to format',
},
options: {
type: 'object',
description: 'Prettier options',
},
},
required: ['files'],
},
},
{
name: 'check_typescript',
description: 'Check TypeScript files for type errors',
inputSchema: {
type: 'object',
properties: {
files: {
type: 'array',
items: { type: 'string' },
description: 'TypeScript file paths to check',
},
},
required: ['files'],
},
},
{
name: 'validate_syntax',
description: 'Validate syntax of code files',
inputSchema: {
type: 'object',
properties: {
files: {
type: 'array',
items: { type: 'string' },
description: 'File paths to validate',
},
},
required: ['files'],
},
},
{
name: 'fix_lint_issues',
description: 'Automatically fix linting issues in code files',
inputSchema: {
type: 'object',
properties: {
files: {
type: 'array',
items: { type: 'string' },
description: 'File paths to fix',
},
},
required: ['files'],
},
},
];
export async function handleLintingTool(name: string, args: unknown): Promise<unknown> {
const lintingUtils = new LintingUtils();
const params = args as Record<string, unknown>;
switch (name) {
case 'lint_code': {
const files = params.files as string[];
const results = await lintingUtils.lintFiles(files);
return Formatters.formatLintResults(results);
}
case 'format_code': {
const files = params.files as string[];
const options = params.options as Record<string, unknown>;
const results = await Promise.all(
files.map((file) => lintingUtils.formatCode(file, options))
);
return results;
}
case 'check_typescript': {
const files = params.files as string[];
const results = await Promise.all(
files.map((file) => lintingUtils.checkTypeScript(file))
);
return results;
}
case 'validate_syntax': {
const files = params.files as string[];
const codeFiles = await FileReader.readFiles(files.join(','));
const results = codeFiles.map((file) => {
const validation = lintingUtils.validateSyntax(
file.content,
file.language || 'javascript'
);
return {
file: file.path,
...validation,
};
});
return results;
}
case 'fix_lint_issues': {
const files = params.files as string[];
const results = await lintingUtils.fixLintIssues(files);
return Formatters.formatLintResults(results);
}
default:
throw new Error(`Unknown tool: ${name}`);
}
}