UNPKG

@brianveltman/sonatype-mcp

Version:

Model Context Protocol server for Sonatype Nexus Repository Manager

79 lines 3.28 kB
import { z } from 'zod'; import FormData from 'form-data'; import fs from 'fs/promises'; import path from 'path'; import { validateInput } from '../../utils/validation.js'; import { formatMCPError } from '../../utils/errors.js'; const uploadAssetSchema = z.object({ repository: z.string().describe('The repository to upload to'), directory: z.string().describe('Directory path in the repository'), file: z.string().describe('Path to the file to upload'), filename: z.string().optional().describe('Filename to use in the repository (defaults to original filename)') }); export function createUploadAssetTool(componentService) { return { name: 'nexus_upload_asset', description: 'Upload an asset directly to a raw repository', inputSchema: { type: 'object', properties: { repository: { type: 'string', description: 'The repository to upload to' }, directory: { type: 'string', description: 'Directory path in the repository' }, file: { type: 'string', description: 'Path to the file to upload' }, filename: { type: 'string', description: 'Filename to use in the repository (defaults to original filename)' } }, required: ['repository', 'directory', 'file'] }, handler: async (params) => { try { const validParams = validateInput(uploadAssetSchema, params); try { await fs.access(validParams.file); } catch { throw new Error(`File not found: ${validParams.file}`); } const form = new FormData(); const fileBuffer = await fs.readFile(validParams.file); const fileName = validParams.filename || path.basename(validParams.file); form.append('raw.directory', validParams.directory); form.append('raw.asset1', fileBuffer, fileName); form.append('raw.asset1.filename', fileName); const result = await componentService.uploadComponent(validParams.repository, form); return { content: [{ type: 'text', text: JSON.stringify({ success: true, asset: result, message: `Successfully uploaded asset to ${validParams.repository}/${validParams.directory}/${fileName}` }, null, 2) }] }; } catch (error) { const mcpError = formatMCPError(error); return { content: [{ type: 'text', text: `Error: ${mcpError.message}` }], isError: true }; } } }; } //# sourceMappingURL=upload-asset.js.map