@rashidazarang/aptly-mcp
Version:
Model Context Protocol server for Aptly package repository management - enables AI assistants to manage Debian repositories
75 lines • 3 kB
JavaScript
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