@payloadcms/plugin-mcp 3.78.0-canary.1 → 3.78.0-canary.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/mcp/helpers/config.d.ts +1 -9
  2. package/dist/mcp/helpers/config.d.ts.map +1 -1
  3. package/dist/mcp/helpers/config.js +0 -62
  4. package/dist/mcp/helpers/config.js.map +1 -1
  5. package/dist/mcp/helpers/fields.d.ts +6 -25
  6. package/dist/mcp/helpers/fields.d.ts.map +1 -1
  7. package/dist/mcp/helpers/fields.js +35 -29
  8. package/dist/mcp/helpers/fields.js.map +1 -1
  9. package/dist/mcp/helpers/fileValidation.d.ts +0 -2
  10. package/dist/mcp/helpers/fileValidation.d.ts.map +1 -1
  11. package/dist/mcp/helpers/fileValidation.js +44 -82
  12. package/dist/mcp/helpers/fileValidation.js.map +1 -1
  13. package/dist/mcp/tools/collection/create.d.ts.map +1 -1
  14. package/dist/mcp/tools/collection/create.js +2 -25
  15. package/dist/mcp/tools/collection/create.js.map +1 -1
  16. package/dist/mcp/tools/collection/delete.d.ts.map +1 -1
  17. package/dist/mcp/tools/collection/delete.js +1 -12
  18. package/dist/mcp/tools/collection/delete.js.map +1 -1
  19. package/dist/mcp/tools/config/update.d.ts +1 -1
  20. package/dist/mcp/tools/config/update.d.ts.map +1 -1
  21. package/dist/mcp/tools/config/update.js +3 -3
  22. package/dist/mcp/tools/config/update.js.map +1 -1
  23. package/dist/mcp/tools/job/create.d.ts.map +1 -1
  24. package/dist/mcp/tools/job/create.js +3 -6
  25. package/dist/mcp/tools/job/create.js.map +1 -1
  26. package/dist/mcp/tools/job/run.d.ts +1 -1
  27. package/dist/mcp/tools/job/run.d.ts.map +1 -1
  28. package/dist/mcp/tools/job/run.js +5 -26
  29. package/dist/mcp/tools/job/run.js.map +1 -1
  30. package/dist/mcp/tools/job/update.d.ts.map +1 -1
  31. package/dist/mcp/tools/job/update.js +10 -38
  32. package/dist/mcp/tools/job/update.js.map +1 -1
  33. package/dist/mcp/tools/schemas.d.ts +0 -3
  34. package/dist/mcp/tools/schemas.d.ts.map +1 -1
  35. package/dist/mcp/tools/schemas.js +0 -1
  36. package/dist/mcp/tools/schemas.js.map +1 -1
  37. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.d.ts.map +1 -1
  38. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js +1 -2
  39. package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js.map +1 -1
  40. package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts +5 -0
  41. package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts.map +1 -1
  42. package/dist/utils/schemaConversion/sanitizeJsonSchema.js +38 -0
  43. package/dist/utils/schemaConversion/sanitizeJsonSchema.js.map +1 -1
  44. package/package.json +3 -3
  45. package/src/mcp/helpers/config.ts +1 -114
  46. package/src/mcp/helpers/fields.ts +46 -50
  47. package/src/mcp/helpers/fileValidation.ts +38 -93
  48. package/src/mcp/tools/collection/create.ts +2 -30
  49. package/src/mcp/tools/collection/delete.ts +1 -19
  50. package/src/mcp/tools/config/update.ts +0 -4
  51. package/src/mcp/tools/job/create.ts +5 -11
  52. package/src/mcp/tools/job/run.ts +14 -38
  53. package/src/mcp/tools/job/update.ts +29 -77
  54. package/src/mcp/tools/schemas.ts +0 -1
  55. package/src/utils/schemaConversion/convertCollectionSchemaToZod.ts +1 -3
  56. package/src/utils/schemaConversion/sanitizeJsonSchema.ts +41 -0
  57. package/dist/mcp/helpers/conversion.d.ts +0 -2
  58. package/dist/mcp/helpers/conversion.d.ts.map +0 -1
  59. package/dist/mcp/helpers/conversion.js +0 -5
  60. package/dist/mcp/helpers/conversion.js.map +0 -1
  61. package/dist/mcp/helpers/validation.d.ts +0 -9
  62. package/dist/mcp/helpers/validation.d.ts.map +0 -1
  63. package/dist/mcp/helpers/validation.js +0 -22
  64. package/dist/mcp/helpers/validation.js.map +0 -1
  65. package/src/mcp/helpers/conversion.ts +0 -3
  66. package/src/mcp/helpers/validation.ts +0 -32
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/mcp/helpers/fileValidation.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\nimport { existsSync } from 'fs'\nimport { join } from 'path'\n\nexport type ValidationType = 'collection' | 'task' | 'workflow'\n\nexport interface ValidationResult<T = unknown> {\n config?: T\n error?: string\n success: boolean\n}\n\n// Custom task config interface that matches what we're creating\nexport interface TaskConfig {\n handler: (args: {\n input: Record<string, unknown>\n job: Record<string, unknown>\n tasks: Record<string, unknown>\n }) => Record<string, unknown>\n inputSchema?: Array<{\n label?: string\n name: string\n options?: Array<{ label: string; value: string }>\n required?: boolean\n type: string\n }>\n label?: string\n outputSchema?: Array<{\n label?: string\n name: string\n options?: Array<{ label: string; value: string }>\n required?: boolean\n type: string\n }>\n retries?: number\n slug: string\n}\n\n// Custom workflow config interface that matches what we're creating\nexport interface WorkflowConfig {\n handler: (args: {\n input: Record<string, unknown>\n job: Record<string, unknown>\n tasks: Record<string, unknown>\n }) => void\n inputSchema?: Array<{\n label?: string\n name: string\n options?: Array<{ label: string; value: string }>\n required?: boolean\n type: string\n }>\n label?: string\n queue?: string\n retries?: number\n slug: string\n}\n\n/**\n * Generic validation function for Payload configuration files\n * @param fileName - The name of the file (e.g., 'Users.ts', 'my-task.ts')\n * @param type - The type of validation to perform ('collection', 'task', or 'workflow')\n * @returns Object containing success status and any error messages\n */\nexport const validatePayloadFile = async <T = CollectionConfig | TaskConfig | WorkflowConfig>(\n fileName: string,\n type: ValidationType,\n): Promise<ValidationResult<T>> => {\n try {\n const basePath = type === 'collection' ? 'collections' : type === 'task' ? 'tasks' : 'workflows'\n const fullPath = join(process.cwd(), 'src', basePath)\n const filePath = join(fullPath, fileName)\n\n // Check if file exists\n if (!existsSync(filePath)) {\n return {\n error: `${type} file does not exist: ${fileName}`,\n success: false,\n }\n }\n\n // Clear require cache to ensure fresh import\n delete require.cache[filePath]\n\n // Use relative path for webpack compatibility\n const moduleName = fileName.replace('.ts', '')\n const relativePath = `../${basePath}/${moduleName}`\n\n // Dynamic import with relative path\n const importedModule = await import(/* webpackIgnore: true */ relativePath)\n\n // Get the configuration based on type\n let config: T | undefined\n\n if (type === 'collection') {\n config = getCollectionConfig(importedModule, moduleName) as T\n } else if (type === 'task') {\n config = getTaskConfig(importedModule) as T\n } else if (type === 'workflow') {\n config = getWorkflowConfig(importedModule) as T\n }\n\n if (!config) {\n return {\n error: `${type} file does not export a valid ${type} config`,\n success: false,\n }\n }\n\n // Validate the configuration\n let validationResult: ValidationResult<unknown>\n if (type === 'collection') {\n validationResult = validateCollectionConfig(config as unknown as CollectionConfig)\n } else if (type === 'task') {\n validationResult = validateTaskConfig(config as unknown as TaskConfig)\n } else if (type === 'workflow') {\n validationResult = validateWorkflowConfig(config as unknown as WorkflowConfig)\n } else {\n return {\n error: `Unknown validation type: ${type}`,\n success: false,\n }\n }\n\n if (!validationResult.success) {\n return validationResult as ValidationResult<T>\n }\n\n return {\n config,\n success: true,\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error during validation'\n return {\n error: `Failed to validate ${type} file: ${errorMessage}`,\n success: false,\n }\n }\n}\n\n/**\n * Extract collection configuration from module exports\n */\nfunction getCollectionConfig(\n importedModule: Record<string, unknown>,\n moduleName: string,\n): CollectionConfig | undefined {\n if (importedModule.default) {\n return importedModule.default as CollectionConfig\n }\n\n if (importedModule[moduleName]) {\n return importedModule[moduleName] as CollectionConfig\n }\n\n return undefined\n}\n\n/**\n * Extract task configuration from module exports\n */\nfunction getTaskConfig(importedModule: Record<string, unknown>): TaskConfig | undefined {\n // First check for default export\n if (importedModule.default) {\n return importedModule.default as TaskConfig\n }\n\n // Look for named exports ending with \"Task\"\n const exportNames = Object.keys(importedModule)\n const taskExport = exportNames.find((name) => name.endsWith('Task'))\n\n if (taskExport) {\n return importedModule[taskExport] as TaskConfig\n }\n\n return undefined\n}\n\n/**\n * Extract workflow configuration from module exports\n */\nfunction getWorkflowConfig(importedModule: Record<string, unknown>): undefined | WorkflowConfig {\n // First check for default export\n if (importedModule.default) {\n return importedModule.default as WorkflowConfig\n }\n\n // Look for named exports ending with \"Workflow\"\n const exportNames = Object.keys(importedModule)\n const workflowExport = exportNames.find((name) => name.endsWith('Workflow'))\n\n if (workflowExport) {\n return importedModule[workflowExport] as WorkflowConfig\n }\n\n return undefined\n}\n\n/**\n * Validate collection configuration structure\n */\nfunction validateCollectionConfig(config: CollectionConfig): ValidationResult<CollectionConfig> {\n if (!config) {\n return {\n error: 'Collection config is not a valid object',\n success: false,\n }\n }\n\n if (!config.slug) {\n return {\n error: 'Collection config must have a valid slug property',\n success: false,\n }\n }\n\n // Validate each field has required properties\n if (config.fields) {\n for (let i = 0; i < config.fields.length; i++) {\n const field = config.fields[i] as Record<string, unknown>\n if (!field) {\n return {\n error: `Field at index ${i} is not a valid object`,\n success: false,\n }\n }\n\n // Check if field has type property\n if ('type' in field && field.type) {\n return {\n error: `Field at index ${i} has invalid type property`,\n success: false,\n }\n }\n }\n }\n\n return { config, success: true }\n}\n\n/**\n * Validate task configuration structure\n */\nfunction validateTaskConfig(config: TaskConfig): ValidationResult<TaskConfig> {\n if (!config) {\n return {\n error: 'Task config is not a valid object',\n success: false,\n }\n }\n\n if (!config.slug) {\n return {\n error: 'Task config must have a valid slug property',\n success: false,\n }\n }\n\n if (!config.handler) {\n return {\n error: 'Task config must have a valid handler function',\n success: false,\n }\n }\n\n // Validate optional properties\n if (config.retries !== undefined && config.retries < 0) {\n return {\n error: 'Task config retries must be a non-negative number',\n success: false,\n }\n }\n\n // Validate schemas if present\n if (config.inputSchema && Array.isArray(config.inputSchema)) {\n for (let i = 0; i < config.inputSchema.length; i++) {\n const field = config.inputSchema[i]\n if (!field) {\n return {\n error: `Input schema field at index ${i} is not a valid object`,\n success: false,\n }\n }\n\n if (!field.name) {\n return {\n error: `Input schema field at index ${i} must have a valid name property`,\n success: false,\n }\n }\n\n if (!field.type) {\n return {\n error: `Input schema field at index ${i} must have a valid type property`,\n success: false,\n }\n }\n }\n }\n\n if (config.outputSchema && Array.isArray(config.outputSchema)) {\n for (let i = 0; i < config.outputSchema.length; i++) {\n const field = config.outputSchema[i]\n if (!field) {\n return {\n error: `Output schema field at index ${i} is not a valid object`,\n success: false,\n }\n }\n\n if (!field.name) {\n return {\n error: `Output schema field at index ${i} must have a valid name property`,\n success: false,\n }\n }\n\n if (!field.type) {\n return {\n error: `Output schema field at index ${i} must have a valid type property`,\n success: false,\n }\n }\n }\n }\n\n return { config, success: true }\n}\n\n/**\n * Validate workflow configuration structure\n */\nfunction validateWorkflowConfig(config: WorkflowConfig): ValidationResult<WorkflowConfig> {\n if (!config) {\n return {\n error: 'Workflow config is not a valid object',\n success: false,\n }\n }\n\n if (!config.slug) {\n return {\n error: 'Workflow config must have a valid slug property',\n success: false,\n }\n }\n\n if (!config.handler) {\n return {\n error: 'Workflow config must have a valid handler function',\n success: false,\n }\n }\n\n // Validate optional properties\n if (config.queue) {\n return {\n error: 'Workflow config queue must be a string',\n success: false,\n }\n }\n\n if (config.retries !== undefined && config.retries < 0) {\n return {\n error: 'Workflow config retries must be a non-negative number',\n success: false,\n }\n }\n\n // Validate schema if present\n if (config.inputSchema && Array.isArray(config.inputSchema)) {\n for (let i = 0; i < config.inputSchema.length; i++) {\n const field = config.inputSchema[i]\n if (!field) {\n return {\n error: `Input schema field at index ${i} is not a valid object`,\n success: false,\n }\n }\n\n if (!field.name) {\n return {\n error: `Input schema field at index ${i} must have a valid name property`,\n success: false,\n }\n }\n\n if (!field.type) {\n return {\n error: `Input schema field at index ${i} must have a valid type property`,\n success: false,\n }\n }\n }\n }\n\n return { config, success: true }\n}\n\n// Convenience functions for backward compatibility\nexport const validateCollectionFile = async (\n fileName: string,\n): Promise<ValidationResult<CollectionConfig>> => {\n return validatePayloadFile<CollectionConfig>(fileName, 'collection')\n}\n\nexport const validateTaskFile = async (fileName: string): Promise<ValidationResult<TaskConfig>> => {\n return validatePayloadFile<TaskConfig>(fileName, 'task')\n}\n\nexport const validateWorkflowFile = async (\n fileName: string,\n): Promise<ValidationResult<WorkflowConfig>> => {\n return validatePayloadFile<WorkflowConfig>(fileName, 'workflow')\n}\n"],"names":["existsSync","join","validatePayloadFile","fileName","type","basePath","fullPath","process","cwd","filePath","error","success","require","cache","moduleName","replace","relativePath","importedModule","config","getCollectionConfig","getTaskConfig","getWorkflowConfig","validationResult","validateCollectionConfig","validateTaskConfig","validateWorkflowConfig","errorMessage","Error","message","default","undefined","exportNames","Object","keys","taskExport","find","name","endsWith","workflowExport","slug","fields","i","length","field","handler","retries","inputSchema","Array","isArray","outputSchema","queue","validateCollectionFile","validateTaskFile","validateWorkflowFile"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/mcp/helpers/fileValidation.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\nimport { existsSync } from 'fs'\nimport { join } from 'path'\n\nexport type ValidationType = 'collection' | 'task' | 'workflow'\n\nexport interface ValidationResult<T = unknown> {\n config?: T\n error?: string\n success: boolean\n}\n\n// Custom task config interface that matches what we're creating\nexport interface TaskConfig {\n handler: (args: {\n input: Record<string, unknown>\n job: Record<string, unknown>\n tasks: Record<string, unknown>\n }) => Record<string, unknown>\n inputSchema?: Array<{\n label?: string\n name: string\n options?: Array<{ label: string; value: string }>\n required?: boolean\n type: string\n }>\n label?: string\n outputSchema?: Array<{\n label?: string\n name: string\n options?: Array<{ label: string; value: string }>\n required?: boolean\n type: string\n }>\n retries?: number\n slug: string\n}\n\n// Custom workflow config interface that matches what we're creating\nexport interface WorkflowConfig {\n handler: (args: {\n input: Record<string, unknown>\n job: Record<string, unknown>\n tasks: Record<string, unknown>\n }) => void\n inputSchema?: Array<{\n label?: string\n name: string\n options?: Array<{ label: string; value: string }>\n required?: boolean\n type: string\n }>\n label?: string\n queue?: string\n retries?: number\n slug: string\n}\n\n/**\n * Generic validation function for Payload configuration files\n * @param fileName - The name of the file (e.g., 'Users.ts', 'my-task.ts')\n * @param type - The type of validation to perform ('collection', 'task', or 'workflow')\n * @returns Object containing success status and any error messages\n */\nexport const validatePayloadFile = async <T = CollectionConfig | TaskConfig | WorkflowConfig>(\n fileName: string,\n type: ValidationType,\n): Promise<ValidationResult<T>> => {\n try {\n const basePath = type === 'collection' ? 'collections' : type === 'task' ? 'tasks' : 'workflows'\n const fullPath = join(process.cwd(), 'src', basePath)\n const filePath = join(fullPath, fileName)\n\n // Check if file exists\n if (!existsSync(filePath)) {\n return {\n error: `${type} file does not exist: ${fileName}`,\n success: false,\n }\n }\n\n // Clear require cache to ensure fresh import\n delete require.cache[filePath]\n\n // Use relative path for webpack compatibility\n const moduleName = fileName.replace('.ts', '')\n const relativePath = `../${basePath}/${moduleName}`\n\n // Dynamic import with relative path\n const importedModule = await import(/* webpackIgnore: true */ relativePath)\n\n // Get the configuration based on type\n let config: T | undefined\n\n if (type === 'collection') {\n config = getCollectionConfig(importedModule, moduleName) as T\n } else if (type === 'task') {\n config = getTaskConfig(importedModule) as T\n } else if (type === 'workflow') {\n config = getWorkflowConfig(importedModule) as T\n }\n\n if (!config) {\n return {\n error: `${type} file does not export a valid ${type} config`,\n success: false,\n }\n }\n\n // Validate the configuration\n let validationResult: ValidationResult<unknown>\n if (type === 'collection') {\n validationResult = validateCollectionConfig(config as unknown as CollectionConfig)\n } else if (type === 'task') {\n validationResult = validateTaskConfig(config as unknown as TaskConfig)\n } else if (type === 'workflow') {\n validationResult = validateWorkflowConfig(config as unknown as WorkflowConfig)\n } else {\n return {\n error: `Unknown validation type: ${type}`,\n success: false,\n }\n }\n\n if (!validationResult.success) {\n return validationResult as ValidationResult<T>\n }\n\n return {\n config,\n success: true,\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error during validation'\n return {\n error: `Failed to validate ${type} file: ${errorMessage}`,\n success: false,\n }\n }\n}\n\n/**\n * Extract collection configuration from module exports\n */\nfunction getCollectionConfig(\n importedModule: Record<string, unknown>,\n moduleName: string,\n): CollectionConfig | undefined {\n if (importedModule.default) {\n return importedModule.default as CollectionConfig\n }\n\n if (importedModule[moduleName]) {\n return importedModule[moduleName] as CollectionConfig\n }\n\n return undefined\n}\n\n/**\n * Extract task configuration from module exports\n */\nfunction getTaskConfig(importedModule: Record<string, unknown>): TaskConfig | undefined {\n // First check for default export\n if (importedModule.default) {\n return importedModule.default as TaskConfig\n }\n\n // Look for named exports ending with \"Task\"\n const exportNames = Object.keys(importedModule)\n const taskExport = exportNames.find((name) => name.endsWith('Task'))\n\n if (taskExport) {\n return importedModule[taskExport] as TaskConfig\n }\n\n return undefined\n}\n\n/**\n * Extract workflow configuration from module exports\n */\nfunction getWorkflowConfig(importedModule: Record<string, unknown>): undefined | WorkflowConfig {\n // First check for default export\n if (importedModule.default) {\n return importedModule.default as WorkflowConfig\n }\n\n // Look for named exports ending with \"Workflow\"\n const exportNames = Object.keys(importedModule)\n const workflowExport = exportNames.find((name) => name.endsWith('Workflow'))\n\n if (workflowExport) {\n return importedModule[workflowExport] as WorkflowConfig\n }\n\n return undefined\n}\n\n/**\n * Validate collection configuration structure\n */\nfunction validateCollectionConfig(config: CollectionConfig): ValidationResult<CollectionConfig> {\n if (!config) {\n return {\n error: 'Collection config is not a valid object',\n success: false,\n }\n }\n\n if (!config.slug) {\n return {\n error: 'Collection config must have a valid slug property',\n success: false,\n }\n }\n\n // Validate each field has required properties\n if (config.fields) {\n for (let i = 0; i < config.fields.length; i++) {\n const field = config.fields[i]\n if (!field || typeof field !== 'object') {\n return {\n error: `Field at index ${i} is not a valid object`,\n success: false,\n }\n }\n\n // Check if field has type property\n if (!('type' in field) || !field.type) {\n return {\n error: `Field at index ${i} is missing a valid type property`,\n success: false,\n }\n }\n }\n }\n\n return { config, success: true }\n}\n\n/**\n * Validates an array of schema fields (inputSchema / outputSchema).\n * Returns an error string on the first invalid field, or null if all fields are valid.\n */\nfunction validateSchemaFields(fields: TaskConfig['inputSchema'], label: string): null | string {\n if (!fields || !Array.isArray(fields)) {\n return null\n }\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i]\n if (!field) {\n return `${label} field at index ${i} is not a valid object`\n }\n if (!field.name) {\n return `${label} field at index ${i} must have a valid name property`\n }\n if (!field.type) {\n return `${label} field at index ${i} must have a valid type property`\n }\n }\n return null\n}\n\n/**\n * Validate task configuration structure\n */\nfunction validateTaskConfig(config: TaskConfig): ValidationResult<TaskConfig> {\n if (!config) {\n return {\n error: 'Task config is not a valid object',\n success: false,\n }\n }\n\n if (!config.slug) {\n return {\n error: 'Task config must have a valid slug property',\n success: false,\n }\n }\n\n if (!config.handler) {\n return {\n error: 'Task config must have a valid handler function',\n success: false,\n }\n }\n\n if (config.retries !== undefined && config.retries < 0) {\n return {\n error: 'Task config retries must be a non-negative number',\n success: false,\n }\n }\n\n const inputError = validateSchemaFields(config.inputSchema, 'Input schema')\n if (inputError) {\n return { error: inputError, success: false }\n }\n\n const outputError = validateSchemaFields(config.outputSchema, 'Output schema')\n if (outputError) {\n return { error: outputError, success: false }\n }\n\n return { config, success: true }\n}\n\n/**\n * Validate workflow configuration structure\n */\nfunction validateWorkflowConfig(config: WorkflowConfig): ValidationResult<WorkflowConfig> {\n if (!config) {\n return {\n error: 'Workflow config is not a valid object',\n success: false,\n }\n }\n\n if (!config.slug) {\n return {\n error: 'Workflow config must have a valid slug property',\n success: false,\n }\n }\n\n if (!config.handler) {\n return {\n error: 'Workflow config must have a valid handler function',\n success: false,\n }\n }\n\n if (config.queue !== undefined && typeof config.queue !== 'string') {\n return {\n error: 'Workflow config queue must be a string if provided',\n success: false,\n }\n }\n\n if (config.retries !== undefined && config.retries < 0) {\n return {\n error: 'Workflow config retries must be a non-negative number',\n success: false,\n }\n }\n\n const inputError = validateSchemaFields(config.inputSchema, 'Input schema')\n if (inputError) {\n return { error: inputError, success: false }\n }\n\n return { config, success: true }\n}\n\nexport const validateCollectionFile = async (\n fileName: string,\n): Promise<ValidationResult<CollectionConfig>> => {\n return validatePayloadFile<CollectionConfig>(fileName, 'collection')\n}\n"],"names":["existsSync","join","validatePayloadFile","fileName","type","basePath","fullPath","process","cwd","filePath","error","success","require","cache","moduleName","replace","relativePath","importedModule","config","getCollectionConfig","getTaskConfig","getWorkflowConfig","validationResult","validateCollectionConfig","validateTaskConfig","validateWorkflowConfig","errorMessage","Error","message","default","undefined","exportNames","Object","keys","taskExport","find","name","endsWith","workflowExport","slug","fields","i","length","field","validateSchemaFields","label","Array","isArray","handler","retries","inputError","inputSchema","outputError","outputSchema","queue","validateCollectionFile"],"mappings":"AAEA,SAASA,UAAU,QAAQ,KAAI;AAC/B,SAASC,IAAI,QAAQ,OAAM;AAwD3B;;;;;CAKC,GACD,OAAO,MAAMC,sBAAsB,OACjCC,UACAC;IAEA,IAAI;QACF,MAAMC,WAAWD,SAAS,eAAe,gBAAgBA,SAAS,SAAS,UAAU;QACrF,MAAME,WAAWL,KAAKM,QAAQC,GAAG,IAAI,OAAOH;QAC5C,MAAMI,WAAWR,KAAKK,UAAUH;QAEhC,uBAAuB;QACvB,IAAI,CAACH,WAAWS,WAAW;YACzB,OAAO;gBACLC,OAAO,GAAGN,KAAK,sBAAsB,EAAED,UAAU;gBACjDQ,SAAS;YACX;QACF;QAEA,6CAA6C;QAC7C,OAAOC,QAAQC,KAAK,CAACJ,SAAS;QAE9B,8CAA8C;QAC9C,MAAMK,aAAaX,SAASY,OAAO,CAAC,OAAO;QAC3C,MAAMC,eAAe,CAAC,GAAG,EAAEX,SAAS,CAAC,EAAES,YAAY;QAEnD,oCAAoC;QACpC,MAAMG,iBAAiB,MAAM,MAAM,CAAC,uBAAuB,GAAGD;QAE9D,sCAAsC;QACtC,IAAIE;QAEJ,IAAId,SAAS,cAAc;YACzBc,SAASC,oBAAoBF,gBAAgBH;QAC/C,OAAO,IAAIV,SAAS,QAAQ;YAC1Bc,SAASE,cAAcH;QACzB,OAAO,IAAIb,SAAS,YAAY;YAC9Bc,SAASG,kBAAkBJ;QAC7B;QAEA,IAAI,CAACC,QAAQ;YACX,OAAO;gBACLR,OAAO,GAAGN,KAAK,8BAA8B,EAAEA,KAAK,OAAO,CAAC;gBAC5DO,SAAS;YACX;QACF;QAEA,6BAA6B;QAC7B,IAAIW;QACJ,IAAIlB,SAAS,cAAc;YACzBkB,mBAAmBC,yBAAyBL;QAC9C,OAAO,IAAId,SAAS,QAAQ;YAC1BkB,mBAAmBE,mBAAmBN;QACxC,OAAO,IAAId,SAAS,YAAY;YAC9BkB,mBAAmBG,uBAAuBP;QAC5C,OAAO;YACL,OAAO;gBACLR,OAAO,CAAC,yBAAyB,EAAEN,MAAM;gBACzCO,SAAS;YACX;QACF;QAEA,IAAI,CAACW,iBAAiBX,OAAO,EAAE;YAC7B,OAAOW;QACT;QAEA,OAAO;YACLJ;YACAP,SAAS;QACX;IACF,EAAE,OAAOD,OAAO;QACd,MAAMgB,eAAehB,iBAAiBiB,QAAQjB,MAAMkB,OAAO,GAAG;QAC9D,OAAO;YACLlB,OAAO,CAAC,mBAAmB,EAAEN,KAAK,OAAO,EAAEsB,cAAc;YACzDf,SAAS;QACX;IACF;AACF,EAAC;AAED;;CAEC,GACD,SAASQ,oBACPF,cAAuC,EACvCH,UAAkB;IAElB,IAAIG,eAAeY,OAAO,EAAE;QAC1B,OAAOZ,eAAeY,OAAO;IAC/B;IAEA,IAAIZ,cAAc,CAACH,WAAW,EAAE;QAC9B,OAAOG,cAAc,CAACH,WAAW;IACnC;IAEA,OAAOgB;AACT;AAEA;;CAEC,GACD,SAASV,cAAcH,cAAuC;IAC5D,iCAAiC;IACjC,IAAIA,eAAeY,OAAO,EAAE;QAC1B,OAAOZ,eAAeY,OAAO;IAC/B;IAEA,4CAA4C;IAC5C,MAAME,cAAcC,OAAOC,IAAI,CAAChB;IAChC,MAAMiB,aAAaH,YAAYI,IAAI,CAAC,CAACC,OAASA,KAAKC,QAAQ,CAAC;IAE5D,IAAIH,YAAY;QACd,OAAOjB,cAAc,CAACiB,WAAW;IACnC;IAEA,OAAOJ;AACT;AAEA;;CAEC,GACD,SAAST,kBAAkBJ,cAAuC;IAChE,iCAAiC;IACjC,IAAIA,eAAeY,OAAO,EAAE;QAC1B,OAAOZ,eAAeY,OAAO;IAC/B;IAEA,gDAAgD;IAChD,MAAME,cAAcC,OAAOC,IAAI,CAAChB;IAChC,MAAMqB,iBAAiBP,YAAYI,IAAI,CAAC,CAACC,OAASA,KAAKC,QAAQ,CAAC;IAEhE,IAAIC,gBAAgB;QAClB,OAAOrB,cAAc,CAACqB,eAAe;IACvC;IAEA,OAAOR;AACT;AAEA;;CAEC,GACD,SAASP,yBAAyBL,MAAwB;IACxD,IAAI,CAACA,QAAQ;QACX,OAAO;YACLR,OAAO;YACPC,SAAS;QACX;IACF;IAEA,IAAI,CAACO,OAAOqB,IAAI,EAAE;QAChB,OAAO;YACL7B,OAAO;YACPC,SAAS;QACX;IACF;IAEA,8CAA8C;IAC9C,IAAIO,OAAOsB,MAAM,EAAE;QACjB,IAAK,IAAIC,IAAI,GAAGA,IAAIvB,OAAOsB,MAAM,CAACE,MAAM,EAAED,IAAK;YAC7C,MAAME,QAAQzB,OAAOsB,MAAM,CAACC,EAAE;YAC9B,IAAI,CAACE,SAAS,OAAOA,UAAU,UAAU;gBACvC,OAAO;oBACLjC,OAAO,CAAC,eAAe,EAAE+B,EAAE,sBAAsB,CAAC;oBAClD9B,SAAS;gBACX;YACF;YAEA,mCAAmC;YACnC,IAAI,CAAE,CAAA,UAAUgC,KAAI,KAAM,CAACA,MAAMvC,IAAI,EAAE;gBACrC,OAAO;oBACLM,OAAO,CAAC,eAAe,EAAE+B,EAAE,iCAAiC,CAAC;oBAC7D9B,SAAS;gBACX;YACF;QACF;IACF;IAEA,OAAO;QAAEO;QAAQP,SAAS;IAAK;AACjC;AAEA;;;CAGC,GACD,SAASiC,qBAAqBJ,MAAiC,EAAEK,KAAa;IAC5E,IAAI,CAACL,UAAU,CAACM,MAAMC,OAAO,CAACP,SAAS;QACrC,OAAO;IACT;IACA,IAAK,IAAIC,IAAI,GAAGA,IAAID,OAAOE,MAAM,EAAED,IAAK;QACtC,MAAME,QAAQH,MAAM,CAACC,EAAE;QACvB,IAAI,CAACE,OAAO;YACV,OAAO,GAAGE,MAAM,gBAAgB,EAAEJ,EAAE,sBAAsB,CAAC;QAC7D;QACA,IAAI,CAACE,MAAMP,IAAI,EAAE;YACf,OAAO,GAAGS,MAAM,gBAAgB,EAAEJ,EAAE,gCAAgC,CAAC;QACvE;QACA,IAAI,CAACE,MAAMvC,IAAI,EAAE;YACf,OAAO,GAAGyC,MAAM,gBAAgB,EAAEJ,EAAE,gCAAgC,CAAC;QACvE;IACF;IACA,OAAO;AACT;AAEA;;CAEC,GACD,SAASjB,mBAAmBN,MAAkB;IAC5C,IAAI,CAACA,QAAQ;QACX,OAAO;YACLR,OAAO;YACPC,SAAS;QACX;IACF;IAEA,IAAI,CAACO,OAAOqB,IAAI,EAAE;QAChB,OAAO;YACL7B,OAAO;YACPC,SAAS;QACX;IACF;IAEA,IAAI,CAACO,OAAO8B,OAAO,EAAE;QACnB,OAAO;YACLtC,OAAO;YACPC,SAAS;QACX;IACF;IAEA,IAAIO,OAAO+B,OAAO,KAAKnB,aAAaZ,OAAO+B,OAAO,GAAG,GAAG;QACtD,OAAO;YACLvC,OAAO;YACPC,SAAS;QACX;IACF;IAEA,MAAMuC,aAAaN,qBAAqB1B,OAAOiC,WAAW,EAAE;IAC5D,IAAID,YAAY;QACd,OAAO;YAAExC,OAAOwC;YAAYvC,SAAS;QAAM;IAC7C;IAEA,MAAMyC,cAAcR,qBAAqB1B,OAAOmC,YAAY,EAAE;IAC9D,IAAID,aAAa;QACf,OAAO;YAAE1C,OAAO0C;YAAazC,SAAS;QAAM;IAC9C;IAEA,OAAO;QAAEO;QAAQP,SAAS;IAAK;AACjC;AAEA;;CAEC,GACD,SAASc,uBAAuBP,MAAsB;IACpD,IAAI,CAACA,QAAQ;QACX,OAAO;YACLR,OAAO;YACPC,SAAS;QACX;IACF;IAEA,IAAI,CAACO,OAAOqB,IAAI,EAAE;QAChB,OAAO;YACL7B,OAAO;YACPC,SAAS;QACX;IACF;IAEA,IAAI,CAACO,OAAO8B,OAAO,EAAE;QACnB,OAAO;YACLtC,OAAO;YACPC,SAAS;QACX;IACF;IAEA,IAAIO,OAAOoC,KAAK,KAAKxB,aAAa,OAAOZ,OAAOoC,KAAK,KAAK,UAAU;QAClE,OAAO;YACL5C,OAAO;YACPC,SAAS;QACX;IACF;IAEA,IAAIO,OAAO+B,OAAO,KAAKnB,aAAaZ,OAAO+B,OAAO,GAAG,GAAG;QACtD,OAAO;YACLvC,OAAO;YACPC,SAAS;QACX;IACF;IAEA,MAAMuC,aAAaN,qBAAqB1B,OAAOiC,WAAW,EAAE;IAC5D,IAAID,YAAY;QACd,OAAO;YAAExC,OAAOwC;YAAYvC,SAAS;QAAM;IAC7C;IAEA,OAAO;QAAEO;QAAQP,SAAS;IAAK;AACjC;AAEA,OAAO,MAAM4C,yBAAyB,OACpCpD;IAEA,OAAOD,oBAAsCC,UAAU;AACzD,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/collection/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAQ7C,eAAO,MAAM,gBAAgB,QACtB,cAAc,eACN,OAAO,sBACA,MAAM,kBACV,MAAM,kBACN,MAAM,yBACC,MAAM,GAAG,SAAS,UACjC,GAAG,EAAE,aACF,OAAO,GAAG,SAAS;;;;;EAyJ/B,CAAA;AAED,eAAO,MAAM,oBAAoB,WACvB,SAAS,OACZ,cAAc,eACN,OAAO,sBACA,MAAM,kBACV,MAAM,SA4DvB,CAAA"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/collection/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAS7C,eAAO,MAAM,gBAAgB,QACtB,cAAc,eACN,OAAO,sBACA,MAAM,kBACV,MAAM,kBACN,MAAM,yBACC,MAAM,GAAG,SAAS,UACjC,GAAG,EAAE,aACF,OAAO,GAAG,SAAS;;;;;EA4H/B,CAAA;AAED,eAAO,MAAM,oBAAoB,WACvB,SAAS,OACZ,cAAc,eACN,OAAO,sBACA,MAAM,kBACV,MAAM,SA4DvB,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { writeFileSync } from 'fs';
2
2
  import { join } from 'path';
