motionmcp 1.0.1 → 2.0.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 +251 -417
  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 +266 -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-old.d.ts +29 -0
  60. package/dist/mcp-server-old.d.ts.map +1 -0
  61. package/dist/mcp-server-old.js +1304 -0
  62. package/dist/mcp-server-old.js.map +1 -0
  63. package/dist/mcp-server.d.ts +15 -0
  64. package/dist/mcp-server.d.ts.map +1 -0
  65. package/dist/mcp-server.js +145 -0
  66. package/dist/mcp-server.js.map +1 -0
  67. package/dist/schemas/motion.d.ts +4971 -0
  68. package/dist/schemas/motion.d.ts.map +1 -0
  69. package/dist/schemas/motion.js +328 -0
  70. package/dist/schemas/motion.js.map +1 -0
  71. package/dist/services/motionApi.d.ts +186 -0
  72. package/dist/services/motionApi.d.ts.map +1 -0
  73. package/dist/services/motionApi.js +1912 -0
  74. package/dist/services/motionApi.js.map +1 -0
  75. package/dist/tools/ToolConfigurator.d.ts +19 -0
  76. package/dist/tools/ToolConfigurator.d.ts.map +1 -0
  77. package/dist/tools/ToolConfigurator.js +89 -0
  78. package/dist/tools/ToolConfigurator.js.map +1 -0
  79. package/dist/tools/ToolDefinitions.d.ts +25 -0
  80. package/dist/tools/ToolDefinitions.d.ts.map +1 -0
  81. package/dist/tools/ToolDefinitions.js +502 -0
  82. package/dist/tools/ToolDefinitions.js.map +1 -0
  83. package/dist/tools/ToolRegistry.d.ts +16 -0
  84. package/dist/tools/ToolRegistry.d.ts.map +1 -0
  85. package/dist/tools/ToolRegistry.js +89 -0
  86. package/dist/tools/ToolRegistry.js.map +1 -0
  87. package/dist/tools/index.d.ts +4 -0
  88. package/dist/tools/index.d.ts.map +1 -0
  89. package/dist/tools/index.js +21 -0
  90. package/dist/tools/index.js.map +1 -0
  91. package/dist/types/mcp-tool-args.d.ts +122 -0
  92. package/dist/types/mcp-tool-args.d.ts.map +1 -0
  93. package/dist/types/mcp-tool-args.js +7 -0
  94. package/dist/types/mcp-tool-args.js.map +1 -0
  95. package/dist/types/mcp.d.ts +32 -0
  96. package/dist/types/mcp.d.ts.map +1 -0
  97. package/dist/types/mcp.js +3 -0
  98. package/dist/types/mcp.js.map +1 -0
  99. package/dist/types/motion.d.ts +304 -0
  100. package/dist/types/motion.d.ts.map +1 -0
  101. package/dist/types/motion.js +3 -0
  102. package/dist/types/motion.js.map +1 -0
  103. package/dist/utils/cache.d.ts +25 -0
  104. package/dist/utils/cache.d.ts.map +1 -0
  105. package/dist/utils/cache.js +135 -0
  106. package/dist/utils/cache.js.map +1 -0
  107. package/dist/utils/constants.d.ts +83 -0
  108. package/dist/utils/constants.d.ts.map +1 -0
  109. package/dist/utils/constants.js +151 -0
  110. package/dist/utils/constants.js.map +1 -0
  111. package/dist/utils/errorHandling.d.ts +50 -0
  112. package/dist/utils/errorHandling.d.ts.map +1 -0
  113. package/dist/utils/errorHandling.js +86 -0
  114. package/dist/utils/errorHandling.js.map +1 -0
  115. package/dist/utils/index.d.ts +13 -0
  116. package/dist/utils/index.d.ts.map +1 -0
  117. package/dist/utils/index.js +38 -0
  118. package/dist/utils/index.js.map +1 -0
  119. package/dist/utils/logger.d.ts +13 -0
  120. package/dist/utils/logger.d.ts.map +1 -0
  121. package/dist/utils/logger.js +47 -0
  122. package/dist/utils/logger.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 +92 -0
  132. package/dist/utils/responseFormatters.d.ts.map +1 -0
  133. package/dist/utils/responseFormatters.js +331 -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 +137 -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 -49
  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 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAIH,MAAM,gBAAgB,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,EAAE,QAAQ,EAAE,eAAe,CAAC,CAAC;AAEpF;;GAEG;AACH,SAAS,eAAe,CAAC,IAAyB;IAChD,MAAM,SAAS,GAAwB,EAAE,CAAC;IAE1C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,8CAA8C;QAC9C,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACtE,SAAS,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;QAChC,CAAC;aAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChF,sCAAsC;YACtC,SAAS,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACzB,CAAC;IACH,CAAC;IAED,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;GAKG;AACI,MAAM,MAAM,GAAG,CAAC,KAAe,EAAE,OAAe,EAAE,QAA6B,EAAE,EAAQ,EAAE;IAChG,MAAM,cAAc,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAE9C,MAAM,QAAQ,GAAG;QACf,KAAK;QACL,GAAG,EAAE,OAAO;QACZ,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QAC9B,GAAG,cAAc;KAClB,CAAC;IAEF,kDAAkD;IAClD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC;AAC1C,CAAC,CAAC;AAZW,QAAA,MAAM,UAYjB"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Enhanced Pagination Utilities with Proper Response Wrapper Support
