@rashidazarang/aptly-mcp
Version:
Model Context Protocol server for Aptly package repository management - enables AI assistants to manage Debian repositories
151 lines • 5.92 kB
JavaScript
import { createRepoSchema, deleteRepoSchema, formatValidationError } from '../utils/validation.js';
import { z } from 'zod';
export function createRepositoryTools(client) {
return [
{
name: 'aptly_create_repo',
description: 'Create a new local repository in Aptly',
inputSchema: {
type: 'object',
properties: {
name: {
type: 'string',
description: 'Name of the repository to create'
},
comment: {
type: 'string',
description: 'Optional comment/description for the repository'
},
defaultDistribution: {
type: 'string',
description: 'Default distribution for packages in this repository'
},
defaultComponent: {
type: 'string',
description: 'Default component for packages in this repository'
}
},
required: ['name']
}
},
{
name: 'aptly_list_repos',
description: 'List all local repositories',
inputSchema: {
type: 'object',
properties: {},
required: []
}
},
{
name: 'aptly_get_repo',
description: 'Get detailed information about a specific repository',
inputSchema: {
type: 'object',
properties: {
name: {
type: 'string',
description: 'Name of the repository to retrieve'
}
},
required: ['name']
}
},
{
name: 'aptly_delete_repo',
description: 'Delete a local repository',
inputSchema: {
type: 'object',
properties: {
name: {
type: 'string',
description: 'Name of the repository to delete'
},
force: {
type: 'boolean',
description: 'Force deletion even if repository is published or has snapshots',
default: false
}
},
required: ['name']
}
}
];
}
export async function handleRepositoryTool(client, name, arguments_) {
try {
switch (name) {
case 'aptly_create_repo': {
const args = createRepoSchema.parse(arguments_);
const repo = await client.createRepository(args.name, args.comment, args.defaultDistribution, args.defaultComponent);
return {
content: [{
type: 'text',
text: `Repository '${repo.Name}' created successfully.\n` +
`Comment: ${repo.Comment || 'None'}\n` +
`Default Distribution: ${repo.DefaultDistribution || 'None'}\n` +
`Default Component: ${repo.DefaultComponent || 'None'}`
}]
};
}
case 'aptly_list_repos': {
const repos = await client.listRepositories();
if (repos.length === 0) {
return {
content: [{
type: 'text',
text: 'No repositories found.'
}]
};
}
const repoList = repos.map(repo => {
let info = `• ${repo.Name}`;
if (repo.Comment)
info += ` - ${repo.Comment}`;
if (repo.DefaultDistribution)
info += ` (${repo.DefaultDistribution})`;
return info;
}).join('\n');
return {
content: [{
type: 'text',
text: `Found ${repos.length} repository(ies):\n\n${repoList}`
}]
};
}
case 'aptly_get_repo': {
const args = z.object({ name: z.string() }).parse(arguments_);
const repo = await client.getRepository(args.name);
return {
content: [{
type: 'text',
text: `Repository Details:\n` +
`Name: ${repo.Name}\n` +
`Comment: ${repo.Comment || 'None'}\n` +
`Default Distribution: ${repo.DefaultDistribution || 'None'}\n` +
`Default Component: ${repo.DefaultComponent || 'None'}`
}]
};
}
case 'aptly_delete_repo': {
const args = deleteRepoSchema.parse(arguments_);
await client.deleteRepository(args.name, args.force);
return {
content: [{
type: 'text',
text: `Repository '${args.name}' deleted successfully.`
}]
};
}
default:
throw new Error(`Unknown repository tool: ${name}`);
}
}
catch (error) {
if (error instanceof z.ZodError) {
throw new Error(`Validation error: ${formatValidationError(error)}`);
}
throw error;
}
}
//# sourceMappingURL=repository-tools.js.map