@grigoreo-dev/otask-mcp 1.2.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 (142) hide show
  1. package/README.md +168 -0
  2. package/dist/constants.d.ts +3 -0
  3. package/dist/constants.d.ts.map +1 -0
  4. package/dist/constants.js +3 -0
  5. package/dist/constants.js.map +1 -0
  6. package/dist/docs/parser.d.ts +3 -0
  7. package/dist/docs/parser.d.ts.map +1 -0
  8. package/dist/docs/parser.js +123 -0
  9. package/dist/docs/parser.js.map +1 -0
  10. package/dist/docs/types.d.ts +29 -0
  11. package/dist/docs/types.d.ts.map +1 -0
  12. package/dist/docs/types.js +2 -0
  13. package/dist/docs/types.js.map +1 -0
  14. package/dist/http-server.d.ts +3 -0
  15. package/dist/http-server.d.ts.map +1 -0
  16. package/dist/http-server.js +92 -0
  17. package/dist/http-server.js.map +1 -0
  18. package/dist/index.d.ts +3 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +23 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/mcp-http.d.ts +3 -0
  23. package/dist/mcp-http.d.ts.map +1 -0
  24. package/dist/mcp-http.js +98 -0
  25. package/dist/mcp-http.js.map +1 -0
  26. package/dist/proxy/headers.d.ts +3 -0
  27. package/dist/proxy/headers.d.ts.map +1 -0
  28. package/dist/proxy/headers.js +37 -0
  29. package/dist/proxy/headers.js.map +1 -0
  30. package/dist/proxy/read-body.d.ts +3 -0
  31. package/dist/proxy/read-body.d.ts.map +1 -0
  32. package/dist/proxy/read-body.js +18 -0
  33. package/dist/proxy/read-body.js.map +1 -0
  34. package/dist/schemas/task.d.ts +241 -0
  35. package/dist/schemas/task.d.ts.map +1 -0
  36. package/dist/schemas/task.js +95 -0
  37. package/dist/schemas/task.js.map +1 -0
  38. package/dist/schemas/workspace.d.ts +66 -0
  39. package/dist/schemas/workspace.d.ts.map +1 -0
  40. package/dist/schemas/workspace.js +30 -0
  41. package/dist/schemas/workspace.js.map +1 -0
  42. package/dist/server.d.ts +5 -0
  43. package/dist/server.d.ts.map +1 -0
  44. package/dist/server.js +13 -0
  45. package/dist/server.js.map +1 -0
  46. package/dist/services/api.d.ts +23 -0
  47. package/dist/services/api.d.ts.map +1 -0
  48. package/dist/services/api.js +215 -0
  49. package/dist/services/api.js.map +1 -0
  50. package/dist/services/auth.d.ts +23 -0
  51. package/dist/services/auth.d.ts.map +1 -0
  52. package/dist/services/auth.js +122 -0
  53. package/dist/services/auth.js.map +1 -0
  54. package/dist/services/client.d.ts +21 -0
  55. package/dist/services/client.d.ts.map +1 -0
  56. package/dist/services/client.js +17 -0
  57. package/dist/services/client.js.map +1 -0
  58. package/dist/services/format.d.ts +6 -0
  59. package/dist/services/format.d.ts.map +1 -0
  60. package/dist/services/format.js +8 -0
  61. package/dist/services/format.js.map +1 -0
  62. package/dist/services/http-auth-context.d.ts +7 -0
  63. package/dist/services/http-auth-context.d.ts.map +1 -0
  64. package/dist/services/http-auth-context.js +9 -0
  65. package/dist/services/http-auth-context.js.map +1 -0
  66. package/dist/services/project-guard.d.ts +35 -0
  67. package/dist/services/project-guard.d.ts.map +1 -0
  68. package/dist/services/project-guard.js +85 -0
  69. package/dist/services/project-guard.js.map +1 -0
  70. package/dist/services/task-mapper.d.ts +90 -0
  71. package/dist/services/task-mapper.d.ts.map +1 -0
  72. package/dist/services/task-mapper.js +148 -0
  73. package/dist/services/task-mapper.js.map +1 -0
  74. package/dist/tools/add-comment.d.ts +4 -0
  75. package/dist/tools/add-comment.d.ts.map +1 -0
  76. package/dist/tools/add-comment.js +43 -0
  77. package/dist/tools/add-comment.js.map +1 -0
  78. package/dist/tools/archive-task.d.ts +4 -0
  79. package/dist/tools/archive-task.d.ts.map +1 -0
  80. package/dist/tools/archive-task.js +43 -0
  81. package/dist/tools/archive-task.js.map +1 -0
  82. package/dist/tools/create-task.d.ts +4 -0
  83. package/dist/tools/create-task.d.ts.map +1 -0
  84. package/dist/tools/create-task.js +45 -0
  85. package/dist/tools/create-task.js.map +1 -0
  86. package/dist/tools/get-task.d.ts +4 -0
  87. package/dist/tools/get-task.d.ts.map +1 -0
  88. package/dist/tools/get-task.js +44 -0
  89. package/dist/tools/get-task.js.map +1 -0
  90. package/dist/tools/helpers.d.ts +15 -0
  91. package/dist/tools/helpers.d.ts.map +1 -0
  92. package/dist/tools/helpers.js +19 -0
  93. package/dist/tools/helpers.js.map +1 -0
  94. package/dist/tools/list-board.d.ts +4 -0
  95. package/dist/tools/list-board.d.ts.map +1 -0
  96. package/dist/tools/list-board.js +52 -0
  97. package/dist/tools/list-board.js.map +1 -0
  98. package/dist/tools/list-comments.d.ts +4 -0
  99. package/dist/tools/list-comments.d.ts.map +1 -0
  100. package/dist/tools/list-comments.js +41 -0
  101. package/dist/tools/list-comments.js.map +1 -0
  102. package/dist/tools/list-members.d.ts +4 -0
  103. package/dist/tools/list-members.d.ts.map +1 -0
  104. package/dist/tools/list-members.js +39 -0
  105. package/dist/tools/list-members.js.map +1 -0
  106. package/dist/tools/list-project-tasks.d.ts +4 -0
  107. package/dist/tools/list-project-tasks.d.ts.map +1 -0
  108. package/dist/tools/list-project-tasks.js +52 -0
  109. package/dist/tools/list-project-tasks.js.map +1 -0
  110. package/dist/tools/list-projects.d.ts +4 -0
  111. package/dist/tools/list-projects.d.ts.map +1 -0
  112. package/dist/tools/list-projects.js +40 -0
  113. package/dist/tools/list-projects.js.map +1 -0
  114. package/dist/tools/list-tags.d.ts +4 -0
  115. package/dist/tools/list-tags.d.ts.map +1 -0
  116. package/dist/tools/list-tags.js +39 -0
  117. package/dist/tools/list-tags.js.map +1 -0
  118. package/dist/tools/move-task.d.ts +4 -0
  119. package/dist/tools/move-task.d.ts.map +1 -0
  120. package/dist/tools/move-task.js +59 -0
  121. package/dist/tools/move-task.js.map +1 -0
  122. package/dist/tools/register.d.ts +4 -0
  123. package/dist/tools/register.d.ts.map +1 -0
  124. package/dist/tools/register.js +8 -0
  125. package/dist/tools/register.js.map +1 -0
  126. package/dist/tools/registry.d.ts +15 -0
  127. package/dist/tools/registry.d.ts.map +1 -0
  128. package/dist/tools/registry.js +28 -0
  129. package/dist/tools/registry.js.map +1 -0
  130. package/dist/tools/types.d.ts +29 -0
  131. package/dist/tools/types.d.ts.map +1 -0
  132. package/dist/tools/types.js +2 -0
  133. package/dist/tools/types.js.map +1 -0
  134. package/dist/tools/update-task.d.ts +4 -0
  135. package/dist/tools/update-task.d.ts.map +1 -0
  136. package/dist/tools/update-task.js +96 -0
  137. package/dist/tools/update-task.js.map +1 -0
  138. package/dist/types.d.ts +92 -0
  139. package/dist/types.d.ts.map +1 -0
  140. package/dist/types.js +2 -0
  141. package/dist/types.js.map +1 -0
  142. package/package.json +44 -0
