@chykalophia/clickup-mcp-server 3.2.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 +21 -0
- package/README.md +467 -0
- package/bin/clickup-mcp-server-ai.js +9 -0
- package/bin/clickup-mcp-server-basic.js +9 -0
- package/bin/clickup-mcp-server-efficiency.js +9 -0
- package/bin/clickup-mcp-server-enhanced.js +9 -0
- package/build/app.d.ts +1 -0
- package/build/app.js +2 -0
- package/build/app.js.map +1 -0
- package/build/clickup-client/attachments-enhanced.d.ts +128 -0
- package/build/clickup-client/attachments-enhanced.js +212 -0
- package/build/clickup-client/attachments-enhanced.js.map +1 -0
- package/build/clickup-client/auth.d.ts +254 -0
- package/build/clickup-client/auth.js +105 -0
- package/build/clickup-client/auth.js.map +1 -0
- package/build/clickup-client/chat-enhanced.d.ts +141 -0
- package/build/clickup-client/chat-enhanced.js +196 -0
- package/build/clickup-client/chat-enhanced.js.map +1 -0
- package/build/clickup-client/checklists.d.ts +87 -0
- package/build/clickup-client/checklists.js +63 -0
- package/build/clickup-client/checklists.js.map +1 -0
- package/build/clickup-client/comments-enhanced.d.ts +176 -0
- package/build/clickup-client/comments-enhanced.js +230 -0
- package/build/clickup-client/comments-enhanced.js.map +1 -0
- package/build/clickup-client/comments.d.ts +173 -0
- package/build/clickup-client/comments.js +312 -0
- package/build/clickup-client/comments.js.map +1 -0
- package/build/clickup-client/custom-fields-enhanced.d.ts +286 -0
- package/build/clickup-client/custom-fields-enhanced.js +416 -0
- package/build/clickup-client/custom-fields-enhanced.js.map +1 -0
- package/build/clickup-client/dependencies-enhanced.d.ts +144 -0
- package/build/clickup-client/dependencies-enhanced.js +142 -0
- package/build/clickup-client/dependencies-enhanced.js.map +1 -0
- package/build/clickup-client/docs-enhanced.d.ts +176 -0
- package/build/clickup-client/docs-enhanced.js +374 -0
- package/build/clickup-client/docs-enhanced.js.map +1 -0
- package/build/clickup-client/docs.d.ts +84 -0
- package/build/clickup-client/docs.js +156 -0
- package/build/clickup-client/docs.js.map +1 -0
- package/build/clickup-client/folders.d.ts +62 -0
- package/build/clickup-client/folders.js +53 -0
- package/build/clickup-client/folders.js.map +1 -0
- package/build/clickup-client/goals-enhanced.d.ts +163 -0
- package/build/clickup-client/goals-enhanced.js +309 -0
- package/build/clickup-client/goals-enhanced.js.map +1 -0
- package/build/clickup-client/index.d.ts +16 -0
- package/build/clickup-client/index.js +61 -0
- package/build/clickup-client/index.js.map +1 -0
- package/build/clickup-client/lists.d.ts +105 -0
- package/build/clickup-client/lists.js +108 -0
- package/build/clickup-client/lists.js.map +1 -0
- package/build/clickup-client/secure-client.d.ts +88 -0
- package/build/clickup-client/secure-client.js +275 -0
- package/build/clickup-client/secure-client.js.map +1 -0
- package/build/clickup-client/spaces.d.ts +58 -0
- package/build/clickup-client/spaces.js +28 -0
- package/build/clickup-client/spaces.js.map +1 -0
- package/build/clickup-client/tasks.d.ts +161 -0
- package/build/clickup-client/tasks.js +99 -0
- package/build/clickup-client/tasks.js.map +1 -0
- package/build/clickup-client/time-tracking-enhanced.d.ts +153 -0
- package/build/clickup-client/time-tracking-enhanced.js +292 -0
- package/build/clickup-client/time-tracking-enhanced.js.map +1 -0
- package/build/clickup-client/views-enhanced.d.ts +149 -0
- package/build/clickup-client/views-enhanced.js +210 -0
- package/build/clickup-client/views-enhanced.js.map +1 -0
- package/build/clickup-client/webhooks-enhanced.d.ts +119 -0
- package/build/clickup-client/webhooks-enhanced.js +169 -0
- package/build/clickup-client/webhooks-enhanced.js.map +1 -0
- package/build/controllers/lists.controller.d.ts +1 -0
- package/build/controllers/lists.controller.js +2 -0
- package/build/controllers/lists.controller.js.map +1 -0
- package/build/index-efficiency-simple.d.ts +2 -0
- package/build/index-efficiency-simple.js +379 -0
- package/build/index-efficiency-simple.js.map +1 -0
- package/build/index-enhanced-efficiency.d.ts +2 -0
- package/build/index-enhanced-efficiency.js +275 -0
- package/build/index-enhanced-efficiency.js.map +1 -0
- package/build/index-enhanced.d.ts +2 -0
- package/build/index-enhanced.js +74 -0
- package/build/index-enhanced.js.map +1 -0
- package/build/index.d.ts +2 -0
- package/build/index.js +77 -0
- package/build/index.js.map +1 -0
- package/build/resources/checklist-resources.d.ts +2 -0
- package/build/resources/checklist-resources.js +102 -0
- package/build/resources/checklist-resources.js.map +1 -0
- package/build/resources/comment-resources.d.ts +2 -0
- package/build/resources/comment-resources.js +152 -0
- package/build/resources/comment-resources.js.map +1 -0
- package/build/resources/doc-resources.d.ts +2 -0
- package/build/resources/doc-resources.js +77 -0
- package/build/resources/doc-resources.js.map +1 -0
- package/build/resources/folder-resources.d.ts +2 -0
- package/build/resources/folder-resources.js +160 -0
- package/build/resources/folder-resources.js.map +1 -0
- package/build/resources/list-resources.d.ts +2 -0
- package/build/resources/list-resources.js +104 -0
- package/build/resources/list-resources.js.map +1 -0
- package/build/resources/space-resources.d.ts +2 -0
- package/build/resources/space-resources.js +104 -0
- package/build/resources/space-resources.js.map +1 -0
- package/build/resources/task-resources.d.ts +2 -0
- package/build/resources/task-resources.js +57 -0
- package/build/resources/task-resources.js.map +1 -0
- package/build/routes/lists.routes.d.ts +1 -0
- package/build/routes/lists.routes.js +2 -0
- package/build/routes/lists.routes.js.map +1 -0
- package/build/schemas/attachments-schemas.d.ts +201 -0
- package/build/schemas/attachments-schemas.js +250 -0
- package/build/schemas/attachments-schemas.js.map +1 -0
- package/build/schemas/chat-schemas.d.ts +478 -0
- package/build/schemas/chat-schemas.js +173 -0
- package/build/schemas/chat-schemas.js.map +1 -0
- package/build/schemas/custom-field-schemas.d.ts +1617 -0
- package/build/schemas/custom-field-schemas.js +384 -0
- package/build/schemas/custom-field-schemas.js.map +1 -0
- package/build/schemas/dependencies-schemas.d.ts +274 -0
- package/build/schemas/dependencies-schemas.js +176 -0
- package/build/schemas/dependencies-schemas.js.map +1 -0
- package/build/schemas/document-schemas.d.ts +433 -0
- package/build/schemas/document-schemas.js +168 -0
- package/build/schemas/document-schemas.js.map +1 -0
- package/build/schemas/goals-schemas.d.ts +961 -0
- package/build/schemas/goals-schemas.js +293 -0
- package/build/schemas/goals-schemas.js.map +1 -0
- package/build/schemas/time-tracking-schemas.d.ts +741 -0
- package/build/schemas/time-tracking-schemas.js +234 -0
- package/build/schemas/time-tracking-schemas.js.map +1 -0
- package/build/schemas/views-schemas.d.ts +1168 -0
- package/build/schemas/views-schemas.js +221 -0
- package/build/schemas/views-schemas.js.map +1 -0
- package/build/schemas/webhook-schemas.d.ts +1127 -0
- package/build/schemas/webhook-schemas.js +137 -0
- package/build/schemas/webhook-schemas.js.map +1 -0
- package/build/services/lists.service.d.ts +1 -0
- package/build/services/lists.service.js +2 -0
- package/build/services/lists.service.js.map +1 -0
- package/build/tools/attachments-tools-setup.d.ts +2 -0
- package/build/tools/attachments-tools-setup.js +387 -0
- package/build/tools/attachments-tools-setup.js.map +1 -0
- package/build/tools/chat-tools-enhanced.d.ts +5 -0
- package/build/tools/chat-tools-enhanced.js +396 -0
- package/build/tools/chat-tools-enhanced.js.map +1 -0
- package/build/tools/chat-tools.d.ts +2 -0
- package/build/tools/chat-tools.js +614 -0
- package/build/tools/chat-tools.js.map +1 -0
- package/build/tools/checklist-tools.d.ts +2 -0
- package/build/tools/checklist-tools.js +139 -0
- package/build/tools/checklist-tools.js.map +1 -0
- package/build/tools/comment-tools.d.ts +2 -0
- package/build/tools/comment-tools.js +295 -0
- package/build/tools/comment-tools.js.map +1 -0
- package/build/tools/custom-field-tools.d.ts +2 -0
- package/build/tools/custom-field-tools.js +578 -0
- package/build/tools/custom-field-tools.js.map +1 -0
- package/build/tools/dependencies-tools-setup.d.ts +2 -0
- package/build/tools/dependencies-tools-setup.js +319 -0
- package/build/tools/dependencies-tools-setup.js.map +1 -0
- package/build/tools/doc-tools-enhanced.d.ts +2 -0
- package/build/tools/doc-tools-enhanced.js +417 -0
- package/build/tools/doc-tools-enhanced.js.map +1 -0
- package/build/tools/doc-tools.d.ts +2 -0
- package/build/tools/doc-tools.js +109 -0
- package/build/tools/doc-tools.js.map +1 -0
- package/build/tools/goals-tools.d.ts +2 -0
- package/build/tools/goals-tools.js +422 -0
- package/build/tools/goals-tools.js.map +1 -0
- package/build/tools/helper-tools.d.ts +2 -0
- package/build/tools/helper-tools.js +363 -0
- package/build/tools/helper-tools.js.map +1 -0
- package/build/tools/space-tools.d.ts +2 -0
- package/build/tools/space-tools.js +45 -0
- package/build/tools/space-tools.js.map +1 -0
- package/build/tools/task-tools.d.ts +2 -0
- package/build/tools/task-tools.js +415 -0
- package/build/tools/task-tools.js.map +1 -0
- package/build/tools/time-tracking-tools.d.ts +2 -0
- package/build/tools/time-tracking-tools.js +329 -0
- package/build/tools/time-tracking-tools.js.map +1 -0
- package/build/tools/views-tools-setup.d.ts +2 -0
- package/build/tools/views-tools-setup.js +358 -0
- package/build/tools/views-tools-setup.js.map +1 -0
- package/build/tools/webhook-tools-setup.d.ts +2 -0
- package/build/tools/webhook-tools-setup.js +304 -0
- package/build/tools/webhook-tools-setup.js.map +1 -0
- package/build/tools/webhook-tools.d.ts +4 -0
- package/build/tools/webhook-tools.js +345 -0
- package/build/tools/webhook-tools.js.map +1 -0
- package/build/utils/clickup-comment-formatter.d.ts +124 -0
- package/build/utils/clickup-comment-formatter.js +504 -0
- package/build/utils/clickup-comment-formatter.js.map +1 -0
- package/build/utils/context-aware-suggestions.d.ts +45 -0
- package/build/utils/context-aware-suggestions.js +360 -0
- package/build/utils/context-aware-suggestions.js.map +1 -0
- package/build/utils/error-handling.d.ts +140 -0
- package/build/utils/error-handling.js +392 -0
- package/build/utils/error-handling.js.map +1 -0
- package/build/utils/markdown-styling.d.ts +40 -0
- package/build/utils/markdown-styling.js +344 -0
- package/build/utils/markdown-styling.js.map +1 -0
- package/build/utils/markdown.d.ts +54 -0
- package/build/utils/markdown.js +243 -0
- package/build/utils/markdown.js.map +1 -0
- package/build/utils/security.d.ts +79 -0
- package/build/utils/security.js +303 -0
- package/build/utils/security.js.map +1 -0
- package/build/utils/tool-efficiency.d.ts +59 -0
- package/build/utils/tool-efficiency.js +247 -0
- package/build/utils/tool-efficiency.js.map +1 -0
- package/package.json +130 -0
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Security utilities for the ClickUp MCP Server
|
|
4
|
+
*/
|
|
5
|
+
export interface RateLimitConfig {
|
|
6
|
+
windowMs: number;
|
|
7
|
+
maxRequests: number;
|
|
8
|
+
}
|
|
9
|
+
export declare const DEFAULT_RATE_LIMITS: Record<string, RateLimitConfig>;
|
|
10
|
+
declare class RateLimiter {
|
|
11
|
+
private requests;
|
|
12
|
+
isAllowed(key: string, config: RateLimitConfig): boolean;
|
|
13
|
+
reset(key?: string): void;
|
|
14
|
+
}
|
|
15
|
+
export declare const rateLimiter: RateLimiter;
|
|
16
|
+
/**
|
|
17
|
+
* Validate and sanitize API token
|
|
18
|
+
*/
|
|
19
|
+
export declare const validateApiToken: (token: string) => {
|
|
20
|
+
isValid: boolean;
|
|
21
|
+
error?: string;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Sanitize user input to prevent injection attacks
|
|
25
|
+
*/
|
|
26
|
+
export declare const sanitizeInput: (input: any) => any;
|
|
27
|
+
/**
|
|
28
|
+
* Validate webhook signature with timing-safe comparison
|
|
29
|
+
*/
|
|
30
|
+
export declare const validateWebhookSignature: (payload: string, signature: string, secret: string) => {
|
|
31
|
+
isValid: boolean;
|
|
32
|
+
error?: string;
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Validate file upload security
|
|
36
|
+
*/
|
|
37
|
+
export declare const validateFileUpload: (filename: string, mimetype?: string, size?: number) => {
|
|
38
|
+
isValid: boolean;
|
|
39
|
+
errors: string[];
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Validate URL for security
|
|
43
|
+
*/
|
|
44
|
+
export declare const validateUrl: (url: string) => {
|
|
45
|
+
isValid: boolean;
|
|
46
|
+
error?: string;
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Generate secure random string
|
|
50
|
+
*/
|
|
51
|
+
export declare const generateSecureToken: (length?: number) => string;
|
|
52
|
+
/**
|
|
53
|
+
* Hash sensitive data
|
|
54
|
+
*/
|
|
55
|
+
export declare const hashSensitiveData: (data: string, salt?: string) => string;
|
|
56
|
+
/**
|
|
57
|
+
* Validate environment variables
|
|
58
|
+
*/
|
|
59
|
+
export declare const validateEnvironment: () => {
|
|
60
|
+
isValid: boolean;
|
|
61
|
+
errors: string[];
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Security headers for HTTP responses
|
|
65
|
+
*/
|
|
66
|
+
export declare const getSecurityHeaders: () => Record<string, string>;
|
|
67
|
+
/**
|
|
68
|
+
* Log security events
|
|
69
|
+
*/
|
|
70
|
+
export declare const logSecurityEvent: (event: string, details: Record<string, any>, level?: 'info' | 'warn' | 'error') => void;
|
|
71
|
+
/**
|
|
72
|
+
* Validate MCP tool parameters
|
|
73
|
+
*/
|
|
74
|
+
export declare const validateMcpParameters: (schema: z.ZodSchema, params: any) => {
|
|
75
|
+
isValid: boolean;
|
|
76
|
+
data?: any;
|
|
77
|
+
errors?: string[];
|
|
78
|
+
};
|
|
79
|
+
export {};
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import crypto from 'crypto';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
// Default rate limits
|
|
4
|
+
export const DEFAULT_RATE_LIMITS = {
|
|
5
|
+
webhook: { windowMs: 60000, maxRequests: 100 }, // 100 requests per minute
|
|
6
|
+
api: { windowMs: 60000, maxRequests: 1000 }, // 1000 requests per minute
|
|
7
|
+
upload: { windowMs: 60000, maxRequests: 10 } // 10 uploads per minute
|
|
8
|
+
};
|
|
9
|
+
// Rate limiter implementation
|
|
10
|
+
class RateLimiter {
|
|
11
|
+
constructor() {
|
|
12
|
+
this.requests = new Map();
|
|
13
|
+
}
|
|
14
|
+
isAllowed(key, config) {
|
|
15
|
+
const now = Date.now();
|
|
16
|
+
const windowStart = now - config.windowMs;
|
|
17
|
+
// Get existing requests for this key
|
|
18
|
+
const keyRequests = this.requests.get(key) || [];
|
|
19
|
+
// Filter out old requests
|
|
20
|
+
const recentRequests = keyRequests.filter(time => time > windowStart);
|
|
21
|
+
// Check if under limit
|
|
22
|
+
if (recentRequests.length >= config.maxRequests) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
// Add current request
|
|
26
|
+
recentRequests.push(now);
|
|
27
|
+
this.requests.set(key, recentRequests);
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
reset(key) {
|
|
31
|
+
if (key) {
|
|
32
|
+
this.requests.delete(key);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
this.requests.clear();
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
export const rateLimiter = new RateLimiter();
|
|
40
|
+
/**
|
|
41
|
+
* Validate and sanitize API token
|
|
42
|
+
*/
|
|
43
|
+
export const validateApiToken = (token) => {
|
|
44
|
+
if (!token) {
|
|
45
|
+
return { isValid: false, error: 'API token is required' };
|
|
46
|
+
}
|
|
47
|
+
if (typeof token !== 'string') {
|
|
48
|
+
return { isValid: false, error: 'API token must be a string' };
|
|
49
|
+
}
|
|
50
|
+
if (token.length < 10) {
|
|
51
|
+
return { isValid: false, error: 'API token appears to be too short' };
|
|
52
|
+
}
|
|
53
|
+
if (token.length > 200) {
|
|
54
|
+
return { isValid: false, error: 'API token appears to be too long' };
|
|
55
|
+
}
|
|
56
|
+
// Check for suspicious patterns
|
|
57
|
+
if (token.includes(' ') || token.includes('\n') || token.includes('\t')) {
|
|
58
|
+
return { isValid: false, error: 'API token contains invalid characters' };
|
|
59
|
+
}
|
|
60
|
+
return { isValid: true };
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Sanitize user input to prevent injection attacks
|
|
64
|
+
*/
|
|
65
|
+
export const sanitizeInput = (input) => {
|
|
66
|
+
if (typeof input === 'string') {
|
|
67
|
+
// Remove potentially dangerous characters
|
|
68
|
+
return input
|
|
69
|
+
.replace(/[<>]/g, '') // Remove HTML tags
|
|
70
|
+
.replace(/javascript:/gi, '') // Remove javascript: protocol
|
|
71
|
+
.replace(/on\w+=/gi, '') // Remove event handlers
|
|
72
|
+
.trim();
|
|
73
|
+
}
|
|
74
|
+
if (Array.isArray(input)) {
|
|
75
|
+
return input.map(sanitizeInput);
|
|
76
|
+
}
|
|
77
|
+
if (input && typeof input === 'object') {
|
|
78
|
+
const sanitized = {};
|
|
79
|
+
for (const [key, value] of Object.entries(input)) {
|
|
80
|
+
sanitized[sanitizeInput(key)] = sanitizeInput(value);
|
|
81
|
+
}
|
|
82
|
+
return sanitized;
|
|
83
|
+
}
|
|
84
|
+
return input;
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* Validate webhook signature with timing-safe comparison
|
|
88
|
+
*/
|
|
89
|
+
export const validateWebhookSignature = (payload, signature, secret) => {
|
|
90
|
+
try {
|
|
91
|
+
if (!payload || !signature || !secret) {
|
|
92
|
+
return { isValid: false, error: 'Missing required parameters for signature validation' };
|
|
93
|
+
}
|
|
94
|
+
// Generate expected signature
|
|
95
|
+
const expectedSignature = crypto
|
|
96
|
+
.createHmac('sha256', secret)
|
|
97
|
+
.update(payload, 'utf8')
|
|
98
|
+
.digest('hex');
|
|
99
|
+
// Extract signature from header (remove 'sha256=' prefix if present)
|
|
100
|
+
const receivedSignature = signature.replace(/^sha256=/, '');
|
|
101
|
+
// Validate signature format
|
|
102
|
+
if (!/^[a-f0-9]{64}$/i.test(receivedSignature)) {
|
|
103
|
+
return { isValid: false, error: 'Invalid signature format' };
|
|
104
|
+
}
|
|
105
|
+
// Timing-safe comparison
|
|
106
|
+
const isValid = crypto.timingSafeEqual(Buffer.from(expectedSignature, 'hex'), Buffer.from(receivedSignature, 'hex'));
|
|
107
|
+
return { isValid };
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
return {
|
|
111
|
+
isValid: false,
|
|
112
|
+
error: `Signature validation error: ${error instanceof Error ? error.message : 'Unknown error'}`
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
/**
|
|
117
|
+
* Validate file upload security
|
|
118
|
+
*/
|
|
119
|
+
export const validateFileUpload = (filename, mimetype, size) => {
|
|
120
|
+
const errors = [];
|
|
121
|
+
// Validate filename
|
|
122
|
+
if (!filename || typeof filename !== 'string') {
|
|
123
|
+
errors.push('Filename is required and must be a string');
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
// Check for path traversal attempts
|
|
127
|
+
if (filename.includes('..') || filename.includes('/') || filename.includes('\\')) {
|
|
128
|
+
errors.push('Filename contains invalid path characters');
|
|
129
|
+
}
|
|
130
|
+
// Check for dangerous extensions
|
|
131
|
+
const dangerousExtensions = [
|
|
132
|
+
'.exe', '.bat', '.cmd', '.com', '.pif', '.scr', '.vbs', '.js', '.jar',
|
|
133
|
+
'.php', '.asp', '.aspx', '.jsp', '.sh', '.ps1', '.py', '.rb'
|
|
134
|
+
];
|
|
135
|
+
const extension = filename.toLowerCase().split('.').pop();
|
|
136
|
+
if (extension && dangerousExtensions.includes(`.${extension}`)) {
|
|
137
|
+
errors.push('File type not allowed for security reasons');
|
|
138
|
+
}
|
|
139
|
+
// Check filename length
|
|
140
|
+
if (filename.length > 255) {
|
|
141
|
+
errors.push('Filename too long (max 255 characters)');
|
|
142
|
+
}
|
|
143
|
+
// Check for null bytes
|
|
144
|
+
if (filename.includes('\0')) {
|
|
145
|
+
errors.push('Filename contains null bytes');
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
// Validate mimetype if provided
|
|
149
|
+
if (mimetype) {
|
|
150
|
+
const allowedMimetypes = [
|
|
151
|
+
// Images
|
|
152
|
+
'image/jpeg', 'image/png', 'image/gif', 'image/webp', 'image/svg+xml',
|
|
153
|
+
// Documents
|
|
154
|
+
'application/pdf', 'text/plain', 'text/csv',
|
|
155
|
+
'application/msword', 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
|
|
156
|
+
'application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
|
157
|
+
'application/vnd.ms-powerpoint', 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
|
|
158
|
+
// Archives
|
|
159
|
+
'application/zip', 'application/x-rar-compressed', 'application/x-7z-compressed',
|
|
160
|
+
// Media
|
|
161
|
+
'video/mp4', 'video/webm', 'audio/mp3', 'audio/wav', 'audio/ogg'
|
|
162
|
+
];
|
|
163
|
+
if (!allowedMimetypes.includes(mimetype)) {
|
|
164
|
+
errors.push(`Mimetype '${mimetype}' not allowed`);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
// Validate file size if provided (max 100MB)
|
|
168
|
+
if (size !== undefined) {
|
|
169
|
+
const maxSize = 100 * 1024 * 1024; // 100MB
|
|
170
|
+
if (size > maxSize) {
|
|
171
|
+
errors.push(`File size too large (max ${maxSize} bytes)`);
|
|
172
|
+
}
|
|
173
|
+
if (size < 0) {
|
|
174
|
+
errors.push('Invalid file size');
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return {
|
|
178
|
+
isValid: errors.length === 0,
|
|
179
|
+
errors
|
|
180
|
+
};
|
|
181
|
+
};
|
|
182
|
+
/**
|
|
183
|
+
* Validate URL for security
|
|
184
|
+
*/
|
|
185
|
+
export const validateUrl = (url) => {
|
|
186
|
+
try {
|
|
187
|
+
const parsedUrl = new URL(url);
|
|
188
|
+
// Only allow HTTP and HTTPS
|
|
189
|
+
if (!['http:', 'https:'].includes(parsedUrl.protocol)) {
|
|
190
|
+
return { isValid: false, error: 'Only HTTP and HTTPS URLs are allowed' };
|
|
191
|
+
}
|
|
192
|
+
// Block localhost and private IPs for security
|
|
193
|
+
const hostname = parsedUrl.hostname.toLowerCase();
|
|
194
|
+
if (hostname === 'localhost' ||
|
|
195
|
+
hostname === '127.0.0.1' ||
|
|
196
|
+
hostname === '::1' ||
|
|
197
|
+
hostname.startsWith('192.168.') ||
|
|
198
|
+
hostname.startsWith('10.') ||
|
|
199
|
+
hostname.startsWith('172.16.') ||
|
|
200
|
+
hostname.startsWith('172.17.') ||
|
|
201
|
+
hostname.startsWith('172.18.') ||
|
|
202
|
+
hostname.startsWith('172.19.') ||
|
|
203
|
+
hostname.startsWith('172.2') ||
|
|
204
|
+
hostname.startsWith('172.30.') ||
|
|
205
|
+
hostname.startsWith('172.31.')) {
|
|
206
|
+
return { isValid: false, error: 'Private and localhost URLs are not allowed' };
|
|
207
|
+
}
|
|
208
|
+
return { isValid: true };
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
return { isValid: false, error: 'Invalid URL format' };
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
/**
|
|
215
|
+
* Generate secure random string
|
|
216
|
+
*/
|
|
217
|
+
export const generateSecureToken = (length = 32) => {
|
|
218
|
+
return crypto.randomBytes(length).toString('hex');
|
|
219
|
+
};
|
|
220
|
+
/**
|
|
221
|
+
* Hash sensitive data
|
|
222
|
+
*/
|
|
223
|
+
export const hashSensitiveData = (data, salt) => {
|
|
224
|
+
const actualSalt = salt || crypto.randomBytes(16).toString('hex');
|
|
225
|
+
return crypto.pbkdf2Sync(data, actualSalt, 10000, 64, 'sha512').toString('hex');
|
|
226
|
+
};
|
|
227
|
+
/**
|
|
228
|
+
* Validate environment variables
|
|
229
|
+
*/
|
|
230
|
+
export const validateEnvironment = () => {
|
|
231
|
+
const errors = [];
|
|
232
|
+
// Check required environment variables
|
|
233
|
+
const requiredVars = ['CLICKUP_API_TOKEN'];
|
|
234
|
+
for (const varName of requiredVars) {
|
|
235
|
+
const value = process.env[varName];
|
|
236
|
+
if (!value) {
|
|
237
|
+
errors.push(`Missing required environment variable: ${varName}`);
|
|
238
|
+
}
|
|
239
|
+
else {
|
|
240
|
+
// Validate API token format
|
|
241
|
+
if (varName === 'CLICKUP_API_TOKEN') {
|
|
242
|
+
const validation = validateApiToken(value);
|
|
243
|
+
if (!validation.isValid) {
|
|
244
|
+
errors.push(`Invalid ${varName}: ${validation.error}`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return {
|
|
250
|
+
isValid: errors.length === 0,
|
|
251
|
+
errors
|
|
252
|
+
};
|
|
253
|
+
};
|
|
254
|
+
/**
|
|
255
|
+
* Security headers for HTTP responses
|
|
256
|
+
*/
|
|
257
|
+
export const getSecurityHeaders = () => {
|
|
258
|
+
return {
|
|
259
|
+
'X-Content-Type-Options': 'nosniff',
|
|
260
|
+
'X-Frame-Options': 'DENY',
|
|
261
|
+
'X-XSS-Protection': '1; mode=block',
|
|
262
|
+
'Strict-Transport-Security': 'max-age=31536000; includeSubDomains',
|
|
263
|
+
'Content-Security-Policy': "default-src 'self'",
|
|
264
|
+
'Referrer-Policy': 'strict-origin-when-cross-origin'
|
|
265
|
+
};
|
|
266
|
+
};
|
|
267
|
+
/**
|
|
268
|
+
* Log security events
|
|
269
|
+
*/
|
|
270
|
+
export const logSecurityEvent = (event, details, level = 'info') => {
|
|
271
|
+
const timestamp = new Date().toISOString();
|
|
272
|
+
const logEntry = {
|
|
273
|
+
timestamp,
|
|
274
|
+
event,
|
|
275
|
+
level,
|
|
276
|
+
details: sanitizeInput(details)
|
|
277
|
+
};
|
|
278
|
+
// In production, this should go to a proper logging system
|
|
279
|
+
console.error(`[SECURITY ${level.toUpperCase()}] ${timestamp}: ${event}`, logEntry);
|
|
280
|
+
};
|
|
281
|
+
/**
|
|
282
|
+
* Validate MCP tool parameters
|
|
283
|
+
*/
|
|
284
|
+
export const validateMcpParameters = (schema, params) => {
|
|
285
|
+
try {
|
|
286
|
+
// Sanitize input first
|
|
287
|
+
const sanitizedParams = sanitizeInput(params);
|
|
288
|
+
// Validate with schema
|
|
289
|
+
const data = schema.parse(sanitizedParams);
|
|
290
|
+
return { isValid: true, data };
|
|
291
|
+
}
|
|
292
|
+
catch (error) {
|
|
293
|
+
if (error instanceof z.ZodError) {
|
|
294
|
+
const errors = error.errors.map(err => `${err.path.join('.')}: ${err.message}`);
|
|
295
|
+
return { isValid: false, errors };
|
|
296
|
+
}
|
|
297
|
+
return {
|
|
298
|
+
isValid: false,
|
|
299
|
+
errors: [`Validation error: ${error instanceof Error ? error.message : 'Unknown error'}`]
|
|
300
|
+
};
|
|
301
|
+
}
|
|
302
|
+
};
|
|
303
|
+
//# sourceMappingURL=security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.js","sourceRoot":"","sources":["../../src/utils/security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Efficiency and Metadata System
|
|
3
|
+
* Provides intelligent tool suggestions and efficiency hints for better AI decision making
|
|
4
|
+
*/
|
|
5
|
+
export interface ToolMetadata {
|
|
6
|
+
name: string;
|
|
7
|
+
category: 'core' | 'search' | 'bulk' | 'helper' | 'advanced';
|
|
8
|
+
efficiency: 'direct' | 'hierarchical' | 'bulk' | 'search';
|
|
9
|
+
use_cases: string[];
|
|
10
|
+
alternatives: string[];
|
|
11
|
+
efficiency_hint?: string;
|
|
12
|
+
prerequisites?: string[];
|
|
13
|
+
related_tools?: string[];
|
|
14
|
+
performance_impact: 'low' | 'medium' | 'high';
|
|
15
|
+
}
|
|
16
|
+
export interface ToolSuggestion {
|
|
17
|
+
primary_tools: string[];
|
|
18
|
+
alternative_tools: string[];
|
|
19
|
+
efficiency_notes: string[];
|
|
20
|
+
workflow_hint: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Tool categories and their efficiency characteristics
|
|
24
|
+
*/
|
|
25
|
+
export declare const TOOL_CATEGORIES: {
|
|
26
|
+
DIRECT: {
|
|
27
|
+
chat: string[];
|
|
28
|
+
tasks: string[];
|
|
29
|
+
search: string[];
|
|
30
|
+
bulk: string[];
|
|
31
|
+
};
|
|
32
|
+
HIERARCHICAL: {
|
|
33
|
+
navigation: string[];
|
|
34
|
+
discovery: string[];
|
|
35
|
+
};
|
|
36
|
+
HELPERS: {
|
|
37
|
+
suggestions: string[];
|
|
38
|
+
validation: string[];
|
|
39
|
+
};
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* Comprehensive tool metadata registry
|
|
43
|
+
*/
|
|
44
|
+
export declare const TOOL_METADATA: Record<string, ToolMetadata>;
|
|
45
|
+
/**
|
|
46
|
+
* Analyzes a user request and suggests the most efficient tools
|
|
47
|
+
*/
|
|
48
|
+
export declare function suggestToolsForTask(request: string): ToolSuggestion;
|
|
49
|
+
/**
|
|
50
|
+
* Finds chat channels efficiently
|
|
51
|
+
*/
|
|
52
|
+
export declare function getChatChannelDiscoveryStrategy(): ToolSuggestion;
|
|
53
|
+
/**
|
|
54
|
+
* Gets efficiency rating for a tool combination
|
|
55
|
+
*/
|
|
56
|
+
export declare function getEfficiencyRating(tools: string[]): {
|
|
57
|
+
rating: 'excellent' | 'good' | 'fair' | 'poor';
|
|
58
|
+
suggestions: string[];
|
|
59
|
+
};
|