motionmcp 1.0.2 → 2.1.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 (159) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +241 -450
  3. package/dist/handlers/CommentHandler.d.ts +9 -0
  4. package/dist/handlers/CommentHandler.d.ts.map +1 -0
  5. package/dist/handlers/CommentHandler.js +66 -0
  6. package/dist/handlers/CommentHandler.js.map +1 -0
  7. package/dist/handlers/CustomFieldHandler.d.ts +14 -0
  8. package/dist/handlers/CustomFieldHandler.d.ts.map +1 -0
  9. package/dist/handlers/CustomFieldHandler.js +95 -0
  10. package/dist/handlers/CustomFieldHandler.js.map +1 -0
  11. package/dist/handlers/HandlerFactory.d.ts +15 -0
  12. package/dist/handlers/HandlerFactory.d.ts.map +1 -0
  13. package/dist/handlers/HandlerFactory.js +58 -0
  14. package/dist/handlers/HandlerFactory.js.map +1 -0
  15. package/dist/handlers/ProjectHandler.d.ts +10 -0
  16. package/dist/handlers/ProjectHandler.d.ts.map +1 -0
  17. package/dist/handlers/ProjectHandler.js +63 -0
  18. package/dist/handlers/ProjectHandler.js.map +1 -0
  19. package/dist/handlers/RecurringTaskHandler.d.ts +10 -0
  20. package/dist/handlers/RecurringTaskHandler.d.ts.map +1 -0
  21. package/dist/handlers/RecurringTaskHandler.js +68 -0
  22. package/dist/handlers/RecurringTaskHandler.js.map +1 -0
  23. package/dist/handlers/ScheduleHandler.d.ts +8 -0
  24. package/dist/handlers/ScheduleHandler.d.ts.map +1 -0
  25. package/dist/handlers/ScheduleHandler.js +43 -0
  26. package/dist/handlers/ScheduleHandler.js.map +1 -0
  27. package/dist/handlers/SearchHandler.d.ts +10 -0
  28. package/dist/handlers/SearchHandler.d.ts.map +1 -0
  29. package/dist/handlers/SearchHandler.js +116 -0
  30. package/dist/handlers/SearchHandler.js.map +1 -0
  31. package/dist/handlers/StatusHandler.d.ts +8 -0
  32. package/dist/handlers/StatusHandler.d.ts.map +1 -0
  33. package/dist/handlers/StatusHandler.js +22 -0
  34. package/dist/handlers/StatusHandler.js.map +1 -0
  35. package/dist/handlers/TaskHandler.d.ts +22 -0
  36. package/dist/handlers/TaskHandler.d.ts.map +1 -0
  37. package/dist/handlers/TaskHandler.js +324 -0
  38. package/dist/handlers/TaskHandler.js.map +1 -0
  39. package/dist/handlers/UserHandler.d.ts +9 -0
  40. package/dist/handlers/UserHandler.d.ts.map +1 -0
  41. package/dist/handlers/UserHandler.js +36 -0
  42. package/dist/handlers/UserHandler.js.map +1 -0
  43. package/dist/handlers/WorkspaceHandler.d.ts +10 -0
  44. package/dist/handlers/WorkspaceHandler.d.ts.map +1 -0
  45. package/dist/handlers/WorkspaceHandler.js +49 -0
  46. package/dist/handlers/WorkspaceHandler.js.map +1 -0
  47. package/dist/handlers/base/BaseHandler.d.ts +16 -0
  48. package/dist/handlers/base/BaseHandler.d.ts.map +1 -0
  49. package/dist/handlers/base/BaseHandler.js +31 -0
  50. package/dist/handlers/base/BaseHandler.js.map +1 -0
  51. package/dist/handlers/base/HandlerInterface.d.ts +18 -0
  52. package/dist/handlers/base/HandlerInterface.d.ts.map +1 -0
  53. package/dist/handlers/base/HandlerInterface.js +3 -0
  54. package/dist/handlers/base/HandlerInterface.js.map +1 -0
  55. package/dist/handlers/index.d.ts +14 -0
  56. package/dist/handlers/index.d.ts.map +1 -0
  57. package/dist/handlers/index.js +31 -0
  58. package/dist/handlers/index.js.map +1 -0
  59. package/dist/mcp-server.d.ts +15 -0
  60. package/dist/mcp-server.d.ts.map +1 -0
  61. package/dist/mcp-server.js +145 -0
  62. package/dist/mcp-server.js.map +1 -0
  63. package/dist/schemas/motion.d.ts +4971 -0
  64. package/dist/schemas/motion.d.ts.map +1 -0
  65. package/dist/schemas/motion.js +328 -0
  66. package/dist/schemas/motion.js.map +1 -0
  67. package/dist/services/motionApi.d.ts +199 -0
  68. package/dist/services/motionApi.d.ts.map +1 -0
  69. package/dist/services/motionApi.js +1950 -0
  70. package/dist/services/motionApi.js.map +1 -0
  71. package/dist/tools/ToolConfigurator.d.ts +19 -0
  72. package/dist/tools/ToolConfigurator.d.ts.map +1 -0
  73. package/dist/tools/ToolConfigurator.js +89 -0
  74. package/dist/tools/ToolConfigurator.js.map +1 -0
  75. package/dist/tools/ToolDefinitions.d.ts +25 -0
  76. package/dist/tools/ToolDefinitions.d.ts.map +1 -0
  77. package/dist/tools/ToolDefinitions.js +508 -0
  78. package/dist/tools/ToolDefinitions.js.map +1 -0
  79. package/dist/tools/ToolRegistry.d.ts +16 -0
  80. package/dist/tools/ToolRegistry.d.ts.map +1 -0
  81. package/dist/tools/ToolRegistry.js +89 -0
  82. package/dist/tools/ToolRegistry.js.map +1 -0
  83. package/dist/tools/index.d.ts +4 -0
  84. package/dist/tools/index.d.ts.map +1 -0
  85. package/dist/tools/index.js +21 -0
  86. package/dist/tools/index.js.map +1 -0
  87. package/dist/types/mcp-tool-args.d.ts +123 -0
  88. package/dist/types/mcp-tool-args.d.ts.map +1 -0
  89. package/dist/types/mcp-tool-args.js +7 -0
  90. package/dist/types/mcp-tool-args.js.map +1 -0
  91. package/dist/types/mcp.d.ts +32 -0
  92. package/dist/types/mcp.d.ts.map +1 -0
  93. package/dist/types/mcp.js +3 -0
  94. package/dist/types/mcp.js.map +1 -0
  95. package/dist/types/motion.d.ts +304 -0
  96. package/dist/types/motion.d.ts.map +1 -0
  97. package/dist/types/motion.js +3 -0
  98. package/dist/types/motion.js.map +1 -0
  99. package/dist/utils/cache.d.ts +25 -0
  100. package/dist/utils/cache.d.ts.map +1 -0
  101. package/dist/utils/cache.js +135 -0
  102. package/dist/utils/cache.js.map +1 -0
  103. package/dist/utils/constants.d.ts +88 -0
  104. package/dist/utils/constants.d.ts.map +1 -0
  105. package/dist/utils/constants.js +188 -0
  106. package/dist/utils/constants.js.map +1 -0
  107. package/dist/utils/errorHandling.d.ts +50 -0
  108. package/dist/utils/errorHandling.d.ts.map +1 -0
  109. package/dist/utils/errorHandling.js +86 -0
  110. package/dist/utils/errorHandling.js.map +1 -0
  111. package/dist/utils/index.d.ts +13 -0
  112. package/dist/utils/index.d.ts.map +1 -0
  113. package/dist/utils/index.js +38 -0
  114. package/dist/utils/index.js.map +1 -0
  115. package/dist/utils/logger.d.ts +13 -0
  116. package/dist/utils/logger.d.ts.map +1 -0
  117. package/dist/utils/logger.js +47 -0
  118. package/dist/utils/logger.js.map +1 -0
  119. package/dist/utils/pagination.d.ts +61 -0
  120. package/dist/utils/pagination.d.ts.map +1 -0
  121. package/dist/utils/pagination.js +168 -0
  122. package/dist/utils/pagination.js.map +1 -0
  123. package/dist/utils/paginationNew.d.ts +44 -0
  124. package/dist/utils/paginationNew.d.ts.map +1 -0
  125. package/dist/utils/paginationNew.js +149 -0
  126. package/dist/utils/paginationNew.js.map +1 -0
  127. package/dist/utils/parameterUtils.d.ts +79 -0
  128. package/dist/utils/parameterUtils.d.ts.map +1 -0
  129. package/dist/utils/parameterUtils.js +189 -0
  130. package/dist/utils/parameterUtils.js.map +1 -0
  131. package/dist/utils/responseFormatters.d.ts +95 -0
  132. package/dist/utils/responseFormatters.d.ts.map +1 -0
  133. package/dist/utils/responseFormatters.js +342 -0
  134. package/dist/utils/responseFormatters.js.map +1 -0
  135. package/dist/utils/responseWrapper.d.ts +38 -0
  136. package/dist/utils/responseWrapper.d.ts.map +1 -0
  137. package/dist/utils/responseWrapper.js +201 -0
  138. package/dist/utils/responseWrapper.js.map +1 -0
  139. package/dist/utils/sanitize.d.ts +51 -0
  140. package/dist/utils/sanitize.d.ts.map +1 -0
  141. package/dist/utils/sanitize.js +138 -0
  142. package/dist/utils/sanitize.js.map +1 -0
  143. package/dist/utils/validator.d.ts +37 -0
  144. package/dist/utils/validator.d.ts.map +1 -0
  145. package/dist/utils/validator.js +74 -0
  146. package/dist/utils/validator.js.map +1 -0
  147. package/dist/utils/workspaceResolver.d.ts +40 -0
  148. package/dist/utils/workspaceResolver.d.ts.map +1 -0
  149. package/dist/utils/workspaceResolver.js +207 -0
  150. package/dist/utils/workspaceResolver.js.map +1 -0
  151. package/package.json +41 -17
  152. package/.claude/settings.local.json +0 -15
  153. package/.env.example +0 -3
  154. package/sample.png +0 -0
  155. package/src/index.js +0 -179
  156. package/src/mcp-server.js +0 -1137
  157. package/src/routes/motion.js +0 -152
  158. package/src/services/motionApi.js +0 -1177
  159. package/src/worker.js +0 -248
