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
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Jeremy Green
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
# Vikunja MCP Server
|
|
2
|
+
|
|
3
|
+
**Give your AI assistant real hands on your Vikunja instance** — create and triage tasks, manage projects and Kanban boards, assign teammates, and more, through natural conversation.
|
|
4
|
+
|
|
5
|
+
[](LICENSE)
|
|
6
|
+
[](package.json)
|
|
7
|
+
[](https://modelcontextprotocol.io)
|
|
8
|
+
|
|
9
|
+
> 👋 **Why this fork exists:** we rely on this project and noticed the [upstream repo](https://github.com/democratize-technology/vikunja-mcp) had gone quiet, with a growing backlog of open PRs and issues. So we've taken over active maintenance here — triaging and resolving most of that backlog (tracked in [this issue](https://github.com/netadvanced/vikunja-mcp-ng/issues/19)). Full credit to the original authors for the foundation. If they'd like to pick it back up, we'll gladly hand the reins back — or work together.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## What this gives your AI assistant
|
|
14
|
+
|
|
15
|
+
This server exposes Vikunja as **27 tools** (a session tool, 22 available by default or by auth type, and 4 sensitive ones that are off until an operator opts in), each covering one entity (tasks, projects, labels, teams…) with a consistent `subcommand` pattern — not a 1:1 REST proxy, but composite operations built for how an AI actually works: resolve a username instead of demanding a user ID, verify that tricky writes actually stuck instead of trusting a 200, and explicit confirmation gates on destructive operations. Your assistant reasons in natural language; the server turns that into correct Vikunja API calls and reports partial failures honestly instead of pretending success.
|
|
16
|
+
|
|
17
|
+
## See it in action
|
|
18
|
+
|
|
19
|
+
> **You:** "Move 'Fix login redirect bug' to In Review and show me the board."
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
vikunja_tasks({ subcommand: "set-bucket", id: 342, bucketId: 43 })
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
`projectId`/`viewId` auto-resolve from the task — no need to know which view is the Kanban one. The task card slides from *Backlog* into *In Review* on the Kanban board, instantly visible to anyone else looking at the board.
|
|
26
|
+
|
|
27
|
+
More end-to-end scenarios — daily triage, team sharing, project planning, staying informed, bulk imports, admin ops — each paired with the exact tool call and the resulting Vikunja UI state, live in [`docs/samples/`](docs/samples/).
|
|
28
|
+
|
|
29
|
+
## Quick Start
|
|
30
|
+
|
|
31
|
+
### From source
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
git clone https://github.com/netadvanced/vikunja-mcp-ng.git
|
|
35
|
+
cd vikunja-mcp-ng
|
|
36
|
+
npm ci
|
|
37
|
+
npm run build
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
```json
|
|
41
|
+
{
|
|
42
|
+
"mcpServers": {
|
|
43
|
+
"vikunja": {
|
|
44
|
+
"command": "node",
|
|
45
|
+
"args": ["/path/to/vikunja-mcp/dist/index.js"],
|
|
46
|
+
"env": {
|
|
47
|
+
"VIKUNJA_URL": "https://your-vikunja-instance.com/api/v1",
|
|
48
|
+
"VIKUNJA_API_TOKEN": "your-api-token"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Docker
|
|
56
|
+
|
|
57
|
+
There's no published image yet — build it locally:
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
git clone https://github.com/netadvanced/vikunja-mcp-ng.git
|
|
61
|
+
cd vikunja-mcp-ng
|
|
62
|
+
docker build -t ghcr.io/netadvanced/vikunja-mcp-ng:latest .
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"mcpServers": {
|
|
68
|
+
"vikunja": {
|
|
69
|
+
"command": "docker",
|
|
70
|
+
"args": [
|
|
71
|
+
"run", "-i", "--rm",
|
|
72
|
+
"-e", "VIKUNJA_URL",
|
|
73
|
+
"-e", "VIKUNJA_API_TOKEN",
|
|
74
|
+
"ghcr.io/netadvanced/vikunja-mcp-ng:latest"
|
|
75
|
+
],
|
|
76
|
+
"env": {
|
|
77
|
+
"VIKUNJA_URL": "https://your-vikunja-instance.com/api/v1",
|
|
78
|
+
"VIKUNJA_API_TOKEN": "your-api-token"
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
Using Docker Desktop's MCP Toolkit instead of a bare `docker run`? See [docs/DOCKER-DESKTOP-MCP.md](docs/DOCKER-DESKTOP-MCP.md) for the tested, step-by-step path.
|
|
86
|
+
|
|
87
|
+
Full install options, JWT vs. API-token auth, module gating, and every environment variable live in the [Configuration guide](docs/CONFIGURATION.md).
|
|
88
|
+
|
|
89
|
+
## Capabilities
|
|
90
|
+
|
|
91
|
+
| Group | Tools | Covers |
|
|
92
|
+
|---|---|---|
|
|
93
|
+
| **Tasks** | `vikunja_tasks`, `vikunja_task_bulk`, `vikunja_task_assignees`, `vikunja_task_comments`, `vikunja_task_labels`, `vikunja_task_relations`, `vikunja_task_reminders` | CRUD, filtering, bulk ops, Kanban placement, subtasks, duplication, mark-read, comments, relations |
|
|
94
|
+
| **Projects** | `vikunja_projects` | CRUD, hierarchy, views, Kanban buckets, sharing, duplication, opt-in backgrounds |
|
|
95
|
+
| **Organize** | `vikunja_labels`, `vikunja_filters`, `vikunja_templates` | Labels, saved filters, reusable task templates |
|
|
96
|
+
| **Collaborate** | `vikunja_teams`, `vikunja_users`\*, `vikunja_notifications`, `vikunja_subscriptions`, `vikunja_reactions` | Team membership, notifications, watch/react |
|
|
97
|
+
| **Automate & move data** | `vikunja_webhooks`, `vikunja_batch_import`, `vikunja_export_project`\* | Webhooks (per-project and account-wide), CSV/JSON import, project export |
|
|
98
|
+
|
|
99
|
+
\* JWT authentication only. User data export also has request/status/download tools (`vikunja_request_user_export`, `vikunja_user_export_status`, `vikunja_download_user_export`), all JWT-only. (`vikunja_webhooks`' account-wide `scope: 'user'` is JWT-only too; its default `scope: 'project'` works with either auth type.)
|
|
100
|
+
|
|
101
|
+
A session tool, `vikunja_auth` (connect / status / info / refresh / disconnect), rounds out the always-on surface. Four more tools — `vikunja_tokens`, `vikunja_caldav_tokens`, `vikunja_admin`, and `vikunja_user_deletion` — exist for API-token management, CalDAV-token management, instance administration, and self account deletion. All are **disabled by default**; an operator opts in explicitly (see Configuration). `vikunja_user_deletion` is the most sensitive of the four — it can delete the connected account — so read its [Configuration guide entry](docs/CONFIGURATION.md#known-modules) before enabling it. `vikunja_projects` also has three opt-in cosmetic subcommands (project backgrounds) behind a `backgrounds` module toggle, off by default for the opposite reason: low value, not danger.
|
|
102
|
+
|
|
103
|
+
Full subcommand-by-subcommand reference: [`docs/TOOLS.md`](docs/TOOLS.md).
|
|
104
|
+
|
|
105
|
+
## Safety by design
|
|
106
|
+
|
|
107
|
+
Every entity is a toggle you can disable in config, `vikunja_admin`/`vikunja_tokens`/`vikunja_caldav_tokens`/`vikunja_user_deletion` ship off until an operator opts in (and `vikunja_admin`/`vikunja_caldav_tokens`/`vikunja_user_deletion` additionally require an active JWT session), and a global read-only mode can reject every write/destructive subcommand while reads keep working. Full details: [Configuration guide](docs/CONFIGURATION.md#module-gating).
|
|
108
|
+
|
|
109
|
+
## Links
|
|
110
|
+
|
|
111
|
+
- [Sample walkthroughs](docs/samples/) — real conversations paired with the tool calls and UI results behind them
|
|
112
|
+
- [Full tool reference](docs/TOOLS.md) — every tool, subcommand, and argument
|
|
113
|
+
- [Configuration guide](docs/CONFIGURATION.md) — auth, secrets, module gating, rate limits
|
|
114
|
+
- [Roadmap](docs/ROADMAP.md) — where the project is headed and why
|
|
115
|
+
- [Contributing / endpoint playbook](docs/ENDPOINT-PLAYBOOK.md) — conventions for adding new coverage
|
|
116
|
+
- [Local test stack](docs/LOCAL-TESTING.md) — disposable Vikunja+Postgres via Docker for trying this out safely
|
|
117
|
+
- [Agent battle-testing harness](docs/BATTLE-TESTING.md) — spawns a real AI agent against the tool surface and grades it on correctness and ergonomics (manual, costs real money — see the doc before running)
|
|
118
|
+
- [Docker Desktop MCP Toolkit how-to](docs/DOCKER-DESKTOP-MCP.md) — registering this server with `docker mcp`
|
|
119
|
+
- [Releasing](docs/RELEASING.md) — versioning policy and the release checklist · [CHANGELOG](CHANGELOG.md)
|
|
120
|
+
|
|
121
|
+
## License
|
|
122
|
+
|
|
123
|
+
MIT — see [LICENSE](LICENSE).
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Authentication Manager
|
|
3
|
+
* Handles session management and token refresh for the MCP server
|
|
4
|
+
*/
|
|
5
|
+
import type { AuthSession } from '../types';
|
|
6
|
+
export declare class AuthManager {
|
|
7
|
+
private session;
|
|
8
|
+
/**
|
|
9
|
+
* Detect authentication type based on token format
|
|
10
|
+
*/
|
|
11
|
+
static detectAuthType(token: string): 'api-token' | 'jwt';
|
|
12
|
+
/**
|
|
13
|
+
* Initialize a new auth session
|
|
14
|
+
*/
|
|
15
|
+
connect(apiUrl: string, apiToken: string, authType?: 'api-token' | 'jwt'): void;
|
|
16
|
+
/**
|
|
17
|
+
* Get current session
|
|
18
|
+
* @throws MCPError if not authenticated
|
|
19
|
+
*/
|
|
20
|
+
getSession(): AuthSession;
|
|
21
|
+
/**
|
|
22
|
+
* Check if authenticated
|
|
23
|
+
*/
|
|
24
|
+
isAuthenticated(): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Clear session
|
|
27
|
+
*/
|
|
28
|
+
disconnect(): void;
|
|
29
|
+
/**
|
|
30
|
+
* Get auth status
|
|
31
|
+
*/
|
|
32
|
+
getStatus(): {
|
|
33
|
+
authenticated: boolean;
|
|
34
|
+
apiUrl?: string;
|
|
35
|
+
userId?: string;
|
|
36
|
+
authType?: 'api-token' | 'jwt';
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Get authentication type
|
|
40
|
+
* @throws MCPError if not authenticated
|
|
41
|
+
*/
|
|
42
|
+
getAuthType(): 'api-token' | 'jwt';
|
|
43
|
+
/**
|
|
44
|
+
* Save session with auth type
|
|
45
|
+
*/
|
|
46
|
+
saveSession(session: AuthSession): void;
|
|
47
|
+
/**
|
|
48
|
+
* Test-only method to set user ID
|
|
49
|
+
* @throws Error if used in production
|
|
50
|
+
*/
|
|
51
|
+
setTestUserId(userId: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Test-only method to set token expiry
|
|
54
|
+
* @throws Error if used in production
|
|
55
|
+
*/
|
|
56
|
+
setTestTokenExpiry(expiry: Date): void;
|
|
57
|
+
/**
|
|
58
|
+
* Validate test environment - prevents test methods from being used in production
|
|
59
|
+
* @throws Error if not in test environment
|
|
60
|
+
*/
|
|
61
|
+
private validateTestEnvironment;
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=AuthManager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthManager.d.ts","sourceRoot":"","sources":["../../src/auth/AuthManager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAI5C,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA4B;IAE3C;;OAEG;IACH,MAAM,CAAC,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,GAAG,KAAK;IAezD;;OAEG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,KAAK,GAAG,IAAI;IAa/E;;;OAGG;IACH,UAAU,IAAI,WAAW;IAUzB;;OAEG;IACH,eAAe,IAAI,OAAO;IAI1B;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,SAAS,IAAI;QAAE,aAAa,EAAE,OAAO,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,WAAW,GAAG,KAAK,CAAA;KAAE;IAezG;;;OAGG;IACH,WAAW,IAAI,WAAW,GAAG,KAAK;IAUlC;;OAEG;IACH,WAAW,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IASvC;;;OAGG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAWnC;;;OAGG;IACH,kBAAkB,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI;IAWtC;;;OAGG;IACH,OAAO,CAAC,uBAAuB;CAYhC"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Authentication Manager
|
|
4
|
+
* Handles session management and token refresh for the MCP server
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.AuthManager = void 0;
|
|
8
|
+
const types_1 = require("../types");
|
|
9
|
+
const logger_1 = require("../utils/logger");
|
|
10
|
+
class AuthManager {
|
|
11
|
+
session = null;
|
|
12
|
+
/**
|
|
13
|
+
* Detect authentication type based on token format
|
|
14
|
+
*/
|
|
15
|
+
static detectAuthType(token) {
|
|
16
|
+
// API tokens start with tk_
|
|
17
|
+
if (token.startsWith('tk_')) {
|
|
18
|
+
return 'api-token';
|
|
19
|
+
}
|
|
20
|
+
// JWTs have 3 parts separated by dots and start with eyJ (base64 for {"alg":)
|
|
21
|
+
if (token.startsWith('eyJ') && token.split('.').length === 3) {
|
|
22
|
+
return 'jwt';
|
|
23
|
+
}
|
|
24
|
+
// Default to API token for backward compatibility
|
|
25
|
+
return 'api-token';
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Initialize a new auth session
|
|
29
|
+
*/
|
|
30
|
+
connect(apiUrl, apiToken, authType) {
|
|
31
|
+
// Auto-detect auth type if not provided
|
|
32
|
+
const detectedAuthType = authType || AuthManager.detectAuthType(apiToken);
|
|
33
|
+
logger_1.logger.debug('AuthManager.connect - Creating session with authType: %s', detectedAuthType);
|
|
34
|
+
this.session = {
|
|
35
|
+
apiUrl,
|
|
36
|
+
apiToken,
|
|
37
|
+
authType: detectedAuthType,
|
|
38
|
+
// tokenExpiry and userId are optional
|
|
39
|
+
};
|
|
40
|
+
logger_1.logger.debug('AuthManager.connect - Session created successfully');
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Get current session
|
|
44
|
+
* @throws MCPError if not authenticated
|
|
45
|
+
*/
|
|
46
|
+
getSession() {
|
|
47
|
+
if (!this.session) {
|
|
48
|
+
throw new types_1.MCPError(types_1.ErrorCode.AUTH_REQUIRED, 'Authentication required. Please use vikunja_auth.connect first.');
|
|
49
|
+
}
|
|
50
|
+
return this.session;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Check if authenticated
|
|
54
|
+
*/
|
|
55
|
+
isAuthenticated() {
|
|
56
|
+
return this.session !== null;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Clear session
|
|
60
|
+
*/
|
|
61
|
+
disconnect() {
|
|
62
|
+
this.session = null;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Get auth status
|
|
66
|
+
*/
|
|
67
|
+
getStatus() {
|
|
68
|
+
if (!this.session) {
|
|
69
|
+
return { authenticated: false };
|
|
70
|
+
}
|
|
71
|
+
const status = {
|
|
72
|
+
authenticated: true,
|
|
73
|
+
apiUrl: this.session.apiUrl,
|
|
74
|
+
authType: this.session.authType,
|
|
75
|
+
};
|
|
76
|
+
if (this.session.userId !== undefined) {
|
|
77
|
+
status.userId = this.session.userId;
|
|
78
|
+
}
|
|
79
|
+
return status;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Get authentication type
|
|
83
|
+
* @throws MCPError if not authenticated
|
|
84
|
+
*/
|
|
85
|
+
getAuthType() {
|
|
86
|
+
if (!this.session) {
|
|
87
|
+
throw new types_1.MCPError(types_1.ErrorCode.AUTH_REQUIRED, 'Authentication required. Please use vikunja_auth.connect first.');
|
|
88
|
+
}
|
|
89
|
+
return this.session.authType;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Save session with auth type
|
|
93
|
+
*/
|
|
94
|
+
saveSession(session) {
|
|
95
|
+
this.session = session;
|
|
96
|
+
}
|
|
97
|
+
// ==========================================
|
|
98
|
+
// TEST-ONLY METHODS - Protected by environment checks
|
|
99
|
+
// These methods are only available in test environments
|
|
100
|
+
// ==========================================
|
|
101
|
+
/**
|
|
102
|
+
* Test-only method to set user ID
|
|
103
|
+
* @throws Error if used in production
|
|
104
|
+
*/
|
|
105
|
+
setTestUserId(userId) {
|
|
106
|
+
this.validateTestEnvironment();
|
|
107
|
+
if (!this.session) {
|
|
108
|
+
throw new types_1.MCPError(types_1.ErrorCode.AUTH_REQUIRED, 'Authentication required. Please use vikunja_auth.connect first.');
|
|
109
|
+
}
|
|
110
|
+
this.session.userId = userId;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Test-only method to set token expiry
|
|
114
|
+
* @throws Error if used in production
|
|
115
|
+
*/
|
|
116
|
+
setTestTokenExpiry(expiry) {
|
|
117
|
+
this.validateTestEnvironment();
|
|
118
|
+
if (!this.session) {
|
|
119
|
+
throw new types_1.MCPError(types_1.ErrorCode.AUTH_REQUIRED, 'Authentication required. Please use vikunja_auth.connect first.');
|
|
120
|
+
}
|
|
121
|
+
this.session.tokenExpiry = expiry;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Validate test environment - prevents test methods from being used in production
|
|
125
|
+
* @throws Error if not in test environment
|
|
126
|
+
*/
|
|
127
|
+
validateTestEnvironment() {
|
|
128
|
+
const nodeEnv = process.env.NODE_ENV;
|
|
129
|
+
const jestRunning = process.env.JEST_WORKER_ID !== undefined || process.env.NODE_ENV === 'test';
|
|
130
|
+
if (!jestRunning && nodeEnv !== 'test' && nodeEnv !== 'development') {
|
|
131
|
+
throw new Error('AuthManager test methods can only be used in test environments. ' +
|
|
132
|
+
'This is a security measure to prevent testing methods from being accessible in production.');
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
exports.AuthManager = AuthManager;
|
|
137
|
+
//# sourceMappingURL=AuthManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AuthManager.js","sourceRoot":"","sources":["../../src/auth/AuthManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auth Module Exports - Simplified
|
|
3
|
+
* Eliminated over-engineered testing infrastructure
|
|
4
|
+
*/
|
|
5
|
+
export { AuthManager } from './AuthManager';
|
|
6
|
+
export { Permission, PermissionManager, TOOL_PERMISSIONS, type PermissionCheckResult } from './permissions';
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,KAAK,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Auth Module Exports - Simplified
|
|
4
|
+
* Eliminated over-engineered testing infrastructure
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.TOOL_PERMISSIONS = exports.PermissionManager = exports.Permission = exports.AuthManager = void 0;
|
|
8
|
+
var AuthManager_1 = require("./AuthManager");
|
|
9
|
+
Object.defineProperty(exports, "AuthManager", { enumerable: true, get: function () { return AuthManager_1.AuthManager; } });
|
|
10
|
+
var permissions_1 = require("./permissions");
|
|
11
|
+
Object.defineProperty(exports, "Permission", { enumerable: true, get: function () { return permissions_1.Permission; } });
|
|
12
|
+
Object.defineProperty(exports, "PermissionManager", { enumerable: true, get: function () { return permissions_1.PermissionManager; } });
|
|
13
|
+
Object.defineProperty(exports, "TOOL_PERMISSIONS", { enumerable: true, get: function () { return permissions_1.TOOL_PERMISSIONS; } });
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,6CAA4C;AAAnC,0GAAA,WAAW,OAAA;AACpB,6CAA4G;AAAnG,yGAAA,UAAU,OAAA;AAAE,gHAAA,iBAAiB,OAAA;AAAE,+GAAA,gBAAgB,OAAA"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Permission System for Tool Access Control
|
|
3
|
+
* Centralizes authentication requirements and eliminates conditional tool registration
|
|
4
|
+
*/
|
|
5
|
+
import type { AuthSession } from '../types';
|
|
6
|
+
/**
|
|
7
|
+
* Permissions required for different tool operations
|
|
8
|
+
*/
|
|
9
|
+
export declare enum Permission {
|
|
10
|
+
BASIC_AUTH = "basic_auth",// Basic authentication required
|
|
11
|
+
TASK_MANAGEMENT = "task_management",// Task CRUD operations
|
|
12
|
+
PROJECT_MANAGEMENT = "project_management",// Project CRUD operations
|
|
13
|
+
LABEL_MANAGEMENT = "label_management",// Label CRUD operations
|
|
14
|
+
TEAM_MANAGEMENT = "team_management",// Team CRUD operations
|
|
15
|
+
FILTER_MANAGEMENT = "filter_management",// Filter operations
|
|
16
|
+
TEMPLATE_MANAGEMENT = "template_management",// Template operations
|
|
17
|
+
WEBHOOK_MANAGEMENT = "webhook_management",// Webhook operations
|
|
18
|
+
BATCH_IMPORT = "batch_import",// Batch import operations
|
|
19
|
+
USER_MANAGEMENT = "user_management",// User operations and settings
|
|
20
|
+
DATA_EXPORT = "data_export"
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Maps tools to their required permissions
|
|
24
|
+
*/
|
|
25
|
+
export declare const TOOL_PERMISSIONS: Record<string, Permission[]>;
|
|
26
|
+
/**
|
|
27
|
+
* Permission validation result
|
|
28
|
+
*/
|
|
29
|
+
export interface PermissionCheckResult {
|
|
30
|
+
hasPermission: boolean;
|
|
31
|
+
missingPermissions: Permission[];
|
|
32
|
+
suggestedAuthType?: 'jwt';
|
|
33
|
+
errorMessage?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Centralized permission checker
|
|
37
|
+
*/
|
|
38
|
+
export declare class PermissionManager {
|
|
39
|
+
/**
|
|
40
|
+
* Check if current session has required permissions for a tool
|
|
41
|
+
*/
|
|
42
|
+
static checkToolPermission(session: AuthSession | null, toolName: string): PermissionCheckResult;
|
|
43
|
+
/**
|
|
44
|
+
* Check if session has specific permissions
|
|
45
|
+
*/
|
|
46
|
+
static checkPermissions(session: AuthSession, requiredPermissions: Permission[]): PermissionCheckResult;
|
|
47
|
+
/**
|
|
48
|
+
* Get all available permissions for an auth type
|
|
49
|
+
*/
|
|
50
|
+
static getAvailablePermissions(authType: 'api-token' | 'jwt'): Permission[];
|
|
51
|
+
/**
|
|
52
|
+
* Check if upgrading to JWT would grant the missing permissions
|
|
53
|
+
*/
|
|
54
|
+
private static shouldSuggestJWT;
|
|
55
|
+
/**
|
|
56
|
+
* Generate helpful error message for permission failures
|
|
57
|
+
*/
|
|
58
|
+
private static generatePermissionErrorMessage;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/auth/permissions.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAE5C;;GAEG;AACH,oBAAY,UAAU;IAEpB,UAAU,eAAe,CAAW,gCAAgC;IACpE,eAAe,oBAAoB,CAAE,uBAAuB;IAC5D,kBAAkB,uBAAuB,CAAE,0BAA0B;IACrE,gBAAgB,qBAAqB,CAAE,wBAAwB;IAC/D,eAAe,oBAAoB,CAAE,uBAAuB;IAC5D,iBAAiB,sBAAsB,CAAE,oBAAoB;IAC7D,mBAAmB,wBAAwB,CAAE,sBAAsB;IACnE,kBAAkB,uBAAuB,CAAE,qBAAqB;IAChE,YAAY,iBAAiB,CAAO,0BAA0B;IAG9D,eAAe,oBAAoB,CAAE,+BAA+B;IACpE,WAAW,gBAAgB;CAC5B;AAiCD;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,EAAE,CAiBzD,CAAC;AAEF;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,aAAa,EAAE,OAAO,CAAC;IACvB,kBAAkB,EAAE,UAAU,EAAE,CAAC;IACjC,iBAAiB,CAAC,EAAE,KAAK,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,qBAAa,iBAAiB;IAC5B;;OAEG;IACH,MAAM,CAAC,mBAAmB,CACxB,OAAO,EAAE,WAAW,GAAG,IAAI,EAC3B,QAAQ,EAAE,MAAM,GACf,qBAAqB;IAqBxB;;OAEG;IACH,MAAM,CAAC,gBAAgB,CACrB,OAAO,EAAE,WAAW,EACpB,mBAAmB,EAAE,UAAU,EAAE,GAChC,qBAAqB;IAsCxB;;OAEG;IACH,MAAM,CAAC,uBAAuB,CAAC,QAAQ,EAAE,WAAW,GAAG,KAAK,GAAG,UAAU,EAAE;IAI3E;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAK/B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,8BAA8B;CAyB9C"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Permission System for Tool Access Control
|
|
4
|
+
* Centralizes authentication requirements and eliminates conditional tool registration
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.PermissionManager = exports.TOOL_PERMISSIONS = exports.Permission = void 0;
|
|
8
|
+
/**
|
|
9
|
+
* Permissions required for different tool operations
|
|
10
|
+
*/
|
|
11
|
+
var Permission;
|
|
12
|
+
(function (Permission) {
|
|
13
|
+
// Basic permissions available with both auth types
|
|
14
|
+
Permission["BASIC_AUTH"] = "basic_auth";
|
|
15
|
+
Permission["TASK_MANAGEMENT"] = "task_management";
|
|
16
|
+
Permission["PROJECT_MANAGEMENT"] = "project_management";
|
|
17
|
+
Permission["LABEL_MANAGEMENT"] = "label_management";
|
|
18
|
+
Permission["TEAM_MANAGEMENT"] = "team_management";
|
|
19
|
+
Permission["FILTER_MANAGEMENT"] = "filter_management";
|
|
20
|
+
Permission["TEMPLATE_MANAGEMENT"] = "template_management";
|
|
21
|
+
Permission["WEBHOOK_MANAGEMENT"] = "webhook_management";
|
|
22
|
+
Permission["BATCH_IMPORT"] = "batch_import";
|
|
23
|
+
// Advanced permissions requiring JWT authentication
|
|
24
|
+
Permission["USER_MANAGEMENT"] = "user_management";
|
|
25
|
+
Permission["DATA_EXPORT"] = "data_export";
|
|
26
|
+
})(Permission || (exports.Permission = Permission = {}));
|
|
27
|
+
/**
|
|
28
|
+
* Maps authentication types to their available permissions
|
|
29
|
+
*/
|
|
30
|
+
const AUTH_TYPE_PERMISSIONS = {
|
|
31
|
+
'api-token': [
|
|
32
|
+
Permission.BASIC_AUTH,
|
|
33
|
+
Permission.TASK_MANAGEMENT,
|
|
34
|
+
Permission.PROJECT_MANAGEMENT,
|
|
35
|
+
Permission.LABEL_MANAGEMENT,
|
|
36
|
+
Permission.TEAM_MANAGEMENT,
|
|
37
|
+
Permission.FILTER_MANAGEMENT,
|
|
38
|
+
Permission.TEMPLATE_MANAGEMENT,
|
|
39
|
+
Permission.WEBHOOK_MANAGEMENT,
|
|
40
|
+
Permission.BATCH_IMPORT,
|
|
41
|
+
],
|
|
42
|
+
'jwt': [
|
|
43
|
+
// JWT includes all API token permissions plus advanced ones
|
|
44
|
+
Permission.BASIC_AUTH,
|
|
45
|
+
Permission.TASK_MANAGEMENT,
|
|
46
|
+
Permission.PROJECT_MANAGEMENT,
|
|
47
|
+
Permission.LABEL_MANAGEMENT,
|
|
48
|
+
Permission.TEAM_MANAGEMENT,
|
|
49
|
+
Permission.FILTER_MANAGEMENT,
|
|
50
|
+
Permission.TEMPLATE_MANAGEMENT,
|
|
51
|
+
Permission.WEBHOOK_MANAGEMENT,
|
|
52
|
+
Permission.BATCH_IMPORT,
|
|
53
|
+
Permission.USER_MANAGEMENT,
|
|
54
|
+
Permission.DATA_EXPORT,
|
|
55
|
+
],
|
|
56
|
+
};
|
|
57
|
+
/**
|
|
58
|
+
* Maps tools to their required permissions
|
|
59
|
+
*/
|
|
60
|
+
exports.TOOL_PERMISSIONS = {
|
|
61
|
+
// Always available (only requires basic auth)
|
|
62
|
+
'vikunja_auth': [Permission.BASIC_AUTH],
|
|
63
|
+
'vikunja_tasks': [Permission.BASIC_AUTH, Permission.TASK_MANAGEMENT],
|
|
64
|
+
'vikunja_projects': [Permission.BASIC_AUTH, Permission.PROJECT_MANAGEMENT],
|
|
65
|
+
'vikunja_labels': [Permission.BASIC_AUTH, Permission.LABEL_MANAGEMENT],
|
|
66
|
+
'vikunja_teams': [Permission.BASIC_AUTH, Permission.TEAM_MANAGEMENT],
|
|
67
|
+
'vikunja_filters': [Permission.BASIC_AUTH, Permission.FILTER_MANAGEMENT],
|
|
68
|
+
'vikunja_templates': [Permission.BASIC_AUTH, Permission.TEMPLATE_MANAGEMENT],
|
|
69
|
+
'vikunja_webhooks': [Permission.BASIC_AUTH, Permission.WEBHOOK_MANAGEMENT],
|
|
70
|
+
'vikunja_batch_import': [Permission.BASIC_AUTH, Permission.BATCH_IMPORT],
|
|
71
|
+
// JWT-only tools
|
|
72
|
+
'vikunja_users': [Permission.BASIC_AUTH, Permission.USER_MANAGEMENT],
|
|
73
|
+
'vikunja_export_project': [Permission.BASIC_AUTH, Permission.DATA_EXPORT],
|
|
74
|
+
'vikunja_request_user_export': [Permission.BASIC_AUTH, Permission.DATA_EXPORT],
|
|
75
|
+
'vikunja_download_user_export': [Permission.BASIC_AUTH, Permission.DATA_EXPORT],
|
|
76
|
+
};
|
|
77
|
+
/**
|
|
78
|
+
* Centralized permission checker
|
|
79
|
+
*/
|
|
80
|
+
class PermissionManager {
|
|
81
|
+
/**
|
|
82
|
+
* Check if current session has required permissions for a tool
|
|
83
|
+
*/
|
|
84
|
+
static checkToolPermission(session, toolName) {
|
|
85
|
+
// Handle no authentication
|
|
86
|
+
if (!session) {
|
|
87
|
+
const requiredPermissions = exports.TOOL_PERMISSIONS[toolName] || [Permission.BASIC_AUTH];
|
|
88
|
+
return {
|
|
89
|
+
hasPermission: false,
|
|
90
|
+
missingPermissions: requiredPermissions,
|
|
91
|
+
errorMessage: 'Authentication required. Please use vikunja_auth.connect first.',
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
// Get required permissions for the tool
|
|
95
|
+
const requiredPermissions = exports.TOOL_PERMISSIONS[toolName];
|
|
96
|
+
if (!requiredPermissions) {
|
|
97
|
+
// Unknown tool - allow by default but require basic auth
|
|
98
|
+
return this.checkPermissions(session, [Permission.BASIC_AUTH]);
|
|
99
|
+
}
|
|
100
|
+
return this.checkPermissions(session, requiredPermissions);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Check if session has specific permissions
|
|
104
|
+
*/
|
|
105
|
+
static checkPermissions(session, requiredPermissions) {
|
|
106
|
+
const availablePermissions = AUTH_TYPE_PERMISSIONS[session.authType];
|
|
107
|
+
const missingPermissions = [];
|
|
108
|
+
// Handle case where auth type is not recognized
|
|
109
|
+
if (!availablePermissions) {
|
|
110
|
+
return {
|
|
111
|
+
hasPermission: false,
|
|
112
|
+
missingPermissions: requiredPermissions,
|
|
113
|
+
errorMessage: `Unknown authentication type: ${session.authType}`,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
// Check each required permission
|
|
117
|
+
for (const permission of requiredPermissions) {
|
|
118
|
+
if (!availablePermissions.includes(permission)) {
|
|
119
|
+
missingPermissions.push(permission);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (missingPermissions.length === 0) {
|
|
123
|
+
return { hasPermission: true, missingPermissions: [] };
|
|
124
|
+
}
|
|
125
|
+
// Generate helpful error message and suggestions
|
|
126
|
+
const errorMessage = this.generatePermissionErrorMessage(session.authType, missingPermissions);
|
|
127
|
+
const suggestedAuthType = this.shouldSuggestJWT(missingPermissions) ? 'jwt' : undefined;
|
|
128
|
+
const result = {
|
|
129
|
+
hasPermission: false,
|
|
130
|
+
missingPermissions,
|
|
131
|
+
errorMessage,
|
|
132
|
+
...(suggestedAuthType !== undefined && { suggestedAuthType }),
|
|
133
|
+
};
|
|
134
|
+
return result;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Get all available permissions for an auth type
|
|
138
|
+
*/
|
|
139
|
+
static getAvailablePermissions(authType) {
|
|
140
|
+
return [...AUTH_TYPE_PERMISSIONS[authType]];
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Check if upgrading to JWT would grant the missing permissions
|
|
144
|
+
*/
|
|
145
|
+
static shouldSuggestJWT(missingPermissions) {
|
|
146
|
+
const jwtOnlyPermissions = [Permission.USER_MANAGEMENT, Permission.DATA_EXPORT];
|
|
147
|
+
return missingPermissions.some(permission => jwtOnlyPermissions.includes(permission));
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Generate helpful error message for permission failures
|
|
151
|
+
*/
|
|
152
|
+
static generatePermissionErrorMessage(currentAuthType, missingPermissions) {
|
|
153
|
+
const jwtOnlyPermissions = [Permission.USER_MANAGEMENT, Permission.DATA_EXPORT];
|
|
154
|
+
const needsJWT = missingPermissions.some(permission => jwtOnlyPermissions.includes(permission));
|
|
155
|
+
if (needsJWT && currentAuthType === 'api-token') {
|
|
156
|
+
const operationNames = missingPermissions
|
|
157
|
+
.filter(p => jwtOnlyPermissions.includes(p))
|
|
158
|
+
.map(p => {
|
|
159
|
+
switch (p) {
|
|
160
|
+
case Permission.USER_MANAGEMENT: return 'user operations';
|
|
161
|
+
case Permission.DATA_EXPORT: return 'export operations';
|
|
162
|
+
default: return p.replace('_', ' ');
|
|
163
|
+
}
|
|
164
|
+
})
|
|
165
|
+
.join(' and ');
|
|
166
|
+
return `${operationNames} require JWT authentication. Please reconnect using vikunja_auth.connect with JWT authentication.`;
|
|
167
|
+
}
|
|
168
|
+
// Generic permission error (shouldn't happen in current implementation)
|
|
169
|
+
return `Insufficient permissions. Missing: ${missingPermissions.join(', ')}`;
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
exports.PermissionManager = PermissionManager;
|
|
173
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/auth/permissions.ts"],"names":[],"mappings":"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"}
|