@@ -0,0 +1,41 @@
1
+ import { ListCommentsInputSchema, } from "../schemas/task.js";
2
+ import { assertProjectIdAllowed } from "../services/project-guard.js";
3
+ import { jsonToolResult, toolError } from "./helpers.js";
4
+ export function createListCommentsTool({ api, guard, }) {
5
+ return {
6
+ name: "otask_list_comments",
7
+ config: {
8
+ title: "List O!task Task Comments",
9
+ description: `List comments on a task. Fetches the task first to enforce project allow-list.
10
+
11
+ Args:
12
+ - ws_slug, task_slug: task identity
13
+
14
+ Returns API comments payload.
15
+
16
+ Docs: https://api.otask.ru/docs`,
17
+ inputSchema: ListCommentsInputSchema,
18
+ annotations: {
19
+ readOnlyHint: true,
20
+ destructiveHint: false,
21
+ idempotentHint: true,
22
+ openWorldHint: true,
23
+ },
24
+ },
25
+ handler: async ({ ws_slug, task_slug }) => {
26
+ try {
27
+ const current = await api.getTask(ws_slug, task_slug);
28
+ const projectSlug = typeof current.project_slug === "string"
29
+ ? current.project_slug
30
+ : undefined;
31
+ await assertProjectIdAllowed(guard, () => api.listProjects(ws_slug), current.project_id, projectSlug);
32
+ const data = await api.listComments(ws_slug, task_slug);
33
+ return jsonToolResult(data, data);
34
+ }
35
+ catch (error) {
36
+ return toolError(error);
37
+ }
38
+ },
39
+ };
40
+ }
41
+ //# sourceMappingURL=list-comments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-comments.js","sourceRoot":"","sources":["../../src/tools/list-comments.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,GAExB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,sBAAsB,CAAC,EACrC,GAAG,EACH,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,qBAAqB;QAC3B,MAAM,EAAE;YACN,KAAK,EAAE,2BAA2B;YAClC,WAAW,EAAE;;;;;;;gCAOa;YAC1B,WAAW,EAAE,uBAAuB;YACpC,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE;YACxC,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBACtD,MAAM,WAAW,GACf,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ;oBACtC,CAAC,CAAC,OAAO,CAAC,YAAY;oBACtB,CAAC,CAAC,SAAS,CAAC;gBAChB,MAAM,sBAAsB,CAC1B,KAAK,EACL,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,EAC/B,OAAO,CAAC,UAAU,EAClB,WAAW,CACZ,CAAC;gBACF,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBACxD,OAAO,cAAc,CAAC,IAAI,EAAE,IAA+B,CAAC,CAAC;YAC/D,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type WsSlugInput } from "../schemas/workspace.js";
2
+ import type { ToolDefinition, ToolDeps } from "./types.js";
3
+ export declare function createListMembersTool({ api, }: ToolDeps): ToolDefinition<WsSlugInput>;
4
+ //# sourceMappingURL=list-members.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-members.d.ts","sourceRoot":"","sources":["../../src/tools/list-members.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,qBAAqB,CAAC,EACpC,GAAG,GACJ,EAAE,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,CA0CxC"}
@@ -0,0 +1,39 @@
1
+ import { WsSlugSchema, } from "../schemas/workspace.js";
2
+ import { agentListResult } from "../services/format.js";
3
+ import { compactMember } from "../services/task-mapper.js";
4
+ import { jsonToolResult, toolError } from "./helpers.js";
5
+ export function createListMembersTool({ api, }) {
6
+ return {
7
+ name: "otask_list_members",
8
+ config: {
9
+ title: "List O!task Members",
10
+ description: `List workspace members (performers for assignment).
11
+
12
+ Args:
13
+ - ws_slug: Workspace UUID from panel.otask.ru
14
+
15
+ Returns compact members: id, name, email, status_text.
16
+
17
+ Docs: https://api.otask.ru/docs`,
18
+ inputSchema: WsSlugSchema,
19
+ annotations: {
20
+ readOnlyHint: true,
21
+ destructiveHint: false,
22
+ idempotentHint: true,
23
+ openWorldHint: true,
24
+ },
25
+ },
26
+ handler: async ({ ws_slug }) => {
27
+ try {
28
+ const members = await api.listMembers(ws_slug);
29
+ const items = members.map((m) => compactMember((m ?? {})));
30
+ const payload = agentListResult(`${items.length} member(s)`, items);
31
+ return jsonToolResult(payload, payload);
32
+ }
33
+ catch (error) {
34
+ return toolError(error);
35
+ }
36
+ },
37
+ };
38
+ }
39
+ //# sourceMappingURL=list-members.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-members.js","sourceRoot":"","sources":["../../src/tools/list-members.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,GAEb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,qBAAqB,CAAC,EACpC,GAAG,GACM;IACT,OAAO;QACL,IAAI,EAAE,oBAAoB;QAC1B,MAAM,EAAE;YACN,KAAK,EAAE,qBAAqB;YAC5B,WAAW,EAAE;;;;;;;gCAOa;YAC1B,WAAW,EAAE,YAAY;YACzB,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7B,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC9B,aAAa,CACX,CAAC,CAAC,IAAI,EAAE,CAMP,CACF,CACF,CAAC;gBACF,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,KAAK,CAAC,MAAM,YAAY,EAAE,KAAK,CAAC,CAAC;gBACpE,OAAO,cAAc,CAAC,OAAO,EAAE,OAA6C,CAAC,CAAC;YAChF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type ListProjectTasksInput } from "../schemas/workspace.js";
2
+ import type { ToolDefinition, ToolDeps } from "./types.js";
3
+ export declare function createListProjectTasksTool({ api, guard, }: ToolDeps): ToolDefinition<ListProjectTasksInput>;
4
+ //# sourceMappingURL=list-project-tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-project-tasks.d.ts","sourceRoot":"","sources":["../../src/tools/list-project-tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,qBAAqB,EAC3B,MAAM,yBAAyB,CAAC;AAKjC,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,0BAA0B,CAAC,EACzC,GAAG,EACH,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,qBAAqB,CAAC,CA2DlD"}
@@ -0,0 +1,52 @@
1
+ import { ListProjectTasksInputSchema, } from "../schemas/workspace.js";
2
+ import { agentListResult } from "../services/format.js";
3
+ import { assertProjectSlugAllowed } from "../services/project-guard.js";
4
+ import { compactTask } from "../services/task-mapper.js";
5
+ import { jsonToolResult, toolError } from "./helpers.js";
6
+ export function createListProjectTasksTool({ api, guard, }) {
7
+ return {
8
+ name: "otask_list_project_tasks",
9
+ config: {
10
+ title: "List O!task Project Tasks",
11
+ description: `List tasks in a project. Project must be on the allow-list when configured.
12
+
13
+ Args:
14
+ - ws_slug, project_slug: UUIDs from panel.otask.ru
15
+ - page, status_id, board_id, board_column_id: optional filters
16
+
17
+ Returns compact tasks via agent list envelope.
18
+
19
+ Docs: https://api.otask.ru/docs`,
20
+ inputSchema: ListProjectTasksInputSchema,
21
+ annotations: {
22
+ readOnlyHint: true,
23
+ destructiveHint: false,
24
+ idempotentHint: true,
25
+ openWorldHint: true,
26
+ },
27
+ },
28
+ handler: async ({ ws_slug, project_slug, page, status_id, board_id, board_column_id, }) => {
29
+ try {
30
+ await assertProjectSlugAllowed(guard, () => api.listProjects(ws_slug), project_slug);
31
+ const query = {};
32
+ if (page !== undefined)
33
+ query.page = page;
34
+ if (status_id !== undefined)
35
+ query.status_id = status_id;
36
+ if (board_id !== undefined)
37
+ query.board_id = board_id;
38
+ if (board_column_id !== undefined)
39
+ query.board_column_id = board_column_id;
40
+ const hasQuery = Object.keys(query).length > 0;
41
+ const result = await api.listProjectTasks(ws_slug, project_slug, hasQuery ? query : undefined);
42
+ const items = result.tasks.map((t) => compactTask(t));
43
+ const payload = agentListResult(`${items.length} task(s)`, items, result.meta);
44
+ return jsonToolResult(payload, payload);
45
+ }
46
+ catch (error) {
47
+ return toolError(error);
48
+ }
49
+ },
50
+ };
51
+ }
52
+ //# sourceMappingURL=list-project-tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-project-tasks.js","sourceRoot":"","sources":["../../src/tools/list-project-tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,GAE5B,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,0BAA0B,CAAC,EACzC,GAAG,EACH,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,0BAA0B;QAChC,MAAM,EAAE;YACN,KAAK,EAAE,2BAA2B;YAClC,WAAW,EAAE;;;;;;;;gCAQa;YAC1B,WAAW,EAAE,2BAA2B;YACxC,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EACd,OAAO,EACP,YAAY,EACZ,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,eAAe,GAChB,EAAE,EAAE;YACH,IAAI,CAAC;gBACH,MAAM,wBAAwB,CAC5B,KAAK,EACL,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,EAC/B,YAAY,CACb,CAAC;gBACF,MAAM,KAAK,GAAgD,EAAE,CAAC;gBAC9D,IAAI,IAAI,KAAK,SAAS;oBAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;gBAC1C,IAAI,SAAS,KAAK,SAAS;oBAAE,KAAK,CAAC,SAAS,GAAG,SAAS,CAAC;gBACzD,IAAI,QAAQ,KAAK,SAAS;oBAAE,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;gBACtD,IAAI,eAAe,KAAK,SAAS;oBAAE,KAAK,CAAC,eAAe,GAAG,eAAe,CAAC;gBAC3E,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC/C,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,gBAAgB,CACvC,OAAO,EACP,YAAY,EACZ,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAC7B,CAAC;gBACF,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtD,MAAM,OAAO,GAAG,eAAe,CAC7B,GAAG,KAAK,CAAC,MAAM,UAAU,EACzB,KAAK,EACL,MAAM,CAAC,IAAI,CACZ,CAAC;gBACF,OAAO,cAAc,CAAC,OAAO,EAAE,OAA6C,CAAC,CAAC;YAChF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type WsSlugInput } from "../schemas/workspace.js";
2
+ import type { ToolDefinition, ToolDeps } from "./types.js";
3
+ export declare function createListProjectsTool({ api, guard, }: ToolDeps): ToolDefinition<WsSlugInput>;
4
+ //# sourceMappingURL=list-projects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-projects.d.ts","sourceRoot":"","sources":["../../src/tools/list-projects.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,sBAAsB,CAAC,EACrC,GAAG,EACH,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,CAoCxC"}
@@ -0,0 +1,40 @@
1
+ import { WsSlugSchema, } from "../schemas/workspace.js";
2
+ import { agentListResult } from "../services/format.js";
3
+ import { compactProject } from "../services/task-mapper.js";
4
+ import { jsonToolResult, toolError } from "./helpers.js";
5
+ export function createListProjectsTool({ api, guard, }) {
6
+ return {
7
+ name: "otask_list_projects",
8
+ config: {
9
+ title: "List O!task Projects",
10
+ description: `List projects in a workspace. Results are filtered by the project allow-list when configured.
11
+
12
+ Args:
13
+ - ws_slug: Workspace UUID from panel.otask.ru
14
+
15
+ Returns compact projects: id, slug, name, status_id.
16
+
17
+ Docs: https://api.otask.ru/docs`,
18
+ inputSchema: WsSlugSchema,
19
+ annotations: {
20
+ readOnlyHint: true,
21
+ destructiveHint: false,
22
+ idempotentHint: true,
23
+ openWorldHint: true,
24
+ },
25
+ },
26
+ handler: async ({ ws_slug }) => {
27
+ try {
28
+ const projects = await api.listProjects(ws_slug);
29
+ const allowed = guard.filterProjects(projects);
30
+ const items = allowed.map((p) => compactProject(p));
31
+ const payload = agentListResult(`${items.length} project(s)`, items);
32
+ return jsonToolResult(payload, payload);
33
+ }
34
+ catch (error) {
35
+ return toolError(error);
36
+ }
37
+ },
38
+ };
39
+ }
40
+ //# sourceMappingURL=list-projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-projects.js","sourceRoot":"","sources":["../../src/tools/list-projects.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,GAEb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,sBAAsB,CAAC,EACrC,GAAG,EACH,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,qBAAqB;QAC3B,MAAM,EAAE;YACN,KAAK,EAAE,sBAAsB;YAC7B,WAAW,EAAE;;;;;;;gCAOa;YAC1B,WAAW,EAAE,YAAY;YACzB,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7B,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACjD,MAAM,OAAO,GAAG,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpD,MAAM,OAAO,GAAG,eAAe,CAC7B,GAAG,KAAK,CAAC,MAAM,aAAa,EAC5B,KAAK,CACN,CAAC;gBACF,OAAO,cAAc,CAAC,OAAO,EAAE,OAA6C,CAAC,CAAC;YAChF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type WsSlugInput } from "../schemas/workspace.js";
2
+ import type { ToolDefinition, ToolDeps } from "./types.js";
3
+ export declare function createListTagsTool({ api, }: ToolDeps): ToolDefinition<WsSlugInput>;
4
+ //# sourceMappingURL=list-tags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-tags.d.ts","sourceRoot":"","sources":["../../src/tools/list-tags.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,kBAAkB,CAAC,EACjC,GAAG,GACJ,EAAE,QAAQ,GAAG,cAAc,CAAC,WAAW,CAAC,CAkCxC"}
@@ -0,0 +1,39 @@
1
+ import { WsSlugSchema, } from "../schemas/workspace.js";
2
+ import { agentListResult } from "../services/format.js";
3
+ import { compactTag } from "../services/task-mapper.js";
4
+ import { jsonToolResult, toolError } from "./helpers.js";
5
+ export function createListTagsTool({ api, }) {
6
+ return {
7
+ name: "otask_list_tags",
8
+ config: {
9
+ title: "List O!task Tags",
10
+ description: `List workspace tags for labeling tasks.
11
+
12
+ Args:
13
+ - ws_slug: Workspace UUID from panel.otask.ru
14
+
15
+ Returns compact tags (id, name, slug?, color?) as agent list envelope.
16
+
17
+ Docs: https://api.otask.ru/docs`,
18
+ inputSchema: WsSlugSchema,
19
+ annotations: {
20
+ readOnlyHint: true,
21
+ destructiveHint: false,
22
+ idempotentHint: true,
23
+ openWorldHint: true,
24
+ },
25
+ },
26
+ handler: async ({ ws_slug }) => {
27
+ try {
28
+ const tags = await api.listTags(ws_slug);
29
+ const items = tags.map((t) => compactTag(t));
30
+ const payload = agentListResult(`${items.length} tag(s)`, items);
31
+ return jsonToolResult(payload, payload);
32
+ }
33
+ catch (error) {
34
+ return toolError(error);
35
+ }
36
+ },
37
+ };
38
+ }
39
+ //# sourceMappingURL=list-tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list-tags.js","sourceRoot":"","sources":["../../src/tools/list-tags.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,GAEb,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,kBAAkB,CAAC,EACjC,GAAG,GACM;IACT,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE;YACN,KAAK,EAAE,kBAAkB;YACzB,WAAW,EAAE;;;;;;;gCAOa;YAC1B,WAAW,EAAE,YAAY;YACzB,WAAW,EAAE;gBACX,YAAY,EAAE,IAAI;gBAClB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;YAC7B,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;gBACzC,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3B,UAAU,CAAC,CAAgE,CAAC,CAC7E,CAAC;gBACF,MAAM,OAAO,GAAG,eAAe,CAAC,GAAG,KAAK,CAAC,MAAM,SAAS,EAAE,KAAK,CAAC,CAAC;gBACjE,OAAO,cAAc,CAAC,OAAO,EAAE,OAA6C,CAAC,CAAC;YAChF,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { type MoveTaskInput } from "../schemas/task.js";
2
+ import type { ToolDefinition, ToolDeps } from "./types.js";
3
+ export declare function createMoveTaskTool({ api, guard, }: ToolDeps): ToolDefinition<MoveTaskInput>;
4
+ //# sourceMappingURL=move-task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"move-task.d.ts","sourceRoot":"","sources":["../../src/tools/move-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,aAAa,EACnB,MAAM,oBAAoB,CAAC;AAO5B,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,kBAAkB,CAAC,EACjC,GAAG,EACH,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,aAAa,CAAC,CA6D1C"}
@@ -0,0 +1,59 @@
1
+ import { MoveTaskInputSchema, } from "../schemas/task.js";
2
+ import { assertProjectIdAllowed } from "../services/project-guard.js";
3
+ import { buildUpdateBodyFromTask, compactTask, } from "../services/task-mapper.js";
4
+ import { jsonToolResult, toolError } from "./helpers.js";
5
+ export function createMoveTaskTool({ api, guard, }) {
6
+ return {
7
+ name: "otask_move_task",
8
+ config: {
9
+ title: "Move O!task Task",
10
+ description: `Move a task to another board column (status). Fetches the task, merges board_column_id (and optional board_id), then updates.
11
+
12
+ Discover column IDs via otask_list_board. Project must be allow-listed when configured.
13
+
14
+ Args:
15
+ - ws_slug, task_slug: task identity
16
+ - board_column_id: target column
17
+ - board_id: optional if changing board
18
+
19
+ Returns updated compact task.
20
+
21
+ Docs: https://api.otask.ru/docs`,
22
+ inputSchema: MoveTaskInputSchema,
23
+ annotations: {
24
+ readOnlyHint: false,
25
+ destructiveHint: false,
26
+ idempotentHint: true,
27
+ openWorldHint: true,
28
+ },
29
+ },
30
+ handler: async ({ ws_slug, task_slug, board_column_id, board_id }) => {
31
+ try {
32
+ const current = await api.getTask(ws_slug, task_slug);
33
+ const projectSlug = typeof current.project_slug === "string"
34
+ ? current.project_slug
35
+ : undefined;
36
+ await assertProjectIdAllowed(guard, () => api.listProjects(ws_slug), current.project_id, projectSlug);
37
+ const body = buildUpdateBodyFromTask(current, {
38
+ board_column_id,
39
+ ...(board_id !== undefined ? { board_id } : {}),
40
+ });
41
+ const result = await api.updateTask(ws_slug, task_slug, body);
42
+ const summary = compactTask(result.task);
43
+ return jsonToolResult({
44
+ success: result.success,
45
+ message: result.message,
46
+ task: summary,
47
+ }, {
48
+ success: result.success,
49
+ message: result.message,
50
+ task: summary,
51
+ });
52
+ }
53
+ catch (error) {
54
+ return toolError(error);
55
+ }
56
+ },
57
+ };
58
+ }
59
+ //# sourceMappingURL=move-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"move-task.js","sourceRoot":"","sources":["../../src/tools/move-task.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,GAEpB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EACL,uBAAuB,EACvB,WAAW,GACZ,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,UAAU,kBAAkB,CAAC,EACjC,GAAG,EACH,KAAK,GACI;IACT,OAAO;QACL,IAAI,EAAE,iBAAiB;QACvB,MAAM,EAAE;YACN,KAAK,EAAE,kBAAkB;YACzB,WAAW,EAAE;;;;;;;;;;;gCAWa;YAC1B,WAAW,EAAE,mBAAmB;YAChC,WAAW,EAAE;gBACX,YAAY,EAAE,KAAK;gBACnB,eAAe,EAAE,KAAK;gBACtB,cAAc,EAAE,IAAI;gBACpB,aAAa,EAAE,IAAI;aACpB;SACF;QACD,OAAO,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,QAAQ,EAAE,EAAE,EAAE;YACnE,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;gBACtD,MAAM,WAAW,GACf,OAAO,OAAO,CAAC,YAAY,KAAK,QAAQ;oBACtC,CAAC,CAAC,OAAO,CAAC,YAAY;oBACtB,CAAC,CAAC,SAAS,CAAC;gBAChB,MAAM,sBAAsB,CAC1B,KAAK,EACL,GAAG,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,CAAC,EAC/B,OAAO,CAAC,UAAU,EAClB,WAAW,CACZ,CAAC;gBACF,MAAM,IAAI,GAAG,uBAAuB,CAAC,OAAO,EAAE;oBAC5C,eAAe;oBACf,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAChD,CAAC,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;gBAC9D,MAAM,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACzC,OAAO,cAAc,CACnB;oBACE,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,IAAI,EAAE,OAAO;iBACd,EACD;oBACE,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,IAAI,EAAE,OAAO;iBACd,CACF,CAAC;YACJ,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { ToolDeps } from "./types.js";
3
+ export declare function registerAllTools(server: McpServer, deps: ToolDeps): void;
4
+ //# sourceMappingURL=register.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/tools/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAEzE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,QAAQ,GAAG,IAAI,CAKxE"}
@@ -0,0 +1,8 @@
1
+ import { toolFactories } from "./registry.js";
2
+ export function registerAllTools(server, deps) {
3
+ for (const createTool of toolFactories) {
4
+ const { name, config, handler } = createTool(deps);
5
+ server.registerTool(name, config, handler);
6
+ }
7
+ }
8
+ //# sourceMappingURL=register.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"register.js","sourceRoot":"","sources":["../../src/tools/register.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAG9C,MAAM,UAAU,gBAAgB,CAAC,MAAiB,EAAE,IAAc;IAChE,KAAK,MAAM,UAAU,IAAI,aAAa,EAAE,CAAC;QACvC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QACnD,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { createAddCommentTool } from "./add-comment.js";
2
+ import { createArchiveTaskTool } from "./archive-task.js";
3
+ import { createCreateTaskTool } from "./create-task.js";
4
+ import { createGetTaskTool } from "./get-task.js";
5
+ import { createListBoardTool } from "./list-board.js";
6
+ import { createListCommentsTool } from "./list-comments.js";
7
+ import { createListMembersTool } from "./list-members.js";
8
+ import { createListProjectTasksTool } from "./list-project-tasks.js";
9
+ import { createListProjectsTool } from "./list-projects.js";
10
+ import { createListTagsTool } from "./list-tags.js";
11
+ import { createMoveTaskTool } from "./move-task.js";
12
+ import { createUpdateTaskTool } from "./update-task.js";
13
+ /** Add new tools here — one factory per file. */
14
+ export declare const toolFactories: readonly [typeof createGetTaskTool, typeof createUpdateTaskTool, typeof createListProjectsTool, typeof createListProjectTasksTool, typeof createListBoardTool, typeof createListMembersTool, typeof createListTagsTool, typeof createListCommentsTool, typeof createAddCommentTool, typeof createCreateTaskTool, typeof createMoveTaskTool, typeof createArchiveTaskTool];
15
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,iDAAiD;AACjD,eAAO,MAAM,aAAa,2WAahB,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { createAddCommentTool } from "./add-comment.js";
2
+ import { createArchiveTaskTool } from "./archive-task.js";
3
+ import { createCreateTaskTool } from "./create-task.js";
4
+ import { createGetTaskTool } from "./get-task.js";
5
+ import { createListBoardTool } from "./list-board.js";
6
+ import { createListCommentsTool } from "./list-comments.js";
7
+ import { createListMembersTool } from "./list-members.js";
8
+ import { createListProjectTasksTool } from "./list-project-tasks.js";
9
+ import { createListProjectsTool } from "./list-projects.js";
10
+ import { createListTagsTool } from "./list-tags.js";
11
+ import { createMoveTaskTool } from "./move-task.js";
12
+ import { createUpdateTaskTool } from "./update-task.js";
13
+ /** Add new tools here — one factory per file. */
14
+ export const toolFactories = [
15
+ createGetTaskTool,
16
+ createUpdateTaskTool,
17
+ createListProjectsTool,
18
+ createListProjectTasksTool,
19
+ createListBoardTool,
20
+ createListMembersTool,
21
+ createListTagsTool,
22
+ createListCommentsTool,
23
+ createAddCommentTool,
24
+ createCreateTaskTool,
25
+ createMoveTaskTool,
26
+ createArchiveTaskTool,
27
+ ];
28
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/tools/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAExD,iDAAiD;AACjD,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,iBAAiB;IACjB,oBAAoB;IACpB,sBAAsB;IACtB,0BAA0B;IAC1B,mBAAmB;IACnB,qBAAqB;IACrB,kBAAkB;IAClB,sBAAsB;IACtB,oBAAoB;IACpB,oBAAoB;IACpB,kBAAkB;IAClB,qBAAqB;CACb,CAAC"}
@@ -0,0 +1,29 @@
1
+ import type { ToolAnnotations } from "@modelcontextprotocol/sdk/types.js";
2
+ import type { z } from "zod";
3
+ import type { OtaskClient } from "../services/client.js";
4
+ import type { ProjectGuard } from "../services/project-guard.js";
5
+ /** Shared dependencies injected into every tool factory. */
6
+ export interface ToolDeps {
7
+ api: OtaskClient;
8
+ guard: ProjectGuard;
9
+ }
10
+ export interface ToolConfig {
11
+ title?: string;
12
+ description?: string;
13
+ inputSchema?: z.ZodTypeAny;
14
+ annotations?: ToolAnnotations;
15
+ }
16
+ export interface ToolDefinition<TArgs = Record<string, unknown>> {
17
+ name: string;
18
+ config: ToolConfig;
19
+ handler: (args: TArgs) => Promise<{
20
+ content: Array<{
21
+ type: "text";
22
+ text: string;
23
+ }>;
24
+ structuredContent?: Record<string, unknown>;
25
+ isError?: boolean;
26
+ }>;
27
+ }
28
+ export type ToolFactory = (deps: ToolDeps) => ToolDefinition;
29
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAEjE,4DAA4D;AAC5D,MAAM,WAAW,QAAQ;IACvB,GAAG,EAAE,WAAW,CAAC;IACjB,KAAK,EAAE,YAAY,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC;IAC3B,WAAW,CAAC,EAAE,eAAe,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,UAAU,CAAC;IACnB,OAAO,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC;QAChC,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC/C,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC5C,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC,CAAC;CACJ;AAED,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,QAAQ,KAAK,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/tools/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ import { type UpdateTaskInput } from "../schemas/task.js";
2
+ import type { ToolDefinition, ToolDeps } from "./types.js";
3
+ export declare function createUpdateTaskTool({ api, guard, }: ToolDeps): ToolDefinition<UpdateTaskInput>;
4
+ //# sourceMappingURL=update-task.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-task.d.ts","sourceRoot":"","sources":["../../src/tools/update-task.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,oBAAoB,CAAC;AAO5B,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3D,wBAAgB,oBAAoB,CAAC,EACnC,GAAG,EACH,KAAK,GACN,EAAE,QAAQ,GAAG,cAAc,CAAC,eAAe,CAAC,CA0G5C"}
@@ -0,0 +1,96 @@
1
+ import { UpdateTaskInputSchema, } from "../schemas/task.js";
2
+ import { assertProjectIdAllowed } from "../services/project-guard.js";
3
+ import { buildUpdateBodyFromTask, summarizeTask, } from "../services/task-mapper.js";
4
+ import { jsonToolResult, toolError } from "./helpers.js";
5
+ export function createUpdateTaskTool({ api, guard, }) {
6
+ return {
7
+ name: "otask_update_task",
8
+ config: {
9
+ title: "Update O!task Task",
10
+ description: `Update an existing O!task task. Sends POST /api/v1/ws/{ws_slug}/tasks/{task_slug}/update.
11
+
12
+ The O!task API requires a full task payload. This tool fetches the current task, merges your changes, then submits the update. Only pass fields you want to change. Project must be allow-listed when configured.
13
+
14
+ Common updates:
15
+ - board_column_id: move task to another column/status
16
+ - name, description, end_at, priority_id
17
+ - performers, tags, subtasks, files
18
+ - comment: optional note recorded with the update
19
+
20
+ Args:
21
+ - ws_slug, task_slug: UUIDs from panel.otask.ru
22
+ - Any task fields to change (all optional except slugs)
23
+
24
+ Returns updated task summary on success.
25
+
26
+ Docs: https://api.otask.ru/docs#zadaci-POSTapi-v1-ws--ws_slug--tasks--task_slug--update`,
27
+ inputSchema: UpdateTaskInputSchema,
28
+ annotations: {
29
+ readOnlyHint: false,
30
+ destructiveHint: false,
31
+ idempotentHint: false,
32
+ openWorldHint: true,
33
+ },
34
+ },
35
+ handler: async (params) => {
36
+ const { ws_slug, task_slug, ...changes } = params;
37
+ try {
38
+ const current = await api.getTask(ws_slug, task_slug);
39
+ const projectSlug = typeof current.project_slug === "string"
40
+ ? current.project_slug
41
+ : undefined;
42
+ await assertProjectIdAllowed(guard, () => api.listProjects(ws_slug), current.project_id, projectSlug);
43
+ const body = buildUpdateBodyFromTask(current, {
44
+ ...(changes.name !== undefined ? { name: changes.name } : {}),
45
+ ...(changes.board_id !== undefined
46
+ ? { board_id: changes.board_id }
47
+ : {}),
48
+ ...(changes.board_column_id !== undefined
49
+ ? { board_column_id: changes.board_column_id }
50
+ : {}),
51
+ ...(changes.comment !== undefined
52
+ ? { comment: changes.comment }
53
+ : {}),
54
+ ...(changes.description !== undefined
55
+ ? { description: changes.description }
56
+ : {}),
57
+ ...(changes.end_at !== undefined ? { end_at: changes.end_at } : {}),
58
+ ...(changes.files !== undefined ? { files: changes.files } : {}),
59
+ ...(changes.performers !== undefined
60
+ ? { performers: changes.performers }
61
+ : {}),
62
+ ...(changes.priority_id !== undefined
63
+ ? { priority_id: changes.priority_id }
64
+ : {}),
65
+ ...(changes.project_id !== undefined
66
+ ? { project_id: changes.project_id }
67
+ : {}),
68
+ ...(changes.subtasks !== undefined
69
+ ? { subtasks: changes.subtasks }
70
+ : {}),
71
+ ...(changes.tags !== undefined ? { tags: changes.tags } : {}),
72
+ });
73
+ if (changes.project_id !== undefined) {
74
+ await assertProjectIdAllowed(guard, () => api.listProjects(ws_slug), changes.project_id);
75
+ }
76
+ const result = await api.updateTask(ws_slug, task_slug, body);
77
+ const summary = summarizeTask(result.task);
78
+ return jsonToolResult({
79
+ success: result.success,
80
+ message: result.message,
81
+ task: summary,
82
+ is_recovery: result.is_recovery,
83
+ is_detach_parent: result.is_detach_parent,
84
+ }, {
85
+ success: result.success,
86
+ message: result.message,
87
+ task: summary,
88
+ });
89
+ }
90
+ catch (error) {
91
+ return toolError(error);
92
+ }
93
+ },
94
+ };
95
+ }
96
+ //# sourceMappingURL=update-task.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-task.js","sourceRoot":"","sources":["../../src/tools/update-task.ts"],"names":[],"mappings":"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"}