UNPKG

@rashidazarang/aptly-mcp

Version:

Model Context Protocol server for Aptly package repository management - enables AI assistants to manage Debian repositories

75 lines 3 kB
import { z } from 'zod'; // Common validation schemas export const repositoryNameSchema = z.string() .min(1, 'Repository name cannot be empty') .max(255, 'Repository name too long') .regex(/^[a-zA-Z0-9][a-zA-Z0-9\-_.]*$/, 'Repository name must start with alphanumeric character and contain only letters, numbers, hyphens, underscores, and dots'); export const distributionNameSchema = z.string() .min(1, 'Distribution name cannot be empty') .max(255, 'Distribution name too long') .regex(/^[a-zA-Z0-9][a-zA-Z0-9\-_.]*$/, 'Distribution name must contain only letters, numbers, hyphens, underscores, and dots'); export const packageQuerySchema = z.string() .min(1, 'Search query cannot be empty') .max(1000, 'Search query too long'); export const urlSchema = z.string() .url('Must be a valid URL') .refine(url => url.startsWith('http://') || url.startsWith('https://'), 'URL must use HTTP or HTTPS protocol'); // Tool input schemas export const createRepoSchema = z.object({ name: repositoryNameSchema, comment: z.string().optional(), defaultDistribution: distributionNameSchema.optional(), defaultComponent: z.string().optional() }); export const addPackagesSchema = z.object({ repoName: repositoryNameSchema, directory: z.string().min(1, 'Directory name cannot be empty'), files: z.array(z.string()).optional() }); export const searchPackagesSchema = z.object({ repoName: repositoryNameSchema.optional(), query: packageQuerySchema, format: z.enum(['compact', 'details']).optional() }); export const createSnapshotSchema = z.object({ name: z.string().min(1, 'Snapshot name cannot be empty'), repoName: repositoryNameSchema, description: z.string().optional() }); export const publishRepoSchema = z.object({ repoName: repositoryNameSchema, distribution: distributionNameSchema, prefix: z.string().optional() }); export const createMirrorSchema = z.object({ name: z.string().min(1, 'Mirror name cannot be empty'), archiveURL: urlSchema, distribution: distributionNameSchema, components: z.array(z.string()).optional(), architectures: z.array(z.string()).optional() }); export const deleteRepoSchema = z.object({ name: repositoryNameSchema, force: z.boolean().optional() }); export const uploadFilesSchema = z.object({ directory: z.string().min(1, 'Directory name cannot be empty') }); // Validation helper functions export function validateRepositoryName(name) { return repositoryNameSchema.parse(name); } export function validateDistributionName(name) { return distributionNameSchema.parse(name); } export function validatePackageQuery(query) { return packageQuerySchema.parse(query); } export function validateURL(url) { return urlSchema.parse(url); } // Error formatting export function formatValidationError(error) { return error.errors.map(err => `${err.path.join('.')}: ${err.message}`).join(', '); } //# sourceMappingURL=validation.js.map