@@ -0,0 +1,9 @@
1
+ import { BaseHandler } from './base/BaseHandler';
2
+ import { McpToolResponse } from '../types/mcp';
3
+ import { MotionCommentsArgs } from '../types/mcp-tool-args';
4
+ export declare class CommentHandler extends BaseHandler {
5
+ handle(args: MotionCommentsArgs): Promise<McpToolResponse>;
6
+ private handleList;
7
+ private handleCreate;
8
+ }
9
+ //# sourceMappingURL=CommentHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommentHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/CommentHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAK5D,qBAAa,cAAe,SAAQ,WAAW;IACvC,MAAM,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC;YAiBlD,UAAU;YAsBV,YAAY;CA2B3B"}
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CommentHandler = void 0;
4
+ const BaseHandler_1 = require("./base/BaseHandler");
5
+ const utils_1 = require("../utils");
6
+ const sanitize_1 = require("../utils/sanitize");
7
+ class CommentHandler extends BaseHandler_1.BaseHandler {
8
+ async handle(args) {
9
+ try {
10
+ const { operation, taskId, content, cursor } = args;
11
+ switch (operation) {
12
+ case 'list':
13
+ return await this.handleList(taskId, cursor);
14
+ case 'create':
15
+ return await this.handleCreate(taskId, content);
16
+ default:
17
+ return this.handleUnknownOperation(operation);
18
+ }
19
+ }
20
+ catch (error) {
21
+ return this.handleError(error);
22
+ }
23
+ }
24
+ async handleList(taskId, cursor) {
25
+ if (!taskId) {
26
+ return this.handleError(new Error('taskId is required for list operation'));
27
+ }
28
+ const commentsResponse = await this.motionService.getComments(taskId, cursor);
29
+ const commentsResult = (0, utils_1.formatCommentList)(commentsResponse.data);
30
+ // Add pagination info if there's more data
31
+ if (commentsResponse.meta.nextCursor && commentsResult.content[0]) {
32
+ function hasTextProperty(obj) {
33
+ return typeof obj === 'object' && obj !== null && 'text' in obj && typeof obj.text === 'string';
34
+ }
35
+ if (hasTextProperty(commentsResult.content[0])) {
36
+ commentsResult.content[0].text += `\n\n📄 More comments available. Use cursor: ${commentsResponse.meta.nextCursor}`;
37
+ }
38
+ }
39
+ return commentsResult;
40
+ }
41
+ async handleCreate(taskId, content) {
42
+ if (!taskId) {
43
+ return this.handleError(new Error('taskId is required for create operation'));
44
+ }
45
+ if (!content) {
46
+ return this.handleError(new Error('content is required for create operation'));
47
+ }
48
+ // Sanitize and validate comment content
49
+ const sanitizationResult = (0, sanitize_1.sanitizeCommentContent)(content);
50
+ if (!sanitizationResult.isValid) {
51
+ return this.handleError(new Error(sanitizationResult.error || 'Invalid comment content'));
52
+ }
53
+ const sanitizedContent = sanitizationResult.sanitized;
54
+ if (sanitizedContent.length > utils_1.LIMITS.COMMENT_MAX_LENGTH) {
55
+ return this.handleError(new Error(`Comment content exceeds maximum length of ${utils_1.LIMITS.COMMENT_MAX_LENGTH} characters`));
56
+ }
57
+ const commentData = {
58
+ taskId,
59
+ content: sanitizedContent
60
+ };
61
+ const newComment = await this.motionService.createComment(commentData);
62
+ return (0, utils_1.formatCommentDetail)(newComment);
63
+ }
64
+ }
65
+ exports.CommentHandler = CommentHandler;
66
+ //# sourceMappingURL=CommentHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommentHandler.js","sourceRoot":"","sources":["../../src/handlers/CommentHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { BaseHandler } from './base/BaseHandler';
2
+ import { McpToolResponse } from '../types/mcp';
3
+ import { MotionCustomFieldsArgs } from '../types/mcp-tool-args';
4
+ export declare class CustomFieldHandler extends BaseHandler {
5
+ handle(args: MotionCustomFieldsArgs): Promise<McpToolResponse>;
6
+ private handleList;
7
+ private handleCreate;
8
+ private handleDelete;
9
+ private handleAddToProject;
10
+ private handleRemoveFromProject;
11
+ private handleAddToTask;
12
+ private handleRemoveFromTask;
13
+ }
14
+ //# sourceMappingURL=CustomFieldHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomFieldHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/CustomFieldHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAIhE,qBAAa,kBAAmB,SAAQ,WAAW;IAC3C,MAAM,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,CAAC;YA2BtD,UAAU;YAQV,YAAY;YAuBZ,YAAY;YASZ,kBAAkB;YASlB,uBAAuB;YASvB,eAAe;YASf,oBAAoB;CAQnC"}
@@ -0,0 +1,95 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CustomFieldHandler = void 0;
4
+ const BaseHandler_1 = require("./base/BaseHandler");
5
+ const utils_1 = require("../utils");
6
+ class CustomFieldHandler extends BaseHandler_1.BaseHandler {
7
+ async handle(args) {
8
+ try {
9
+ const { operation } = args;
10
+ switch (operation) {
11
+ case 'list':
12
+ return await this.handleList(args);
13
+ case 'create':
14
+ return await this.handleCreate(args);
15
+ case 'delete':
16
+ return await this.handleDelete(args);
17
+ case 'add_to_project':
18
+ return await this.handleAddToProject(args);
19
+ case 'remove_from_project':
20
+ return await this.handleRemoveFromProject(args);
21
+ case 'add_to_task':
22
+ return await this.handleAddToTask(args);
23
+ case 'remove_from_task':
24
+ return await this.handleRemoveFromTask(args);
25
+ default:
26
+ return this.handleUnknownOperation(operation);
27
+ }
28
+ }
29
+ catch (error) {
30
+ return this.handleError(error);
31
+ }
32
+ }
33
+ async handleList(args) {
34
+ if (!args.workspaceId) {
35
+ return this.handleError(new Error('Workspace ID is required for list operation'));
36
+ }
37
+ const fields = await this.motionService.getCustomFields(args.workspaceId);
38
+ return (0, utils_1.formatCustomFieldList)(fields);
39
+ }
40
+ async handleCreate(args) {
41
+ if (!args.workspaceId || !args.name || !args.field) {
42
+ return this.handleError(new Error('Workspace ID, name, and field are required for create operation'));
43
+ }
44
+ if (args.name.length > utils_1.LIMITS.CUSTOM_FIELD_NAME_MAX_LENGTH) {
45
+ return this.handleError(new Error(`Field name exceeds ${utils_1.LIMITS.CUSTOM_FIELD_NAME_MAX_LENGTH} characters`));
46
+ }
47
+ if (['select', 'multiSelect'].includes(args.field) !== Boolean(args.options)) {
48
+ return this.handleError(new Error('Options parameter only allowed for select/multiSelect field types'));
49
+ }
50
+ const fieldData = {
51
+ name: args.name,
52
+ field: args.field,
53
+ ...(args.options && { metadata: { options: args.options } })
54
+ };
55
+ const newField = await this.motionService.createCustomField(args.workspaceId, fieldData);
56
+ return (0, utils_1.formatCustomFieldDetail)(newField);
57
+ }
58
+ async handleDelete(args) {
59
+ if (!args.workspaceId || !args.fieldId) {
60
+ return this.handleError(new Error('Workspace ID and field ID are required for delete operation'));
61
+ }
62
+ await this.motionService.deleteCustomField(args.workspaceId, args.fieldId);
63
+ return (0, utils_1.formatCustomFieldSuccess)('deleted');
64
+ }
65
+ async handleAddToProject(args) {
66
+ if (!args.projectId || !args.fieldId) {
67
+ return this.handleError(new Error('Project ID and field ID are required for add_to_project operation'));
68
+ }
69
+ await this.motionService.addCustomFieldToProject(args.projectId, args.fieldId, args.value);
70
+ return (0, utils_1.formatCustomFieldSuccess)('added', 'project', args.projectId);
71
+ }
72
+ async handleRemoveFromProject(args) {
73
+ if (!args.projectId || !args.fieldId) {
74
+ return this.handleError(new Error('Project ID and field ID are required for remove_from_project operation'));
75
+ }
76
+ await this.motionService.removeCustomFieldFromProject(args.projectId, args.fieldId);
77
+ return (0, utils_1.formatCustomFieldSuccess)('removed', 'project', args.projectId);
78
+ }
79
+ async handleAddToTask(args) {
80
+ if (!args.taskId || !args.fieldId) {
81
+ return this.handleError(new Error('Task ID and field ID are required for add_to_task operation'));
82
+ }
83
+ await this.motionService.addCustomFieldToTask(args.taskId, args.fieldId, args.value);
84
+ return (0, utils_1.formatCustomFieldSuccess)('added', 'task', args.taskId);
85
+ }
86
+ async handleRemoveFromTask(args) {
87
+ if (!args.taskId || !args.fieldId) {
88
+ return this.handleError(new Error('Task ID and field ID are required for remove_from_task operation'));
89
+ }
90
+ await this.motionService.removeCustomFieldFromTask(args.taskId, args.fieldId);
91
+ return (0, utils_1.formatCustomFieldSuccess)('removed', 'task', args.taskId);
92
+ }
93
+ }
94
+ exports.CustomFieldHandler = CustomFieldHandler;
95
+ //# sourceMappingURL=CustomFieldHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CustomFieldHandler.js","sourceRoot":"","sources":["../../src/handlers/CustomFieldHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { BaseHandler } from './base/BaseHandler';
2
+ import { HandlerContext } from './base/HandlerInterface';
3
+ export declare class HandlerFactory {
4
+ private handlers;
5
+ private context;
6
+ constructor(context: HandlerContext);
7
+ private registerHandlers;
8
+ createHandler(toolName: string): BaseHandler;
9
+ hasHandler(toolName: string): boolean;
10
+ getRegisteredToolNames(): string[];
11
+ registerHandler(toolName: string, handlerClass: new (context: HandlerContext) => BaseHandler): void;
12
+ unregisterHandler(toolName: string): boolean;
13
+ getHandlerCount(): number;
14
+ }
15
+ //# sourceMappingURL=HandlerFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HandlerFactory.d.ts","sourceRoot":"","sources":["../../src/handlers/HandlerFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAezD,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAA2D;IAC3E,OAAO,CAAC,OAAO,CAAiB;gBAEpB,OAAO,EAAE,cAAc;IAMnC,OAAO,CAAC,gBAAgB;IAaxB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,WAAW;IAQ5C,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAIrC,sBAAsB,IAAI,MAAM,EAAE;IAIlC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,KAAI,OAAO,EAAE,cAAc,KAAK,WAAW,GAAG,IAAI;IAIlG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;IAI5C,eAAe,IAAI,MAAM;CAG1B"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HandlerFactory = void 0;
4
+ const ToolDefinitions_1 = require("../tools/ToolDefinitions");
5
+ // Import all handler classes
6
+ const TaskHandler_1 = require("./TaskHandler");
7
+ const ProjectHandler_1 = require("./ProjectHandler");
8
+ const WorkspaceHandler_1 = require("./WorkspaceHandler");
9
+ const UserHandler_1 = require("./UserHandler");
10
+ const SearchHandler_1 = require("./SearchHandler");
11
+ const CommentHandler_1 = require("./CommentHandler");
12
+ const CustomFieldHandler_1 = require("./CustomFieldHandler");
13
+ const RecurringTaskHandler_1 = require("./RecurringTaskHandler");
14
+ const ScheduleHandler_1 = require("./ScheduleHandler");
15
+ const StatusHandler_1 = require("./StatusHandler");
16
+ class HandlerFactory {
17
+ constructor(context) {
18
+ this.context = context;
19
+ this.handlers = new Map();
20
+ this.registerHandlers();
21
+ }
22
+ registerHandlers() {
23
+ this.handlers.set(ToolDefinitions_1.TOOL_NAMES.TASKS, TaskHandler_1.TaskHandler);
24
+ this.handlers.set(ToolDefinitions_1.TOOL_NAMES.PROJECTS, ProjectHandler_1.ProjectHandler);
25
+ this.handlers.set(ToolDefinitions_1.TOOL_NAMES.WORKSPACES, WorkspaceHandler_1.WorkspaceHandler);
26
+ this.handlers.set(ToolDefinitions_1.TOOL_NAMES.USERS, UserHandler_1.UserHandler);
27
+ this.handlers.set(ToolDefinitions_1.TOOL_NAMES.SEARCH, SearchHandler_1.SearchHandler);
28
+ this.handlers.set(ToolDefinitions_1.TOOL_NAMES.COMMENTS, CommentHandler_1.CommentHandler);
29
+ this.handlers.set(ToolDefinitions_1.TOOL_NAMES.CUSTOM_FIELDS, CustomFieldHandler_1.CustomFieldHandler);
30
+ this.handlers.set(ToolDefinitions_1.TOOL_NAMES.RECURRING_TASKS, RecurringTaskHandler_1.RecurringTaskHandler);
31
+ this.handlers.set(ToolDefinitions_1.TOOL_NAMES.SCHEDULES, ScheduleHandler_1.ScheduleHandler);
32
+ this.handlers.set(ToolDefinitions_1.TOOL_NAMES.STATUSES, StatusHandler_1.StatusHandler);
33
+ }
34
+ createHandler(toolName) {
35
+ const HandlerClass = this.handlers.get(toolName);
36
+ if (!HandlerClass) {
37
+ throw new Error(`No handler registered for tool: ${toolName}`);
38
+ }
39
+ return new HandlerClass(this.context);
40
+ }
41
+ hasHandler(toolName) {
42
+ return this.handlers.has(toolName);
43
+ }
44
+ getRegisteredToolNames() {
45
+ return Array.from(this.handlers.keys());
46
+ }
47
+ registerHandler(toolName, handlerClass) {
48
+ this.handlers.set(toolName, handlerClass);
49
+ }
50
+ unregisterHandler(toolName) {
51
+ return this.handlers.delete(toolName);
52
+ }
53
+ getHandlerCount() {
54
+ return this.handlers.size;
55
+ }
56
+ }
57
+ exports.HandlerFactory = HandlerFactory;
58
+ //# sourceMappingURL=HandlerFactory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HandlerFactory.js","sourceRoot":"","sources":["../../src/handlers/HandlerFactory.ts"],"names":[],"mappings":";;;AAEA,8DAAsD;AAEtD,6BAA6B;AAC7B,+CAA4C;AAC5C,qDAAkD;AAClD,yDAAsD;AACtD,+CAA4C;AAC5C,mDAAgD;AAChD,qDAAkD;AAClD,6DAA0D;AAC1D,iEAA8D;AAC9D,uDAAoD;AACpD,mDAAgD;AAEhD,MAAa,cAAc;IAIzB,YAAY,OAAuB;QACjC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,4BAAU,CAAC,KAAK,EAAE,yBAAW,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,4BAAU,CAAC,QAAQ,EAAE,+BAAc,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,4BAAU,CAAC,UAAU,EAAE,mCAAgB,CAAC,CAAC;QAC3D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,4BAAU,CAAC,KAAK,EAAE,yBAAW,CAAC,CAAC;QACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,4BAAU,CAAC,MAAM,EAAE,6BAAa,CAAC,CAAC;QACpD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,4BAAU,CAAC,QAAQ,EAAE,+BAAc,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,4BAAU,CAAC,aAAa,EAAE,uCAAkB,CAAC,CAAC;QAChE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,4BAAU,CAAC,eAAe,EAAE,2CAAoB,CAAC,CAAC;QACpE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,4BAAU,CAAC,SAAS,EAAE,iCAAe,CAAC,CAAC;QACzD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,4BAAU,CAAC,QAAQ,EAAE,6BAAa,CAAC,CAAC;IACxD,CAAC;IAED,aAAa,CAAC,QAAgB;QAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACjD,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,mCAAmC,QAAQ,EAAE,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,IAAI,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,UAAU,CAAC,QAAgB;QACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IACrC,CAAC;IAED,sBAAsB;QACpB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,eAAe,CAAC,QAAgB,EAAE,YAAyD;QACzF,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IAC5C,CAAC;IAED,iBAAiB,CAAC,QAAgB;QAChC,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACxC,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5B,CAAC;CACF;AAlDD,wCAkDC"}
@@ -0,0 +1,10 @@
1
+ import { BaseHandler } from './base/BaseHandler';
2
+ import { McpToolResponse } from '../types/mcp';
3
+ import { MotionProjectsArgs } from '../types/mcp-tool-args';
4
+ export declare class ProjectHandler extends BaseHandler {
5
+ handle(args: MotionProjectsArgs): Promise<McpToolResponse>;
6
+ private handleCreate;
7
+ private handleList;
8
+ private handleGet;
9
+ }
10
+ //# sourceMappingURL=ProjectHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/ProjectHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AA2B5D,qBAAa,cAAe,SAAQ,WAAW;IACvC,MAAM,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC;YAmBlD,YAAY;YAmBZ,UAAU;YAiBV,SAAS;CAQxB"}
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ProjectHandler = void 0;
4
+ const BaseHandler_1 = require("./base/BaseHandler");
5
+ const utils_1 = require("../utils");
6
+ class ProjectHandler extends BaseHandler_1.BaseHandler {
7
+ async handle(args) {
8
+ try {
9
+ const { operation, ...params } = args;
10
+ switch (operation) {
11
+ case 'create':
12
+ return await this.handleCreate(params);
13
+ case 'list':
14
+ return await this.handleList(params);
15
+ case 'get':
16
+ return await this.handleGet(params);
17
+ default:
18
+ return this.handleUnknownOperation(operation);
19
+ }
20
+ }
21
+ catch (error) {
22
+ return this.handleError(error);
23
+ }
24
+ }
25
+ async handleCreate(params) {
26
+ if (!params.name) {
27
+ return this.handleError(new Error("Project name is required for create operation"));
28
+ }
29
+ const projectData = (0, utils_1.parseProjectArgs)(params);
30
+ const workspace = await this.workspaceResolver.resolveWorkspace({
31
+ workspaceId: projectData.workspaceId,
32
+ workspaceName: projectData.workspaceName
33
+ });
34
+ const project = await this.motionService.createProject({
35
+ ...projectData,
36
+ workspaceId: workspace.id
37
+ });
38
+ return (0, utils_1.formatMcpSuccess)(`Successfully created project "${project.name}" (ID: ${project.id})`);
39
+ }
40
+ async handleList(params) {
41
+ // If allWorkspaces is true and no specific workspace is provided, list all projects
42
+ if (params.allWorkspaces && !params.workspaceId && !params.workspaceName) {
43
+ const allProjects = await this.motionService.getAllProjects();
44
+ return (0, utils_1.formatProjectList)(allProjects, 'All Workspaces');
45
+ }
46
+ // Otherwise, use the existing single-workspace logic
47
+ const workspace = await this.workspaceResolver.resolveWorkspace({
48
+ workspaceId: params.workspaceId,
49
+ workspaceName: params.workspaceName
50
+ });
51
+ const projects = await this.motionService.getProjects(workspace.id);
52
+ return (0, utils_1.formatProjectList)(projects, workspace.name);
53
+ }
54
+ async handleGet(params) {
55
+ if (!params.projectId) {
56
+ return this.handleError(new Error("Project ID is required for get operation"));
57
+ }
58
+ const projectDetails = await this.motionService.getProject(params.projectId);
59
+ return (0, utils_1.formatDetailResponse)(projectDetails, `Project details for "${projectDetails.name}"`);
60
+ }
61
+ }
62
+ exports.ProjectHandler = ProjectHandler;
63
+ //# sourceMappingURL=ProjectHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProjectHandler.js","sourceRoot":"","sources":["../../src/handlers/ProjectHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { BaseHandler } from './base/BaseHandler';
2
+ import { McpToolResponse } from '../types/mcp';
3
+ import { MotionRecurringTasksArgs } from '../types/mcp-tool-args';
4
+ export declare class RecurringTaskHandler extends BaseHandler {
5
+ handle(args: MotionRecurringTasksArgs): Promise<McpToolResponse>;
6
+ private handleList;
7
+ private handleCreate;
8
+ private handleDelete;
9
+ }
10
+ //# sourceMappingURL=RecurringTaskHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecurringTaskHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/RecurringTaskHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,wBAAwB,EAAE,MAAM,wBAAwB,CAAC;AAIlE,qBAAa,oBAAqB,SAAQ,WAAW;IAC7C,MAAM,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAAC,eAAe,CAAC;YAmBxD,UAAU;YAQV,YAAY;YAiCZ,YAAY;CAQ3B"}
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RecurringTaskHandler = void 0;
4
+ const BaseHandler_1 = require("./base/BaseHandler");
5
+ const utils_1 = require("../utils");
6
+ class RecurringTaskHandler extends BaseHandler_1.BaseHandler {
7
+ async handle(args) {
8
+ try {
9
+ const { operation } = args;
10
+ switch (operation) {
11
+ case 'list':
12
+ return await this.handleList(args);
13
+ case 'create':
14
+ return await this.handleCreate(args);
15
+ case 'delete':
16
+ return await this.handleDelete(args);
17
+ default:
18
+ return this.handleUnknownOperation(operation);
19
+ }
20
+ }
21
+ catch (error) {
22
+ return this.handleError(error);
23
+ }
24
+ }
25
+ async handleList(args) {
26
+ if (!args.workspaceId) {
27
+ return this.handleError(new Error('Workspace ID is required for list operation'));
28
+ }
29
+ const recurringTasks = await this.motionService.getRecurringTasks(args.workspaceId);
30
+ return (0, utils_1.formatRecurringTaskList)(recurringTasks);
31
+ }
32
+ async handleCreate(args) {
33
+ if (!args.name || !args.workspaceId || !args.assigneeId || !args.frequency) {
34
+ return this.handleError(new Error('Name, workspace ID, assignee ID, and frequency are required for create operation'));
35
+ }
36
+ // Validate frequency
37
+ if (!args.frequency.type || !['daily', 'weekly', 'monthly', 'yearly'].includes(args.frequency.type)) {
38
+ return this.handleError(new Error('Frequency type must be one of: daily, weekly, monthly, yearly'));
39
+ }
40
+ // Additional validations would go here...
41
+ const workspace = await this.workspaceResolver.resolveWorkspace({ workspaceId: args.workspaceId });
42
+ const taskData = {
43
+ name: args.name,
44
+ workspaceId: workspace.id,
45
+ assigneeId: args.assigneeId,
46
+ frequency: args.frequency,
47
+ ...(args.description && { description: args.description }),
48
+ ...(args.projectId && { projectId: args.projectId }),
49
+ ...(args.deadlineType && { deadlineType: args.deadlineType }),
50
+ ...(args.duration && { duration: args.duration }),
51
+ ...(args.startingOn && { startingOn: args.startingOn }),
52
+ ...(args.idealTime && { idealTime: args.idealTime }),
53
+ ...(args.schedule && { schedule: args.schedule }),
54
+ ...(args.priority && { priority: args.priority })
55
+ };
56
+ const newTask = await this.motionService.createRecurringTask(taskData);
57
+ return (0, utils_1.formatRecurringTaskDetail)(newTask);
58
+ }
59
+ async handleDelete(args) {
60
+ if (!args.recurringTaskId) {
61
+ return this.handleError(new Error('Recurring task ID is required for delete operation'));
62
+ }
63
+ await this.motionService.deleteRecurringTask(args.recurringTaskId);
64
+ return (0, utils_1.formatMcpSuccess)(`Recurring task ${args.recurringTaskId} deleted successfully`);
65
+ }
66
+ }
67
+ exports.RecurringTaskHandler = RecurringTaskHandler;
68
+ //# sourceMappingURL=RecurringTaskHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RecurringTaskHandler.js","sourceRoot":"","sources":["../../src/handlers/RecurringTaskHandler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { BaseHandler } from './base/BaseHandler';
2
+ import { McpToolResponse } from '../types/mcp';
3
+ import { MotionSchedulesArgs } from '../types/mcp-tool-args';
4
+ export declare class ScheduleHandler extends BaseHandler {
5
+ handle(args: MotionSchedulesArgs): Promise<McpToolResponse>;
6
+ private handleList;
7
+ }
8
+ //# sourceMappingURL=ScheduleHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScheduleHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/ScheduleHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAG7D,qBAAa,eAAgB,SAAQ,WAAW;IACxC,MAAM,CAAC,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAAC;YASnD,UAAU;CA4BzB"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScheduleHandler = void 0;
4
+ const BaseHandler_1 = require("./base/BaseHandler");
5
+ const utils_1 = require("../utils");
6
+ class ScheduleHandler extends BaseHandler_1.BaseHandler {
7
+ async handle(args) {
8
+ try {
9
+ const { userId, startDate, endDate } = args;
10
+ return await this.handleList(userId, startDate, endDate);
11
+ }
12
+ catch (error) {
13
+ return this.handleError(error);
14
+ }
15
+ }
16
+ async handleList(userId, startDate, endDate) {
17
+ // Validate date formats if provided
18
+ const isValidDate = (dateStr) => {
19
+ if (!dateStr)
20
+ return true; // Optional fields are valid when not provided
21
+ const date = new Date(dateStr);
22
+ return !isNaN(date.getTime());
23
+ };
24
+ if (!isValidDate(startDate)) {
25
+ return this.handleError(new Error('startDate must be a valid date string (e.g., "2024-01-15" or "2024-01-15T10:30:00Z")'));
26
+ }
27
+ if (!isValidDate(endDate)) {
28
+ return this.handleError(new Error('endDate must be a valid date string (e.g., "2024-01-15" or "2024-01-15T10:30:00Z")'));
29
+ }
30
+ // Validate date range logic if both dates are provided
31
+ if (startDate && endDate) {
32
+ const start = new Date(startDate);
33
+ const end = new Date(endDate);
34
+ if (start > end) {
35
+ return this.handleError(new Error('startDate must be before or equal to endDate'));
36
+ }
37
+ }
38
+ const schedules = await this.motionService.getSchedules(userId, startDate, endDate);
39
+ return (0, utils_1.formatScheduleList)(schedules);
40
+ }
41
+ }
42
+ exports.ScheduleHandler = ScheduleHandler;
43
+ //# sourceMappingURL=ScheduleHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ScheduleHandler.js","sourceRoot":"","sources":["../../src/handlers/ScheduleHandler.ts"],"names":[],"mappings":";;;AAAA,oDAAiD;AAGjD,oCAA8C;AAE9C,MAAa,eAAgB,SAAQ,yBAAW;IAC9C,KAAK,CAAC,MAAM,CAAC,IAAyB;QACpC,IAAI,CAAC;YACH,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;YAC5C,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,MAAe,EAAE,SAAkB,EAAE,OAAgB;QAC5E,oCAAoC;QACpC,MAAM,WAAW,GAAG,CAAC,OAA2B,EAAW,EAAE;YAC3D,IAAI,CAAC,OAAO;gBAAE,OAAO,IAAI,CAAC,CAAC,8CAA8C;YACzE,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QAChC,CAAC,CAAC;QAEF,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,sFAAsF,CAAC,CAAC,CAAC;QAC7H,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,oFAAoF,CAAC,CAAC,CAAC;QAC3H,CAAC;QAED,uDAAuD;QACvD,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;YACzB,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;YAClC,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;YAC9B,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;gBAChB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QACpF,OAAO,IAAA,0BAAkB,EAAC,SAAS,CAAC,CAAC;IACvC,CAAC;CACF;AAtCD,0CAsCC"}
@@ -0,0 +1,10 @@
1
+ import { BaseHandler } from './base/BaseHandler';
2
+ import { McpToolResponse } from '../types/mcp';
3
+ import { MotionSearchArgs } from '../types/mcp-tool-args';
4
+ export declare class SearchHandler extends BaseHandler {
5
+ handle(args: MotionSearchArgs): Promise<McpToolResponse>;
6
+ private handleContentSearch;
7
+ private handleContextSearch;
8
+ private handleSmartSearch;
9
+ }
10
+ //# sourceMappingURL=SearchHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SearchHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/SearchHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAqB1D,qBAAa,aAAc,SAAQ,WAAW;IACtC,MAAM,CAAC,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;YAmBhD,mBAAmB;YAmCnB,mBAAmB;YAyBnB,iBAAiB;CA8ChC"}