3
+ *
4
+ * This replaces the old pagination utility with proper handling of Motion API's
5
+ * inconsistent response patterns using the ResponseWrapper utility.
6
+ */
7
+ import { AxiosResponse } from 'axios';
8
+ import { UnwrappedResponse } from './responseWrapper';
9
+ export interface PaginatedResponse<T> {
10
+ items: T[];
11
+ nextCursor?: string;
12
+ hasMore: boolean;
13
+ totalFetched: number;
14
+ }
15
+ export interface CursorPaginationOptions {
16
+ maxPages?: number;
17
+ pageSize?: number;
18
+ logProgress?: boolean;
19
+ maxItems?: number;
20
+ }
21
+ /**
22
+ * Enhanced pagination handler that properly uses response wrapper
23
+ *
24
+ * @param fetchPage - Function that fetches a single page of data
25
+ * @param apiEndpoint - The API endpoint name for proper response unwrapping
26
+ * @param options - Pagination options
27
+ * @returns All items from all pages with pagination metadata
28
+ */
29
+ export declare function fetchAllPages<T>(fetchPage: (cursor?: string) => Promise<AxiosResponse<any>>, apiEndpoint: string, options?: CursorPaginationOptions): Promise<PaginatedResponse<T>>;
30
+ /**
31
+ * Fetches a single page with proper response unwrapping
32
+ *
33
+ * @param fetchPage - Function that fetches a single page
34
+ * @param apiEndpoint - The API endpoint name for proper response unwrapping
35
+ * @param cursor - Optional cursor for the specific page
36
+ * @returns Single page of data with pagination metadata
37
+ */
38
+ export declare function fetchSinglePage<T>(fetchPage: (cursor?: string) => Promise<AxiosResponse<any>>, apiEndpoint: string, cursor?: string): Promise<UnwrappedResponse<T>>;
39
+ /**
40
+ * Check if an endpoint supports pagination
41
+ */
42
+ export declare function endpointSupportsPagination(apiEndpoint: string): boolean;
43
+ export { UnwrappedResponse } from './responseWrapper';
44
+ //# sourceMappingURL=paginationNew.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paginationNew.d.ts","sourceRoot":"","sources":["../../src/utils/paginationNew.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAGtC,OAAO,EAAyC,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAG7F,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAAC,CAAC,EACnC,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAC3D,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAuH/B;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CAAC,CAAC,EACrC,SAAS,EAAE,CAAC,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,EAC3D,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAG/B;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAEvE;AAGD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,149 @@
1
+ "use strict";
2
+ /**
3
+ * Enhanced Pagination Utilities with Proper Response Wrapper Support
4
+ *
5
+ * This replaces the old pagination utility with proper handling of Motion API's
6
+ * inconsistent response patterns using the ResponseWrapper utility.
7
+ */
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.fetchAllPages = fetchAllPages;
10
+ exports.fetchSinglePage = fetchSinglePage;
11
+ exports.endpointSupportsPagination = endpointSupportsPagination;
12
+ const logger_1 = require("./logger");
13
+ const constants_1 = require("./constants");
14
+ const responseWrapper_1 = require("./responseWrapper");
15
+ /**
16
+ * Enhanced pagination handler that properly uses response wrapper
17
+ *
18
+ * @param fetchPage - Function that fetches a single page of data
19
+ * @param apiEndpoint - The API endpoint name for proper response unwrapping
20
+ * @param options - Pagination options
21
+ * @returns All items from all pages with pagination metadata
22
+ */
23
+ async function fetchAllPages(fetchPage, apiEndpoint, options = {}) {
24
+ const { maxPages = constants_1.LIMITS.MAX_PAGES, logProgress = true, maxItems = constants_1.LIMITS.MAX_PAGE_SIZE * 10 } = options;
25
+ let allItems = [];
26
+ let cursor;
27
+ let pageCount = 0;
28
+ let hasMore = true;
29
+ // Infinite loop protection - ensure we never fetch more than absolute max pages
30
+ const absoluteMaxPages = Math.min(maxPages, constants_1.LIMITS.ABSOLUTE_MAX_PAGES); // Hard limit to prevent infinite loops
31
+ while (hasMore && pageCount < absoluteMaxPages) {
32
+ try {
33
+ if (logProgress && pageCount > 0) {
34
+ (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, `Fetching page ${pageCount + 1} for ${apiEndpoint}`, {
35
+ cursor,
36
+ pageCount,
37
+ itemsSoFar: allItems.length
38
+ });
39
+ }
40
+ const response = await fetchPage(cursor);
41
+ const unwrapped = (0, responseWrapper_1.unwrapApiResponse)(response.data, apiEndpoint);
42
+ // Enforce page size limit to prevent memory exhaustion
43
+ if (unwrapped.data.length > constants_1.LIMITS.MAX_PAGE_SIZE) {
44
+ (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.WARN, `Page size ${unwrapped.data.length} exceeds maximum allowed ${constants_1.LIMITS.MAX_PAGE_SIZE}, truncating`, {
45
+ pageNumber: pageCount + 1,
46
+ endpoint: apiEndpoint,
47
+ originalSize: unwrapped.data.length,
48
+ truncatedSize: constants_1.LIMITS.MAX_PAGE_SIZE
49
+ });
50
+ unwrapped.data = unwrapped.data.slice(0, constants_1.LIMITS.MAX_PAGE_SIZE);
51
+ }
52
+ // Add items to our collection, but check memory limits first
53
+ const itemsToAdd = unwrapped.data;
54
+ if (allItems.length + itemsToAdd.length > maxItems) {
55
+ // Limit reached - add only what fits
56
+ const remainingSlots = maxItems - allItems.length;
57
+ if (remainingSlots > 0) {
58
+ allItems.push(...itemsToAdd.slice(0, remainingSlots));
59
+ }
60
+ (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.WARN, `Memory limit reached for ${apiEndpoint}, stopping pagination`, {
61
+ totalItems: allItems.length,
62
+ maxItems,
63
+ pageCount: pageCount + 1,
64
+ endpoint: apiEndpoint
65
+ });
66
+ hasMore = false;
67
+ }
68
+ else {
69
+ allItems.push(...itemsToAdd);
70
+ }
71
+ pageCount++;
72
+ // Determine if there are more pages
73
+ if (unwrapped.meta?.nextCursor) {
74
+ const newCursor = unwrapped.meta.nextCursor;
75
+ // Additional safety: detect cursor not advancing (API bug protection)
76
+ if (pageCount > 1 && cursor === newCursor) {
77
+ (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.WARN, `Cursor not advancing for ${apiEndpoint}, stopping pagination`, {
78
+ oldCursor: cursor,
79
+ newCursor,
80
+ pageCount,
81
+ endpoint: apiEndpoint
82
+ });
83
+ hasMore = false;
84
+ }
85
+ else {
86
+ cursor = newCursor;
87
+ }
88
+ }
89
+ else {
90
+ hasMore = false;
91
+ }
92
+ // If we got no items on this page, stop
93
+ if (unwrapped.data.length === 0) {
94
+ hasMore = false;
95
+ }
96
+ if (logProgress) {
97
+ (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, `Page ${pageCount} fetched for ${apiEndpoint}`, {
98
+ pageItems: unwrapped.data.length,
99
+ totalItems: allItems.length,
100
+ hasMore,
101
+ nextCursor: cursor,
102
+ endpoint: apiEndpoint
103
+ });
104
+ }
105
+ }
106
+ catch (error) {
107
+ (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.ERROR, `Failed to fetch page ${pageCount + 1} for ${apiEndpoint}`, {
108
+ error: error instanceof Error ? error.message : String(error),
109
+ pageCount,
110
+ cursor,
111
+ endpoint: apiEndpoint
112
+ });
113
+ // Don't completely fail - return what we have so far
114
+ hasMore = false;
115
+ }
116
+ }
117
+ if (pageCount >= absoluteMaxPages && hasMore) {
118
+ (0, logger_1.mcpLog)(constants_1.LOG_LEVELS.WARN, `Reached maximum page limit for ${apiEndpoint}`, {
119
+ maxPages: absoluteMaxPages,
120
+ totalItems: allItems.length,
121
+ endpoint: apiEndpoint
122
+ });
123
+ }
124
+ return {
125
+ items: allItems,
126
+ nextCursor: cursor,
127
+ hasMore: hasMore && pageCount < absoluteMaxPages,
128
+ totalFetched: allItems.length
129
+ };
130
+ }
131
+ /**
132
+ * Fetches a single page with proper response unwrapping
133
+ *
134
+ * @param fetchPage - Function that fetches a single page
135
+ * @param apiEndpoint - The API endpoint name for proper response unwrapping
136
+ * @param cursor - Optional cursor for the specific page
137
+ * @returns Single page of data with pagination metadata
138
+ */
139
+ async function fetchSinglePage(fetchPage, apiEndpoint, cursor) {
140
+ const response = await fetchPage(cursor);
141
+ return (0, responseWrapper_1.unwrapApiResponse)(response.data, apiEndpoint);
142
+ }
143
+ /**
144
+ * Check if an endpoint supports pagination
145
+ */
146
+ function endpointSupportsPagination(apiEndpoint) {
147
+ return (0, responseWrapper_1.supportsPagination)(apiEndpoint);
148
+ }
149
+ //# sourceMappingURL=paginationNew.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paginationNew.js","sourceRoot":"","sources":["../../src/utils/paginationNew.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Parameter Utilities - Parameter parsing and validation helpers
3
+ *
4
+ * This module provides utilities for parsing, validating, and setting
5
+ * default values for MCP handler parameters, reducing duplication and
6
+ * ensuring consistent parameter handling.
7
+ */
8
+ interface WorkspaceArgs {
9
+ workspaceId?: string;
10
+ workspaceName?: string;
11
+ }
12
+ interface SearchArgs extends WorkspaceArgs {
13
+ query?: string;
14
+ searchScope?: 'both' | 'tasks' | 'projects';
15
+ limit?: number;
16
+ }
17
+ interface TaskArgs extends WorkspaceArgs {
18
+ name?: string;
19
+ description?: string;
20
+ projectId?: string;
21
+ projectName?: string;
22
+ status?: string;
23
+ priority?: 'ASAP' | 'HIGH' | 'MEDIUM' | 'LOW';
24
+ dueDate?: string;
25
+ duration?: string | number;
26
+ labels?: string[];
27
+ assigneeId?: string;
28
+ autoScheduled?: Record<string, unknown> | null;
29
+ }
30
+ interface ProjectArgs extends WorkspaceArgs {
31
+ name?: string;
32
+ description?: string;
33
+ color?: string;
34
+ status?: string;
35
+ }
36
+ /**
37
+ * Parse workspace-related arguments from MCP request
38
+ */
39
+ export declare function parseWorkspaceArgs(args?: Record<string, unknown>): WorkspaceArgs;
40
+ /**
41
+ * Parse search-related arguments from MCP request
42
+ */
43
+ export declare function parseSearchArgs(args?: Record<string, unknown>): SearchArgs;
44
+ /**
45
+ * Parse task creation/update arguments from MCP request
46
+ */
47
+ export declare function parseTaskArgs(args?: Record<string, unknown>): TaskArgs;
48
+ /**
49
+ * Parse project creation/update arguments from MCP request
50
+ */
51
+ export declare function parseProjectArgs(args?: Record<string, unknown>): ProjectArgs;
52
+ /**
53
+ * Set default values for parameters
54
+ */
55
+ export declare function setDefaults<T extends object, D extends Partial<T>>(args?: T, defaults?: D): T & D;
56
+ /**
57
+ * Validate that required parameters are present
58
+ * @throws {ValidationError} If required parameters are missing
59
+ */
60
+ export declare function validateRequiredParams(args?: Record<string, unknown>, required?: string[]): void;
61
+ /**
62
+ * Validate parameter types
63
+ * @throws {ValidationError} If parameters have wrong types
64
+ */
65
+ export declare function validateParameterTypes(args?: Record<string, unknown>, types?: Record<string, string>): void;
66
+ /**
67
+ * Sanitize string parameters (trim whitespace, handle empty strings)
68
+ * Following NULL_UNDEFINED_POLICY: empty strings become undefined (deleted)
69
+ */
70
+ export declare function sanitizeStringParams<T extends Record<string, any>>(args?: T, stringParams?: (keyof T)[]): T;
71
+ interface ValidationOptions {
72
+ requireWorkspace?: boolean;
73
+ }
74
+ /**
75
+ * Parse and validate workspace parameters with common validation
76
+ */
77
+ export declare function parseAndValidateWorkspace(args?: Record<string, unknown>, options?: ValidationOptions): WorkspaceArgs;
78
+ export {};
79
+ //# sourceMappingURL=parameterUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameterUtils.d.ts","sourceRoot":"","sources":["../../src/utils/parameterUtils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,UAAU,aAAa;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,UAAU,UAAW,SAAQ,aAAa;IACxC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,UAAU,CAAC;IAC5C,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,QAAS,SAAQ,aAAa;IACtC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IAC9C,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;CAChD;AAED,UAAU,WAAY,SAAQ,aAAa;IACzC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,aAAa,CAKpF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,UAAU,CAO9E;AAoDD;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,QAAQ,CAe1E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,GAAG,WAAW,CAQhF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,OAAO,CAAC,CAAC,CAAC,EAChE,IAAI,GAAE,CAAW,EACjB,QAAQ,GAAE,CAAW,GACpB,CAAC,GAAG,CAAC,CAEP;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAClC,QAAQ,GAAE,MAAM,EAAO,GACtB,IAAI,CAgBN;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAClC,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACjC,IAAI,CAmBN;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAChE,IAAI,GAAE,CAAW,EACjB,YAAY,GAAE,CAAC,MAAM,CAAC,CAAC,EAAO,GAC7B,CAAC,CAoBH;AAED,UAAU,iBAAiB;IACzB,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,EAClC,OAAO,GAAE,iBAAsB,GAC9B,aAAa,CAcf"}
@@ -0,0 +1,189 @@
1
+ "use strict";
2
+ /**
3
+ * Parameter Utilities - Parameter parsing and validation helpers
4
+ *
5
+ * This module provides utilities for parsing, validating, and setting
6
+ * default values for MCP handler parameters, reducing duplication and
7
+ * ensuring consistent parameter handling.
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.parseWorkspaceArgs = parseWorkspaceArgs;
11
+ exports.parseSearchArgs = parseSearchArgs;
12
+ exports.parseTaskArgs = parseTaskArgs;
13
+ exports.parseProjectArgs = parseProjectArgs;
14
+ exports.setDefaults = setDefaults;
15
+ exports.validateRequiredParams = validateRequiredParams;
16
+ exports.validateParameterTypes = validateParameterTypes;
17
+ exports.sanitizeStringParams = sanitizeStringParams;
18
+ exports.parseAndValidateWorkspace = parseAndValidateWorkspace;
19
+ const constants_1 = require("./constants");
20
+ const errorHandling_1 = require("./errorHandling");
21
+ const sanitize_1 = require("./sanitize");
22
+ /**
23
+ * Parse workspace-related arguments from MCP request
24
+ */
25
+ function parseWorkspaceArgs(args = {}) {
26
+ return {
27
+ workspaceId: args.workspaceId || undefined,
28
+ workspaceName: args.workspaceName ? (0, sanitize_1.sanitizeName)(args.workspaceName) : undefined
29
+ };
30
+ }
31
+ /**
32
+ * Parse search-related arguments from MCP request
33
+ */
34
+ function parseSearchArgs(args = {}) {
35
+ return {
36
+ query: args.query ? (0, sanitize_1.sanitizeName)(args.query) : '',
37
+ searchScope: args.searchScope || constants_1.DEFAULTS.SEARCH_SCOPE,
38
+ limit: args.limit || constants_1.DEFAULTS.SEARCH_LIMIT,
39
+ ...parseWorkspaceArgs(args)
40
+ };
41
+ }
42
+ /**
43
+ * Parse autoScheduled parameter to handle various input formats
44
+ * @param value - The autoScheduled value from MCP request
45
+ * @returns Proper autoScheduled value for Motion API
46
+ */
47
+ function parseAutoScheduledParam(value) {
48
+ // If undefined, leave as undefined (field not provided)
49
+ if (value === undefined) {
50
+ return undefined;
51
+ }
52
+ // If null, keep as null (explicitly disable auto-scheduling)
53
+ if (value === null) {
54
+ return null;
55
+ }
56
+ // If it's already an object, use it as-is
57
+ if (typeof value === 'object' && value !== null) {
58
+ return value;
59
+ }
60
+ // If it's a non-empty string, treat as schedule name
61
+ if (typeof value === 'string' && value.trim()) {
62
+ const trimmed = value.trim();
63
+ // If it's 'false', disable auto-scheduling
64
+ if (trimmed === 'false') {
65
+ return null;
66
+ }
67
+ // If it's 'true' or empty string, enable with no schedule (will trigger validation error)
68
+ if (trimmed === 'true' || trimmed === '') {
69
+ return {}; // Empty object enables auto-scheduling but will require schedule validation
70
+ }
71
+ // Otherwise, treat as schedule name
72
+ return { schedule: trimmed };
73
+ }
74
+ // If it's 'true' or true, enable auto-scheduling (will trigger validation for schedule)
75
+ if (value === 'true' || value === true) {
76
+ return {}; // Empty object enables auto-scheduling but will require schedule validation
77
+ }
78
+ // If it's 'false' or false, disable auto-scheduling
79
+ if (value === 'false' || value === false) {
80
+ return null;
81
+ }
82
+ // For any other value, treat as undefined (not provided)
83
+ return undefined;
84
+ }
85
+ /**
86
+ * Parse task creation/update arguments from MCP request
87
+ */
88
+ function parseTaskArgs(args = {}) {
89
+ return {
90
+ name: args.name ? (0, sanitize_1.sanitizeName)(args.name) : undefined,
91
+ description: (0, sanitize_1.sanitizeDescription)(args.description),
92
+ projectId: args.projectId || undefined,
93
+ projectName: args.projectName ? (0, sanitize_1.sanitizeName)(args.projectName) : undefined,
94
+ status: args.status || undefined,
95
+ priority: args.priority || undefined,
96
+ dueDate: args.dueDate || undefined,
97
+ duration: args.duration !== undefined ? args.duration : undefined,
98
+ labels: Array.isArray(args.labels) ? args.labels : undefined,
99
+ assigneeId: args.assigneeId || undefined,
100
+ autoScheduled: parseAutoScheduledParam(args.autoScheduled),
101
+ ...parseWorkspaceArgs(args)
102
+ };
103
+ }
104
+ /**
105
+ * Parse project creation/update arguments from MCP request
106
+ */
107
+ function parseProjectArgs(args = {}) {
108
+ return {
109
+ name: args.name ? (0, sanitize_1.sanitizeName)(args.name) : undefined,
110
+ description: (0, sanitize_1.sanitizeDescription)(args.description),
111
+ color: args.color || undefined,
112
+ status: args.status || undefined,
113
+ ...parseWorkspaceArgs(args)
114
+ };
115
+ }
116
+ /**
117
+ * Set default values for parameters
118
+ */
119
+ function setDefaults(args = {}, defaults = {}) {
120
+ return { ...defaults, ...args };
121
+ }
122
+ /**
123
+ * Validate that required parameters are present
124
+ * @throws {ValidationError} If required parameters are missing
125
+ */
126
+ function validateRequiredParams(args = {}, required = []) {
127
+ const missing = [];
128
+ for (const param of required) {
129
+ if (args[param] === null || args[param] === undefined || args[param] === '') {
130
+ missing.push(param);
131
+ }
132
+ }
133
+ if (missing.length > 0) {
134
+ throw new errorHandling_1.ValidationError(`Missing required parameters: ${missing.join(', ')}`, missing[0], { missing, provided: Object.keys(args) });
135
+ }
136
+ }
137
+ /**
138
+ * Validate parameter types
139
+ * @throws {ValidationError} If parameters have wrong types
140
+ */
141
+ function validateParameterTypes(args = {}, types = {}) {
142
+ const errors = [];
143
+ for (const [param, expectedType] of Object.entries(types)) {
144
+ if (args[param] !== null && args[param] !== undefined) {
145
+ const actualType = typeof args[param];
146
+ if (actualType !== expectedType) {
147
+ errors.push(`${param} should be ${expectedType}, got ${actualType}`);
148
+ }
149
+ }
150
+ }
151
+ if (errors.length > 0) {
152
+ throw new errorHandling_1.ValidationError(`Type validation failed: ${errors.join('; ')}`, null, { errors, args });
153
+ }
154
+ }
155
+ /**
156
+ * Sanitize string parameters (trim whitespace, handle empty strings)
157
+ * Following NULL_UNDEFINED_POLICY: empty strings become undefined (deleted)
158
+ */
159
+ function sanitizeStringParams(args = {}, stringParams = []) {
160
+ const sanitized = { ...args };
161
+ for (const param of stringParams) {
162
+ const value = sanitized[param];
163
+ if (typeof value === 'string') {
164
+ const trimmed = value.trim();
165
+ // Delete empty strings (makes them undefined) per policy
166
+ if (trimmed === '') {
167
+ delete sanitized[param];
168
+ }
169
+ else {
170
+ // Type-safe assignment: we've verified it's a string at runtime
171
+ // and we're only processing declared string parameters
172
+ Object.assign(sanitized, { [param]: trimmed });
173
+ }
174
+ }
175
+ }
176
+ return sanitized;
177
+ }
178
+ /**
179
+ * Parse and validate workspace parameters with common validation
180
+ */
181
+ function parseAndValidateWorkspace(args = {}, options = {}) {
182
+ const { requireWorkspace = false } = options;
183
+ const workspaceParams = parseWorkspaceArgs(args);
184
+ if (requireWorkspace && !workspaceParams.workspaceId && !workspaceParams.workspaceName) {
185
+ throw new errorHandling_1.ValidationError('Either workspaceId or workspaceName is required', 'workspace', { provided: workspaceParams });
186
+ }
187
+ return workspaceParams;
188
+ }
189
+ //# sourceMappingURL=parameterUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parameterUtils.js","sourceRoot":"","sources":["../../src/utils/parameterUtils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Response Formatting Utilities - MCP response formatting helpers
3
+ *
4
+ * This module provides utilities to format various types of responses
5
+ * consistently across all MCP handlers, reducing duplication and ensuring
6
+ * uniform response structures.
7
+ */
8
+ import { CallToolResult } from "@modelcontextprotocol/sdk/types.js";
9
+ import { MotionProject, MotionTask, MotionWorkspace, MotionComment, MotionCustomField, MotionRecurringTask, MotionSchedule, MotionStatus } from '../types/motion';
10
+ /**
11
+ * Format a list of items for MCP response
12
+ */
13
+ export declare function formatListResponse<T>(items: T[], title: string, formatter: (item: T) => string): CallToolResult;
14
+ interface ProjectListOptions {
15
+ includeWorkspaceNote?: boolean;
16
+ showIds?: boolean;
17
+ }
18
+ /**
19
+ * Format project list response with workspace context
20
+ */
21
+ export declare function formatProjectList(projects: MotionProject[], workspaceName: string, workspaceId?: string | null, options?: ProjectListOptions): CallToolResult;
22
+ interface TaskListContext {
23
+ workspaceName?: string;
24
+ projectName?: string;
25
+ status?: string;
26
+ limit?: number;
27
+ allWorkspaces?: boolean;
28
+ }
29
+ /**
30
+ * Format task list response
31
+ */
32
+ export declare function formatTaskList(tasks: MotionTask[], context?: TaskListContext): CallToolResult;
33
+ /**
34
+ * Format workspace list response
35
+ */
36
+ export declare function formatWorkspaceList(workspaces: MotionWorkspace[]): CallToolResult;
37
+ /**
38
+ * Format detailed item response (project, task, etc.)
39
+ */
40
+ export declare function formatDetailResponse<T extends Record<string, any>>(item: T, itemType: string, fields?: (keyof T)[]): CallToolResult;
41
+ /**
42
+ * Format single task detail response with comprehensive information
43
+ */
44
+ export declare function formatTaskDetail(task: MotionTask): CallToolResult;
45
+ interface SearchOptions {
46
+ limit?: number;
47
+ searchScope?: string;
48
+ }
49
+ interface SearchResult {
50
+ id: string;
51
+ name: string;
52
+ projectId?: string;
53
+ }
54
+ /**
55
+ * Format search results response
56
+ */
57
+ export declare function formatSearchResults(results: SearchResult[], query: string, options?: SearchOptions): CallToolResult;
58
+ /**
59
+ * Format comments list response
60
+ */
61
+ export declare function formatCommentList(comments: MotionComment[]): CallToolResult;
62
+ /**
63
+ * Format single comment response
64
+ */
65
+ export declare function formatCommentDetail(comment: MotionComment): CallToolResult;
66
+ /**
67
+ * Format custom field list response
68
+ */
69
+ export declare function formatCustomFieldList(fields: MotionCustomField[]): CallToolResult;
70
+ /**
71
+ * Format single custom field response
72
+ */
73
+ export declare function formatCustomFieldDetail(field: MotionCustomField): CallToolResult;
74
+ /**
75
+ * Format success message for custom field operations
76
+ */
77
+ export declare function formatCustomFieldSuccess(operation: string, entityType?: string, entityId?: string): CallToolResult;
78
+ /**
79
+ * Format recurring task list response
80
+ */
81
+ export declare function formatRecurringTaskList(tasks: MotionRecurringTask[]): CallToolResult;
82
+ /**
83
+ * Format single recurring task response
84
+ */
85
+ export declare function formatRecurringTaskDetail(task: MotionRecurringTask): CallToolResult;
86
+ /**
87
+ * Format schedule list response
88
+ */
89
+ export declare function formatScheduleList(schedules: MotionSchedule[]): CallToolResult;
90
+ export declare function formatStatusList(statuses: MotionStatus[]): CallToolResult;
91
+ export {};
92
+ //# sourceMappingURL=responseFormatters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responseFormatters.d.ts","sourceRoot":"","sources":["../../src/utils/responseFormatters.ts"],"names":[],"mappings":"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"}