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).
182 lines (168 loc) • 7.33 kB
JavaScript
/**
* Constants and configuration for Taiga MCP Server
*/
export const SERVER_INFO = {
name: 'Taiga MCP',
version: '1.2.2',
};
export const RESOURCE_URIS = {
API_DOCS: 'docs://taiga/api',
PROJECTS: 'taiga://projects',
};
export const ERROR_MESSAGES = {
AUTHENTICATION_FAILED: 'Authentication failed',
PROJECT_NOT_FOUND: 'Project not found',
ISSUE_NOT_FOUND: 'Issue not found',
SPRINT_NOT_FOUND: 'Sprint not found',
INVALID_REFERENCE: 'Invalid reference format',
MISSING_PROJECT_ID: 'Project identifier is required when using reference number',
FAILED_TO_LIST_PROJECTS: 'Failed to list projects from Taiga',
FAILED_TO_CREATE_USER_STORY: 'Failed to create user story in Taiga',
FAILED_TO_CREATE_TASK: 'Failed to create task in Taiga',
FAILED_TO_CREATE_ISSUE: 'Failed to create issue in Taiga',
FAILED_TO_CREATE_SPRINT: 'Failed to create sprint in Taiga',
FAILED_TO_LIST_USER_STORIES: 'Failed to list user stories from Taiga',
FAILED_TO_LIST_ISSUES: 'Failed to list issues from Taiga',
FAILED_TO_LIST_SPRINTS: 'Failed to list sprints from Taiga',
FAILED_TO_GET_PROJECT: 'Failed to get project details from Taiga',
FAILED_TO_GET_ISSUE: 'Failed to get issue details from Taiga',
FAILED_TO_GET_SPRINT: 'Failed to get sprint details from Taiga',
FAILED_TO_GET_SPRINT_STATS: 'Failed to get sprint statistics from Taiga',
FAILED_TO_ADD_COMMENT: 'Failed to add comment to Taiga',
FAILED_TO_LIST_COMMENTS: 'Failed to list comments from Taiga',
FAILED_TO_EDIT_COMMENT: 'Failed to edit comment in Taiga',
FAILED_TO_DELETE_COMMENT: 'Failed to delete comment from Taiga',
COMMENT_NOT_FOUND: 'Comment not found',
INVALID_COMMENT_TARGET: 'Invalid comment target type',
FAILED_TO_UPLOAD_ATTACHMENT: 'Failed to upload attachment to Taiga',
FAILED_TO_LIST_ATTACHMENTS: 'Failed to list attachments from Taiga',
FAILED_TO_DOWNLOAD_ATTACHMENT: 'Failed to download attachment from Taiga',
FAILED_TO_DELETE_ATTACHMENT: 'Failed to delete attachment from Taiga',
ATTACHMENT_NOT_FOUND: 'Attachment not found',
INVALID_FILE_FORMAT: 'Invalid file format or size',
FILE_TOO_LARGE: 'File size exceeds maximum limit',
FAILED_TO_CREATE_EPIC: 'Failed to create epic in Taiga',
FAILED_TO_LIST_EPICS: 'Failed to list epics from Taiga',
FAILED_TO_GET_EPIC: 'Failed to get epic details from Taiga',
FAILED_TO_UPDATE_EPIC: 'Failed to update epic in Taiga',
FAILED_TO_LINK_STORY: 'Failed to link user story to epic',
FAILED_TO_UNLINK_STORY: 'Failed to unlink user story from epic',
EPIC_NOT_FOUND: 'Epic not found',
USER_STORY_NOT_FOUND: 'User story not found',
FAILED_TO_CREATE_WIKI: 'Failed to create wiki page in Taiga',
FAILED_TO_LIST_WIKI: 'Failed to list wiki pages from Taiga',
FAILED_TO_GET_WIKI: 'Failed to get wiki page details from Taiga',
FAILED_TO_UPDATE_WIKI: 'Failed to update wiki page in Taiga',
FAILED_TO_DELETE_WIKI: 'Failed to delete wiki page from Taiga',
FAILED_TO_WATCH_WIKI: 'Failed to watch/unwatch wiki page',
WIKI_PAGE_NOT_FOUND: 'Wiki page not found',
INVALID_WIKI_SLUG: 'Invalid wiki page slug format',
};
export const SUCCESS_MESSAGES = {
AUTHENTICATED: 'Successfully authenticated',
USER_STORY_CREATED: 'User story created successfully!',
TASK_CREATED: 'Task created successfully!',
ISSUE_CREATED: 'Issue created successfully!',
SPRINT_CREATED: 'Sprint created successfully!',
COMMENT_ADDED: 'Comment added successfully!',
COMMENT_EDITED: 'Comment edited successfully!',
COMMENT_DELETED: 'Comment deleted successfully!',
ATTACHMENT_UPLOADED: 'Attachment uploaded successfully!',
ATTACHMENT_DOWNLOADED: 'Attachment downloaded successfully!',
ATTACHMENT_DELETED: 'Attachment deleted successfully!',
EPIC_CREATED: 'Epic created successfully!',
EPIC_UPDATED: 'Epic updated successfully!',
STORY_LINKED_TO_EPIC: 'User story linked to epic successfully!',
STORY_UNLINKED_FROM_EPIC: 'User story unlinked from epic successfully!',
WIKI_PAGE_CREATED: 'Wiki page created successfully!',
WIKI_PAGE_UPDATED: 'Wiki page updated successfully!',
WIKI_PAGE_DELETED: 'Wiki page deleted successfully!',
WIKI_PAGE_WATCHED: 'Wiki page watch status updated successfully!',
};
export const BATCH_OPERATIONS = {
MAX_BATCH_SIZE: 20,
ERROR_EMPTY_BATCH: 'Batch array cannot be empty',
ERROR_BATCH_TOO_LARGE: 'Batch size exceeds maximum limit',
SUCCESS_BATCH_CREATED_ISSUES: '🚀 批次Issues創建完成',
SUCCESS_BATCH_CREATED_STORIES: '🚀 批次User Stories創建完成',
SUCCESS_BATCH_CREATED_TASKS: '🚀 批次Tasks創建完成',
BATCH_OPERATION_START: '開始批次操作...',
BATCH_OPERATION_COMPLETE: '批次操作完成!',
};
export const ADVANCED_QUERY = {
MAX_RESULTS: 1000,
DEFAULT_LIMIT: 50,
MAX_COMPLEXITY: 10,
TIMEOUT_MS: 30000,
// 查詢錯誤信息
ERROR_EMPTY_QUERY: 'Query string cannot be empty',
ERROR_INVALID_SYNTAX: 'Invalid query syntax',
ERROR_UNSUPPORTED_FIELD: 'Unsupported field for this data type',
ERROR_INVALID_OPERATOR: 'Invalid operator',
ERROR_INVALID_VALUE: 'Invalid value for field',
ERROR_QUERY_TOO_COMPLEX: 'Query complexity exceeds maximum limit',
ERROR_EXECUTION_TIMEOUT: 'Query execution timeout',
ERROR_NO_RESULTS: 'No results found for the given query',
// 查詢成功信息
SUCCESS_QUERY_EXECUTED: '🔍 查詢執行成功',
SUCCESS_QUERY_VALIDATED: '✅ 查詢語法驗證通過',
// 查詢提示信息
HINT_USE_QUOTES: 'Use quotes for values containing spaces',
HINT_CHECK_SPELLING: 'Check field names and operator spelling',
HINT_USE_LIMIT: 'Consider using LIMIT to reduce result size',
HINT_USE_HELP: 'Use queryHelp for syntax assistance',
// 支持的數據類型
SUPPORTED_TYPES: ['issues', 'user_stories', 'tasks'],
// 查詢複雜度權重
COMPLEXITY_WEIGHTS: {
FILTER: 1,
LOGIC_OP: 0.5,
ORDER_BY: 1,
LIMIT: 0.2,
GROUP_BY: 2,
TEXT_SEARCH: 1.5,
DATE_RANGE: 1.2
}
};
export const API_ENDPOINTS = {
PROJECTS: '/projects',
USER_STORIES: '/userstories',
TASKS: '/tasks',
ISSUES: '/issues',
MILESTONES: '/milestones',
USER_STORY_STATUSES: '/userstory-statuses',
TASK_STATUSES: '/task-statuses',
ISSUE_STATUSES: '/issue-statuses',
PRIORITIES: '/priorities',
SEVERITIES: '/severities',
ISSUE_TYPES: '/issue-types',
USERS_ME: '/users/me',
HISTORY: '/history',
COMMENTS: '/history', // Comments are part of history system
ISSUE_ATTACHMENTS: '/issues/attachments',
USERSTORY_ATTACHMENTS: '/userstories/attachments',
TASK_ATTACHMENTS: '/tasks/attachments',
EPICS: '/epics',
WIKI: '/wiki',
WIKI_ATTACHMENTS: '/wiki/attachments',
MEMBERSHIPS: '/memberships',
};
export const RESPONSE_TEMPLATES = {
NO_PROJECTS: 'No projects found.',
NO_USER_STORIES: 'No user stories found in this project.',
NO_TASKS: 'No tasks found.',
NO_ISSUES: 'No issues found in this project.',
NO_SPRINTS: 'No sprints found in this project.',
NO_WIKI_PAGES: 'No wiki pages found in this project.',
PROJECT_REQUIRED_FOR_REF: 'Project identifier is required when using reference number.',
};
export const STATUS_LABELS = {
ACTIVE: 'Active',
CLOSED: 'Closed',
UNKNOWN: 'Unknown',
NOT_SET: 'Not set',
UNASSIGNED: 'Unassigned',
NO_SPRINT: 'No Sprint',
NO_DESCRIPTION: 'No description provided',
NO_TAGS: 'No tags',
};