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.
- package/LICENSE +202 -0
- package/README.md +251 -417
- package/dist/handlers/CommentHandler.d.ts +9 -0
- package/dist/handlers/CommentHandler.d.ts.map +1 -0
- package/dist/handlers/CommentHandler.js +66 -0
- package/dist/handlers/CommentHandler.js.map +1 -0
- package/dist/handlers/CustomFieldHandler.d.ts +14 -0
- package/dist/handlers/CustomFieldHandler.d.ts.map +1 -0
- package/dist/handlers/CustomFieldHandler.js +95 -0
- package/dist/handlers/CustomFieldHandler.js.map +1 -0
- package/dist/handlers/HandlerFactory.d.ts +15 -0
- package/dist/handlers/HandlerFactory.d.ts.map +1 -0
- package/dist/handlers/HandlerFactory.js +58 -0
- package/dist/handlers/HandlerFactory.js.map +1 -0
- package/dist/handlers/ProjectHandler.d.ts +10 -0
- package/dist/handlers/ProjectHandler.d.ts.map +1 -0
- package/dist/handlers/ProjectHandler.js +63 -0
- package/dist/handlers/ProjectHandler.js.map +1 -0
- package/dist/handlers/RecurringTaskHandler.d.ts +10 -0
- package/dist/handlers/RecurringTaskHandler.d.ts.map +1 -0
- package/dist/handlers/RecurringTaskHandler.js +68 -0
- package/dist/handlers/RecurringTaskHandler.js.map +1 -0
- package/dist/handlers/ScheduleHandler.d.ts +8 -0
- package/dist/handlers/ScheduleHandler.d.ts.map +1 -0
- package/dist/handlers/ScheduleHandler.js +43 -0
- package/dist/handlers/ScheduleHandler.js.map +1 -0
- package/dist/handlers/SearchHandler.d.ts +10 -0
- package/dist/handlers/SearchHandler.d.ts.map +1 -0
- package/dist/handlers/SearchHandler.js +116 -0
- package/dist/handlers/SearchHandler.js.map +1 -0
- package/dist/handlers/StatusHandler.d.ts +8 -0
- package/dist/handlers/StatusHandler.d.ts.map +1 -0
- package/dist/handlers/StatusHandler.js +22 -0
- package/dist/handlers/StatusHandler.js.map +1 -0
- package/dist/handlers/TaskHandler.d.ts +22 -0
- package/dist/handlers/TaskHandler.d.ts.map +1 -0
- package/dist/handlers/TaskHandler.js +266 -0
- package/dist/handlers/TaskHandler.js.map +1 -0
- package/dist/handlers/UserHandler.d.ts +9 -0
- package/dist/handlers/UserHandler.d.ts.map +1 -0
- package/dist/handlers/UserHandler.js +36 -0
- package/dist/handlers/UserHandler.js.map +1 -0
- package/dist/handlers/WorkspaceHandler.d.ts +10 -0
- package/dist/handlers/WorkspaceHandler.d.ts.map +1 -0
- package/dist/handlers/WorkspaceHandler.js +49 -0
- package/dist/handlers/WorkspaceHandler.js.map +1 -0
- package/dist/handlers/base/BaseHandler.d.ts +16 -0
- package/dist/handlers/base/BaseHandler.d.ts.map +1 -0
- package/dist/handlers/base/BaseHandler.js +31 -0
- package/dist/handlers/base/BaseHandler.js.map +1 -0
- package/dist/handlers/base/HandlerInterface.d.ts +18 -0
- package/dist/handlers/base/HandlerInterface.d.ts.map +1 -0
- package/dist/handlers/base/HandlerInterface.js +3 -0
- package/dist/handlers/base/HandlerInterface.js.map +1 -0
- package/dist/handlers/index.d.ts +14 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +31 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/mcp-server-old.d.ts +29 -0
- package/dist/mcp-server-old.d.ts.map +1 -0
- package/dist/mcp-server-old.js +1304 -0
- package/dist/mcp-server-old.js.map +1 -0
- package/dist/mcp-server.d.ts +15 -0
- package/dist/mcp-server.d.ts.map +1 -0
- package/dist/mcp-server.js +145 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/schemas/motion.d.ts +4971 -0
- package/dist/schemas/motion.d.ts.map +1 -0
- package/dist/schemas/motion.js +328 -0
- package/dist/schemas/motion.js.map +1 -0
- package/dist/services/motionApi.d.ts +186 -0
- package/dist/services/motionApi.d.ts.map +1 -0
- package/dist/services/motionApi.js +1912 -0
- package/dist/services/motionApi.js.map +1 -0
- package/dist/tools/ToolConfigurator.d.ts +19 -0
- package/dist/tools/ToolConfigurator.d.ts.map +1 -0
- package/dist/tools/ToolConfigurator.js +89 -0
- package/dist/tools/ToolConfigurator.js.map +1 -0
- package/dist/tools/ToolDefinitions.d.ts +25 -0
- package/dist/tools/ToolDefinitions.d.ts.map +1 -0
- package/dist/tools/ToolDefinitions.js +502 -0
- package/dist/tools/ToolDefinitions.js.map +1 -0
- package/dist/tools/ToolRegistry.d.ts +16 -0
- package/dist/tools/ToolRegistry.d.ts.map +1 -0
- package/dist/tools/ToolRegistry.js +89 -0
- package/dist/tools/ToolRegistry.js.map +1 -0
- package/dist/tools/index.d.ts +4 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +21 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types/mcp-tool-args.d.ts +122 -0
- package/dist/types/mcp-tool-args.d.ts.map +1 -0
- package/dist/types/mcp-tool-args.js +7 -0
- package/dist/types/mcp-tool-args.js.map +1 -0
- package/dist/types/mcp.d.ts +32 -0
- package/dist/types/mcp.d.ts.map +1 -0
- package/dist/types/mcp.js +3 -0
- package/dist/types/mcp.js.map +1 -0
- package/dist/types/motion.d.ts +304 -0
- package/dist/types/motion.d.ts.map +1 -0
- package/dist/types/motion.js +3 -0
- package/dist/types/motion.js.map +1 -0
- package/dist/utils/cache.d.ts +25 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +135 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/constants.d.ts +83 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +151 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/errorHandling.d.ts +50 -0
- package/dist/utils/errorHandling.d.ts.map +1 -0
- package/dist/utils/errorHandling.js +86 -0
- package/dist/utils/errorHandling.js.map +1 -0
- package/dist/utils/index.d.ts +13 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +38 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +13 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +47 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/paginationNew.d.ts +44 -0
- package/dist/utils/paginationNew.d.ts.map +1 -0
- package/dist/utils/paginationNew.js +149 -0
- package/dist/utils/paginationNew.js.map +1 -0
- package/dist/utils/parameterUtils.d.ts +79 -0
- package/dist/utils/parameterUtils.d.ts.map +1 -0
- package/dist/utils/parameterUtils.js +189 -0
- package/dist/utils/parameterUtils.js.map +1 -0
- package/dist/utils/responseFormatters.d.ts +92 -0
- package/dist/utils/responseFormatters.d.ts.map +1 -0
- package/dist/utils/responseFormatters.js +331 -0
- package/dist/utils/responseFormatters.js.map +1 -0
- package/dist/utils/responseWrapper.d.ts +38 -0
- package/dist/utils/responseWrapper.d.ts.map +1 -0
- package/dist/utils/responseWrapper.js +201 -0
- package/dist/utils/responseWrapper.js.map +1 -0
- package/dist/utils/sanitize.d.ts +51 -0
- package/dist/utils/sanitize.d.ts.map +1 -0
- package/dist/utils/sanitize.js +137 -0
- package/dist/utils/sanitize.js.map +1 -0
- package/dist/utils/validator.d.ts +37 -0
- package/dist/utils/validator.d.ts.map +1 -0
- package/dist/utils/validator.js +74 -0
- package/dist/utils/validator.js.map +1 -0
- package/dist/utils/workspaceResolver.d.ts +40 -0
- package/dist/utils/workspaceResolver.d.ts.map +1 -0
- package/dist/utils/workspaceResolver.js +207 -0
- package/dist/utils/workspaceResolver.js.map +1 -0
- package/package.json +41 -17
- package/.claude/settings.local.json +0 -15
- package/.env.example +0 -3
- package/sample.png +0 -0
- package/src/index.js +0 -49
- package/src/mcp-server.js +0 -1137
- package/src/routes/motion.js +0 -152
- package/src/services/motionApi.js +0 -1177
- package/src/worker.js +0 -248
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SearchHandler = void 0;
|
|
4
|
+
const BaseHandler_1 = require("./base/BaseHandler");
|
|
5
|
+
const utils_1 = require("../utils");
|
|
6
|
+
class SearchHandler extends BaseHandler_1.BaseHandler {
|
|
7
|
+
async handle(args) {
|
|
8
|
+
try {
|
|
9
|
+
const { operation } = args;
|
|
10
|
+
switch (operation) {
|
|
11
|
+
case 'content':
|
|
12
|
+
return await this.handleContentSearch(args);
|
|
13
|
+
case 'context':
|
|
14
|
+
return await this.handleContextSearch(args);
|
|
15
|
+
case 'smart':
|
|
16
|
+
return await this.handleSmartSearch(args);
|
|
17
|
+
default:
|
|
18
|
+
return this.handleUnknownOperation(operation);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
return this.handleError(error);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async handleContentSearch(args) {
|
|
26
|
+
if (!args.query) {
|
|
27
|
+
return this.handleError(new Error("Query is required for content search"));
|
|
28
|
+
}
|
|
29
|
+
const entityTypes = args.searchScope === 'tasks' ? ['tasks'] :
|
|
30
|
+
args.searchScope === 'projects' ? ['projects'] :
|
|
31
|
+
['tasks', 'projects'];
|
|
32
|
+
// Use configurable limit to prevent resource exhaustion
|
|
33
|
+
const limit = args.limit || utils_1.LIMITS.MAX_SEARCH_RESULTS;
|
|
34
|
+
const workspace = await this.workspaceResolver.resolveWorkspace({
|
|
35
|
+
workspaceId: args.workspaceId,
|
|
36
|
+
workspaceName: args.workspaceName
|
|
37
|
+
});
|
|
38
|
+
let results = [];
|
|
39
|
+
if (entityTypes.includes('tasks')) {
|
|
40
|
+
const tasks = await this.motionService.searchTasks(args.query, workspace.id, limit);
|
|
41
|
+
results.push(...tasks);
|
|
42
|
+
}
|
|
43
|
+
if (entityTypes.includes('projects')) {
|
|
44
|
+
const projects = await this.motionService.searchProjects(args.query, workspace.id, limit);
|
|
45
|
+
results.push(...projects);
|
|
46
|
+
}
|
|
47
|
+
return (0, utils_1.formatSearchResults)(results.slice(0, limit), args.query, {
|
|
48
|
+
limit,
|
|
49
|
+
searchScope: entityTypes.join(',') || 'both'
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
async handleContextSearch(args) {
|
|
53
|
+
if (!args.entityType || !args.entityId) {
|
|
54
|
+
return this.handleError(new Error("EntityType and entityId are required for context operation"));
|
|
55
|
+
}
|
|
56
|
+
const { entityType, entityId, includeRelated = false } = args;
|
|
57
|
+
let contextText = `Context for ${entityType} ${entityId}:\n\n`;
|
|
58
|
+
// For now, return a simple context message as Motion API doesn't have specific context endpoints
|
|
59
|
+
if (entityType === 'project') {
|
|
60
|
+
contextText += `Project ID: ${entityId}\n`;
|
|
61
|
+
if (includeRelated) {
|
|
62
|
+
contextText += `Related tasks would be listed here (when available)\n`;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
else if (entityType === 'task') {
|
|
66
|
+
contextText += `Task ID: ${entityId}\n`;
|
|
67
|
+
if (includeRelated) {
|
|
68
|
+
contextText += `Related project and subtasks would be listed here (when available)\n`;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return (0, utils_1.formatMcpSuccess)(contextText);
|
|
72
|
+
}
|
|
73
|
+
async handleSmartSearch(args) {
|
|
74
|
+
if (!args.query) {
|
|
75
|
+
return this.handleError(new Error("Query is required for smart search"));
|
|
76
|
+
}
|
|
77
|
+
const { query, entityType, entityId, includeRelated = false } = args;
|
|
78
|
+
let contextText = `Smart search results for "${query}":\n\n`;
|
|
79
|
+
// Perform content search
|
|
80
|
+
const searchResults = await this.handleContentSearch({
|
|
81
|
+
query,
|
|
82
|
+
entityTypes: args.searchScope === 'tasks' ? ['tasks'] :
|
|
83
|
+
args.searchScope === 'projects' ? ['projects'] :
|
|
84
|
+
['tasks', 'projects'],
|
|
85
|
+
workspaceId: args.workspaceId,
|
|
86
|
+
workspaceName: args.workspaceName
|
|
87
|
+
});
|
|
88
|
+
contextText += "Content Results:\n";
|
|
89
|
+
// Extract text from search results
|
|
90
|
+
if ('content' in searchResults && searchResults.content && Array.isArray(searchResults.content)) {
|
|
91
|
+
const textContent = searchResults.content.find(item => item.type === 'text');
|
|
92
|
+
if (textContent && 'text' in textContent) {
|
|
93
|
+
contextText += textContent.text + "\n\n";
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// Add contextual information if entity is specified
|
|
97
|
+
if (entityType && entityId) {
|
|
98
|
+
contextText += `Context for ${entityType} ${entityId}:\n`;
|
|
99
|
+
if (entityType === 'project') {
|
|
100
|
+
contextText += `Project ID: ${entityId}\n`;
|
|
101
|
+
if (includeRelated) {
|
|
102
|
+
contextText += `Related tasks would be listed here (when available)\n`;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else if (entityType === 'task') {
|
|
106
|
+
contextText += `Task ID: ${entityId}\n`;
|
|
107
|
+
if (includeRelated) {
|
|
108
|
+
contextText += `Related project and subtasks would be listed here (when available)\n`;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return (0, utils_1.formatMcpSuccess)(contextText);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
exports.SearchHandler = SearchHandler;
|
|
116
|
+
//# sourceMappingURL=SearchHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchHandler.js","sourceRoot":"","sources":["../../src/handlers/SearchHandler.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 { MotionStatusesArgs } from '../types/mcp-tool-args';
|
|
4
|
+
export declare class StatusHandler extends BaseHandler {
|
|
5
|
+
handle(args: MotionStatusesArgs): Promise<McpToolResponse>;
|
|
6
|
+
private handleList;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=StatusHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/StatusHandler.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;AAG5D,qBAAa,aAAc,SAAQ,WAAW;IACtC,MAAM,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,eAAe,CAAC;YASlD,UAAU;CAIzB"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StatusHandler = void 0;
|
|
4
|
+
const BaseHandler_1 = require("./base/BaseHandler");
|
|
5
|
+
const utils_1 = require("../utils");
|
|
6
|
+
class StatusHandler extends BaseHandler_1.BaseHandler {
|
|
7
|
+
async handle(args) {
|
|
8
|
+
try {
|
|
9
|
+
const { workspaceId } = args;
|
|
10
|
+
return await this.handleList(workspaceId);
|
|
11
|
+
}
|
|
12
|
+
catch (error) {
|
|
13
|
+
return this.handleError(error);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
async handleList(workspaceId) {
|
|
17
|
+
const statuses = await this.motionService.getStatuses(workspaceId);
|
|
18
|
+
return (0, utils_1.formatStatusList)(statuses);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.StatusHandler = StatusHandler;
|
|
22
|
+
//# sourceMappingURL=StatusHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StatusHandler.js","sourceRoot":"","sources":["../../src/handlers/StatusHandler.ts"],"names":[],"mappings":";;;AAAA,oDAAiD;AAGjD,oCAA4C;AAE5C,MAAa,aAAc,SAAQ,yBAAW;IAC5C,KAAK,CAAC,MAAM,CAAC,IAAwB;QACnC,IAAI,CAAC;YACH,MAAM,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;YAC7B,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;QAC5C,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,WAAoB;QAC3C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;QACnE,OAAO,IAAA,wBAAgB,EAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;CACF;AAdD,sCAcC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { BaseHandler } from './base/BaseHandler';
|
|
2
|
+
import { McpToolResponse } from '../types/mcp';
|
|
3
|
+
import { MotionTasksArgs } from '../types/mcp-tool-args';
|
|
4
|
+
export declare class TaskHandler extends BaseHandler {
|
|
5
|
+
handle(args: MotionTasksArgs): Promise<McpToolResponse>;
|
|
6
|
+
private handleCreate;
|
|
7
|
+
private handleList;
|
|
8
|
+
private handleGet;
|
|
9
|
+
private handleUpdate;
|
|
10
|
+
private handleDelete;
|
|
11
|
+
private handleMove;
|
|
12
|
+
private handleUnassign;
|
|
13
|
+
private handleListAllUncompleted;
|
|
14
|
+
/**
|
|
15
|
+
* Validate auto-scheduling configuration and provide helpful error messages
|
|
16
|
+
* @param autoScheduled - The autoScheduled configuration
|
|
17
|
+
* @param workspaceId - The workspace ID for context
|
|
18
|
+
* @throws Error if validation fails with helpful guidance
|
|
19
|
+
*/
|
|
20
|
+
private validateAutoScheduling;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=TaskHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/TaskHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAmEzD,qBAAa,WAAY,SAAQ,WAAW;IACpC,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;YA6B/C,YAAY;YAkEZ,UAAU;YAuCV,SAAS;YAST,YAAY;YAkCZ,YAAY;YASZ,UAAU;YAYV,cAAc;YASd,wBAAwB;IAUtC;;;;;OAKG;YACW,sBAAsB;CAsFrC"}
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TaskHandler = void 0;
|
|
4
|
+
const BaseHandler_1 = require("./base/BaseHandler");
|
|
5
|
+
const utils_1 = require("../utils");
|
|
6
|
+
class TaskHandler 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
|
+
case 'update':
|
|
18
|
+
return await this.handleUpdate(params);
|
|
19
|
+
case 'delete':
|
|
20
|
+
return await this.handleDelete(params);
|
|
21
|
+
case 'move':
|
|
22
|
+
return await this.handleMove(params);
|
|
23
|
+
case 'unassign':
|
|
24
|
+
return await this.handleUnassign(params);
|
|
25
|
+
case 'list_all_uncompleted':
|
|
26
|
+
return await this.handleListAllUncompleted(params);
|
|
27
|
+
default:
|
|
28
|
+
return this.handleUnknownOperation(operation);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
return this.handleError(error);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
async handleCreate(params) {
|
|
36
|
+
if (!params.name) {
|
|
37
|
+
return this.handleError(new Error("Task name is required for create operation"));
|
|
38
|
+
}
|
|
39
|
+
const taskData = (0, utils_1.parseTaskArgs)(params);
|
|
40
|
+
const workspace = await this.workspaceResolver.resolveWorkspace(taskData);
|
|
41
|
+
// Resolve project identifier (projectId or projectName) using the centralized utility
|
|
42
|
+
let resolvedProjectId = taskData.projectId;
|
|
43
|
+
let targetWorkspaceId = workspace.id; // Default to resolved workspace
|
|
44
|
+
if (taskData.projectId || taskData.projectName) {
|
|
45
|
+
const project = await this.motionService.resolveProjectIdentifier({ projectId: taskData.projectId, projectName: taskData.projectName }, workspace.id);
|
|
46
|
+
if (project) {
|
|
47
|
+
resolvedProjectId = project.id;
|
|
48
|
+
// Use the project's workspace instead of the default/specified workspace
|
|
49
|
+
targetWorkspaceId = project.workspaceId;
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
const identifier = taskData.projectId ? `ID "${taskData.projectId}"` : `name "${taskData.projectName}"`;
|
|
53
|
+
return this.handleError(new Error(`Project with ${identifier} not found in any workspace`));
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Convert types for Motion API
|
|
57
|
+
let convertedDuration;
|
|
58
|
+
if (taskData.duration !== undefined) {
|
|
59
|
+
if (typeof taskData.duration === 'string') {
|
|
60
|
+
if (taskData.duration === 'NONE' || taskData.duration === 'REMINDER') {
|
|
61
|
+
convertedDuration = taskData.duration;
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
const numDuration = parseInt(taskData.duration, 10);
|
|
65
|
+
if (!isNaN(numDuration)) {
|
|
66
|
+
convertedDuration = numDuration;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
convertedDuration = taskData.duration;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const convertedLabels = taskData.labels?.map(name => ({ name }));
|
|
75
|
+
// Validate auto-scheduling configuration
|
|
76
|
+
await this.validateAutoScheduling(taskData.autoScheduled, targetWorkspaceId);
|
|
77
|
+
const task = await this.motionService.createTask({
|
|
78
|
+
name: taskData.name,
|
|
79
|
+
description: taskData.description,
|
|
80
|
+
projectId: resolvedProjectId,
|
|
81
|
+
status: taskData.status,
|
|
82
|
+
priority: taskData.priority,
|
|
83
|
+
dueDate: taskData.dueDate,
|
|
84
|
+
duration: convertedDuration,
|
|
85
|
+
labels: convertedLabels,
|
|
86
|
+
assigneeId: taskData.assigneeId,
|
|
87
|
+
autoScheduled: taskData.autoScheduled,
|
|
88
|
+
workspaceId: targetWorkspaceId
|
|
89
|
+
});
|
|
90
|
+
return (0, utils_1.formatMcpSuccess)(`Successfully created task "${task.name}" (ID: ${task.id})`);
|
|
91
|
+
}
|
|
92
|
+
async handleList(params) {
|
|
93
|
+
const workspace = await this.workspaceResolver.resolveWorkspace({
|
|
94
|
+
workspaceId: params.workspaceId,
|
|
95
|
+
workspaceName: params.workspaceName
|
|
96
|
+
});
|
|
97
|
+
// Resolve project identifier (projectId or projectName) using the centralized utility
|
|
98
|
+
let resolvedProjectId = params.projectId;
|
|
99
|
+
let resolvedProjectName = params.projectName;
|
|
100
|
+
if (params.projectId || params.projectName) {
|
|
101
|
+
const project = await this.motionService.resolveProjectIdentifier({ projectId: params.projectId, projectName: params.projectName }, workspace.id);
|
|
102
|
+
if (project) {
|
|
103
|
+
resolvedProjectId = project.id;
|
|
104
|
+
resolvedProjectName = project.name;
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
const identifier = params.projectId ? `ID "${params.projectId}"` : `name "${params.projectName}"`;
|
|
108
|
+
return this.handleError(new Error(`Project with ${identifier} not found in any workspace`));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
const tasks = await this.motionService.getTasks(workspace.id, resolvedProjectId, 5, // maxPages
|
|
112
|
+
params.limit);
|
|
113
|
+
return (0, utils_1.formatTaskList)(tasks, {
|
|
114
|
+
workspaceName: workspace.name,
|
|
115
|
+
projectName: resolvedProjectName,
|
|
116
|
+
status: params.status,
|
|
117
|
+
limit: params.limit
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
async handleGet(params) {
|
|
121
|
+
if (!params.taskId) {
|
|
122
|
+
return this.handleError(new Error("Task ID is required for get operation"));
|
|
123
|
+
}
|
|
124
|
+
const taskDetails = await this.motionService.getTask(params.taskId);
|
|
125
|
+
return (0, utils_1.formatTaskDetail)(taskDetails);
|
|
126
|
+
}
|
|
127
|
+
async handleUpdate(params) {
|
|
128
|
+
if (!params.taskId) {
|
|
129
|
+
return this.handleError(new Error("Task ID is required for update operation"));
|
|
130
|
+
}
|
|
131
|
+
// Create update object with only valid MotionTask fields
|
|
132
|
+
const updateData = {};
|
|
133
|
+
if (params.name !== undefined)
|
|
134
|
+
updateData.name = params.name;
|
|
135
|
+
if (params.description !== undefined)
|
|
136
|
+
updateData.description = params.description;
|
|
137
|
+
if (params.status !== undefined)
|
|
138
|
+
updateData.status = params.status;
|
|
139
|
+
if (params.priority !== undefined)
|
|
140
|
+
updateData.priority = params.priority;
|
|
141
|
+
if (params.dueDate !== undefined)
|
|
142
|
+
updateData.dueDate = params.dueDate;
|
|
143
|
+
if (params.duration !== undefined) {
|
|
144
|
+
// Convert string duration to number or keep special values
|
|
145
|
+
if (typeof params.duration === 'string') {
|
|
146
|
+
if (params.duration === 'NONE' || params.duration === 'REMINDER') {
|
|
147
|
+
updateData.duration = params.duration;
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
const numDuration = parseInt(params.duration, 10);
|
|
151
|
+
if (!isNaN(numDuration)) {
|
|
152
|
+
updateData.duration = numDuration;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
updateData.duration = params.duration;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
if (params.labels !== undefined)
|
|
161
|
+
updateData.labels = params.labels?.map(name => ({ name }));
|
|
162
|
+
if (params.autoScheduled !== undefined)
|
|
163
|
+
updateData.autoScheduled = params.autoScheduled;
|
|
164
|
+
const updatedTask = await this.motionService.updateTask(params.taskId, updateData);
|
|
165
|
+
return (0, utils_1.formatMcpSuccess)(`Successfully updated task "${updatedTask.name}" (ID: ${updatedTask.id})`);
|
|
166
|
+
}
|
|
167
|
+
async handleDelete(params) {
|
|
168
|
+
if (!params.taskId) {
|
|
169
|
+
return this.handleError(new Error("Task ID is required for delete operation"));
|
|
170
|
+
}
|
|
171
|
+
await this.motionService.deleteTask(params.taskId);
|
|
172
|
+
return (0, utils_1.formatMcpSuccess)(`Successfully deleted task ${params.taskId}`);
|
|
173
|
+
}
|
|
174
|
+
async handleMove(params) {
|
|
175
|
+
if (!params.taskId) {
|
|
176
|
+
return this.handleError(new Error("Task ID is required for move operation"));
|
|
177
|
+
}
|
|
178
|
+
if (!params.targetProjectId && !params.targetWorkspaceId) {
|
|
179
|
+
return this.handleError(new Error("Either target project ID or target workspace ID is required for move operation"));
|
|
180
|
+
}
|
|
181
|
+
const movedTask = await this.motionService.moveTask(params.taskId, params.targetProjectId, params.targetWorkspaceId);
|
|
182
|
+
return (0, utils_1.formatMcpSuccess)(`Successfully moved task "${movedTask.name}" (ID: ${movedTask.id})`);
|
|
183
|
+
}
|
|
184
|
+
async handleUnassign(params) {
|
|
185
|
+
if (!params.taskId) {
|
|
186
|
+
return this.handleError(new Error("Task ID is required for unassign operation"));
|
|
187
|
+
}
|
|
188
|
+
const unassignedTask = await this.motionService.unassignTask(params.taskId);
|
|
189
|
+
return (0, utils_1.formatMcpSuccess)(`Successfully unassigned task "${unassignedTask.name}" (ID: ${unassignedTask.id})`);
|
|
190
|
+
}
|
|
191
|
+
async handleListAllUncompleted(params) {
|
|
192
|
+
const tasks = await this.motionService.getAllUncompletedTasks(params.limit);
|
|
193
|
+
return (0, utils_1.formatTaskList)(tasks, {
|
|
194
|
+
status: 'uncompleted',
|
|
195
|
+
limit: params.limit,
|
|
196
|
+
allWorkspaces: true
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Validate auto-scheduling configuration and provide helpful error messages
|
|
201
|
+
* @param autoScheduled - The autoScheduled configuration
|
|
202
|
+
* @param workspaceId - The workspace ID for context
|
|
203
|
+
* @throws Error if validation fails with helpful guidance
|
|
204
|
+
*/
|
|
205
|
+
async validateAutoScheduling(autoScheduled, workspaceId) {
|
|
206
|
+
// If auto-scheduling is not enabled, no validation needed
|
|
207
|
+
if (!autoScheduled || autoScheduled === null) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
// If it's an object, check if schedule is provided
|
|
211
|
+
if (typeof autoScheduled === 'object' && autoScheduled !== null) {
|
|
212
|
+
const schedule = autoScheduled.schedule;
|
|
213
|
+
// If no schedule provided, show available schedules
|
|
214
|
+
if (!schedule) {
|
|
215
|
+
try {
|
|
216
|
+
const availableSchedules = await this.motionService.getAvailableScheduleNames(workspaceId);
|
|
217
|
+
if (availableSchedules.length === 0) {
|
|
218
|
+
throw new Error('Auto-scheduling requires a schedule, but no schedules are available. Please create a schedule in Motion first.');
|
|
219
|
+
}
|
|
220
|
+
const scheduleList = availableSchedules
|
|
221
|
+
.map((name, i) => `${i + 1}. "${name}"`)
|
|
222
|
+
.join('\n');
|
|
223
|
+
throw new Error(`Auto-scheduling requires a schedule. Available schedules:\n${scheduleList}\n\nExample usage:\n• Set autoScheduled to {"schedule": "${availableSchedules[0]}"}\n• Or pass schedule name directly: autoScheduled = "${availableSchedules[0]}"`);
|
|
224
|
+
}
|
|
225
|
+
catch (error) {
|
|
226
|
+
// If we can't fetch schedules, provide a generic error
|
|
227
|
+
if (error instanceof Error && error.message.includes('Auto-scheduling requires a schedule')) {
|
|
228
|
+
throw error; // Re-throw our formatted error
|
|
229
|
+
}
|
|
230
|
+
throw new Error('Auto-scheduling requires a schedule, but unable to fetch available schedules. Please specify a schedule name in autoScheduled parameter.');
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// Validate that the provided schedule exists
|
|
234
|
+
try {
|
|
235
|
+
const availableSchedules = await this.motionService.getAvailableScheduleNames(workspaceId);
|
|
236
|
+
// Case-insensitive matching
|
|
237
|
+
const normalizedSchedule = schedule.toLowerCase().trim();
|
|
238
|
+
const matchingSchedule = availableSchedules.find(s => s.toLowerCase().trim() === normalizedSchedule);
|
|
239
|
+
if (!matchingSchedule) {
|
|
240
|
+
// Provide suggestions for similar names
|
|
241
|
+
const suggestions = availableSchedules.filter(s => s.toLowerCase().includes(normalizedSchedule) ||
|
|
242
|
+
normalizedSchedule.includes(s.toLowerCase()));
|
|
243
|
+
const scheduleList = availableSchedules
|
|
244
|
+
.map((name, i) => `${i + 1}. "${name}"`)
|
|
245
|
+
.join('\n');
|
|
246
|
+
let errorMessage = `Schedule "${schedule}" not found.`;
|
|
247
|
+
if (suggestions.length > 0) {
|
|
248
|
+
errorMessage += ` Did you mean: ${suggestions.map(s => `"${s}"`).join(', ')}?`;
|
|
249
|
+
}
|
|
250
|
+
errorMessage += `\n\nAvailable schedules:\n${scheduleList}`;
|
|
251
|
+
throw new Error(errorMessage);
|
|
252
|
+
}
|
|
253
|
+
// Update the schedule with the exact match (fixes casing)
|
|
254
|
+
autoScheduled.schedule = matchingSchedule;
|
|
255
|
+
}
|
|
256
|
+
catch (error) {
|
|
257
|
+
if (error instanceof Error) {
|
|
258
|
+
throw error; // Re-throw validation errors
|
|
259
|
+
}
|
|
260
|
+
throw new Error(`Unable to validate schedule "${schedule}". Please check that the schedule exists in Motion.`);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
exports.TaskHandler = TaskHandler;
|
|
266
|
+
//# sourceMappingURL=TaskHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TaskHandler.js","sourceRoot":"","sources":["../../src/handlers/TaskHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { BaseHandler } from './base/BaseHandler';
|
|
2
|
+
import { McpToolResponse } from '../types/mcp';
|
|
3
|
+
import { MotionUsersArgs } from '../types/mcp-tool-args';
|
|
4
|
+
export declare class UserHandler extends BaseHandler {
|
|
5
|
+
handle(args: MotionUsersArgs): Promise<McpToolResponse>;
|
|
6
|
+
private handleList;
|
|
7
|
+
private handleGetCurrent;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=UserHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/UserHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGzD,qBAAa,WAAY,SAAQ,WAAW;IACpC,MAAM,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;YAiB/C,UAAU;YAQV,gBAAgB;CAK/B"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UserHandler = void 0;
|
|
4
|
+
const BaseHandler_1 = require("./base/BaseHandler");
|
|
5
|
+
const utils_1 = require("../utils");
|
|
6
|
+
class UserHandler extends BaseHandler_1.BaseHandler {
|
|
7
|
+
async handle(args) {
|
|
8
|
+
try {
|
|
9
|
+
const { operation, workspaceId, workspaceName } = args;
|
|
10
|
+
switch (operation) {
|
|
11
|
+
case 'list':
|
|
12
|
+
return await this.handleList(workspaceId, workspaceName);
|
|
13
|
+
case 'current':
|
|
14
|
+
return await this.handleGetCurrent();
|
|
15
|
+
default:
|
|
16
|
+
return this.handleUnknownOperation(operation);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
catch (error) {
|
|
20
|
+
return this.handleError(error);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
async handleList(workspaceId, workspaceName) {
|
|
24
|
+
const workspace = await this.workspaceResolver.resolveWorkspace({ workspaceId, workspaceName });
|
|
25
|
+
const users = await this.motionService.getUsers(workspace.id);
|
|
26
|
+
const userList = users.map(u => `- ${u.name} (${u.email}) [ID: ${u.id}]`).join('\n');
|
|
27
|
+
return (0, utils_1.formatMcpSuccess)(`Users in workspace "${workspace.name}":\n${userList}`);
|
|
28
|
+
}
|
|
29
|
+
async handleGetCurrent() {
|
|
30
|
+
const currentUser = await this.motionService.getCurrentUser();
|
|
31
|
+
const userInfo = `Current user: ${currentUser.name || 'No name'} (${currentUser.email}) [ID: ${currentUser.id}]`;
|
|
32
|
+
return (0, utils_1.formatMcpSuccess)(userInfo);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
exports.UserHandler = UserHandler;
|
|
36
|
+
//# sourceMappingURL=UserHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserHandler.js","sourceRoot":"","sources":["../../src/handlers/UserHandler.ts"],"names":[],"mappings":";;;AAAA,oDAAiD;AAGjD,oCAA4C;AAE5C,MAAa,WAAY,SAAQ,yBAAW;IAC1C,KAAK,CAAC,MAAM,CAAC,IAAqB;QAChC,IAAI,CAAC;YACH,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC;YAEvD,QAAO,SAAS,EAAE,CAAC;gBACjB,KAAK,MAAM;oBACT,OAAO,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;gBAC3D,KAAK,SAAS;oBACZ,OAAO,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACvC;oBACE,OAAO,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,WAAoB,EAAE,aAAsB;QACnE,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;QAChG,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QAE9D,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrF,OAAO,IAAA,wBAAgB,EAAC,uBAAuB,SAAS,CAAC,IAAI,OAAO,QAAQ,EAAE,CAAC,CAAC;IAClF,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,EAAE,CAAC;QAC9D,MAAM,QAAQ,GAAG,iBAAiB,WAAW,CAAC,IAAI,IAAI,SAAS,KAAK,WAAW,CAAC,KAAK,UAAU,WAAW,CAAC,EAAE,GAAG,CAAC;QACjH,OAAO,IAAA,wBAAgB,EAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;CACF;AA/BD,kCA+BC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { BaseHandler } from './base/BaseHandler';
|
|
2
|
+
import { McpToolResponse } from '../types/mcp';
|
|
3
|
+
import { MotionWorkspacesArgs } from '../types/mcp-tool-args';
|
|
4
|
+
export declare class WorkspaceHandler extends BaseHandler {
|
|
5
|
+
handle(args: MotionWorkspacesArgs): Promise<McpToolResponse>;
|
|
6
|
+
private handleList;
|
|
7
|
+
private handleGet;
|
|
8
|
+
private handleSetDefault;
|
|
9
|
+
}
|
|
10
|
+
//# sourceMappingURL=WorkspaceHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspaceHandler.d.ts","sourceRoot":"","sources":["../../src/handlers/WorkspaceHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAO9D,qBAAa,gBAAiB,SAAQ,WAAW;IACzC,MAAM,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,eAAe,CAAC;YAmBpD,UAAU;YAKV,SAAS;YAeT,gBAAgB;CAQ/B"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WorkspaceHandler = void 0;
|
|
4
|
+
const BaseHandler_1 = require("./base/BaseHandler");
|
|
5
|
+
const utils_1 = require("../utils");
|
|
6
|
+
class WorkspaceHandler extends BaseHandler_1.BaseHandler {
|
|
7
|
+
async handle(args) {
|
|
8
|
+
try {
|
|
9
|
+
const { operation, workspaceId } = args;
|
|
10
|
+
switch (operation) {
|
|
11
|
+
case 'list':
|
|
12
|
+
return await this.handleList();
|
|
13
|
+
case 'get':
|
|
14
|
+
return await this.handleGet(workspaceId);
|
|
15
|
+
case 'set_default':
|
|
16
|
+
return await this.handleSetDefault(workspaceId);
|
|
17
|
+
default:
|
|
18
|
+
return this.handleUnknownOperation(operation);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
return this.handleError(error);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async handleList() {
|
|
26
|
+
const workspaces = await this.motionService.getWorkspaces();
|
|
27
|
+
return (0, utils_1.formatWorkspaceList)(workspaces);
|
|
28
|
+
}
|
|
29
|
+
async handleGet(workspaceId) {
|
|
30
|
+
if (!workspaceId) {
|
|
31
|
+
return this.handleError(new Error("Workspace ID is required for get operation"));
|
|
32
|
+
}
|
|
33
|
+
const workspaces = await this.motionService.getWorkspaces();
|
|
34
|
+
const workspace = workspaces.find(w => w.id === workspaceId);
|
|
35
|
+
if (!workspace) {
|
|
36
|
+
return this.handleError(new Error(`Workspace not found: ${workspaceId}`));
|
|
37
|
+
}
|
|
38
|
+
return (0, utils_1.formatDetailResponse)(workspace, `Workspace details for "${workspace.name}"`);
|
|
39
|
+
}
|
|
40
|
+
async handleSetDefault(workspaceId) {
|
|
41
|
+
if (!workspaceId) {
|
|
42
|
+
return this.handleError(new Error("Workspace ID is required for set_default operation"));
|
|
43
|
+
}
|
|
44
|
+
// For now, we'll just return a success message since Motion API doesn't have a set default endpoint
|
|
45
|
+
return (0, utils_1.formatMcpSuccess)(`Default workspace would be set to: ${workspaceId} (Note: This is a placeholder - actual implementation depends on Motion API support)`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.WorkspaceHandler = WorkspaceHandler;
|
|
49
|
+
//# sourceMappingURL=WorkspaceHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WorkspaceHandler.js","sourceRoot":"","sources":["../../src/handlers/WorkspaceHandler.ts"],"names":[],"mappings":";;;AAAA,oDAAiD;AAGjD,oCAIkB;AAElB,MAAa,gBAAiB,SAAQ,yBAAW;IAC/C,KAAK,CAAC,MAAM,CAAC,IAA0B;QACrC,IAAI,CAAC;YACH,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;YAExC,QAAO,SAAS,EAAE,CAAC;gBACjB,KAAK,MAAM;oBACT,OAAO,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;gBACjC,KAAK,KAAK;oBACR,OAAO,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;gBAC3C,KAAK,aAAa;oBAChB,OAAO,MAAM,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;gBAClD;oBACE,OAAO,IAAI,CAAC,sBAAsB,CAAC,SAAS,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;QAAC,OAAO,KAAc,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;QAC5D,OAAO,IAAA,2BAAmB,EAAC,UAAU,CAAC,CAAC;IACzC,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,WAAoB;QAC1C,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACnF,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,EAAE,CAAC;QAC5D,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,CAAC;QAE7D,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,wBAAwB,WAAW,EAAE,CAAC,CAAC,CAAC;QAC5E,CAAC;QAED,OAAO,IAAA,4BAAoB,EAAC,SAAS,EAAE,0BAA0B,SAAS,CAAC,IAAI,GAAG,CAAC,CAAC;IACtF,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,WAAoB;QACjD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC,CAAC;QAC3F,CAAC;QAED,oGAAoG;QACpG,OAAO,IAAA,wBAAgB,EAAC,sCAAsC,WAAW,sFAAsF,CAAC,CAAC;IACnK,CAAC;CACF;AAhDD,4CAgDC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { McpToolResponse } from '../../types/mcp';
|
|
2
|
+
import { IHandler, HandlerContext, ValidationResult } from './HandlerInterface';
|
|
3
|
+
export declare abstract class BaseHandler implements IHandler {
|
|
4
|
+
protected motionService: MotionApiService;
|
|
5
|
+
protected workspaceResolver: WorkspaceResolver;
|
|
6
|
+
protected validator: InputValidator;
|
|
7
|
+
constructor(context: HandlerContext);
|
|
8
|
+
abstract handle(args: unknown): Promise<McpToolResponse>;
|
|
9
|
+
protected handleError(error: unknown): McpToolResponse;
|
|
10
|
+
protected handleUnknownOperation(operation: string): McpToolResponse;
|
|
11
|
+
validateArgs(args: unknown): ValidationResult;
|
|
12
|
+
}
|
|
13
|
+
import { MotionApiService } from '../../services/motionApi';
|
|
14
|
+
import { WorkspaceResolver } from '../../utils/workspaceResolver';
|
|
15
|
+
import { InputValidator } from '../../utils/validator';
|
|
16
|
+
//# sourceMappingURL=BaseHandler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseHandler.d.ts","sourceRoot":"","sources":["../../../src/handlers/base/BaseHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,OAAO,EAAE,QAAQ,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEhF,8BAAsB,WAAY,YAAW,QAAQ;IACnD,SAAS,CAAC,aAAa,EAAE,gBAAgB,CAAC;IAC1C,SAAS,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IAC/C,SAAS,CAAC,SAAS,EAAE,cAAc,CAAC;gBAExB,OAAO,EAAE,cAAc;IAMnC,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC;IAExD,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,eAAe;IAItD,SAAS,CAAC,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,eAAe;IAIpE,YAAY,CAAC,IAAI,EAAE,OAAO,GAAG,gBAAgB;CAa9C;AAGD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
|