@payloadcms/plugin-mcp 0.0.1-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (173) hide show
  1. package/LICENSE.md +22 -0
  2. package/README.md +7 -0
  3. package/dist/collections/createApiKeysCollection.d.ts +7 -0
  4. package/dist/collections/createApiKeysCollection.d.ts.map +1 -0
  5. package/dist/collections/createApiKeysCollection.js +315 -0
  6. package/dist/collections/createApiKeysCollection.js.map +1 -0
  7. package/dist/endpoints/mcp.d.ts +4 -0
  8. package/dist/endpoints/mcp.d.ts.map +1 -0
  9. package/dist/endpoints/mcp.js +44 -0
  10. package/dist/endpoints/mcp.js.map +1 -0
  11. package/dist/index.d.ts +10 -0
  12. package/dist/index.d.ts.map +1 -0
  13. package/dist/index.js +67 -0
  14. package/dist/index.js.map +1 -0
  15. package/dist/mcp/createRequest.d.ts +3 -0
  16. package/dist/mcp/createRequest.d.ts.map +1 -0
  17. package/dist/mcp/createRequest.js +14 -0
  18. package/dist/mcp/createRequest.js.map +1 -0
  19. package/dist/mcp/getMcpHandler.d.ts +4 -0
  20. package/dist/mcp/getMcpHandler.d.ts.map +1 -0
  21. package/dist/mcp/getMcpHandler.js +179 -0
  22. package/dist/mcp/getMcpHandler.js.map +1 -0
  23. package/dist/mcp/helpers/config.d.ts +30 -0
  24. package/dist/mcp/helpers/config.d.ts.map +1 -0
  25. package/dist/mcp/helpers/config.js +217 -0
  26. package/dist/mcp/helpers/config.js.map +1 -0
  27. package/dist/mcp/helpers/conversion.d.ts +2 -0
  28. package/dist/mcp/helpers/conversion.d.ts.map +1 -0
  29. package/dist/mcp/helpers/conversion.js +5 -0
  30. package/dist/mcp/helpers/conversion.js.map +1 -0
  31. package/dist/mcp/helpers/fields.d.ts +38 -0
  32. package/dist/mcp/helpers/fields.d.ts.map +1 -0
  33. package/dist/mcp/helpers/fields.js +96 -0
  34. package/dist/mcp/helpers/fields.js.map +1 -0
  35. package/dist/mcp/helpers/fileValidation.d.ts +69 -0
  36. package/dist/mcp/helpers/fileValidation.d.ts.map +1 -0
  37. package/dist/mcp/helpers/fileValidation.js +305 -0
  38. package/dist/mcp/helpers/fileValidation.js.map +1 -0
  39. package/dist/mcp/helpers/validation.d.ts +9 -0
  40. package/dist/mcp/helpers/validation.d.ts.map +1 -0
  41. package/dist/mcp/helpers/validation.js +22 -0
  42. package/dist/mcp/helpers/validation.js.map +1 -0
  43. package/dist/mcp/registerTool.d.ts +6 -0
  44. package/dist/mcp/registerTool.d.ts.map +1 -0
  45. package/dist/mcp/registerTool.js +18 -0
  46. package/dist/mcp/registerTool.js.map +1 -0
  47. package/dist/mcp/tools/auth/auth.d.ts +4 -0
  48. package/dist/mcp/tools/auth/auth.d.ts.map +1 -0
  49. package/dist/mcp/tools/auth/auth.js +54 -0
  50. package/dist/mcp/tools/auth/auth.js.map +1 -0
  51. package/dist/mcp/tools/auth/forgotPassword.d.ts +4 -0
  52. package/dist/mcp/tools/auth/forgotPassword.d.ts.map +1 -0
  53. package/dist/mcp/tools/auth/forgotPassword.js +45 -0
  54. package/dist/mcp/tools/auth/forgotPassword.js.map +1 -0
  55. package/dist/mcp/tools/auth/login.d.ts +4 -0
  56. package/dist/mcp/tools/auth/login.d.ts.map +1 -0
  57. package/dist/mcp/tools/auth/login.js +48 -0
  58. package/dist/mcp/tools/auth/login.js.map +1 -0
  59. package/dist/mcp/tools/auth/resetPassword.d.ts +4 -0
  60. package/dist/mcp/tools/auth/resetPassword.d.ts.map +1 -0
  61. package/dist/mcp/tools/auth/resetPassword.js +46 -0
  62. package/dist/mcp/tools/auth/resetPassword.js.map +1 -0
  63. package/dist/mcp/tools/auth/unlock.d.ts +4 -0
  64. package/dist/mcp/tools/auth/unlock.d.ts.map +1 -0
  65. package/dist/mcp/tools/auth/unlock.js +45 -0
  66. package/dist/mcp/tools/auth/unlock.js.map +1 -0
  67. package/dist/mcp/tools/auth/verify.d.ts +4 -0
  68. package/dist/mcp/tools/auth/verify.d.ts.map +1 -0
  69. package/dist/mcp/tools/auth/verify.js +42 -0
  70. package/dist/mcp/tools/auth/verify.js.map +1 -0
  71. package/dist/mcp/tools/collection/create.d.ts +10 -0
  72. package/dist/mcp/tools/collection/create.d.ts.map +1 -0
  73. package/dist/mcp/tools/collection/create.js +159 -0
  74. package/dist/mcp/tools/collection/create.js.map +1 -0
  75. package/dist/mcp/tools/collection/delete.d.ts +10 -0
  76. package/dist/mcp/tools/collection/delete.d.ts.map +1 -0
  77. package/dist/mcp/tools/collection/delete.js +162 -0
  78. package/dist/mcp/tools/collection/delete.js.map +1 -0
  79. package/dist/mcp/tools/collection/find.d.ts +10 -0
  80. package/dist/mcp/tools/collection/find.d.ts.map +1 -0
  81. package/dist/mcp/tools/collection/find.js +162 -0
  82. package/dist/mcp/tools/collection/find.js.map +1 -0
  83. package/dist/mcp/tools/collection/update.d.ts +10 -0
  84. package/dist/mcp/tools/collection/update.d.ts.map +1 -0
  85. package/dist/mcp/tools/collection/update.js +206 -0
  86. package/dist/mcp/tools/collection/update.js.map +1 -0
  87. package/dist/mcp/tools/config/find.d.ts +10 -0
  88. package/dist/mcp/tools/config/find.d.ts.map +1 -0
  89. package/dist/mcp/tools/config/find.js +94 -0
  90. package/dist/mcp/tools/config/find.js.map +1 -0
  91. package/dist/mcp/tools/config/update.d.ts +10 -0
  92. package/dist/mcp/tools/config/update.d.ts.map +1 -0
  93. package/dist/mcp/tools/config/update.js +212 -0
  94. package/dist/mcp/tools/config/update.js.map +1 -0
  95. package/dist/mcp/tools/job/create.d.ts +10 -0
  96. package/dist/mcp/tools/job/create.d.ts.map +1 -0
  97. package/dist/mcp/tools/job/create.js +293 -0
  98. package/dist/mcp/tools/job/create.js.map +1 -0
  99. package/dist/mcp/tools/job/run.d.ts +10 -0
  100. package/dist/mcp/tools/job/run.d.ts.map +1 -0
  101. package/dist/mcp/tools/job/run.js +147 -0
  102. package/dist/mcp/tools/job/run.js.map +1 -0
  103. package/dist/mcp/tools/job/update.d.ts +11 -0
  104. package/dist/mcp/tools/job/update.d.ts.map +1 -0
  105. package/dist/mcp/tools/job/update.js +211 -0
  106. package/dist/mcp/tools/job/update.js.map +1 -0
  107. package/dist/mcp/tools/resource/create.d.ts +6 -0
  108. package/dist/mcp/tools/resource/create.d.ts.map +1 -0
  109. package/dist/mcp/tools/resource/create.js +75 -0
  110. package/dist/mcp/tools/resource/create.js.map +1 -0
  111. package/dist/mcp/tools/resource/delete.d.ts +5 -0
  112. package/dist/mcp/tools/resource/delete.d.ts.map +1 -0
  113. package/dist/mcp/tools/resource/delete.js +140 -0
  114. package/dist/mcp/tools/resource/delete.js.map +1 -0
  115. package/dist/mcp/tools/resource/find.d.ts +5 -0
  116. package/dist/mcp/tools/resource/find.d.ts.map +1 -0
  117. package/dist/mcp/tools/resource/find.js +119 -0
  118. package/dist/mcp/tools/resource/find.js.map +1 -0
  119. package/dist/mcp/tools/resource/update.d.ts +6 -0
  120. package/dist/mcp/tools/resource/update.d.ts.map +1 -0
  121. package/dist/mcp/tools/resource/update.js +201 -0
  122. package/dist/mcp/tools/resource/update.js.map +1 -0
  123. package/dist/mcp/tools/schemas.d.ts +374 -0
  124. package/dist/mcp/tools/schemas.d.ts.map +1 -0
  125. package/dist/mcp/tools/schemas.js +201 -0
  126. package/dist/mcp/tools/schemas.js.map +1 -0
  127. package/dist/types.d.ts +379 -0
  128. package/dist/types.d.ts.map +1 -0
  129. package/dist/types.js +3 -0
  130. package/dist/types.js.map +1 -0
  131. package/dist/utils/camelCase.d.ts +9 -0
  132. package/dist/utils/camelCase.d.ts.map +1 -0
  133. package/dist/utils/camelCase.js +11 -0
  134. package/dist/utils/camelCase.js.map +1 -0
  135. package/dist/utils/convertCollectionSchemaToZod.d.ts +3 -0
  136. package/dist/utils/convertCollectionSchemaToZod.d.ts.map +1 -0
  137. package/dist/utils/convertCollectionSchemaToZod.js +30 -0
  138. package/dist/utils/convertCollectionSchemaToZod.js.map +1 -0
  139. package/package.json +64 -0
  140. package/src/collections/createApiKeysCollection.ts +393 -0
  141. package/src/endpoints/mcp.ts +60 -0
  142. package/src/index.ts +86 -0
  143. package/src/mcp/createRequest.ts +13 -0
  144. package/src/mcp/getMcpHandler.ts +433 -0
  145. package/src/mcp/helpers/config.ts +326 -0
  146. package/src/mcp/helpers/conversion.ts +3 -0
  147. package/src/mcp/helpers/fields.ts +158 -0
  148. package/src/mcp/helpers/fileValidation.ts +417 -0
  149. package/src/mcp/helpers/validation.ts +32 -0
  150. package/src/mcp/registerTool.ts +22 -0
  151. package/src/mcp/tools/auth/auth.ts +69 -0
  152. package/src/mcp/tools/auth/forgotPassword.ts +68 -0
  153. package/src/mcp/tools/auth/login.ts +70 -0
  154. package/src/mcp/tools/auth/resetPassword.ts +59 -0
  155. package/src/mcp/tools/auth/unlock.ts +62 -0
  156. package/src/mcp/tools/auth/verify.ts +55 -0
  157. package/src/mcp/tools/collection/create.ts +236 -0
  158. package/src/mcp/tools/collection/delete.ts +227 -0
  159. package/src/mcp/tools/collection/find.ts +222 -0
  160. package/src/mcp/tools/collection/update.ts +288 -0
  161. package/src/mcp/tools/config/find.ts +126 -0
  162. package/src/mcp/tools/config/update.ts +282 -0
  163. package/src/mcp/tools/job/create.ts +420 -0
  164. package/src/mcp/tools/job/run.ts +189 -0
  165. package/src/mcp/tools/job/update.ts +319 -0
  166. package/src/mcp/tools/resource/create.ts +121 -0
  167. package/src/mcp/tools/resource/delete.ts +210 -0
  168. package/src/mcp/tools/resource/find.ts +194 -0
  169. package/src/mcp/tools/resource/update.ts +314 -0
  170. package/src/mcp/tools/schemas.ts +373 -0
  171. package/src/types.ts +405 -0
  172. package/src/utils/camelCase.ts +12 -0
  173. package/src/utils/convertCollectionSchemaToZod.ts +35 -0
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Adds new fields to a collection file content
3
+ */ export function addFieldsToCollection(content, newFields) {
4
+ // Find the fields array closing bracket
5
+ const fieldsRegex = /fields:\s*\[([\s\S]*?)\]\s*(?:,\s*)?\}/;
6
+ const match = content.match(fieldsRegex);
7
+ if (!match) {
8
+ throw new Error('Could not find fields array in collection file');
9
+ }
10
+ // Generate new field definitions
11
+ const newFieldDefinitions = newFields.map((field)=>{
12
+ const fieldConfig = [];
13
+ fieldConfig.push(` {`);
14
+ fieldConfig.push(` name: '${field.name}',`);
15
+ fieldConfig.push(` type: '${field.type}',`);
16
+ if (field.required) {
17
+ fieldConfig.push(` required: true,`);
18
+ }
19
+ if (field.description || field.position) {
20
+ fieldConfig.push(` admin: {`);
21
+ if (field.description) {
22
+ fieldConfig.push(` description: '${field.description}',`);
23
+ }
24
+ if (field.position) {
25
+ fieldConfig.push(` position: '${field.position}',`);
26
+ }
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
+ }).join('\n');
39
+ // Add new fields before the closing bracket
40
+ const existingFields = match[1] || '';
41
+ const hasTrailingComma = existingFields.trim().endsWith(',');
42
+ const separator = hasTrailingComma ? '\n' : ',\n';
43
+ return content.replace(fieldsRegex, `fields: [${existingFields}${separator}${newFieldDefinitions}\n ],
44
+ }`);
45
+ }
46
+ /**
47
+ * Removes fields from a collection file content
48
+ */ export function removeFieldsFromCollection(content, fieldNames) {
49
+ let updatedContent = content;
50
+ fieldNames.forEach((fieldName)=>{
51
+ // Create regex to match the field definition
52
+ const fieldRegex = new RegExp(`\\s*{[^}]*name:\\s*['"]${fieldName}['"][^}]*}[^}]*(?:},?|,?\\s*})`, 'gs');
53
+ updatedContent = updatedContent.replace(fieldRegex, '');
54
+ });
55
+ // Clean up any double commas or trailing commas
56
+ updatedContent = updatedContent.replace(/,\s*,/g, ',');
57
+ updatedContent = updatedContent.replace(/,\s*\]/g, '\n ]');
58
+ return updatedContent;
59
+ }
60
+ /**
61
+ * Modifies existing fields in a collection file content
62
+ */ export function modifyFieldsInCollection(content, modifications) {
63
+ let updatedContent = content;
64
+ modifications.forEach((mod)=>{
65
+ const { changes, fieldName } = mod;
66
+ // Find the field definition
67
+ const fieldRegex = new RegExp(`({[^}]*name:\\s*['"]${fieldName}['"][^}]*})`, 'gs');
68
+ const fieldMatch = updatedContent.match(fieldRegex);
69
+ if (fieldMatch) {
70
+ let fieldDef = fieldMatch[0];
71
+ // Apply changes
72
+ if (changes.type) {
73
+ fieldDef = fieldDef.replace(/type:\s*'[^']*'/, `type: '${changes.type}'`);
74
+ }
75
+ if (changes.required !== undefined) {
76
+ if (fieldDef.includes('required:')) {
77
+ fieldDef = fieldDef.replace(/required:[^,]*/, `required: ${changes.required}`);
78
+ } else {
79
+ fieldDef = fieldDef.replace(/type:\s*'[^']*',/, `type: '${changes.type}',\n required: ${changes.required},`);
80
+ }
81
+ }
82
+ if (changes.description) {
83
+ const adminRegex = /admin:\s*\{[^}]*\}/;
84
+ if (fieldDef.match(adminRegex)) {
85
+ fieldDef = fieldDef.replace(/description:\s*'[^']*'/, `description: '${changes.description}'`);
86
+ } else {
87
+ fieldDef = fieldDef.replace(/\},?\s*$/, `,\n admin: {\n description: '${changes.description}',\n },\n }`);
88
+ }
89
+ }
90
+ updatedContent = updatedContent.replace(fieldRegex, fieldDef);
91
+ }
92
+ });
93
+ return updatedContent;
94
+ }
95
+
96
+ //# sourceMappingURL=fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/mcp/helpers/fields.ts"],"sourcesContent":["type FieldDefinition = {\n description?: string\n name: string\n options?: { label: string; value: string }[]\n position?: 'main' | 'sidebar'\n required?: boolean\n type: string\n}\n\ntype FieldModification = {\n changes: {\n description?: string\n options?: { label: string; value: string }[]\n position?: 'main' | 'sidebar'\n required?: boolean\n type?: string\n }\n fieldName: string\n}\n\n/**\n * Adds new fields to a collection file content\n */\nexport function addFieldsToCollection(content: string, newFields: FieldDefinition[]): string {\n // Find the fields array closing bracket\n const fieldsRegex = /fields:\\s*\\[([\\s\\S]*?)\\]\\s*(?:,\\s*)?\\}/\n const match = content.match(fieldsRegex)\n\n if (!match) {\n throw new Error('Could not find fields array in collection file')\n }\n\n // Generate new field definitions\n const newFieldDefinitions = newFields\n .map((field) => {\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 || field.position) {\n fieldConfig.push(` admin: {`)\n if (field.description) {\n fieldConfig.push(` description: '${field.description}',`)\n }\n if (field.position) {\n fieldConfig.push(` position: '${field.position}',`)\n }\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 .join('\\n')\n\n // Add new fields before the closing bracket\n const existingFields = match[1] || ''\n const hasTrailingComma = existingFields.trim().endsWith(',')\n const separator = hasTrailingComma ? '\\n' : ',\\n'\n\n return content.replace(\n fieldsRegex,\n `fields: [${existingFields}${separator}${newFieldDefinitions}\\n ],\n}`,\n )\n}\n\n/**\n * Removes fields from a collection file content\n */\nexport function removeFieldsFromCollection(content: string, fieldNames: string[]): string {\n let updatedContent = content\n\n fieldNames.forEach((fieldName) => {\n // Create regex to match the field definition\n const fieldRegex = new RegExp(\n `\\\\s*{[^}]*name:\\\\s*['\"]${fieldName}['\"][^}]*}[^}]*(?:},?|,?\\\\s*})`,\n 'gs',\n )\n updatedContent = updatedContent.replace(fieldRegex, '')\n })\n\n // Clean up any double commas or trailing commas\n updatedContent = updatedContent.replace(/,\\s*,/g, ',')\n updatedContent = updatedContent.replace(/,\\s*\\]/g, '\\n ]')\n\n return updatedContent\n}\n\n/**\n * Modifies existing fields in a collection file content\n */\nexport function modifyFieldsInCollection(\n content: string,\n modifications: FieldModification[],\n): string {\n let updatedContent = content\n\n modifications.forEach((mod) => {\n const { changes, fieldName } = mod\n\n // Find the field definition\n const fieldRegex = new RegExp(`({[^}]*name:\\\\s*['\"]${fieldName}['\"][^}]*})`, 'gs')\n const fieldMatch = updatedContent.match(fieldRegex)\n\n if (fieldMatch) {\n let fieldDef = fieldMatch[0]\n\n // Apply changes\n if (changes.type) {\n fieldDef = fieldDef.replace(/type:\\s*'[^']*'/, `type: '${changes.type}'`)\n }\n\n if (changes.required !== undefined) {\n if (fieldDef.includes('required:')) {\n fieldDef = fieldDef.replace(/required:[^,]*/, `required: ${changes.required}`)\n } else {\n fieldDef = fieldDef.replace(\n /type:\\s*'[^']*',/,\n `type: '${changes.type}',\\n required: ${changes.required},`,\n )\n }\n }\n\n if (changes.description) {\n const adminRegex = /admin:\\s*\\{[^}]*\\}/\n if (fieldDef.match(adminRegex)) {\n fieldDef = fieldDef.replace(\n /description:\\s*'[^']*'/,\n `description: '${changes.description}'`,\n )\n } else {\n fieldDef = fieldDef.replace(\n /\\},?\\s*$/,\n `,\\n admin: {\\n description: '${changes.description}',\\n },\\n }`,\n )\n }\n }\n\n updatedContent = updatedContent.replace(fieldRegex, fieldDef)\n }\n })\n\n return updatedContent\n}\n"],"names":["addFieldsToCollection","content","newFields","fieldsRegex","match","Error","newFieldDefinitions","map","field","fieldConfig","push","name","type","required","description","position","options","forEach","option","label","value","join","existingFields","hasTrailingComma","trim","endsWith","separator","replace","removeFieldsFromCollection","fieldNames","updatedContent","fieldName","fieldRegex","RegExp","modifyFieldsInCollection","modifications","mod","changes","fieldMatch","fieldDef","undefined","includes","adminRegex"],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import type { CollectionConfig } from 'payload';
2
+ export type ValidationType = 'collection' | 'task' | 'workflow';
3
+ export interface ValidationResult<T = unknown> {
4
+ config?: T;
5
+ error?: string;
6
+ success: boolean;
7
+ }
8
+ export interface TaskConfig {
9
+ handler: (args: {
10
+ input: Record<string, unknown>;
11
+ job: Record<string, unknown>;
12
+ tasks: Record<string, unknown>;
13
+ }) => Record<string, unknown>;
14
+ inputSchema?: Array<{
15
+ label?: string;
16
+ name: string;
17
+ options?: Array<{
18
+ label: string;
19
+ value: string;
20
+ }>;
21
+ required?: boolean;
22
+ type: string;
23
+ }>;
24
+ label?: string;
25
+ outputSchema?: Array<{
26
+ label?: string;
27
+ name: string;
28
+ options?: Array<{
29
+ label: string;
30
+ value: string;
31
+ }>;
32
+ required?: boolean;
33
+ type: string;
34
+ }>;
35
+ retries?: number;
36
+ slug: string;
37
+ }
38
+ export interface WorkflowConfig {
39
+ handler: (args: {
40
+ input: Record<string, unknown>;
41
+ job: Record<string, unknown>;
42
+ tasks: Record<string, unknown>;
43
+ }) => void;
44
+ inputSchema?: Array<{
45
+ label?: string;
46
+ name: string;
47
+ options?: Array<{
48
+ label: string;
49
+ value: string;
50
+ }>;
51
+ required?: boolean;
52
+ type: string;
53
+ }>;
54
+ label?: string;
55
+ queue?: string;
56
+ retries?: number;
57
+ slug: string;
58
+ }
59
+ /**
60
+ * Generic validation function for Payload configuration files
61
+ * @param fileName - The name of the file (e.g., 'Users.ts', 'my-task.ts')
62
+ * @param type - The type of validation to perform ('collection', 'task', or 'workflow')
63
+ * @returns Object containing success status and any error messages
64
+ */
65
+ export declare const validatePayloadFile: <T = CollectionConfig | TaskConfig | WorkflowConfig>(fileName: string, type: ValidationType) => Promise<ValidationResult<T>>;
66
+ export declare const validateCollectionFile: (fileName: string) => Promise<ValidationResult<CollectionConfig>>;
67
+ export declare const validateTaskFile: (fileName: string) => Promise<ValidationResult<TaskConfig>>;
68
+ export declare const validateWorkflowFile: (fileName: string) => Promise<ValidationResult<WorkflowConfig>>;
69
+ //# sourceMappingURL=fileValidation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fileValidation.d.ts","sourceRoot":"","sources":["../../../src/mcp/helpers/fileValidation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,305 @@
1
+ import { existsSync } from 'fs';
2
+ import { join } from 'path';
3
+ /**
4
+ * Generic validation function for Payload configuration files
5
+ * @param fileName - The name of the file (e.g., 'Users.ts', 'my-task.ts')
6
+ * @param type - The type of validation to perform ('collection', 'task', or 'workflow')
7
+ * @returns Object containing success status and any error messages
8
+ */ export const validatePayloadFile = async (fileName, type)=>{
9
+ try {
10
+ const basePath = type === 'collection' ? 'collections' : type === 'task' ? 'tasks' : 'workflows';
11
+ const fullPath = join(process.cwd(), 'src', basePath);
12
+ const filePath = join(fullPath, fileName);
13
+ // Check if file exists
14
+ if (!existsSync(filePath)) {
15
+ return {
16
+ error: `${type} file does not exist: ${fileName}`,
17
+ success: false
18
+ };
19
+ }
20
+ // Clear require cache to ensure fresh import
21
+ delete require.cache[filePath];
22
+ // Use relative path for webpack compatibility
23
+ const moduleName = fileName.replace('.ts', '');
24
+ const relativePath = `../${basePath}/${moduleName}`;
25
+ // Dynamic import with relative path
26
+ const importedModule = await import(/* webpackIgnore: true */ relativePath);
27
+ // Get the configuration based on type
28
+ let config;
29
+ if (type === 'collection') {
30
+ config = getCollectionConfig(importedModule, moduleName);
31
+ } else if (type === 'task') {
32
+ config = getTaskConfig(importedModule);
33
+ } else if (type === 'workflow') {
34
+ config = getWorkflowConfig(importedModule);
35
+ }
36
+ if (!config) {
37
+ return {
38
+ error: `${type} file does not export a valid ${type} config`,
39
+ success: false
40
+ };
41
+ }
42
+ // Validate the configuration
43
+ let validationResult;
44
+ if (type === 'collection') {
45
+ validationResult = validateCollectionConfig(config);
46
+ } else if (type === 'task') {
47
+ validationResult = validateTaskConfig(config);
48
+ } else if (type === 'workflow') {
49
+ validationResult = validateWorkflowConfig(config);
50
+ } else {
51
+ return {
52
+ error: `Unknown validation type: ${type}`,
53
+ success: false
54
+ };
55
+ }
56
+ if (!validationResult.success) {
57
+ return validationResult;
58
+ }
59
+ return {
60
+ config,
61
+ success: true
62
+ };
63
+ } catch (error) {
64
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error during validation';
65
+ return {
66
+ error: `Failed to validate ${type} file: ${errorMessage}`,
67
+ success: false
68
+ };
69
+ }
70
+ };
71
+ /**
72
+ * Extract collection configuration from module exports
73
+ */ function getCollectionConfig(importedModule, moduleName) {
74
+ if (importedModule.default) {
75
+ return importedModule.default;
76
+ }
77
+ if (importedModule[moduleName]) {
78
+ return importedModule[moduleName];
79
+ }
80
+ return undefined;
81
+ }
82
+ /**
83
+ * Extract task configuration from module exports
84
+ */ function getTaskConfig(importedModule) {
85
+ // First check for default export
86
+ if (importedModule.default) {
87
+ return importedModule.default;
88
+ }
89
+ // Look for named exports ending with "Task"
90
+ const exportNames = Object.keys(importedModule);
91
+ const taskExport = exportNames.find((name)=>name.endsWith('Task'));
92
+ if (taskExport) {
93
+ return importedModule[taskExport];
94
+ }
95
+ return undefined;
96
+ }
97
+ /**
98
+ * Extract workflow configuration from module exports
99
+ */ function getWorkflowConfig(importedModule) {
100
+ // First check for default export
101
+ if (importedModule.default) {
102
+ return importedModule.default;
103
+ }
104
+ // Look for named exports ending with "Workflow"
105
+ const exportNames = Object.keys(importedModule);
106
+ const workflowExport = exportNames.find((name)=>name.endsWith('Workflow'));
107
+ if (workflowExport) {
108
+ return importedModule[workflowExport];
109
+ }
110
+ return undefined;
111
+ }
112
+ /**
113
+ * Validate collection configuration structure
114
+ */ function validateCollectionConfig(config) {
115
+ if (!config || typeof config !== 'object') {
116
+ return {
117
+ error: 'Collection config is not a valid object',
118
+ success: false
119
+ };
120
+ }
121
+ if (!config.slug || typeof config.slug !== 'string') {
122
+ return {
123
+ error: 'Collection config must have a valid slug property',
124
+ success: false
125
+ };
126
+ }
127
+ // Validate each field has required properties
128
+ if (config.fields) {
129
+ for(let i = 0; i < config.fields.length; i++){
130
+ const field = config.fields[i];
131
+ if (!field || typeof field !== 'object') {
132
+ return {
133
+ error: `Field at index ${i} is not a valid object`,
134
+ success: false
135
+ };
136
+ }
137
+ // Check if field has type property
138
+ if ('type' in field && field.type && typeof field.type !== 'string') {
139
+ return {
140
+ error: `Field at index ${i} has invalid type property`,
141
+ success: false
142
+ };
143
+ }
144
+ }
145
+ }
146
+ return {
147
+ config,
148
+ success: true
149
+ };
150
+ }
151
+ /**
152
+ * Validate task configuration structure
153
+ */ function validateTaskConfig(config) {
154
+ if (!config || typeof config !== 'object') {
155
+ return {
156
+ error: 'Task config is not a valid object',
157
+ success: false
158
+ };
159
+ }
160
+ if (!config.slug || typeof config.slug !== 'string') {
161
+ return {
162
+ error: 'Task config must have a valid slug property',
163
+ success: false
164
+ };
165
+ }
166
+ if (!config.handler || typeof config.handler !== 'function') {
167
+ return {
168
+ error: 'Task config must have a valid handler function',
169
+ success: false
170
+ };
171
+ }
172
+ // Validate optional properties
173
+ if (config.retries !== undefined && (typeof config.retries !== 'number' || config.retries < 0)) {
174
+ return {
175
+ error: 'Task config retries must be a non-negative number',
176
+ success: false
177
+ };
178
+ }
179
+ // Validate schemas if present
180
+ if (config.inputSchema && Array.isArray(config.inputSchema)) {
181
+ for(let i = 0; i < config.inputSchema.length; i++){
182
+ const field = config.inputSchema[i];
183
+ if (!field || typeof field !== 'object') {
184
+ return {
185
+ error: `Input schema field at index ${i} is not a valid object`,
186
+ success: false
187
+ };
188
+ }
189
+ if (!field.name || typeof field.name !== 'string') {
190
+ return {
191
+ error: `Input schema field at index ${i} must have a valid name property`,
192
+ success: false
193
+ };
194
+ }
195
+ if (!field.type || typeof field.type !== 'string') {
196
+ return {
197
+ error: `Input schema field at index ${i} must have a valid type property`,
198
+ success: false
199
+ };
200
+ }
201
+ }
202
+ }
203
+ if (config.outputSchema && Array.isArray(config.outputSchema)) {
204
+ for(let i = 0; i < config.outputSchema.length; i++){
205
+ const field = config.outputSchema[i];
206
+ if (!field || typeof field !== 'object') {
207
+ return {
208
+ error: `Output schema field at index ${i} is not a valid object`,
209
+ success: false
210
+ };
211
+ }
212
+ if (!field.name || typeof field.name !== 'string') {
213
+ return {
214
+ error: `Output schema field at index ${i} must have a valid name property`,
215
+ success: false
216
+ };
217
+ }
218
+ if (!field.type || typeof field.type !== 'string') {
219
+ return {
220
+ error: `Output schema field at index ${i} must have a valid type property`,
221
+ success: false
222
+ };
223
+ }
224
+ }
225
+ }
226
+ return {
227
+ config,
228
+ success: true
229
+ };
230
+ }
231
+ /**
232
+ * Validate workflow configuration structure
233
+ */ function validateWorkflowConfig(config) {
234
+ if (!config || typeof config !== 'object') {
235
+ return {
236
+ error: 'Workflow config is not a valid object',
237
+ success: false
238
+ };
239
+ }
240
+ if (!config.slug || typeof config.slug !== 'string') {
241
+ return {
242
+ error: 'Workflow config must have a valid slug property',
243
+ success: false
244
+ };
245
+ }
246
+ if (!config.handler || typeof config.handler !== 'function') {
247
+ return {
248
+ error: 'Workflow config must have a valid handler function',
249
+ success: false
250
+ };
251
+ }
252
+ // Validate optional properties
253
+ if (config.queue && typeof config.queue !== 'string') {
254
+ return {
255
+ error: 'Workflow config queue must be a string',
256
+ success: false
257
+ };
258
+ }
259
+ if (config.retries !== undefined && (typeof config.retries !== 'number' || config.retries < 0)) {
260
+ return {
261
+ error: 'Workflow config retries must be a non-negative number',
262
+ success: false
263
+ };
264
+ }
265
+ // Validate schema if present
266
+ if (config.inputSchema && Array.isArray(config.inputSchema)) {
267
+ for(let i = 0; i < config.inputSchema.length; i++){
268
+ const field = config.inputSchema[i];
269
+ if (!field || typeof field !== 'object') {
270
+ return {
271
+ error: `Input schema field at index ${i} is not a valid object`,
272
+ success: false
273
+ };
274
+ }
275
+ if (!field.name || typeof field.name !== 'string') {
276
+ return {
277
+ error: `Input schema field at index ${i} must have a valid name property`,
278
+ success: false
279
+ };
280
+ }
281
+ if (!field.type || typeof field.type !== 'string') {
282
+ return {
283
+ error: `Input schema field at index ${i} must have a valid type property`,
284
+ success: false
285
+ };
286
+ }
287
+ }
288
+ }
289
+ return {
290
+ config,
291
+ success: true
292
+ };
293
+ }
294
+ // Convenience functions for backward compatibility
295
+ export const validateCollectionFile = async (fileName)=>{
296
+ return validatePayloadFile(fileName, 'collection');
297
+ };
298
+ export const validateTaskFile = async (fileName)=>{
299
+ return validatePayloadFile(fileName, 'task');
300
+ };
301
+ export const validateWorkflowFile = async (fileName)=>{
302
+ return validatePayloadFile(fileName, 'workflow');
303
+ };
304
+
305
+ //# sourceMappingURL=fileValidation.js.map
@@ -0,0 +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 || typeof config !== 'object') {\n return {\n error: 'Collection config is not a valid object',\n success: false,\n }\n }\n\n if (!config.slug || typeof config.slug !== 'string') {\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 || 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 && typeof field.type !== 'string') {\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 || typeof config !== 'object') {\n return {\n error: 'Task config is not a valid object',\n success: false,\n }\n }\n\n if (!config.slug || typeof config.slug !== 'string') {\n return {\n error: 'Task config must have a valid slug property',\n success: false,\n }\n }\n\n if (!config.handler || typeof config.handler !== 'function') {\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 && (typeof config.retries !== 'number' || 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 || typeof field !== 'object') {\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 || typeof field.name !== 'string') {\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 || typeof field.type !== 'string') {\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 || typeof field !== 'object') {\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 || typeof field.name !== 'string') {\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 || typeof field.type !== 'string') {\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 || typeof config !== 'object') {\n return {\n error: 'Workflow config is not a valid object',\n success: false,\n }\n }\n\n if (!config.slug || typeof config.slug !== 'string') {\n return {\n error: 'Workflow config must have a valid slug property',\n success: false,\n }\n }\n\n if (!config.handler || typeof config.handler !== 'function') {\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 && typeof config.queue !== 'string') {\n return {\n error: 'Workflow config queue must be a string',\n success: false,\n }\n }\n\n if (config.retries !== undefined && (typeof config.retries !== 'number' || 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 || typeof field !== 'object') {\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 || typeof field.name !== 'string') {\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 || typeof field.type !== 'string') {\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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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Validates collection-specific data for resource creation
3
+ */
4
+ export declare function validateCollectionData(collection: string, data: Record<string, unknown>, availableCollections: string[]): null | string;
5
+ /**
6
+ * Checks if a collection slug is valid
7
+ */
8
+ export declare function validateCollectionSlug(collection: string, collections: Partial<Record<string, true>>): string | undefined;
9
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../src/mcp/helpers/validation.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,oBAAoB,EAAE,MAAM,EAAE,GAC7B,IAAI,GAAG,MAAM,CAWf;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,sBAM3C"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Validates collection-specific data for resource creation
3
+ */ export function validateCollectionData(collection, data, availableCollections) {
4
+ // Check if collection exists
5
+ if (!availableCollections.includes(collection)) {
6
+ return `Unknown collection: ${collection}. Available collections: ${availableCollections.join(', ')}`;
7
+ }
8
+ if (!data || typeof data !== 'object' || Object.keys(data).length === 0) {
9
+ return `Collection "${collection}" requires data to be provided`;
10
+ }
11
+ return null;
12
+ }
13
+ /**
14
+ * Checks if a collection slug is valid
15
+ */ export function validateCollectionSlug(collection, collections) {
16
+ const collectionSlugs = Object.keys(collections);
17
+ if (!collectionSlugs.includes(collection)) {
18
+ return `Collection "${collection}" is not valid`;
19
+ }
20
+ }
21
+
22
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/mcp/helpers/validation.ts"],"sourcesContent":["/**\n * Validates collection-specific data for resource creation\n */\nexport function validateCollectionData(\n collection: string,\n data: Record<string, unknown>,\n availableCollections: string[],\n): null | string {\n // Check if collection exists\n if (!availableCollections.includes(collection)) {\n return `Unknown collection: ${collection}. Available collections: ${availableCollections.join(', ')}`\n }\n\n if (!data || typeof data !== 'object' || Object.keys(data).length === 0) {\n return `Collection \"${collection}\" requires data to be provided`\n }\n\n return null\n}\n\n/**\n * Checks if a collection slug is valid\n */\nexport function validateCollectionSlug(\n collection: string,\n collections: Partial<Record<string, true>>,\n) {\n const collectionSlugs = Object.keys(collections)\n if (!collectionSlugs.includes(collection)) {\n return `Collection \"${collection}\" is not valid`\n }\n}\n"],"names":["validateCollectionData","collection","data","availableCollections","includes","join","Object","keys","length","validateCollectionSlug","collections","collectionSlugs"],"mappings":"AAAA;;CAEC,GACD,OAAO,SAASA,uBACdC,UAAkB,EAClBC,IAA6B,EAC7BC,oBAA8B;IAE9B,6BAA6B;IAC7B,IAAI,CAACA,qBAAqBC,QAAQ,CAACH,aAAa;QAC9C,OAAO,CAAC,oBAAoB,EAAEA,WAAW,yBAAyB,EAAEE,qBAAqBE,IAAI,CAAC,OAAO;IACvG;IAEA,IAAI,CAACH,QAAQ,OAAOA,SAAS,YAAYI,OAAOC,IAAI,CAACL,MAAMM,MAAM,KAAK,GAAG;QACvE,OAAO,CAAC,YAAY,EAAEP,WAAW,8BAA8B,CAAC;IAClE;IAEA,OAAO;AACT;AAEA;;CAEC,GACD,OAAO,SAASQ,uBACdR,UAAkB,EAClBS,WAA0C;IAE1C,MAAMC,kBAAkBL,OAAOC,IAAI,CAACG;IACpC,IAAI,CAACC,gBAAgBP,QAAQ,CAACH,aAAa;QACzC,OAAO,CAAC,YAAY,EAAEA,WAAW,cAAc,CAAC;IAClD;AACF"}
@@ -0,0 +1,6 @@
1
+ export declare const registerTool: (isEnabled: boolean | undefined, toolType: string, registrationFn: () => void, payload: {
2
+ logger: {
3
+ info: (message: string) => void;
4
+ };
5
+ }, useVerboseLogs: boolean) => void;
6
+ //# sourceMappingURL=registerTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registerTool.d.ts","sourceRoot":"","sources":["../../src/mcp/registerTool.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,cACZ,OAAO,GAAG,SAAS,YACpB,MAAM,kBACA,MAAM,IAAI,WACjB;IAAE,MAAM,EAAE;QAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAA;KAAE,CAAA;CAAE,kBACxC,OAAO,SAgBxB,CAAA"}
@@ -0,0 +1,18 @@
1
+ export const registerTool = (isEnabled, toolType, registrationFn, payload, useVerboseLogs)=>{
2
+ if (isEnabled) {
3
+ try {
4
+ registrationFn();
5
+ if (useVerboseLogs) {
6
+ payload.logger.info(`[payload-mcp] ✅ Tool: ${toolType} Registered.`);
7
+ }
8
+ } catch (error) {
9
+ // Log the error and re-throw
10
+ payload.logger.info(`[payload-mcp] ❌ Tool: ${toolType} Failed to register.`);
11
+ throw error;
12
+ }
13
+ } else if (useVerboseLogs) {
14
+ payload.logger.info(`[payload-mcp] ⏭️ Tool: ${toolType} Skipped.`);
15
+ }
16
+ };
17
+
18
+ //# sourceMappingURL=registerTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/mcp/registerTool.ts"],"sourcesContent":["export const registerTool = (\n isEnabled: boolean | undefined,\n toolType: string,\n registrationFn: () => void,\n payload: { logger: { info: (message: string) => void } },\n useVerboseLogs: boolean,\n) => {\n if (isEnabled) {\n try {\n registrationFn()\n if (useVerboseLogs) {\n payload.logger.info(`[payload-mcp] ✅ Tool: ${toolType} Registered.`)\n }\n } catch (error) {\n // Log the error and re-throw\n payload.logger.info(`[payload-mcp] ❌ Tool: ${toolType} Failed to register.`)\n throw error\n }\n } else if (useVerboseLogs) {\n payload.logger.info(`[payload-mcp] ⏭️ Tool: ${toolType} Skipped.`)\n }\n}\n"],"names":["registerTool","isEnabled","toolType","registrationFn","payload","useVerboseLogs","logger","info","error"],"mappings":"AAAA,OAAO,MAAMA,eAAe,CAC1BC,WACAC,UACAC,gBACAC,SACAC;IAEA,IAAIJ,WAAW;QACb,IAAI;YACFE;YACA,IAAIE,gBAAgB;gBAClBD,QAAQE,MAAM,CAACC,IAAI,CAAC,CAAC,sBAAsB,EAAEL,SAAS,YAAY,CAAC;YACrE;QACF,EAAE,OAAOM,OAAO;YACd,6BAA6B;YAC7BJ,QAAQE,MAAM,CAACC,IAAI,CAAC,CAAC,sBAAsB,EAAEL,SAAS,oBAAoB,CAAC;YAC3E,MAAMM;QACR;IACF,OAAO,IAAIH,gBAAgB;QACzBD,QAAQE,MAAM,CAACC,IAAI,CAAC,CAAC,uBAAuB,EAAEL,SAAS,SAAS,CAAC;IACnE;AACF,EAAC"}
@@ -0,0 +1,4 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { PayloadRequest } from 'payload';
3
+ export declare const authTool: (server: McpServer, req: PayloadRequest, verboseLogs: boolean) => void;
4
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/auth/auth.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,SAAS,CAAA;AAI7C,eAAO,MAAM,QAAQ,WAAY,SAAS,OAAO,cAAc,eAAe,OAAO,SA+DpF,CAAA"}