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