3
+ import { generateFieldDefinitionString } from '../../helpers/fields.js';
3
4
  import { validateCollectionFile } from '../../helpers/fileValidation.js';
4
5
  import { toolSchemas } from '../schemas.js';
5
6
  export const createCollection = async (req, verboseLogs, collectionsDirPath, configFilePath, collectionName, collectionDescription, fields, hasUpload)=>{
@@ -12,31 +13,7 @@ export const createCollection = async (req, verboseLogs, collectionsDirPath, con
12
13
  if (verboseLogs) {
13
14
  payload.logger.info(`[payload-mcp] Generated slug: ${slug} for collection: ${collectionName}`);
14
15
  }
15
- // Generate TypeScript field definitions more systematically
16
- const generateFieldDefinition = (field)=>{
17
- const fieldConfig = [];
18
- fieldConfig.push(` {`);
19
- fieldConfig.push(` name: '${field.name}',`);
20
- fieldConfig.push(` type: '${field.type}',`);
21
- if (field.required) {
22
- fieldConfig.push(` required: true,`);
23
- }
24
- if (field.description) {
25
- fieldConfig.push(` admin: {`);
26
- fieldConfig.push(` description: '${field.description}',`);
27
- fieldConfig.push(` },`);
28
- }
29
- if (field.options && field.type === 'select') {
30
- fieldConfig.push(` options: [`);
31
- field.options.forEach((option)=>{
32
- fieldConfig.push(` { label: '${option.label}', value: '${option.value}' },`);
33
- });
34
- fieldConfig.push(` ],`);
35
- }
36
- fieldConfig.push(` },`);
37
- return fieldConfig.join('\n');
38
- };
39
- const fieldDefinitions = fields.map(generateFieldDefinition).join('\n');
16
+ const fieldDefinitions = fields.map(generateFieldDefinitionString).join('\n');
40
17
  // Generate collection file content
41
18
  const collectionContent = `import type { CollectionConfig } from 'payload'
42
19
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/mcp/tools/collection/create.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { PayloadRequest } from 'payload'\n\nimport { writeFileSync } from 'fs'\nimport { join } from 'path'\n\nimport { validateCollectionFile } from '../../helpers/fileValidation.js'\nimport { toolSchemas } from '../schemas.js'\n\nexport const createCollection = async (\n req: PayloadRequest,\n verboseLogs: boolean,\n collectionsDirPath: string,\n configFilePath: string,\n collectionName: string,\n collectionDescription: string | undefined,\n fields: any[],\n hasUpload: boolean | undefined,\n) => {\n const payload = req.payload\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Creating collection: ${collectionName} with ${fields.length} fields`,\n )\n }\n\n const capitalizedName = collectionName.charAt(0).toUpperCase() + collectionName.slice(1)\n const slug = collectionName\n .replace(/([A-Z])/g, '-$1')\n .toLowerCase()\n .replace(/^-/, '')\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Generated slug: ${slug} for collection: ${collectionName}`)\n }\n\n // Generate TypeScript field definitions more systematically\n const generateFieldDefinition = (field: any) => {\n const fieldConfig = []\n fieldConfig.push(` {`)\n fieldConfig.push(` name: '${field.name}',`)\n fieldConfig.push(` type: '${field.type}',`)\n\n if (field.required) {\n fieldConfig.push(` required: true,`)\n }\n\n if (field.description) {\n fieldConfig.push(` admin: {`)\n fieldConfig.push(` description: '${field.description}',`)\n fieldConfig.push(` },`)\n }\n\n if (field.options && field.type === 'select') {\n fieldConfig.push(` options: [`)\n field.options.forEach((option: { label: string; value: string }) => {\n fieldConfig.push(` { label: '${option.label}', value: '${option.value}' },`)\n })\n fieldConfig.push(` ],`)\n }\n\n fieldConfig.push(` },`)\n return fieldConfig.join('\\n')\n }\n\n const fieldDefinitions = fields.map(generateFieldDefinition).join('\\n')\n\n // Generate collection file content\n const collectionContent = `import type { CollectionConfig } from 'payload'\n\nexport const ${capitalizedName}: CollectionConfig = {\n slug: '${slug}',${\n collectionDescription\n ? `\n admin: {\n description: '${collectionDescription}',\n },`\n : ''\n }${\n hasUpload\n ? `\n upload: true,`\n : ''\n }\n fields: [\n${fieldDefinitions}\n ],\n}\n`\n\n try {\n // Validate the collection name and path\n const fileName = `${capitalizedName}.ts`\n const filePath = join(collectionsDirPath, fileName)\n\n // Security check: ensure we're working with the collections directory\n if (!filePath.startsWith(collectionsDirPath)) {\n payload.logger.error(`[payload-mcp] Invalid collection path attempted: ${filePath}`)\n return {\n content: [\n {\n type: 'text' as const,\n text: '❌ **Error**: Invalid collection path',\n },\n ],\n }\n }\n\n // Check if file already exists\n try {\n const fs = await import('fs')\n if (fs.existsSync(filePath)) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error**: Collection file already exists: ${fileName}`,\n },\n ],\n }\n }\n } catch (_ignore) {\n // File doesn't exist, which is what we want\n }\n\n // Write the collection file\n writeFileSync(filePath, collectionContent, 'utf8')\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Successfully created collection file: ${filePath}`)\n }\n\n // Validate the generated file\n const validationResult = await validateCollectionFile(fileName)\n if (validationResult.error) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error**: Generated collection has validation issues:\\n\\n${validationResult.error}`,\n },\n ],\n }\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `✅ **Collection created successfully!**\n**File**: \\`${fileName}\\`\n**Collection Config:**\n\\`\\`\\`typescript\n${collectionContent}\n\\`\\`\\``,\n },\n ],\n }\n } catch (error) {\n const errorMessage = (error as Error).message\n payload.logger.error(`[payload-mcp] Error creating collection: ${errorMessage}`)\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error creating collection**: ${errorMessage}`,\n },\n ],\n }\n }\n}\n\nexport const createCollectionTool = (\n server: McpServer,\n req: PayloadRequest,\n verboseLogs: boolean,\n collectionsDirPath: string,\n configFilePath: string,\n) => {\n const tool = async (\n collectionName: string,\n collectionDescription?: string,\n fields: any[] = [],\n hasUpload?: boolean,\n ) => {\n const payload = req.payload\n\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Creating collection: ${collectionName}, fields: ${fields.length}, upload: ${hasUpload}`,\n )\n }\n\n try {\n const result = await createCollection(\n req,\n verboseLogs,\n collectionsDirPath,\n configFilePath,\n collectionName,\n collectionDescription,\n fields,\n hasUpload,\n )\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Collection creation completed for: ${collectionName}`)\n }\n\n return result\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n payload.logger.error(\n `[payload-mcp] Error creating collection ${collectionName}: ${errorMessage}`,\n )\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `Error creating collection \"${collectionName}\": ${errorMessage}`,\n },\n ],\n }\n }\n }\n\n server.registerTool(\n 'createCollection',\n {\n description: toolSchemas.createCollection.description,\n inputSchema: toolSchemas.createCollection.parameters.shape,\n },\n async ({ collectionDescription, collectionName, fields, hasUpload }) => {\n return await tool(collectionName, collectionDescription, fields, hasUpload)\n },\n )\n}\n"],"names":["writeFileSync","join","validateCollectionFile","toolSchemas","createCollection","req","verboseLogs","collectionsDirPath","configFilePath","collectionName","collectionDescription","fields","hasUpload","payload","logger","info","length","capitalizedName","charAt","toUpperCase","slice","slug","replace","toLowerCase","generateFieldDefinition","field","fieldConfig","push","name","type","required","description","options","forEach","option","label","value","fieldDefinitions","map","collectionContent","fileName","filePath","startsWith","error","content","text","fs","existsSync","_ignore","validationResult","errorMessage","message","createCollectionTool","server","tool","result","Error","registerTool","inputSchema","parameters","shape"],"mappings":"AAGA,SAASA,aAAa,QAAQ,KAAI;AAClC,SAASC,IAAI,QAAQ,OAAM;AAE3B,SAASC,sBAAsB,QAAQ,kCAAiC;AACxE,SAASC,WAAW,QAAQ,gBAAe;AAE3C,OAAO,MAAMC,mBAAmB,OAC9BC,KACAC,aACAC,oBACAC,gBACAC,gBACAC,uBACAC,QACAC;IAEA,MAAMC,UAAUR,IAAIQ,OAAO;IAC3B,IAAIP,aAAa;QACfO,QAAQC,MAAM,CAACC,IAAI,CACjB,CAAC,mCAAmC,EAAEN,eAAe,MAAM,EAAEE,OAAOK,MAAM,CAAC,OAAO,CAAC;IAEvF;IAEA,MAAMC,kBAAkBR,eAAeS,MAAM,CAAC,GAAGC,WAAW,KAAKV,eAAeW,KAAK,CAAC;IACtF,MAAMC,OAAOZ,eACVa,OAAO,CAAC,YAAY,OACpBC,WAAW,GACXD,OAAO,CAAC,MAAM;IAEjB,IAAIhB,aAAa;QACfO,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,8BAA8B,EAAEM,KAAK,iBAAiB,EAAEZ,gBAAgB;IAC/F;IAEA,4DAA4D;IAC5D,MAAMe,0BAA0B,CAACC;QAC/B,MAAMC,cAAc,EAAE;QACtBA,YAAYC,IAAI,CAAC,CAAC,KAAK,CAAC;QACxBD,YAAYC,IAAI,CAAC,CAAC,aAAa,EAAEF,MAAMG,IAAI,CAAC,EAAE,CAAC;QAC/CF,YAAYC,IAAI,CAAC,CAAC,aAAa,EAAEF,MAAMI,IAAI,CAAC,EAAE,CAAC;QAE/C,IAAIJ,MAAMK,QAAQ,EAAE;YAClBJ,YAAYC,IAAI,CAAC,CAAC,qBAAqB,CAAC;QAC1C;QAEA,IAAIF,MAAMM,WAAW,EAAE;YACrBL,YAAYC,IAAI,CAAC,CAAC,cAAc,CAAC;YACjCD,YAAYC,IAAI,CAAC,CAAC,sBAAsB,EAAEF,MAAMM,WAAW,CAAC,EAAE,CAAC;YAC/DL,YAAYC,IAAI,CAAC,CAAC,QAAQ,CAAC;QAC7B;QAEA,IAAIF,MAAMO,OAAO,IAAIP,MAAMI,IAAI,KAAK,UAAU;YAC5CH,YAAYC,IAAI,CAAC,CAAC,gBAAgB,CAAC;YACnCF,MAAMO,OAAO,CAACC,OAAO,CAAC,CAACC;gBACrBR,YAAYC,IAAI,CAAC,CAAC,kBAAkB,EAAEO,OAAOC,KAAK,CAAC,WAAW,EAAED,OAAOE,KAAK,CAAC,IAAI,CAAC;YACpF;YACAV,YAAYC,IAAI,CAAC,CAAC,QAAQ,CAAC;QAC7B;QAEAD,YAAYC,IAAI,CAAC,CAAC,MAAM,CAAC;QACzB,OAAOD,YAAYzB,IAAI,CAAC;IAC1B;IAEA,MAAMoC,mBAAmB1B,OAAO2B,GAAG,CAACd,yBAAyBvB,IAAI,CAAC;IAElE,mCAAmC;IACnC,MAAMsC,oBAAoB,CAAC;;aAEhB,EAAEtB,gBAAgB;SACtB,EAAEI,KAAK,EAAE,EACdX,wBACI,CAAC;;kBAES,EAAEA,sBAAsB;IACtC,CAAC,GACG,KAEJE,YACI,CAAC;eACM,CAAC,GACR,GACL;;AAEH,EAAEyB,iBAAiB;;;AAGnB,CAAC;IAEC,IAAI;QACF,wCAAwC;QACxC,MAAMG,WAAW,GAAGvB,gBAAgB,GAAG,CAAC;QACxC,MAAMwB,WAAWxC,KAAKM,oBAAoBiC;QAE1C,sEAAsE;QACtE,IAAI,CAACC,SAASC,UAAU,CAACnC,qBAAqB;YAC5CM,QAAQC,MAAM,CAAC6B,KAAK,CAAC,CAAC,iDAAiD,EAAEF,UAAU;YACnF,OAAO;gBACLG,SAAS;oBACP;wBACEf,MAAM;wBACNgB,MAAM;oBACR;iBACD;YACH;QACF;QAEA,+BAA+B;QAC/B,IAAI;YACF,MAAMC,KAAK,MAAM,MAAM,CAAC;YACxB,IAAIA,GAAGC,UAAU,CAACN,WAAW;gBAC3B,OAAO;oBACLG,SAAS;wBACP;4BACEf,MAAM;4BACNgB,MAAM,CAAC,6CAA6C,EAAEL,UAAU;wBAClE;qBACD;gBACH;YACF;QACF,EAAE,OAAOQ,SAAS;QAChB,4CAA4C;QAC9C;QAEA,4BAA4B;QAC5BhD,cAAcyC,UAAUF,mBAAmB;QAC3C,IAAIjC,aAAa;YACfO,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,oDAAoD,EAAE0B,UAAU;QACvF;QAEA,8BAA8B;QAC9B,MAAMQ,mBAAmB,MAAM/C,uBAAuBsC;QACtD,IAAIS,iBAAiBN,KAAK,EAAE;YAC1B,OAAO;gBACLC,SAAS;oBACP;wBACEf,MAAM;wBACNgB,MAAM,CAAC,4DAA4D,EAAEI,iBAAiBN,KAAK,EAAE;oBAC/F;iBACD;YACH;QACF;QAEA,OAAO;YACLC,SAAS;gBACP;oBACEf,MAAM;oBACNgB,MAAM,CAAC;YACL,EAAEL,SAAS;;;AAGvB,EAAED,kBAAkB;MACd,CAAC;gBACC;aACD;QACH;IACF,EAAE,OAAOI,OAAO;QACd,MAAMO,eAAe,AAACP,MAAgBQ,OAAO;QAC7CtC,QAAQC,MAAM,CAAC6B,KAAK,CAAC,CAAC,yCAAyC,EAAEO,cAAc;QAE/E,OAAO;YACLN,SAAS;gBACP;oBACEf,MAAM;oBACNgB,MAAM,CAAC,iCAAiC,EAAEK,cAAc;gBAC1D;aACD;QACH;IACF;AACF,EAAC;AAED,OAAO,MAAME,uBAAuB,CAClCC,QACAhD,KACAC,aACAC,oBACAC;IAEA,MAAM8C,OAAO,OACX7C,gBACAC,uBACAC,SAAgB,EAAE,EAClBC;QAEA,MAAMC,UAAUR,IAAIQ,OAAO;QAE3B,IAAIP,aAAa;YACfO,QAAQC,MAAM,CAACC,IAAI,CACjB,CAAC,mCAAmC,EAAEN,eAAe,UAAU,EAAEE,OAAOK,MAAM,CAAC,UAAU,EAAEJ,WAAW;QAE1G;QAEA,IAAI;YACF,MAAM2C,SAAS,MAAMnD,iBACnBC,KACAC,aACAC,oBACAC,gBACAC,gBACAC,uBACAC,QACAC;YAGF,IAAIN,aAAa;gBACfO,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,iDAAiD,EAAEN,gBAAgB;YAC1F;YAEA,OAAO8C;QACT,EAAE,OAAOZ,OAAO;YACd,MAAMO,eAAeP,iBAAiBa,QAAQb,MAAMQ,OAAO,GAAG;YAC9DtC,QAAQC,MAAM,CAAC6B,KAAK,CAClB,CAAC,wCAAwC,EAAElC,eAAe,EAAE,EAAEyC,cAAc;YAG9E,OAAO;gBACLN,SAAS;oBACP;wBACEf,MAAM;wBACNgB,MAAM,CAAC,2BAA2B,EAAEpC,eAAe,GAAG,EAAEyC,cAAc;oBACxE;iBACD;YACH;QACF;IACF;IAEAG,OAAOI,YAAY,CACjB,oBACA;QACE1B,aAAa5B,YAAYC,gBAAgB,CAAC2B,WAAW;QACrD2B,aAAavD,YAAYC,gBAAgB,CAACuD,UAAU,CAACC,KAAK;IAC5D,GACA,OAAO,EAAElD,qBAAqB,EAAED,cAAc,EAAEE,MAAM,EAAEC,SAAS,EAAE;QACjE,OAAO,MAAM0C,KAAK7C,gBAAgBC,uBAAuBC,QAAQC;IACnE;AAEJ,EAAC"}
1
+ {"version":3,"sources":["../../../../src/mcp/tools/collection/create.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { PayloadRequest } from 'payload'\n\nimport { writeFileSync } from 'fs'\nimport { join } from 'path'\n\nimport { generateFieldDefinitionString } from '../../helpers/fields.js'\nimport { validateCollectionFile } from '../../helpers/fileValidation.js'\nimport { toolSchemas } from '../schemas.js'\n\nexport const createCollection = async (\n req: PayloadRequest,\n verboseLogs: boolean,\n collectionsDirPath: string,\n configFilePath: string,\n collectionName: string,\n collectionDescription: string | undefined,\n fields: any[],\n hasUpload: boolean | undefined,\n) => {\n const payload = req.payload\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Creating collection: ${collectionName} with ${fields.length} fields`,\n )\n }\n\n const capitalizedName = collectionName.charAt(0).toUpperCase() + collectionName.slice(1)\n const slug = collectionName\n .replace(/([A-Z])/g, '-$1')\n .toLowerCase()\n .replace(/^-/, '')\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Generated slug: ${slug} for collection: ${collectionName}`)\n }\n\n const fieldDefinitions = fields.map(generateFieldDefinitionString).join('\\n')\n\n // Generate collection file content\n const collectionContent = `import type { CollectionConfig } from 'payload'\n\nexport const ${capitalizedName}: CollectionConfig = {\n slug: '${slug}',${\n collectionDescription\n ? `\n admin: {\n description: '${collectionDescription}',\n },`\n : ''\n }${\n hasUpload\n ? `\n upload: true,`\n : ''\n }\n fields: [\n${fieldDefinitions}\n ],\n}\n`\n\n try {\n // Validate the collection name and path\n const fileName = `${capitalizedName}.ts`\n const filePath = join(collectionsDirPath, fileName)\n\n // Security check: ensure we're working with the collections directory\n if (!filePath.startsWith(collectionsDirPath)) {\n payload.logger.error(`[payload-mcp] Invalid collection path attempted: ${filePath}`)\n return {\n content: [\n {\n type: 'text' as const,\n text: '❌ **Error**: Invalid collection path',\n },\n ],\n }\n }\n\n // Check if file already exists\n try {\n const fs = await import('fs')\n if (fs.existsSync(filePath)) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error**: Collection file already exists: ${fileName}`,\n },\n ],\n }\n }\n } catch (_ignore) {\n // File doesn't exist, which is what we want\n }\n\n // Write the collection file\n writeFileSync(filePath, collectionContent, 'utf8')\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Successfully created collection file: ${filePath}`)\n }\n\n // Validate the generated file\n const validationResult = await validateCollectionFile(fileName)\n if (validationResult.error) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error**: Generated collection has validation issues:\\n\\n${validationResult.error}`,\n },\n ],\n }\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `✅ **Collection created successfully!**\n**File**: \\`${fileName}\\`\n**Collection Config:**\n\\`\\`\\`typescript\n${collectionContent}\n\\`\\`\\``,\n },\n ],\n }\n } catch (error) {\n const errorMessage = (error as Error).message\n payload.logger.error(`[payload-mcp] Error creating collection: ${errorMessage}`)\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error creating collection**: ${errorMessage}`,\n },\n ],\n }\n }\n}\n\nexport const createCollectionTool = (\n server: McpServer,\n req: PayloadRequest,\n verboseLogs: boolean,\n collectionsDirPath: string,\n configFilePath: string,\n) => {\n const tool = async (\n collectionName: string,\n collectionDescription?: string,\n fields: any[] = [],\n hasUpload?: boolean,\n ) => {\n const payload = req.payload\n\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Creating collection: ${collectionName}, fields: ${fields.length}, upload: ${hasUpload}`,\n )\n }\n\n try {\n const result = await createCollection(\n req,\n verboseLogs,\n collectionsDirPath,\n configFilePath,\n collectionName,\n collectionDescription,\n fields,\n hasUpload,\n )\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Collection creation completed for: ${collectionName}`)\n }\n\n return result\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n payload.logger.error(\n `[payload-mcp] Error creating collection ${collectionName}: ${errorMessage}`,\n )\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `Error creating collection \"${collectionName}\": ${errorMessage}`,\n },\n ],\n }\n }\n }\n\n server.registerTool(\n 'createCollection',\n {\n description: toolSchemas.createCollection.description,\n inputSchema: toolSchemas.createCollection.parameters.shape,\n },\n async ({ collectionDescription, collectionName, fields, hasUpload }) => {\n return await tool(collectionName, collectionDescription, fields, hasUpload)\n },\n )\n}\n"],"names":["writeFileSync","join","generateFieldDefinitionString","validateCollectionFile","toolSchemas","createCollection","req","verboseLogs","collectionsDirPath","configFilePath","collectionName","collectionDescription","fields","hasUpload","payload","logger","info","length","capitalizedName","charAt","toUpperCase","slice","slug","replace","toLowerCase","fieldDefinitions","map","collectionContent","fileName","filePath","startsWith","error","content","type","text","fs","existsSync","_ignore","validationResult","errorMessage","message","createCollectionTool","server","tool","result","Error","registerTool","description","inputSchema","parameters","shape"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/collection/delete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AA0B7C,eAAO,MAAM,gBAAgB,QACtB,cAAc,eACN,OAAO,sBACA,MAAM,kBACV,MAAM,kBACN,MAAM,mBACL,OAAO,gBACV,OAAO;;;;;CAiItB,CAAA;AAED,eAAO,MAAM,oBAAoB,WACvB,SAAS,OACZ,cAAc,eACN,OAAO,sBACA,MAAM,kBACV,MAAM,SA0DvB,CAAA"}
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/collection/delete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAQ7C,eAAO,MAAM,gBAAgB,QACtB,cAAc,eACN,OAAO,sBACA,MAAM,kBACV,MAAM,kBACN,MAAM,mBACL,OAAO,gBACV,OAAO;;;;;CAiItB,CAAA;AAED,eAAO,MAAM,oBAAoB,WACvB,SAAS,OACZ,cAAc,eACN,OAAO,sBACA,MAAM,kBACV,MAAM,SA0DvB,CAAA"}
@@ -1,18 +1,7 @@
1
1
  import { readFileSync, unlinkSync, writeFileSync } from 'fs';
2
2
  import { join } from 'path';
3
+ import { removeCollectionFromConfig } from '../../helpers/config.js';
3
4
  import { toolSchemas } from '../schemas.js';
4
- // Helper function for removing collection from config
5
- const removeCollectionFromConfig = (configContent, collectionName)=>{
6
- // Simple implementation - find and remove the collection import and reference
7
- let updatedContent = configContent;
8
- // Remove import statement
9
- const importRegex = new RegExp(`import\\s*{\\s*${collectionName}\\s*}\\s*from\\s*['"]\\./collections/${collectionName}['"];?\\s*\\n?`, 'g');
10
- updatedContent = updatedContent.replace(importRegex, '');
11
- // Remove from collections array
12
- const collectionsRegex = new RegExp(`\\s*${collectionName},?\\s*`, 'g');
13
- updatedContent = updatedContent.replace(collectionsRegex, '');
14
- return updatedContent;
15
- };
16
5
  export const deleteCollection = (req, verboseLogs, collectionsDirPath, configFilePath, collectionName, confirmDeletion, updateConfig)=>{
17
6
  const payload = req.payload;
18
7
  if (verboseLogs) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/mcp/tools/collection/delete.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { PayloadRequest } from 'payload'\n\nimport { readFileSync, unlinkSync, writeFileSync } from 'fs'\nimport { join } from 'path'\n\nimport { toolSchemas } from '../schemas.js'\n\n// Helper function for removing collection from config\nconst removeCollectionFromConfig = (configContent: string, collectionName: string): string => {\n // Simple implementation - find and remove the collection import and reference\n let updatedContent = configContent\n\n // Remove import statement\n const importRegex = new RegExp(\n `import\\\\s*{\\\\s*${collectionName}\\\\s*}\\\\s*from\\\\s*['\"]\\\\./collections/${collectionName}['\"];?\\\\s*\\\\n?`,\n 'g',\n )\n updatedContent = updatedContent.replace(importRegex, '')\n\n // Remove from collections array\n const collectionsRegex = new RegExp(`\\\\s*${collectionName},?\\\\s*`, 'g')\n updatedContent = updatedContent.replace(collectionsRegex, '')\n\n return updatedContent\n}\n\nexport const deleteCollection = (\n req: PayloadRequest,\n verboseLogs: boolean,\n collectionsDirPath: string,\n configFilePath: string,\n collectionName: string,\n confirmDeletion: boolean,\n updateConfig: boolean,\n) => {\n const payload = req.payload\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Attempting to delete collection: ${collectionName}`)\n }\n\n if (!confirmDeletion) {\n payload.logger.warn(`[payload-mcp] Deletion cancelled for collection: ${collectionName}`)\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Deletion cancelled**. Set confirmDeletion to true to proceed with deleting collection \"${collectionName}\".`,\n },\n ],\n }\n }\n\n const capitalizedName = collectionName.charAt(0).toUpperCase() + collectionName.slice(1)\n const collectionFilePath = join(collectionsDirPath, `${capitalizedName}.ts`)\n\n // Security check: ensure we're working with the collections directory\n if (!collectionFilePath.startsWith(collectionsDirPath)) {\n payload.logger.error(`[payload-mcp] Invalid collection path attempted: ${collectionFilePath}`)\n return {\n content: [\n {\n type: 'text' as const,\n text: '❌ **Error**: Invalid collection path',\n },\n ],\n }\n }\n\n try {\n // Check if collection file exists\n let fileExists = false\n try {\n readFileSync(collectionFilePath, 'utf8')\n fileExists = true\n } catch {\n payload.logger.warn(`[payload-mcp] Collection file does not exist: ${collectionFilePath}`)\n }\n\n // Read current config if we need to update it\n let configContent = ''\n let configExists = false\n if (updateConfig) {\n try {\n configContent = readFileSync(configFilePath, 'utf8')\n configExists = true\n } catch {\n payload.logger.warn(`[payload-mcp] Config file does not exist: ${configFilePath}`)\n }\n }\n\n let responseText = ''\n let operationsPerformed = 0\n\n // Delete the collection file\n if (fileExists) {\n try {\n unlinkSync(collectionFilePath)\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Successfully deleted collection file: ${collectionFilePath}`,\n )\n }\n responseText += `✅ Deleted collection file: \\`${capitalizedName}.ts\\`\\n`\n operationsPerformed++\n } catch (error) {\n const errorMessage = (error as Error).message\n payload.logger.error(`[payload-mcp] Error deleting collection file: ${errorMessage}`)\n responseText += `❌ Error deleting collection file: ${errorMessage}\\n`\n }\n } else {\n responseText += `⚠️ Collection file not found: \\`${capitalizedName}.ts\\`\\n`\n }\n\n // Update the config file if requested and it exists\n if (updateConfig && configExists) {\n try {\n const updatedConfigContent = removeCollectionFromConfig(configContent, capitalizedName)\n writeFileSync(configFilePath, updatedConfigContent, 'utf8')\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Successfully updated config file: ${configFilePath}`)\n }\n responseText += `✅ Updated payload.config.ts to remove collection reference\\n`\n operationsPerformed++\n } catch (error) {\n const errorMessage = (error as Error).message\n payload.logger.error(`[payload-mcp] Error updating config file: ${errorMessage}`)\n responseText += `❌ Error updating config file: ${errorMessage}\\n`\n }\n } else if (updateConfig && !configExists) {\n responseText += `⚠️ Config file not found: payload.config.ts\\n`\n }\n\n // Summary\n if (operationsPerformed > 0) {\n responseText += `\\n✅ **Collection deletion completed!**`\n } else {\n responseText += `\\n⚠️ **No operations performed**\n\nThe collection file may not have existed or there were errors during deletion.`\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: responseText,\n },\n ],\n }\n } catch (error) {\n const errorMessage = (error as Error).message\n payload.logger.error(`[payload-mcp] Error during collection deletion: ${errorMessage}`)\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error during collection deletion**: ${errorMessage}`,\n },\n ],\n }\n }\n}\n\nexport const deleteCollectionTool = (\n server: McpServer,\n req: PayloadRequest,\n verboseLogs: boolean,\n collectionsDirPath: string,\n configFilePath: string,\n) => {\n const tool = (\n collectionName: string,\n confirmDeletion: boolean,\n updateConfig: boolean = false,\n ) => {\n const payload = req.payload\n\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Deleting collection: ${collectionName}, confirmDeletion: ${confirmDeletion}, updateConfig: ${updateConfig}`,\n )\n }\n\n try {\n const result = deleteCollection(\n req,\n verboseLogs,\n collectionsDirPath,\n configFilePath,\n collectionName,\n confirmDeletion,\n updateConfig,\n )\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Collection deletion completed for: ${collectionName}`)\n }\n\n return result\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n payload.logger.error(\n `[payload-mcp] Error deleting collection ${collectionName}: ${errorMessage}`,\n )\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `Error deleting collection \"${collectionName}\": ${errorMessage}`,\n },\n ],\n }\n }\n }\n\n server.registerTool(\n 'deleteCollection',\n {\n description: toolSchemas.deleteCollection.description,\n inputSchema: toolSchemas.deleteCollection.parameters.shape,\n },\n ({ collectionName, confirmDeletion, updateConfig }) => {\n return tool(collectionName, confirmDeletion, updateConfig)\n },\n )\n}\n"],"names":["readFileSync","unlinkSync","writeFileSync","join","toolSchemas","removeCollectionFromConfig","configContent","collectionName","updatedContent","importRegex","RegExp","replace","collectionsRegex","deleteCollection","req","verboseLogs","collectionsDirPath","configFilePath","confirmDeletion","updateConfig","payload","logger","info","warn","content","type","text","capitalizedName","charAt","toUpperCase","slice","collectionFilePath","startsWith","error","fileExists","configExists","responseText","operationsPerformed","errorMessage","message","updatedConfigContent","deleteCollectionTool","server","tool","result","Error","registerTool","description","inputSchema","parameters","shape"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/mcp/tools/collection/delete.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { PayloadRequest } from 'payload'\n\nimport { readFileSync, unlinkSync, writeFileSync } from 'fs'\nimport { join } from 'path'\n\nimport { removeCollectionFromConfig } from '../../helpers/config.js'\nimport { toolSchemas } from '../schemas.js'\n\nexport const deleteCollection = (\n req: PayloadRequest,\n verboseLogs: boolean,\n collectionsDirPath: string,\n configFilePath: string,\n collectionName: string,\n confirmDeletion: boolean,\n updateConfig: boolean,\n) => {\n const payload = req.payload\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Attempting to delete collection: ${collectionName}`)\n }\n\n if (!confirmDeletion) {\n payload.logger.warn(`[payload-mcp] Deletion cancelled for collection: ${collectionName}`)\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Deletion cancelled**. Set confirmDeletion to true to proceed with deleting collection \"${collectionName}\".`,\n },\n ],\n }\n }\n\n const capitalizedName = collectionName.charAt(0).toUpperCase() + collectionName.slice(1)\n const collectionFilePath = join(collectionsDirPath, `${capitalizedName}.ts`)\n\n // Security check: ensure we're working with the collections directory\n if (!collectionFilePath.startsWith(collectionsDirPath)) {\n payload.logger.error(`[payload-mcp] Invalid collection path attempted: ${collectionFilePath}`)\n return {\n content: [\n {\n type: 'text' as const,\n text: '❌ **Error**: Invalid collection path',\n },\n ],\n }\n }\n\n try {\n // Check if collection file exists\n let fileExists = false\n try {\n readFileSync(collectionFilePath, 'utf8')\n fileExists = true\n } catch {\n payload.logger.warn(`[payload-mcp] Collection file does not exist: ${collectionFilePath}`)\n }\n\n // Read current config if we need to update it\n let configContent = ''\n let configExists = false\n if (updateConfig) {\n try {\n configContent = readFileSync(configFilePath, 'utf8')\n configExists = true\n } catch {\n payload.logger.warn(`[payload-mcp] Config file does not exist: ${configFilePath}`)\n }\n }\n\n let responseText = ''\n let operationsPerformed = 0\n\n // Delete the collection file\n if (fileExists) {\n try {\n unlinkSync(collectionFilePath)\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Successfully deleted collection file: ${collectionFilePath}`,\n )\n }\n responseText += `✅ Deleted collection file: \\`${capitalizedName}.ts\\`\\n`\n operationsPerformed++\n } catch (error) {\n const errorMessage = (error as Error).message\n payload.logger.error(`[payload-mcp] Error deleting collection file: ${errorMessage}`)\n responseText += `❌ Error deleting collection file: ${errorMessage}\\n`\n }\n } else {\n responseText += `⚠️ Collection file not found: \\`${capitalizedName}.ts\\`\\n`\n }\n\n // Update the config file if requested and it exists\n if (updateConfig && configExists) {\n try {\n const updatedConfigContent = removeCollectionFromConfig(configContent, capitalizedName)\n writeFileSync(configFilePath, updatedConfigContent, 'utf8')\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Successfully updated config file: ${configFilePath}`)\n }\n responseText += `✅ Updated payload.config.ts to remove collection reference\\n`\n operationsPerformed++\n } catch (error) {\n const errorMessage = (error as Error).message\n payload.logger.error(`[payload-mcp] Error updating config file: ${errorMessage}`)\n responseText += `❌ Error updating config file: ${errorMessage}\\n`\n }\n } else if (updateConfig && !configExists) {\n responseText += `⚠️ Config file not found: payload.config.ts\\n`\n }\n\n // Summary\n if (operationsPerformed > 0) {\n responseText += `\\n✅ **Collection deletion completed!**`\n } else {\n responseText += `\\n⚠️ **No operations performed**\n\nThe collection file may not have existed or there were errors during deletion.`\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: responseText,\n },\n ],\n }\n } catch (error) {\n const errorMessage = (error as Error).message\n payload.logger.error(`[payload-mcp] Error during collection deletion: ${errorMessage}`)\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error during collection deletion**: ${errorMessage}`,\n },\n ],\n }\n }\n}\n\nexport const deleteCollectionTool = (\n server: McpServer,\n req: PayloadRequest,\n verboseLogs: boolean,\n collectionsDirPath: string,\n configFilePath: string,\n) => {\n const tool = (\n collectionName: string,\n confirmDeletion: boolean,\n updateConfig: boolean = false,\n ) => {\n const payload = req.payload\n\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Deleting collection: ${collectionName}, confirmDeletion: ${confirmDeletion}, updateConfig: ${updateConfig}`,\n )\n }\n\n try {\n const result = deleteCollection(\n req,\n verboseLogs,\n collectionsDirPath,\n configFilePath,\n collectionName,\n confirmDeletion,\n updateConfig,\n )\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Collection deletion completed for: ${collectionName}`)\n }\n\n return result\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n payload.logger.error(\n `[payload-mcp] Error deleting collection ${collectionName}: ${errorMessage}`,\n )\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `Error deleting collection \"${collectionName}\": ${errorMessage}`,\n },\n ],\n }\n }\n }\n\n server.registerTool(\n 'deleteCollection',\n {\n description: toolSchemas.deleteCollection.description,\n inputSchema: toolSchemas.deleteCollection.parameters.shape,\n },\n ({ collectionName, confirmDeletion, updateConfig }) => {\n return tool(collectionName, confirmDeletion, updateConfig)\n },\n )\n}\n"],"names":["readFileSync","unlinkSync","writeFileSync","join","removeCollectionFromConfig","toolSchemas","deleteCollection","req","verboseLogs","collectionsDirPath","configFilePath","collectionName","confirmDeletion","updateConfig","payload","logger","info","warn","content","type","text","capitalizedName","charAt","toUpperCase","slice","collectionFilePath","startsWith","error","fileExists","configContent","configExists","responseText","operationsPerformed","errorMessage","message","updatedConfigContent","deleteCollectionTool","server","tool","result","Error","registerTool","description","inputSchema","parameters","shape"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import type { PayloadRequest } from 'payload';
3
- export declare const updateConfig: (req: PayloadRequest, verboseLogs: boolean, configFilePath: string, updateType: string, collectionName?: string, adminConfig?: any, databaseConfig?: any, pluginUpdates?: any, generalConfig?: any, newContent?: string) => {
3
+ export declare const updateConfig: (req: PayloadRequest, verboseLogs: boolean, configFilePath: string, updateType: string, collectionName?: string, adminConfig?: any, databaseConfig?: any, pluginUpdates?: any, newContent?: string) => {
4
4
  content: {
5
5
  type: "text";
6
6
  text: string;
@@ -1 +1 @@
1
- {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/config/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAa7C,eAAO,MAAM,YAAY,QAClB,cAAc,eACN,OAAO,kBACJ,MAAM,cACV,MAAM,mBACD,MAAM,gBACT,GAAG,mBACA,GAAG,kBACJ,GAAG,kBACH,GAAG,eACN,MAAM;;;;;CAwLpB,CAAA;AAED,eAAO,MAAM,gBAAgB,WACnB,SAAS,OACZ,cAAc,eACN,OAAO,kBACJ,MAAM,SAqEvB,CAAA"}
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/config/update.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAa7C,eAAO,MAAM,YAAY,QAClB,cAAc,eACN,OAAO,kBACJ,MAAM,cACV,MAAM,mBACD,MAAM,gBACT,GAAG,mBACA,GAAG,kBACJ,GAAG,eACN,MAAM;;;;;CAwLpB,CAAA;AAED,eAAO,MAAM,gBAAgB,WACnB,SAAS,OACZ,cAAc,eACN,OAAO,kBACJ,MAAM,SAkEvB,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import { readFileSync, writeFileSync } from 'fs';
2
2
  import { addCollectionToConfig, removeCollectionFromConfig, updateAdminConfig, updateDatabaseConfig, updatePluginsConfig } from '../../helpers/config.js';
3
3
  import { toolSchemas } from '../schemas.js';
4
- export const updateConfig = (req, verboseLogs, configFilePath, updateType, collectionName, adminConfig, databaseConfig, pluginUpdates, generalConfig, newContent)=>{
4
+ export const updateConfig = (req, verboseLogs, configFilePath, updateType, collectionName, adminConfig, databaseConfig, pluginUpdates, newContent)=>{
5
5
  const payload = req.payload;
6
6
  if (verboseLogs) {
7
7
  payload.logger.info(`[payload-mcp] Updating config with update type: ${updateType}`);
@@ -180,13 +180,13 @@ ${updatedContent}
180
180
  }
181
181
  };
182
182
  export const updateConfigTool = (server, req, verboseLogs, configFilePath)=>{
183
- const tool = ({ adminConfig, collectionName, databaseConfig, generalConfig, newContent, pluginUpdates, updateType })=>{
183
+ const tool = ({ adminConfig, collectionName, databaseConfig, newContent, pluginUpdates, updateType })=>{
184
184
  const payload = req.payload;
185
185
  if (verboseLogs) {
186
186
  payload.logger.info(`[payload-mcp] Updating config: ${updateType}`);
187
187
  }
188
188
  try {
189
- const result = updateConfig(req, verboseLogs, configFilePath, updateType, collectionName, adminConfig, databaseConfig, pluginUpdates, generalConfig, newContent);
189
+ const result = updateConfig(req, verboseLogs, configFilePath, updateType, collectionName, adminConfig, databaseConfig, pluginUpdates, newContent);
190
190
  if (verboseLogs) {
191
191
  payload.logger.info(`[payload-mcp] Config update completed for: ${updateType}`);
192
192
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/mcp/tools/config/update.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { PayloadRequest } from 'payload'\n\nimport { readFileSync, writeFileSync } from 'fs'\n\nimport {\n addCollectionToConfig,\n removeCollectionFromConfig,\n updateAdminConfig,\n updateDatabaseConfig,\n updatePluginsConfig,\n} from '../../helpers/config.js'\nimport { toolSchemas } from '../schemas.js'\n\nexport const updateConfig = (\n req: PayloadRequest,\n verboseLogs: boolean,\n configFilePath: string,\n updateType: string,\n collectionName?: string,\n adminConfig?: any,\n databaseConfig?: any,\n pluginUpdates?: any,\n generalConfig?: any,\n newContent?: string,\n) => {\n const payload = req.payload\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Updating config with update type: ${updateType}`)\n }\n\n // Security check: ensure we're working with the specified config file\n if (!configFilePath.startsWith(process.cwd()) && !configFilePath.startsWith('/')) {\n payload.logger.error(`[payload-mcp] Invalid config path attempted: ${configFilePath}`)\n return {\n content: [\n {\n type: 'text' as const,\n text: '❌ **Error**: Invalid config path',\n },\n ],\n }\n }\n\n try {\n // Read current config\n let currentContent: string\n try {\n currentContent = readFileSync(configFilePath, 'utf8')\n } catch (_ignore) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error**: Config file not found: ${configFilePath}`,\n },\n ],\n }\n }\n\n let updatedContent: string\n let updateSummary: string[] = []\n\n switch (updateType) {\n case 'add_collection':\n if (!collectionName) {\n return {\n content: [\n {\n type: 'text' as const,\n text: '❌ **Error**: No collection name provided for add_collection update type',\n },\n ],\n }\n }\n updatedContent = addCollectionToConfig(currentContent, collectionName)\n updateSummary = [`Added collection: ${collectionName}`]\n break\n\n case 'remove_collection':\n if (!collectionName) {\n return {\n content: [\n {\n type: 'text' as const,\n text: '❌ **Error**: No collection name provided for remove_collection update type',\n },\n ],\n }\n }\n updatedContent = removeCollectionFromConfig(currentContent, collectionName)\n updateSummary = [`Removed collection: ${collectionName}`]\n break\n\n case 'replace_content':\n if (!newContent) {\n return {\n content: [\n {\n type: 'text' as const,\n text: '❌ **Error**: No new content provided for replace_content update type',\n },\n ],\n }\n }\n updatedContent = newContent\n updateSummary = ['Replaced entire config content']\n break\n\n case 'update_admin':\n if (!adminConfig) {\n return {\n content: [\n {\n type: 'text' as const,\n text: '❌ **Error**: No admin config provided for update_admin update type',\n },\n ],\n }\n }\n updatedContent = updateAdminConfig(currentContent, adminConfig)\n updateSummary = Object.keys(adminConfig).map((key) => `Updated admin config: ${key}`)\n break\n\n case 'update_database':\n if (!databaseConfig) {\n return {\n content: [\n {\n type: 'text' as const,\n text: '❌ **Error**: No database config provided for update_database update type',\n },\n ],\n }\n }\n updatedContent = updateDatabaseConfig(currentContent, databaseConfig)\n updateSummary = Object.keys(databaseConfig).map((key) => `Updated database config: ${key}`)\n break\n\n case 'update_plugins':\n if (!pluginUpdates) {\n return {\n content: [\n {\n type: 'text' as const,\n text: '❌ **Error**: No plugin updates provided for update_plugins update type',\n },\n ],\n }\n }\n updatedContent = updatePluginsConfig(currentContent, pluginUpdates)\n updateSummary = []\n if (pluginUpdates.add) {\n updateSummary.push(`Added plugins: ${pluginUpdates.add.join(', ')}`)\n }\n if (pluginUpdates.remove) {\n updateSummary.push(`Removed plugins: ${pluginUpdates.remove.join(', ')}`)\n }\n break\n\n default:\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error**: Unknown update type: ${updateType}`,\n },\n ],\n }\n }\n\n // Write the updated content back to the file\n writeFileSync(configFilePath, updatedContent, 'utf8')\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Successfully updated config file: ${configFilePath}`)\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `✅ **Config updated successfully!**\n\n**File**: \\`${configFilePath}\\`\n**Update Type**: ${updateType}\n\n**Changes Made**:\n${updateSummary.map((summary) => `- ${summary}`).join('\\n')}\n\n**Updated Config Content:**\n\\`\\`\\`typescript\n${updatedContent}\n\\`\\`\\``,\n },\n ],\n }\n } catch (error) {\n const errorMessage = (error as Error).message\n payload.logger.error(`[payload-mcp] Error updating config: ${errorMessage}`)\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error updating config**: ${errorMessage}`,\n },\n ],\n }\n }\n}\n\nexport const updateConfigTool = (\n server: McpServer,\n req: PayloadRequest,\n verboseLogs: boolean,\n configFilePath: string,\n) => {\n const tool = ({\n adminConfig,\n collectionName,\n databaseConfig,\n generalConfig,\n newContent,\n pluginUpdates,\n updateType,\n }: {\n adminConfig?: any\n collectionName?: string\n databaseConfig?: any\n generalConfig?: any\n newContent?: string\n pluginUpdates?: any\n updateType: string\n }) => {\n const payload = req.payload\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Updating config: ${updateType}`)\n }\n\n try {\n const result = updateConfig(\n req,\n verboseLogs,\n configFilePath,\n updateType,\n collectionName,\n adminConfig,\n databaseConfig,\n pluginUpdates,\n generalConfig,\n newContent,\n )\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Config update completed for: ${updateType}`)\n }\n\n return result\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n payload.logger.error(`[payload-mcp] Error updating config: ${errorMessage}`)\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `Error updating config: ${errorMessage}`,\n },\n ],\n }\n }\n }\n\n server.registerTool(\n 'updateConfig',\n {\n description: toolSchemas.updateConfig.description,\n inputSchema: toolSchemas.updateConfig.parameters.shape,\n },\n (args) => {\n return tool(args)\n },\n )\n}\n"],"names":["readFileSync","writeFileSync","addCollectionToConfig","removeCollectionFromConfig","updateAdminConfig","updateDatabaseConfig","updatePluginsConfig","toolSchemas","updateConfig","req","verboseLogs","configFilePath","updateType","collectionName","adminConfig","databaseConfig","pluginUpdates","generalConfig","newContent","payload","logger","info","startsWith","process","cwd","error","content","type","text","currentContent","_ignore","updatedContent","updateSummary","Object","keys","map","key","add","push","join","remove","summary","errorMessage","message","updateConfigTool","server","tool","result","Error","registerTool","description","inputSchema","parameters","shape","args"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/mcp/tools/config/update.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { PayloadRequest } from 'payload'\n\nimport { readFileSync, writeFileSync } from 'fs'\n\nimport {\n addCollectionToConfig,\n removeCollectionFromConfig,\n updateAdminConfig,\n updateDatabaseConfig,\n updatePluginsConfig,\n} from '../../helpers/config.js'\nimport { toolSchemas } from '../schemas.js'\n\nexport const updateConfig = (\n req: PayloadRequest,\n verboseLogs: boolean,\n configFilePath: string,\n updateType: string,\n collectionName?: string,\n adminConfig?: any,\n databaseConfig?: any,\n pluginUpdates?: any,\n newContent?: string,\n) => {\n const payload = req.payload\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Updating config with update type: ${updateType}`)\n }\n\n // Security check: ensure we're working with the specified config file\n if (!configFilePath.startsWith(process.cwd()) && !configFilePath.startsWith('/')) {\n payload.logger.error(`[payload-mcp] Invalid config path attempted: ${configFilePath}`)\n return {\n content: [\n {\n type: 'text' as const,\n text: '❌ **Error**: Invalid config path',\n },\n ],\n }\n }\n\n try {\n // Read current config\n let currentContent: string\n try {\n currentContent = readFileSync(configFilePath, 'utf8')\n } catch (_ignore) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error**: Config file not found: ${configFilePath}`,\n },\n ],\n }\n }\n\n let updatedContent: string\n let updateSummary: string[] = []\n\n switch (updateType) {\n case 'add_collection':\n if (!collectionName) {\n return {\n content: [\n {\n type: 'text' as const,\n text: '❌ **Error**: No collection name provided for add_collection update type',\n },\n ],\n }\n }\n updatedContent = addCollectionToConfig(currentContent, collectionName)\n updateSummary = [`Added collection: ${collectionName}`]\n break\n\n case 'remove_collection':\n if (!collectionName) {\n return {\n content: [\n {\n type: 'text' as const,\n text: '❌ **Error**: No collection name provided for remove_collection update type',\n },\n ],\n }\n }\n updatedContent = removeCollectionFromConfig(currentContent, collectionName)\n updateSummary = [`Removed collection: ${collectionName}`]\n break\n\n case 'replace_content':\n if (!newContent) {\n return {\n content: [\n {\n type: 'text' as const,\n text: '❌ **Error**: No new content provided for replace_content update type',\n },\n ],\n }\n }\n updatedContent = newContent\n updateSummary = ['Replaced entire config content']\n break\n\n case 'update_admin':\n if (!adminConfig) {\n return {\n content: [\n {\n type: 'text' as const,\n text: '❌ **Error**: No admin config provided for update_admin update type',\n },\n ],\n }\n }\n updatedContent = updateAdminConfig(currentContent, adminConfig)\n updateSummary = Object.keys(adminConfig).map((key) => `Updated admin config: ${key}`)\n break\n\n case 'update_database':\n if (!databaseConfig) {\n return {\n content: [\n {\n type: 'text' as const,\n text: '❌ **Error**: No database config provided for update_database update type',\n },\n ],\n }\n }\n updatedContent = updateDatabaseConfig(currentContent, databaseConfig)\n updateSummary = Object.keys(databaseConfig).map((key) => `Updated database config: ${key}`)\n break\n\n case 'update_plugins':\n if (!pluginUpdates) {\n return {\n content: [\n {\n type: 'text' as const,\n text: '❌ **Error**: No plugin updates provided for update_plugins update type',\n },\n ],\n }\n }\n updatedContent = updatePluginsConfig(currentContent, pluginUpdates)\n updateSummary = []\n if (pluginUpdates.add) {\n updateSummary.push(`Added plugins: ${pluginUpdates.add.join(', ')}`)\n }\n if (pluginUpdates.remove) {\n updateSummary.push(`Removed plugins: ${pluginUpdates.remove.join(', ')}`)\n }\n break\n\n default:\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error**: Unknown update type: ${updateType}`,\n },\n ],\n }\n }\n\n // Write the updated content back to the file\n writeFileSync(configFilePath, updatedContent, 'utf8')\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Successfully updated config file: ${configFilePath}`)\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `✅ **Config updated successfully!**\n\n**File**: \\`${configFilePath}\\`\n**Update Type**: ${updateType}\n\n**Changes Made**:\n${updateSummary.map((summary) => `- ${summary}`).join('\\n')}\n\n**Updated Config Content:**\n\\`\\`\\`typescript\n${updatedContent}\n\\`\\`\\``,\n },\n ],\n }\n } catch (error) {\n const errorMessage = (error as Error).message\n payload.logger.error(`[payload-mcp] Error updating config: ${errorMessage}`)\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error updating config**: ${errorMessage}`,\n },\n ],\n }\n }\n}\n\nexport const updateConfigTool = (\n server: McpServer,\n req: PayloadRequest,\n verboseLogs: boolean,\n configFilePath: string,\n) => {\n const tool = ({\n adminConfig,\n collectionName,\n databaseConfig,\n newContent,\n pluginUpdates,\n updateType,\n }: {\n adminConfig?: any\n collectionName?: string\n databaseConfig?: any\n newContent?: string\n pluginUpdates?: any\n updateType: string\n }) => {\n const payload = req.payload\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Updating config: ${updateType}`)\n }\n\n try {\n const result = updateConfig(\n req,\n verboseLogs,\n configFilePath,\n updateType,\n collectionName,\n adminConfig,\n databaseConfig,\n pluginUpdates,\n newContent,\n )\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Config update completed for: ${updateType}`)\n }\n\n return result\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n payload.logger.error(`[payload-mcp] Error updating config: ${errorMessage}`)\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `Error updating config: ${errorMessage}`,\n },\n ],\n }\n }\n }\n\n server.registerTool(\n 'updateConfig',\n {\n description: toolSchemas.updateConfig.description,\n inputSchema: toolSchemas.updateConfig.parameters.shape,\n },\n (args) => {\n return tool(args)\n },\n )\n}\n"],"names":["readFileSync","writeFileSync","addCollectionToConfig","removeCollectionFromConfig","updateAdminConfig","updateDatabaseConfig","updatePluginsConfig","toolSchemas","updateConfig","req","verboseLogs","configFilePath","updateType","collectionName","adminConfig","databaseConfig","pluginUpdates","newContent","payload","logger","info","startsWith","process","cwd","error","content","type","text","currentContent","_ignore","updatedContent","updateSummary","Object","keys","map","key","add","push","join","remove","summary","errorMessage","message","updateConfigTool","server","tool","result","Error","registerTool","description","inputSchema","parameters","shape","args"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/job/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAsH7C,eAAO,MAAM,SAAS,QACf,cAAc,eACN,OAAO,WACX,MAAM,WACN,MAAM,WACN,MAAM,GAAG,UAAU,WACnB,MAAM,eACF,MAAM,eACN,GAAG,gBACF,GAAG,WACR,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;;;;;EA4I7B,CAAA;AA+ED,eAAO,MAAM,aAAa,WAChB,SAAS,OACZ,cAAc,eACN,OAAO,WACX,MAAM,SAqEhB,CAAA"}
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/job/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAuH7C,eAAO,MAAM,SAAS,QACf,cAAc,eACN,OAAO,WACX,MAAM,WACN,MAAM,WACN,MAAM,GAAG,UAAU,WACnB,MAAM,eACF,MAAM,eACN,GAAG,gBACF,GAAG,WACR,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;;;;;EA4I7B,CAAA;AAwED,eAAO,MAAM,aAAa,WAChB,SAAS,OACZ,cAAc,eACN,OAAO,WACX,MAAM,SAqEhB,CAAA"}
@@ -1,5 +1,6 @@
1
1
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
2
2
  import { join } from 'path';
3
+ import { toCamelCase } from '../../../utils/camelCase.js';
3
4
  import { validatePayloadFile } from '../../helpers/fileValidation.js';
4
5
  import { toolSchemas } from '../schemas.js';
5
6
  const createOrUpdateJobFile = (req, verboseLogs, jobsDir, jobName, jobType, jobSlug, camelCaseJobSlug)=>{
@@ -206,7 +207,7 @@ ${jobContent}
206
207
  }
207
208
  };
208
209
  // Helper function to generate task content
209
- function generateTaskContent(jobName, jobSlug, description, inputSchema, outputSchema, jobData) {
210
+ function generateTaskContent(_jobName, jobSlug, description, inputSchema, outputSchema, _jobData) {
210
211
  const camelCaseJobSlug = toCamelCase(jobSlug);
211
212
  return `import type { Task } from 'payload'
212
213
 
@@ -233,7 +234,7 @@ export const ${camelCaseJobSlug}Task: Task = {
233
234
  `;
234
235
  }
235
236
  // Helper function to generate workflow content
236
- function generateWorkflowContent(jobName, jobSlug, description, inputSchema, outputSchema, jobData) {
237
+ function generateWorkflowContent(_jobName, jobSlug, description, inputSchema, outputSchema, _jobData) {
237
238
  const camelCaseJobSlug = toCamelCase(jobSlug);
238
239
  return `import type { Workflow } from 'payload'
239
240
 
@@ -257,10 +258,6 @@ export const ${camelCaseJobSlug}Workflow: Workflow = {
257
258
  }
258
259
  `;
259
260
  }
260
- // Helper function to convert to camel case
261
- function toCamelCase(str) {
262
- return str.replace(/[-_\s]+(.)?/g, (_, chr)=>chr ? chr.toUpperCase() : '').replace(/^(.)/, (_, chr)=>chr.toLowerCase());
263
- }
264
261
  export const createJobTool = (server, req, verboseLogs, jobsDir)=>{
265
262
  const tool = async (jobName, jobType, jobSlug, description, inputSchema = {}, outputSchema = {}, jobData = {})=>{
266
263
  if (verboseLogs) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/mcp/tools/job/create.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { PayloadRequest } from 'payload'\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'\nimport { join } from 'path'\n\nimport { validatePayloadFile } from '../../helpers/fileValidation.js'\nimport { toolSchemas } from '../schemas.js'\n\nconst createOrUpdateJobFile = (\n req: PayloadRequest,\n verboseLogs: boolean,\n jobsDir: string,\n jobName: string,\n jobType: 'task' | 'workflow',\n jobSlug: string,\n camelCaseJobSlug: string,\n) => {\n const payload = req.payload\n const jobFilePath = join(jobsDir, `${jobName}.ts`)\n const importName = `${camelCaseJobSlug}${jobType === 'task' ? 'Task' : 'Workflow'}`\n const importPath = `./${jobType === 'task' ? 'tasks' : 'workflows'}/${camelCaseJobSlug}`\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Processing job file: ${jobFilePath}`)\n }\n\n if (existsSync(jobFilePath)) {\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Updating existing job file: ${jobFilePath}`)\n }\n\n // Update existing job file\n let content = readFileSync(jobFilePath, 'utf8')\n\n // Add import if not already present\n const importStatement = `import { ${importName} } from '${importPath}'`\n if (!content.includes(importStatement)) {\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Adding import: ${importStatement}`)\n }\n\n // Find the last import statement and add after it\n const importRegex = /import\\s+(?:\\S.*)?from\\s+['\"].*['\"];?\\s*\\n/g\n let lastImportMatch\n let match\n while ((match = importRegex.exec(content)) !== null) {\n lastImportMatch = match\n }\n\n if (lastImportMatch) {\n const insertIndex = lastImportMatch.index + lastImportMatch[0].length\n content =\n content.slice(0, insertIndex) + importStatement + '\\n' + content.slice(insertIndex)\n } else {\n // No imports found, add at the beginning\n content = importStatement + '\\n\\n' + content\n }\n }\n\n // Add to the appropriate array\n const arrayName = jobType === 'task' ? 'tasks' : 'workflows'\n const arrayRegex = new RegExp(`(${arrayName}:\\\\s*\\\\[)([^\\\\]]*)(\\\\])`, 's')\n const arrayMatch = content.match(arrayRegex)\n\n if (arrayMatch && arrayMatch[2]) {\n const existingItems = arrayMatch[2].trim()\n const newItem = existingItems ? `${existingItems},\\n ${importName}` : `\\n ${importName}`\n content = content.replace(arrayRegex, `$1${newItem}\\n $3`)\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Added ${importName} to ${arrayName} array`)\n }\n } else {\n // Array doesn't exist, add it\n const jobsConfigRegex = /(export\\s+const\\s.*JobsConfig\\s*=\\s*\\{)([^}]*)(\\})/s\n const jobsConfigMatch = content.match(jobsConfigRegex)\n\n if (jobsConfigMatch && jobsConfigMatch[2]) {\n const existingConfig = jobsConfigMatch[2].trim()\n const newConfig = existingConfig\n ? `${existingConfig},\\n ${arrayName}: [\\n ${importName}\\n ]`\n : `\\n ${arrayName}: [\\n ${importName}\\n ]`\n content = content.replace(jobsConfigRegex, `$1${newConfig}\\n$3`)\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Created new ${arrayName} array with ${importName}`)\n }\n }\n }\n\n writeFileSync(jobFilePath, content)\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Successfully updated job file: ${jobFilePath}`)\n }\n } else {\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Creating new job file: ${jobFilePath}`)\n }\n\n // Create new job file\n const camelCaseJobName = toCamelCase(jobName)\n const jobFileContent = `import type { JobsConfig } from 'payload'\nimport { ${importName} } from '${importPath}'\n\nexport const ${camelCaseJobName}JobsConfig: JobsConfig = {\n ${jobType === 'task' ? 'tasks' : 'workflows'}: [\n ${importName}\n ]\n}\n`\n writeFileSync(jobFilePath, jobFileContent)\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Successfully created new job file: ${jobFilePath}`)\n }\n }\n}\n\n// Reusable function for creating jobs\nexport const createJob = async (\n req: PayloadRequest,\n verboseLogs: boolean,\n jobsDir: string,\n jobName: string,\n jobType: 'task' | 'workflow',\n jobSlug: string,\n description: string,\n inputSchema: any,\n outputSchema: any,\n jobData: Record<string, any>,\n) => {\n const payload = req.payload\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Creating ${jobType}: ${jobName}`)\n }\n\n try {\n // Ensure jobs directory exists\n if (!existsSync(jobsDir)) {\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Creating jobs directory: ${jobsDir}`)\n }\n mkdirSync(jobsDir, { recursive: true })\n }\n\n // Ensure subdirectories exist\n const tasksDir = join(jobsDir, 'tasks')\n const workflowsDir = join(jobsDir, 'workflows')\n\n if (!existsSync(tasksDir)) {\n mkdirSync(tasksDir, { recursive: true })\n }\n if (!existsSync(workflowsDir)) {\n mkdirSync(workflowsDir, { recursive: true })\n }\n\n const camelCaseJobSlug = toCamelCase(jobSlug)\n const targetDir = jobType === 'task' ? tasksDir : workflowsDir\n const fileName = `${camelCaseJobSlug}.ts`\n const filePath = join(targetDir, fileName)\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Target file path: ${filePath}`)\n }\n\n // Security check: ensure we're working with the jobs directory\n if (!filePath.startsWith(jobsDir)) {\n payload.logger.error(`[payload-mcp] Invalid job path attempted: ${filePath}`)\n return {\n content: [\n {\n type: 'text' as const,\n text: '❌ **Error**: Invalid job path',\n },\n ],\n }\n }\n\n // Check if file already exists\n if (existsSync(filePath)) {\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Job file already exists: ${fileName}`)\n }\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error**: Job file already exists: ${fileName}`,\n },\n ],\n }\n }\n\n // Generate job content based on type\n let jobContent: string\n if (jobType === 'task') {\n jobContent = generateTaskContent(\n jobName,\n jobSlug,\n description,\n inputSchema,\n outputSchema,\n jobData,\n )\n } else {\n jobContent = generateWorkflowContent(\n jobName,\n jobSlug,\n description,\n inputSchema,\n outputSchema,\n jobData,\n )\n }\n\n // Write the job file\n writeFileSync(filePath, jobContent, 'utf8')\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Successfully created job file: ${filePath}`)\n }\n\n // Update the main job file\n createOrUpdateJobFile(req, verboseLogs, jobsDir, jobName, jobType, jobSlug, camelCaseJobSlug)\n\n // Validate the generated file\n const validationResult = await validatePayloadFile(fileName, jobType)\n if (validationResult.error) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error**: Generated job has validation issues:\\n\\n${validationResult.error}`,\n },\n ],\n }\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `✅ **Job created successfully!**\n\n**File**: \\`${fileName}\\`\n**Type**: \\`${jobType}\\`\n**Slug**: \\`${jobSlug}\\`\n**Description**: ${description}\n\n**Generated Job Code:**\n\\`\\`\\`typescript\n${jobContent}\n\\`\\`\\``,\n },\n ],\n }\n } catch (error) {\n const errorMessage = (error as Error).message\n payload.logger.error(`[payload-mcp] Error creating job: ${errorMessage}`)\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error creating job**: ${errorMessage}`,\n },\n ],\n }\n }\n}\n\n// Helper function to generate task content\nfunction generateTaskContent(\n jobName: string,\n jobSlug: string,\n description: string,\n inputSchema: any,\n outputSchema: any,\n jobData: Record<string, any>,\n): string {\n const camelCaseJobSlug = toCamelCase(jobSlug)\n\n return `import type { Task } from 'payload'\n\nexport const ${camelCaseJobSlug}Task: Task = {\n slug: '${jobSlug}',\n description: '${description}',\n inputSchema: ${JSON.stringify(inputSchema, null, 2)},\n outputSchema: ${JSON.stringify(outputSchema, null, 2)},\n handler: async (input, context) => {\n // TODO: Implement your task logic here\n // Access input data: input.fieldName\n // Access context: context.payload, context.req, etc.\n\n // Example implementation:\n const result = {\n message: 'Task executed successfully',\n input,\n timestamp: new Date().toISOString(),\n }\n\n return result\n },\n}\n`\n}\n\n// Helper function to generate workflow content\nfunction generateWorkflowContent(\n jobName: string,\n jobSlug: string,\n description: string,\n inputSchema: any,\n outputSchema: any,\n jobData: Record<string, any>,\n): string {\n const camelCaseJobSlug = toCamelCase(jobSlug)\n\n return `import type { Workflow } from 'payload'\n\nexport const ${camelCaseJobSlug}Workflow: Workflow = {\n slug: '${jobSlug}',\n description: '${description}',\n inputSchema: ${JSON.stringify(inputSchema, null, 2)},\n outputSchema: ${JSON.stringify(outputSchema, null, 2)},\n steps: [\n // TODO: Define your workflow steps here\n // Each step should be a function that returns a result\n // Example:\n // {\n // name: 'step1',\n // handler: async (input, context) => {\n // // Step logic here\n // return { result: 'step1 completed' }\n // }\n // }\n ],\n}\n`\n}\n\n// Helper function to convert to camel case\nfunction toCamelCase(str: string): string {\n return str\n .replace(/[-_\\s]+(.)?/g, (_, chr) => (chr ? chr.toUpperCase() : ''))\n .replace(/^(.)/, (_, chr) => chr.toLowerCase())\n}\n\nexport const createJobTool = (\n server: McpServer,\n req: PayloadRequest,\n verboseLogs: boolean,\n jobsDir: string,\n) => {\n const tool = async (\n jobName: string,\n jobType: 'task' | 'workflow',\n jobSlug: string,\n description: string,\n inputSchema: any = {},\n outputSchema: any = {},\n jobData: Record<string, any> = {},\n ) => {\n if (verboseLogs) {\n req.payload.logger.info(\n `[payload-mcp] Create Job Tool called with: ${jobName}, ${jobType}, ${jobSlug}`,\n )\n }\n\n try {\n const result = await createJob(\n req,\n verboseLogs,\n jobsDir,\n jobName,\n jobType,\n jobSlug,\n description,\n inputSchema,\n outputSchema,\n jobData,\n )\n\n if (verboseLogs) {\n req.payload.logger.info(`[payload-mcp] Create Job Tool completed successfully`)\n }\n\n return result\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n req.payload.logger.error(`[payload-mcp] Error in Create Job Tool: ${errorMessage}`)\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error in Create Job Tool**: ${errorMessage}`,\n },\n ],\n }\n }\n }\n\n server.registerTool(\n 'createJob',\n {\n description: 'Creates a new Payload job (task or workflow) with specified configuration',\n inputSchema: toolSchemas.createJob.parameters.shape,\n },\n async (args) => {\n return tool(\n args.jobName,\n args.jobType,\n args.jobSlug,\n args.description,\n args.inputSchema,\n args.outputSchema,\n args.jobData,\n )\n },\n )\n}\n"],"names":["existsSync","mkdirSync","readFileSync","writeFileSync","join","validatePayloadFile","toolSchemas","createOrUpdateJobFile","req","verboseLogs","jobsDir","jobName","jobType","jobSlug","camelCaseJobSlug","payload","jobFilePath","importName","importPath","logger","info","content","importStatement","includes","importRegex","lastImportMatch","match","exec","insertIndex","index","length","slice","arrayName","arrayRegex","RegExp","arrayMatch","existingItems","trim","newItem","replace","jobsConfigRegex","jobsConfigMatch","existingConfig","newConfig","camelCaseJobName","toCamelCase","jobFileContent","createJob","description","inputSchema","outputSchema","jobData","recursive","tasksDir","workflowsDir","targetDir","fileName","filePath","startsWith","error","type","text","jobContent","generateTaskContent","generateWorkflowContent","validationResult","errorMessage","message","JSON","stringify","str","_","chr","toUpperCase","toLowerCase","createJobTool","server","tool","result","Error","registerTool","parameters","shape","args"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/mcp/tools/job/create.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { PayloadRequest } from 'payload'\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'\nimport { join } from 'path'\n\nimport { toCamelCase } from '../../../utils/camelCase.js'\nimport { validatePayloadFile } from '../../helpers/fileValidation.js'\nimport { toolSchemas } from '../schemas.js'\n\nconst createOrUpdateJobFile = (\n req: PayloadRequest,\n verboseLogs: boolean,\n jobsDir: string,\n jobName: string,\n jobType: 'task' | 'workflow',\n jobSlug: string,\n camelCaseJobSlug: string,\n) => {\n const payload = req.payload\n const jobFilePath = join(jobsDir, `${jobName}.ts`)\n const importName = `${camelCaseJobSlug}${jobType === 'task' ? 'Task' : 'Workflow'}`\n const importPath = `./${jobType === 'task' ? 'tasks' : 'workflows'}/${camelCaseJobSlug}`\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Processing job file: ${jobFilePath}`)\n }\n\n if (existsSync(jobFilePath)) {\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Updating existing job file: ${jobFilePath}`)\n }\n\n // Update existing job file\n let content = readFileSync(jobFilePath, 'utf8')\n\n // Add import if not already present\n const importStatement = `import { ${importName} } from '${importPath}'`\n if (!content.includes(importStatement)) {\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Adding import: ${importStatement}`)\n }\n\n // Find the last import statement and add after it\n const importRegex = /import\\s+(?:\\S.*)?from\\s+['\"].*['\"];?\\s*\\n/g\n let lastImportMatch\n let match\n while ((match = importRegex.exec(content)) !== null) {\n lastImportMatch = match\n }\n\n if (lastImportMatch) {\n const insertIndex = lastImportMatch.index + lastImportMatch[0].length\n content =\n content.slice(0, insertIndex) + importStatement + '\\n' + content.slice(insertIndex)\n } else {\n // No imports found, add at the beginning\n content = importStatement + '\\n\\n' + content\n }\n }\n\n // Add to the appropriate array\n const arrayName = jobType === 'task' ? 'tasks' : 'workflows'\n const arrayRegex = new RegExp(`(${arrayName}:\\\\s*\\\\[)([^\\\\]]*)(\\\\])`, 's')\n const arrayMatch = content.match(arrayRegex)\n\n if (arrayMatch && arrayMatch[2]) {\n const existingItems = arrayMatch[2].trim()\n const newItem = existingItems ? `${existingItems},\\n ${importName}` : `\\n ${importName}`\n content = content.replace(arrayRegex, `$1${newItem}\\n $3`)\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Added ${importName} to ${arrayName} array`)\n }\n } else {\n // Array doesn't exist, add it\n const jobsConfigRegex = /(export\\s+const\\s.*JobsConfig\\s*=\\s*\\{)([^}]*)(\\})/s\n const jobsConfigMatch = content.match(jobsConfigRegex)\n\n if (jobsConfigMatch && jobsConfigMatch[2]) {\n const existingConfig = jobsConfigMatch[2].trim()\n const newConfig = existingConfig\n ? `${existingConfig},\\n ${arrayName}: [\\n ${importName}\\n ]`\n : `\\n ${arrayName}: [\\n ${importName}\\n ]`\n content = content.replace(jobsConfigRegex, `$1${newConfig}\\n$3`)\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Created new ${arrayName} array with ${importName}`)\n }\n }\n }\n\n writeFileSync(jobFilePath, content)\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Successfully updated job file: ${jobFilePath}`)\n }\n } else {\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Creating new job file: ${jobFilePath}`)\n }\n\n // Create new job file\n const camelCaseJobName = toCamelCase(jobName)\n const jobFileContent = `import type { JobsConfig } from 'payload'\nimport { ${importName} } from '${importPath}'\n\nexport const ${camelCaseJobName}JobsConfig: JobsConfig = {\n ${jobType === 'task' ? 'tasks' : 'workflows'}: [\n ${importName}\n ]\n}\n`\n writeFileSync(jobFilePath, jobFileContent)\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Successfully created new job file: ${jobFilePath}`)\n }\n }\n}\n\n// Reusable function for creating jobs\nexport const createJob = async (\n req: PayloadRequest,\n verboseLogs: boolean,\n jobsDir: string,\n jobName: string,\n jobType: 'task' | 'workflow',\n jobSlug: string,\n description: string,\n inputSchema: any,\n outputSchema: any,\n jobData: Record<string, any>,\n) => {\n const payload = req.payload\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Creating ${jobType}: ${jobName}`)\n }\n\n try {\n // Ensure jobs directory exists\n if (!existsSync(jobsDir)) {\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Creating jobs directory: ${jobsDir}`)\n }\n mkdirSync(jobsDir, { recursive: true })\n }\n\n // Ensure subdirectories exist\n const tasksDir = join(jobsDir, 'tasks')\n const workflowsDir = join(jobsDir, 'workflows')\n\n if (!existsSync(tasksDir)) {\n mkdirSync(tasksDir, { recursive: true })\n }\n if (!existsSync(workflowsDir)) {\n mkdirSync(workflowsDir, { recursive: true })\n }\n\n const camelCaseJobSlug = toCamelCase(jobSlug)\n const targetDir = jobType === 'task' ? tasksDir : workflowsDir\n const fileName = `${camelCaseJobSlug}.ts`\n const filePath = join(targetDir, fileName)\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Target file path: ${filePath}`)\n }\n\n // Security check: ensure we're working with the jobs directory\n if (!filePath.startsWith(jobsDir)) {\n payload.logger.error(`[payload-mcp] Invalid job path attempted: ${filePath}`)\n return {\n content: [\n {\n type: 'text' as const,\n text: '❌ **Error**: Invalid job path',\n },\n ],\n }\n }\n\n // Check if file already exists\n if (existsSync(filePath)) {\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Job file already exists: ${fileName}`)\n }\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error**: Job file already exists: ${fileName}`,\n },\n ],\n }\n }\n\n // Generate job content based on type\n let jobContent: string\n if (jobType === 'task') {\n jobContent = generateTaskContent(\n jobName,\n jobSlug,\n description,\n inputSchema,\n outputSchema,\n jobData,\n )\n } else {\n jobContent = generateWorkflowContent(\n jobName,\n jobSlug,\n description,\n inputSchema,\n outputSchema,\n jobData,\n )\n }\n\n // Write the job file\n writeFileSync(filePath, jobContent, 'utf8')\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Successfully created job file: ${filePath}`)\n }\n\n // Update the main job file\n createOrUpdateJobFile(req, verboseLogs, jobsDir, jobName, jobType, jobSlug, camelCaseJobSlug)\n\n // Validate the generated file\n const validationResult = await validatePayloadFile(fileName, jobType)\n if (validationResult.error) {\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error**: Generated job has validation issues:\\n\\n${validationResult.error}`,\n },\n ],\n }\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `✅ **Job created successfully!**\n\n**File**: \\`${fileName}\\`\n**Type**: \\`${jobType}\\`\n**Slug**: \\`${jobSlug}\\`\n**Description**: ${description}\n\n**Generated Job Code:**\n\\`\\`\\`typescript\n${jobContent}\n\\`\\`\\``,\n },\n ],\n }\n } catch (error) {\n const errorMessage = (error as Error).message\n payload.logger.error(`[payload-mcp] Error creating job: ${errorMessage}`)\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error creating job**: ${errorMessage}`,\n },\n ],\n }\n }\n}\n\n// Helper function to generate task content\nfunction generateTaskContent(\n _jobName: string,\n jobSlug: string,\n description: string,\n inputSchema: any,\n outputSchema: any,\n _jobData: Record<string, any>,\n): string {\n const camelCaseJobSlug = toCamelCase(jobSlug)\n\n return `import type { Task } from 'payload'\n\nexport const ${camelCaseJobSlug}Task: Task = {\n slug: '${jobSlug}',\n description: '${description}',\n inputSchema: ${JSON.stringify(inputSchema, null, 2)},\n outputSchema: ${JSON.stringify(outputSchema, null, 2)},\n handler: async (input, context) => {\n // TODO: Implement your task logic here\n // Access input data: input.fieldName\n // Access context: context.payload, context.req, etc.\n\n // Example implementation:\n const result = {\n message: 'Task executed successfully',\n input,\n timestamp: new Date().toISOString(),\n }\n\n return result\n },\n}\n`\n}\n\n// Helper function to generate workflow content\nfunction generateWorkflowContent(\n _jobName: string,\n jobSlug: string,\n description: string,\n inputSchema: any,\n outputSchema: any,\n _jobData: Record<string, any>,\n): string {\n const camelCaseJobSlug = toCamelCase(jobSlug)\n\n return `import type { Workflow } from 'payload'\n\nexport const ${camelCaseJobSlug}Workflow: Workflow = {\n slug: '${jobSlug}',\n description: '${description}',\n inputSchema: ${JSON.stringify(inputSchema, null, 2)},\n outputSchema: ${JSON.stringify(outputSchema, null, 2)},\n steps: [\n // TODO: Define your workflow steps here\n // Each step should be a function that returns a result\n // Example:\n // {\n // name: 'step1',\n // handler: async (input, context) => {\n // // Step logic here\n // return { result: 'step1 completed' }\n // }\n // }\n ],\n}\n`\n}\n\nexport const createJobTool = (\n server: McpServer,\n req: PayloadRequest,\n verboseLogs: boolean,\n jobsDir: string,\n) => {\n const tool = async (\n jobName: string,\n jobType: 'task' | 'workflow',\n jobSlug: string,\n description: string,\n inputSchema: any = {},\n outputSchema: any = {},\n jobData: Record<string, any> = {},\n ) => {\n if (verboseLogs) {\n req.payload.logger.info(\n `[payload-mcp] Create Job Tool called with: ${jobName}, ${jobType}, ${jobSlug}`,\n )\n }\n\n try {\n const result = await createJob(\n req,\n verboseLogs,\n jobsDir,\n jobName,\n jobType,\n jobSlug,\n description,\n inputSchema,\n outputSchema,\n jobData,\n )\n\n if (verboseLogs) {\n req.payload.logger.info(`[payload-mcp] Create Job Tool completed successfully`)\n }\n\n return result\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n req.payload.logger.error(`[payload-mcp] Error in Create Job Tool: ${errorMessage}`)\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error in Create Job Tool**: ${errorMessage}`,\n },\n ],\n }\n }\n }\n\n server.registerTool(\n 'createJob',\n {\n description: 'Creates a new Payload job (task or workflow) with specified configuration',\n inputSchema: toolSchemas.createJob.parameters.shape,\n },\n async (args) => {\n return tool(\n args.jobName,\n args.jobType,\n args.jobSlug,\n args.description,\n args.inputSchema,\n args.outputSchema,\n args.jobData,\n )\n },\n )\n}\n"],"names":["existsSync","mkdirSync","readFileSync","writeFileSync","join","toCamelCase","validatePayloadFile","toolSchemas","createOrUpdateJobFile","req","verboseLogs","jobsDir","jobName","jobType","jobSlug","camelCaseJobSlug","payload","jobFilePath","importName","importPath","logger","info","content","importStatement","includes","importRegex","lastImportMatch","match","exec","insertIndex","index","length","slice","arrayName","arrayRegex","RegExp","arrayMatch","existingItems","trim","newItem","replace","jobsConfigRegex","jobsConfigMatch","existingConfig","newConfig","camelCaseJobName","jobFileContent","createJob","description","inputSchema","outputSchema","jobData","recursive","tasksDir","workflowsDir","targetDir","fileName","filePath","startsWith","error","type","text","jobContent","generateTaskContent","generateWorkflowContent","validationResult","errorMessage","message","_jobName","_jobData","JSON","stringify","createJobTool","server","tool","result","Error","registerTool","parameters","shape","args"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
2
  import type { PayloadRequest } from 'payload';
3
- export declare const runJob: (req: PayloadRequest, verboseLogs: boolean, jobSlug: string, input: Record<string, any>, queue?: string, priority?: number, delay?: number) => Promise<{
3
+ export declare const runJob: (req: PayloadRequest, verboseLogs: boolean, jobSlug: string, input: Record<string, unknown>, queue?: string, priority?: number, delay?: number) => Promise<{
4
4
  content: {
5
5
  type: "text";
6
6
  text: string;
@@ -1 +1 @@
1
- {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/job/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAK7C,eAAO,MAAM,MAAM,QACZ,cAAc,eACN,OAAO,WACX,MAAM,SACR,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,UAClB,MAAM,aACH,MAAM,UACT,MAAM;;;;;EAiIf,CAAA;AAED,eAAO,MAAM,UAAU,WAAY,SAAS,OAAO,cAAc,eAAe,OAAO,SA8CtF,CAAA"}
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/job/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAK7C,eAAO,MAAM,MAAM,QACZ,cAAc,eACN,OAAO,WACX,MAAM,SACR,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,UACtB,MAAM,aACH,MAAM,UACT,MAAM;;;;;EAiIf,CAAA;AAED,eAAO,MAAM,UAAU,WAAY,SAAS,OAAO,cAAc,eAAe,OAAO,SAsBtF,CAAA"}
@@ -115,35 +115,14 @@ ${JSON.stringify(input, null, 2)}
115
115
  }
116
116
  };
117
117
  export const runJobTool = (server, req, verboseLogs)=>{
118
- const tool = async (jobSlug, input, queue, priority, delay)=>{
119
- if (verboseLogs) {
120
- req.payload.logger.info(`[payload-mcp] Run Job Tool called with: ${jobSlug}`);
121
- }
122
- try {
123
- const result = await runJob(req, verboseLogs, jobSlug, input, queue, priority, delay);
124
- if (verboseLogs) {
125
- req.payload.logger.info(`[payload-mcp] Run Job Tool completed successfully`);
126
- }
127
- return result;
128
- } catch (error) {
129
- const errorMessage = error instanceof Error ? error.message : 'Unknown error';
130
- req.payload.logger.error(`[payload-mcp] Error in Run Job Tool: ${errorMessage}`);
131
- return {
132
- content: [
133
- {
134
- type: 'text',
135
- text: `❌ **Error in Run Job Tool**: ${errorMessage}`
136
- }
137
- ]
138
- };
139
- }
140
- };
141
118
  server.registerTool('runJob', {
142
119
  description: 'Runs a Payload job with specified input data and queue options',
143
120
  inputSchema: toolSchemas.runJob.parameters.shape
144
- }, async (args)=>{
145
- const { delay, input, jobSlug, priority, queue } = args;
146
- return await tool(jobSlug, input, queue, priority, delay);
121
+ }, async ({ delay, input, jobSlug, priority, queue })=>{
122
+ if (verboseLogs) {
123
+ req.payload.logger.info(`[payload-mcp] Run Job Tool called with: ${jobSlug}`);
124
+ }
125
+ return runJob(req, verboseLogs, jobSlug, input, queue, priority, delay);
147
126
  });
148
127
  };
149
128