taiga-mcp-server
Version:
Full-featured MCP server for Taiga project management with advanced sprint and issue tracking. Based on mcpTAIGA by adriapedralbes, enhanced with substantial modifications. Developed collaboratively with Claude Code (AI-assisted development).
79 lines (69 loc) • 2.07 kB
JavaScript
/**
* Project-related MCP tools
*/
import { z } from 'zod';
import { TaigaService } from '../taigaService.js';
import { RESPONSE_TEMPLATES } from '../constants.js';
import {
formatProjectList,
formatDateTime,
createErrorResponse,
createSuccessResponse,
getSafeValue
} from '../utils.js';
const taigaService = new TaigaService();
/**
* Tool to list all user projects
*/
export const listProjectsTool = {
name: 'listProjects',
schema: {},
handler: async () => {
try {
const projects = await taigaService.listProjects();
if (projects.length === 0) {
return createErrorResponse(RESPONSE_TEMPLATES.NO_PROJECTS);
}
const projectsText = `Your Taiga Projects:\n\n${formatProjectList(projects)}`;
return createSuccessResponse(projectsText);
} catch (error) {
return createErrorResponse(`Failed to list projects: ${error.message}`);
}
}
};
/**
* Tool to get project details
*/
export const getProjectTool = {
name: 'getProject',
schema: {
projectIdentifier: z.string().describe('Project ID or slug'),
},
handler: async ({ projectIdentifier }) => {
try {
let project;
// Try to get project by ID first
if (!isNaN(projectIdentifier)) {
try {
project = await taigaService.getProject(projectIdentifier);
} catch (error) {
// If that fails, try by slug
project = await taigaService.getProjectBySlug(projectIdentifier);
}
} else {
// If it's not a number, try by slug
project = await taigaService.getProjectBySlug(projectIdentifier);
}
const projectDetails = `Project Details:
Name: ${project.name}
ID: ${project.id}
Slug: ${project.slug}
Description: ${getSafeValue(project.description, 'No description')}
Created: ${formatDateTime(project.created_date)}
Total Members: ${project.total_memberships}`;
return createSuccessResponse(projectDetails);
} catch (error) {
return createErrorResponse(`Failed to get project details: ${error.message}`);
}
}
};