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.
Files changed (582) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +123 -0
  3. package/dist/auth/AuthManager.d.ts +63 -0
  4. package/dist/auth/AuthManager.d.ts.map +1 -0
  5. package/dist/auth/AuthManager.js +137 -0
  6. package/dist/auth/AuthManager.js.map +1 -0
  7. package/dist/auth/index.d.ts +7 -0
  8. package/dist/auth/index.d.ts.map +1 -0
  9. package/dist/auth/index.js +14 -0
  10. package/dist/auth/index.js.map +1 -0
  11. package/dist/auth/permissions.d.ts +60 -0
  12. package/dist/auth/permissions.d.ts.map +1 -0
  13. package/dist/auth/permissions.js +173 -0
  14. package/dist/auth/permissions.js.map +1 -0
  15. package/dist/client/VikunjaClientFactory.d.ts +41 -0
  16. package/dist/client/VikunjaClientFactory.d.ts.map +1 -0
  17. package/dist/client/VikunjaClientFactory.js +58 -0
  18. package/dist/client/VikunjaClientFactory.js.map +1 -0
  19. package/dist/client.d.ts +70 -0
  20. package/dist/client.d.ts.map +1 -0
  21. package/dist/client.js +136 -0
  22. package/dist/client.js.map +1 -0
  23. package/dist/config/ConfigurationManager.d.ts +106 -0
  24. package/dist/config/ConfigurationManager.d.ts.map +1 -0
  25. package/dist/config/ConfigurationManager.js +509 -0
  26. package/dist/config/ConfigurationManager.js.map +1 -0
  27. package/dist/config/index.d.ts +9 -0
  28. package/dist/config/index.d.ts.map +1 -0
  29. package/dist/config/index.js +36 -0
  30. package/dist/config/index.js.map +1 -0
  31. package/dist/config/secrets.d.ts +33 -0
  32. package/dist/config/secrets.d.ts.map +1 -0
  33. package/dist/config/secrets.js +90 -0
  34. package/dist/config/secrets.js.map +1 -0
  35. package/dist/config/types.d.ts +1113 -0
  36. package/dist/config/types.d.ts.map +1 -0
  37. package/dist/config/types.js +189 -0
  38. package/dist/config/types.js.map +1 -0
  39. package/dist/formatters/BatchImportResponseFormatter.d.ts +89 -0
  40. package/dist/formatters/BatchImportResponseFormatter.d.ts.map +1 -0
  41. package/dist/formatters/BatchImportResponseFormatter.js +125 -0
  42. package/dist/formatters/BatchImportResponseFormatter.js.map +1 -0
  43. package/dist/index.d.ts +20 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +130 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/middleware/direct-middleware.d.ts +9 -0
  48. package/dist/middleware/direct-middleware.d.ts.map +1 -0
  49. package/dist/middleware/direct-middleware.js +49 -0
  50. package/dist/middleware/direct-middleware.js.map +1 -0
  51. package/dist/middleware/index.d.ts +8 -0
  52. package/dist/middleware/index.d.ts.map +1 -0
  53. package/dist/middleware/index.js +21 -0
  54. package/dist/middleware/index.js.map +1 -0
  55. package/dist/middleware/simplified-rate-limit.d.ts +147 -0
  56. package/dist/middleware/simplified-rate-limit.d.ts.map +1 -0
  57. package/dist/middleware/simplified-rate-limit.js +533 -0
  58. package/dist/middleware/simplified-rate-limit.js.map +1 -0
  59. package/dist/parsers/CSVParser.d.ts +36 -0
  60. package/dist/parsers/CSVParser.d.ts.map +1 -0
  61. package/dist/parsers/CSVParser.js +69 -0
  62. package/dist/parsers/CSVParser.js.map +1 -0
  63. package/dist/parsers/InputParserFactory.d.ts +17 -0
  64. package/dist/parsers/InputParserFactory.d.ts.map +1 -0
  65. package/dist/parsers/InputParserFactory.js +137 -0
  66. package/dist/parsers/InputParserFactory.js.map +1 -0
  67. package/dist/parsers/JSONParser.d.ts +74 -0
  68. package/dist/parsers/JSONParser.d.ts.map +1 -0
  69. package/dist/parsers/JSONParser.js +69 -0
  70. package/dist/parsers/JSONParser.js.map +1 -0
  71. package/dist/services/EntityResolver.d.ts +92 -0
  72. package/dist/services/EntityResolver.d.ts.map +1 -0
  73. package/dist/services/EntityResolver.js +201 -0
  74. package/dist/services/EntityResolver.js.map +1 -0
  75. package/dist/services/TaskCreationService.d.ts +99 -0
  76. package/dist/services/TaskCreationService.d.ts.map +1 -0
  77. package/dist/services/TaskCreationService.js +392 -0
  78. package/dist/services/TaskCreationService.js.map +1 -0
  79. package/dist/storage/SimpleFilterStorage.d.ts +103 -0
  80. package/dist/storage/SimpleFilterStorage.d.ts.map +1 -0
  81. package/dist/storage/SimpleFilterStorage.js +350 -0
  82. package/dist/storage/SimpleFilterStorage.js.map +1 -0
  83. package/dist/storage/filtering/FilterSerializer.d.ts +45 -0
  84. package/dist/storage/filtering/FilterSerializer.d.ts.map +1 -0
  85. package/dist/storage/filtering/FilterSerializer.js +171 -0
  86. package/dist/storage/filtering/FilterSerializer.js.map +1 -0
  87. package/dist/storage/filtering/FilterValidator.d.ts +59 -0
  88. package/dist/storage/filtering/FilterValidator.d.ts.map +1 -0
  89. package/dist/storage/filtering/FilterValidator.js +183 -0
  90. package/dist/storage/filtering/FilterValidator.js.map +1 -0
  91. package/dist/storage/index.d.ts +61 -0
  92. package/dist/storage/index.d.ts.map +1 -0
  93. package/dist/storage/index.js +125 -0
  94. package/dist/storage/index.js.map +1 -0
  95. package/dist/storage/templateFileStore.d.ts +62 -0
  96. package/dist/storage/templateFileStore.d.ts.map +1 -0
  97. package/dist/storage/templateFileStore.js +151 -0
  98. package/dist/storage/templateFileStore.js.map +1 -0
  99. package/dist/tools/admin.d.ts +51 -0
  100. package/dist/tools/admin.d.ts.map +1 -0
  101. package/dist/tools/admin.js +207 -0
  102. package/dist/tools/admin.js.map +1 -0
  103. package/dist/tools/auth.d.ts +9 -0
  104. package/dist/tools/auth.d.ts.map +1 -0
  105. package/dist/tools/auth.js +175 -0
  106. package/dist/tools/auth.js.map +1 -0
  107. package/dist/tools/batch-import.d.ts +5 -0
  108. package/dist/tools/batch-import.d.ts.map +1 -0
  109. package/dist/tools/batch-import.js +153 -0
  110. package/dist/tools/batch-import.js.map +1 -0
  111. package/dist/tools/caldav-tokens.d.ts +45 -0
  112. package/dist/tools/caldav-tokens.d.ts.map +1 -0
  113. package/dist/tools/caldav-tokens.js +93 -0
  114. package/dist/tools/caldav-tokens.js.map +1 -0
  115. package/dist/tools/export.d.ts +14 -0
  116. package/dist/tools/export.d.ts.map +1 -0
  117. package/dist/tools/export.js +252 -0
  118. package/dist/tools/export.js.map +1 -0
  119. package/dist/tools/filters.d.ts +50 -0
  120. package/dist/tools/filters.d.ts.map +1 -0
  121. package/dist/tools/filters.js +512 -0
  122. package/dist/tools/filters.js.map +1 -0
  123. package/dist/tools/index.d.ts +53 -0
  124. package/dist/tools/index.d.ts.map +1 -0
  125. package/dist/tools/index.js +217 -0
  126. package/dist/tools/index.js.map +1 -0
  127. package/dist/tools/labels.d.ts +22 -0
  128. package/dist/tools/labels.d.ts.map +1 -0
  129. package/dist/tools/labels.js +206 -0
  130. package/dist/tools/labels.js.map +1 -0
  131. package/dist/tools/notifications.d.ts +17 -0
  132. package/dist/tools/notifications.d.ts.map +1 -0
  133. package/dist/tools/notifications.js +171 -0
  134. package/dist/tools/notifications.js.map +1 -0
  135. package/dist/tools/projects/backgrounds.d.ts +80 -0
  136. package/dist/tools/projects/backgrounds.d.ts.map +1 -0
  137. package/dist/tools/projects/backgrounds.js +154 -0
  138. package/dist/tools/projects/backgrounds.js.map +1 -0
  139. package/dist/tools/projects/buckets.d.ts +147 -0
  140. package/dist/tools/projects/buckets.d.ts.map +1 -0
  141. package/dist/tools/projects/buckets.js +291 -0
  142. package/dist/tools/projects/buckets.js.map +1 -0
  143. package/dist/tools/projects/crud.d.ts +145 -0
  144. package/dist/tools/projects/crud.d.ts.map +1 -0
  145. package/dist/tools/projects/crud.js +425 -0
  146. package/dist/tools/projects/crud.js.map +1 -0
  147. package/dist/tools/projects/duplicate.d.ts +41 -0
  148. package/dist/tools/projects/duplicate.d.ts.map +1 -0
  149. package/dist/tools/projects/duplicate.js +49 -0
  150. package/dist/tools/projects/duplicate.js.map +1 -0
  151. package/dist/tools/projects/hierarchy.d.ts +77 -0
  152. package/dist/tools/projects/hierarchy.d.ts.map +1 -0
  153. package/dist/tools/projects/hierarchy.js +300 -0
  154. package/dist/tools/projects/hierarchy.js.map +1 -0
  155. package/dist/tools/projects/index.d.ts +34 -0
  156. package/dist/tools/projects/index.d.ts.map +1 -0
  157. package/dist/tools/projects/index.js +522 -0
  158. package/dist/tools/projects/index.js.map +1 -0
  159. package/dist/tools/projects/permission.d.ts +26 -0
  160. package/dist/tools/projects/permission.d.ts.map +1 -0
  161. package/dist/tools/projects/permission.js +53 -0
  162. package/dist/tools/projects/permission.js.map +1 -0
  163. package/dist/tools/projects/response-formatter.d.ts +54 -0
  164. package/dist/tools/projects/response-formatter.d.ts.map +1 -0
  165. package/dist/tools/projects/response-formatter.js +139 -0
  166. package/dist/tools/projects/response-formatter.js.map +1 -0
  167. package/dist/tools/projects/sharing-access.d.ts +165 -0
  168. package/dist/tools/projects/sharing-access.d.ts.map +1 -0
  169. package/dist/tools/projects/sharing-access.js +450 -0
  170. package/dist/tools/projects/sharing-access.js.map +1 -0
  171. package/dist/tools/projects/sharing.d.ts +105 -0
  172. package/dist/tools/projects/sharing.d.ts.map +1 -0
  173. package/dist/tools/projects/sharing.js +258 -0
  174. package/dist/tools/projects/sharing.js.map +1 -0
  175. package/dist/tools/projects/validation.d.ts +51 -0
  176. package/dist/tools/projects/validation.d.ts.map +1 -0
  177. package/dist/tools/projects/validation.js +160 -0
  178. package/dist/tools/projects/validation.js.map +1 -0
  179. package/dist/tools/projects/views.d.ts +161 -0
  180. package/dist/tools/projects/views.d.ts.map +1 -0
  181. package/dist/tools/projects/views.js +234 -0
  182. package/dist/tools/projects/views.js.map +1 -0
  183. package/dist/tools/projects.d.ts +20 -0
  184. package/dist/tools/projects.d.ts.map +1 -0
  185. package/dist/tools/projects.js +66 -0
  186. package/dist/tools/projects.js.map +1 -0
  187. package/dist/tools/reactions.d.ts +25 -0
  188. package/dist/tools/reactions.d.ts.map +1 -0
  189. package/dist/tools/reactions.js +108 -0
  190. package/dist/tools/reactions.js.map +1 -0
  191. package/dist/tools/subscriptions.d.ts +23 -0
  192. package/dist/tools/subscriptions.d.ts.map +1 -0
  193. package/dist/tools/subscriptions.js +111 -0
  194. package/dist/tools/subscriptions.js.map +1 -0
  195. package/dist/tools/task-assignees.d.ts +13 -0
  196. package/dist/tools/task-assignees.d.ts.map +1 -0
  197. package/dist/tools/task-assignees.js +74 -0
  198. package/dist/tools/task-assignees.js.map +1 -0
  199. package/dist/tools/task-bulk.d.ts +13 -0
  200. package/dist/tools/task-bulk.d.ts.map +1 -0
  201. package/dist/tools/task-bulk.js +117 -0
  202. package/dist/tools/task-bulk.js.map +1 -0
  203. package/dist/tools/task-comments.d.ts +12 -0
  204. package/dist/tools/task-comments.d.ts.map +1 -0
  205. package/dist/tools/task-comments.js +65 -0
  206. package/dist/tools/task-comments.js.map +1 -0
  207. package/dist/tools/task-crud.d.ts +13 -0
  208. package/dist/tools/task-crud.d.ts.map +1 -0
  209. package/dist/tools/task-crud.js +168 -0
  210. package/dist/tools/task-crud.js.map +1 -0
  211. package/dist/tools/task-labels.d.ts +13 -0
  212. package/dist/tools/task-labels.d.ts.map +1 -0
  213. package/dist/tools/task-labels.js +64 -0
  214. package/dist/tools/task-labels.js.map +1 -0
  215. package/dist/tools/task-relations.d.ts +13 -0
  216. package/dist/tools/task-relations.d.ts.map +1 -0
  217. package/dist/tools/task-relations.js +74 -0
  218. package/dist/tools/task-relations.js.map +1 -0
  219. package/dist/tools/task-reminders.d.ts +13 -0
  220. package/dist/tools/task-reminders.d.ts.map +1 -0
  221. package/dist/tools/task-reminders.js +69 -0
  222. package/dist/tools/task-reminders.js.map +1 -0
  223. package/dist/tools/tasks/assignees/AssigneeOperationsService.d.ts +63 -0
  224. package/dist/tools/tasks/assignees/AssigneeOperationsService.d.ts.map +1 -0
  225. package/dist/tools/tasks/assignees/AssigneeOperationsService.js +152 -0
  226. package/dist/tools/tasks/assignees/AssigneeOperationsService.js.map +1 -0
  227. package/dist/tools/tasks/assignees/AssigneeResponseFormatter.d.ts +28 -0
  228. package/dist/tools/tasks/assignees/AssigneeResponseFormatter.d.ts.map +1 -0
  229. package/dist/tools/tasks/assignees/AssigneeResponseFormatter.js +73 -0
  230. package/dist/tools/tasks/assignees/AssigneeResponseFormatter.js.map +1 -0
  231. package/dist/tools/tasks/assignees/AssigneeValidationService.d.ts +46 -0
  232. package/dist/tools/tasks/assignees/AssigneeValidationService.d.ts.map +1 -0
  233. package/dist/tools/tasks/assignees/AssigneeValidationService.js +70 -0
  234. package/dist/tools/tasks/assignees/AssigneeValidationService.js.map +1 -0
  235. package/dist/tools/tasks/assignees/index.d.ts +52 -0
  236. package/dist/tools/tasks/assignees/index.d.ts.map +1 -0
  237. package/dist/tools/tasks/assignees/index.js +103 -0
  238. package/dist/tools/tasks/assignees/index.js.map +1 -0
  239. package/dist/tools/tasks/attach.d.ts +39 -0
  240. package/dist/tools/tasks/attach.d.ts.map +1 -0
  241. package/dist/tools/tasks/attach.js +90 -0
  242. package/dist/tools/tasks/attach.js.map +1 -0
  243. package/dist/tools/tasks/attachments.d.ts +67 -0
  244. package/dist/tools/tasks/attachments.d.ts.map +1 -0
  245. package/dist/tools/tasks/attachments.js +153 -0
  246. package/dist/tools/tasks/attachments.js.map +1 -0
  247. package/dist/tools/tasks/buckets.d.ts +41 -0
  248. package/dist/tools/tasks/buckets.d.ts.map +1 -0
  249. package/dist/tools/tasks/buckets.js +75 -0
  250. package/dist/tools/tasks/buckets.js.map +1 -0
  251. package/dist/tools/tasks/bulk/BatchProcessorFactory.d.ts +30 -0
  252. package/dist/tools/tasks/bulk/BatchProcessorFactory.d.ts.map +1 -0
  253. package/dist/tools/tasks/bulk/BatchProcessorFactory.js +69 -0
  254. package/dist/tools/tasks/bulk/BatchProcessorFactory.js.map +1 -0
  255. package/dist/tools/tasks/bulk/BulkOperationErrorHandler.d.ts +50 -0
  256. package/dist/tools/tasks/bulk/BulkOperationErrorHandler.d.ts.map +1 -0
  257. package/dist/tools/tasks/bulk/BulkOperationErrorHandler.js +183 -0
  258. package/dist/tools/tasks/bulk/BulkOperationErrorHandler.js.map +1 -0
  259. package/dist/tools/tasks/bulk/BulkOperationProcessor.d.ts +101 -0
  260. package/dist/tools/tasks/bulk/BulkOperationProcessor.d.ts.map +1 -0
  261. package/dist/tools/tasks/bulk/BulkOperationProcessor.js +416 -0
  262. package/dist/tools/tasks/bulk/BulkOperationProcessor.js.map +1 -0
  263. package/dist/tools/tasks/bulk/BulkOperationTypes.d.ts +50 -0
  264. package/dist/tools/tasks/bulk/BulkOperationTypes.d.ts.map +1 -0
  265. package/dist/tools/tasks/bulk/BulkOperationTypes.js +6 -0
  266. package/dist/tools/tasks/bulk/BulkOperationTypes.js.map +1 -0
  267. package/dist/tools/tasks/bulk/BulkOperationValidator.d.ts +53 -0
  268. package/dist/tools/tasks/bulk/BulkOperationValidator.d.ts.map +1 -0
  269. package/dist/tools/tasks/bulk/BulkOperationValidator.js +216 -0
  270. package/dist/tools/tasks/bulk/BulkOperationValidator.js.map +1 -0
  271. package/dist/tools/tasks/bulk/index.d.ts +9 -0
  272. package/dist/tools/tasks/bulk/index.d.ts.map +1 -0
  273. package/dist/tools/tasks/bulk/index.js +15 -0
  274. package/dist/tools/tasks/bulk/index.js.map +1 -0
  275. package/dist/tools/tasks/bulk-operations-simplified.d.ts +62 -0
  276. package/dist/tools/tasks/bulk-operations-simplified.d.ts.map +1 -0
  277. package/dist/tools/tasks/bulk-operations-simplified.js +416 -0
  278. package/dist/tools/tasks/bulk-operations-simplified.js.map +1 -0
  279. package/dist/tools/tasks/bulk-operations.d.ts +8 -0
  280. package/dist/tools/tasks/bulk-operations.d.ts.map +1 -0
  281. package/dist/tools/tasks/bulk-operations.js +13 -0
  282. package/dist/tools/tasks/bulk-operations.js.map +1 -0
  283. package/dist/tools/tasks/by-index.d.ts +36 -0
  284. package/dist/tools/tasks/by-index.d.ts.map +1 -0
  285. package/dist/tools/tasks/by-index.js +52 -0
  286. package/dist/tools/tasks/by-index.js.map +1 -0
  287. package/dist/tools/tasks/comments/CommentOperationsService.d.ts +44 -0
  288. package/dist/tools/tasks/comments/CommentOperationsService.d.ts.map +1 -0
  289. package/dist/tools/tasks/comments/CommentOperationsService.js +86 -0
  290. package/dist/tools/tasks/comments/CommentOperationsService.js.map +1 -0
  291. package/dist/tools/tasks/comments/CommentResponseFormatter.d.ts +41 -0
  292. package/dist/tools/tasks/comments/CommentResponseFormatter.d.ts.map +1 -0
  293. package/dist/tools/tasks/comments/CommentResponseFormatter.js +114 -0
  294. package/dist/tools/tasks/comments/CommentResponseFormatter.js.map +1 -0
  295. package/dist/tools/tasks/comments/CommentValidationService.d.ts +62 -0
  296. package/dist/tools/tasks/comments/CommentValidationService.d.ts.map +1 -0
  297. package/dist/tools/tasks/comments/CommentValidationService.js +105 -0
  298. package/dist/tools/tasks/comments/CommentValidationService.js.map +1 -0
  299. package/dist/tools/tasks/comments/index.d.ts +66 -0
  300. package/dist/tools/tasks/comments/index.d.ts.map +1 -0
  301. package/dist/tools/tasks/comments/index.js +99 -0
  302. package/dist/tools/tasks/comments/index.js.map +1 -0
  303. package/dist/tools/tasks/constants.d.ts +19 -0
  304. package/dist/tools/tasks/constants.d.ts.map +1 -0
  305. package/dist/tools/tasks/constants.js +82 -0
  306. package/dist/tools/tasks/constants.js.map +1 -0
  307. package/dist/tools/tasks/crud/TaskCreationService.d.ts +29 -0
  308. package/dist/tools/tasks/crud/TaskCreationService.d.ts.map +1 -0
  309. package/dist/tools/tasks/crud/TaskCreationService.js +274 -0
  310. package/dist/tools/tasks/crud/TaskCreationService.js.map +1 -0
  311. package/dist/tools/tasks/crud/TaskDeletionService.d.ts +19 -0
  312. package/dist/tools/tasks/crud/TaskDeletionService.d.ts.map +1 -0
  313. package/dist/tools/tasks/crud/TaskDeletionService.js +96 -0
  314. package/dist/tools/tasks/crud/TaskDeletionService.js.map +1 -0
  315. package/dist/tools/tasks/crud/TaskReadService.d.ts +19 -0
  316. package/dist/tools/tasks/crud/TaskReadService.d.ts.map +1 -0
  317. package/dist/tools/tasks/crud/TaskReadService.js +66 -0
  318. package/dist/tools/tasks/crud/TaskReadService.js.map +1 -0
  319. package/dist/tools/tasks/crud/TaskResponseFormatter.d.ts +18 -0
  320. package/dist/tools/tasks/crud/TaskResponseFormatter.d.ts.map +1 -0
  321. package/dist/tools/tasks/crud/TaskResponseFormatter.js +248 -0
  322. package/dist/tools/tasks/crud/TaskResponseFormatter.js.map +1 -0
  323. package/dist/tools/tasks/crud/TaskUpdateService.d.ts +33 -0
  324. package/dist/tools/tasks/crud/TaskUpdateService.d.ts.map +1 -0
  325. package/dist/tools/tasks/crud/TaskUpdateService.js +294 -0
  326. package/dist/tools/tasks/crud/TaskUpdateService.js.map +1 -0
  327. package/dist/tools/tasks/crud/index.d.ts +17 -0
  328. package/dist/tools/tasks/crud/index.d.ts.map +1 -0
  329. package/dist/tools/tasks/crud/index.js +20 -0
  330. package/dist/tools/tasks/crud/index.js.map +1 -0
  331. package/dist/tools/tasks/duplicate.d.ts +28 -0
  332. package/dist/tools/tasks/duplicate.d.ts.map +1 -0
  333. package/dist/tools/tasks/duplicate.js +41 -0
  334. package/dist/tools/tasks/duplicate.js.map +1 -0
  335. package/dist/tools/tasks/filtering/FilterExecutor.d.ts +39 -0
  336. package/dist/tools/tasks/filtering/FilterExecutor.d.ts.map +1 -0
  337. package/dist/tools/tasks/filtering/FilterExecutor.js +214 -0
  338. package/dist/tools/tasks/filtering/FilterExecutor.js.map +1 -0
  339. package/dist/tools/tasks/filtering/FilterValidator.d.ts +59 -0
  340. package/dist/tools/tasks/filtering/FilterValidator.d.ts.map +1 -0
  341. package/dist/tools/tasks/filtering/FilterValidator.js +257 -0
  342. package/dist/tools/tasks/filtering/FilterValidator.js.map +1 -0
  343. package/dist/tools/tasks/filtering/TaskFilteringOrchestrator.d.ts +78 -0
  344. package/dist/tools/tasks/filtering/TaskFilteringOrchestrator.d.ts.map +1 -0
  345. package/dist/tools/tasks/filtering/TaskFilteringOrchestrator.js +195 -0
  346. package/dist/tools/tasks/filtering/TaskFilteringOrchestrator.js.map +1 -0
  347. package/dist/tools/tasks/filtering/evaluators.d.ts +41 -0
  348. package/dist/tools/tasks/filtering/evaluators.d.ts.map +1 -0
  349. package/dist/tools/tasks/filtering/evaluators.js +224 -0
  350. package/dist/tools/tasks/filtering/evaluators.js.map +1 -0
  351. package/dist/tools/tasks/filtering/index.d.ts +11 -0
  352. package/dist/tools/tasks/filtering/index.d.ts.map +1 -0
  353. package/dist/tools/tasks/filtering/index.js +26 -0
  354. package/dist/tools/tasks/filtering/index.js.map +1 -0
  355. package/dist/tools/tasks/index.d.ts +9 -0
  356. package/dist/tools/tasks/index.d.ts.map +1 -0
  357. package/dist/tools/tasks/index.js +337 -0
  358. package/dist/tools/tasks/index.js.map +1 -0
  359. package/dist/tools/tasks/labels.d.ts +49 -0
  360. package/dist/tools/tasks/labels.d.ts.map +1 -0
  361. package/dist/tools/tasks/labels.js +223 -0
  362. package/dist/tools/tasks/labels.js.map +1 -0
  363. package/dist/tools/tasks/mark-read.d.ts +27 -0
  364. package/dist/tools/tasks/mark-read.d.ts.map +1 -0
  365. package/dist/tools/tasks/mark-read.js +38 -0
  366. package/dist/tools/tasks/mark-read.js.map +1 -0
  367. package/dist/tools/tasks/position.d.ts +53 -0
  368. package/dist/tools/tasks/position.d.ts.map +1 -0
  369. package/dist/tools/tasks/position.js +83 -0
  370. package/dist/tools/tasks/position.js.map +1 -0
  371. package/dist/tools/tasks/reminders.d.ts +56 -0
  372. package/dist/tools/tasks/reminders.d.ts.map +1 -0
  373. package/dist/tools/tasks/reminders.js +213 -0
  374. package/dist/tools/tasks/reminders.js.map +1 -0
  375. package/dist/tools/tasks/subtasks.d.ts +85 -0
  376. package/dist/tools/tasks/subtasks.d.ts.map +1 -0
  377. package/dist/tools/tasks/subtasks.js +286 -0
  378. package/dist/tools/tasks/subtasks.js.map +1 -0
  379. package/dist/tools/tasks/types/filters.d.ts +136 -0
  380. package/dist/tools/tasks/types/filters.d.ts.map +1 -0
  381. package/dist/tools/tasks/types/filters.js +7 -0
  382. package/dist/tools/tasks/types/filters.js.map +1 -0
  383. package/dist/tools/tasks/validation.d.ts +47 -0
  384. package/dist/tools/tasks/validation.d.ts.map +1 -0
  385. package/dist/tools/tasks/validation.js +131 -0
  386. package/dist/tools/tasks/validation.js.map +1 -0
  387. package/dist/tools/tasks-relations.d.ts +25 -0
  388. package/dist/tools/tasks-relations.d.ts.map +1 -0
  389. package/dist/tools/tasks-relations.js +271 -0
  390. package/dist/tools/tasks-relations.js.map +1 -0
  391. package/dist/tools/tasks.d.ts +6 -0
  392. package/dist/tools/tasks.d.ts.map +1 -0
  393. package/dist/tools/tasks.js +10 -0
  394. package/dist/tools/tasks.js.map +1 -0
  395. package/dist/tools/teams.d.ts +9 -0
  396. package/dist/tools/teams.d.ts.map +1 -0
  397. package/dist/tools/teams.js +255 -0
  398. package/dist/tools/teams.js.map +1 -0
  399. package/dist/tools/templates.d.ts +9 -0
  400. package/dist/tools/templates.d.ts.map +1 -0
  401. package/dist/tools/templates.js +450 -0
  402. package/dist/tools/templates.js.map +1 -0
  403. package/dist/tools/tokens.d.ts +37 -0
  404. package/dist/tools/tokens.d.ts.map +1 -0
  405. package/dist/tools/tokens.js +122 -0
  406. package/dist/tools/tokens.js.map +1 -0
  407. package/dist/tools/user-deletion.d.ts +41 -0
  408. package/dist/tools/user-deletion.d.ts.map +1 -0
  409. package/dist/tools/user-deletion.js +126 -0
  410. package/dist/tools/user-deletion.js.map +1 -0
  411. package/dist/tools/users.d.ts +9 -0
  412. package/dist/tools/users.d.ts.map +1 -0
  413. package/dist/tools/users.js +418 -0
  414. package/dist/tools/users.js.map +1 -0
  415. package/dist/tools/webhooks.d.ts +31 -0
  416. package/dist/tools/webhooks.d.ts.map +1 -0
  417. package/dist/tools/webhooks.js +414 -0
  418. package/dist/tools/webhooks.js.map +1 -0
  419. package/dist/transforms/base.d.ts +204 -0
  420. package/dist/transforms/base.d.ts.map +1 -0
  421. package/dist/transforms/base.js +175 -0
  422. package/dist/transforms/base.js.map +1 -0
  423. package/dist/transforms/field-selector.d.ts +27 -0
  424. package/dist/transforms/field-selector.d.ts.map +1 -0
  425. package/dist/transforms/field-selector.js +91 -0
  426. package/dist/transforms/field-selector.js.map +1 -0
  427. package/dist/transforms/index.d.ts +15 -0
  428. package/dist/transforms/index.d.ts.map +1 -0
  429. package/dist/transforms/index.js +50 -0
  430. package/dist/transforms/index.js.map +1 -0
  431. package/dist/transforms/size-calculator.d.ts +131 -0
  432. package/dist/transforms/size-calculator.d.ts.map +1 -0
  433. package/dist/transforms/size-calculator.js +284 -0
  434. package/dist/transforms/size-calculator.js.map +1 -0
  435. package/dist/transforms/task.d.ts +207 -0
  436. package/dist/transforms/task.d.ts.map +1 -0
  437. package/dist/transforms/task.js +259 -0
  438. package/dist/transforms/task.js.map +1 -0
  439. package/dist/types/errors.d.ts +65 -0
  440. package/dist/types/errors.d.ts.map +1 -0
  441. package/dist/types/errors.js +44 -0
  442. package/dist/types/errors.js.map +1 -0
  443. package/dist/types/filters.d.ts +149 -0
  444. package/dist/types/filters.d.ts.map +1 -0
  445. package/dist/types/filters.js +26 -0
  446. package/dist/types/filters.js.map +1 -0
  447. package/dist/types/index.d.ts +147 -0
  448. package/dist/types/index.d.ts.map +1 -0
  449. package/dist/types/index.js +24 -0
  450. package/dist/types/index.js.map +1 -0
  451. package/dist/types/node-vikunja-extended.d.ts +36 -0
  452. package/dist/types/node-vikunja-extended.d.ts.map +1 -0
  453. package/dist/types/node-vikunja-extended.js +25 -0
  454. package/dist/types/node-vikunja-extended.js.map +1 -0
  455. package/dist/types/responses.d.ts +121 -0
  456. package/dist/types/responses.d.ts.map +1 -0
  457. package/dist/types/responses.js +26 -0
  458. package/dist/types/responses.js.map +1 -0
  459. package/dist/types/vikunja.d.ts +319 -0
  460. package/dist/types/vikunja.d.ts.map +1 -0
  461. package/dist/types/vikunja.js +7 -0
  462. package/dist/types/vikunja.js.map +1 -0
  463. package/dist/utils/auth-error-handler.d.ts +23 -0
  464. package/dist/utils/auth-error-handler.d.ts.map +1 -0
  465. package/dist/utils/auth-error-handler.js +162 -0
  466. package/dist/utils/auth-error-handler.js.map +1 -0
  467. package/dist/utils/composite-operation.d.ts +184 -0
  468. package/dist/utils/composite-operation.d.ts.map +1 -0
  469. package/dist/utils/composite-operation.js +293 -0
  470. package/dist/utils/composite-operation.js.map +1 -0
  471. package/dist/utils/error-handler.d.ts +39 -0
  472. package/dist/utils/error-handler.d.ts.map +1 -0
  473. package/dist/utils/error-handler.js +336 -0
  474. package/dist/utils/error-handler.js.map +1 -0
  475. package/dist/utils/filtering/ClientSideFilteringStrategy.d.ts +13 -0
  476. package/dist/utils/filtering/ClientSideFilteringStrategy.d.ts.map +1 -0
  477. package/dist/utils/filtering/ClientSideFilteringStrategy.js +129 -0
  478. package/dist/utils/filtering/ClientSideFilteringStrategy.js.map +1 -0
  479. package/dist/utils/filtering/FilteringContext.d.ts +40 -0
  480. package/dist/utils/filtering/FilteringContext.d.ts.map +1 -0
  481. package/dist/utils/filtering/FilteringContext.js +58 -0
  482. package/dist/utils/filtering/FilteringContext.js.map +1 -0
  483. package/dist/utils/filtering/HybridFilteringStrategy.d.ts +15 -0
  484. package/dist/utils/filtering/HybridFilteringStrategy.d.ts.map +1 -0
  485. package/dist/utils/filtering/HybridFilteringStrategy.js +55 -0
  486. package/dist/utils/filtering/HybridFilteringStrategy.js.map +1 -0
  487. package/dist/utils/filtering/RestCrossProjectFilteringStrategy.d.ts +42 -0
  488. package/dist/utils/filtering/RestCrossProjectFilteringStrategy.d.ts.map +1 -0
  489. package/dist/utils/filtering/RestCrossProjectFilteringStrategy.js +120 -0
  490. package/dist/utils/filtering/RestCrossProjectFilteringStrategy.js.map +1 -0
  491. package/dist/utils/filtering/ServerSideFilteringStrategy.d.ts +13 -0
  492. package/dist/utils/filtering/ServerSideFilteringStrategy.d.ts.map +1 -0
  493. package/dist/utils/filtering/ServerSideFilteringStrategy.js +88 -0
  494. package/dist/utils/filtering/ServerSideFilteringStrategy.js.map +1 -0
  495. package/dist/utils/filtering/TaskFilteringStrategy.d.ts +19 -0
  496. package/dist/utils/filtering/TaskFilteringStrategy.d.ts.map +1 -0
  497. package/dist/utils/filtering/TaskFilteringStrategy.js +10 -0
  498. package/dist/utils/filtering/TaskFilteringStrategy.js.map +1 -0
  499. package/dist/utils/filtering/index.d.ts +14 -0
  500. package/dist/utils/filtering/index.d.ts.map +1 -0
  501. package/dist/utils/filtering/index.js +22 -0
  502. package/dist/utils/filtering/index.js.map +1 -0
  503. package/dist/utils/filtering/types.d.ts +108 -0
  504. package/dist/utils/filtering/types.d.ts.map +1 -0
  505. package/dist/utils/filtering/types.js +6 -0
  506. package/dist/utils/filtering/types.js.map +1 -0
  507. package/dist/utils/filters.d.ts +70 -0
  508. package/dist/utils/filters.d.ts.map +1 -0
  509. package/dist/utils/filters.js +812 -0
  510. package/dist/utils/filters.js.map +1 -0
  511. package/dist/utils/http-error-detail.d.ts +28 -0
  512. package/dist/utils/http-error-detail.d.ts.map +1 -0
  513. package/dist/utils/http-error-detail.js +67 -0
  514. package/dist/utils/http-error-detail.js.map +1 -0
  515. package/dist/utils/label-bulk.d.ts +21 -0
  516. package/dist/utils/label-bulk.d.ts.map +1 -0
  517. package/dist/utils/label-bulk.js +51 -0
  518. package/dist/utils/label-bulk.js.map +1 -0
  519. package/dist/utils/logger.d.ts +20 -0
  520. package/dist/utils/logger.d.ts.map +1 -0
  521. package/dist/utils/logger.js +66 -0
  522. package/dist/utils/logger.js.map +1 -0
  523. package/dist/utils/memory.d.ts +73 -0
  524. package/dist/utils/memory.d.ts.map +1 -0
  525. package/dist/utils/memory.js +194 -0
  526. package/dist/utils/memory.js.map +1 -0
  527. package/dist/utils/performance/batch-processor.d.ts +77 -0
  528. package/dist/utils/performance/batch-processor.d.ts.map +1 -0
  529. package/dist/utils/performance/batch-processor.js +218 -0
  530. package/dist/utils/performance/batch-processor.js.map +1 -0
  531. package/dist/utils/performance/index.d.ts +42 -0
  532. package/dist/utils/performance/index.d.ts.map +1 -0
  533. package/dist/utils/performance/index.js +49 -0
  534. package/dist/utils/performance/index.js.map +1 -0
  535. package/dist/utils/performance/performance-monitor.d.ts +116 -0
  536. package/dist/utils/performance/performance-monitor.d.ts.map +1 -0
  537. package/dist/utils/performance/performance-monitor.js +307 -0
  538. package/dist/utils/performance/performance-monitor.js.map +1 -0
  539. package/dist/utils/read-only.d.ts +111 -0
  540. package/dist/utils/read-only.d.ts.map +1 -0
  541. package/dist/utils/read-only.js +503 -0
  542. package/dist/utils/read-only.js.map +1 -0
  543. package/dist/utils/response-factory.d.ts +81 -0
  544. package/dist/utils/response-factory.d.ts.map +1 -0
  545. package/dist/utils/response-factory.js +86 -0
  546. package/dist/utils/response-factory.js.map +1 -0
  547. package/dist/utils/retry.d.ts +160 -0
  548. package/dist/utils/retry.d.ts.map +1 -0
  549. package/dist/utils/retry.js +316 -0
  550. package/dist/utils/retry.js.map +1 -0
  551. package/dist/utils/security.d.ts +70 -0
  552. package/dist/utils/security.d.ts.map +1 -0
  553. package/dist/utils/security.js +358 -0
  554. package/dist/utils/security.js.map +1 -0
  555. package/dist/utils/simple-response.d.ts +75 -0
  556. package/dist/utils/simple-response.d.ts.map +1 -0
  557. package/dist/utils/simple-response.js +311 -0
  558. package/dist/utils/simple-response.js.map +1 -0
  559. package/dist/utils/storage-errors.d.ts +9 -0
  560. package/dist/utils/storage-errors.d.ts.map +1 -0
  561. package/dist/utils/storage-errors.js +20 -0
  562. package/dist/utils/storage-errors.js.map +1 -0
  563. package/dist/utils/task-rest-transport.d.ts +28 -0
  564. package/dist/utils/task-rest-transport.d.ts.map +1 -0
  565. package/dist/utils/task-rest-transport.js +33 -0
  566. package/dist/utils/task-rest-transport.js.map +1 -0
  567. package/dist/utils/unicode-fix.d.ts +19 -0
  568. package/dist/utils/unicode-fix.d.ts.map +1 -0
  569. package/dist/utils/unicode-fix.js +70 -0
  570. package/dist/utils/unicode-fix.js.map +1 -0
  571. package/dist/utils/validation.d.ts +75 -0
  572. package/dist/utils/validation.d.ts.map +1 -0
  573. package/dist/utils/validation.js +758 -0
  574. package/dist/utils/validation.js.map +1 -0
  575. package/dist/utils/vikunja-rest.d.ts +159 -0
  576. package/dist/utils/vikunja-rest.d.ts.map +1 -0
  577. package/dist/utils/vikunja-rest.js +378 -0
  578. package/dist/utils/vikunja-rest.js.map +1 -0
  579. package/docs/CONFIGURATION.md +957 -0
  580. package/docs/DOCKER-DESKTOP-MCP.md +207 -0
  581. package/docs/TOOLS.md +422 -0
  582. 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: MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
6
+ [![node: 20+](https://img.shields.io/badge/node-20%2B-brightgreen.svg)](package.json)
7
+ [![MCP](https://img.shields.io/badge/MCP-server-purple.svg)](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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"}