motionmcp 1.0.2 → 2.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +241 -450
- 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 +324 -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.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 +199 -0
- package/dist/services/motionApi.d.ts.map +1 -0
- package/dist/services/motionApi.js +1950 -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 +508 -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 +123 -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 +88 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +188 -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/pagination.d.ts +61 -0
- package/dist/utils/pagination.d.ts.map +1 -0
- package/dist/utils/pagination.js +168 -0
- package/dist/utils/pagination.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 +95 -0
- package/dist/utils/responseFormatters.d.ts.map +1 -0
- package/dist/utils/responseFormatters.js +342 -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 +138 -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 -179
- 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,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,95 @@
|
|
|
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
|
+
assigneeName?: string;
|
|
27
|
+
priority?: string;
|
|
28
|
+
dueDate?: string;
|
|
29
|
+
limit?: number;
|
|
30
|
+
allWorkspaces?: boolean;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Format task list response
|
|
34
|
+
*/
|
|
35
|
+
export declare function formatTaskList(tasks: MotionTask[], context?: TaskListContext): CallToolResult;
|
|
36
|
+
/**
|
|
37
|
+
* Format workspace list response
|
|
38
|
+
*/
|
|
39
|
+
export declare function formatWorkspaceList(workspaces: MotionWorkspace[]): CallToolResult;
|
|
40
|
+
/**
|
|
41
|
+
* Format detailed item response (project, task, etc.)
|
|
42
|
+
*/
|
|
43
|
+
export declare function formatDetailResponse<T extends Record<string, any>>(item: T, itemType: string, fields?: (keyof T)[]): CallToolResult;
|
|
44
|
+
/**
|
|
45
|
+
* Format single task detail response with comprehensive information
|
|
46
|
+
*/
|
|
47
|
+
export declare function formatTaskDetail(task: MotionTask): CallToolResult;
|
|
48
|
+
interface SearchOptions {
|
|
49
|
+
limit?: number;
|
|
50
|
+
searchScope?: string;
|
|
51
|
+
}
|
|
52
|
+
interface SearchResult {
|
|
53
|
+
id: string;
|
|
54
|
+
name: string;
|
|
55
|
+
projectId?: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Format search results response
|
|
59
|
+
*/
|
|
60
|
+
export declare function formatSearchResults(results: SearchResult[], query: string, options?: SearchOptions): CallToolResult;
|
|
61
|
+
/**
|
|
62
|
+
* Format comments list response
|
|
63
|
+
*/
|
|
64
|
+
export declare function formatCommentList(comments: MotionComment[]): CallToolResult;
|
|
65
|
+
/**
|
|
66
|
+
* Format single comment response
|
|
67
|
+
*/
|
|
68
|
+
export declare function formatCommentDetail(comment: MotionComment): CallToolResult;
|
|
69
|
+
/**
|
|
70
|
+
* Format custom field list response
|
|
71
|
+
*/
|
|
72
|
+
export declare function formatCustomFieldList(fields: MotionCustomField[]): CallToolResult;
|
|
73
|
+
/**
|
|
74
|
+
* Format single custom field response
|
|
75
|
+
*/
|
|
76
|
+
export declare function formatCustomFieldDetail(field: MotionCustomField): CallToolResult;
|
|
77
|
+
/**
|
|
78
|
+
* Format success message for custom field operations
|
|
79
|
+
*/
|
|
80
|
+
export declare function formatCustomFieldSuccess(operation: string, entityType?: string, entityId?: string): CallToolResult;
|
|
81
|
+
/**
|
|
82
|
+
* Format recurring task list response
|
|
83
|
+
*/
|
|
84
|
+
export declare function formatRecurringTaskList(tasks: MotionRecurringTask[]): CallToolResult;
|
|
85
|
+
/**
|
|
86
|
+
* Format single recurring task response
|
|
87
|
+
*/
|
|
88
|
+
export declare function formatRecurringTaskDetail(task: MotionRecurringTask): CallToolResult;
|
|
89
|
+
/**
|
|
90
|
+
* Format schedule list response
|
|
91
|
+
*/
|
|
92
|
+
export declare function formatScheduleList(schedules: MotionSchedule[]): CallToolResult;
|
|
93
|
+
export declare function formatStatusList(statuses: MotionStatus[]): CallToolResult;
|
|
94
|
+
export {};
|
|
95
|
+
//# 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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"}
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Response Formatting Utilities - MCP response formatting helpers
|
|
4
|
+
*
|
|
5
|
+
* This module provides utilities to format various types of responses
|
|
6
|
+
* consistently across all MCP handlers, reducing duplication and ensuring
|
|
7
|
+
* uniform response structures.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.formatListResponse = formatListResponse;
|
|
11
|
+
exports.formatProjectList = formatProjectList;
|
|
12
|
+
exports.formatTaskList = formatTaskList;
|
|
13
|
+
exports.formatWorkspaceList = formatWorkspaceList;
|
|
14
|
+
exports.formatDetailResponse = formatDetailResponse;
|
|
15
|
+
exports.formatTaskDetail = formatTaskDetail;
|
|
16
|
+
exports.formatSearchResults = formatSearchResults;
|
|
17
|
+
exports.formatCommentList = formatCommentList;
|
|
18
|
+
exports.formatCommentDetail = formatCommentDetail;
|
|
19
|
+
exports.formatCustomFieldList = formatCustomFieldList;
|
|
20
|
+
exports.formatCustomFieldDetail = formatCustomFieldDetail;
|
|
21
|
+
exports.formatCustomFieldSuccess = formatCustomFieldSuccess;
|
|
22
|
+
exports.formatRecurringTaskList = formatRecurringTaskList;
|
|
23
|
+
exports.formatRecurringTaskDetail = formatRecurringTaskDetail;
|
|
24
|
+
exports.formatScheduleList = formatScheduleList;
|
|
25
|
+
exports.formatStatusList = formatStatusList;
|
|
26
|
+
const errorHandling_1 = require("./errorHandling");
|
|
27
|
+
const constants_1 = require("./constants");
|
|
28
|
+
/**
|
|
29
|
+
* Format a list of items for MCP response
|
|
30
|
+
*/
|
|
31
|
+
function formatListResponse(items, title, formatter) {
|
|
32
|
+
if (!Array.isArray(items)) {
|
|
33
|
+
throw new Error('Items must be an array');
|
|
34
|
+
}
|
|
35
|
+
const list = items.map(formatter).join('\n');
|
|
36
|
+
const responseText = `${title}:\n${list}`;
|
|
37
|
+
return (0, errorHandling_1.formatMcpSuccess)(responseText);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Format project list response with workspace context
|
|
41
|
+
*/
|
|
42
|
+
function formatProjectList(projects, workspaceName, workspaceId = null, options = {}) {
|
|
43
|
+
const { includeWorkspaceNote = false, showIds = true } = options;
|
|
44
|
+
const projectFormatter = (project) => {
|
|
45
|
+
if (showIds) {
|
|
46
|
+
// For cross-workspace listings, show workspace info too
|
|
47
|
+
if (workspaceName === 'All Workspaces' && project.workspaceId) {
|
|
48
|
+
return `- ${project.name} (ID: ${project.id}) [Workspace: ${project.workspaceId}]`;
|
|
49
|
+
}
|
|
50
|
+
return `- ${project.name} (ID: ${project.id})`;
|
|
51
|
+
}
|
|
52
|
+
return `- ${project.name}`;
|
|
53
|
+
};
|
|
54
|
+
let responseText = `Found ${projects.length} ${projects.length === 1 ? 'project' : 'projects'} in workspace "${workspaceName}"`;
|
|
55
|
+
if (workspaceId) {
|
|
56
|
+
responseText += ` (ID: ${workspaceId})`;
|
|
57
|
+
}
|
|
58
|
+
if (projects.length > 0) {
|
|
59
|
+
const projectList = projects.map(projectFormatter).join('\n');
|
|
60
|
+
responseText += `:\n${projectList}`;
|
|
61
|
+
}
|
|
62
|
+
if (includeWorkspaceNote && !workspaceId) {
|
|
63
|
+
responseText += `\n\nNote: This shows projects from the default workspace. You can specify a different workspace using the workspaceId or workspaceName parameter, or use motion_workspaces (operation: list) to see all available workspaces.`;
|
|
64
|
+
}
|
|
65
|
+
return (0, errorHandling_1.formatMcpSuccess)(responseText);
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Format task list response
|
|
69
|
+
*/
|
|
70
|
+
function formatTaskList(tasks, context = {}) {
|
|
71
|
+
const { workspaceName, projectName, status, assigneeName, priority, dueDate, limit, allWorkspaces } = context;
|
|
72
|
+
const taskFormatter = (task) => {
|
|
73
|
+
let line = `- ${task.name}`;
|
|
74
|
+
if (task.id)
|
|
75
|
+
line += ` (ID: ${task.id})`;
|
|
76
|
+
if (task.status)
|
|
77
|
+
line += ` [${typeof task.status === 'string' ? task.status : task.status.name}]`;
|
|
78
|
+
if (task.priority)
|
|
79
|
+
line += ` {${task.priority}}`;
|
|
80
|
+
if (task.dueDate) {
|
|
81
|
+
const dueDate = new Date(task.dueDate).toLocaleDateString();
|
|
82
|
+
line += ` (Due: ${dueDate})`;
|
|
83
|
+
}
|
|
84
|
+
return line;
|
|
85
|
+
};
|
|
86
|
+
let title = `Found ${tasks.length} ${tasks.length === 1 ? 'task' : 'tasks'}`;
|
|
87
|
+
if (allWorkspaces) {
|
|
88
|
+
title += ` across all workspaces`;
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
if (workspaceName)
|
|
92
|
+
title += ` in workspace "${workspaceName}"`;
|
|
93
|
+
}
|
|
94
|
+
if (projectName)
|
|
95
|
+
title += ` in project "${projectName}"`;
|
|
96
|
+
if (status)
|
|
97
|
+
title += ` with status "${status}"`;
|
|
98
|
+
if (assigneeName)
|
|
99
|
+
title += ` for assignee "${assigneeName}"`;
|
|
100
|
+
if (priority)
|
|
101
|
+
title += ` with priority "${priority}"`;
|
|
102
|
+
if (dueDate) {
|
|
103
|
+
const parsedDueDate = new Date(dueDate);
|
|
104
|
+
const dueDateText = Number.isNaN(parsedDueDate.getTime())
|
|
105
|
+
? dueDate
|
|
106
|
+
: parsedDueDate.toLocaleDateString();
|
|
107
|
+
title += ` due by ${dueDateText}`;
|
|
108
|
+
}
|
|
109
|
+
if (limit)
|
|
110
|
+
title += ` (limit: ${limit})`;
|
|
111
|
+
return formatListResponse(tasks, title, taskFormatter);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Format workspace list response
|
|
115
|
+
*/
|
|
116
|
+
function formatWorkspaceList(workspaces) {
|
|
117
|
+
const workspaceFormatter = (workspace) => {
|
|
118
|
+
let line = `- ${workspace.name} (ID: ${workspace.id})`;
|
|
119
|
+
if (workspace.type)
|
|
120
|
+
line += ` [${workspace.type}]`;
|
|
121
|
+
return line;
|
|
122
|
+
};
|
|
123
|
+
return formatListResponse(workspaces, `Available workspaces (${workspaces.length})`, workspaceFormatter);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Format detailed item response (project, task, etc.)
|
|
127
|
+
*/
|
|
128
|
+
function formatDetailResponse(item, itemType, fields = []) {
|
|
129
|
+
let responseText = `${itemType} Details:\n`;
|
|
130
|
+
fields.forEach(field => {
|
|
131
|
+
const value = item[field];
|
|
132
|
+
const fieldStr = String(field);
|
|
133
|
+
const displayName = fieldStr.charAt(0).toUpperCase() + fieldStr.slice(1);
|
|
134
|
+
const displayValue = value ?? 'N/A';
|
|
135
|
+
responseText += `- ${displayName}: ${displayValue}\n`;
|
|
136
|
+
});
|
|
137
|
+
return (0, errorHandling_1.formatMcpSuccess)(responseText);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Format single task detail response with comprehensive information
|
|
141
|
+
*/
|
|
142
|
+
function formatTaskDetail(task) {
|
|
143
|
+
const details = [
|
|
144
|
+
`Task: ${task.name}`,
|
|
145
|
+
`ID: ${task.id}`,
|
|
146
|
+
task.description ? `Description: ${task.description}` : null,
|
|
147
|
+
`Status: ${typeof task.status === 'string' ? task.status : task.status?.name || 'Unknown'}`,
|
|
148
|
+
`Priority: ${task.priority || 'Not set'}`,
|
|
149
|
+
`Completed: ${task.completed ? 'Yes' : 'No'}`,
|
|
150
|
+
task.dueDate ? `Due Date: ${new Date(task.dueDate).toLocaleString()}` : 'Due Date: Not set',
|
|
151
|
+
task.createdTime ? `Created: ${new Date(task.createdTime).toLocaleString()}` : null,
|
|
152
|
+
task.updatedTime ? `Last Updated: ${new Date(task.updatedTime).toLocaleString()}` : null,
|
|
153
|
+
task.completedTime ? `Completed: ${new Date(task.completedTime).toLocaleString()}` : null,
|
|
154
|
+
`Workspace: ${task.workspace?.name || 'Unknown'} (${task.workspace?.id || 'N/A'})`,
|
|
155
|
+
task.project ? `Project: ${task.project.name} (${task.project.id})` : 'Project: No project assigned',
|
|
156
|
+
task.assignees && task.assignees.length > 0
|
|
157
|
+
? `Assignees: ${task.assignees.map(a => `${a.name} (${a.email})`).join(', ')}`
|
|
158
|
+
: 'Assignees: None',
|
|
159
|
+
task.creator ? `Creator: ${task.creator.name} (${task.creator.email})` : null,
|
|
160
|
+
(task.labels && task.labels.length > 0)
|
|
161
|
+
? `Labels: ${task.labels.map(l => typeof l === 'string' ? l : l.name).join(', ')}`
|
|
162
|
+
: null,
|
|
163
|
+
task.duration ? `Duration: ${typeof task.duration === 'number' ? `${task.duration} minutes` : task.duration}` : null,
|
|
164
|
+
task.deadlineType ? `Deadline Type: ${task.deadlineType}` : null,
|
|
165
|
+
task.scheduledStart ? `Scheduled Start: ${new Date(task.scheduledStart).toLocaleString()}` : null,
|
|
166
|
+
task.scheduledEnd ? `Scheduled End: ${new Date(task.scheduledEnd).toLocaleString()}` : null,
|
|
167
|
+
task.parentRecurringTaskId ? `Recurring Task ID: ${task.parentRecurringTaskId}` : null,
|
|
168
|
+
task.chunks && task.chunks.length > 0
|
|
169
|
+
? `Scheduled Chunks: ${task.chunks.length} time block(s)`
|
|
170
|
+
: null
|
|
171
|
+
].filter(Boolean).join('\n');
|
|
172
|
+
return (0, errorHandling_1.formatMcpSuccess)(details);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Format search results response
|
|
176
|
+
*/
|
|
177
|
+
function formatSearchResults(results, query, options = {}) {
|
|
178
|
+
const { limit, searchScope } = options;
|
|
179
|
+
const resultFormatter = (result) => {
|
|
180
|
+
const type = result.projectId ? "task" : "project";
|
|
181
|
+
return `- [${type}] ${result.name} (ID: ${result.id})`;
|
|
182
|
+
};
|
|
183
|
+
let title = `Search Results for "${query}"`;
|
|
184
|
+
if (limit)
|
|
185
|
+
title += ` (Limit: ${limit})`;
|
|
186
|
+
if (searchScope)
|
|
187
|
+
title += ` (Scope: ${searchScope})`;
|
|
188
|
+
return formatListResponse(results, title, resultFormatter);
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Format comments list response
|
|
192
|
+
*/
|
|
193
|
+
function formatCommentList(comments) {
|
|
194
|
+
if (comments.length === 0) {
|
|
195
|
+
return (0, errorHandling_1.formatMcpSuccess)("No comments found.");
|
|
196
|
+
}
|
|
197
|
+
const commentFormatter = (comment) => {
|
|
198
|
+
const location = `Task ${comment.taskId}`;
|
|
199
|
+
const timestamp = comment.createdAt;
|
|
200
|
+
const author = comment.creator.name || comment.creator.email || comment.creator.id;
|
|
201
|
+
// Truncate long comments for display
|
|
202
|
+
const displayContent = comment.content.length > constants_1.LIMITS.COMMENT_DISPLAY_LENGTH
|
|
203
|
+
? comment.content.substring(0, constants_1.LIMITS.COMMENT_DISPLAY_LENGTH) + '...'
|
|
204
|
+
: comment.content;
|
|
205
|
+
// Keep as single line for proper list formatting
|
|
206
|
+
return `- [${comment.id}] ${location} | Author: ${author} | ${timestamp} | "${displayContent}"`;
|
|
207
|
+
};
|
|
208
|
+
return formatListResponse(comments, `Found ${comments.length} comment${comments.length === 1 ? '' : 's'}`, commentFormatter);
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Format single comment response
|
|
212
|
+
*/
|
|
213
|
+
function formatCommentDetail(comment) {
|
|
214
|
+
const location = `Task ${comment.taskId}`;
|
|
215
|
+
const timestamp = comment.createdAt;
|
|
216
|
+
const author = comment.creator.name || comment.creator.email || comment.creator.id;
|
|
217
|
+
const details = [
|
|
218
|
+
`Comment created successfully:`,
|
|
219
|
+
`- ID: ${comment.id}`,
|
|
220
|
+
`- Location: ${location}`,
|
|
221
|
+
`- Author: ${author}`,
|
|
222
|
+
`- Created: ${timestamp}`,
|
|
223
|
+
`- Content: "${comment.content}"`
|
|
224
|
+
].join('\n');
|
|
225
|
+
return (0, errorHandling_1.formatMcpSuccess)(details);
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Format custom field list response
|
|
229
|
+
*/
|
|
230
|
+
function formatCustomFieldList(fields) {
|
|
231
|
+
if (fields.length === 0) {
|
|
232
|
+
return (0, errorHandling_1.formatMcpSuccess)("No custom fields found.");
|
|
233
|
+
}
|
|
234
|
+
const fieldFormatter = (field) => {
|
|
235
|
+
return `- ID: ${field.id} [Type: ${field.field}]`;
|
|
236
|
+
};
|
|
237
|
+
return formatListResponse(fields, `Found ${fields.length} custom field${fields.length === 1 ? '' : 's'}`, fieldFormatter);
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Format single custom field response
|
|
241
|
+
*/
|
|
242
|
+
function formatCustomFieldDetail(field) {
|
|
243
|
+
const details = [
|
|
244
|
+
`Custom field created successfully:`,
|
|
245
|
+
`- ID: ${field.id}`,
|
|
246
|
+
`- Type: ${field.field}`
|
|
247
|
+
].join('\n');
|
|
248
|
+
return (0, errorHandling_1.formatMcpSuccess)(details);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Format success message for custom field operations
|
|
252
|
+
*/
|
|
253
|
+
function formatCustomFieldSuccess(operation, entityType, entityId) {
|
|
254
|
+
let message = `Custom field ${operation} successfully`;
|
|
255
|
+
if (entityType && entityId) {
|
|
256
|
+
message += ` for ${entityType} ${entityId}`;
|
|
257
|
+
}
|
|
258
|
+
return (0, errorHandling_1.formatMcpSuccess)(message);
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Format recurring task list response
|
|
262
|
+
*/
|
|
263
|
+
function formatRecurringTaskList(tasks) {
|
|
264
|
+
if (tasks.length === 0) {
|
|
265
|
+
return (0, errorHandling_1.formatMcpSuccess)("No recurring tasks found.");
|
|
266
|
+
}
|
|
267
|
+
const taskFormatter = (task) => {
|
|
268
|
+
const projectName = task.project?.name ?? 'No Project';
|
|
269
|
+
return `- ${task.name} (ID: ${task.id}) [${task.priority}] (Project: ${projectName})`;
|
|
270
|
+
};
|
|
271
|
+
return formatListResponse(tasks, `Found ${tasks.length} recurring task${tasks.length === 1 ? '' : 's'}`, taskFormatter);
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Format single recurring task response
|
|
275
|
+
*/
|
|
276
|
+
function formatRecurringTaskDetail(task) {
|
|
277
|
+
const details = [
|
|
278
|
+
`Recurring task created successfully:`,
|
|
279
|
+
`- ID: ${task.id}`,
|
|
280
|
+
`- Name: ${task.name}`,
|
|
281
|
+
`- Priority: ${task.priority}`,
|
|
282
|
+
`- Creator: ${task.creator.name} (${task.creator.email})`,
|
|
283
|
+
`- Workspace: ${task.workspace.name} (${task.workspace.id})`,
|
|
284
|
+
task.project ? `- Project: ${task.project.name} (${task.project.id})` : `- Project: No project assigned`,
|
|
285
|
+
task.assignee ? `- Assignee: ${task.assignee.name} (${task.assignee.email})` : null,
|
|
286
|
+
`- Status: ${typeof task.status === 'string' ? task.status : task.status?.name || 'Unknown'}`,
|
|
287
|
+
(task.labels && task.labels.length > 0) ? `- Labels: ${task.labels.map(l => typeof l === 'string' ? l : l.name).join(', ')}` : null
|
|
288
|
+
].filter(Boolean).join('\n');
|
|
289
|
+
return (0, errorHandling_1.formatMcpSuccess)(details);
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Format schedule list response
|
|
293
|
+
*/
|
|
294
|
+
function formatScheduleList(schedules) {
|
|
295
|
+
// Add null safety check for the array itself
|
|
296
|
+
if (!schedules || !Array.isArray(schedules) || schedules.length === 0) {
|
|
297
|
+
return (0, errorHandling_1.formatMcpSuccess)("No schedules found.");
|
|
298
|
+
}
|
|
299
|
+
const scheduleFormatter = (schedule) => {
|
|
300
|
+
// Defensive programming for nested schedule object
|
|
301
|
+
if (!schedule) {
|
|
302
|
+
return '- Invalid schedule entry';
|
|
303
|
+
}
|
|
304
|
+
const name = schedule.name || 'Unnamed';
|
|
305
|
+
const timezone = schedule.timezone || 'Unknown timezone';
|
|
306
|
+
// Count working days if schedule details are available
|
|
307
|
+
let workingDays = '';
|
|
308
|
+
if (schedule.schedule && typeof schedule.schedule === 'object') {
|
|
309
|
+
const days = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'];
|
|
310
|
+
const activeDays = days.filter(day => Array.isArray(schedule.schedule[day]) &&
|
|
311
|
+
schedule.schedule[day].length > 0);
|
|
312
|
+
workingDays = activeDays.length > 0
|
|
313
|
+
? ` | Working days: ${activeDays.length}/7`
|
|
314
|
+
: ' | No working hours defined';
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
workingDays = ' | Schedule details unavailable';
|
|
318
|
+
}
|
|
319
|
+
return `- ${name} (${timezone})${workingDays}`;
|
|
320
|
+
};
|
|
321
|
+
return formatListResponse(schedules, `Found ${schedules.length} schedule${schedules.length === 1 ? '' : 's'}`, scheduleFormatter);
|
|
322
|
+
}
|
|
323
|
+
function formatStatusList(statuses) {
|
|
324
|
+
const statusFormatter = (status) => {
|
|
325
|
+
// Defensive programming for status object
|
|
326
|
+
if (!status) {
|
|
327
|
+
return '- Invalid status entry';
|
|
328
|
+
}
|
|
329
|
+
const name = status.name || 'Unnamed';
|
|
330
|
+
const flags = [];
|
|
331
|
+
if (status.isDefaultStatus) {
|
|
332
|
+
flags.push('Default');
|
|
333
|
+
}
|
|
334
|
+
if (status.isResolvedStatus) {
|
|
335
|
+
flags.push('Resolved');
|
|
336
|
+
}
|
|
337
|
+
const flagsStr = flags.length > 0 ? ` [${flags.join(', ')}]` : '';
|
|
338
|
+
return `- ${name}${flagsStr}`;
|
|
339
|
+
};
|
|
340
|
+
return formatListResponse(statuses, `Found ${statuses.length} status${statuses.length === 1 ? '' : 'es'}`, statusFormatter);
|
|
341
|
+
}
|
|
342
|
+
//# sourceMappingURL=responseFormatters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responseFormatters.js","sourceRoot":"","sources":["../../src/utils/responseFormatters.ts"],"names":[],"mappings":"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"}
|