import { Tool } from '@modelcontextprotocol/sdk/types.js';
import { CoolifyApiClient } from '../client/coolify-api';
import { ListProjectsSchema, CreateProjectSchema } from '../schemas';
import { logger, logToolInvocation } from '../utils/logger';
export const listProjectsTool: Tool = {
name: 'coolify.list_projects',
description: 'List all projects in Coolify, optionally filtered by team ID',
inputSchema: {
type: 'object',
properties: {
teamId: {
type: 'string',
description: 'Optional team ID to filter projects by',
},
},
},
};
export const createProjectTool: Tool = {
name: 'coolify.create_project',
description: 'Create a new project in Coolify',
inputSchema: {
type: 'object',
properties: {
name: {
type: 'string',
description: 'Project name (1-255 characters)',
},
description: {
type: 'string',
description: 'Optional project description',
},
teamId: {
type: 'string',
description: 'Optional team ID to assign the project to',
},
},
required: ['name'],
},
};
export async function handleListProjects(args: any, apiClient: CoolifyApiClient) {
logToolInvocation('coolify.list_projects', args);
try {
const validated = ListProjectsSchema.parse(args);
const projects = await apiClient.listProjects(validated.teamId);
logger.info(`Retrieved ${projects.length} projects`);
return {
success: true,
projects,
count: projects.length,
};
} catch (error: any) {
logger.error('Failed to list projects', { error: error.message });
return {
success: false,
error: {
code: error.code || 'UNKNOWN_ERROR',
message: error.message,
},
};
}
}
export async function handleCreateProject(args: any, apiClient: CoolifyApiClient) {
logToolInvocation('coolify.create_project', args);
try {
const validated = CreateProjectSchema.parse(args);
const project = await apiClient.createProject(validated);
logger.info(`Created project: ${project.name} (${project.id})`);
return {
success: true,
project,
};
} catch (error: any) {
logger.error('Failed to create project', { error: error.message });
return {
success: false,
error: {
code: error.code || 'UNKNOWN_ERROR',
message: error.message,
},
};
}
}