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,207 @@
|
|
|
1
|
+
# Registering vikunja-mcp-ng with Docker Desktop's MCP Toolkit
|
|
2
|
+
|
|
3
|
+
This is an honest, tested-on-this-machine how-to for running `vikunja-mcp-ng`
|
|
4
|
+
through Docker Desktop's MCP Toolkit (`docker mcp` CLI / `docker/mcp-gateway`)
|
|
5
|
+
rather than as a bare `docker run -i` wired into your client config. It was
|
|
6
|
+
verified against `docker mcp` CLI **v0.43.1** on macOS with Docker Desktop —
|
|
7
|
+
commands and flags may drift on other versions; re-check `docker mcp --help`
|
|
8
|
+
if something below doesn't match what you see.
|
|
9
|
+
|
|
10
|
+
## TL;DR feasibility verdict
|
|
11
|
+
|
|
12
|
+
**Full native catalog integration (`docker mcp catalog create --server
|
|
13
|
+
docker://<image>`) does not work for this image**, and won't for any plainly
|
|
14
|
+
Dockerfile-built stdio server: it requires what the CLI calls a
|
|
15
|
+
"self-describing image" — an image built and published through Docker's own
|
|
16
|
+
MCP catalog pipeline that embeds tool/resource metadata Docker can introspect
|
|
17
|
+
without running it. A normal `node:20-alpine` image with an `ENTRYPOINT`
|
|
18
|
+
(exactly what this project's `Dockerfile` produces) is rejected:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
$ docker mcp catalog create my-catalog:latest --server docker://ghcr.io/netadvanced/vikunja-mcp-ng:dev
|
|
22
|
+
failed to resolve image snapshot: failed to get catalog server from image:
|
|
23
|
+
image ghcr.io/netadvanced/vikunja-mcp-ng:dev is not a self-describing image
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
**The workaround that does work, verified end-to-end below: a hand-written
|
|
27
|
+
`catalog.yaml` fragment plus `docker mcp gateway run --catalog=...`.** This is
|
|
28
|
+
the same mechanism `docker mcp server init` scaffolds for brand-new servers
|
|
29
|
+
(see its generated `catalog.yaml`/`compose.yaml`) — it's not a hack, it's the
|
|
30
|
+
toolkit's own documented-by-example format for a catalog entry that doesn't
|
|
31
|
+
need image introspection. Docker's gateway runs the container itself
|
|
32
|
+
(`docker run --rm -i --init ...`), handles env/secret injection, and reports
|
|
33
|
+
the real tool list — this was confirmed against the live local Vikunja stack
|
|
34
|
+
(18 tools registered for an API-token session, matching a direct `docker run
|
|
35
|
+
-i` smoke test exactly).
|
|
36
|
+
|
|
37
|
+
If neither of those suit your client, the **closest, simplest workaround** is
|
|
38
|
+
skipping the Toolkit/gateway layer entirely and pointing your MCP client
|
|
39
|
+
straight at `docker run -i` — see [Fallback](#fallback-plain-docker-run-no-toolkit)
|
|
40
|
+
below. That's also the Docker path documented in the main
|
|
41
|
+
[README](../README.md#docker), since it needs no Docker Desktop MCP Toolkit
|
|
42
|
+
knowledge at all.
|
|
43
|
+
|
|
44
|
+
## Prerequisites
|
|
45
|
+
|
|
46
|
+
- Docker Desktop with the MCP Toolkit installed (`docker mcp --help` should
|
|
47
|
+
print a command list, not "unknown command").
|
|
48
|
+
- The image built locally (`docker build -t
|
|
49
|
+
ghcr.io/netadvanced/vikunja-mcp-ng:dev .` from the repo root — see the
|
|
50
|
+
[README](../README.md#docker)) or pulled from `ghcr.io` once it's
|
|
51
|
+
published.
|
|
52
|
+
- A Vikunja API token or JWT (see [CONFIGURATION.md](CONFIGURATION.md)).
|
|
53
|
+
|
|
54
|
+
## Option A (recommended): custom catalog.yaml + `docker mcp gateway run`
|
|
55
|
+
|
|
56
|
+
1. **Write a catalog fragment.** `scripts/install-docker-desktop-mcp.sh`
|
|
57
|
+
generates one for you — it only *prints* the fragment and the commands to
|
|
58
|
+
apply it; it does not touch your `~/.docker/mcp` directory on its own:
|
|
59
|
+
|
|
60
|
+
```bash
|
|
61
|
+
scripts/install-docker-desktop-mcp.sh ghcr.io/netadvanced/vikunja-mcp-ng:dev \
|
|
62
|
+
https://your-vikunja-instance.com/api/v1
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Or write it by hand — this is the exact shape verified working:
|
|
66
|
+
|
|
67
|
+
```yaml
|
|
68
|
+
# ~/.docker/mcp/catalogs/vikunja-mcp-ng.yaml
|
|
69
|
+
registry:
|
|
70
|
+
vikunja-mcp-ng:
|
|
71
|
+
description: MCP server for Vikunja task management (direct-REST, composite-first tools)
|
|
72
|
+
title: Vikunja MCP NG
|
|
73
|
+
type: server
|
|
74
|
+
image: ghcr.io/netadvanced/vikunja-mcp-ng:dev
|
|
75
|
+
secrets:
|
|
76
|
+
- name: vikunja-mcp-ng.api_token
|
|
77
|
+
env: VIKUNJA_API_TOKEN
|
|
78
|
+
example: tk_xxx
|
|
79
|
+
description: Vikunja API token (tk_...) or JWT (eyJ...)
|
|
80
|
+
env:
|
|
81
|
+
- name: VIKUNJA_URL
|
|
82
|
+
value: https://your-vikunja-instance.com/api/v1
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
`--catalog` (and `--additional-catalog`) require the file to resolve under
|
|
86
|
+
`~/.docker/mcp/catalogs/` — that's a hard constraint of the gateway, not a
|
|
87
|
+
suggestion.
|
|
88
|
+
|
|
89
|
+
2. **Store the token as a Docker Desktop secret** — never in the catalog
|
|
90
|
+
file, which is meant to be shareable/committable:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
echo "tk_your_real_token" | docker mcp secret set vikunja-mcp-ng.api_token
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
This lands in the local OS Keychain (`docker mcp secret ls` to confirm,
|
|
97
|
+
`docker mcp secret rm vikunja-mcp-ng.api_token` to remove it later).
|
|
98
|
+
|
|
99
|
+
3. **Verify** with a dry run (introspects tools, doesn't open a listener):
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
docker mcp gateway run \
|
|
103
|
+
--catalog=vikunja-mcp-ng.yaml \
|
|
104
|
+
--servers=vikunja-mcp-ng \
|
|
105
|
+
--transport=stdio \
|
|
106
|
+
--dry-run
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
Expected tail of output (18 tools for an API-token session — 21 total
|
|
110
|
+
tools exist, but `vikunja_users`/`vikunja_export` need a JWT session and
|
|
111
|
+
`vikunja_admin`/`vikunja_tokens` are deny-by-default modules; see
|
|
112
|
+
[CONFIGURATION.md#module-gating](CONFIGURATION.md#module-gating)):
|
|
113
|
+
|
|
114
|
+
```
|
|
115
|
+
- Listing MCP tools...
|
|
116
|
+
> vikunja-mcp-ng: (18 tools)
|
|
117
|
+
> 18 tools listed in ...
|
|
118
|
+
Dry run mode enabled, not starting the server.
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
4. **Run it for real** (drop `--dry-run`) and point your client at the
|
|
122
|
+
gateway process, or use `--port`/`--transport=streaming` if your client
|
|
123
|
+
speaks HTTP/SSE instead of stdio. For a stdio client (Claude Desktop,
|
|
124
|
+
Claude Code, etc.), configure the client to run the gateway command
|
|
125
|
+
itself instead of the raw image:
|
|
126
|
+
|
|
127
|
+
```json
|
|
128
|
+
{
|
|
129
|
+
"mcpServers": {
|
|
130
|
+
"vikunja": {
|
|
131
|
+
"command": "docker",
|
|
132
|
+
"args": [
|
|
133
|
+
"mcp", "gateway", "run",
|
|
134
|
+
"--catalog=vikunja-mcp-ng.yaml",
|
|
135
|
+
"--servers=vikunja-mcp-ng",
|
|
136
|
+
"--transport=stdio"
|
|
137
|
+
]
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
(Run `docker mcp gateway run` from `~/.docker/mcp/catalogs/` or pass the
|
|
144
|
+
catalog path with an explicit absolute path — the `--catalog` flag
|
|
145
|
+
resolves relative paths against that directory.)
|
|
146
|
+
|
|
147
|
+
## Fallback: plain `docker run`, no Toolkit
|
|
148
|
+
|
|
149
|
+
If the catalog-fragment route is more ceremony than you want, skip the
|
|
150
|
+
Toolkit entirely — this is exactly what was used for this project's own
|
|
151
|
+
Docker smoke test and needs nothing beyond Docker itself:
|
|
152
|
+
|
|
153
|
+
```json
|
|
154
|
+
{
|
|
155
|
+
"mcpServers": {
|
|
156
|
+
"vikunja": {
|
|
157
|
+
"command": "docker",
|
|
158
|
+
"args": [
|
|
159
|
+
"run", "-i", "--rm",
|
|
160
|
+
"-e", "VIKUNJA_URL",
|
|
161
|
+
"-e", "VIKUNJA_API_TOKEN",
|
|
162
|
+
"ghcr.io/netadvanced/vikunja-mcp-ng:latest"
|
|
163
|
+
],
|
|
164
|
+
"env": {
|
|
165
|
+
"VIKUNJA_URL": "https://your-vikunja-instance.com/api/v1",
|
|
166
|
+
"VIKUNJA_API_TOKEN": "tk_your_real_token"
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
This is the "from source"/Docker quick-start pattern from the main
|
|
174
|
+
[README](../README.md#quick-start), just with the client config spelled out
|
|
175
|
+
explicitly. No `docker mcp` CLI, no catalog file, no OS Keychain — the
|
|
176
|
+
tradeoff is the token lives in your client's config file in plaintext
|
|
177
|
+
(mitigate with `VIKUNJA_API_TOKEN_FILE` and a mounted secret file instead of
|
|
178
|
+
`VIKUNJA_API_TOKEN`, per [CONFIGURATION.md](CONFIGURATION.md#secrets-management)).
|
|
179
|
+
|
|
180
|
+
## What we didn't get working (and why)
|
|
181
|
+
|
|
182
|
+
- **`docker mcp catalog create ... --server docker://<image>`** — rejected
|
|
183
|
+
with "not a self-describing image" (see above). This appears to require
|
|
184
|
+
Docker's own image-build/publish pipeline for the official catalog
|
|
185
|
+
(`mcp/<name>` images on Docker Hub) to embed introspectable metadata;
|
|
186
|
+
nothing in the public `docker mcp --help` surface exposes a way to embed
|
|
187
|
+
that metadata into a third-party `Dockerfile`-built image ourselves.
|
|
188
|
+
- **`docker mcp catalog create --server file://...`** — takes a *whole
|
|
189
|
+
catalog* reference (another catalog's server entry), not a way to author
|
|
190
|
+
one server's metadata by hand; the `catalog.yaml` route above (which the
|
|
191
|
+
gateway reads directly via `--catalog`, no `catalog create` step at all)
|
|
192
|
+
is the documented-by-example path for that instead.
|
|
193
|
+
|
|
194
|
+
If a future `docker mcp` release adds a documented way to mark a
|
|
195
|
+
plain-Dockerfile image as catalog-eligible, prefer that over the workaround
|
|
196
|
+
above — re-run `docker mcp catalog create --server docker://<image> --help`
|
|
197
|
+
periodically (or watch the toolkit's release notes) to check.
|
|
198
|
+
|
|
199
|
+
## Cleanup
|
|
200
|
+
|
|
201
|
+
Everything above is additive to your local `~/.docker/mcp` state and fully
|
|
202
|
+
reversible:
|
|
203
|
+
|
|
204
|
+
```bash
|
|
205
|
+
rm ~/.docker/mcp/catalogs/vikunja-mcp-ng.yaml
|
|
206
|
+
docker mcp secret rm vikunja-mcp-ng.api_token
|
|
207
|
+
```
|
package/docs/TOOLS.md
ADDED
|
@@ -0,0 +1,422 @@
|
|
|
1
|
+
# Tool Reference
|
|
2
|
+
|
|
3
|
+
The complete subcommand-and-parameter reference for every tool
|
|
4
|
+
`vikunja-mcp-ng` registers, moved here from the README to keep that page
|
|
5
|
+
scannable. For narrated, verified end-to-end examples (what you'd say, the
|
|
6
|
+
exact tool call, what changes in the Vikunja UI), see
|
|
7
|
+
[docs/samples/](samples/) instead — this page is the flat parameter
|
|
8
|
+
reference.
|
|
9
|
+
|
|
10
|
+
Every entry below is checked against the current `src/tools/**` source, not
|
|
11
|
+
against memory or `node-vikunja`'s (removed) types — see
|
|
12
|
+
[ROADMAP.md §1](ROADMAP.md) pillar 2 and [ENDPOINT-PLAYBOOK.md §2](ENDPOINT-PLAYBOOK.md)
|
|
13
|
+
for why that distinction matters here. If code and this page ever disagree,
|
|
14
|
+
trust the code and file an issue.
|
|
15
|
+
|
|
16
|
+
Module gating, auth-type restrictions (JWT vs. API token), and deny-by-default
|
|
17
|
+
tools are explained in [CONFIGURATION.md#module-gating](CONFIGURATION.md#module-gating) —
|
|
18
|
+
this page notes *which* tools are affected, not the mechanism itself.
|
|
19
|
+
|
|
20
|
+
## Response format
|
|
21
|
+
|
|
22
|
+
Every tool returns a standardized envelope:
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
interface StandardResponse {
|
|
26
|
+
success: boolean;
|
|
27
|
+
operation: string; // The operation performed (e.g., 'create', 'update', 'list')
|
|
28
|
+
message?: string; // Human-readable description of the result
|
|
29
|
+
data?: any; // The primary data returned (task, project, label, etc.)
|
|
30
|
+
metadata?: {
|
|
31
|
+
timestamp: string; // ISO 8601 timestamp of the operation
|
|
32
|
+
[key: string]: any; // Additional operation-specific metadata
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**Success:**
|
|
38
|
+
```json
|
|
39
|
+
{
|
|
40
|
+
"success": true,
|
|
41
|
+
"operation": "create",
|
|
42
|
+
"message": "Task created successfully",
|
|
43
|
+
"data": { "id": 123, "title": "Complete documentation" },
|
|
44
|
+
"metadata": { "timestamp": "2025-05-25T12:00:00Z" }
|
|
45
|
+
}
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
**Error:**
|
|
49
|
+
```json
|
|
50
|
+
{
|
|
51
|
+
"success": false,
|
|
52
|
+
"operation": "update",
|
|
53
|
+
"message": "Task not found",
|
|
54
|
+
"error": { "code": "TASK_NOT_FOUND", "details": "No task exists with ID 999" }
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Authentication
|
|
59
|
+
|
|
60
|
+
- `vikunja_auth` - Authentication management
|
|
61
|
+
- `connect` - Initialize connection with API token. Performs a verification round trip before reporting success: an unauthenticated `GET /info` call validates the URL is reachable and returns the server version (surfaced as `serverVersion` in the response), then a cheap authenticated call validates the credential itself (`GET /user` for JWT sessions, `GET /projects?per_page=1` for API-token sessions, since `tk_*` tokens cannot use `/user` — see docs/VIKUNJA_API_ISSUES.md #2). If either step fails, the session is rolled back and a clear error is thrown instead of silently "succeeding" with a bad URL or token.
|
|
62
|
+
- `status` - Check authentication status
|
|
63
|
+
- `refresh` - Report token-refresh status: API tokens (`tk_*`) are long-lived and need no refresh; JWTs expire and must be replaced by reconnecting with a new token (Vikunja's token-refresh endpoint relies on a login cookie this server does not hold)
|
|
64
|
+
- `info` - Fetch the connected Vikunja server's `GET /info` payload (version, frontend URL, motd, enabled features, ...). Requires an active session.
|
|
65
|
+
|
|
66
|
+
## Task Management
|
|
67
|
+
|
|
68
|
+
- `vikunja_tasks` - Task operations
|
|
69
|
+
- `list` - List tasks with filters
|
|
70
|
+
- Filter by project or get all tasks
|
|
71
|
+
- Support for pagination, search, sorting
|
|
72
|
+
- Filter by completion status
|
|
73
|
+
- Apply saved filters with `filterId` parameter
|
|
74
|
+
- Cross-project listing (no `projectId`, or `allProjects: true`) calls the
|
|
75
|
+
documented `GET /tasks` endpoint directly (one call), falling back to
|
|
76
|
+
per-project aggregation only if that call fails
|
|
77
|
+
- `orderBy` (`'asc' | 'desc'`), `filterTimezone`, `filterIncludeNulls`,
|
|
78
|
+
and `expand` (`'subtasks' | 'buckets' | 'reactions' | 'comments'`, can
|
|
79
|
+
be repeated) are forwarded to `GET /tasks` for cross-project listing
|
|
80
|
+
- `create` - Create a new task
|
|
81
|
+
- Required: title, projectId
|
|
82
|
+
- Optional: description, dueDate, priority, labels, assignees
|
|
83
|
+
- Validates date format (ISO 8601) and IDs
|
|
84
|
+
- `get` - Get task details by ID
|
|
85
|
+
- `update` - Update existing task
|
|
86
|
+
- Supports partial updates (GET + merge before POST — Vikunja replaces the full model)
|
|
87
|
+
- Can update title, description, dueDate, priority, done status
|
|
88
|
+
- Can move tasks between projects with `projectId` (verified after update)
|
|
89
|
+
- Can update labels and assignees (uses efficient diff-based approach)
|
|
90
|
+
- `delete` - Delete a task by ID
|
|
91
|
+
- `assign` - Bulk assign users to tasks
|
|
92
|
+
- `unassign` - Remove users from tasks
|
|
93
|
+
- `list-assignees` - List a task's assignees via the dedicated `GET /tasks/{taskID}/assignees` endpoint
|
|
94
|
+
- Optional: `search` (username search, `s` query param), `page`, `perPage`
|
|
95
|
+
- `comment` - List or add comments to tasks
|
|
96
|
+
- `bulk-create` / `bulk-update` / `bulk-delete` - Bulk task operations (same underlying handlers as the standalone `vikunja_task_bulk` tool below)
|
|
97
|
+
- `bulk-update` required: taskIds array, field name, value. Supported fields: done, priority, due_date, project_id, assignees, labels. Uses per-task fetch+merge+update (does not call Vikunja's native bulk API, which can wipe omitted fields). ⚠️ O(n) get+update calls.
|
|
98
|
+
- `bulk-delete` required: taskIds array. Returns deleted task details for confirmation; handles partial failures gracefully. ⚠️ Makes individual delete calls per task — batch in groups of 20 or fewer.
|
|
99
|
+
- `attach` - Upload a file attachment to a task (`filePath` or base64 `fileContent`)
|
|
100
|
+
- `list-attachments` - List a task's attachments (file name, size, mime, created, author), with optional `page`/`perPage`
|
|
101
|
+
- `get-attachment-info` - Get metadata for one attachment by `attachmentId` (derived from the list response — there is no dedicated single-attachment metadata endpoint)
|
|
102
|
+
- `delete-attachment` - Delete an attachment by `attachmentId`
|
|
103
|
+
- `download-attachment` - **Cannot deliver the file itself** — MCP has no binary content channel. Returns the direct download URL (optionally with a `previewSize` of `sm`/`md`/`lg`/`xl`) plus the `Authorization: Bearer <token>` header guidance needed to fetch it yourself.
|
|
104
|
+
- `relate` / `unrelate` / `relations` - Manage task-to-task relations (subtask, blocking, duplicateof, ...) — same underlying handlers as the standalone `vikunja_task_relations` tool below
|
|
105
|
+
- `add-reminder` / `remove-reminder` / `list-reminders` - Manage task reminders — same underlying handlers as the standalone `vikunja_task_reminders` tool below
|
|
106
|
+
- `apply-label` / `remove-label` / `list-labels` - Apply/remove/list a task's labels — same underlying handlers as the standalone `vikunja_task_labels` tool below
|
|
107
|
+
- `set-bucket` - Move a task into a Kanban bucket; `projectId`/`viewId` auto-resolve when omitted
|
|
108
|
+
- `set-position` - Update a task's ordering within a project view (`position` is a float — see the Vikunja docs on inserting between two existing positions)
|
|
109
|
+
- `projectId` auto-resolves from the task, `projectViewId` auto-resolves to the project's first view of `viewKind` (default `'list'`) when omitted
|
|
110
|
+
- `get-by-index` - Look up a task by its human-facing per-project index (e.g. the `42` in `PROJ-42`)
|
|
111
|
+
- Required: `projectId`, `index`
|
|
112
|
+
- Task indexes are reassigned when a task moves between projects — use the returned task's `id` for long-lived references
|
|
113
|
+
- `create-subtask` - Composite: create a new task as a subtask of an existing task (`parentTaskId`, `title`, optional `description`/`dueDate`/`priority`/`labels`/`assignees`/`bucketId`). Resolves the parent to inherit its project, creates the task, optionally attaches labels/assignees and places it in a Kanban bucket (reuses the `set-bucket` path), relates it to the parent (Vikunja's `subtask`/`parenttask` relation kinds — the parent is always the "base" task of the relation), then re-reads the parent to verify the relation landed. Best-effort by default: a failure after the task was created is reported honestly (including the orphaned task id) rather than silently rolled back; `atomic: true` opts into best-effort rollback (deletes the created task) per `CompositeOperation`'s design — see [ENDPOINT-PLAYBOOK.md §5](ENDPOINT-PLAYBOOK.md)
|
|
114
|
+
- `list-subtasks` - Read composite: summarizes a task's subtasks (id/title/done/assignees) from the `"subtask"` slice of its `related_tasks`, in one call (`id`)
|
|
115
|
+
- `duplicate` - Copy a task (labels, assignees, attachments, reminders) into the same project via `PUT /tasks/{taskID}/duplicate` (no request body). Creates a "copied from" relation between the new and original task. Direct parallel to `vikunja_projects`' `duplicate`
|
|
116
|
+
- Required: `id` (the task to duplicate)
|
|
117
|
+
- `mark-read` - Mark a task as read for the current user via `POST /tasks/{projecttask}/read`, removing its unread-status entry (pairs with the task's `is_unread` field). Note the spec's odd path-param name (`projecttask`) — it is still just the task id
|
|
118
|
+
- Required: `id`
|
|
119
|
+
|
|
120
|
+
Several task sub-resources also register as their own standalone tools (same
|
|
121
|
+
handlers, `operation` field instead of `subcommand`, useful when you want a
|
|
122
|
+
narrower tool surface exposed to a client): `vikunja_task_bulk` (`operation`:
|
|
123
|
+
`bulk-create`/`bulk-update`/`bulk-delete`), `vikunja_task_assignees`
|
|
124
|
+
(`operation`: `assign`/`unassign`/`list-assignees`), `vikunja_task_comments`
|
|
125
|
+
(`operation`: `comment`/`list`/`get`/`update`/`delete`),
|
|
126
|
+
`vikunja_task_reminders` (`operation`: `add-reminder`/`remove-reminder`/`list-reminders`),
|
|
127
|
+
`vikunja_task_labels` (`operation`: `apply-label`/`remove-label`/`list-labels`),
|
|
128
|
+
`vikunja_task_relations` (`operation`: `relate`/`unrelate`/`relations`, plus
|
|
129
|
+
`relationKind`: one of `subtask`, `parenttask`, `related`, `duplicateof`,
|
|
130
|
+
`duplicates`, `blocking`, `blocked`, `precedes`, `follows`, `copiedfrom`,
|
|
131
|
+
`copiedto`, `unknown`).
|
|
132
|
+
|
|
133
|
+
## Batch Import
|
|
134
|
+
|
|
135
|
+
- `vikunja_batch_import` - Import multiple tasks from CSV or JSON
|
|
136
|
+
- Required: projectId, format ('csv' or 'json'), data
|
|
137
|
+
- Optional: skipErrors (continue on errors), dryRun (validate only)
|
|
138
|
+
- **Batch Size Limit**: Maximum 100 tasks per import
|
|
139
|
+
- **CSV Format**:
|
|
140
|
+
- Requires header row with field names
|
|
141
|
+
- Supports quoted values and escaped quotes
|
|
142
|
+
- Fields: title, description, priority, dueDate, labels, assignees
|
|
143
|
+
- Labels and assignees as semicolon-separated values (semicolons used to avoid conflicts with CSV commas)
|
|
144
|
+
- **JSON Format**:
|
|
145
|
+
- Array of task objects
|
|
146
|
+
- Same fields as CSV, plus direct support for arrays
|
|
147
|
+
- **Features**:
|
|
148
|
+
- Automatic label lookup by name
|
|
149
|
+
- Automatic user lookup by username
|
|
150
|
+
- Validation before creation
|
|
151
|
+
- Detailed error reporting
|
|
152
|
+
- Dry run mode for testing
|
|
153
|
+
- Skip errors option for partial imports
|
|
154
|
+
|
|
155
|
+
## Project Management
|
|
156
|
+
|
|
157
|
+
- `vikunja_projects` - Project operations
|
|
158
|
+
- `list` - List all projects with filters (pagination, search, archived status)
|
|
159
|
+
- `get` - Get project details by ID
|
|
160
|
+
- `create` - Create new project
|
|
161
|
+
- Required: title
|
|
162
|
+
- Optional: description, parentProjectId, isArchived, hexColor (format: #RRGGBB)
|
|
163
|
+
- Validates parent project hierarchy depth (max 10 levels)
|
|
164
|
+
- `update` - Update existing project
|
|
165
|
+
- Supports partial updates (fetches current project and merges; omitted fields are preserved)
|
|
166
|
+
- Can update all project fields including hexColor (format: #RRGGBB)
|
|
167
|
+
- Omitting `parentProjectId` leaves the current parent unchanged (use `move` to reparent or detach)
|
|
168
|
+
- Validates parent project hierarchy depth when changing parent
|
|
169
|
+
- `delete` - Delete a project by ID
|
|
170
|
+
- `archive` / `unarchive` - Archive or unarchive a project
|
|
171
|
+
- **Hierarchy**
|
|
172
|
+
- `get-children` - List direct children of a project
|
|
173
|
+
- `get-tree` - Get complete project hierarchy as a tree
|
|
174
|
+
- `get-breadcrumb` - Get path from root to a project
|
|
175
|
+
- `move` - Move a project to a new parent (validates against circular references, enforces max depth of 10 levels)
|
|
176
|
+
- **Sharing — link shares** (anonymous/password links)
|
|
177
|
+
- `create-share` / `list-shares` / `get-share` / `delete-share` / `auth-share`
|
|
178
|
+
- **Project Views**
|
|
179
|
+
- `list-views` / `get-view` / `create-view` / `update-view` / `delete-view`
|
|
180
|
+
- `set-done-bucket` - Composite: set a Kanban view's done bucket (resolves the view, updates it, and verifies the change took effect)
|
|
181
|
+
- **Kanban Buckets**
|
|
182
|
+
- `list-buckets` - List the Kanban buckets (columns) of a project (`id` is the project id)
|
|
183
|
+
- `create-bucket` - Create a new bucket (`id`, `title`, optional `limit`)
|
|
184
|
+
- `update-bucket` - Rename/reconfigure a bucket, referenced by `bucketId` or `bucketTitle`
|
|
185
|
+
- `delete-bucket` - Delete a bucket (dissociates its tasks, does not delete them), referenced by `bucketId` or `bucketTitle`
|
|
186
|
+
- `list-view-tasks` - List a view's tasks in real server-side (Kanban card) order, with pagination
|
|
187
|
+
- All Kanban operations auto-resolve `viewId` to the project's Kanban view when omitted
|
|
188
|
+
- **Duplicate**
|
|
189
|
+
- `duplicate` - Duplicate a project (`id`, optional `parentProjectId`, optional `duplicateShares`). Tasks, files, Kanban data, assignees, comments, attachments, labels, relations, and backgrounds are copied; shares only when `duplicateShares: true` (Vikunja's own default is `false` — shares are access grants, so copying them silently would be a security-relevant surprise)
|
|
190
|
+
- **Sharing — direct user & team access**
|
|
191
|
+
- `share-with-user` - Composite: share with a user by **username** (`projectId`, `username`, `right`) — resolves to an id, adds, then verifies the grant landed. Optional `atomic: true` removes the grant if verification fails (default best-effort; not a real transaction, see [ENDPOINT-PLAYBOOK.md §5](ENDPOINT-PLAYBOOK.md))
|
|
192
|
+
- `share-with-team` - Composite: share with a team by **name** (`projectId`, `teamName`, `right`) — same resolve → add → verify shape
|
|
193
|
+
- `list-members` - Read composite: direct users + direct teams + link shares for a project, in one call (`projectId`)
|
|
194
|
+
- `list-project-users` / `search-project-users` - List users with direct access, or search for one to share with
|
|
195
|
+
- `add-project-user` / `update-project-user-permission` / `remove-project-user` - Primitives for fine-grained control (`projectId`, `username` or `userId`, `right`)
|
|
196
|
+
- `list-project-teams` - List teams with direct access
|
|
197
|
+
- `add-project-team` / `update-project-team-permission` / `remove-project-team` - Primitives for fine-grained control (`projectId`, `teamId`, `right`)
|
|
198
|
+
- `right` accepts `'read' | 'write' | 'admin'` or the numeric `0 | 1 | 2`
|
|
199
|
+
- **Backgrounds (opt-in `backgrounds` module, disabled by default — see [docs/CONFIGURATION.md#module-gating](CONFIGURATION.md#module-gating))**
|
|
200
|
+
- > These three subcommands only exist on `vikunja_projects` when the `backgrounds`
|
|
201
|
+
> module is explicitly enabled (`{"modules": {"backgrounds": true}}` or
|
|
202
|
+
> `VIKUNJA_MCP_MODULE_BACKGROUNDS=true`) — deliberately the opposite of every
|
|
203
|
+
> other domain module here, which defaults ON. Disabled (the default), calling
|
|
204
|
+
> them fails MCP schema validation (unrecognized subcommand), not just a runtime
|
|
205
|
+
> rejection — they are genuinely absent from the tool's schema.
|
|
206
|
+
- `remove-background` - Remove a project's background, regardless of which provider set it (`id`). No-op (not an error) if the project has no background.
|
|
207
|
+
- `set-unsplash-background` - Set an unsplash photo as a project's background (`id`, `unsplashImageId` — the photo id from `search-unsplash`)
|
|
208
|
+
- `search-unsplash` - Search unsplash for candidate background photos (optional `unsplashQuery`, optional `page`). Only works when the connected Vikunja server has an Unsplash provider configured server-side; when it doesn't, the error is rewritten into a friendly explanation rather than the server's raw error text
|
|
209
|
+
- The binary image bytes themselves (upload, and fetching the actual image/thumbnail) stay parked — no MCP content channel for them; see [docs/ENDPOINT-TAIL-RETRIAGE.md](ENDPOINT-TAIL-RETRIAGE.md) item G7
|
|
210
|
+
|
|
211
|
+
## Label Management
|
|
212
|
+
|
|
213
|
+
- `vikunja_labels` - Label operations
|
|
214
|
+
- `list` - List all labels with filters (pagination, search)
|
|
215
|
+
- `get` - Get label details by ID
|
|
216
|
+
- `create` - Create new label (required: title; optional: description, hexColor)
|
|
217
|
+
- `update` - Update existing label (partial updates)
|
|
218
|
+
- `delete` - Delete a label by ID
|
|
219
|
+
- `apply-label` / `remove-label` - Apply or remove one or more labels on a task (task id + labels array; bulk supported)
|
|
220
|
+
- `list-labels` - List all labels assigned to a task
|
|
221
|
+
|
|
222
|
+
## Project Templates
|
|
223
|
+
|
|
224
|
+
> **⚠️ Never persisted to Vikunja itself; session-only by default:**
|
|
225
|
+
> Templates are stored in memory on the MCP server process by default and
|
|
226
|
+
> are lost when the server restarts. Set the `templates.persistPath` config
|
|
227
|
+
> key (or `VIKUNJA_MCP_TEMPLATES_FILE` env var, which wins) to make them
|
|
228
|
+
> durable across restarts via a JSON file — see
|
|
229
|
+
> [docs/CONFIGURATION.md#templates-persistence](CONFIGURATION.md#templates-persistence).
|
|
230
|
+
|
|
231
|
+
- `vikunja_templates` - Template operations (session-only by default, opt-in file persistence — see note above)
|
|
232
|
+
- `create` - Create a template from an existing project (required: projectId, name; optional: description, tags)
|
|
233
|
+
- `list` - List all available templates (name, tags, author)
|
|
234
|
+
- `get` - Get template details by ID
|
|
235
|
+
- `update` - Update template metadata (name, description, tags)
|
|
236
|
+
- `delete` - Delete a template
|
|
237
|
+
- `instantiate` - Create new project from template (required: id, projectName; optional: parentProjectId, variables)
|
|
238
|
+
- Supports variable substitution: `{{PROJECT_NAME}}`, `{{TODAY}}` (YYYY-MM-DD), `{{NOW}}`, plus custom variables
|
|
239
|
+
- Creates all tasks with labels from the template
|
|
240
|
+
|
|
241
|
+
## Team Management
|
|
242
|
+
|
|
243
|
+
- `vikunja_teams` - Team operations, fully via direct REST calls
|
|
244
|
+
- `list` - List all teams with filters (pagination, search)
|
|
245
|
+
- `create` - Create new team (required: name; optional: description)
|
|
246
|
+
- `get` - Get a team by ID
|
|
247
|
+
- `update` - Update a team's name/description (required: id; at least one of name/description)
|
|
248
|
+
- `delete` - Delete a team by ID
|
|
249
|
+
- `members` - Manage team membership (keyed by **username**, not numeric user id — this is deliberate on Vikunja's part to prevent automated/enumerated user-id entry). Use `memberSubcommand`:
|
|
250
|
+
- `list` - List a team's members (read from the team's embedded `members` array; there is no standalone list-members endpoint)
|
|
251
|
+
- `add` - Add a member by username (required: username; optional: admin)
|
|
252
|
+
- `remove` - Remove a member by username (required: username)
|
|
253
|
+
- `toggleAdmin` - **Toggles** a member's admin status (the API endpoint takes no body and always flips the current value; it cannot set an explicit true/false)
|
|
254
|
+
|
|
255
|
+
## User Management
|
|
256
|
+
|
|
257
|
+
- `vikunja_users` - User operations **[Requires JWT authentication]**
|
|
258
|
+
- `current` - Get current authenticated user info
|
|
259
|
+
- `search` - Search for users (optional: search query, pagination)
|
|
260
|
+
- `settings` - Get current user settings
|
|
261
|
+
- `update-settings` - Update user settings (optional: name, language, timezone, weekStart, frontendSettings)
|
|
262
|
+
- `timezones` - List the Vikunja instance's valid IANA time zone names (`GET /user/timezones`). Call this before `update-settings` with a `timezone` value — the valid set is instance-dependent (it depends on the OS Vikunja runs on) and the server rejects unrecognized zone names.
|
|
263
|
+
- `get-avatar` - Get the current user's avatar *provider* setting (`GET /user/settings/avatar` → JSON `{avatar_provider}`, **not** image bytes)
|
|
264
|
+
- `set-avatar` - Set the avatar provider (required: `avatarProvider`, one of `gravatar`/`upload`/`initials`/`marble`/`ldap`/`openid`/`default` — validated against the exact set the Vikunja server accepts). Setting it to `upload` alone does not attach an image — call `upload-avatar` to actually supply one.
|
|
265
|
+
- `upload-avatar` - Upload an avatar image (`PUT /user/settings/avatar/upload`, multipart). Accepts a local file the same way `vikunja_tasks attach` does: `filePath` (server-local path) or `fileContent` (base64), with `filePath` taking precedence when both are given; optional `filename`. This call also sets the avatar provider to `upload` as a side effect on the server, overwriting whatever provider was set before.
|
|
266
|
+
- **Note:** User operations require JWT authentication. When using API token authentication, this tool is not registered at all.
|
|
267
|
+
|
|
268
|
+
## Webhook Management
|
|
269
|
+
|
|
270
|
+
- `vikunja_webhooks` - Webhook operations for project automation, plus the current user's account-wide webhooks
|
|
271
|
+
- `scope` - `'project'` (default) or `'user'`. `'project'` operates on a single project's webhooks (`/projects/{id}/webhooks*`) and requires `projectId`. `'user'` operates on the current user's account-wide webhooks (`/user/settings/webhooks*`, G4), which fire across every project the user has access to, and must **not** be combined with `projectId`. Both scopes share the identical `models.Webhook` shape and the same subcommands below.
|
|
272
|
+
- `list-events` - Get all available webhook event types (for the selected scope)
|
|
273
|
+
- `list` - List webhooks (required: `projectId` when `scope` is `'project'`)
|
|
274
|
+
- `get` - Get a specific webhook (required: `webhookId`; also `projectId` when `scope` is `'project'`) — emulated client-side via `list` + filter-by-id, since the spec has no single-webhook GET in either scope
|
|
275
|
+
- `create` - Create a new webhook (required: `targetUrl`, `events` array; also `projectId` when `scope` is `'project'`; optional: `secret` for HMAC signing) — events are validated against available event types
|
|
276
|
+
- `update` - Update webhook events (required: `webhookId`, `events` array; also `projectId` when `scope` is `'project'`) — validated the same way. The API only allows changing `events`, not `targetUrl`/`secret`, in either scope.
|
|
277
|
+
- `delete` - Delete a webhook (required: `webhookId`; also `projectId` when `scope` is `'project'`)
|
|
278
|
+
- Valid events are cached for 5 minutes per scope to improve performance (project and user-level events are cached separately); invalid events in `create`/`update` produce a clear error listing all valid options.
|
|
279
|
+
- **Note:** per the OpenAPI spec, `/user/settings/webhooks*` (`scope: 'user'`) is JWT-only. Calls made with an API token (`tk_*`) session may be rejected by the server; the tool surfaces a specific, actionable error in that case rather than the generic webhook-permissions message.
|
|
280
|
+
|
|
281
|
+
## Notifications
|
|
282
|
+
|
|
283
|
+
- `vikunja_notifications` - Manage the current user's Vikunja notifications
|
|
284
|
+
- `list` - List notifications (optional: `unreadOnly` — client-side filter, the API has no server-side unread filter — `page`, `perPage`). Each notification may include a best-effort `relatedTask` field (`{id, title}`) when the API's payload happens to embed one.
|
|
285
|
+
- `mark-read` - Mark a single notification as read (required: `notificationId`). **Idempotent**: the underlying `POST /notifications/{id}` endpoint is a pure toggle (no request body to pick read vs. unread); this tool checks the result and toggles a second time if needed so calling it repeatedly always leaves the notification read.
|
|
286
|
+
- `mark-all-read` - Mark every notification as read in one call
|
|
287
|
+
- **Note**: link shares cannot have notifications (per the API); this tool requires a full user session
|
|
288
|
+
|
|
289
|
+
## Subscriptions
|
|
290
|
+
|
|
291
|
+
- `vikunja_subscriptions` - Subscribe/unsubscribe the current user to/from notifications for a project or task
|
|
292
|
+
- `subscribe` - Subscribe to an entity (required: `entity` — `'project'` or `'task'` — and `entityId`)
|
|
293
|
+
- `unsubscribe` - Unsubscribe from an entity (required: `entity`, `entityId`). **Idempotent**: unsubscribing from something you're not subscribed to succeeds as a no-op (the API's 404 "subscription does not exist" is treated as success, not an error).
|
|
294
|
+
|
|
295
|
+
## Reactions
|
|
296
|
+
|
|
297
|
+
- `vikunja_reactions` - Add, remove, or list emoji/text reactions on a task or task comment
|
|
298
|
+
- `list` - List all reactions for an entity (required: `kind` — `'tasks'` or `'comments'` — and `entityId`)
|
|
299
|
+
- `add` - Add a reaction (required: `kind`, `entityId`, `value` — any UTF character or short text, up to 20 characters)
|
|
300
|
+
- `remove` - Remove your own reaction (required: `kind`, `entityId`, `value`)
|
|
301
|
+
|
|
302
|
+
## Filter Management
|
|
303
|
+
|
|
304
|
+
> **Real, server-side saved filters:** `create`/`get`/`update`/`delete` call
|
|
305
|
+
> Vikunja's actual `/filters` API (`PUT /filters`, `GET`/`POST`/`DELETE
|
|
306
|
+
> /filters/{id}`) — filters persist on the server, survive an MCP restart,
|
|
307
|
+
> and are visible in the Vikunja UI and to other clients. Saved filters are
|
|
308
|
+
> **not** project-scoped (the API has no `project_id` field on a saved
|
|
309
|
+
> filter); Vikunja instead exposes each one as a *pseudo-project* with a
|
|
310
|
+
> negative id, and `isFavorite` controls whether it also shows in the
|
|
311
|
+
> favorites parent alongside favorite projects. There is no dedicated
|
|
312
|
+
> list-all-saved-filters endpoint, so `list` derives its results from `GET
|
|
313
|
+
> /projects`' pseudo-project entries and verifies each one against `GET
|
|
314
|
+
> /filters/{id}`; entries it could not verify are still returned (title
|
|
315
|
+
> only) with `hydrated: false` rather than silently dropped. `build` and
|
|
316
|
+
> `validate` remain pure local utilities — they construct or check a filter
|
|
317
|
+
> query string without contacting the server.
|
|
318
|
+
|
|
319
|
+
- `vikunja_filters` - Advanced filtering for tasks, backed by Vikunja's real saved filters. Uses `action` instead of `subcommand`.
|
|
320
|
+
- `list` - Derive the list of saved filters from `GET /projects`' pseudo-project entries (optional: page, perPage, favorite)
|
|
321
|
+
- `get` - Get a specific saved filter by its numeric id (required: id)
|
|
322
|
+
- `create` - Create a new saved filter (`PUT /filters`) (required: title, and one of filter (query string) or conditions (array); optional: description, groupOperator (`&&`/`||`), isFavorite)
|
|
323
|
+
- `update` - Update an existing saved filter (`POST /filters/{id}`, a full-resource replace — omitted fields are carried forward from the current filter, not cleared) (required: id)
|
|
324
|
+
- `delete` - Delete a saved filter (`DELETE /filters/{id}`) (required: id)
|
|
325
|
+
- `build` - Build a filter string from conditions (local utility, no server call) (required: conditions array; optional: groupOperator)
|
|
326
|
+
- `validate` - Validate a filter string (local utility, no server call)
|
|
327
|
+
|
|
328
|
+
## Data Export
|
|
329
|
+
|
|
330
|
+
> **⚠️ Memory usage:** Export operations load entire project hierarchies
|
|
331
|
+
> into memory. For very large projects with thousands of tasks or deeply
|
|
332
|
+
> nested structures, this may consume significant memory. Consider
|
|
333
|
+
> exporting smaller projects individually.
|
|
334
|
+
|
|
335
|
+
- `vikunja_export_project` - Export project data **[Requires JWT authentication]**
|
|
336
|
+
- Required: `projectId`. Optional: `includeChildren` (recursive, default false)
|
|
337
|
+
- Exports all tasks with full details, all labels used in the project, and (optionally) the full child-project hierarchy with circular-reference detection
|
|
338
|
+
- **Note:** requires JWT authentication; not registered for API-token sessions.
|
|
339
|
+
- `vikunja_request_user_export` - Request a full user data export (required: `password` for security verification). You'll receive an email when the export is ready.
|
|
340
|
+
- `vikunja_user_export_status` - Check whether a previously requested user data export is ready, and when (`GET /user/export`, returns `models.UserExportStatus`: `id`/`created`/`expires`/`size`). Completes the request → status → download trio.
|
|
341
|
+
- `vikunja_download_user_export` - Confirm a previously requested user data export is ready on the server (required: `password`). Returns the server's confirmation message, not the export file itself — per the Vikunja API spec, this endpoint never returns the archive's contents, and MCP has no binary-attachment support. Retrieve the actual file from the Vikunja web UI or a direct API client using the same credentials.
|
|
342
|
+
|
|
343
|
+
## API Token Management — deny-by-default
|
|
344
|
+
|
|
345
|
+
> **Reserved/disabled by default.** `vikunja_tokens` is only registered when
|
|
346
|
+
> the `tokenManagement` module config key is explicitly set to `true` (see
|
|
347
|
+
> [CONFIGURATION.md#module-gating](CONFIGURATION.md#module-gating)) — it
|
|
348
|
+
> does not appear to the AI client out of the box, since it is
|
|
349
|
+
> credential-adjacent.
|
|
350
|
+
|
|
351
|
+
- `vikunja_tokens` - Manage the current user's Vikunja API tokens
|
|
352
|
+
- `list` - List existing tokens (`GET /tokens`) (optional: page, perPage, search)
|
|
353
|
+
- `create` - Create a new API token (`PUT /tokens`) (required: title, permissions — a map of resource group → allowed actions, e.g. `{"tasks":["read_all","update"]}`, valid keys/values come from the server's `GET /routes`; optional: expiresAt (ISO 8601), ownerId). The token's secret value is only ever returned in this response — it cannot be retrieved again afterwards.
|
|
354
|
+
- `delete` - Delete a token by id (`DELETE /tokens/{tokenID}`) (required: tokenId)
|
|
355
|
+
- **Note:** `/tokens` shares its authentication scheme with other user-scoped endpoints that have historically rejected `tk_*` API tokens (see docs/VIKUNJA_API_ISSUES.md #2) — a call made with an API-token session may be rejected server-side even though the tool itself is registered for both session types.
|
|
356
|
+
|
|
357
|
+
## CalDAV Token Management — deny-by-default + JWT-only
|
|
358
|
+
|
|
359
|
+
> **Reserved/disabled by default, and JWT-only.** `vikunja_caldav_tokens`
|
|
360
|
+
> requires BOTH the `caldavTokens` module config key to be explicitly set to
|
|
361
|
+
> `true` AND an active JWT session (see
|
|
362
|
+
> [CONFIGURATION.md#module-gating](CONFIGURATION.md#module-gating)) — unlike
|
|
363
|
+
> `vikunja_tokens`, the underlying `/user/settings/token/caldav*` endpoints
|
|
364
|
+
> are JWT-only per the vendored OpenAPI spec, so module config can only
|
|
365
|
+
> narrow this JWT-only gate, never expand it.
|
|
366
|
+
|
|
367
|
+
- `vikunja_caldav_tokens` - Manage the current user's Vikunja CalDAV tokens **[Requires JWT authentication]** — separate credentials from API tokens (`vikunja_tokens`), used to authenticate third-party CalDAV clients against Vikunja's CalDAV interface
|
|
368
|
+
- `list` - List existing CalDAV tokens (`GET /user/settings/token/caldav`) — returns each token's id and created date only (the secret is never re-shown after creation)
|
|
369
|
+
- `create` - Generate a new CalDAV token (`PUT /user/settings/token/caldav`, no request body). The token's secret value is only ever returned in this response — it cannot be retrieved again afterwards.
|
|
370
|
+
- `delete` - Delete a CalDAV token by id (`DELETE /user/settings/token/caldav/{id}`) (required: tokenId)
|
|
371
|
+
|
|
372
|
+
## Instance Admin — deny-by-default + JWT-only
|
|
373
|
+
|
|
374
|
+
> **Reserved/disabled by default, and JWT-only.** `vikunja_admin` requires
|
|
375
|
+
> BOTH the `admin` module config key to be explicitly set to `true` AND an
|
|
376
|
+
> active JWT session — module config can only narrow what authentication
|
|
377
|
+
> already allows, never expand it, so API-token sessions never see this
|
|
378
|
+
> tool regardless of config.
|
|
379
|
+
|
|
380
|
+
- `vikunja_admin` - Instance-administrator operations **[Requires JWT authentication]**
|
|
381
|
+
- `overview` - Instance-wide counts (users, projects, tasks, teams, shares) plus license info (`GET /admin/overview`)
|
|
382
|
+
- `list-projects` - List every project on the instance regardless of ownership (`GET /admin/projects`) (optional: page, perPage, search)
|
|
383
|
+
- `set-project-owner` - Reassign a project's owner (`PATCH /admin/projects/{id}/owner`) (required: projectId, ownerId)
|
|
384
|
+
- `list-users` - List every user on the instance, including admin-only fields (`is_admin`, `status`) (`GET /admin/users`) (optional: search, page, perPage)
|
|
385
|
+
- `create-user` - Create a local user account, bypassing public registration (`POST /admin/users`) (required: username, email, password; optional: name, language, isAdmin, skipEmailConfirm)
|
|
386
|
+
- `set-user-admin` - Promote or demote a user's instance-admin flag (`PATCH /admin/users/{id}/admin`) (required: userId, isAdmin) — the server refuses to demote the last remaining admin
|
|
387
|
+
- `set-user-status` - Change a user's status without requiring login (`PATCH /admin/users/{id}/status`) (required: userId, status: `active` | `email-confirmation-required` | `disabled` | `account-locked`)
|
|
388
|
+
- `delete-user` - Delete a user (`DELETE /admin/users/{id}`) (required: userId, **`confirm: true`**; optional: mode — `now` for immediate deletion, `scheduled` (default) to trigger the email-confirmation self-deletion flow). **Irreversible in `now` mode** — the tool refuses to run without an explicit `confirm: true` argument.
|
|
389
|
+
|
|
390
|
+
## User Self-Deletion — deny-by-default + JWT-only
|
|
391
|
+
|
|
392
|
+
> **Reserved/disabled by default, and JWT-only.** `vikunja_user_deletion` requires
|
|
393
|
+
> BOTH the `userDeletion` module config key to be explicitly set to `true` AND an
|
|
394
|
+
> active JWT session — module config can only narrow what authentication already
|
|
395
|
+
> allows, never expand it, so API-token sessions never see this tool regardless of
|
|
396
|
+
> config. This is the reserved `DANGEROUS_MODULE_KEYS` slot (`src/config/types.ts`)
|
|
397
|
+
> finally getting a tool. **Read [CONFIGURATION.md's `userDeletion` row](CONFIGURATION.md#known-modules)
|
|
398
|
+
> before enabling this module** — it lets an AI assistant delete the connected
|
|
399
|
+
> Vikunja account.
|
|
400
|
+
|
|
401
|
+
- `vikunja_user_deletion` - Request, confirm, or cancel deletion of the **currently authenticated account** **[Requires JWT authentication]**
|
|
402
|
+
- `request` - Start the deletion process (`POST /user/deletion/request`) (required: password, **`confirm: true`**). Triggers a confirmation email; the account is not deleted until `confirm` is called with the emailed token. **Irreversible once confirmed** — the tool refuses to run without an explicit `confirm: true` argument.
|
|
403
|
+
- `confirm` - Complete the deletion using the token Vikunja emailed after `request` (`POST /user/deletion/confirm`) (required: token, **`confirm: true`**). **Irreversible** — the tool refuses to run without an explicit `confirm: true` argument.
|
|
404
|
+
- `cancel` - Abort an in-progress deletion request (`POST /user/deletion/cancel`) (required: password). The safe "undo" leg — does **not** require `confirm: true`.
|
|
405
|
+
- **Secrets:** `password` and `token` are never echoed back in tool responses or error messages, and are never written to logs (see `src/utils/security.ts`'s masking conventions).
|
|
406
|
+
|
|
407
|
+
## Known limitations
|
|
408
|
+
|
|
409
|
+
1. **File attachments**: upload (`attach`), list (`list-attachments`), metadata (`get-attachment-info`), and delete (`delete-attachment`) are implemented. `download-attachment` cannot deliver the file's bytes — the Vikunja API returns raw `application/octet-stream` for downloads, and MCP has no binary content channel — so it returns the direct download URL and auth guidance for the caller to fetch it themselves instead.
|
|
410
|
+
2. **Team operations**: `get`/`update`/`members` go through direct REST calls (`src/utils/vikunja-rest.ts`) rather than a generic client method, since the underlying API doesn't offer them as a single convenient call. The admin-toggle member operation is a true toggle server-side — it cannot set an explicit admin value in one call.
|
|
411
|
+
3. **Pagination**: some endpoints may not fully support pagination parameters due to upstream API limitations.
|
|
412
|
+
4. **Authentication quirks**: a handful of Vikunja API endpoints have known auth-related rough edges (user endpoints rejecting valid `tk_*` tokens on some server versions, bulk/label/assignee operations occasionally erroring on certain server configurations) — see [docs/VIKUNJA_API_ISSUES.md](VIKUNJA_API_ISSUES.md) for the full, current list. Tools surface a clear error message when these occur.
|
|
413
|
+
|
|
414
|
+
## Security & performance
|
|
415
|
+
|
|
416
|
+
- **Zod schema validation**: enterprise-grade input validation with comprehensive type checking
|
|
417
|
+
- **DoS protection**: input sanitization, length limits, and character allowlisting
|
|
418
|
+
- **Credential protection**: automatic masking of sensitive tokens and URLs in logs and error messages
|
|
419
|
+
- **Entity resolution**: robust label/user name-to-id mapping with defensive error handling for malformed API responses
|
|
420
|
+
- **Rate limiting**: configurable request rate limits and payload size restrictions (see [CONFIGURATION.md](CONFIGURATION.md#rate-limiting-variables))
|
|
421
|
+
- **Memory protection**: pagination limits and memory usage monitoring (`src/utils/memory.ts`)
|
|
422
|
+
- **Circuit breaker**: opossum-backed retry/circuit-breaking for outbound Vikunja calls (`src/utils/retry.ts`)
|