vikunja-mcp-ng 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +123 -0
- package/dist/auth/AuthManager.d.ts +63 -0
- package/dist/auth/AuthManager.d.ts.map +1 -0
- package/dist/auth/AuthManager.js +137 -0
- package/dist/auth/AuthManager.js.map +1 -0
- package/dist/auth/index.d.ts +7 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +14 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/permissions.d.ts +60 -0
- package/dist/auth/permissions.d.ts.map +1 -0
- package/dist/auth/permissions.js +173 -0
- package/dist/auth/permissions.js.map +1 -0
- package/dist/client/VikunjaClientFactory.d.ts +41 -0
- package/dist/client/VikunjaClientFactory.d.ts.map +1 -0
- package/dist/client/VikunjaClientFactory.js +58 -0
- package/dist/client/VikunjaClientFactory.js.map +1 -0
- package/dist/client.d.ts +70 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +136 -0
- package/dist/client.js.map +1 -0
- package/dist/config/ConfigurationManager.d.ts +106 -0
- package/dist/config/ConfigurationManager.d.ts.map +1 -0
- package/dist/config/ConfigurationManager.js +509 -0
- package/dist/config/ConfigurationManager.js.map +1 -0
- package/dist/config/index.d.ts +9 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +36 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/secrets.d.ts +33 -0
- package/dist/config/secrets.d.ts.map +1 -0
- package/dist/config/secrets.js +90 -0
- package/dist/config/secrets.js.map +1 -0
- package/dist/config/types.d.ts +1113 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +189 -0
- package/dist/config/types.js.map +1 -0
- package/dist/formatters/BatchImportResponseFormatter.d.ts +89 -0
- package/dist/formatters/BatchImportResponseFormatter.d.ts.map +1 -0
- package/dist/formatters/BatchImportResponseFormatter.js +125 -0
- package/dist/formatters/BatchImportResponseFormatter.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +130 -0
- package/dist/index.js.map +1 -0
- package/dist/middleware/direct-middleware.d.ts +9 -0
- package/dist/middleware/direct-middleware.d.ts.map +1 -0
- package/dist/middleware/direct-middleware.js +49 -0
- package/dist/middleware/direct-middleware.js.map +1 -0
- package/dist/middleware/index.d.ts +8 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +21 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/simplified-rate-limit.d.ts +147 -0
- package/dist/middleware/simplified-rate-limit.d.ts.map +1 -0
- package/dist/middleware/simplified-rate-limit.js +533 -0
- package/dist/middleware/simplified-rate-limit.js.map +1 -0
- package/dist/parsers/CSVParser.d.ts +36 -0
- package/dist/parsers/CSVParser.d.ts.map +1 -0
- package/dist/parsers/CSVParser.js +69 -0
- package/dist/parsers/CSVParser.js.map +1 -0
- package/dist/parsers/InputParserFactory.d.ts +17 -0
- package/dist/parsers/InputParserFactory.d.ts.map +1 -0
- package/dist/parsers/InputParserFactory.js +137 -0
- package/dist/parsers/InputParserFactory.js.map +1 -0
- package/dist/parsers/JSONParser.d.ts +74 -0
- package/dist/parsers/JSONParser.d.ts.map +1 -0
- package/dist/parsers/JSONParser.js +69 -0
- package/dist/parsers/JSONParser.js.map +1 -0
- package/dist/services/EntityResolver.d.ts +92 -0
- package/dist/services/EntityResolver.d.ts.map +1 -0
- package/dist/services/EntityResolver.js +201 -0
- package/dist/services/EntityResolver.js.map +1 -0
- package/dist/services/TaskCreationService.d.ts +99 -0
- package/dist/services/TaskCreationService.d.ts.map +1 -0
- package/dist/services/TaskCreationService.js +392 -0
- package/dist/services/TaskCreationService.js.map +1 -0
- package/dist/storage/SimpleFilterStorage.d.ts +103 -0
- package/dist/storage/SimpleFilterStorage.d.ts.map +1 -0
- package/dist/storage/SimpleFilterStorage.js +350 -0
- package/dist/storage/SimpleFilterStorage.js.map +1 -0
- package/dist/storage/filtering/FilterSerializer.d.ts +45 -0
- package/dist/storage/filtering/FilterSerializer.d.ts.map +1 -0
- package/dist/storage/filtering/FilterSerializer.js +171 -0
- package/dist/storage/filtering/FilterSerializer.js.map +1 -0
- package/dist/storage/filtering/FilterValidator.d.ts +59 -0
- package/dist/storage/filtering/FilterValidator.d.ts.map +1 -0
- package/dist/storage/filtering/FilterValidator.js +183 -0
- package/dist/storage/filtering/FilterValidator.js.map +1 -0
- package/dist/storage/index.d.ts +61 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +125 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/templateFileStore.d.ts +62 -0
- package/dist/storage/templateFileStore.d.ts.map +1 -0
- package/dist/storage/templateFileStore.js +151 -0
- package/dist/storage/templateFileStore.js.map +1 -0
- package/dist/tools/admin.d.ts +51 -0
- package/dist/tools/admin.d.ts.map +1 -0
- package/dist/tools/admin.js +207 -0
- package/dist/tools/admin.js.map +1 -0
- package/dist/tools/auth.d.ts +9 -0
- package/dist/tools/auth.d.ts.map +1 -0
- package/dist/tools/auth.js +175 -0
- package/dist/tools/auth.js.map +1 -0
- package/dist/tools/batch-import.d.ts +5 -0
- package/dist/tools/batch-import.d.ts.map +1 -0
- package/dist/tools/batch-import.js +153 -0
- package/dist/tools/batch-import.js.map +1 -0
- package/dist/tools/caldav-tokens.d.ts +45 -0
- package/dist/tools/caldav-tokens.d.ts.map +1 -0
- package/dist/tools/caldav-tokens.js +93 -0
- package/dist/tools/caldav-tokens.js.map +1 -0
- package/dist/tools/export.d.ts +14 -0
- package/dist/tools/export.d.ts.map +1 -0
- package/dist/tools/export.js +252 -0
- package/dist/tools/export.js.map +1 -0
- package/dist/tools/filters.d.ts +50 -0
- package/dist/tools/filters.d.ts.map +1 -0
- package/dist/tools/filters.js +512 -0
- package/dist/tools/filters.js.map +1 -0
- package/dist/tools/index.d.ts +53 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +217 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/labels.d.ts +22 -0
- package/dist/tools/labels.d.ts.map +1 -0
- package/dist/tools/labels.js +206 -0
- package/dist/tools/labels.js.map +1 -0
- package/dist/tools/notifications.d.ts +17 -0
- package/dist/tools/notifications.d.ts.map +1 -0
- package/dist/tools/notifications.js +171 -0
- package/dist/tools/notifications.js.map +1 -0
- package/dist/tools/projects/backgrounds.d.ts +80 -0
- package/dist/tools/projects/backgrounds.d.ts.map +1 -0
- package/dist/tools/projects/backgrounds.js +154 -0
- package/dist/tools/projects/backgrounds.js.map +1 -0
- package/dist/tools/projects/buckets.d.ts +147 -0
- package/dist/tools/projects/buckets.d.ts.map +1 -0
- package/dist/tools/projects/buckets.js +291 -0
- package/dist/tools/projects/buckets.js.map +1 -0
- package/dist/tools/projects/crud.d.ts +145 -0
- package/dist/tools/projects/crud.d.ts.map +1 -0
- package/dist/tools/projects/crud.js +425 -0
- package/dist/tools/projects/crud.js.map +1 -0
- package/dist/tools/projects/duplicate.d.ts +41 -0
- package/dist/tools/projects/duplicate.d.ts.map +1 -0
- package/dist/tools/projects/duplicate.js +49 -0
- package/dist/tools/projects/duplicate.js.map +1 -0
- package/dist/tools/projects/hierarchy.d.ts +77 -0
- package/dist/tools/projects/hierarchy.d.ts.map +1 -0
- package/dist/tools/projects/hierarchy.js +300 -0
- package/dist/tools/projects/hierarchy.js.map +1 -0
- package/dist/tools/projects/index.d.ts +34 -0
- package/dist/tools/projects/index.d.ts.map +1 -0
- package/dist/tools/projects/index.js +522 -0
- package/dist/tools/projects/index.js.map +1 -0
- package/dist/tools/projects/permission.d.ts +26 -0
- package/dist/tools/projects/permission.d.ts.map +1 -0
- package/dist/tools/projects/permission.js +53 -0
- package/dist/tools/projects/permission.js.map +1 -0
- package/dist/tools/projects/response-formatter.d.ts +54 -0
- package/dist/tools/projects/response-formatter.d.ts.map +1 -0
- package/dist/tools/projects/response-formatter.js +139 -0
- package/dist/tools/projects/response-formatter.js.map +1 -0
- package/dist/tools/projects/sharing-access.d.ts +165 -0
- package/dist/tools/projects/sharing-access.d.ts.map +1 -0
- package/dist/tools/projects/sharing-access.js +450 -0
- package/dist/tools/projects/sharing-access.js.map +1 -0
- package/dist/tools/projects/sharing.d.ts +105 -0
- package/dist/tools/projects/sharing.d.ts.map +1 -0
- package/dist/tools/projects/sharing.js +258 -0
- package/dist/tools/projects/sharing.js.map +1 -0
- package/dist/tools/projects/validation.d.ts +51 -0
- package/dist/tools/projects/validation.d.ts.map +1 -0
- package/dist/tools/projects/validation.js +160 -0
- package/dist/tools/projects/validation.js.map +1 -0
- package/dist/tools/projects/views.d.ts +161 -0
- package/dist/tools/projects/views.d.ts.map +1 -0
- package/dist/tools/projects/views.js +234 -0
- package/dist/tools/projects/views.js.map +1 -0
- package/dist/tools/projects.d.ts +20 -0
- package/dist/tools/projects.d.ts.map +1 -0
- package/dist/tools/projects.js +66 -0
- package/dist/tools/projects.js.map +1 -0
- package/dist/tools/reactions.d.ts +25 -0
- package/dist/tools/reactions.d.ts.map +1 -0
- package/dist/tools/reactions.js +108 -0
- package/dist/tools/reactions.js.map +1 -0
- package/dist/tools/subscriptions.d.ts +23 -0
- package/dist/tools/subscriptions.d.ts.map +1 -0
- package/dist/tools/subscriptions.js +111 -0
- package/dist/tools/subscriptions.js.map +1 -0
- package/dist/tools/task-assignees.d.ts +13 -0
- package/dist/tools/task-assignees.d.ts.map +1 -0
- package/dist/tools/task-assignees.js +74 -0
- package/dist/tools/task-assignees.js.map +1 -0
- package/dist/tools/task-bulk.d.ts +13 -0
- package/dist/tools/task-bulk.d.ts.map +1 -0
- package/dist/tools/task-bulk.js +117 -0
- package/dist/tools/task-bulk.js.map +1 -0
- package/dist/tools/task-comments.d.ts +12 -0
- package/dist/tools/task-comments.d.ts.map +1 -0
- package/dist/tools/task-comments.js +65 -0
- package/dist/tools/task-comments.js.map +1 -0
- package/dist/tools/task-crud.d.ts +13 -0
- package/dist/tools/task-crud.d.ts.map +1 -0
- package/dist/tools/task-crud.js +168 -0
- package/dist/tools/task-crud.js.map +1 -0
- package/dist/tools/task-labels.d.ts +13 -0
- package/dist/tools/task-labels.d.ts.map +1 -0
- package/dist/tools/task-labels.js +64 -0
- package/dist/tools/task-labels.js.map +1 -0
- package/dist/tools/task-relations.d.ts +13 -0
- package/dist/tools/task-relations.d.ts.map +1 -0
- package/dist/tools/task-relations.js +74 -0
- package/dist/tools/task-relations.js.map +1 -0
- package/dist/tools/task-reminders.d.ts +13 -0
- package/dist/tools/task-reminders.d.ts.map +1 -0
- package/dist/tools/task-reminders.js +69 -0
- package/dist/tools/task-reminders.js.map +1 -0
- package/dist/tools/tasks/assignees/AssigneeOperationsService.d.ts +63 -0
- package/dist/tools/tasks/assignees/AssigneeOperationsService.d.ts.map +1 -0
- package/dist/tools/tasks/assignees/AssigneeOperationsService.js +152 -0
- package/dist/tools/tasks/assignees/AssigneeOperationsService.js.map +1 -0
- package/dist/tools/tasks/assignees/AssigneeResponseFormatter.d.ts +28 -0
- package/dist/tools/tasks/assignees/AssigneeResponseFormatter.d.ts.map +1 -0
- package/dist/tools/tasks/assignees/AssigneeResponseFormatter.js +73 -0
- package/dist/tools/tasks/assignees/AssigneeResponseFormatter.js.map +1 -0
- package/dist/tools/tasks/assignees/AssigneeValidationService.d.ts +46 -0
- package/dist/tools/tasks/assignees/AssigneeValidationService.d.ts.map +1 -0
- package/dist/tools/tasks/assignees/AssigneeValidationService.js +70 -0
- package/dist/tools/tasks/assignees/AssigneeValidationService.js.map +1 -0
- package/dist/tools/tasks/assignees/index.d.ts +52 -0
- package/dist/tools/tasks/assignees/index.d.ts.map +1 -0
- package/dist/tools/tasks/assignees/index.js +103 -0
- package/dist/tools/tasks/assignees/index.js.map +1 -0
- package/dist/tools/tasks/attach.d.ts +39 -0
- package/dist/tools/tasks/attach.d.ts.map +1 -0
- package/dist/tools/tasks/attach.js +90 -0
- package/dist/tools/tasks/attach.js.map +1 -0
- package/dist/tools/tasks/attachments.d.ts +67 -0
- package/dist/tools/tasks/attachments.d.ts.map +1 -0
- package/dist/tools/tasks/attachments.js +153 -0
- package/dist/tools/tasks/attachments.js.map +1 -0
- package/dist/tools/tasks/buckets.d.ts +41 -0
- package/dist/tools/tasks/buckets.d.ts.map +1 -0
- package/dist/tools/tasks/buckets.js +75 -0
- package/dist/tools/tasks/buckets.js.map +1 -0
- package/dist/tools/tasks/bulk/BatchProcessorFactory.d.ts +30 -0
- package/dist/tools/tasks/bulk/BatchProcessorFactory.d.ts.map +1 -0
- package/dist/tools/tasks/bulk/BatchProcessorFactory.js +69 -0
- package/dist/tools/tasks/bulk/BatchProcessorFactory.js.map +1 -0
- package/dist/tools/tasks/bulk/BulkOperationErrorHandler.d.ts +50 -0
- package/dist/tools/tasks/bulk/BulkOperationErrorHandler.d.ts.map +1 -0
- package/dist/tools/tasks/bulk/BulkOperationErrorHandler.js +183 -0
- package/dist/tools/tasks/bulk/BulkOperationErrorHandler.js.map +1 -0
- package/dist/tools/tasks/bulk/BulkOperationProcessor.d.ts +101 -0
- package/dist/tools/tasks/bulk/BulkOperationProcessor.d.ts.map +1 -0
- package/dist/tools/tasks/bulk/BulkOperationProcessor.js +416 -0
- package/dist/tools/tasks/bulk/BulkOperationProcessor.js.map +1 -0
- package/dist/tools/tasks/bulk/BulkOperationTypes.d.ts +50 -0
- package/dist/tools/tasks/bulk/BulkOperationTypes.d.ts.map +1 -0
- package/dist/tools/tasks/bulk/BulkOperationTypes.js +6 -0
- package/dist/tools/tasks/bulk/BulkOperationTypes.js.map +1 -0
- package/dist/tools/tasks/bulk/BulkOperationValidator.d.ts +53 -0
- package/dist/tools/tasks/bulk/BulkOperationValidator.d.ts.map +1 -0
- package/dist/tools/tasks/bulk/BulkOperationValidator.js +216 -0
- package/dist/tools/tasks/bulk/BulkOperationValidator.js.map +1 -0
- package/dist/tools/tasks/bulk/index.d.ts +9 -0
- package/dist/tools/tasks/bulk/index.d.ts.map +1 -0
- package/dist/tools/tasks/bulk/index.js +15 -0
- package/dist/tools/tasks/bulk/index.js.map +1 -0
- package/dist/tools/tasks/bulk-operations-simplified.d.ts +62 -0
- package/dist/tools/tasks/bulk-operations-simplified.d.ts.map +1 -0
- package/dist/tools/tasks/bulk-operations-simplified.js +416 -0
- package/dist/tools/tasks/bulk-operations-simplified.js.map +1 -0
- package/dist/tools/tasks/bulk-operations.d.ts +8 -0
- package/dist/tools/tasks/bulk-operations.d.ts.map +1 -0
- package/dist/tools/tasks/bulk-operations.js +13 -0
- package/dist/tools/tasks/bulk-operations.js.map +1 -0
- package/dist/tools/tasks/by-index.d.ts +36 -0
- package/dist/tools/tasks/by-index.d.ts.map +1 -0
- package/dist/tools/tasks/by-index.js +52 -0
- package/dist/tools/tasks/by-index.js.map +1 -0
- package/dist/tools/tasks/comments/CommentOperationsService.d.ts +44 -0
- package/dist/tools/tasks/comments/CommentOperationsService.d.ts.map +1 -0
- package/dist/tools/tasks/comments/CommentOperationsService.js +86 -0
- package/dist/tools/tasks/comments/CommentOperationsService.js.map +1 -0
- package/dist/tools/tasks/comments/CommentResponseFormatter.d.ts +41 -0
- package/dist/tools/tasks/comments/CommentResponseFormatter.d.ts.map +1 -0
- package/dist/tools/tasks/comments/CommentResponseFormatter.js +114 -0
- package/dist/tools/tasks/comments/CommentResponseFormatter.js.map +1 -0
- package/dist/tools/tasks/comments/CommentValidationService.d.ts +62 -0
- package/dist/tools/tasks/comments/CommentValidationService.d.ts.map +1 -0
- package/dist/tools/tasks/comments/CommentValidationService.js +105 -0
- package/dist/tools/tasks/comments/CommentValidationService.js.map +1 -0
- package/dist/tools/tasks/comments/index.d.ts +66 -0
- package/dist/tools/tasks/comments/index.d.ts.map +1 -0
- package/dist/tools/tasks/comments/index.js +99 -0
- package/dist/tools/tasks/comments/index.js.map +1 -0
- package/dist/tools/tasks/constants.d.ts +19 -0
- package/dist/tools/tasks/constants.d.ts.map +1 -0
- package/dist/tools/tasks/constants.js +82 -0
- package/dist/tools/tasks/constants.js.map +1 -0
- package/dist/tools/tasks/crud/TaskCreationService.d.ts +29 -0
- package/dist/tools/tasks/crud/TaskCreationService.d.ts.map +1 -0
- package/dist/tools/tasks/crud/TaskCreationService.js +274 -0
- package/dist/tools/tasks/crud/TaskCreationService.js.map +1 -0
- package/dist/tools/tasks/crud/TaskDeletionService.d.ts +19 -0
- package/dist/tools/tasks/crud/TaskDeletionService.d.ts.map +1 -0
- package/dist/tools/tasks/crud/TaskDeletionService.js +96 -0
- package/dist/tools/tasks/crud/TaskDeletionService.js.map +1 -0
- package/dist/tools/tasks/crud/TaskReadService.d.ts +19 -0
- package/dist/tools/tasks/crud/TaskReadService.d.ts.map +1 -0
- package/dist/tools/tasks/crud/TaskReadService.js +66 -0
- package/dist/tools/tasks/crud/TaskReadService.js.map +1 -0
- package/dist/tools/tasks/crud/TaskResponseFormatter.d.ts +18 -0
- package/dist/tools/tasks/crud/TaskResponseFormatter.d.ts.map +1 -0
- package/dist/tools/tasks/crud/TaskResponseFormatter.js +248 -0
- package/dist/tools/tasks/crud/TaskResponseFormatter.js.map +1 -0
- package/dist/tools/tasks/crud/TaskUpdateService.d.ts +33 -0
- package/dist/tools/tasks/crud/TaskUpdateService.d.ts.map +1 -0
- package/dist/tools/tasks/crud/TaskUpdateService.js +294 -0
- package/dist/tools/tasks/crud/TaskUpdateService.js.map +1 -0
- package/dist/tools/tasks/crud/index.d.ts +17 -0
- package/dist/tools/tasks/crud/index.d.ts.map +1 -0
- package/dist/tools/tasks/crud/index.js +20 -0
- package/dist/tools/tasks/crud/index.js.map +1 -0
- package/dist/tools/tasks/duplicate.d.ts +28 -0
- package/dist/tools/tasks/duplicate.d.ts.map +1 -0
- package/dist/tools/tasks/duplicate.js +41 -0
- package/dist/tools/tasks/duplicate.js.map +1 -0
- package/dist/tools/tasks/filtering/FilterExecutor.d.ts +39 -0
- package/dist/tools/tasks/filtering/FilterExecutor.d.ts.map +1 -0
- package/dist/tools/tasks/filtering/FilterExecutor.js +214 -0
- package/dist/tools/tasks/filtering/FilterExecutor.js.map +1 -0
- package/dist/tools/tasks/filtering/FilterValidator.d.ts +59 -0
- package/dist/tools/tasks/filtering/FilterValidator.d.ts.map +1 -0
- package/dist/tools/tasks/filtering/FilterValidator.js +257 -0
- package/dist/tools/tasks/filtering/FilterValidator.js.map +1 -0
- package/dist/tools/tasks/filtering/TaskFilteringOrchestrator.d.ts +78 -0
- package/dist/tools/tasks/filtering/TaskFilteringOrchestrator.d.ts.map +1 -0
- package/dist/tools/tasks/filtering/TaskFilteringOrchestrator.js +195 -0
- package/dist/tools/tasks/filtering/TaskFilteringOrchestrator.js.map +1 -0
- package/dist/tools/tasks/filtering/evaluators.d.ts +41 -0
- package/dist/tools/tasks/filtering/evaluators.d.ts.map +1 -0
- package/dist/tools/tasks/filtering/evaluators.js +224 -0
- package/dist/tools/tasks/filtering/evaluators.js.map +1 -0
- package/dist/tools/tasks/filtering/index.d.ts +11 -0
- package/dist/tools/tasks/filtering/index.d.ts.map +1 -0
- package/dist/tools/tasks/filtering/index.js +26 -0
- package/dist/tools/tasks/filtering/index.js.map +1 -0
- package/dist/tools/tasks/index.d.ts +9 -0
- package/dist/tools/tasks/index.d.ts.map +1 -0
- package/dist/tools/tasks/index.js +337 -0
- package/dist/tools/tasks/index.js.map +1 -0
- package/dist/tools/tasks/labels.d.ts +49 -0
- package/dist/tools/tasks/labels.d.ts.map +1 -0
- package/dist/tools/tasks/labels.js +223 -0
- package/dist/tools/tasks/labels.js.map +1 -0
- package/dist/tools/tasks/mark-read.d.ts +27 -0
- package/dist/tools/tasks/mark-read.d.ts.map +1 -0
- package/dist/tools/tasks/mark-read.js +38 -0
- package/dist/tools/tasks/mark-read.js.map +1 -0
- package/dist/tools/tasks/position.d.ts +53 -0
- package/dist/tools/tasks/position.d.ts.map +1 -0
- package/dist/tools/tasks/position.js +83 -0
- package/dist/tools/tasks/position.js.map +1 -0
- package/dist/tools/tasks/reminders.d.ts +56 -0
- package/dist/tools/tasks/reminders.d.ts.map +1 -0
- package/dist/tools/tasks/reminders.js +213 -0
- package/dist/tools/tasks/reminders.js.map +1 -0
- package/dist/tools/tasks/subtasks.d.ts +85 -0
- package/dist/tools/tasks/subtasks.d.ts.map +1 -0
- package/dist/tools/tasks/subtasks.js +286 -0
- package/dist/tools/tasks/subtasks.js.map +1 -0
- package/dist/tools/tasks/types/filters.d.ts +136 -0
- package/dist/tools/tasks/types/filters.d.ts.map +1 -0
- package/dist/tools/tasks/types/filters.js +7 -0
- package/dist/tools/tasks/types/filters.js.map +1 -0
- package/dist/tools/tasks/validation.d.ts +47 -0
- package/dist/tools/tasks/validation.d.ts.map +1 -0
- package/dist/tools/tasks/validation.js +131 -0
- package/dist/tools/tasks/validation.js.map +1 -0
- package/dist/tools/tasks-relations.d.ts +25 -0
- package/dist/tools/tasks-relations.d.ts.map +1 -0
- package/dist/tools/tasks-relations.js +271 -0
- package/dist/tools/tasks-relations.js.map +1 -0
- package/dist/tools/tasks.d.ts +6 -0
- package/dist/tools/tasks.d.ts.map +1 -0
- package/dist/tools/tasks.js +10 -0
- package/dist/tools/tasks.js.map +1 -0
- package/dist/tools/teams.d.ts +9 -0
- package/dist/tools/teams.d.ts.map +1 -0
- package/dist/tools/teams.js +255 -0
- package/dist/tools/teams.js.map +1 -0
- package/dist/tools/templates.d.ts +9 -0
- package/dist/tools/templates.d.ts.map +1 -0
- package/dist/tools/templates.js +450 -0
- package/dist/tools/templates.js.map +1 -0
- package/dist/tools/tokens.d.ts +37 -0
- package/dist/tools/tokens.d.ts.map +1 -0
- package/dist/tools/tokens.js +122 -0
- package/dist/tools/tokens.js.map +1 -0
- package/dist/tools/user-deletion.d.ts +41 -0
- package/dist/tools/user-deletion.d.ts.map +1 -0
- package/dist/tools/user-deletion.js +126 -0
- package/dist/tools/user-deletion.js.map +1 -0
- package/dist/tools/users.d.ts +9 -0
- package/dist/tools/users.d.ts.map +1 -0
- package/dist/tools/users.js +418 -0
- package/dist/tools/users.js.map +1 -0
- package/dist/tools/webhooks.d.ts +31 -0
- package/dist/tools/webhooks.d.ts.map +1 -0
- package/dist/tools/webhooks.js +414 -0
- package/dist/tools/webhooks.js.map +1 -0
- package/dist/transforms/base.d.ts +204 -0
- package/dist/transforms/base.d.ts.map +1 -0
- package/dist/transforms/base.js +175 -0
- package/dist/transforms/base.js.map +1 -0
- package/dist/transforms/field-selector.d.ts +27 -0
- package/dist/transforms/field-selector.d.ts.map +1 -0
- package/dist/transforms/field-selector.js +91 -0
- package/dist/transforms/field-selector.js.map +1 -0
- package/dist/transforms/index.d.ts +15 -0
- package/dist/transforms/index.d.ts.map +1 -0
- package/dist/transforms/index.js +50 -0
- package/dist/transforms/index.js.map +1 -0
- package/dist/transforms/size-calculator.d.ts +131 -0
- package/dist/transforms/size-calculator.d.ts.map +1 -0
- package/dist/transforms/size-calculator.js +284 -0
- package/dist/transforms/size-calculator.js.map +1 -0
- package/dist/transforms/task.d.ts +207 -0
- package/dist/transforms/task.d.ts.map +1 -0
- package/dist/transforms/task.js +259 -0
- package/dist/transforms/task.js.map +1 -0
- package/dist/types/errors.d.ts +65 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +44 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/filters.d.ts +149 -0
- package/dist/types/filters.d.ts.map +1 -0
- package/dist/types/filters.js +26 -0
- package/dist/types/filters.js.map +1 -0
- package/dist/types/index.d.ts +147 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +24 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/node-vikunja-extended.d.ts +36 -0
- package/dist/types/node-vikunja-extended.d.ts.map +1 -0
- package/dist/types/node-vikunja-extended.js +25 -0
- package/dist/types/node-vikunja-extended.js.map +1 -0
- package/dist/types/responses.d.ts +121 -0
- package/dist/types/responses.d.ts.map +1 -0
- package/dist/types/responses.js +26 -0
- package/dist/types/responses.js.map +1 -0
- package/dist/types/vikunja.d.ts +319 -0
- package/dist/types/vikunja.d.ts.map +1 -0
- package/dist/types/vikunja.js +7 -0
- package/dist/types/vikunja.js.map +1 -0
- package/dist/utils/auth-error-handler.d.ts +23 -0
- package/dist/utils/auth-error-handler.d.ts.map +1 -0
- package/dist/utils/auth-error-handler.js +162 -0
- package/dist/utils/auth-error-handler.js.map +1 -0
- package/dist/utils/composite-operation.d.ts +184 -0
- package/dist/utils/composite-operation.d.ts.map +1 -0
- package/dist/utils/composite-operation.js +293 -0
- package/dist/utils/composite-operation.js.map +1 -0
- package/dist/utils/error-handler.d.ts +39 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +336 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/filtering/ClientSideFilteringStrategy.d.ts +13 -0
- package/dist/utils/filtering/ClientSideFilteringStrategy.d.ts.map +1 -0
- package/dist/utils/filtering/ClientSideFilteringStrategy.js +129 -0
- package/dist/utils/filtering/ClientSideFilteringStrategy.js.map +1 -0
- package/dist/utils/filtering/FilteringContext.d.ts +40 -0
- package/dist/utils/filtering/FilteringContext.d.ts.map +1 -0
- package/dist/utils/filtering/FilteringContext.js +58 -0
- package/dist/utils/filtering/FilteringContext.js.map +1 -0
- package/dist/utils/filtering/HybridFilteringStrategy.d.ts +15 -0
- package/dist/utils/filtering/HybridFilteringStrategy.d.ts.map +1 -0
- package/dist/utils/filtering/HybridFilteringStrategy.js +55 -0
- package/dist/utils/filtering/HybridFilteringStrategy.js.map +1 -0
- package/dist/utils/filtering/RestCrossProjectFilteringStrategy.d.ts +42 -0
- package/dist/utils/filtering/RestCrossProjectFilteringStrategy.d.ts.map +1 -0
- package/dist/utils/filtering/RestCrossProjectFilteringStrategy.js +120 -0
- package/dist/utils/filtering/RestCrossProjectFilteringStrategy.js.map +1 -0
- package/dist/utils/filtering/ServerSideFilteringStrategy.d.ts +13 -0
- package/dist/utils/filtering/ServerSideFilteringStrategy.d.ts.map +1 -0
- package/dist/utils/filtering/ServerSideFilteringStrategy.js +88 -0
- package/dist/utils/filtering/ServerSideFilteringStrategy.js.map +1 -0
- package/dist/utils/filtering/TaskFilteringStrategy.d.ts +19 -0
- package/dist/utils/filtering/TaskFilteringStrategy.d.ts.map +1 -0
- package/dist/utils/filtering/TaskFilteringStrategy.js +10 -0
- package/dist/utils/filtering/TaskFilteringStrategy.js.map +1 -0
- package/dist/utils/filtering/index.d.ts +14 -0
- package/dist/utils/filtering/index.d.ts.map +1 -0
- package/dist/utils/filtering/index.js +22 -0
- package/dist/utils/filtering/index.js.map +1 -0
- package/dist/utils/filtering/types.d.ts +108 -0
- package/dist/utils/filtering/types.d.ts.map +1 -0
- package/dist/utils/filtering/types.js +6 -0
- package/dist/utils/filtering/types.js.map +1 -0
- package/dist/utils/filters.d.ts +70 -0
- package/dist/utils/filters.d.ts.map +1 -0
- package/dist/utils/filters.js +812 -0
- package/dist/utils/filters.js.map +1 -0
- package/dist/utils/http-error-detail.d.ts +28 -0
- package/dist/utils/http-error-detail.d.ts.map +1 -0
- package/dist/utils/http-error-detail.js +67 -0
- package/dist/utils/http-error-detail.js.map +1 -0
- package/dist/utils/label-bulk.d.ts +21 -0
- package/dist/utils/label-bulk.d.ts.map +1 -0
- package/dist/utils/label-bulk.js +51 -0
- package/dist/utils/label-bulk.js.map +1 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +66 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/memory.d.ts +73 -0
- package/dist/utils/memory.d.ts.map +1 -0
- package/dist/utils/memory.js +194 -0
- package/dist/utils/memory.js.map +1 -0
- package/dist/utils/performance/batch-processor.d.ts +77 -0
- package/dist/utils/performance/batch-processor.d.ts.map +1 -0
- package/dist/utils/performance/batch-processor.js +218 -0
- package/dist/utils/performance/batch-processor.js.map +1 -0
- package/dist/utils/performance/index.d.ts +42 -0
- package/dist/utils/performance/index.d.ts.map +1 -0
- package/dist/utils/performance/index.js +49 -0
- package/dist/utils/performance/index.js.map +1 -0
- package/dist/utils/performance/performance-monitor.d.ts +116 -0
- package/dist/utils/performance/performance-monitor.d.ts.map +1 -0
- package/dist/utils/performance/performance-monitor.js +307 -0
- package/dist/utils/performance/performance-monitor.js.map +1 -0
- package/dist/utils/read-only.d.ts +111 -0
- package/dist/utils/read-only.d.ts.map +1 -0
- package/dist/utils/read-only.js +503 -0
- package/dist/utils/read-only.js.map +1 -0
- package/dist/utils/response-factory.d.ts +81 -0
- package/dist/utils/response-factory.d.ts.map +1 -0
- package/dist/utils/response-factory.js +86 -0
- package/dist/utils/response-factory.js.map +1 -0
- package/dist/utils/retry.d.ts +160 -0
- package/dist/utils/retry.d.ts.map +1 -0
- package/dist/utils/retry.js +316 -0
- package/dist/utils/retry.js.map +1 -0
- package/dist/utils/security.d.ts +70 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +358 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/utils/simple-response.d.ts +75 -0
- package/dist/utils/simple-response.d.ts.map +1 -0
- package/dist/utils/simple-response.js +311 -0
- package/dist/utils/simple-response.js.map +1 -0
- package/dist/utils/storage-errors.d.ts +9 -0
- package/dist/utils/storage-errors.d.ts.map +1 -0
- package/dist/utils/storage-errors.js +20 -0
- package/dist/utils/storage-errors.js.map +1 -0
- package/dist/utils/task-rest-transport.d.ts +28 -0
- package/dist/utils/task-rest-transport.d.ts.map +1 -0
- package/dist/utils/task-rest-transport.js +33 -0
- package/dist/utils/task-rest-transport.js.map +1 -0
- package/dist/utils/unicode-fix.d.ts +19 -0
- package/dist/utils/unicode-fix.d.ts.map +1 -0
- package/dist/utils/unicode-fix.js +70 -0
- package/dist/utils/unicode-fix.js.map +1 -0
- package/dist/utils/validation.d.ts +75 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +758 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/utils/vikunja-rest.d.ts +159 -0
- package/dist/utils/vikunja-rest.d.ts.map +1 -0
- package/dist/utils/vikunja-rest.js +378 -0
- package/dist/utils/vikunja-rest.js.map +1 -0
- package/docs/CONFIGURATION.md +957 -0
- package/docs/DOCKER-DESKTOP-MCP.md +207 -0
- package/docs/TOOLS.md +422 -0
- package/package.json +145 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerBatchImportTool = registerBatchImportTool;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const logger_1 = require("../utils/logger");
|
|
6
|
+
const types_1 = require("../types");
|
|
7
|
+
const InputParserFactory_1 = require("../parsers/InputParserFactory");
|
|
8
|
+
const EntityResolver_1 = require("../services/EntityResolver");
|
|
9
|
+
const TaskCreationService_1 = require("../services/TaskCreationService");
|
|
10
|
+
const BatchImportResponseFormatter_1 = require("../formatters/BatchImportResponseFormatter");
|
|
11
|
+
const read_only_1 = require("../utils/read-only");
|
|
12
|
+
const MAX_BATCH_SIZE = 100;
|
|
13
|
+
/* ===================================================================
|
|
14
|
+
* BATCH IMPORT ORCHESTRATION
|
|
15
|
+
* Main tool registration and orchestration layer for batch task import
|
|
16
|
+
* =================================================================== */
|
|
17
|
+
function registerBatchImportTool(server, authManager, _clientFactory) {
|
|
18
|
+
server.tool('vikunja_batch_import', (0, read_only_1.withReadOnlyNote)('vikunja_batch_import', 'Import tasks in bulk from CSV or JSON formats with error handling and dry-run support'), {
|
|
19
|
+
projectId: zod_1.z.number(),
|
|
20
|
+
format: zod_1.z.enum(['csv', 'json']),
|
|
21
|
+
data: zod_1.z.string(),
|
|
22
|
+
skipErrors: zod_1.z.boolean().optional(),
|
|
23
|
+
dryRun: zod_1.z.boolean().optional(),
|
|
24
|
+
}, (0, read_only_1.getToolAnnotations)('vikunja_batch_import'), async (args) => {
|
|
25
|
+
try {
|
|
26
|
+
logger_1.logger.debug('Executing batch import', {
|
|
27
|
+
projectId: args.projectId,
|
|
28
|
+
format: args.format,
|
|
29
|
+
skipErrors: args.skipErrors,
|
|
30
|
+
dryRun: args.dryRun,
|
|
31
|
+
});
|
|
32
|
+
// Authentication check
|
|
33
|
+
if (!authManager.isAuthenticated()) {
|
|
34
|
+
throw new types_1.MCPError(types_1.ErrorCode.AUTH_REQUIRED, 'Authentication required. Please use vikunja_auth.connect first.');
|
|
35
|
+
}
|
|
36
|
+
// No subcommand field on this single-purpose tool — 'import' is
|
|
37
|
+
// its fixed classification-table key. dryRun never writes to
|
|
38
|
+
// Vikunja, so it is exempt from read-only mode.
|
|
39
|
+
(0, read_only_1.assertWriteAllowed)('vikunja_batch_import', 'import', args.dryRun ? 'read' : undefined);
|
|
40
|
+
const responseFormatter = new BatchImportResponseFormatter_1.BatchImportResponseFormatter();
|
|
41
|
+
// Parse input data
|
|
42
|
+
const parseOptions = {
|
|
43
|
+
format: args.format,
|
|
44
|
+
data: args.data,
|
|
45
|
+
...(args.skipErrors !== undefined && { skipErrors: args.skipErrors }),
|
|
46
|
+
};
|
|
47
|
+
const tasks = (0, InputParserFactory_1.parseInputData)(parseOptions);
|
|
48
|
+
// Validate tasks
|
|
49
|
+
if (tasks.length === 0) {
|
|
50
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, 'No valid tasks found to import');
|
|
51
|
+
}
|
|
52
|
+
if (tasks.length > MAX_BATCH_SIZE) {
|
|
53
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, `Batch size exceeds maximum limit of ${MAX_BATCH_SIZE} tasks. Please split your import into smaller batches.`);
|
|
54
|
+
}
|
|
55
|
+
// Handle dry run
|
|
56
|
+
if (args.dryRun) {
|
|
57
|
+
return {
|
|
58
|
+
content: [{
|
|
59
|
+
type: 'text',
|
|
60
|
+
text: `Validation successful. ${tasks.length} tasks ready to import.`,
|
|
61
|
+
}],
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
// Initialize services
|
|
65
|
+
const entityResolver = new EntityResolver_1.EntityResolver();
|
|
66
|
+
const taskCreationService = new TaskCreationService_1.TaskCreationService();
|
|
67
|
+
// Resolve entities (labels and users)
|
|
68
|
+
const entityResult = await entityResolver.resolveEntities(authManager);
|
|
69
|
+
const { userFetchFailedDueToAuth } = entityResult;
|
|
70
|
+
// Process tasks
|
|
71
|
+
const result = {
|
|
72
|
+
success: 0,
|
|
73
|
+
failed: 0,
|
|
74
|
+
errors: [],
|
|
75
|
+
createdTasks: [],
|
|
76
|
+
};
|
|
77
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
78
|
+
const task = tasks[i];
|
|
79
|
+
if (!task)
|
|
80
|
+
continue;
|
|
81
|
+
try {
|
|
82
|
+
const creationResult = await taskCreationService.createTask(task, args.projectId, authManager, entityResult, args.skipErrors === true);
|
|
83
|
+
if (creationResult.success) {
|
|
84
|
+
result.success++;
|
|
85
|
+
if (creationResult.taskId) {
|
|
86
|
+
result.createdTasks.push({
|
|
87
|
+
id: creationResult.taskId,
|
|
88
|
+
title: creationResult.title,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
if (creationResult.warnings?.length) {
|
|
92
|
+
if (!result.warnings)
|
|
93
|
+
result.warnings = [];
|
|
94
|
+
creationResult.warnings.forEach((warning) => {
|
|
95
|
+
(result.warnings || []).push({
|
|
96
|
+
taskId: creationResult.taskId || 0,
|
|
97
|
+
title: creationResult.title,
|
|
98
|
+
warning,
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
else {
|
|
104
|
+
result.failed++;
|
|
105
|
+
result.errors.push({
|
|
106
|
+
index: i,
|
|
107
|
+
title: task.title,
|
|
108
|
+
error: creationResult.error || 'Unknown error',
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
result.failed++;
|
|
114
|
+
result.errors.push({
|
|
115
|
+
index: i,
|
|
116
|
+
title: task.title,
|
|
117
|
+
error: error instanceof Error ? error.message : 'Unknown error',
|
|
118
|
+
});
|
|
119
|
+
if (!args.skipErrors) {
|
|
120
|
+
throw error;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
// Format and return response
|
|
125
|
+
const hasAssignees = tasks.some((t) => t.assignees && t.assignees.length > 0);
|
|
126
|
+
const responseText = responseFormatter.formatResult(result, userFetchFailedDueToAuth, hasAssignees);
|
|
127
|
+
return {
|
|
128
|
+
content: [{
|
|
129
|
+
type: 'text',
|
|
130
|
+
text: responseText,
|
|
131
|
+
}],
|
|
132
|
+
};
|
|
133
|
+
}
|
|
134
|
+
catch (error) {
|
|
135
|
+
if (error instanceof types_1.MCPError) {
|
|
136
|
+
return {
|
|
137
|
+
content: [{ type: 'text', text: error.message }],
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
logger_1.logger.error('Batch import error', {
|
|
141
|
+
error: error instanceof Error ? error.stack : String(error),
|
|
142
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
143
|
+
});
|
|
144
|
+
return {
|
|
145
|
+
content: [{
|
|
146
|
+
type: 'text',
|
|
147
|
+
text: `Failed to import tasks: ${error instanceof Error ? error.message : String(error)}`,
|
|
148
|
+
}],
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=batch-import.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"batch-import.js","sourceRoot":"","sources":["../../src/tools/batch-import.ts"],"names":[],"mappings":";;AAmBA,0DA2KC;AA9LD,6BAAwB;AAIxB,4CAAyC;AACzC,oCAA+C;AAC/C,sEAA+D;AAC/D,+DAA4D;AAC5D,yEAAsE;AACtE,6FAA6G;AAC7G,kDAA8F;AAE9F,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B;;;yEAGyE;AAEzE,SAAgB,uBAAuB,CAAC,MAAiB,EAAE,WAAwB,EAAE,cAAqC;IACxH,MAAM,CAAC,IAAI,CACT,sBAAsB,EACtB,IAAA,4BAAgB,EACd,sBAAsB,EACtB,uFAAuF,CACxF,EACD;QACE,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE;QACrB,MAAM,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC/B,IAAI,EAAE,OAAC,CAAC,MAAM,EAAE;QAChB,UAAU,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;QAClC,MAAM,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;KAC/B,EACD,IAAA,8BAAkB,EAAC,sBAAsB,CAAC,EAC1C,KAAK,EAAE,IAAI,EAAE,EAAE;QACb,IAAI,CAAC;YACH,eAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE;gBACrC,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YAEH,uBAAuB;YACvB,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,EAAE,CAAC;gBACnC,MAAM,IAAI,gBAAQ,CAChB,iBAAS,CAAC,aAAa,EACvB,iEAAiE,CAClE,CAAC;YACJ,CAAC;YAED,gEAAgE;YAChE,6DAA6D;YAC7D,gDAAgD;YAChD,IAAA,8BAAkB,EAAC,sBAAsB,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;YAEvF,MAAM,iBAAiB,GAAG,IAAI,2DAA4B,EAAE,CAAC;YAE7D,mBAAmB;YACnB,MAAM,YAAY,GAAG;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,GAAG,CAAC,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;aACJ,CAAC;YAEpE,MAAM,KAAK,GAAG,IAAA,mCAAc,EAAC,YAAY,CAAC,CAAC;YAE3C,iBAAiB;YACjB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,gBAAQ,CAAC,iBAAS,CAAC,gBAAgB,EAAE,gCAAgC,CAAC,CAAC;YACnF,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;gBAClC,MAAM,IAAI,gBAAQ,CAChB,iBAAS,CAAC,gBAAgB,EAC1B,uCAAuC,cAAc,wDAAwD,CAC9G,CAAC;YACJ,CAAC;YAED,iBAAiB;YACjB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,OAAO;oBACL,OAAO,EAAE,CAAC;4BACR,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,0BAA0B,KAAK,CAAC,MAAM,yBAAyB;yBACtE,CAAC;iBACH,CAAC;YACJ,CAAC;YAED,sBAAsB;YACtB,MAAM,cAAc,GAAG,IAAI,+BAAc,EAAE,CAAC;YAC5C,MAAM,mBAAmB,GAAG,IAAI,yCAAmB,EAAE,CAAC;YAEtD,sCAAsC;YACtC,MAAM,YAAY,GAAG,MAAM,cAAc,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;YACvE,MAAM,EAAE,wBAAwB,EAAE,GAAG,YAAY,CAAC;YAElD,gBAAgB;YAChB,MAAM,MAAM,GAAiB;gBAC3B,OAAO,EAAE,CAAC;gBACV,MAAM,EAAE,CAAC;gBACT,MAAM,EAAE,EAAE;gBACV,YAAY,EAAE,EAAE;aACjB,CAAC;YAEF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,IAAI;oBAAE,SAAS;gBAEpB,IAAI,CAAC;oBACH,MAAM,cAAc,GAAG,MAAM,mBAAmB,CAAC,UAAU,CACzD,IAAI,EACJ,IAAI,CAAC,SAAS,EACd,WAAW,EACX,YAAY,EACZ,IAAI,CAAC,UAAU,KAAK,IAAI,CACzB,CAAC;oBAEF,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;wBAC3B,MAAM,CAAC,OAAO,EAAE,CAAC;wBACjB,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC;4BAC1B,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC;gCACvB,EAAE,EAAE,cAAc,CAAC,MAAM;gCACzB,KAAK,EAAE,cAAc,CAAC,KAAK;6BAC5B,CAAC,CAAC;wBACL,CAAC;wBAED,IAAI,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,CAAC;4BACpC,IAAI,CAAC,MAAM,CAAC,QAAQ;gCAAE,MAAM,CAAC,QAAQ,GAAG,EAAE,CAAC;4BAC3C,cAAc,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;gCAC1C,CAAC,MAAM,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;oCAC3B,MAAM,EAAE,cAAc,CAAC,MAAM,IAAI,CAAC;oCAClC,KAAK,EAAE,cAAc,CAAC,KAAK;oCAC3B,OAAO;iCACR,CAAC,CAAC;4BACL,CAAC,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,MAAM,EAAE,CAAC;wBAChB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;4BACjB,KAAK,EAAE,CAAC;4BACR,KAAK,EAAE,IAAI,CAAC,KAAK;4BACjB,KAAK,EAAE,cAAc,CAAC,KAAK,IAAI,eAAe;yBAC/C,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,MAAM,CAAC,MAAM,EAAE,CAAC;oBAChB,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;wBACjB,KAAK,EAAE,CAAC;wBACR,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;qBAChE,CAAC,CAAC;oBAEH,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;wBACrB,MAAM,KAAK,CAAC;oBACd,CAAC;gBACH,CAAC;YACH,CAAC;YAED,6BAA6B;YAC7B,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC9E,MAAM,YAAY,GAAG,iBAAiB,CAAC,YAAY,CAAC,MAAM,EAAE,wBAAwB,EAAE,YAAY,CAAC,CAAC;YAEpG,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,YAAY;qBACnB,CAAC;aACH,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,KAAK,YAAY,gBAAQ,EAAE,CAAC;gBAC9B,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;iBACjD,CAAC;YACJ,CAAC;YAED,eAAM,CAAC,KAAK,CAAC,oBAAoB,EAAE;gBACjC,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;gBAC3D,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;aAClE,CAAC,CAAC;YAEH,OAAO;gBACL,OAAO,EAAE,CAAC;wBACR,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,2BAA2B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;qBAC1F,CAAC;aACH,CAAC;QACJ,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CalDAV Token Management Tool
|
|
3
|
+
*
|
|
4
|
+
* Manages the current user's Vikunja CalDAV tokens (`GET/PUT
|
|
5
|
+
* /user/settings/token/caldav`, `DELETE /user/settings/token/caldav/{id}`
|
|
6
|
+
* per the vendored OpenAPI spec, docs/vikunja-openapi.json). These tokens
|
|
7
|
+
* authenticate third-party CalDAV clients against Vikunja's CalDAV
|
|
8
|
+
* interface — a separate credential from both JWT sessions and the
|
|
9
|
+
* `/tokens` API tokens managed by `vikunja_tokens`.
|
|
10
|
+
*
|
|
11
|
+
* Reserved behind the deny-by-default `caldavTokens` module config key (see
|
|
12
|
+
* src/config/types.ts DANGEROUS_MODULE_KEYS) because it is credential-
|
|
13
|
+
* adjacent: an operator must explicitly opt in before an AI assistant can
|
|
14
|
+
* mint or revoke CalDAV tokens for the connected account.
|
|
15
|
+
*
|
|
16
|
+
* Unlike `tokenManagement`, every `/user/settings/token/caldav*` operation
|
|
17
|
+
* in the vendored spec is scoped `security: [{"JWTKeyAuth": []}]` only (no
|
|
18
|
+
* `APIKeyAuth` entry) — the same JWT-only pattern as `/user/export*` and the
|
|
19
|
+
* other `/user/settings/*` endpoints. Registration therefore composes the
|
|
20
|
+
* `caldavTokens` module gate with the same JWT-authenticated check used for
|
|
21
|
+
* `vikunja_users`/`vikunja_export_*`/`vikunja_admin` (see
|
|
22
|
+
* src/tools/index.ts), rather than registering unconditionally like
|
|
23
|
+
* `vikunja_tokens` does.
|
|
24
|
+
*
|
|
25
|
+
* `create`'s response includes the token's secret value exactly once — per
|
|
26
|
+
* the spec's own description ("It is not possible to see the token again
|
|
27
|
+
* after it was generated") — surfaced the same way `vikunja_tokens create`
|
|
28
|
+
* surfaces a new API token's secret: a clear "store this now" note.
|
|
29
|
+
*/
|
|
30
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
31
|
+
import type { AuthManager } from '../auth/AuthManager';
|
|
32
|
+
import type { VikunjaClientFactory } from '../client/VikunjaClientFactory';
|
|
33
|
+
/**
|
|
34
|
+
* `user.Token` per the OpenAPI spec. `token` (the actual secret value) is
|
|
35
|
+
* only ever present in the `create` response — the `list` response only
|
|
36
|
+
* ever returns `id`/`created` (per the spec's own summary: "Return the IDs
|
|
37
|
+
* and created dates of all caldav tokens for the current user").
|
|
38
|
+
*/
|
|
39
|
+
export interface CaldavToken {
|
|
40
|
+
id?: number;
|
|
41
|
+
created?: string;
|
|
42
|
+
token?: string;
|
|
43
|
+
}
|
|
44
|
+
export declare function registerCaldavTokensTool(server: McpServer, authManager: AuthManager, _clientFactory?: VikunjaClientFactory): void;
|
|
45
|
+
//# sourceMappingURL=caldav-tokens.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caldav-tokens.d.ts","sourceRoot":"","sources":["../../src/tools/caldav-tokens.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAQ3E;;;;;GAKG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,SAAS,EACjB,WAAW,EAAE,WAAW,EACxB,cAAc,CAAC,EAAE,oBAAoB,GACpC,IAAI,CAyHN"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* CalDAV Token Management Tool
|
|
4
|
+
*
|
|
5
|
+
* Manages the current user's Vikunja CalDAV tokens (`GET/PUT
|
|
6
|
+
* /user/settings/token/caldav`, `DELETE /user/settings/token/caldav/{id}`
|
|
7
|
+
* per the vendored OpenAPI spec, docs/vikunja-openapi.json). These tokens
|
|
8
|
+
* authenticate third-party CalDAV clients against Vikunja's CalDAV
|
|
9
|
+
* interface — a separate credential from both JWT sessions and the
|
|
10
|
+
* `/tokens` API tokens managed by `vikunja_tokens`.
|
|
11
|
+
*
|
|
12
|
+
* Reserved behind the deny-by-default `caldavTokens` module config key (see
|
|
13
|
+
* src/config/types.ts DANGEROUS_MODULE_KEYS) because it is credential-
|
|
14
|
+
* adjacent: an operator must explicitly opt in before an AI assistant can
|
|
15
|
+
* mint or revoke CalDAV tokens for the connected account.
|
|
16
|
+
*
|
|
17
|
+
* Unlike `tokenManagement`, every `/user/settings/token/caldav*` operation
|
|
18
|
+
* in the vendored spec is scoped `security: [{"JWTKeyAuth": []}]` only (no
|
|
19
|
+
* `APIKeyAuth` entry) — the same JWT-only pattern as `/user/export*` and the
|
|
20
|
+
* other `/user/settings/*` endpoints. Registration therefore composes the
|
|
21
|
+
* `caldavTokens` module gate with the same JWT-authenticated check used for
|
|
22
|
+
* `vikunja_users`/`vikunja_export_*`/`vikunja_admin` (see
|
|
23
|
+
* src/tools/index.ts), rather than registering unconditionally like
|
|
24
|
+
* `vikunja_tokens` does.
|
|
25
|
+
*
|
|
26
|
+
* `create`'s response includes the token's secret value exactly once — per
|
|
27
|
+
* the spec's own description ("It is not possible to see the token again
|
|
28
|
+
* after it was generated") — surfaced the same way `vikunja_tokens create`
|
|
29
|
+
* surfaces a new API token's secret: a clear "store this now" note.
|
|
30
|
+
*/
|
|
31
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
32
|
+
exports.registerCaldavTokensTool = registerCaldavTokensTool;
|
|
33
|
+
const zod_1 = require("zod");
|
|
34
|
+
const types_1 = require("../types");
|
|
35
|
+
const logger_1 = require("../utils/logger");
|
|
36
|
+
const validation_1 = require("../utils/validation");
|
|
37
|
+
const response_factory_1 = require("../utils/response-factory");
|
|
38
|
+
const vikunja_rest_1 = require("../utils/vikunja-rest");
|
|
39
|
+
const read_only_1 = require("../utils/read-only");
|
|
40
|
+
function registerCaldavTokensTool(server, authManager, _clientFactory) {
|
|
41
|
+
server.tool('vikunja_caldav_tokens', (0, read_only_1.withReadOnlyNote)('vikunja_caldav_tokens', "Manage the current user's Vikunja CalDAV tokens (list, create, delete) — separate credentials from API tokens (vikunja_tokens), used to authenticate third-party CalDAV clients against Vikunja's CalDAV interface. Reserved/deny-by-default: only registered when the 'caldavTokens' module config key is explicitly enabled AND the session is JWT-authenticated (the underlying endpoints are JWT-only per the OpenAPI spec). A newly-created token's secret value is only ever returned once, in the 'create' response — it cannot be retrieved again afterwards."), {
|
|
42
|
+
subcommand: zod_1.z.enum(['list', 'create', 'delete']),
|
|
43
|
+
// delete
|
|
44
|
+
tokenId: zod_1.z.number().int().positive().optional(),
|
|
45
|
+
}, (0, read_only_1.getToolAnnotations)('vikunja_caldav_tokens'), async (args) => {
|
|
46
|
+
if (!authManager.isAuthenticated()) {
|
|
47
|
+
throw new types_1.MCPError(types_1.ErrorCode.AUTH_REQUIRED, 'Authentication required. Please use vikunja_auth.connect first.');
|
|
48
|
+
}
|
|
49
|
+
const subcommand = args.subcommand;
|
|
50
|
+
(0, read_only_1.assertWriteAllowed)('vikunja_caldav_tokens', subcommand);
|
|
51
|
+
logger_1.logger.debug('CalDAV tokens tool called', { subcommand });
|
|
52
|
+
try {
|
|
53
|
+
switch (subcommand) {
|
|
54
|
+
case 'list': {
|
|
55
|
+
const tokens = (await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', '/user/settings/token/caldav')) ?? [];
|
|
56
|
+
logger_1.logger.info('Listed CalDAV tokens', { count: tokens.length });
|
|
57
|
+
const aorpResult = (0, response_factory_1.createAorpResponse)('list', `Retrieved ${tokens.length} CalDAV tokens`, { tokens }, { success: true, metadata: { count: tokens.length } });
|
|
58
|
+
return { content: [{ type: 'text', text: aorpResult.content }] };
|
|
59
|
+
}
|
|
60
|
+
case 'create': {
|
|
61
|
+
const token = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'PUT', '/user/settings/token/caldav');
|
|
62
|
+
logger_1.logger.info('Created CalDAV token', { tokenId: token.id });
|
|
63
|
+
const aorpResult = (0, response_factory_1.createAorpResponse)('create', 'CalDAV token created successfully. Its secret value is shown only now and cannot be retrieved again — store this now, in a password manager or your CalDAV client, before it is lost.', { token }, { success: true, metadata: { count: 1 } });
|
|
64
|
+
return { content: [{ type: 'text', text: aorpResult.content }] };
|
|
65
|
+
}
|
|
66
|
+
case 'delete': {
|
|
67
|
+
const tokenId = (0, validation_1.validateAndConvertId)(args.tokenId, 'tokenId');
|
|
68
|
+
await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'DELETE', `/user/settings/token/caldav/${tokenId}`);
|
|
69
|
+
logger_1.logger.info('Deleted CalDAV token', { tokenId });
|
|
70
|
+
const aorpResult = (0, response_factory_1.createAorpResponse)('delete', `CalDAV token ${tokenId} deleted successfully`, { tokenId }, { success: true, metadata: { count: 1 } });
|
|
71
|
+
return { content: [{ type: 'text', text: aorpResult.content }] };
|
|
72
|
+
}
|
|
73
|
+
default:
|
|
74
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, `Unknown subcommand: ${subcommand}`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
logger_1.logger.error('CalDAV token operation failed', { error, subcommand });
|
|
79
|
+
if (error instanceof types_1.MCPError) {
|
|
80
|
+
const statusCode = error.details?.statusCode;
|
|
81
|
+
if (statusCode === 401 || statusCode === 403) {
|
|
82
|
+
throw new types_1.MCPError(types_1.ErrorCode.API_ERROR, 'CalDAV token management was rejected by the server. Per docs/VIKUNJA_API_ISSUES.md, user-scoped endpoints have historically required JWT authentication — try reconnecting with a JWT via vikunja_auth.connect.');
|
|
83
|
+
}
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
if (error instanceof Error) {
|
|
87
|
+
throw new types_1.MCPError(types_1.ErrorCode.API_ERROR, `CalDAV token operation failed: ${error.message}`);
|
|
88
|
+
}
|
|
89
|
+
throw new types_1.MCPError(types_1.ErrorCode.INTERNAL_ERROR, 'An unexpected error occurred during CalDAV token operation');
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=caldav-tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"caldav-tokens.js","sourceRoot":"","sources":["../../src/tools/caldav-tokens.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Export Tool
|
|
3
|
+
* Handles exporting project data from Vikunja
|
|
4
|
+
*
|
|
5
|
+
* @warning Memory Usage: The export functionality loads entire project hierarchies
|
|
6
|
+
* into memory. For very large projects with thousands of tasks or deeply nested
|
|
7
|
+
* child projects, this could consume significant memory. Consider implementing
|
|
8
|
+
* pagination or streaming for production use with large datasets.
|
|
9
|
+
*/
|
|
10
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
11
|
+
import type { AuthManager } from '../auth/AuthManager';
|
|
12
|
+
import type { VikunjaClientFactory } from '../client/VikunjaClientFactory';
|
|
13
|
+
export declare function registerExportTool(server: McpServer, authManager: AuthManager, _clientFactory?: VikunjaClientFactory): void;
|
|
14
|
+
//# sourceMappingURL=export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/tools/export.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAyJ3E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,cAAc,CAAC,EAAE,oBAAoB,GAAG,IAAI,CAoQ3H"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Export Tool
|
|
4
|
+
* Handles exporting project data from Vikunja
|
|
5
|
+
*
|
|
6
|
+
* @warning Memory Usage: The export functionality loads entire project hierarchies
|
|
7
|
+
* into memory. For very large projects with thousands of tasks or deeply nested
|
|
8
|
+
* child projects, this could consume significant memory. Consider implementing
|
|
9
|
+
* pagination or streaming for production use with large datasets.
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.registerExportTool = registerExportTool;
|
|
13
|
+
const zod_1 = require("zod");
|
|
14
|
+
const types_1 = require("../types");
|
|
15
|
+
const response_factory_1 = require("../utils/response-factory");
|
|
16
|
+
const logger_1 = require("../utils/logger");
|
|
17
|
+
const validation_1 = require("../utils/validation");
|
|
18
|
+
const vikunja_rest_1 = require("../utils/vikunja-rest");
|
|
19
|
+
const read_only_1 = require("../utils/read-only");
|
|
20
|
+
/**
|
|
21
|
+
* Recursively exports a project and its children.
|
|
22
|
+
*
|
|
23
|
+
* All calls go through the direct-REST helper (`vikunjaRestRequest`). This
|
|
24
|
+
* function deliberately keeps the documented O(depth) refetch shape (one
|
|
25
|
+
* `GET /projects` per recursion level to re-derive that level's children) —
|
|
26
|
+
* that inefficiency is a pre-existing, documented tradeoff, not something
|
|
27
|
+
* this transport migration is meant to fix.
|
|
28
|
+
*/
|
|
29
|
+
async function exportProjectRecursive(authManager, projectId, includeChildren = false, visitedIds = new Set()) {
|
|
30
|
+
// Prevent infinite recursion
|
|
31
|
+
if (visitedIds.has(projectId)) {
|
|
32
|
+
throw new types_1.MCPError(types_1.ErrorCode.INTERNAL_ERROR, 'Circular reference detected in project hierarchy');
|
|
33
|
+
}
|
|
34
|
+
visitedIds.add(projectId);
|
|
35
|
+
// Get project details
|
|
36
|
+
const project = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', `/projects/${projectId}`);
|
|
37
|
+
if (!project) {
|
|
38
|
+
throw new types_1.MCPError(types_1.ErrorCode.NOT_FOUND, `Project with ID ${projectId} not found`);
|
|
39
|
+
}
|
|
40
|
+
// Get all tasks for the project. NOTE: `GET /projects/{id}/tasks` is not
|
|
41
|
+
// present in the vendored OpenAPI spec (only `PUT` is documented there) —
|
|
42
|
+
// this mirrors the legacy client's own `getProjectTasks`, which calls this same
|
|
43
|
+
// undocumented-but-functional path. Preserved as-is per this migration's
|
|
44
|
+
// "transport only, same behavior" scope.
|
|
45
|
+
const tasks = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', `/projects/${projectId}/tasks`);
|
|
46
|
+
// Get all labels used in the project
|
|
47
|
+
const labelIds = new Set();
|
|
48
|
+
tasks.forEach((task) => {
|
|
49
|
+
if (task.labels && Array.isArray(task.labels)) {
|
|
50
|
+
task.labels.forEach((label) => {
|
|
51
|
+
if (label.id) {
|
|
52
|
+
labelIds.add(label.id);
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
// Fetch full label details. GET /labels/{id} per the OpenAPI spec.
|
|
58
|
+
const labels = [];
|
|
59
|
+
for (const labelId of labelIds) {
|
|
60
|
+
try {
|
|
61
|
+
const label = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', `/labels/${labelId}`);
|
|
62
|
+
if (label) {
|
|
63
|
+
labels.push(label);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
// Label might have been deleted, skip it
|
|
68
|
+
logger_1.logger.warn(`Failed to fetch label ${labelId}:`, error);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// Build export data
|
|
72
|
+
const exportData = {
|
|
73
|
+
project,
|
|
74
|
+
tasks,
|
|
75
|
+
labels,
|
|
76
|
+
exported_at: new Date().toISOString(),
|
|
77
|
+
version: '1.0.0',
|
|
78
|
+
};
|
|
79
|
+
// Export child projects if requested
|
|
80
|
+
if (includeChildren && project.id) {
|
|
81
|
+
const allProjects = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', '/projects');
|
|
82
|
+
const childProjects = allProjects.filter((p) => p.parent_project_id === project.id);
|
|
83
|
+
if (childProjects.length > 0) {
|
|
84
|
+
exportData.child_projects = [];
|
|
85
|
+
for (const child of childProjects) {
|
|
86
|
+
if (child.id) {
|
|
87
|
+
const childExport = await exportProjectRecursive(authManager, child.id, true, new Set(visitedIds));
|
|
88
|
+
exportData.child_projects.push(childExport);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return exportData;
|
|
94
|
+
}
|
|
95
|
+
// Schema definitions
|
|
96
|
+
function registerExportTool(server, authManager, _clientFactory) {
|
|
97
|
+
// Export project data
|
|
98
|
+
server.tool('vikunja_export_project', (0, read_only_1.withReadOnlyNote)('vikunja_export_project', 'Export project data including tasks, labels, and metadata in structured format'), {
|
|
99
|
+
projectId: zod_1.z.number().int().positive(),
|
|
100
|
+
includeChildren: zod_1.z.boolean().optional().default(false),
|
|
101
|
+
}, (0, read_only_1.getToolAnnotations)('vikunja_export_project'), async (args) => {
|
|
102
|
+
if (!authManager.isAuthenticated()) {
|
|
103
|
+
throw new types_1.MCPError(types_1.ErrorCode.AUTH_REQUIRED, 'Authentication required. Please use vikunja_auth.connect first.');
|
|
104
|
+
}
|
|
105
|
+
// Export operations require JWT authentication
|
|
106
|
+
if (authManager.getAuthType() !== 'jwt') {
|
|
107
|
+
throw new types_1.MCPError(types_1.ErrorCode.PERMISSION_DENIED, 'Export operations require JWT authentication. Please reconnect using vikunja_auth.connect with JWT authentication.');
|
|
108
|
+
}
|
|
109
|
+
// No subcommand field on this single-purpose tool — 'export' is its
|
|
110
|
+
// fixed classification-table key (GET-only, always 'read').
|
|
111
|
+
(0, read_only_1.assertWriteAllowed)('vikunja_export_project', 'export');
|
|
112
|
+
try {
|
|
113
|
+
const { projectId, includeChildren } = args;
|
|
114
|
+
(0, validation_1.validateId)(projectId, 'projectId');
|
|
115
|
+
// Export the project data
|
|
116
|
+
const exportData = await exportProjectRecursive(authManager, projectId, includeChildren);
|
|
117
|
+
// Format the output as JSON
|
|
118
|
+
const formattedData = JSON.stringify(exportData, null, 2);
|
|
119
|
+
const response = (0, types_1.createStandardResponse)('success', 'Project exported successfully', {
|
|
120
|
+
project_id: projectId,
|
|
121
|
+
project_title: exportData.project.title,
|
|
122
|
+
task_count: exportData.tasks.length,
|
|
123
|
+
label_count: exportData.labels.length,
|
|
124
|
+
child_project_count: exportData.child_projects?.length || 0,
|
|
125
|
+
export_size_bytes: Buffer.byteLength(formattedData, 'utf8'),
|
|
126
|
+
exported_at: exportData.exported_at,
|
|
127
|
+
data: exportData,
|
|
128
|
+
});
|
|
129
|
+
return {
|
|
130
|
+
content: [
|
|
131
|
+
{
|
|
132
|
+
type: 'text',
|
|
133
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(response),
|
|
134
|
+
},
|
|
135
|
+
],
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
// MCP validates schema before calling handler, so this is unreachable
|
|
140
|
+
/* istanbul ignore if */
|
|
141
|
+
if (error instanceof zod_1.z.ZodError) {
|
|
142
|
+
/* istanbul ignore next 4 */
|
|
143
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, `Invalid parameters: ${error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ')}`);
|
|
144
|
+
}
|
|
145
|
+
throw error;
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
// Request user data export
|
|
149
|
+
server.tool('vikunja_request_user_export', (0, read_only_1.withReadOnlyNote)('vikunja_request_user_export', 'Request a complete export of user data for privacy and backup purposes. This calls POST /user/export/request, which asks the Vikunja server to start preparing the export; it returns only a confirmation message, not the export itself. Use vikunja_download_user_export afterwards to confirm the export is ready.'), {
|
|
150
|
+
password: zod_1.z.string().min(1),
|
|
151
|
+
}, (0, read_only_1.getToolAnnotations)('vikunja_request_user_export'), async (args) => {
|
|
152
|
+
try {
|
|
153
|
+
const { password } = args;
|
|
154
|
+
if (!authManager.getSession().apiToken) {
|
|
155
|
+
throw new types_1.MCPError(types_1.ErrorCode.AUTH_REQUIRED, 'No authentication token available');
|
|
156
|
+
}
|
|
157
|
+
// No subcommand field on this single-purpose tool — 'request' is
|
|
158
|
+
// its fixed classification-table key.
|
|
159
|
+
(0, read_only_1.assertWriteAllowed)('vikunja_request_user_export', 'request');
|
|
160
|
+
const result = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'POST', '/user/export/request', { password });
|
|
161
|
+
const response = (0, types_1.createStandardResponse)('success', 'User data export requested successfully. You will receive an email when the export is ready.', { serverMessage: result?.message ?? null });
|
|
162
|
+
return {
|
|
163
|
+
content: [
|
|
164
|
+
{
|
|
165
|
+
type: 'text',
|
|
166
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(response),
|
|
167
|
+
},
|
|
168
|
+
],
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
// MCP validates schema before calling handler, so this is unreachable
|
|
173
|
+
/* istanbul ignore if */
|
|
174
|
+
if (error instanceof zod_1.z.ZodError) {
|
|
175
|
+
/* istanbul ignore next 4 */
|
|
176
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, `Invalid parameters: ${error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ')}`);
|
|
177
|
+
}
|
|
178
|
+
throw error;
|
|
179
|
+
}
|
|
180
|
+
});
|
|
181
|
+
// Confirm delivery of a previously requested user data export
|
|
182
|
+
server.tool('vikunja_download_user_export', (0, read_only_1.withReadOnlyNote)('vikunja_download_user_export', "Confirm that a previously requested user data export is ready on the server. IMPORTANT: per the Vikunja API spec, POST /user/export/download returns only a confirmation message (models.Message: { message }) — it does NOT return the export archive's contents, and there is no separate JSON endpoint that does. The MCP protocol also has no binary/file-attachment support, so the exported .zip cannot be retrieved through this tool under any circumstances. To obtain the actual file, download it directly from the Vikunja web UI (Settings > Export Data) or with a direct HTTP client using the same credentials."), {
|
|
183
|
+
password: zod_1.z.string().min(1),
|
|
184
|
+
}, (0, read_only_1.getToolAnnotations)('vikunja_download_user_export'), async (args) => {
|
|
185
|
+
try {
|
|
186
|
+
const { password } = args;
|
|
187
|
+
if (!authManager.getSession().apiToken) {
|
|
188
|
+
throw new types_1.MCPError(types_1.ErrorCode.AUTH_REQUIRED, 'No authentication token available');
|
|
189
|
+
}
|
|
190
|
+
// No subcommand field on this single-purpose tool — 'download' is
|
|
191
|
+
// its fixed classification-table key (confirmation-only, no new
|
|
192
|
+
// state created — see DOWNLOAD_USER_EXPORT's rationale comment in
|
|
193
|
+
// src/utils/read-only.ts).
|
|
194
|
+
(0, read_only_1.assertWriteAllowed)('vikunja_download_user_export', 'download');
|
|
195
|
+
const result = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'POST', '/user/export/download', { password });
|
|
196
|
+
const response = (0, types_1.createStandardResponse)('success', 'The server confirmed the export download request. The Vikunja API does not return the export file itself through this endpoint, and the MCP protocol cannot deliver binary attachments — retrieve the exported archive from the Vikunja web UI or a direct API client instead.', {
|
|
197
|
+
serverMessage: result?.message ?? null,
|
|
198
|
+
fileDeliveredThroughThisTool: false,
|
|
199
|
+
});
|
|
200
|
+
return {
|
|
201
|
+
content: [
|
|
202
|
+
{
|
|
203
|
+
type: 'text',
|
|
204
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(response),
|
|
205
|
+
},
|
|
206
|
+
],
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
// MCP validates schema before calling handler, so this is unreachable
|
|
211
|
+
/* istanbul ignore if */
|
|
212
|
+
if (error instanceof zod_1.z.ZodError) {
|
|
213
|
+
/* istanbul ignore next 4 */
|
|
214
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, `Invalid parameters: ${error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ')}`);
|
|
215
|
+
}
|
|
216
|
+
throw error;
|
|
217
|
+
}
|
|
218
|
+
});
|
|
219
|
+
// Check the status of a previously requested user data export
|
|
220
|
+
server.tool('vikunja_user_export_status', (0, read_only_1.withReadOnlyNote)('vikunja_user_export_status', 'Check whether a previously requested user data export is ready, and when. Calls GET /user/export, which returns models.UserExportStatus — id, created (when the export was generated), expires (when it will be purged), and size (bytes) — as JSON, not the export archive itself. Completes the request -> status -> download trio: use vikunja_request_user_export to start preparing an export, this tool to check whether/when it finished, and vikunja_download_user_export to confirm it is ready before retrieving the actual file from the Vikunja web UI or a direct API client (MCP has no binary-attachment support).'), {}, (0, read_only_1.getToolAnnotations)('vikunja_user_export_status'), async () => {
|
|
221
|
+
try {
|
|
222
|
+
if (!authManager.getSession().apiToken) {
|
|
223
|
+
throw new types_1.MCPError(types_1.ErrorCode.AUTH_REQUIRED, 'No authentication token available');
|
|
224
|
+
}
|
|
225
|
+
// No subcommand field on this single-purpose tool — 'status' is
|
|
226
|
+
// its fixed classification-table key (GET-only, always 'read').
|
|
227
|
+
(0, read_only_1.assertWriteAllowed)('vikunja_user_export_status', 'status');
|
|
228
|
+
const status = await (0, vikunja_rest_1.vikunjaRestRequest)(authManager, 'GET', '/user/export');
|
|
229
|
+
const response = (0, types_1.createStandardResponse)('success', status
|
|
230
|
+
? 'Retrieved the current user data export status.'
|
|
231
|
+
: 'No user data export has been requested yet, or the server returned no status.', { status: status ?? null });
|
|
232
|
+
return {
|
|
233
|
+
content: [
|
|
234
|
+
{
|
|
235
|
+
type: 'text',
|
|
236
|
+
text: (0, response_factory_1.formatAorpAsMarkdown)(response),
|
|
237
|
+
},
|
|
238
|
+
],
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
catch (error) {
|
|
242
|
+
// MCP validates schema before calling handler, so this is unreachable
|
|
243
|
+
/* istanbul ignore if */
|
|
244
|
+
if (error instanceof zod_1.z.ZodError) {
|
|
245
|
+
/* istanbul ignore next 4 */
|
|
246
|
+
throw new types_1.MCPError(types_1.ErrorCode.VALIDATION_ERROR, `Invalid parameters: ${error.errors.map((e) => `${e.path.join('.')}: ${e.message}`).join(', ')}`);
|
|
247
|
+
}
|
|
248
|
+
throw error;
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/tools/export.ts"],"names":[],"mappings":"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"}
|