@brianveltman/sonatype-mcp
Version:
Model Context Protocol server for Sonatype Nexus Repository Manager
147 lines • 7 kB
JavaScript
import { z } from 'zod';
import { validateInput } from '../../utils/validation.js';
import { formatMCPError } from '../../utils/errors.js';
import fs from 'fs/promises';
import path from 'path';
const supportZipSchema = z.object({
outputPath: z.string().optional().describe('Path where to save the support zip file (optional)'),
filename: z.string().optional().describe('Custom filename for the support zip (optional, defaults to supportzip-{timestamp}.zip)'),
systemInformation: z.boolean().optional().default(true).describe('Include system information'),
threadDump: z.boolean().optional().default(true).describe('Include thread dump'),
metrics: z.boolean().optional().default(true).describe('Include metrics'),
configuration: z.boolean().optional().default(true).describe('Include configuration (may contain sensitive data)'),
security: z.boolean().optional().default(false).describe('Include security information (contains sensitive data)'),
logFiles: z.boolean().optional().default(true).describe('Include log files'),
taskLogFiles: z.boolean().optional().default(false).describe('Include task log files'),
auditLogFiles: z.boolean().optional().default(false).describe('Include audit log files'),
jmx: z.boolean().optional().default(false).describe('Include JMX information')
});
export function createGenerateSupportZipTool(adminService) {
return {
name: 'nexus_generate_support_zip',
description: 'Generate and optionally save a support zip file containing diagnostic information for troubleshooting. The zip includes system info, logs, metrics, and configuration data.',
inputSchema: {
type: 'object',
properties: {
outputPath: {
type: 'string',
description: 'Directory path where to save the support zip file (optional)'
},
filename: {
type: 'string',
description: 'Custom filename for the support zip (optional, defaults to supportzip-{timestamp}.zip)'
},
systemInformation: {
type: 'boolean',
description: 'Include system information',
default: true
},
threadDump: {
type: 'boolean',
description: 'Include thread dump',
default: true
},
metrics: {
type: 'boolean',
description: 'Include metrics',
default: true
},
configuration: {
type: 'boolean',
description: 'Include configuration (may contain sensitive data)',
default: true
},
security: {
type: 'boolean',
description: 'Include security information (contains sensitive data)',
default: false
},
logFiles: {
type: 'boolean',
description: 'Include log files',
default: true
},
taskLogFiles: {
type: 'boolean',
description: 'Include task log files',
default: false
},
auditLogFiles: {
type: 'boolean',
description: 'Include audit log files',
default: false
},
jmx: {
type: 'boolean',
description: 'Include JMX information',
default: false
}
},
additionalProperties: false
},
handler: async (params) => {
try {
const validatedParams = validateInput(supportZipSchema, params);
const config = {
systemInformation: validatedParams.systemInformation,
threadDump: validatedParams.threadDump,
metrics: validatedParams.metrics,
configuration: validatedParams.configuration,
security: validatedParams.security,
logFiles: validatedParams.logFiles,
taskLogFiles: validatedParams.taskLogFiles,
auditLogFiles: validatedParams.auditLogFiles,
jmx: validatedParams.jmx
};
const zipBuffer = await adminService.generateSupportZip(config);
let savedPath = null;
if (validatedParams.outputPath) {
const filename = validatedParams.filename || `supportzip-${new Date().toISOString().replace(/[:.]/g, '-')}.zip`;
const fullPath = path.join(validatedParams.outputPath, filename);
await fs.mkdir(validatedParams.outputPath, { recursive: true });
await fs.writeFile(fullPath, zipBuffer);
savedPath = fullPath;
}
const result = {
success: true,
size: zipBuffer.length,
sizeFormatted: `${(zipBuffer.length / 1024 / 1024).toFixed(2)} MB`,
savedPath,
configuration: config,
timestamp: new Date().toISOString(),
message: savedPath
? `Support zip generated and saved to ${savedPath}`
: `Support zip generated successfully (${(zipBuffer.length / 1024 / 1024).toFixed(2)} MB)`
};
return {
content: [
{
type: 'text',
text: JSON.stringify(result, null, 2)
}
]
};
}
catch (error) {
const mcpError = formatMCPError(error);
let errorMessage = `Error generating support zip: ${mcpError.message}`;
if (mcpError.message.includes('Forbidden') || mcpError.message.includes('403')) {
errorMessage += '\n\nThe user may lack administrative privileges required to generate support zip files.';
}
else if (mcpError.message.includes('ENOENT') || mcpError.message.includes('EACCES')) {
errorMessage += '\n\nCheck that the output path exists and is writable.';
}
return {
content: [
{
type: 'text',
text: errorMessage
}
],
isError: true
};
}
}
};
}
//# sourceMappingURL=generate-support-zip.js.map