@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,211 @@
1
+ import { existsSync, readFileSync, writeFileSync } from 'fs';
2
+ import { join } from 'path';
3
+ import { validatePayloadFile } from '../../helpers/fileValidation.js';
4
+ import { toolSchemas } from '../schemas.js';
5
+ // Reusable function for updating jobs
6
+ export const updateJob = async (req, verboseLogs, jobsDir, jobSlug, updateType, inputSchema, outputSchema, taskSequence, configUpdate, handlerCode)=>{
7
+ const payload = req.payload;
8
+ if (verboseLogs) {
9
+ payload.logger.info(`[payload-mcp] Updating job: ${jobSlug} (${updateType})`);
10
+ }
11
+ try {
12
+ const camelCaseJobSlug = toCamelCase(jobSlug);
13
+ // Find the job file - check both tasks and workflows
14
+ let filePath = null;
15
+ let jobType = null;
16
+ const taskPath = join(jobsDir, 'tasks', `${camelCaseJobSlug}.ts`);
17
+ const workflowPath = join(jobsDir, 'workflows', `${camelCaseJobSlug}.ts`);
18
+ if (existsSync(taskPath)) {
19
+ filePath = taskPath;
20
+ jobType = 'task';
21
+ if (verboseLogs) {
22
+ payload.logger.info(`[payload-mcp] Found task file: ${taskPath}`);
23
+ }
24
+ } else if (existsSync(workflowPath)) {
25
+ filePath = workflowPath;
26
+ jobType = 'workflow';
27
+ if (verboseLogs) {
28
+ payload.logger.info(`[payload-mcp] Found workflow file: ${workflowPath}`);
29
+ }
30
+ } else {
31
+ throw new Error(`No task or workflow file found for job slug: ${jobSlug}`);
32
+ }
33
+ // Read the current file content
34
+ let content = readFileSync(filePath, 'utf8');
35
+ const originalContent = content;
36
+ if (verboseLogs) {
37
+ payload.logger.info(`[payload-mcp] Applying update type: ${updateType}`);
38
+ }
39
+ // Apply updates based on type
40
+ switch(updateType){
41
+ case 'change_config':
42
+ if (!configUpdate) {
43
+ throw new Error('config must be provided for change_config');
44
+ }
45
+ content = updateConfig(content, jobSlug, configUpdate);
46
+ if (verboseLogs) {
47
+ payload.logger.info(`[payload-mcp] Configuration updated successfully`);
48
+ }
49
+ break;
50
+ case 'modify_schema':
51
+ if (!inputSchema && !outputSchema) {
52
+ throw new Error('Either inputSchema or outputSchema must be provided for modify_schema');
53
+ }
54
+ content = updateSchema(content, camelCaseJobSlug, inputSchema, outputSchema);
55
+ if (verboseLogs) {
56
+ payload.logger.info(`[payload-mcp] Schema updated successfully`);
57
+ }
58
+ break;
59
+ case 'replace_handler':
60
+ if (!handlerCode) {
61
+ throw new Error('handlerCode must be provided for replace_handler');
62
+ }
63
+ content = updateHandler(content, handlerCode, jobType);
64
+ if (verboseLogs) {
65
+ payload.logger.info(`[payload-mcp] Handler code replaced successfully`);
66
+ }
67
+ break;
68
+ case 'update_tasks':
69
+ if (!taskSequence) {
70
+ throw new Error('taskSequence must be provided for update_tasks');
71
+ }
72
+ if (jobType !== 'workflow') {
73
+ throw new Error('update_tasks is only supported for workflow jobs');
74
+ }
75
+ content = updateWorkflowTasks(content, taskSequence);
76
+ if (verboseLogs) {
77
+ payload.logger.info(`[payload-mcp] Workflow tasks updated successfully`);
78
+ }
79
+ break;
80
+ }
81
+ // Only write if content changed
82
+ if (content !== originalContent) {
83
+ if (verboseLogs) {
84
+ payload.logger.info(`[payload-mcp] Writing updated content to file`);
85
+ }
86
+ // Write the updated content
87
+ writeFileSync(filePath, content);
88
+ // Validate the updated file
89
+ const fileName = `${camelCaseJobSlug}.ts`;
90
+ const validationType = jobType === 'task' ? 'task' : 'workflow';
91
+ try {
92
+ const validationResult = await validatePayloadFile(fileName, validationType);
93
+ if (!validationResult.success) {
94
+ if (verboseLogs) {
95
+ payload.logger.warn(`[payload-mcp] Validation warning: ${validationResult.error}`);
96
+ }
97
+ return {
98
+ content: [
99
+ {
100
+ type: 'text',
101
+ text: `⚠️ **Warning**: Job updated but validation failed:\n\n${validationResult.error}\n\nPlease review the generated code for any syntax errors.`
102
+ }
103
+ ]
104
+ };
105
+ }
106
+ if (verboseLogs) {
107
+ payload.logger.info(`[payload-mcp] File validation successful`);
108
+ }
109
+ } catch (validationError) {
110
+ if (verboseLogs) {
111
+ payload.logger.warn(`[payload-mcp] Validation error: ${validationError}`);
112
+ }
113
+ return {
114
+ content: [
115
+ {
116
+ type: 'text',
117
+ text: `⚠️ **Warning**: Job updated but validation could not be completed:\n\n${validationError}\n\nPlease review the generated code manually.`
118
+ }
119
+ ]
120
+ };
121
+ }
122
+ return {
123
+ content: [
124
+ {
125
+ type: 'text',
126
+ text: `✅ **Job updated successfully!**\n\n**Job**: \`${jobSlug}\`\n**Type**: \`${jobType}\`\n**Update**: \`${updateType}\`\n**File**: \`${fileName}\`\n\n**Next steps**:\n1. Restart your development server to load the updated job\n2. Test the updated functionality\n3. Verify the changes meet your requirements`
127
+ }
128
+ ]
129
+ };
130
+ } else {
131
+ if (verboseLogs) {
132
+ payload.logger.info(`[payload-mcp] No changes detected, file not modified`);
133
+ }
134
+ return {
135
+ content: [
136
+ {
137
+ type: 'text',
138
+ text: `ℹ️ **No changes made**: The job file was not modified as no changes were detected.\n\n**Job**: \`${jobSlug}\`\n**Type**: \`${jobType}\`\n**Update**: \`${updateType}\``
139
+ }
140
+ ]
141
+ };
142
+ }
143
+ } catch (error) {
144
+ const errorMessage = error.message;
145
+ payload.logger.error(`[payload-mcp] Error updating job: ${errorMessage}`);
146
+ return {
147
+ content: [
148
+ {
149
+ type: 'text',
150
+ text: `❌ **Error updating job**: ${errorMessage}`
151
+ }
152
+ ]
153
+ };
154
+ }
155
+ };
156
+ // Helper function to convert to camel case
157
+ function toCamelCase(str) {
158
+ return str.replace(/[-_\s]+(.)?/g, (_, chr)=>chr ? chr.toUpperCase() : '').replace(/^(.)/, (_, chr)=>chr.toLowerCase());
159
+ }
160
+ // Helper functions for different update types
161
+ function updateSchema(content, camelCaseJobSlug, inputSchema, outputSchema) {
162
+ // TODO: Implementation for schema updates
163
+ // This would modify the inputSchema and outputSchema in the job file
164
+ return content;
165
+ }
166
+ function updateWorkflowTasks(content, taskSequence) {
167
+ // TODO: Implementation for updating workflow tasks
168
+ // This would modify the steps array in the workflow
169
+ return content;
170
+ }
171
+ function updateConfig(content, jobSlug, configUpdate) {
172
+ // TODO: Implementation for updating job configuration
173
+ // This would modify various config properties
174
+ return content;
175
+ }
176
+ function updateHandler(content, handlerCode, jobType) {
177
+ // TODO: Implementation for replacing handler code
178
+ // This would replace the handler function in the job file
179
+ return content;
180
+ }
181
+ export const updateJobTool = (server, req, verboseLogs, jobsDir)=>{
182
+ const tool = async (jobSlug, updateType, inputSchema, outputSchema, taskSequence, configUpdate, handlerCode)=>{
183
+ if (verboseLogs) {
184
+ req.payload.logger.info(`[payload-mcp] Update Job Tool called with: ${jobSlug}, ${updateType}`);
185
+ }
186
+ try {
187
+ const result = await updateJob(req, verboseLogs, jobsDir, jobSlug, updateType, inputSchema, outputSchema, taskSequence, configUpdate, handlerCode);
188
+ if (verboseLogs) {
189
+ req.payload.logger.info(`[payload-mcp] Update Job Tool completed successfully`);
190
+ }
191
+ return result;
192
+ } catch (error) {
193
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
194
+ req.payload.logger.error(`[payload-mcp] Error in Update Job Tool: ${errorMessage}`);
195
+ return {
196
+ content: [
197
+ {
198
+ type: 'text',
199
+ text: `❌ **Error in Update Job Tool**: ${errorMessage}`
200
+ }
201
+ ]
202
+ };
203
+ }
204
+ };
205
+ server.tool('updateJob', 'Updates an existing Payload job with new configuration, schema, or handler code', toolSchemas.updateJob.parameters.shape, async (args)=>{
206
+ const { configUpdate, handlerCode, inputSchema, jobSlug, outputSchema, taskSequence, updateType } = args;
207
+ return await tool(jobSlug, updateType, inputSchema, outputSchema, taskSequence, configUpdate, handlerCode);
208
+ });
209
+ };
210
+
211
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/mcp/tools/job/update.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { PayloadRequest } from 'payload'\n\nimport { existsSync, readFileSync, writeFileSync } from 'fs'\nimport { join } from 'path'\n\nimport type { JobConfigUpdate, SchemaField, TaskSequenceItem } from '../../../types.js'\n\nimport { validatePayloadFile } from '../../helpers/fileValidation.js'\nimport { toolSchemas } from '../schemas.js'\n\n// Reusable function for updating jobs\nexport const updateJob = async (\n req: PayloadRequest,\n verboseLogs: boolean,\n jobsDir: string,\n jobSlug: string,\n updateType: string,\n inputSchema?: SchemaField[],\n outputSchema?: SchemaField[],\n taskSequence?: TaskSequenceItem[],\n configUpdate?: JobConfigUpdate,\n handlerCode?: string,\n) => {\n const payload = req.payload\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Updating job: ${jobSlug} (${updateType})`)\n }\n\n try {\n const camelCaseJobSlug = toCamelCase(jobSlug)\n\n // Find the job file - check both tasks and workflows\n let filePath: null | string = null\n let jobType: 'task' | 'workflow' | null = null\n\n const taskPath = join(jobsDir, 'tasks', `${camelCaseJobSlug}.ts`)\n const workflowPath = join(jobsDir, 'workflows', `${camelCaseJobSlug}.ts`)\n\n if (existsSync(taskPath)) {\n filePath = taskPath\n jobType = 'task'\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Found task file: ${taskPath}`)\n }\n } else if (existsSync(workflowPath)) {\n filePath = workflowPath\n jobType = 'workflow'\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Found workflow file: ${workflowPath}`)\n }\n } else {\n throw new Error(`No task or workflow file found for job slug: ${jobSlug}`)\n }\n\n // Read the current file content\n let content = readFileSync(filePath, 'utf8')\n const originalContent = content\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Applying update type: ${updateType}`)\n }\n\n // Apply updates based on type\n switch (updateType) {\n case 'change_config':\n if (!configUpdate) {\n throw new Error('config must be provided for change_config')\n }\n\n content = updateConfig(content, jobSlug, configUpdate)\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Configuration updated successfully`)\n }\n break\n\n case 'modify_schema':\n if (!inputSchema && !outputSchema) {\n throw new Error('Either inputSchema or outputSchema must be provided for modify_schema')\n }\n\n content = updateSchema(content, camelCaseJobSlug, inputSchema, outputSchema)\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Schema updated successfully`)\n }\n break\n\n case 'replace_handler':\n if (!handlerCode) {\n throw new Error('handlerCode must be provided for replace_handler')\n }\n\n content = updateHandler(content, handlerCode, jobType)\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Handler code replaced successfully`)\n }\n break\n\n case 'update_tasks':\n if (!taskSequence) {\n throw new Error('taskSequence must be provided for update_tasks')\n }\n\n if (jobType !== 'workflow') {\n throw new Error('update_tasks is only supported for workflow jobs')\n }\n\n content = updateWorkflowTasks(content, taskSequence)\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Workflow tasks updated successfully`)\n }\n break\n }\n\n // Only write if content changed\n if (content !== originalContent) {\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Writing updated content to file`)\n }\n\n // Write the updated content\n writeFileSync(filePath, content)\n\n // Validate the updated file\n const fileName = `${camelCaseJobSlug}.ts`\n const validationType = jobType === 'task' ? 'task' : 'workflow'\n\n try {\n const validationResult = await validatePayloadFile(fileName, validationType)\n\n if (!validationResult.success) {\n if (verboseLogs) {\n payload.logger.warn(`[payload-mcp] Validation warning: ${validationResult.error}`)\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `⚠️ **Warning**: Job updated but validation failed:\\n\\n${validationResult.error}\\n\\nPlease review the generated code for any syntax errors.`,\n },\n ],\n }\n }\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] File validation successful`)\n }\n } catch (validationError) {\n if (verboseLogs) {\n payload.logger.warn(`[payload-mcp] Validation error: ${validationError}`)\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `⚠️ **Warning**: Job updated but validation could not be completed:\\n\\n${validationError}\\n\\nPlease review the generated code manually.`,\n },\n ],\n }\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `✅ **Job updated successfully!**\\n\\n**Job**: \\`${jobSlug}\\`\\n**Type**: \\`${jobType}\\`\\n**Update**: \\`${updateType}\\`\\n**File**: \\`${fileName}\\`\\n\\n**Next steps**:\\n1. Restart your development server to load the updated job\\n2. Test the updated functionality\\n3. Verify the changes meet your requirements`,\n },\n ],\n }\n } else {\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] No changes detected, file not modified`)\n }\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `ℹ️ **No changes made**: The job file was not modified as no changes were detected.\\n\\n**Job**: \\`${jobSlug}\\`\\n**Type**: \\`${jobType}\\`\\n**Update**: \\`${updateType}\\``,\n },\n ],\n }\n }\n } catch (error) {\n const errorMessage = (error as Error).message\n payload.logger.error(`[payload-mcp] Error updating job: ${errorMessage}`)\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error updating job**: ${errorMessage}`,\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\n// Helper functions for different update types\nfunction updateSchema(\n content: string,\n camelCaseJobSlug: string,\n inputSchema?: SchemaField[],\n outputSchema?: SchemaField[],\n): string {\n // TODO: Implementation for schema updates\n // This would modify the inputSchema and outputSchema in the job file\n return content\n}\n\nfunction updateWorkflowTasks(content: string, taskSequence: TaskSequenceItem[]): string {\n // TODO: Implementation for updating workflow tasks\n // This would modify the steps array in the workflow\n return content\n}\n\nfunction updateConfig(content: string, jobSlug: string, configUpdate: JobConfigUpdate): string {\n // TODO: Implementation for updating job configuration\n // This would modify various config properties\n return content\n}\n\nfunction updateHandler(content: string, handlerCode: string, jobType: 'task' | 'workflow'): string {\n // TODO: Implementation for replacing handler code\n // This would replace the handler function in the job file\n return content\n}\n\nexport const updateJobTool = (\n server: McpServer,\n req: PayloadRequest,\n verboseLogs: boolean,\n jobsDir: string,\n) => {\n const tool = async (\n jobSlug: string,\n updateType: string,\n inputSchema?: SchemaField[],\n outputSchema?: SchemaField[],\n taskSequence?: TaskSequenceItem[],\n configUpdate?: JobConfigUpdate,\n handlerCode?: string,\n ) => {\n if (verboseLogs) {\n req.payload.logger.info(\n `[payload-mcp] Update Job Tool called with: ${jobSlug}, ${updateType}`,\n )\n }\n\n try {\n const result = await updateJob(\n req,\n verboseLogs,\n jobsDir,\n jobSlug,\n updateType,\n inputSchema,\n outputSchema,\n taskSequence,\n configUpdate,\n handlerCode,\n )\n\n if (verboseLogs) {\n req.payload.logger.info(`[payload-mcp] Update 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 Update Job Tool: ${errorMessage}`)\n\n return {\n content: [\n {\n type: 'text' as const,\n text: `❌ **Error in Update Job Tool**: ${errorMessage}`,\n },\n ],\n }\n }\n }\n\n server.tool(\n 'updateJob',\n 'Updates an existing Payload job with new configuration, schema, or handler code',\n toolSchemas.updateJob.parameters.shape,\n async (args) => {\n const {\n configUpdate,\n handlerCode,\n inputSchema,\n jobSlug,\n outputSchema,\n taskSequence,\n updateType,\n } = args\n return await tool(\n jobSlug,\n updateType,\n inputSchema as unknown as SchemaField[],\n outputSchema as unknown as SchemaField[],\n taskSequence,\n configUpdate,\n handlerCode,\n )\n },\n )\n}\n"],"names":["existsSync","readFileSync","writeFileSync","join","validatePayloadFile","toolSchemas","updateJob","req","verboseLogs","jobsDir","jobSlug","updateType","inputSchema","outputSchema","taskSequence","configUpdate","handlerCode","payload","logger","info","camelCaseJobSlug","toCamelCase","filePath","jobType","taskPath","workflowPath","Error","content","originalContent","updateConfig","updateSchema","updateHandler","updateWorkflowTasks","fileName","validationType","validationResult","success","warn","error","type","text","validationError","errorMessage","message","str","replace","_","chr","toUpperCase","toLowerCase","updateJobTool","server","tool","result","parameters","shape","args"],"mappings":"AAGA,SAASA,UAAU,EAAEC,YAAY,EAAEC,aAAa,QAAQ,KAAI;AAC5D,SAASC,IAAI,QAAQ,OAAM;AAI3B,SAASC,mBAAmB,QAAQ,kCAAiC;AACrE,SAASC,WAAW,QAAQ,gBAAe;AAE3C,sCAAsC;AACtC,OAAO,MAAMC,YAAY,OACvBC,KACAC,aACAC,SACAC,SACAC,YACAC,aACAC,cACAC,cACAC,cACAC;IAEA,MAAMC,UAAUV,IAAIU,OAAO;IAE3B,IAAIT,aAAa;QACfS,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,4BAA4B,EAAET,QAAQ,EAAE,EAAEC,WAAW,CAAC,CAAC;IAC9E;IAEA,IAAI;QACF,MAAMS,mBAAmBC,YAAYX;QAErC,qDAAqD;QACrD,IAAIY,WAA0B;QAC9B,IAAIC,UAAsC;QAE1C,MAAMC,WAAWrB,KAAKM,SAAS,SAAS,GAAGW,iBAAiB,GAAG,CAAC;QAChE,MAAMK,eAAetB,KAAKM,SAAS,aAAa,GAAGW,iBAAiB,GAAG,CAAC;QAExE,IAAIpB,WAAWwB,WAAW;YACxBF,WAAWE;YACXD,UAAU;YACV,IAAIf,aAAa;gBACfS,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,+BAA+B,EAAEK,UAAU;YAClE;QACF,OAAO,IAAIxB,WAAWyB,eAAe;YACnCH,WAAWG;YACXF,UAAU;YACV,IAAIf,aAAa;gBACfS,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,mCAAmC,EAAEM,cAAc;YAC1E;QACF,OAAO;YACL,MAAM,IAAIC,MAAM,CAAC,6CAA6C,EAAEhB,SAAS;QAC3E;QAEA,gCAAgC;QAChC,IAAIiB,UAAU1B,aAAaqB,UAAU;QACrC,MAAMM,kBAAkBD;QAExB,IAAInB,aAAa;YACfS,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,oCAAoC,EAAER,YAAY;QACzE;QAEA,8BAA8B;QAC9B,OAAQA;YACN,KAAK;gBACH,IAAI,CAACI,cAAc;oBACjB,MAAM,IAAIW,MAAM;gBAClB;gBAEAC,UAAUE,aAAaF,SAASjB,SAASK;gBACzC,IAAIP,aAAa;oBACfS,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,gDAAgD,CAAC;gBACxE;gBACA;YAEF,KAAK;gBACH,IAAI,CAACP,eAAe,CAACC,cAAc;oBACjC,MAAM,IAAIa,MAAM;gBAClB;gBAEAC,UAAUG,aAAaH,SAASP,kBAAkBR,aAAaC;gBAC/D,IAAIL,aAAa;oBACfS,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,yCAAyC,CAAC;gBACjE;gBACA;YAEF,KAAK;gBACH,IAAI,CAACH,aAAa;oBAChB,MAAM,IAAIU,MAAM;gBAClB;gBAEAC,UAAUI,cAAcJ,SAASX,aAAaO;gBAC9C,IAAIf,aAAa;oBACfS,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,gDAAgD,CAAC;gBACxE;gBACA;YAEF,KAAK;gBACH,IAAI,CAACL,cAAc;oBACjB,MAAM,IAAIY,MAAM;gBAClB;gBAEA,IAAIH,YAAY,YAAY;oBAC1B,MAAM,IAAIG,MAAM;gBAClB;gBAEAC,UAAUK,oBAAoBL,SAASb;gBACvC,IAAIN,aAAa;oBACfS,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,iDAAiD,CAAC;gBACzE;gBACA;QACJ;QAEA,gCAAgC;QAChC,IAAIQ,YAAYC,iBAAiB;YAC/B,IAAIpB,aAAa;gBACfS,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,6CAA6C,CAAC;YACrE;YAEA,4BAA4B;YAC5BjB,cAAcoB,UAAUK;YAExB,4BAA4B;YAC5B,MAAMM,WAAW,GAAGb,iBAAiB,GAAG,CAAC;YACzC,MAAMc,iBAAiBX,YAAY,SAAS,SAAS;YAErD,IAAI;gBACF,MAAMY,mBAAmB,MAAM/B,oBAAoB6B,UAAUC;gBAE7D,IAAI,CAACC,iBAAiBC,OAAO,EAAE;oBAC7B,IAAI5B,aAAa;wBACfS,QAAQC,MAAM,CAACmB,IAAI,CAAC,CAAC,kCAAkC,EAAEF,iBAAiBG,KAAK,EAAE;oBACnF;oBAEA,OAAO;wBACLX,SAAS;4BACP;gCACEY,MAAM;gCACNC,MAAM,CAAC,sDAAsD,EAAEL,iBAAiBG,KAAK,CAAC,2DAA2D,CAAC;4BACpJ;yBACD;oBACH;gBACF;gBAEA,IAAI9B,aAAa;oBACfS,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,wCAAwC,CAAC;gBAChE;YACF,EAAE,OAAOsB,iBAAiB;gBACxB,IAAIjC,aAAa;oBACfS,QAAQC,MAAM,CAACmB,IAAI,CAAC,CAAC,gCAAgC,EAAEI,iBAAiB;gBAC1E;gBAEA,OAAO;oBACLd,SAAS;wBACP;4BACEY,MAAM;4BACNC,MAAM,CAAC,sEAAsE,EAAEC,gBAAgB,8CAA8C,CAAC;wBAChJ;qBACD;gBACH;YACF;YAEA,OAAO;gBACLd,SAAS;oBACP;wBACEY,MAAM;wBACNC,MAAM,CAAC,8CAA8C,EAAE9B,QAAQ,gBAAgB,EAAEa,QAAQ,kBAAkB,EAAEZ,WAAW,gBAAgB,EAAEsB,SAAS,kKAAkK,CAAC;oBACxT;iBACD;YACH;QACF,OAAO;YACL,IAAIzB,aAAa;gBACfS,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,oDAAoD,CAAC;YAC5E;YAEA,OAAO;gBACLQ,SAAS;oBACP;wBACEY,MAAM;wBACNC,MAAM,CAAC,iGAAiG,EAAE9B,QAAQ,gBAAgB,EAAEa,QAAQ,kBAAkB,EAAEZ,WAAW,EAAE,CAAC;oBAChL;iBACD;YACH;QACF;IACF,EAAE,OAAO2B,OAAO;QACd,MAAMI,eAAe,AAACJ,MAAgBK,OAAO;QAC7C1B,QAAQC,MAAM,CAACoB,KAAK,CAAC,CAAC,kCAAkC,EAAEI,cAAc;QAExE,OAAO;YACLf,SAAS;gBACP;oBACEY,MAAM;oBACNC,MAAM,CAAC,0BAA0B,EAAEE,cAAc;gBACnD;aACD;QACH;IACF;AACF,EAAC;AAED,2CAA2C;AAC3C,SAASrB,YAAYuB,GAAW;IAC9B,OAAOA,IACJC,OAAO,CAAC,gBAAgB,CAACC,GAAGC,MAASA,MAAMA,IAAIC,WAAW,KAAK,IAC/DH,OAAO,CAAC,QAAQ,CAACC,GAAGC,MAAQA,IAAIE,WAAW;AAChD;AAEA,8CAA8C;AAC9C,SAASnB,aACPH,OAAe,EACfP,gBAAwB,EACxBR,WAA2B,EAC3BC,YAA4B;IAE5B,0CAA0C;IAC1C,qEAAqE;IACrE,OAAOc;AACT;AAEA,SAASK,oBAAoBL,OAAe,EAAEb,YAAgC;IAC5E,mDAAmD;IACnD,oDAAoD;IACpD,OAAOa;AACT;AAEA,SAASE,aAAaF,OAAe,EAAEjB,OAAe,EAAEK,YAA6B;IACnF,sDAAsD;IACtD,8CAA8C;IAC9C,OAAOY;AACT;AAEA,SAASI,cAAcJ,OAAe,EAAEX,WAAmB,EAAEO,OAA4B;IACvF,kDAAkD;IAClD,0DAA0D;IAC1D,OAAOI;AACT;AAEA,OAAO,MAAMuB,gBAAgB,CAC3BC,QACA5C,KACAC,aACAC;IAEA,MAAM2C,OAAO,OACX1C,SACAC,YACAC,aACAC,cACAC,cACAC,cACAC;QAEA,IAAIR,aAAa;YACfD,IAAIU,OAAO,CAACC,MAAM,CAACC,IAAI,CACrB,CAAC,2CAA2C,EAAET,QAAQ,EAAE,EAAEC,YAAY;QAE1E;QAEA,IAAI;YACF,MAAM0C,SAAS,MAAM/C,UACnBC,KACAC,aACAC,SACAC,SACAC,YACAC,aACAC,cACAC,cACAC,cACAC;YAGF,IAAIR,aAAa;gBACfD,IAAIU,OAAO,CAACC,MAAM,CAACC,IAAI,CAAC,CAAC,oDAAoD,CAAC;YAChF;YAEA,OAAOkC;QACT,EAAE,OAAOf,OAAO;YACd,MAAMI,eAAeJ,iBAAiBZ,QAAQY,MAAMK,OAAO,GAAG;YAC9DpC,IAAIU,OAAO,CAACC,MAAM,CAACoB,KAAK,CAAC,CAAC,wCAAwC,EAAEI,cAAc;YAElF,OAAO;gBACLf,SAAS;oBACP;wBACEY,MAAM;wBACNC,MAAM,CAAC,gCAAgC,EAAEE,cAAc;oBACzD;iBACD;YACH;QACF;IACF;IAEAS,OAAOC,IAAI,CACT,aACA,mFACA/C,YAAYC,SAAS,CAACgD,UAAU,CAACC,KAAK,EACtC,OAAOC;QACL,MAAM,EACJzC,YAAY,EACZC,WAAW,EACXJ,WAAW,EACXF,OAAO,EACPG,YAAY,EACZC,YAAY,EACZH,UAAU,EACX,GAAG6C;QACJ,OAAO,MAAMJ,KACX1C,SACAC,YACAC,aACAC,cACAC,cACAC,cACAC;IAEJ;AAEJ,EAAC"}
@@ -0,0 +1,6 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { JSONSchema4 } from 'json-schema';
3
+ import type { PayloadRequest, TypedUser } from 'payload';
4
+ import type { PluginMCPServerConfig } from '../../../types.js';
5
+ export declare const createResourceTool: (server: McpServer, req: PayloadRequest, user: TypedUser, verboseLogs: boolean, collectionSlug: string, collections: PluginMCPServerConfig["collections"], schema: JSONSchema4) => void;
6
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/resource/create.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC9C,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAExD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAK9D,eAAO,MAAM,kBAAkB,WACrB,SAAS,OACZ,cAAc,QACb,SAAS,eACF,OAAO,kBACJ,MAAM,eACT,qBAAqB,CAAC,aAAa,CAAC,UACzC,WAAW,SAwGpB,CAAA"}
@@ -0,0 +1,75 @@
1
+ import { toCamelCase } from '../../../utils/camelCase.js';
2
+ import { convertCollectionSchemaToZod } from '../../../utils/convertCollectionSchemaToZod.js';
3
+ import { toolSchemas } from '../schemas.js';
4
+ export const createResourceTool = (server, req, user, verboseLogs, collectionSlug, collections, schema)=>{
5
+ const tool = async (data)=>{
6
+ const payload = req.payload;
7
+ if (verboseLogs) {
8
+ payload.logger.info(`[payload-mcp] Creating resource in collection: ${collectionSlug}`);
9
+ }
10
+ try {
11
+ // Parse the data JSON
12
+ let parsedData;
13
+ try {
14
+ parsedData = JSON.parse(data);
15
+ if (verboseLogs) {
16
+ payload.logger.info(`[payload-mcp] Parsed data for ${collectionSlug}: ${JSON.stringify(parsedData)}`);
17
+ }
18
+ } catch (_parseError) {
19
+ payload.logger.error(`[payload-mcp] Invalid JSON data provided: ${data}`);
20
+ return {
21
+ content: [
22
+ {
23
+ type: 'text',
24
+ text: 'Error: Invalid JSON data provided'
25
+ }
26
+ ]
27
+ };
28
+ }
29
+ // Create the resource
30
+ const result = await payload.create({
31
+ collection: collectionSlug,
32
+ // TODO: Move the override to a `beforeChange` hook and extend the payloadAPI context req to include MCP request info.
33
+ data: collections?.[collectionSlug]?.override?.(parsedData, req) || parsedData,
34
+ user
35
+ });
36
+ if (verboseLogs) {
37
+ payload.logger.info(`[payload-mcp] Successfully created resource in ${collectionSlug} with ID: ${result.id}`);
38
+ }
39
+ const response = {
40
+ content: [
41
+ {
42
+ type: 'text',
43
+ text: `Resource created successfully in collection "${collectionSlug}"!
44
+ Created resource:
45
+ \`\`\`json
46
+ ${JSON.stringify(result, null, 2)}
47
+ \`\`\``
48
+ }
49
+ ]
50
+ };
51
+ return collections?.[collectionSlug]?.overrideResponse?.(response, result, req) || response;
52
+ } catch (error) {
53
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
54
+ payload.logger.error(`[payload-mcp] Error creating resource in ${collectionSlug}: ${errorMessage}`);
55
+ const response = {
56
+ content: [
57
+ {
58
+ type: 'text',
59
+ text: `Error creating resource in collection "${collectionSlug}": ${errorMessage}`
60
+ }
61
+ ]
62
+ };
63
+ return collections?.[collectionSlug]?.overrideResponse?.(response, {}, req) || response;
64
+ }
65
+ };
66
+ if (collections?.[collectionSlug]?.enabled) {
67
+ const convertedFields = convertCollectionSchemaToZod(schema);
68
+ server.tool(`create${collectionSlug.charAt(0).toUpperCase() + toCamelCase(collectionSlug).slice(1)}`, `${toolSchemas.createResource.description.trim()}\n\n${collections?.[collectionSlug]?.description || ''}`, convertedFields.shape, async (params)=>{
69
+ const data = JSON.stringify(params);
70
+ return await tool(data);
71
+ });
72
+ }
73
+ };
74
+
75
+ //# sourceMappingURL=create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/mcp/tools/resource/create.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { JSONSchema4 } from 'json-schema'\nimport type { PayloadRequest, TypedUser } from 'payload'\n\nimport type { PluginMCPServerConfig } from '../../../types.js'\n\nimport { toCamelCase } from '../../../utils/camelCase.js'\nimport { convertCollectionSchemaToZod } from '../../../utils/convertCollectionSchemaToZod.js'\nimport { toolSchemas } from '../schemas.js'\nexport const createResourceTool = (\n server: McpServer,\n req: PayloadRequest,\n user: TypedUser,\n verboseLogs: boolean,\n collectionSlug: string,\n collections: PluginMCPServerConfig['collections'],\n schema: JSONSchema4,\n) => {\n const tool = async (\n data: string,\n ): Promise<{\n content: Array<{\n text: string\n type: 'text'\n }>\n }> => {\n const payload = req.payload\n\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Creating resource in collection: ${collectionSlug}`)\n }\n\n try {\n // Parse the data JSON\n let parsedData: Record<string, unknown>\n try {\n parsedData = JSON.parse(data)\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Parsed data for ${collectionSlug}: ${JSON.stringify(parsedData)}`,\n )\n }\n } catch (_parseError) {\n payload.logger.error(`[payload-mcp] Invalid JSON data provided: ${data}`)\n return {\n content: [{ type: 'text' as const, text: 'Error: Invalid JSON data provided' }],\n }\n }\n\n // Create the resource\n const result = await payload.create({\n collection: collectionSlug,\n // TODO: Move the override to a `beforeChange` hook and extend the payloadAPI context req to include MCP request info.\n data: collections?.[collectionSlug]?.override?.(parsedData, req) || parsedData,\n user,\n })\n\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Successfully created resource in ${collectionSlug} with ID: ${result.id}`,\n )\n }\n\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `Resource created successfully in collection \"${collectionSlug}\"!\nCreated resource:\n\\`\\`\\`json\n${JSON.stringify(result, null, 2)}\n\\`\\`\\``,\n },\n ],\n }\n\n return (collections?.[collectionSlug]?.overrideResponse?.(response, result, req) ||\n response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n payload.logger.error(\n `[payload-mcp] Error creating resource in ${collectionSlug}: ${errorMessage}`,\n )\n\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `Error creating resource in collection \"${collectionSlug}\": ${errorMessage}`,\n },\n ],\n }\n\n return (collections?.[collectionSlug]?.overrideResponse?.(response, {}, req) || response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n }\n }\n\n if (collections?.[collectionSlug]?.enabled) {\n const convertedFields = convertCollectionSchemaToZod(schema)\n\n server.tool(\n `create${collectionSlug.charAt(0).toUpperCase() + toCamelCase(collectionSlug).slice(1)}`,\n `${toolSchemas.createResource.description.trim()}\\n\\n${collections?.[collectionSlug]?.description || ''}`,\n convertedFields.shape,\n async (params: Record<string, unknown>) => {\n const data = JSON.stringify(params)\n return await tool(data)\n },\n )\n }\n}\n"],"names":["toCamelCase","convertCollectionSchemaToZod","toolSchemas","createResourceTool","server","req","user","verboseLogs","collectionSlug","collections","schema","tool","data","payload","logger","info","parsedData","JSON","parse","stringify","_parseError","error","content","type","text","result","create","collection","override","id","response","overrideResponse","errorMessage","Error","message","enabled","convertedFields","charAt","toUpperCase","slice","createResource","description","trim","shape","params"],"mappings":"AAMA,SAASA,WAAW,QAAQ,8BAA6B;AACzD,SAASC,4BAA4B,QAAQ,iDAAgD;AAC7F,SAASC,WAAW,QAAQ,gBAAe;AAC3C,OAAO,MAAMC,qBAAqB,CAChCC,QACAC,KACAC,MACAC,aACAC,gBACAC,aACAC;IAEA,MAAMC,OAAO,OACXC;QAOA,MAAMC,UAAUR,IAAIQ,OAAO;QAE3B,IAAIN,aAAa;YACfM,QAAQC,MAAM,CAACC,IAAI,CAAC,CAAC,+CAA+C,EAAEP,gBAAgB;QACxF;QAEA,IAAI;YACF,sBAAsB;YACtB,IAAIQ;YACJ,IAAI;gBACFA,aAAaC,KAAKC,KAAK,CAACN;gBACxB,IAAIL,aAAa;oBACfM,QAAQC,MAAM,CAACC,IAAI,CACjB,CAAC,8BAA8B,EAAEP,eAAe,EAAE,EAAES,KAAKE,SAAS,CAACH,aAAa;gBAEpF;YACF,EAAE,OAAOI,aAAa;gBACpBP,QAAQC,MAAM,CAACO,KAAK,CAAC,CAAC,0CAA0C,EAAET,MAAM;gBACxE,OAAO;oBACLU,SAAS;wBAAC;4BAAEC,MAAM;4BAAiBC,MAAM;wBAAoC;qBAAE;gBACjF;YACF;YAEA,sBAAsB;YACtB,MAAMC,SAAS,MAAMZ,QAAQa,MAAM,CAAC;gBAClCC,YAAYnB;gBACZ,sHAAsH;gBACtHI,MAAMH,aAAa,CAACD,eAAe,EAAEoB,WAAWZ,YAAYX,QAAQW;gBACpEV;YACF;YAEA,IAAIC,aAAa;gBACfM,QAAQC,MAAM,CAACC,IAAI,CACjB,CAAC,+CAA+C,EAAEP,eAAe,UAAU,EAAEiB,OAAOI,EAAE,EAAE;YAE5F;YAEA,MAAMC,WAAW;gBACfR,SAAS;oBACP;wBACEC,MAAM;wBACNC,MAAM,CAAC,6CAA6C,EAAEhB,eAAe;;;AAGjF,EAAES,KAAKE,SAAS,CAACM,QAAQ,MAAM,GAAG;MAC5B,CAAC;oBACG;iBACD;YACH;YAEA,OAAQhB,aAAa,CAACD,eAAe,EAAEuB,mBAAmBD,UAAUL,QAAQpB,QAC1EyB;QAMJ,EAAE,OAAOT,OAAO;YACd,MAAMW,eAAeX,iBAAiBY,QAAQZ,MAAMa,OAAO,GAAG;YAC9DrB,QAAQC,MAAM,CAACO,KAAK,CAClB,CAAC,yCAAyC,EAAEb,eAAe,EAAE,EAAEwB,cAAc;YAG/E,MAAMF,WAAW;gBACfR,SAAS;oBACP;wBACEC,MAAM;wBACNC,MAAM,CAAC,uCAAuC,EAAEhB,eAAe,GAAG,EAAEwB,cAAc;oBACpF;iBACD;YACH;YAEA,OAAQvB,aAAa,CAACD,eAAe,EAAEuB,mBAAmBD,UAAU,CAAC,GAAGzB,QAAQyB;QAMlF;IACF;IAEA,IAAIrB,aAAa,CAACD,eAAe,EAAE2B,SAAS;QAC1C,MAAMC,kBAAkBnC,6BAA6BS;QAErDN,OAAOO,IAAI,CACT,CAAC,MAAM,EAAEH,eAAe6B,MAAM,CAAC,GAAGC,WAAW,KAAKtC,YAAYQ,gBAAgB+B,KAAK,CAAC,IAAI,EACxF,GAAGrC,YAAYsC,cAAc,CAACC,WAAW,CAACC,IAAI,GAAG,IAAI,EAAEjC,aAAa,CAACD,eAAe,EAAEiC,eAAe,IAAI,EACzGL,gBAAgBO,KAAK,EACrB,OAAOC;YACL,MAAMhC,OAAOK,KAAKE,SAAS,CAACyB;YAC5B,OAAO,MAAMjC,KAAKC;QACpB;IAEJ;AACF,EAAC"}
@@ -0,0 +1,5 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { PayloadRequest, TypedUser } from 'payload';
3
+ import type { PluginMCPServerConfig } from '../../../types.js';
4
+ export declare const deleteResourceTool: (server: McpServer, req: PayloadRequest, user: TypedUser, verboseLogs: boolean, collectionSlug: string, collections: PluginMCPServerConfig["collections"]) => void;
5
+ //# sourceMappingURL=delete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"delete.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/resource/delete.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAExD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAK9D,eAAO,MAAM,kBAAkB,WACrB,SAAS,OACZ,cAAc,QACb,SAAS,eACF,OAAO,kBACJ,MAAM,eACT,qBAAqB,CAAC,aAAa,CAAC,SAmMlD,CAAA"}
@@ -0,0 +1,140 @@
1
+ import { toCamelCase } from '../../../utils/camelCase.js';
2
+ import { toolSchemas } from '../schemas.js';
3
+ export const deleteResourceTool = (server, req, user, verboseLogs, collectionSlug, collections)=>{
4
+ const tool = async (id, where, depth = 0)=>{
5
+ const payload = req.payload;
6
+ if (verboseLogs) {
7
+ payload.logger.info(`[payload-mcp] Deleting resource from collection: ${collectionSlug}${id ? ` with ID: ${id}` : ' with where clause'}`);
8
+ }
9
+ try {
10
+ // Validate that either id or where is provided
11
+ if (!id && !where) {
12
+ payload.logger.error('[payload-mcp] Either id or where clause must be provided');
13
+ const response = {
14
+ content: [
15
+ {
16
+ type: 'text',
17
+ text: 'Error: Either id or where clause must be provided'
18
+ }
19
+ ]
20
+ };
21
+ return collections?.[collectionSlug]?.overrideResponse?.(response, {}, req) || response;
22
+ }
23
+ // Parse where clause if provided
24
+ let whereClause = {};
25
+ if (where) {
26
+ try {
27
+ whereClause = JSON.parse(where);
28
+ if (verboseLogs) {
29
+ payload.logger.info(`[payload-mcp] Using where clause: ${where}`);
30
+ }
31
+ } catch (_parseError) {
32
+ payload.logger.warn(`[payload-mcp] Invalid where clause JSON: ${where}`);
33
+ const response = {
34
+ content: [
35
+ {
36
+ type: 'text',
37
+ text: 'Error: Invalid JSON in where clause'
38
+ }
39
+ ]
40
+ };
41
+ return collections?.[collectionSlug]?.overrideResponse?.(response, {}, req) || response;
42
+ }
43
+ }
44
+ // Build delete options
45
+ const deleteOptions = {
46
+ collection: collectionSlug,
47
+ depth,
48
+ user
49
+ };
50
+ // Delete by ID or where clause
51
+ if (id) {
52
+ deleteOptions.id = id;
53
+ if (verboseLogs) {
54
+ payload.logger.info(`[payload-mcp] Deleting single document with ID: ${id}`);
55
+ }
56
+ } else {
57
+ deleteOptions.where = whereClause;
58
+ if (verboseLogs) {
59
+ payload.logger.info(`[payload-mcp] Deleting multiple documents with where clause`);
60
+ }
61
+ }
62
+ const result = await payload.delete(deleteOptions);
63
+ // Handle different result types
64
+ if (id) {
65
+ // Single document deletion
66
+ if (verboseLogs) {
67
+ payload.logger.info(`[payload-mcp] Successfully deleted document with ID: ${id}`);
68
+ }
69
+ const response = {
70
+ content: [
71
+ {
72
+ type: 'text',
73
+ text: `Document deleted successfully from collection "${collectionSlug}"!
74
+ Deleted document:
75
+ \`\`\`json
76
+ ${JSON.stringify(result, null, 2)}
77
+ \`\`\``
78
+ }
79
+ ]
80
+ };
81
+ return collections?.[collectionSlug]?.overrideResponse?.(response, result, req) || response;
82
+ } else {
83
+ // Multiple documents deletion
84
+ const bulkResult = result;
85
+ const docs = bulkResult.docs || [];
86
+ const errors = bulkResult.errors || [];
87
+ if (verboseLogs) {
88
+ payload.logger.info(`[payload-mcp] Successfully deleted ${docs.length} documents, ${errors.length} errors`);
89
+ }
90
+ let responseText = `Document deleted successfully from collection "${collectionSlug}"!
91
+ Deleted: ${docs.length} documents
92
+ Errors: ${errors.length}
93
+ ---`;
94
+ if (docs.length > 0) {
95
+ responseText += `\n\nDeleted documents:
96
+ \`\`\`json
97
+ ${JSON.stringify(docs, null, 2)}
98
+ \`\`\``;
99
+ }
100
+ if (errors.length > 0) {
101
+ responseText += `\n\nErrors:
102
+ \`\`\`json
103
+ ${JSON.stringify(errors, null, 2)}
104
+ \`\`\``;
105
+ }
106
+ const response = {
107
+ content: [
108
+ {
109
+ type: 'text',
110
+ text: responseText
111
+ }
112
+ ]
113
+ };
114
+ return collections?.[collectionSlug]?.overrideResponse?.(response, {
115
+ docs,
116
+ errors
117
+ }, req) || response;
118
+ }
119
+ } catch (error) {
120
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
121
+ payload.logger.error(`[payload-mcp] Error deleting resource from ${collectionSlug}: ${errorMessage}`);
122
+ const response = {
123
+ content: [
124
+ {
125
+ type: 'text',
126
+ text: `Error deleting resource from collection "${collectionSlug}": ${errorMessage}`
127
+ }
128
+ ]
129
+ };
130
+ return collections?.[collectionSlug]?.overrideResponse?.(response, {}, req) || response;
131
+ }
132
+ };
133
+ if (collections?.[collectionSlug]?.enabled) {
134
+ server.tool(`delete${collectionSlug.charAt(0).toUpperCase() + toCamelCase(collectionSlug).slice(1)}`, `${toolSchemas.deleteResource.description.trim()}\n\n${collections?.[collectionSlug]?.description || ''}`, toolSchemas.deleteResource.parameters.shape, async ({ id, depth, where })=>{
135
+ return await tool(id, where, depth);
136
+ });
137
+ }
138
+ };
139
+
140
+ //# sourceMappingURL=delete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/mcp/tools/resource/delete.ts"],"sourcesContent":["import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js'\nimport type { PayloadRequest, TypedUser } from 'payload'\n\nimport type { PluginMCPServerConfig } from '../../../types.js'\n\nimport { toCamelCase } from '../../../utils/camelCase.js'\nimport { toolSchemas } from '../schemas.js'\n\nexport const deleteResourceTool = (\n server: McpServer,\n req: PayloadRequest,\n user: TypedUser,\n verboseLogs: boolean,\n collectionSlug: string,\n collections: PluginMCPServerConfig['collections'],\n) => {\n const tool = async (\n id?: string,\n where?: string,\n depth: number = 0,\n ): Promise<{\n content: Array<{\n text: string\n type: 'text'\n }>\n }> => {\n const payload = req.payload\n\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Deleting resource from collection: ${collectionSlug}${id ? ` with ID: ${id}` : ' with where clause'}`,\n )\n }\n\n try {\n // Validate that either id or where is provided\n if (!id && !where) {\n payload.logger.error('[payload-mcp] Either id or where clause must be provided')\n const response = {\n content: [\n { type: 'text' as const, text: 'Error: Either id or where clause must be provided' },\n ],\n }\n return (collections?.[collectionSlug]?.overrideResponse?.(response, {}, req) ||\n response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n }\n\n // Parse where clause if provided\n let whereClause = {}\n if (where) {\n try {\n whereClause = JSON.parse(where)\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Using where clause: ${where}`)\n }\n } catch (_parseError) {\n payload.logger.warn(`[payload-mcp] Invalid where clause JSON: ${where}`)\n const response = {\n content: [{ type: 'text' as const, text: 'Error: Invalid JSON in where clause' }],\n }\n return (collections?.[collectionSlug]?.overrideResponse?.(response, {}, req) ||\n response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n }\n }\n\n // Build delete options\n const deleteOptions: Record<string, unknown> = {\n collection: collectionSlug,\n depth,\n user,\n }\n\n // Delete by ID or where clause\n if (id) {\n deleteOptions.id = id\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Deleting single document with ID: ${id}`)\n }\n } else {\n deleteOptions.where = whereClause\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Deleting multiple documents with where clause`)\n }\n }\n\n const result = await payload.delete(deleteOptions as Parameters<typeof payload.delete>[0])\n\n // Handle different result types\n if (id) {\n // Single document deletion\n if (verboseLogs) {\n payload.logger.info(`[payload-mcp] Successfully deleted document with ID: ${id}`)\n }\n\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `Document deleted successfully from collection \"${collectionSlug}\"!\nDeleted document:\n\\`\\`\\`json\n${JSON.stringify(result, null, 2)}\n\\`\\`\\``,\n },\n ],\n }\n\n return (collections?.[collectionSlug]?.overrideResponse?.(response, result, req) ||\n response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n } else {\n // Multiple documents deletion\n const bulkResult = result as { docs?: unknown[]; errors?: unknown[] }\n const docs = bulkResult.docs || []\n const errors = bulkResult.errors || []\n\n if (verboseLogs) {\n payload.logger.info(\n `[payload-mcp] Successfully deleted ${docs.length} documents, ${errors.length} errors`,\n )\n }\n\n let responseText = `Document deleted successfully from collection \"${collectionSlug}\"!\nDeleted: ${docs.length} documents\nErrors: ${errors.length}\n---`\n\n if (docs.length > 0) {\n responseText += `\\n\\nDeleted documents:\n\\`\\`\\`json\n${JSON.stringify(docs, null, 2)}\n\\`\\`\\``\n }\n\n if (errors.length > 0) {\n responseText += `\\n\\nErrors:\n\\`\\`\\`json\n${JSON.stringify(errors, null, 2)}\n\\`\\`\\``\n }\n\n const response = {\n content: [\n {\n type: 'text' as const,\n text: responseText,\n },\n ],\n }\n\n return (collections?.[collectionSlug]?.overrideResponse?.(\n response,\n { docs, errors },\n req,\n ) || response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n payload.logger.error(\n `[payload-mcp] Error deleting resource from ${collectionSlug}: ${errorMessage}`,\n )\n\n const response = {\n content: [\n {\n type: 'text' as const,\n text: `Error deleting resource from collection \"${collectionSlug}\": ${errorMessage}`,\n },\n ],\n }\n\n return (collections?.[collectionSlug]?.overrideResponse?.(response, {}, req) || response) as {\n content: Array<{\n text: string\n type: 'text'\n }>\n }\n }\n }\n\n if (collections?.[collectionSlug]?.enabled) {\n server.tool(\n `delete${collectionSlug.charAt(0).toUpperCase() + toCamelCase(collectionSlug).slice(1)}`,\n `${toolSchemas.deleteResource.description.trim()}\\n\\n${collections?.[collectionSlug]?.description || ''}`,\n toolSchemas.deleteResource.parameters.shape,\n async ({ id, depth, where }) => {\n return await tool(id, where, depth)\n },\n )\n }\n}\n"],"names":["toCamelCase","toolSchemas","deleteResourceTool","server","req","user","verboseLogs","collectionSlug","collections","tool","id","where","depth","payload","logger","info","error","response","content","type","text","overrideResponse","whereClause","JSON","parse","_parseError","warn","deleteOptions","collection","result","delete","stringify","bulkResult","docs","errors","length","responseText","errorMessage","Error","message","enabled","charAt","toUpperCase","slice","deleteResource","description","trim","parameters","shape"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import type { PayloadRequest, TypedUser } from 'payload';
3
+ import type { PluginMCPServerConfig } from '../../../types.js';
4
+ export declare const findResourceTool: (server: McpServer, req: PayloadRequest, user: TypedUser, verboseLogs: boolean, collectionSlug: string, collections: PluginMCPServerConfig["collections"]) => void;
5
+ //# sourceMappingURL=find.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../../../src/mcp/tools/resource/find.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAA;AACxE,OAAO,KAAK,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAExD,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AAK9D,eAAO,MAAM,gBAAgB,WACnB,SAAS,OACZ,cAAc,QACb,SAAS,eACF,OAAO,kBACJ,MAAM,eACT,qBAAqB,CAAC,aAAa,CAAC,SAmLlD,CAAA"}