motionmcp 2.6.0 → 2.8.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.
- package/README.md +4 -4
- package/dist/handlers/CustomFieldHandler.d.ts.map +1 -1
- package/dist/handlers/CustomFieldHandler.js +18 -2
- package/dist/handlers/CustomFieldHandler.js.map +1 -1
- package/dist/handlers/HandlerFactory.d.ts +0 -5
- package/dist/handlers/HandlerFactory.d.ts.map +1 -1
- package/dist/handlers/HandlerFactory.js +0 -15
- package/dist/handlers/HandlerFactory.js.map +1 -1
- package/dist/handlers/RecurringTaskHandler.d.ts.map +1 -1
- package/dist/handlers/RecurringTaskHandler.js +7 -2
- package/dist/handlers/RecurringTaskHandler.js.map +1 -1
- package/dist/handlers/TaskHandler.d.ts.map +1 -1
- package/dist/handlers/TaskHandler.js +7 -0
- package/dist/handlers/TaskHandler.js.map +1 -1
- package/dist/mcp-server.js +3 -3
- package/dist/mcp-server.js.map +1 -1
- package/dist/services/api/ApiClient.d.ts +22 -0
- package/dist/services/api/ApiClient.d.ts.map +1 -0
- package/dist/services/api/ApiClient.js +198 -0
- package/dist/services/api/ApiClient.js.map +1 -0
- package/dist/services/api/CacheManager.d.ts +21 -0
- package/dist/services/api/CacheManager.d.ts.map +1 -0
- package/dist/services/api/CacheManager.js +25 -0
- package/dist/services/api/CacheManager.js.map +1 -0
- package/dist/services/api/comments.d.ts +8 -0
- package/dist/services/api/comments.d.ts.map +1 -0
- package/dist/services/api/comments.js +86 -0
- package/dist/services/api/comments.js.map +1 -0
- package/dist/services/api/customFields.d.ts +21 -0
- package/dist/services/api/customFields.d.ts.map +1 -0
- package/dist/services/api/customFields.js +277 -0
- package/dist/services/api/customFields.js.map +1 -0
- package/dist/services/api/index.d.ts +22 -0
- package/dist/services/api/index.d.ts.map +1 -0
- package/dist/services/api/index.js +64 -0
- package/dist/services/api/index.js.map +1 -0
- package/dist/services/api/projects.d.ts +18 -0
- package/dist/services/api/projects.d.ts.map +1 -0
- package/dist/services/api/projects.js +346 -0
- package/dist/services/api/projects.js.map +1 -0
- package/dist/services/api/recurringTasks.d.ts +15 -0
- package/dist/services/api/recurringTasks.d.ts.map +1 -0
- package/dist/services/api/recurringTasks.js +143 -0
- package/dist/services/api/recurringTasks.js.map +1 -0
- package/dist/services/api/schedules.d.ts +8 -0
- package/dist/services/api/schedules.d.ts.map +1 -0
- package/dist/services/api/schedules.js +70 -0
- package/dist/services/api/schedules.js.map +1 -0
- package/dist/services/api/search.d.ts +29 -0
- package/dist/services/api/search.d.ts.map +1 -0
- package/dist/services/api/search.js +415 -0
- package/dist/services/api/search.js.map +1 -0
- package/dist/services/api/statuses.d.ts +7 -0
- package/dist/services/api/statuses.d.ts.map +1 -0
- package/dist/services/api/statuses.js +67 -0
- package/dist/services/api/statuses.js.map +1 -0
- package/dist/services/api/tasks.d.ts +34 -0
- package/dist/services/api/tasks.d.ts.map +1 -0
- package/dist/services/api/tasks.js +474 -0
- package/dist/services/api/tasks.js.map +1 -0
- package/dist/services/api/types.d.ts +54 -0
- package/dist/services/api/types.d.ts.map +1 -0
- package/dist/services/api/types.js +9 -0
- package/dist/services/api/types.js.map +1 -0
- package/dist/services/api/users.d.ts +8 -0
- package/dist/services/api/users.d.ts.map +1 -0
- package/dist/services/api/users.js +93 -0
- package/dist/services/api/users.js.map +1 -0
- package/dist/services/api/workspaces.d.ts +7 -0
- package/dist/services/api/workspaces.d.ts.map +1 -0
- package/dist/services/api/workspaces.js +59 -0
- package/dist/services/api/workspaces.js.map +1 -0
- package/dist/services/motionApi.d.ts +34 -180
- package/dist/services/motionApi.d.ts.map +1 -1
- package/dist/services/motionApi.js +84 -2163
- package/dist/services/motionApi.js.map +1 -1
- package/dist/tools/ToolConfigurator.d.ts +1 -7
- package/dist/tools/ToolConfigurator.d.ts.map +1 -1
- package/dist/tools/ToolConfigurator.js +0 -31
- package/dist/tools/ToolConfigurator.js.map +1 -1
- package/dist/tools/ToolDefinitions.js +1 -1
- package/dist/tools/ToolDefinitions.js.map +1 -1
- package/dist/tools/ToolRegistry.d.ts +1 -22
- package/dist/tools/ToolRegistry.d.ts.map +1 -1
- package/dist/tools/ToolRegistry.js +0 -31
- package/dist/tools/ToolRegistry.js.map +1 -1
- package/dist/types/motion.d.ts +0 -7
- package/dist/types/motion.d.ts.map +1 -1
- package/dist/utils/cache.d.ts +0 -5
- package/dist/utils/cache.d.ts.map +1 -1
- package/dist/utils/cache.js +0 -8
- package/dist/utils/cache.js.map +1 -1
- package/dist/utils/constants.d.ts +4 -0
- package/dist/utils/constants.d.ts.map +1 -1
- package/dist/utils/constants.js +7 -1
- package/dist/utils/constants.js.map +1 -1
- package/dist/utils/errorHandling.d.ts +0 -12
- package/dist/utils/errorHandling.d.ts.map +1 -1
- package/dist/utils/errorHandling.js +2 -23
- package/dist/utils/errorHandling.js.map +1 -1
- package/dist/utils/errors.d.ts +89 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +276 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/index.d.ts +2 -2
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +6 -5
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/parameterUtils.d.ts +10 -0
- package/dist/utils/parameterUtils.d.ts.map +1 -1
- package/dist/utils/parameterUtils.js +61 -5
- package/dist/utils/parameterUtils.js.map +1 -1
- package/dist/utils/responseFormatters.js +16 -16
- package/dist/utils/responseFormatters.js.map +1 -1
- package/dist/utils/serverInstructions.d.ts +2 -0
- package/dist/utils/serverInstructions.d.ts.map +1 -0
- package/dist/utils/serverInstructions.js +21 -0
- package/dist/utils/serverInstructions.js.map +1 -0
- package/dist/utils/userFacingErrors.d.ts +0 -8
- package/dist/utils/userFacingErrors.d.ts.map +1 -1
- package/dist/utils/userFacingErrors.js +0 -19
- package/dist/utils/userFacingErrors.js.map +1 -1
- package/dist/utils/workspaceResolver.js +12 -12
- package/dist/utils/workspaceResolver.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* User resource module — getUsers, getCurrentUser
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getUsers = getUsers;
|
|
7
|
+
exports.getCurrentUser = getCurrentUser;
|
|
8
|
+
const axios_1 = require("axios");
|
|
9
|
+
const constants_1 = require("../../utils/constants");
|
|
10
|
+
const logger_1 = require("../../utils/logger");
|
|
11
|
+
const ApiClient_1 = require("./ApiClient");
|
|
12
|
+
async function getUsers(ctx, workspaceId, teamId) {
|
|
13
|
+
const parts = [workspaceId && `ws:${workspaceId}`, teamId && `team:${teamId}`].filter(Boolean);
|
|
14
|
+
const cacheKey = parts.length > 0 ? `users:${parts.join(':')}` : 'users:all';
|
|
15
|
+
return ctx.cache.user.withCache(cacheKey, async () => {
|
|
16
|
+
try {
|
|
17
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, 'Fetching users from Motion API', {
|
|
18
|
+
method: 'getUsers',
|
|
19
|
+
workspaceId,
|
|
20
|
+
teamId
|
|
21
|
+
});
|
|
22
|
+
const params = new URLSearchParams();
|
|
23
|
+
if (workspaceId) {
|
|
24
|
+
params.append('workspaceId', workspaceId);
|
|
25
|
+
}
|
|
26
|
+
if (teamId) {
|
|
27
|
+
params.append('teamId', teamId);
|
|
28
|
+
}
|
|
29
|
+
const queryString = params.toString();
|
|
30
|
+
const url = queryString ? `/users?${queryString}` : '/users';
|
|
31
|
+
const response = await ctx.api.requestWithRetry(() => ctx.api.client.get(url));
|
|
32
|
+
// The Motion API might wrap the users in a 'users' array
|
|
33
|
+
const usersData = response.data?.users || response.data || [];
|
|
34
|
+
const users = Array.isArray(usersData) ? usersData : [];
|
|
35
|
+
if (!Array.isArray(response.data?.users) && !Array.isArray(response.data)) {
|
|
36
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.WARN, 'Unexpected users response shape', {
|
|
37
|
+
method: 'getUsers',
|
|
38
|
+
workspaceId,
|
|
39
|
+
responseType: response.data === null ? 'null' : typeof response.data
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.INFO, 'Users fetched successfully', {
|
|
43
|
+
method: 'getUsers',
|
|
44
|
+
count: users.length,
|
|
45
|
+
workspaceId
|
|
46
|
+
});
|
|
47
|
+
return users;
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.ERROR, 'Failed to fetch users', {
|
|
51
|
+
method: 'getUsers',
|
|
52
|
+
error: (0, ApiClient_1.getErrorMessage)(error),
|
|
53
|
+
apiStatus: (0, axios_1.isAxiosError)(error) ? error.response?.status : undefined,
|
|
54
|
+
apiMessage: (0, axios_1.isAxiosError)(error) ? error.response?.data?.message : undefined
|
|
55
|
+
});
|
|
56
|
+
throw ctx.api.formatApiError(error, 'fetch', 'user');
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
async function getCurrentUser(ctx) {
|
|
61
|
+
const cacheKey = 'currentUser';
|
|
62
|
+
// Use userCache but with a special single-user wrapper
|
|
63
|
+
const cachedUsers = await ctx.cache.user.withCache(cacheKey, async () => {
|
|
64
|
+
try {
|
|
65
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, 'Fetching current user from Motion API', {
|
|
66
|
+
method: 'getCurrentUser'
|
|
67
|
+
});
|
|
68
|
+
const response = await ctx.api.requestWithRetry(() => ctx.api.client.get('/users/me'));
|
|
69
|
+
const user = response.data;
|
|
70
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.INFO, 'Current user fetched successfully', {
|
|
71
|
+
method: 'getCurrentUser',
|
|
72
|
+
userId: user.id,
|
|
73
|
+
email: user.email
|
|
74
|
+
});
|
|
75
|
+
return [user]; // Wrap in array for cache compatibility
|
|
76
|
+
}
|
|
77
|
+
catch (error) {
|
|
78
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.ERROR, 'Failed to fetch current user', {
|
|
79
|
+
method: 'getCurrentUser',
|
|
80
|
+
error: (0, ApiClient_1.getErrorMessage)(error),
|
|
81
|
+
apiStatus: (0, axios_1.isAxiosError)(error) ? error.response?.status : undefined,
|
|
82
|
+
apiMessage: (0, axios_1.isAxiosError)(error) ? error.response?.data?.message : undefined
|
|
83
|
+
});
|
|
84
|
+
throw ctx.api.formatApiError(error, 'fetch', 'user');
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
const user = cachedUsers[0];
|
|
88
|
+
if (!user) {
|
|
89
|
+
throw ctx.api.formatApiError(new Error('No user returned from API'), 'fetch', 'user');
|
|
90
|
+
}
|
|
91
|
+
return user;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=users.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../../src/services/api/users.ts"],"names":[],"mappings":";AAAA;;GAEG;;AASH,4BAsDC;AAED,wCAqCC;AApGD,iCAAoD;AAEpD,qDAAmD;AACnD,+CAA4C;AAE5C,2CAA8C;AAEvC,KAAK,UAAU,QAAQ,CAAC,GAAoB,EAAE,WAAoB,EAAE,MAAe;IACxF,MAAM,KAAK,GAAG,CAAC,WAAW,IAAI,MAAM,WAAW,EAAE,EAAE,MAAM,IAAI,QAAQ,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/F,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;IAE7E,OAAO,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACnD,IAAI,CAAC;YACH,IAAA,eAAM,EAAC,sBAAU,CAAC,KAAK,EAAE,gCAAgC,EAAE;gBACzD,MAAM,EAAE,UAAU;gBAClB,WAAW;gBACX,MAAM;aACP,CAAC,CAAC;YAEH,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;YACrC,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;YAC5C,CAAC;YACD,IAAI,MAAM,EAAE,CAAC;gBACX,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;YAClC,CAAC;YAED,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;YACtC,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,UAAU,WAAW,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;YAE7D,MAAM,QAAQ,GAA4C,MAAM,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAExH,yDAAyD;YACzD,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,EAAE,KAAK,IAAI,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;YAC9D,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;YAExD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1E,IAAA,eAAM,EAAC,sBAAU,CAAC,IAAI,EAAE,iCAAiC,EAAE;oBACzD,MAAM,EAAE,UAAU;oBAClB,WAAW;oBACX,YAAY,EAAE,QAAQ,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,QAAQ,CAAC,IAAI;iBACrE,CAAC,CAAC;YACL,CAAC;YAED,IAAA,eAAM,EAAC,sBAAU,CAAC,IAAI,EAAE,4BAA4B,EAAE;gBACpD,MAAM,EAAE,UAAU;gBAClB,KAAK,EAAE,KAAK,CAAC,MAAM;gBACnB,WAAW;aACZ,CAAC,CAAC;YAEH,OAAO,KAAK,CAAC;QACf,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAA,eAAM,EAAC,sBAAU,CAAC,KAAK,EAAE,uBAAuB,EAAE;gBAChD,MAAM,EAAE,UAAU;gBAClB,KAAK,EAAE,IAAA,2BAAe,EAAC,KAAK,CAAC;gBAC7B,SAAS,EAAE,IAAA,oBAAY,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS;gBACnE,UAAU,EAAE,IAAA,oBAAY,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;aAC5E,CAAC,CAAC;YACH,MAAM,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,GAAoB;IACvD,MAAM,QAAQ,GAAG,aAAa,CAAC;IAE/B,uDAAuD;IACvD,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACtE,IAAI,CAAC;YACH,IAAA,eAAM,EAAC,sBAAU,CAAC,KAAK,EAAE,uCAAuC,EAAE;gBAChE,MAAM,EAAE,gBAAgB;aACzB,CAAC,CAAC;YAEH,MAAM,QAAQ,GAA8B,MAAM,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC;YAElH,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;YAE3B,IAAA,eAAM,EAAC,sBAAU,CAAC,IAAI,EAAE,mCAAmC,EAAE;gBAC3D,MAAM,EAAE,gBAAgB;gBACxB,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;aAClB,CAAC,CAAC;YAEH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,wCAAwC;QACzD,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,IAAA,eAAM,EAAC,sBAAU,CAAC,KAAK,EAAE,8BAA8B,EAAE;gBACvD,MAAM,EAAE,gBAAgB;gBACxB,KAAK,EAAE,IAAA,2BAAe,EAAC,KAAK,CAAC;gBAC7B,SAAS,EAAE,IAAA,oBAAY,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS;gBACnE,UAAU,EAAE,IAAA,oBAAY,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;aAC5E,CAAC,CAAC;YACH,MAAM,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACvD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACxF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace resource module — getWorkspaces, fetchWorkspaces
|
|
3
|
+
*/
|
|
4
|
+
import { MotionWorkspace } from '../../types/motion';
|
|
5
|
+
import { ResourceContext } from './types';
|
|
6
|
+
export declare function getWorkspaces(ctx: ResourceContext, ids?: string[]): Promise<MotionWorkspace[]>;
|
|
7
|
+
//# sourceMappingURL=workspaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaces.d.ts","sourceRoot":"","sources":["../../../src/services/api/workspaces.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAIrD,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAmD1C,wBAAsB,aAAa,CAAC,GAAG,EAAE,eAAe,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAQpG"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Workspace resource module — getWorkspaces, fetchWorkspaces
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getWorkspaces = getWorkspaces;
|
|
7
|
+
const axios_1 = require("axios");
|
|
8
|
+
const constants_1 = require("../../utils/constants");
|
|
9
|
+
const logger_1 = require("../../utils/logger");
|
|
10
|
+
const motion_1 = require("../../schemas/motion");
|
|
11
|
+
const ApiClient_1 = require("./ApiClient");
|
|
12
|
+
async function fetchWorkspaces(ctx, ids) {
|
|
13
|
+
try {
|
|
14
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.DEBUG, 'Fetching workspaces from Motion API', {
|
|
15
|
+
method: 'getWorkspaces',
|
|
16
|
+
filterIds: ids
|
|
17
|
+
});
|
|
18
|
+
const params = new URLSearchParams();
|
|
19
|
+
if (ids && ids.length > 0) {
|
|
20
|
+
for (const id of ids) {
|
|
21
|
+
params.append('ids', id);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const queryString = params.toString();
|
|
25
|
+
const url = queryString ? `/workspaces?${queryString}` : '/workspaces';
|
|
26
|
+
const response = await ctx.api.requestWithRetry(() => ctx.api.client.get(url));
|
|
27
|
+
// Validate the response structure
|
|
28
|
+
const validatedResponse = ctx.api.validateResponse(response.data, motion_1.WorkspacesListResponseSchema, 'getWorkspaces');
|
|
29
|
+
// Extract workspaces array (handle both wrapped and unwrapped responses)
|
|
30
|
+
const workspaces = Array.isArray(validatedResponse)
|
|
31
|
+
? validatedResponse
|
|
32
|
+
: validatedResponse.workspaces;
|
|
33
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.INFO, 'Workspaces fetched successfully', {
|
|
34
|
+
method: 'getWorkspaces',
|
|
35
|
+
count: workspaces.length,
|
|
36
|
+
workspaceNames: workspaces.map((w) => w.name)
|
|
37
|
+
});
|
|
38
|
+
return workspaces;
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
(0, logger_1.mcpLog)(constants_1.LOG_LEVELS.ERROR, 'Failed to fetch workspaces', {
|
|
42
|
+
method: 'getWorkspaces',
|
|
43
|
+
error: (0, ApiClient_1.getErrorMessage)(error),
|
|
44
|
+
apiStatus: (0, axios_1.isAxiosError)(error) ? error.response?.status : undefined,
|
|
45
|
+
apiMessage: (0, axios_1.isAxiosError)(error) ? error.response?.data?.message : undefined
|
|
46
|
+
});
|
|
47
|
+
throw ctx.api.formatApiError(error, 'fetch', 'workspace');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async function getWorkspaces(ctx, ids) {
|
|
51
|
+
// Skip caching when filtering by IDs — filtered results are unlikely to be reused
|
|
52
|
+
if (ids && ids.length > 0) {
|
|
53
|
+
return fetchWorkspaces(ctx, ids);
|
|
54
|
+
}
|
|
55
|
+
return ctx.cache.workspace.withCache('workspaces', async () => {
|
|
56
|
+
return fetchWorkspaces(ctx);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=workspaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspaces.js","sourceRoot":"","sources":["../../../src/services/api/workspaces.ts"],"names":[],"mappings":";AAAA;;GAEG;;AA0DH,sCAQC;AAhED,iCAAoD;AAEpD,qDAAmD;AACnD,+CAA4C;AAC5C,iDAAoE;AAEpE,2CAA8C;AAE9C,KAAK,UAAU,eAAe,CAAC,GAAoB,EAAE,GAAc;IACjE,IAAI,CAAC;QACH,IAAA,eAAM,EAAC,sBAAU,CAAC,KAAK,EAAE,qCAAqC,EAAE;YAC9D,MAAM,EAAE,eAAe;YACvB,SAAS,EAAE,GAAG;SACf,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE,CAAC;QACrC,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;gBACrB,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,MAAM,WAAW,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,eAAe,WAAW,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;QAEvE,MAAM,QAAQ,GAAkB,MAAM,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAE9F,kCAAkC;QAClC,MAAM,iBAAiB,GAAG,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAChD,QAAQ,CAAC,IAAI,EACb,qCAA4B,EAC5B,eAAe,CAChB,CAAC;QAEF,yEAAyE;QACzE,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC;YACjD,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,iBAAiB,CAAC,UAAU,CAAC;QAEjC,IAAA,eAAM,EAAC,sBAAU,CAAC,IAAI,EAAE,iCAAiC,EAAE;YACzD,MAAM,EAAE,eAAe;YACvB,KAAK,EAAE,UAAU,CAAC,MAAM;YACxB,cAAc,EAAE,UAAU,CAAC,GAAG,CAAC,CAAC,CAAkB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;SAC/D,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,IAAA,eAAM,EAAC,sBAAU,CAAC,KAAK,EAAE,4BAA4B,EAAE;YACrD,MAAM,EAAE,eAAe;YACvB,KAAK,EAAE,IAAA,2BAAe,EAAC,KAAK,CAAC;YAC7B,SAAS,EAAE,IAAA,oBAAY,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS;YACnE,UAAU,EAAE,IAAA,oBAAY,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS;SAC5E,CAAC,CAAC;QACH,MAAM,GAAG,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,WAAW,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,aAAa,CAAC,GAAoB,EAAE,GAAc;IACtE,kFAAkF;IAClF,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;QAC5D,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1,64 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MotionApiService — thin facade that delegates to resource modules.
|
|
3
|
+
*
|
|
4
|
+
* All business logic lives in `src/services/api/*.ts` modules. This class
|
|
5
|
+
* preserves the original public API surface so existing consumers (handlers,
|
|
6
|
+
* tests) don't need to change.
|
|
7
|
+
*/
|
|
1
8
|
import { MotionWorkspace, MotionProject, MotionTask, MotionTaskCreateData, MotionTaskUpdateData, MotionUser, MotionComment, CreateCommentData, MotionCustomField, MotionCustomFieldValue, CreateCustomFieldData, MotionRecurringTask, CreateRecurringTaskData, MotionSchedule, MotionStatus, MotionPaginatedResponse } from '../types/motion';
|
|
2
|
-
import { ValidPriority } from '../utils/constants';
|
|
3
9
|
import { ListResult } from '../types/mcp';
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
projectId?: string;
|
|
7
|
-
name?: string;
|
|
8
|
-
status?: string | string[];
|
|
9
|
-
includeAllStatuses?: boolean;
|
|
10
|
-
assigneeId?: string;
|
|
11
|
-
priority?: ValidPriority;
|
|
12
|
-
dueDate?: string;
|
|
13
|
-
labels?: string[];
|
|
14
|
-
limit?: number;
|
|
15
|
-
maxPages?: number;
|
|
16
|
-
}
|
|
17
|
-
interface ResolveUserIdentifierOptions {
|
|
18
|
-
strictWorkspace?: boolean;
|
|
19
|
-
}
|
|
10
|
+
import type { GetTasksOptions } from './api/tasks';
|
|
11
|
+
import type { ResolveUserIdentifierOptions } from './api/search';
|
|
20
12
|
export declare class MotionApiService {
|
|
21
|
-
private
|
|
22
|
-
private
|
|
23
|
-
private client;
|
|
24
|
-
private workspaceCache;
|
|
25
|
-
private userCache;
|
|
26
|
-
private projectCache;
|
|
27
|
-
private singleProjectCache;
|
|
28
|
-
private commentCache;
|
|
29
|
-
private customFieldCache;
|
|
30
|
-
private recurringTaskCache;
|
|
31
|
-
private scheduleCache;
|
|
32
|
-
private statusCache;
|
|
33
|
-
/**
|
|
34
|
-
* Validate API response against schema
|
|
35
|
-
* Handles strict/lenient/off modes based on configuration
|
|
36
|
-
*/
|
|
37
|
-
private validateResponse;
|
|
13
|
+
private _api;
|
|
14
|
+
private _cache;
|
|
38
15
|
constructor(apiKey?: string);
|
|
39
|
-
/**
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
* - HTTP 5xx
|
|
53
|
-
* - HTTP 429
|
|
54
|
-
* - Network errors with no HTTP response
|
|
55
|
-
*/
|
|
56
|
-
private requestWithRetry;
|
|
57
|
-
/**
|
|
58
|
-
* Merge truncation metadata from multiple paginated sources without mutating source objects.
|
|
59
|
-
* If sources disagree on reason/limit, drop those fields to avoid misleading aggregate metadata.
|
|
60
|
-
*/
|
|
61
|
-
private mergeTruncationMetadata;
|
|
16
|
+
/** ResourceContext for delegating to extracted resource modules. */
|
|
17
|
+
private get _ctx();
|
|
18
|
+
getWorkspaces(ids?: string[]): Promise<MotionWorkspace[]>;
|
|
19
|
+
getUsers(workspaceId?: string, teamId?: string): Promise<MotionUser[]>;
|
|
20
|
+
getCurrentUser(): Promise<MotionUser>;
|
|
21
|
+
getTasks(options: GetTasksOptions): Promise<ListResult<MotionTask>>;
|
|
22
|
+
getTask(taskId: string): Promise<MotionTask>;
|
|
23
|
+
createTask(taskData: MotionTaskCreateData): Promise<MotionTask>;
|
|
24
|
+
updateTask(taskId: string, updates: MotionTaskUpdateData): Promise<MotionTask>;
|
|
25
|
+
deleteTask(taskId: string): Promise<void>;
|
|
26
|
+
moveTask(taskId: string, targetWorkspaceId: string, assigneeId?: string): Promise<MotionTask | undefined>;
|
|
27
|
+
unassignTask(taskId: string): Promise<MotionTask | undefined>;
|
|
28
|
+
getAllUncompletedTasks(limit?: number, assigneeId?: string): Promise<ListResult<MotionTask>>;
|
|
62
29
|
getProjects(workspaceId: string, options?: {
|
|
63
30
|
maxPages?: number;
|
|
64
31
|
limit?: number;
|
|
@@ -68,155 +35,42 @@ export declare class MotionApiService {
|
|
|
68
35
|
createProject(projectData: Partial<MotionProject>): Promise<MotionProject>;
|
|
69
36
|
updateProject(projectId: string, updates: Partial<MotionProject>): Promise<MotionProject>;
|
|
70
37
|
deleteProject(projectId: string): Promise<void>;
|
|
71
|
-
getTasks(options: GetTasksOptions): Promise<ListResult<MotionTask>>;
|
|
72
|
-
getTask(taskId: string): Promise<MotionTask>;
|
|
73
|
-
createTask(taskData: MotionTaskCreateData): Promise<MotionTask>;
|
|
74
|
-
updateTask(taskId: string, updates: MotionTaskUpdateData): Promise<MotionTask>;
|
|
75
|
-
deleteTask(taskId: string): Promise<void>;
|
|
76
|
-
moveTask(taskId: string, targetWorkspaceId: string, assigneeId?: string): Promise<MotionTask | undefined>;
|
|
77
|
-
unassignTask(taskId: string): Promise<MotionTask | undefined>;
|
|
78
|
-
getWorkspaces(ids?: string[]): Promise<MotionWorkspace[]>;
|
|
79
|
-
private fetchWorkspaces;
|
|
80
|
-
getUsers(workspaceId?: string, teamId?: string): Promise<MotionUser[]>;
|
|
81
|
-
getCurrentUser(): Promise<MotionUser>;
|
|
82
|
-
/**
|
|
83
|
-
* Resolves a project identifier (either projectId or projectName) to a MotionProject
|
|
84
|
-
* Searches across all workspaces if not found in the specified workspace
|
|
85
|
-
* @param identifier Object containing either projectId or projectName
|
|
86
|
-
* @param workspaceId Workspace to start searching in
|
|
87
|
-
* @returns Resolved MotionProject with workspace info, or undefined if not found
|
|
88
|
-
*/
|
|
89
|
-
resolveProjectIdentifier(identifier: {
|
|
90
|
-
projectId?: string;
|
|
91
|
-
projectName?: string;
|
|
92
|
-
}, workspaceId?: string): Promise<MotionProject | undefined>;
|
|
93
|
-
/**
|
|
94
|
-
* Resolves a user identifier (either userId or userName/email) to a MotionUser
|
|
95
|
-
* Searches across all workspaces if not found in the specified workspace unless strictWorkspace is true
|
|
96
|
-
* @param identifier Object containing either userId or userName
|
|
97
|
-
* @param workspaceId Workspace to start searching in (optional)
|
|
98
|
-
* @param options Resolution behavior options
|
|
99
|
-
* @returns Resolved MotionUser with workspace info, or undefined if not found
|
|
100
|
-
*/
|
|
101
|
-
resolveUserIdentifier(identifier: {
|
|
102
|
-
userId?: string;
|
|
103
|
-
userName?: string;
|
|
104
|
-
}, workspaceId?: string, options?: ResolveUserIdentifierOptions): Promise<MotionUser | undefined>;
|
|
105
38
|
getProjectByName(projectName: string, workspaceId?: string): Promise<MotionProject | undefined>;
|
|
106
|
-
searchTasks(query: string, workspaceId: string, limit?: number): Promise<ListResult<MotionTask>>;
|
|
107
|
-
searchProjects(query: string, workspaceId: string, limit?: number): Promise<ListResult<MotionProject>>;
|
|
108
|
-
/**
|
|
109
|
-
* Get comments for a task with proper pagination support
|
|
110
|
-
* @param taskId Task ID to get comments for
|
|
111
|
-
* @param cursor Optional cursor for pagination
|
|
112
|
-
* @returns Paginated response with comments and metadata
|
|
113
|
-
*/
|
|
114
39
|
getComments(taskId: string, cursor?: string): Promise<MotionPaginatedResponse<MotionComment>>;
|
|
115
40
|
createComment(commentData: CreateCommentData): Promise<MotionComment>;
|
|
116
|
-
/**
|
|
117
|
-
* Fetch custom fields from Motion API
|
|
118
|
-
* @param workspaceId - Required workspace ID to get custom fields for
|
|
119
|
-
* @returns Array of custom fields
|
|
120
|
-
*/
|
|
121
41
|
getCustomFields(workspaceId: string): Promise<MotionCustomField[]>;
|
|
122
|
-
/**
|
|
123
|
-
* Create a new custom field
|
|
124
|
-
* @param workspaceId - Required workspace ID to create custom field in
|
|
125
|
-
* @param fieldData - Data for creating the custom field
|
|
126
|
-
* @returns The created custom field
|
|
127
|
-
*/
|
|
128
42
|
createCustomField(workspaceId: string, fieldData: CreateCustomFieldData): Promise<MotionCustomField>;
|
|
129
|
-
/**
|
|
130
|
-
* Delete a custom field
|
|
131
|
-
* @param workspaceId - Required workspace ID containing the custom field
|
|
132
|
-
* @param fieldId - ID of the custom field to delete
|
|
133
|
-
* @returns Success indicator
|
|
134
|
-
*/
|
|
135
43
|
deleteCustomField(workspaceId: string, fieldId: string): Promise<{
|
|
136
44
|
success: boolean;
|
|
137
45
|
}>;
|
|
138
|
-
/**
|
|
139
|
-
* Add a custom field to a project
|
|
140
|
-
* @param projectId - ID of the project
|
|
141
|
-
* @param fieldId - ID of the custom field
|
|
142
|
-
* @param value - Optional value for the field
|
|
143
|
-
* @returns The field value as returned by the API ({ type, value })
|
|
144
|
-
*/
|
|
145
46
|
addCustomFieldToProject(projectId: string, fieldId: string, value?: string | number | boolean | string[] | null, fieldType?: string): Promise<MotionCustomFieldValue>;
|
|
146
|
-
/**
|
|
147
|
-
* Remove a custom field from a project
|
|
148
|
-
* @param projectId - ID of the project
|
|
149
|
-
* @param valueId - ID of the custom field value
|
|
150
|
-
* @returns Success indicator
|
|
151
|
-
*/
|
|
152
47
|
removeCustomFieldFromProject(projectId: string, valueId: string): Promise<{
|
|
153
48
|
success: boolean;
|
|
154
49
|
}>;
|
|
155
|
-
/**
|
|
156
|
-
* Add a custom field to a task
|
|
157
|
-
* @param taskId - ID of the task
|
|
158
|
-
* @param fieldId - ID of the custom field
|
|
159
|
-
* @param value - Optional value for the field
|
|
160
|
-
* @returns The field value as returned by the API ({ type, value })
|
|
161
|
-
*/
|
|
162
50
|
addCustomFieldToTask(taskId: string, fieldId: string, value?: string | number | boolean | string[] | null, fieldType?: string): Promise<MotionCustomFieldValue>;
|
|
163
|
-
/**
|
|
164
|
-
* Remove a custom field from a task
|
|
165
|
-
* @param taskId - ID of the task
|
|
166
|
-
* @param valueId - ID of the custom field value
|
|
167
|
-
* @returns Success indicator
|
|
168
|
-
*/
|
|
169
51
|
removeCustomFieldFromTask(taskId: string, valueId: string): Promise<{
|
|
170
52
|
success: boolean;
|
|
171
53
|
}>;
|
|
172
|
-
/**
|
|
173
|
-
* Fetch recurring tasks from Motion API with automatic pagination
|
|
174
|
-
* @param workspaceId - Optional workspace ID to filter recurring tasks
|
|
175
|
-
* @param options - Optional configuration for maxPages and limit
|
|
176
|
-
* @returns Array of recurring tasks from all pages
|
|
177
|
-
*/
|
|
178
54
|
getRecurringTasks(workspaceId?: string, options?: {
|
|
179
55
|
maxPages?: number;
|
|
180
56
|
limit?: number;
|
|
181
57
|
}): Promise<ListResult<MotionRecurringTask>>;
|
|
182
|
-
/**
|
|
183
|
-
* Create a new recurring task
|
|
184
|
-
* @param taskData - Data for creating the recurring task
|
|
185
|
-
* @returns The created recurring task
|
|
186
|
-
*/
|
|
187
58
|
createRecurringTask(taskData: CreateRecurringTaskData): Promise<MotionRecurringTask>;
|
|
188
|
-
/**
|
|
189
|
-
* Delete a recurring task
|
|
190
|
-
* @param recurringTaskId - ID of the recurring task to delete
|
|
191
|
-
* @returns Success indicator
|
|
192
|
-
*/
|
|
193
59
|
deleteRecurringTask(recurringTaskId: string): Promise<{
|
|
194
60
|
success: boolean;
|
|
195
61
|
}>;
|
|
196
|
-
/**
|
|
197
|
-
* Get available schedule names for auto-scheduling
|
|
198
|
-
* @param workspaceId - Optional workspace ID to filter schedules (currently unused by Motion API)
|
|
199
|
-
* @returns Array of schedule names
|
|
200
|
-
*/
|
|
201
62
|
getAvailableScheduleNames(workspaceId?: string): Promise<string[]>;
|
|
202
|
-
/**
|
|
203
|
-
* Fetch schedules from Motion API.
|
|
204
|
-
* The Motion API GET /schedules accepts no query parameters.
|
|
205
|
-
* @returns Array of schedules
|
|
206
|
-
*/
|
|
207
63
|
getSchedules(): Promise<MotionSchedule[]>;
|
|
208
|
-
/**
|
|
209
|
-
* Retrieves available workflow statuses from Motion
|
|
210
|
-
* @param workspaceId - Optional workspace ID to filter statuses
|
|
211
|
-
* @returns Promise resolving to array of Motion statuses
|
|
212
|
-
* @throws {Error} If the API request fails
|
|
213
|
-
*/
|
|
214
64
|
getStatuses(workspaceId?: string): Promise<MotionStatus[]>;
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
65
|
+
searchTasks(query: string, workspaceId: string, limit?: number): Promise<ListResult<MotionTask>>;
|
|
66
|
+
searchProjects(query: string, workspaceId: string, limit?: number): Promise<ListResult<MotionProject>>;
|
|
67
|
+
resolveProjectIdentifier(identifier: {
|
|
68
|
+
projectId?: string;
|
|
69
|
+
projectName?: string;
|
|
70
|
+
}, workspaceId?: string): Promise<MotionProject | undefined>;
|
|
71
|
+
resolveUserIdentifier(identifier: {
|
|
72
|
+
userId?: string;
|
|
73
|
+
userName?: string;
|
|
74
|
+
}, workspaceId?: string, options?: ResolveUserIdentifierOptions): Promise<MotionUser | undefined>;
|
|
220
75
|
}
|
|
221
|
-
export {};
|
|
222
76
|
//# sourceMappingURL=motionApi.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"motionApi.d.ts","sourceRoot":"","sources":["../../src/services/motionApi.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"motionApi.d.ts","sourceRoot":"","sources":["../../src/services/motionApi.ts"],"names":[],"mappings":"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"}
|