@payloadcms/plugin-mcp 4.0.0-internal.c2b57ce → 4.0.0-internal.c6494b5

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 (241) hide show
  1. package/LICENSE.md +1 -1
  2. package/dist/defaultAccess.d.ts +3 -0
  3. package/dist/defaultAccess.d.ts.map +1 -0
  4. package/dist/defaultAccess.js +3 -0
  5. package/dist/defaultAccess.js.map +1 -0
  6. package/dist/defineTool.d.ts +8 -8
  7. package/dist/defineTool.d.ts.map +1 -1
  8. package/dist/endpoint/access.d.ts +12 -5
  9. package/dist/endpoint/access.d.ts.map +1 -1
  10. package/dist/endpoint/access.js +75 -88
  11. package/dist/endpoint/access.js.map +1 -1
  12. package/dist/endpoint/index.d.ts +1 -1
  13. package/dist/endpoint/index.d.ts.map +1 -1
  14. package/dist/endpoint/index.js +98 -18
  15. package/dist/endpoint/index.js.map +1 -1
  16. package/dist/exports/client.d.ts +1 -1
  17. package/dist/exports/client.d.ts.map +1 -1
  18. package/dist/exports/client.js +1 -1
  19. package/dist/exports/client.js.map +1 -1
  20. package/dist/exports/internal.d.ts +2 -0
  21. package/dist/exports/internal.d.ts.map +1 -0
  22. package/dist/exports/internal.js +3 -0
  23. package/dist/exports/internal.js.map +1 -0
  24. package/dist/index.d.ts +2 -2
  25. package/dist/index.d.ts.map +1 -1
  26. package/dist/index.js +15 -20
  27. package/dist/index.js.map +1 -1
  28. package/dist/mcp/buildMcpServer.d.ts +6 -6
  29. package/dist/mcp/buildMcpServer.d.ts.map +1 -1
  30. package/dist/mcp/buildMcpServer.js +146 -74
  31. package/dist/mcp/buildMcpServer.js.map +1 -1
  32. package/dist/mcp/builtin/collections/authTools.d.ts.map +1 -1
  33. package/dist/mcp/builtin/collections/authTools.js +123 -61
  34. package/dist/mcp/builtin/collections/authTools.js.map +1 -1
  35. package/dist/mcp/builtin/collections/countTool.d.ts +2 -0
  36. package/dist/mcp/builtin/collections/countTool.d.ts.map +1 -0
  37. package/dist/mcp/builtin/collections/countTool.js +63 -0
  38. package/dist/mcp/builtin/collections/countTool.js.map +1 -0
  39. package/dist/mcp/builtin/collections/countVersionsTool.d.ts +2 -0
  40. package/dist/mcp/builtin/collections/countVersionsTool.d.ts.map +1 -0
  41. package/dist/mcp/builtin/collections/countVersionsTool.js +60 -0
  42. package/dist/mcp/builtin/collections/countVersionsTool.js.map +1 -0
  43. package/dist/mcp/builtin/collections/createTool.d.ts +1 -1
  44. package/dist/mcp/builtin/collections/createTool.d.ts.map +1 -1
  45. package/dist/mcp/builtin/collections/createTool.js +114 -64
  46. package/dist/mcp/builtin/collections/createTool.js.map +1 -1
  47. package/dist/mcp/builtin/collections/deleteTool.d.ts +1 -1
  48. package/dist/mcp/builtin/collections/deleteTool.d.ts.map +1 -1
  49. package/dist/mcp/builtin/collections/deleteTool.js +55 -61
  50. package/dist/mcp/builtin/collections/deleteTool.js.map +1 -1
  51. package/dist/mcp/builtin/collections/duplicateTool.d.ts +2 -0
  52. package/dist/mcp/builtin/collections/duplicateTool.d.ts.map +1 -0
  53. package/dist/mcp/builtin/collections/duplicateTool.js +90 -0
  54. package/dist/mcp/builtin/collections/duplicateTool.js.map +1 -0
  55. package/dist/mcp/builtin/collections/fileInput.d.ts +28 -0
  56. package/dist/mcp/builtin/collections/fileInput.d.ts.map +1 -0
  57. package/dist/mcp/builtin/collections/fileInput.js +88 -0
  58. package/dist/mcp/builtin/collections/fileInput.js.map +1 -0
  59. package/dist/mcp/builtin/collections/findDistinctTool.d.ts +2 -0
  60. package/dist/mcp/builtin/collections/findDistinctTool.d.ts.map +1 -0
  61. package/dist/mcp/builtin/collections/findDistinctTool.js +77 -0
  62. package/dist/mcp/builtin/collections/findDistinctTool.js.map +1 -0
  63. package/dist/mcp/builtin/collections/findTool.d.ts +1 -1
  64. package/dist/mcp/builtin/collections/findTool.d.ts.map +1 -1
  65. package/dist/mcp/builtin/collections/findTool.js +61 -74
  66. package/dist/mcp/builtin/collections/findTool.js.map +1 -1
  67. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts +2 -0
  68. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts.map +1 -0
  69. package/dist/mcp/builtin/collections/findVersionByIDTool.js +74 -0
  70. package/dist/mcp/builtin/collections/findVersionByIDTool.js.map +1 -0
  71. package/dist/mcp/builtin/collections/findVersionsTool.d.ts +2 -0
  72. package/dist/mcp/builtin/collections/findVersionsTool.d.ts.map +1 -0
  73. package/dist/mcp/builtin/collections/findVersionsTool.js +84 -0
  74. package/dist/mcp/builtin/collections/findVersionsTool.js.map +1 -0
  75. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts +2 -0
  76. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts.map +1 -0
  77. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js +103 -0
  78. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js.map +1 -0
  79. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts +2 -0
  80. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts.map +1 -0
  81. package/dist/mcp/builtin/collections/restoreVersionTool.js +69 -0
  82. package/dist/mcp/builtin/collections/restoreVersionTool.js.map +1 -0
  83. package/dist/mcp/builtin/collections/updateTool.d.ts +1 -1
  84. package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -1
  85. package/dist/mcp/builtin/collections/updateTool.js +118 -133
  86. package/dist/mcp/builtin/collections/updateTool.js.map +1 -1
  87. package/dist/mcp/builtin/collections/uploadInstructionsTool.d.ts +2 -0
  88. package/dist/mcp/builtin/collections/uploadInstructionsTool.d.ts.map +1 -0
  89. package/dist/mcp/builtin/collections/uploadInstructionsTool.js +55 -0
  90. package/dist/mcp/builtin/collections/uploadInstructionsTool.js.map +1 -0
  91. package/dist/mcp/builtin/formatEntityError.d.ts +16 -0
  92. package/dist/mcp/builtin/formatEntityError.d.ts.map +1 -0
  93. package/dist/mcp/builtin/formatEntityError.js +55 -0
  94. package/dist/mcp/builtin/formatEntityError.js.map +1 -0
  95. package/dist/mcp/builtin/getConfigInfoTool.d.ts +2 -0
  96. package/dist/mcp/builtin/getConfigInfoTool.d.ts.map +1 -0
  97. package/dist/mcp/builtin/getConfigInfoTool.js +69 -0
  98. package/dist/mcp/builtin/getConfigInfoTool.js.map +1 -0
  99. package/dist/mcp/builtin/globals/countVersionsTool.d.ts +2 -0
  100. package/dist/mcp/builtin/globals/countVersionsTool.d.ts.map +1 -0
  101. package/dist/mcp/builtin/globals/countVersionsTool.js +60 -0
  102. package/dist/mcp/builtin/globals/countVersionsTool.js.map +1 -0
  103. package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -1
  104. package/dist/mcp/builtin/globals/findTool.js +27 -36
  105. package/dist/mcp/builtin/globals/findTool.js.map +1 -1
  106. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts +2 -0
  107. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts.map +1 -0
  108. package/dist/mcp/builtin/globals/findVersionByIDTool.js +68 -0
  109. package/dist/mcp/builtin/globals/findVersionByIDTool.js.map +1 -0
  110. package/dist/mcp/builtin/globals/findVersionsTool.d.ts +2 -0
  111. package/dist/mcp/builtin/globals/findVersionsTool.d.ts.map +1 -0
  112. package/dist/mcp/builtin/globals/findVersionsTool.js +78 -0
  113. package/dist/mcp/builtin/globals/findVersionsTool.js.map +1 -0
  114. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts +2 -0
  115. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts.map +1 -0
  116. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js +81 -0
  117. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js.map +1 -0
  118. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts +2 -0
  119. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts.map +1 -0
  120. package/dist/mcp/builtin/globals/restoreVersionTool.js +70 -0
  121. package/dist/mcp/builtin/globals/restoreVersionTool.js.map +1 -0
  122. package/dist/mcp/builtin/globals/updateTool.d.ts.map +1 -1
  123. package/dist/mcp/builtin/globals/updateTool.js +44 -58
  124. package/dist/mcp/builtin/globals/updateTool.js.map +1 -1
  125. package/dist/mcp/builtinTools.d.ts +150 -19
  126. package/dist/mcp/builtinTools.d.ts.map +1 -1
  127. package/dist/mcp/builtinTools.js +125 -20
  128. package/dist/mcp/builtinTools.js.map +1 -1
  129. package/dist/mcp/sanitizeMCPConfig.d.ts +0 -1
  130. package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -1
  131. package/dist/mcp/sanitizeMCPConfig.js +124 -58
  132. package/dist/mcp/sanitizeMCPConfig.js.map +1 -1
  133. package/dist/stdio.d.ts +3 -3
  134. package/dist/stdio.d.ts.map +1 -1
  135. package/dist/stdio.js +86 -47
  136. package/dist/stdio.js.map +1 -1
  137. package/dist/types.d.ts +123 -114
  138. package/dist/types.d.ts.map +1 -1
  139. package/dist/types.js +2 -4
  140. package/dist/types.js.map +1 -1
  141. package/dist/utils/camelCase.d.ts.map +1 -1
  142. package/dist/utils/getPluginConfig.d.ts +1 -1
  143. package/dist/utils/getPluginConfig.js +1 -1
  144. package/dist/utils/getPluginConfig.js.map +1 -1
  145. package/dist/utils/resolveProjectRoot.d.ts.map +1 -1
  146. package/dist/utils/toStandardSchema.d.ts.map +1 -1
  147. package/package.json +14 -21
  148. package/src/defaultAccess.ts +3 -0
  149. package/src/endpoint/access.ts +80 -101
  150. package/src/endpoint/index.ts +88 -16
  151. package/src/exports/client.ts +2 -1
  152. package/src/exports/internal.ts +1 -0
  153. package/src/index.ts +12 -20
  154. package/src/mcp/buildMcpServer.ts +180 -110
  155. package/src/mcp/builtin/collections/authTools.ts +122 -75
  156. package/src/mcp/builtin/collections/countTool.ts +61 -0
  157. package/src/mcp/builtin/collections/countVersionsTool.ts +60 -0
  158. package/src/mcp/builtin/collections/createTool.ts +117 -88
  159. package/src/mcp/builtin/collections/deleteTool.ts +48 -74
  160. package/src/mcp/builtin/collections/duplicateTool.ts +84 -0
  161. package/src/mcp/builtin/collections/fileInput.spec.ts +93 -0
  162. package/src/mcp/builtin/collections/fileInput.ts +127 -0
  163. package/src/mcp/builtin/collections/findDistinctTool.ts +67 -0
  164. package/src/mcp/builtin/collections/findTool.ts +57 -110
  165. package/src/mcp/builtin/collections/findVersionByIDTool.ts +66 -0
  166. package/src/mcp/builtin/collections/findVersionsTool.ts +83 -0
  167. package/src/mcp/builtin/collections/getCollectionSchemaTool.ts +91 -0
  168. package/src/mcp/builtin/collections/restoreVersionTool.ts +65 -0
  169. package/src/mcp/builtin/collections/updateTool.ts +106 -138
  170. package/src/mcp/builtin/collections/uploadInstructionsTool.ts +64 -0
  171. package/src/mcp/builtin/formatEntityError.ts +77 -0
  172. package/src/mcp/builtin/getConfigInfoTool.ts +68 -0
  173. package/src/mcp/builtin/globals/countVersionsTool.ts +60 -0
  174. package/src/mcp/builtin/globals/findTool.ts +27 -57
  175. package/src/mcp/builtin/globals/findVersionByIDTool.ts +64 -0
  176. package/src/mcp/builtin/globals/findVersionsTool.ts +69 -0
  177. package/src/mcp/builtin/globals/getGlobalSchemaTool.ts +73 -0
  178. package/src/mcp/builtin/globals/restoreVersionTool.ts +68 -0
  179. package/src/mcp/builtin/globals/updateTool.ts +51 -77
  180. package/src/mcp/builtinTools.ts +118 -41
  181. package/src/mcp/sanitizeMCPConfig.ts +120 -78
  182. package/src/stdio.ts +80 -47
  183. package/src/types.ts +141 -120
  184. package/src/utils/getPluginConfig.ts +1 -1
  185. package/dist/collection/getAccessField.d.ts +0 -12
  186. package/dist/collection/getAccessField.d.ts.map +0 -1
  187. package/dist/collection/getAccessField.js +0 -57
  188. package/dist/collection/getAccessField.js.map +0 -1
  189. package/dist/collection/index.d.ts +0 -6
  190. package/dist/collection/index.d.ts.map +0 -1
  191. package/dist/collection/index.js +0 -59
  192. package/dist/collection/index.js.map +0 -1
  193. package/dist/components/AccessField/index.client.d.ts +0 -10
  194. package/dist/components/AccessField/index.client.d.ts.map +0 -1
  195. package/dist/components/AccessField/index.client.js +0 -305
  196. package/dist/components/AccessField/index.client.js.map +0 -1
  197. package/dist/components/AccessField/index.css +0 -93
  198. package/dist/utils/getVirtualFieldNames.d.ts +0 -14
  199. package/dist/utils/getVirtualFieldNames.d.ts.map +0 -1
  200. package/dist/utils/getVirtualFieldNames.js +0 -35
  201. package/dist/utils/getVirtualFieldNames.js.map +0 -1
  202. package/dist/utils/localAPIDefaults.d.ts +0 -20
  203. package/dist/utils/localAPIDefaults.d.ts.map +0 -1
  204. package/dist/utils/localAPIDefaults.js +0 -19
  205. package/dist/utils/localAPIDefaults.js.map +0 -1
  206. package/dist/utils/schemaConversion/prepareCollectionSchema.d.ts +0 -7
  207. package/dist/utils/schemaConversion/prepareCollectionSchema.d.ts.map +0 -1
  208. package/dist/utils/schemaConversion/prepareCollectionSchema.js +0 -37
  209. package/dist/utils/schemaConversion/prepareCollectionSchema.js.map +0 -1
  210. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts +0 -7
  211. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts.map +0 -1
  212. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js +0 -20
  213. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js.map +0 -1
  214. package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts +0 -13
  215. package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts.map +0 -1
  216. package/dist/utils/schemaConversion/sanitizeJsonSchema.js +0 -56
  217. package/dist/utils/schemaConversion/sanitizeJsonSchema.js.map +0 -1
  218. package/dist/utils/schemaConversion/simplifyRelationshipFields.d.ts +0 -20
  219. package/dist/utils/schemaConversion/simplifyRelationshipFields.d.ts.map +0 -1
  220. package/dist/utils/schemaConversion/simplifyRelationshipFields.js +0 -56
  221. package/dist/utils/schemaConversion/simplifyRelationshipFields.js.map +0 -1
  222. package/dist/utils/schemaConversion/transformPointFields.d.ts +0 -3
  223. package/dist/utils/schemaConversion/transformPointFields.d.ts.map +0 -1
  224. package/dist/utils/schemaConversion/transformPointFields.js +0 -57
  225. package/dist/utils/schemaConversion/transformPointFields.js.map +0 -1
  226. package/dist/utils/transformPointDataToPayload.d.ts +0 -7
  227. package/dist/utils/transformPointDataToPayload.d.ts.map +0 -1
  228. package/dist/utils/transformPointDataToPayload.js +0 -28
  229. package/dist/utils/transformPointDataToPayload.js.map +0 -1
  230. package/src/collection/getAccessField.ts +0 -64
  231. package/src/collection/index.ts +0 -63
  232. package/src/components/AccessField/index.client.tsx +0 -344
  233. package/src/components/AccessField/index.css +0 -93
  234. package/src/utils/getVirtualFieldNames.ts +0 -53
  235. package/src/utils/localAPIDefaults.ts +0 -22
  236. package/src/utils/schemaConversion/prepareCollectionSchema.ts +0 -39
  237. package/src/utils/schemaConversion/removeVirtualFieldsFromSchema.ts +0 -27
  238. package/src/utils/schemaConversion/sanitizeJsonSchema.ts +0 -62
  239. package/src/utils/schemaConversion/simplifyRelationshipFields.ts +0 -70
  240. package/src/utils/schemaConversion/transformPointFields.ts +0 -56
  241. package/src/utils/transformPointDataToPayload.ts +0 -40
@@ -1,4 +1,5 @@
1
- import { z } from 'zod';
1
+ import { createPayloadRequest, strictObject, z } from 'payload';
2
+ import { defaultAccess } from '../../../defaultAccess.js';
2
3
  import { defineCollectionTool } from '../../../defineTool.js';
3
4
  import { getLogger } from '../../../utils/getLogger.js';
4
5
  /**
@@ -10,38 +11,65 @@ import { getLogger } from '../../../utils/getLogger.js';
10
11
  * `auth` (check current token) doesn't actually depend on the collection at
11
12
  * runtime — `payload.auth({ headers })` is global — but it's grouped under the
12
13
  * users collection so all auth-shaped tools live in one place.
13
- */ const emailSchema = z.string().email().describe('The user email address');
14
- const wrapError = (name)=>({ collectionSlug, message })=>{
14
+ */ const emailSchema = z.email().check(z.describe('The user email address.'));
15
+ const wrapError = (name)=>({ slug, message })=>{
15
16
  return {
16
17
  content: [
17
18
  {
18
19
  type: 'text',
19
- text: `❌ **Error in ${name}** on ${collectionSlug}: ${message}`
20
+ text: `❌ **Error in ${name}** on ${slug}: ${message}`
20
21
  }
21
22
  ]
22
23
  };
23
24
  };
24
25
  export const authCollectionTool = defineCollectionTool({
26
+ annotations: {
27
+ destructiveHint: false,
28
+ idempotentHint: true,
29
+ openWorldHint: false,
30
+ readOnlyHint: true,
31
+ title: 'Check Auth Status'
32
+ },
25
33
  description: 'Checks authentication status for the current user.',
26
- input: z.object({
27
- headers: z.string().describe('Optional JSON string containing custom headers to send with the authentication request').optional()
34
+ input: strictObject({
35
+ headers: z.optional(z.record(z.string(), z.string())).check(z.describe('Custom headers to send with the authentication request.'))
28
36
  })
29
- }).handler(async ({ collectionSlug, input, req })=>{
37
+ }).handler(async ({ slug, authorizedMCP, input, req })=>{
30
38
  const logger = getLogger({
31
39
  payload: req.payload
32
40
  });
33
41
  try {
34
42
  let authHeaders = new Headers();
35
43
  if (input.headers) {
36
- try {
37
- authHeaders = new Headers(JSON.parse(input.headers));
38
- } catch {
39
- logger.warn(`Invalid headers JSON for auth: ${input.headers}, using empty headers`);
40
- }
44
+ authHeaders = new Headers(input.headers);
41
45
  }
46
+ const authReq = await createPayloadRequest({
47
+ payload: req.payload,
48
+ req: {
49
+ headers: authHeaders
50
+ }
51
+ });
42
52
  const result = await req.payload.auth({
43
- headers: authHeaders
53
+ headers: authHeaders,
54
+ req: authReq
44
55
  });
56
+ if (result.user) {
57
+ const authenticatedUser = result.user;
58
+ // Auth strategies read users with trusted Local API access. Re-read the user with the MCP
59
+ // caller's access level before returning it to the client.
60
+ const user = await req.payload.findByID({
61
+ id: authenticatedUser.id,
62
+ collection: authenticatedUser.collection,
63
+ overrideAccess: authorizedMCP.overrideAccess,
64
+ req: authReq
65
+ });
66
+ result.user = {
67
+ ...user,
68
+ _sid: authenticatedUser._sid,
69
+ _strategy: authenticatedUser._strategy,
70
+ collection: authenticatedUser.collection
71
+ };
72
+ }
45
73
  return {
46
74
  content: [
47
75
  {
@@ -53,150 +81,177 @@ export const authCollectionTool = defineCollectionTool({
53
81
  };
54
82
  } catch (error) {
55
83
  const errorMessage = error instanceof Error ? error.message : 'Unknown error';
56
- logger.error(`Error in auth tool on ${collectionSlug}: ${errorMessage}`);
84
+ logger.error(`Error in auth tool on ${slug}: ${errorMessage}`);
57
85
  return wrapError('auth')({
58
- collectionSlug,
86
+ slug,
59
87
  message: errorMessage
60
88
  });
61
89
  }
62
90
  });
63
91
  export const forgotPasswordCollectionTool = defineCollectionTool({
92
+ annotations: {
93
+ destructiveHint: false,
94
+ idempotentHint: false,
95
+ openWorldHint: true,
96
+ readOnlyHint: false,
97
+ title: 'Forgot Password'
98
+ },
64
99
  description: 'Sends a password reset email to a user.',
65
- input: z.object({
66
- disableEmail: z.boolean().describe('Whether to disable sending the email (for testing)').optional().default(false),
100
+ input: strictObject({
67
101
  email: emailSchema
68
102
  })
69
- }).handler(async ({ collectionSlug, input, req })=>{
103
+ }).handler(async ({ slug, input, req })=>{
70
104
  const logger = getLogger({
71
105
  payload: req.payload
72
106
  });
73
107
  try {
74
- const result = await req.payload.forgotPassword({
75
- collection: collectionSlug,
108
+ await req.payload.forgotPassword({
109
+ collection: slug,
76
110
  data: {
77
111
  email: input.email
78
112
  },
79
- disableEmail: input.disableEmail
113
+ disableEmail: false,
114
+ overrideAccess: false,
115
+ req
80
116
  });
81
117
  return {
82
118
  content: [
83
119
  {
84
120
  type: 'text',
85
- text: `# Forgot Password Email Sent\n\n**Collection:** ${collectionSlug}\n**Email:** ${input.email}\n\n\`\`\`json\n${JSON.stringify(result)}\n\`\`\``
121
+ text: 'If an account matches that email, password reset instructions have been sent.'
86
122
  }
87
- ],
88
- doc: {
89
- result
90
- }
123
+ ]
91
124
  };
92
125
  } catch (error) {
93
126
  const errorMessage = error instanceof Error ? error.message : 'Unknown error';
94
- logger.error(`Error in forgotPassword tool on ${collectionSlug}: ${errorMessage}`);
127
+ logger.error(`Error in forgotPassword tool on ${slug}: ${errorMessage}`);
95
128
  return wrapError('forgotPassword')({
96
- collectionSlug,
129
+ slug,
97
130
  message: errorMessage
98
131
  });
99
132
  }
100
133
  });
101
134
  export const loginCollectionTool = defineCollectionTool({
135
+ annotations: {
136
+ destructiveHint: false,
137
+ idempotentHint: false,
138
+ openWorldHint: false,
139
+ readOnlyHint: false,
140
+ title: 'User Login'
141
+ },
102
142
  description: 'Authenticates a user with email and password.',
103
- input: z.object({
104
- depth: z.number().int().min(0).max(10).describe('Depth of population for relationships').optional().default(0),
143
+ input: strictObject({
144
+ depth: z._default(z.int().check(z.minimum(0), z.maximum(10)), 0).check(z.describe('Depth of population for relationships.')),
105
145
  email: emailSchema,
106
- password: z.string().describe('The user password'),
107
- showHiddenFields: z.boolean().describe('Whether to show hidden fields in the response').optional().default(false)
146
+ password: z.string().check(z.describe('The user password.'))
108
147
  })
109
- }).handler(async ({ collectionSlug, input, req })=>{
148
+ }).handler(async ({ slug, authorizedMCP, input, req })=>{
110
149
  const logger = getLogger({
111
150
  payload: req.payload
112
151
  });
113
152
  try {
114
153
  const result = await req.payload.login({
115
- collection: collectionSlug,
154
+ collection: slug,
116
155
  data: {
117
156
  email: input.email,
118
157
  password: input.password
119
158
  },
120
159
  depth: input.depth,
121
- showHiddenFields: input.showHiddenFields
160
+ overrideAccess: authorizedMCP.overrideAccess
122
161
  });
123
162
  return {
124
163
  content: [
125
164
  {
126
165
  type: 'text',
127
- text: `# Login Successful\n\n**User:** ${input.email}\n**Collection:** ${collectionSlug}\n\n\`\`\`json\n${JSON.stringify(result)}\n\`\`\``
166
+ text: `# Login Successful\n\n**User:** ${input.email}\n**Collection:** ${slug}\n\n\`\`\`json\n${JSON.stringify(result)}\n\`\`\``
128
167
  }
129
168
  ],
130
169
  doc: result
131
170
  };
132
171
  } catch (error) {
133
172
  const errorMessage = error instanceof Error ? error.message : 'Unknown error';
134
- logger.error(`Error in login tool on ${collectionSlug}: ${errorMessage}`);
173
+ logger.error(`Error in login tool on ${slug}: ${errorMessage}`);
135
174
  return wrapError('login')({
136
- collectionSlug,
175
+ slug,
137
176
  message: errorMessage
138
177
  });
139
178
  }
140
179
  });
141
180
  export const resetPasswordCollectionTool = defineCollectionTool({
181
+ annotations: {
182
+ destructiveHint: false,
183
+ idempotentHint: false,
184
+ openWorldHint: false,
185
+ readOnlyHint: false,
186
+ title: 'Reset Password'
187
+ },
142
188
  description: 'Resets a user password with a reset token.',
143
- input: z.object({
144
- password: z.string().describe('The new password for the user'),
145
- token: z.string().describe('The password reset token sent to the user email')
189
+ input: strictObject({
190
+ password: z.string().check(z.describe('The new password for the user.')),
191
+ token: z.string().check(z.describe('The password reset token sent to the user email.'))
146
192
  })
147
- }).handler(async ({ collectionSlug, input, req })=>{
193
+ }).handler(async ({ slug, authorizedMCP, input, req })=>{
148
194
  const logger = getLogger({
149
195
  payload: req.payload
150
196
  });
151
197
  try {
152
198
  const result = await req.payload.resetPassword({
153
- collection: collectionSlug,
199
+ collection: slug,
154
200
  data: {
155
201
  password: input.password,
156
202
  token: input.token
157
203
  },
158
- overrideAccess: true
204
+ overrideAccess: authorizedMCP.overrideAccess
159
205
  });
160
206
  return {
161
207
  content: [
162
208
  {
163
209
  type: 'text',
164
- text: `# Password Reset Successful\n\n**Collection:** ${collectionSlug}\n\n\`\`\`json\n${JSON.stringify(result)}\n\`\`\``
210
+ text: `# Password Reset Successful\n\n**Collection:** ${slug}\n\n\`\`\`json\n${JSON.stringify(result)}\n\`\`\``
165
211
  }
166
212
  ],
167
213
  doc: result
168
214
  };
169
215
  } catch (error) {
170
216
  const errorMessage = error instanceof Error ? error.message : 'Unknown error';
171
- logger.error(`Error in resetPassword tool on ${collectionSlug}: ${errorMessage}`);
217
+ logger.error(`Error in resetPassword tool on ${slug}: ${errorMessage}`);
172
218
  return wrapError('resetPassword')({
173
- collectionSlug,
219
+ slug,
174
220
  message: errorMessage
175
221
  });
176
222
  }
177
223
  });
178
224
  export const unlockCollectionTool = defineCollectionTool({
225
+ access: (args)=>defaultAccess(args) && Boolean(args.permissions?.collections?.[args.slug]?.unlock),
226
+ annotations: {
227
+ destructiveHint: false,
228
+ idempotentHint: true,
229
+ openWorldHint: false,
230
+ readOnlyHint: false,
231
+ title: 'Unlock Account'
232
+ },
179
233
  description: 'Unlocks a user account that has been locked due to failed login attempts.',
180
- input: z.object({
234
+ input: strictObject({
181
235
  email: emailSchema
182
236
  })
183
- }).handler(async ({ collectionSlug, input, req })=>{
237
+ }).handler(async ({ slug, authorizedMCP, input, req })=>{
184
238
  const logger = getLogger({
185
239
  payload: req.payload
186
240
  });
187
241
  try {
188
242
  const result = await req.payload.unlock({
189
- collection: collectionSlug,
243
+ collection: slug,
190
244
  data: {
191
245
  email: input.email
192
246
  },
193
- overrideAccess: true
247
+ overrideAccess: authorizedMCP.overrideAccess,
248
+ req
194
249
  });
195
250
  return {
196
251
  content: [
197
252
  {
198
253
  type: 'text',
199
- text: `# Account Unlocked\n\n**Collection:** ${collectionSlug}\n**Email:** ${input.email}\n**Result:** ${result ? 'Success' : 'Failed'}`
254
+ text: `# Account Unlocked\n\n**Collection:** ${slug}\n**Email:** ${input.email}\n**Result:** ${result ? 'Success' : 'Failed'}`
200
255
  }
201
256
  ],
202
257
  doc: {
@@ -205,32 +260,39 @@ export const unlockCollectionTool = defineCollectionTool({
205
260
  };
206
261
  } catch (error) {
207
262
  const errorMessage = error instanceof Error ? error.message : 'Unknown error';
208
- logger.error(`Error in unlock tool on ${collectionSlug}: ${errorMessage}`);
263
+ logger.error(`Error in unlock tool on ${slug}: ${errorMessage}`);
209
264
  return wrapError('unlock')({
210
- collectionSlug,
265
+ slug,
211
266
  message: errorMessage
212
267
  });
213
268
  }
214
269
  });
215
270
  export const verifyCollectionTool = defineCollectionTool({
271
+ annotations: {
272
+ destructiveHint: false,
273
+ idempotentHint: false,
274
+ openWorldHint: false,
275
+ readOnlyHint: false,
276
+ title: 'Email Verification'
277
+ },
216
278
  description: 'Verifies a user email with a verification token.',
217
- input: z.object({
218
- token: z.string().describe('The verification token sent to the user email')
279
+ input: strictObject({
280
+ token: z.string().check(z.describe('The verification token sent to the user email.'))
219
281
  })
220
- }).handler(async ({ collectionSlug, input, req })=>{
282
+ }).handler(async ({ slug, input, req })=>{
221
283
  const logger = getLogger({
222
284
  payload: req.payload
223
285
  });
224
286
  try {
225
287
  const result = await req.payload.verifyEmail({
226
- collection: collectionSlug,
288
+ collection: slug,
227
289
  token: input.token
228
290
  });
229
291
  return {
230
292
  content: [
231
293
  {
232
294
  type: 'text',
233
- text: `# Email Verification Successful\n\n**Collection:** ${collectionSlug}\n**Result:** ${result ? 'Success' : 'Failed'}`
295
+ text: `# Email Verification Successful\n\n**Collection:** ${slug}\n**Result:** ${result ? 'Success' : 'Failed'}`
234
296
  }
235
297
  ],
236
298
  doc: {
@@ -239,9 +301,9 @@ export const verifyCollectionTool = defineCollectionTool({
239
301
  };
240
302
  } catch (error) {
241
303
  const errorMessage = error instanceof Error ? error.message : 'Unknown error';
242
- logger.error(`Error in verify tool on ${collectionSlug}: ${errorMessage}`);
304
+ logger.error(`Error in verify tool on ${slug}: ${errorMessage}`);
243
305
  return wrapError('verify')({
244
- collectionSlug,
306
+ slug,
245
307
  message: errorMessage
246
308
  });
247
309
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/mcp/builtin/collections/authTools.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport type { MCPToolResponse } from '../../../types.js'\n\nimport { defineCollectionTool } from '../../../defineTool.js'\nimport { getLogger } from '../../../utils/getLogger.js'\n\n/**\n * Auth tools surfaced under `collections.<auth-collection>.tools`. Opt-in: they\n * default off (an LLM with `login` access can probe passwords; not something\n * to expose by default). Enable in plugin config via `tools: { login: true }`\n * (or `{ description: '...' }`).\n *\n * `auth` (check current token) doesn't actually depend on the collection at\n * runtime — `payload.auth({ headers })` is global — but it's grouped under the\n * users collection so all auth-shaped tools live in one place.\n */\n\nconst emailSchema = z.string().email().describe('The user email address')\n\nconst wrapError =\n (name: string) =>\n ({ collectionSlug, message }: { collectionSlug: string; message: string }): MCPToolResponse => {\n return {\n content: [\n {\n type: 'text',\n text: `❌ **Error in ${name}** on ${collectionSlug}: ${message}`,\n },\n ],\n }\n }\n\nexport const authCollectionTool = defineCollectionTool({\n description: 'Checks authentication status for the current user.',\n input: z.object({\n headers: z\n .string()\n .describe(\n 'Optional JSON string containing custom headers to send with the authentication request',\n )\n .optional(),\n }),\n}).handler(async ({ collectionSlug, input, req }) => {\n const logger = getLogger({ payload: req.payload })\n try {\n let authHeaders = new Headers()\n if (input.headers) {\n try {\n authHeaders = new Headers(JSON.parse(input.headers) as Record<string, string>)\n } catch {\n logger.warn(`Invalid headers JSON for auth: ${input.headers}, using empty headers`)\n }\n }\n const result = await req.payload.auth({ headers: authHeaders })\n return {\n content: [\n {\n type: 'text',\n text: `# Authentication Status\\n\\n\\`\\`\\`json\\n${JSON.stringify(result)}\\n\\`\\`\\``,\n },\n ],\n doc: result as unknown as Record<string, unknown>,\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n logger.error(`Error in auth tool on ${collectionSlug}: ${errorMessage}`)\n return wrapError('auth')({ collectionSlug, message: errorMessage })\n }\n})\n\nexport const forgotPasswordCollectionTool = defineCollectionTool({\n description: 'Sends a password reset email to a user.',\n input: z.object({\n disableEmail: z\n .boolean()\n .describe('Whether to disable sending the email (for testing)')\n .optional()\n .default(false),\n email: emailSchema,\n }),\n}).handler(async ({ collectionSlug, input, req }) => {\n const logger = getLogger({ payload: req.payload })\n try {\n const result = await req.payload.forgotPassword({\n collection: collectionSlug,\n data: { email: input.email },\n disableEmail: input.disableEmail,\n })\n return {\n content: [\n {\n type: 'text',\n text: `# Forgot Password Email Sent\\n\\n**Collection:** ${collectionSlug}\\n**Email:** ${input.email}\\n\\n\\`\\`\\`json\\n${JSON.stringify(result)}\\n\\`\\`\\``,\n },\n ],\n doc: { result } as Record<string, unknown>,\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n logger.error(`Error in forgotPassword tool on ${collectionSlug}: ${errorMessage}`)\n return wrapError('forgotPassword')({ collectionSlug, message: errorMessage })\n }\n})\n\nexport const loginCollectionTool = defineCollectionTool({\n description: 'Authenticates a user with email and password.',\n input: z.object({\n depth: z\n .number()\n .int()\n .min(0)\n .max(10)\n .describe('Depth of population for relationships')\n .optional()\n .default(0),\n email: emailSchema,\n password: z.string().describe('The user password'),\n showHiddenFields: z\n .boolean()\n .describe('Whether to show hidden fields in the response')\n .optional()\n .default(false),\n }),\n}).handler(async ({ collectionSlug, input, req }) => {\n const logger = getLogger({ payload: req.payload })\n try {\n const result = await req.payload.login({\n collection: collectionSlug,\n data: { email: input.email, password: input.password },\n depth: input.depth,\n showHiddenFields: input.showHiddenFields,\n })\n return {\n content: [\n {\n type: 'text',\n text: `# Login Successful\\n\\n**User:** ${input.email}\\n**Collection:** ${collectionSlug}\\n\\n\\`\\`\\`json\\n${JSON.stringify(result)}\\n\\`\\`\\``,\n },\n ],\n doc: result as unknown as Record<string, unknown>,\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n logger.error(`Error in login tool on ${collectionSlug}: ${errorMessage}`)\n return wrapError('login')({ collectionSlug, message: errorMessage })\n }\n})\n\nexport const resetPasswordCollectionTool = defineCollectionTool({\n description: 'Resets a user password with a reset token.',\n input: z.object({\n password: z.string().describe('The new password for the user'),\n token: z.string().describe('The password reset token sent to the user email'),\n }),\n}).handler(async ({ collectionSlug, input, req }) => {\n const logger = getLogger({ payload: req.payload })\n try {\n const result = await req.payload.resetPassword({\n collection: collectionSlug,\n data: { password: input.password, token: input.token },\n overrideAccess: true,\n })\n return {\n content: [\n {\n type: 'text',\n text: `# Password Reset Successful\\n\\n**Collection:** ${collectionSlug}\\n\\n\\`\\`\\`json\\n${JSON.stringify(result)}\\n\\`\\`\\``,\n },\n ],\n doc: result as unknown as Record<string, unknown>,\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n logger.error(`Error in resetPassword tool on ${collectionSlug}: ${errorMessage}`)\n return wrapError('resetPassword')({ collectionSlug, message: errorMessage })\n }\n})\n\nexport const unlockCollectionTool = defineCollectionTool({\n description: 'Unlocks a user account that has been locked due to failed login attempts.',\n input: z.object({ email: emailSchema }),\n}).handler(async ({ collectionSlug, input, req }) => {\n const logger = getLogger({ payload: req.payload })\n try {\n const result = await req.payload.unlock({\n collection: collectionSlug,\n data: { email: input.email },\n overrideAccess: true,\n })\n return {\n content: [\n {\n type: 'text',\n text: `# Account Unlocked\\n\\n**Collection:** ${collectionSlug}\\n**Email:** ${input.email}\\n**Result:** ${result ? 'Success' : 'Failed'}`,\n },\n ],\n doc: { result } as Record<string, unknown>,\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n logger.error(`Error in unlock tool on ${collectionSlug}: ${errorMessage}`)\n return wrapError('unlock')({ collectionSlug, message: errorMessage })\n }\n})\n\nexport const verifyCollectionTool = defineCollectionTool({\n description: 'Verifies a user email with a verification token.',\n input: z.object({\n token: z.string().describe('The verification token sent to the user email'),\n }),\n}).handler(async ({ collectionSlug, input, req }) => {\n const logger = getLogger({ payload: req.payload })\n try {\n const result = await req.payload.verifyEmail({\n collection: collectionSlug,\n token: input.token,\n })\n return {\n content: [\n {\n type: 'text',\n text: `# Email Verification Successful\\n\\n**Collection:** ${collectionSlug}\\n**Result:** ${result ? 'Success' : 'Failed'}`,\n },\n ],\n doc: { result } as Record<string, unknown>,\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n logger.error(`Error in verify tool on ${collectionSlug}: ${errorMessage}`)\n return wrapError('verify')({ collectionSlug, message: errorMessage })\n }\n})\n"],"names":["z","defineCollectionTool","getLogger","emailSchema","string","email","describe","wrapError","name","collectionSlug","message","content","type","text","authCollectionTool","description","input","object","headers","optional","handler","req","logger","payload","authHeaders","Headers","JSON","parse","warn","result","auth","stringify","doc","error","errorMessage","Error","forgotPasswordCollectionTool","disableEmail","boolean","default","forgotPassword","collection","data","loginCollectionTool","depth","number","int","min","max","password","showHiddenFields","login","resetPasswordCollectionTool","token","resetPassword","overrideAccess","unlockCollectionTool","unlock","verifyCollectionTool","verifyEmail"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/mcp/builtin/collections/authTools.ts"],"sourcesContent":["import { createPayloadRequest, strictObject, z } from 'payload'\n\nimport type { MCPToolResponse } from '../../../types.js'\n\nimport { defaultAccess } from '../../../defaultAccess.js'\nimport { defineCollectionTool } from '../../../defineTool.js'\nimport { getLogger } from '../../../utils/getLogger.js'\n\n/**\n * Auth tools surfaced under `collections.<auth-collection>.tools`. Opt-in: they\n * default off (an LLM with `login` access can probe passwords; not something\n * to expose by default). Enable in plugin config via `tools: { login: true }`\n * (or `{ description: '...' }`).\n *\n * `auth` (check current token) doesn't actually depend on the collection at\n * runtime — `payload.auth({ headers })` is global — but it's grouped under the\n * users collection so all auth-shaped tools live in one place.\n */\n\nconst emailSchema = z.email().check(z.describe('The user email address.'))\n\nconst wrapError =\n (name: string) =>\n ({ slug, message }: { message: string; slug: string }): MCPToolResponse => {\n return {\n content: [\n {\n type: 'text',\n text: `❌ **Error in ${name}** on ${slug}: ${message}`,\n },\n ],\n }\n }\n\nexport const authCollectionTool = defineCollectionTool({\n annotations: {\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n readOnlyHint: true,\n title: 'Check Auth Status',\n },\n description: 'Checks authentication status for the current user.',\n input: strictObject({\n headers: z\n .optional(z.record(z.string(), z.string()))\n .check(z.describe('Custom headers to send with the authentication request.')),\n }),\n}).handler(async ({ slug, authorizedMCP, input, req }) => {\n const logger = getLogger({ payload: req.payload })\n try {\n let authHeaders = new Headers()\n if (input.headers) {\n authHeaders = new Headers(input.headers)\n }\n const authReq = await createPayloadRequest({\n payload: req.payload,\n req: { headers: authHeaders },\n })\n const result = await req.payload.auth({ headers: authHeaders, req: authReq })\n\n if (result.user) {\n const authenticatedUser = result.user\n // Auth strategies read users with trusted Local API access. Re-read the user with the MCP\n // caller's access level before returning it to the client.\n const user = await req.payload.findByID({\n id: authenticatedUser.id,\n collection: authenticatedUser.collection,\n overrideAccess: authorizedMCP.overrideAccess,\n req: authReq,\n })\n result.user = {\n ...user,\n _sid: authenticatedUser._sid,\n _strategy: authenticatedUser._strategy,\n collection: authenticatedUser.collection,\n }\n }\n return {\n content: [\n {\n type: 'text',\n text: `# Authentication Status\\n\\n\\`\\`\\`json\\n${JSON.stringify(result)}\\n\\`\\`\\``,\n },\n ],\n doc: result as unknown as Record<string, unknown>,\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n logger.error(`Error in auth tool on ${slug}: ${errorMessage}`)\n return wrapError('auth')({ slug, message: errorMessage })\n }\n})\n\nexport const forgotPasswordCollectionTool = defineCollectionTool({\n annotations: {\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n readOnlyHint: false,\n title: 'Forgot Password',\n },\n description: 'Sends a password reset email to a user.',\n input: strictObject({\n email: emailSchema,\n }),\n}).handler(async ({ slug, input, req }) => {\n const logger = getLogger({ payload: req.payload })\n try {\n await req.payload.forgotPassword({\n collection: slug,\n data: { email: input.email },\n disableEmail: false,\n overrideAccess: false,\n req,\n })\n return {\n content: [\n {\n type: 'text',\n text: 'If an account matches that email, password reset instructions have been sent.',\n },\n ],\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n logger.error(`Error in forgotPassword tool on ${slug}: ${errorMessage}`)\n return wrapError('forgotPassword')({ slug, message: errorMessage })\n }\n})\n\nexport const loginCollectionTool = defineCollectionTool({\n annotations: {\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: false,\n readOnlyHint: false,\n title: 'User Login',\n },\n description: 'Authenticates a user with email and password.',\n input: strictObject({\n depth: z\n ._default(z.int().check(z.minimum(0), z.maximum(10)), 0)\n .check(z.describe('Depth of population for relationships.')),\n email: emailSchema,\n password: z.string().check(z.describe('The user password.')),\n }),\n}).handler(async ({ slug, authorizedMCP, input, req }) => {\n const logger = getLogger({ payload: req.payload })\n try {\n const result = await req.payload.login({\n collection: slug,\n data: { email: input.email, password: input.password },\n depth: input.depth,\n overrideAccess: authorizedMCP.overrideAccess,\n })\n return {\n content: [\n {\n type: 'text',\n text: `# Login Successful\\n\\n**User:** ${input.email}\\n**Collection:** ${slug}\\n\\n\\`\\`\\`json\\n${JSON.stringify(result)}\\n\\`\\`\\``,\n },\n ],\n doc: result as unknown as Record<string, unknown>,\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n logger.error(`Error in login tool on ${slug}: ${errorMessage}`)\n return wrapError('login')({ slug, message: errorMessage })\n }\n})\n\nexport const resetPasswordCollectionTool = defineCollectionTool({\n annotations: {\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: false,\n readOnlyHint: false,\n title: 'Reset Password',\n },\n description: 'Resets a user password with a reset token.',\n input: strictObject({\n password: z.string().check(z.describe('The new password for the user.')),\n token: z.string().check(z.describe('The password reset token sent to the user email.')),\n }),\n}).handler(async ({ slug, authorizedMCP, input, req }) => {\n const logger = getLogger({ payload: req.payload })\n try {\n const result = await req.payload.resetPassword({\n collection: slug,\n data: { password: input.password, token: input.token },\n overrideAccess: authorizedMCP.overrideAccess,\n })\n return {\n content: [\n {\n type: 'text',\n text: `# Password Reset Successful\\n\\n**Collection:** ${slug}\\n\\n\\`\\`\\`json\\n${JSON.stringify(result)}\\n\\`\\`\\``,\n },\n ],\n doc: result as unknown as Record<string, unknown>,\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n logger.error(`Error in resetPassword tool on ${slug}: ${errorMessage}`)\n return wrapError('resetPassword')({ slug, message: errorMessage })\n }\n})\n\nexport const unlockCollectionTool = defineCollectionTool({\n access: (args) =>\n defaultAccess(args) && Boolean(args.permissions?.collections?.[args.slug]?.unlock),\n annotations: {\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n readOnlyHint: false,\n title: 'Unlock Account',\n },\n description: 'Unlocks a user account that has been locked due to failed login attempts.',\n input: strictObject({ email: emailSchema }),\n}).handler(async ({ slug, authorizedMCP, input, req }) => {\n const logger = getLogger({ payload: req.payload })\n try {\n const result = await req.payload.unlock({\n collection: slug,\n data: { email: input.email },\n overrideAccess: authorizedMCP.overrideAccess,\n req,\n })\n return {\n content: [\n {\n type: 'text',\n text: `# Account Unlocked\\n\\n**Collection:** ${slug}\\n**Email:** ${input.email}\\n**Result:** ${result ? 'Success' : 'Failed'}`,\n },\n ],\n doc: { result } as Record<string, unknown>,\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n logger.error(`Error in unlock tool on ${slug}: ${errorMessage}`)\n return wrapError('unlock')({ slug, message: errorMessage })\n }\n})\n\nexport const verifyCollectionTool = defineCollectionTool({\n annotations: {\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: false,\n readOnlyHint: false,\n title: 'Email Verification',\n },\n description: 'Verifies a user email with a verification token.',\n input: strictObject({\n token: z.string().check(z.describe('The verification token sent to the user email.')),\n }),\n}).handler(async ({ slug, input, req }) => {\n const logger = getLogger({ payload: req.payload })\n try {\n const result = await req.payload.verifyEmail({\n collection: slug,\n token: input.token,\n })\n return {\n content: [\n {\n type: 'text',\n text: `# Email Verification Successful\\n\\n**Collection:** ${slug}\\n**Result:** ${result ? 'Success' : 'Failed'}`,\n },\n ],\n doc: { result } as Record<string, unknown>,\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n logger.error(`Error in verify tool on ${slug}: ${errorMessage}`)\n return wrapError('verify')({ slug, message: errorMessage })\n }\n})\n"],"names":["createPayloadRequest","strictObject","z","defaultAccess","defineCollectionTool","getLogger","emailSchema","email","check","describe","wrapError","name","slug","message","content","type","text","authCollectionTool","annotations","destructiveHint","idempotentHint","openWorldHint","readOnlyHint","title","description","input","headers","optional","record","string","handler","authorizedMCP","req","logger","payload","authHeaders","Headers","authReq","result","auth","user","authenticatedUser","findByID","id","collection","overrideAccess","_sid","_strategy","JSON","stringify","doc","error","errorMessage","Error","forgotPasswordCollectionTool","forgotPassword","data","disableEmail","loginCollectionTool","depth","_default","int","minimum","maximum","password","login","resetPasswordCollectionTool","token","resetPassword","unlockCollectionTool","access","args","Boolean","permissions","collections","unlock","verifyCollectionTool","verifyEmail"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare const countDocumentsTool: import("../../../types.js").CollectionTool;
2
+ //# sourceMappingURL=countTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"countTool.d.ts","sourceRoot":"","sources":["../../../../src/mcp/builtin/collections/countTool.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,kBAAkB,4CAmD7B,CAAA"}
@@ -0,0 +1,63 @@
1
+ import { countDocumentsInputSchema } from 'payload';
2
+ import { defaultAccess } from '../../../defaultAccess.js';
3
+ import { defineCollectionTool } from '../../../defineTool.js';
4
+ import { getLogger } from '../../../utils/getLogger.js';
5
+ const DEFAULT_DESCRIPTION = 'Count documents in any collection by passing the collection slug and optional where clause.';
6
+ export const countDocumentsTool = defineCollectionTool({
7
+ access: (args)=>defaultAccess(args) && Boolean(args.permissions?.collections?.[args.slug]?.read),
8
+ annotations: {
9
+ destructiveHint: false,
10
+ idempotentHint: true,
11
+ openWorldHint: false,
12
+ readOnlyHint: true,
13
+ title: 'Count Documents'
14
+ },
15
+ description: DEFAULT_DESCRIPTION,
16
+ input: countDocumentsInputSchema
17
+ }).handler(async ({ slug, authorizedMCP, input, req })=>{
18
+ const payload = req.payload;
19
+ const logger = getLogger({
20
+ payload
21
+ });
22
+ const { locale, trash, where } = input;
23
+ logger.info(`Counting documents in collection: ${slug}`);
24
+ try {
25
+ const result = await payload.count({
26
+ collection: slug,
27
+ overrideAccess: authorizedMCP.overrideAccess,
28
+ req,
29
+ ...locale ? {
30
+ locale
31
+ } : {},
32
+ ...trash !== undefined ? {
33
+ trash
34
+ } : {},
35
+ ...where ? {
36
+ where
37
+ } : {}
38
+ });
39
+ return {
40
+ content: [
41
+ {
42
+ type: 'text',
43
+ text: `Collection "${slug}" contains ${result.totalDocs} matching documents.\n\`\`\`json\n${JSON.stringify(result)}\n\`\`\``
44
+ }
45
+ ],
46
+ doc: result
47
+ };
48
+ } catch (error) {
49
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
50
+ logger.error(`Error counting documents in ${slug}: ${errorMessage}`);
51
+ return {
52
+ content: [
53
+ {
54
+ type: 'text',
55
+ text: `❌ **Error counting documents in collection "${slug}":** ${errorMessage}`
56
+ }
57
+ ],
58
+ isError: true
59
+ };
60
+ }
61
+ });
62
+
63
+ //# sourceMappingURL=countTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/mcp/builtin/collections/countTool.ts"],"sourcesContent":["import { countDocumentsInputSchema } from 'payload'\n\nimport { defaultAccess } from '../../../defaultAccess.js'\nimport { defineCollectionTool } from '../../../defineTool.js'\nimport { getLogger } from '../../../utils/getLogger.js'\n\nconst DEFAULT_DESCRIPTION =\n 'Count documents in any collection by passing the collection slug and optional where clause.'\n\nexport const countDocumentsTool = defineCollectionTool({\n access: (args) =>\n defaultAccess(args) && Boolean(args.permissions?.collections?.[args.slug]?.read),\n annotations: {\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n readOnlyHint: true,\n title: 'Count Documents',\n },\n description: DEFAULT_DESCRIPTION,\n input: countDocumentsInputSchema,\n}).handler(async ({ slug, authorizedMCP, input, req }) => {\n const payload = req.payload\n const logger = getLogger({ payload })\n const { locale, trash, where } = input\n\n logger.info(`Counting documents in collection: ${slug}`)\n\n try {\n const result = await payload.count({\n collection: slug,\n overrideAccess: authorizedMCP.overrideAccess,\n req,\n ...(locale ? { locale } : {}),\n ...(trash !== undefined ? { trash } : {}),\n ...(where ? { where } : {}),\n })\n\n return {\n content: [\n {\n type: 'text',\n text: `Collection \"${slug}\" contains ${result.totalDocs} matching documents.\\n\\`\\`\\`json\\n${JSON.stringify(result)}\\n\\`\\`\\``,\n },\n ],\n doc: result,\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n logger.error(`Error counting documents in ${slug}: ${errorMessage}`)\n return {\n content: [\n {\n type: 'text',\n text: `❌ **Error counting documents in collection \"${slug}\":** ${errorMessage}`,\n },\n ],\n isError: true,\n }\n }\n})\n"],"names":["countDocumentsInputSchema","defaultAccess","defineCollectionTool","getLogger","DEFAULT_DESCRIPTION","countDocumentsTool","access","args","Boolean","permissions","collections","slug","read","annotations","destructiveHint","idempotentHint","openWorldHint","readOnlyHint","title","description","input","handler","authorizedMCP","req","payload","logger","locale","trash","where","info","result","count","collection","overrideAccess","undefined","content","type","text","totalDocs","JSON","stringify","doc","error","errorMessage","Error","message","isError"],"mappings":"AAAA,SAASA,yBAAyB,QAAQ,UAAS;AAEnD,SAASC,aAAa,QAAQ,4BAA2B;AACzD,SAASC,oBAAoB,QAAQ,yBAAwB;AAC7D,SAASC,SAAS,QAAQ,8BAA6B;AAEvD,MAAMC,sBACJ;AAEF,OAAO,MAAMC,qBAAqBH,qBAAqB;IACrDI,QAAQ,CAACC,OACPN,cAAcM,SAASC,QAAQD,KAAKE,WAAW,EAAEC,aAAa,CAACH,KAAKI,IAAI,CAAC,EAAEC;IAC7EC,aAAa;QACXC,iBAAiB;QACjBC,gBAAgB;QAChBC,eAAe;QACfC,cAAc;QACdC,OAAO;IACT;IACAC,aAAaf;IACbgB,OAAOpB;AACT,GAAGqB,OAAO,CAAC,OAAO,EAAEV,IAAI,EAAEW,aAAa,EAAEF,KAAK,EAAEG,GAAG,EAAE;IACnD,MAAMC,UAAUD,IAAIC,OAAO;IAC3B,MAAMC,SAAStB,UAAU;QAAEqB;IAAQ;IACnC,MAAM,EAAEE,MAAM,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGR;IAEjCK,OAAOI,IAAI,CAAC,CAAC,kCAAkC,EAAElB,MAAM;IAEvD,IAAI;QACF,MAAMmB,SAAS,MAAMN,QAAQO,KAAK,CAAC;YACjCC,YAAYrB;YACZsB,gBAAgBX,cAAcW,cAAc;YAC5CV;YACA,GAAIG,SAAS;gBAAEA;YAAO,IAAI,CAAC,CAAC;YAC5B,GAAIC,UAAUO,YAAY;gBAAEP;YAAM,IAAI,CAAC,CAAC;YACxC,GAAIC,QAAQ;gBAAEA;YAAM,IAAI,CAAC,CAAC;QAC5B;QAEA,OAAO;YACLO,SAAS;gBACP;oBACEC,MAAM;oBACNC,MAAM,CAAC,YAAY,EAAE1B,KAAK,WAAW,EAAEmB,OAAOQ,SAAS,CAAC,kCAAkC,EAAEC,KAAKC,SAAS,CAACV,QAAQ,QAAQ,CAAC;gBAC9H;aACD;YACDW,KAAKX;QACP;IACF,EAAE,OAAOY,OAAO;QACd,MAAMC,eAAeD,iBAAiBE,QAAQF,MAAMG,OAAO,GAAG;QAC9DpB,OAAOiB,KAAK,CAAC,CAAC,4BAA4B,EAAE/B,KAAK,EAAE,EAAEgC,cAAc;QACnE,OAAO;YACLR,SAAS;gBACP;oBACEC,MAAM;oBACNC,MAAM,CAAC,4CAA4C,EAAE1B,KAAK,KAAK,EAAEgC,cAAc;gBACjF;aACD;YACDG,SAAS;QACX;IACF;AACF,GAAE"}
@@ -0,0 +1,2 @@
1
+ export declare const countVersionsTool: import("../../../types.js").CollectionTool;
2
+ //# sourceMappingURL=countVersionsTool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"countVersionsTool.d.ts","sourceRoot":"","sources":["../../../../src/mcp/builtin/collections/countVersionsTool.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,iBAAiB,4CAkD5B,CAAA"}
@@ -0,0 +1,60 @@
1
+ import { countVersionsInputSchema } from 'payload';
2
+ import { defaultAccess } from '../../../defaultAccess.js';
3
+ import { defineCollectionTool } from '../../../defineTool.js';
4
+ import { getLogger } from '../../../utils/getLogger.js';
5
+ const DEFAULT_DESCRIPTION = 'Count document versions in any version-enabled collection by passing the collection slug and optional where clause.';
6
+ export const countVersionsTool = defineCollectionTool({
7
+ access: (args)=>defaultAccess(args) && Boolean(args.permissions?.collections?.[args.slug]?.readVersions),
8
+ annotations: {
9
+ destructiveHint: false,
10
+ idempotentHint: true,
11
+ openWorldHint: false,
12
+ readOnlyHint: true,
13
+ title: 'Count Versions'
14
+ },
15
+ description: DEFAULT_DESCRIPTION,
16
+ input: countVersionsInputSchema
17
+ }).handler(async ({ slug, authorizedMCP, input, req })=>{
18
+ const payload = req.payload;
19
+ const logger = getLogger({
20
+ payload
21
+ });
22
+ const { locale, where } = input;
23
+ logger.info(`Counting versions in collection: ${slug}`);
24
+ try {
25
+ const result = await payload.countVersions({
26
+ collection: slug,
27
+ overrideAccess: authorizedMCP.overrideAccess,
28
+ req,
29
+ ...locale ? {
30
+ locale
31
+ } : {},
32
+ ...where ? {
33
+ where
34
+ } : {}
35
+ });
36
+ return {
37
+ content: [
38
+ {
39
+ type: 'text',
40
+ text: `Collection "${slug}" contains ${result.totalDocs} matching versions.\n\`\`\`json\n${JSON.stringify(result)}\n\`\`\``
41
+ }
42
+ ],
43
+ doc: result
44
+ };
45
+ } catch (error) {
46
+ const errorMessage = error instanceof Error ? error.message : 'Unknown error';
47
+ logger.error(`Error counting versions in ${slug}: ${errorMessage}`);
48
+ return {
49
+ content: [
50
+ {
51
+ type: 'text',
52
+ text: `❌ **Error counting versions in collection "${slug}":** ${errorMessage}`
53
+ }
54
+ ],
55
+ isError: true
56
+ };
57
+ }
58
+ });
59
+
60
+ //# sourceMappingURL=countVersionsTool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/mcp/builtin/collections/countVersionsTool.ts"],"sourcesContent":["import { countVersionsInputSchema } from 'payload'\n\nimport { defaultAccess } from '../../../defaultAccess.js'\nimport { defineCollectionTool } from '../../../defineTool.js'\nimport { getLogger } from '../../../utils/getLogger.js'\n\nconst DEFAULT_DESCRIPTION =\n 'Count document versions in any version-enabled collection by passing the collection slug and optional where clause.'\n\nexport const countVersionsTool = defineCollectionTool({\n access: (args) =>\n defaultAccess(args) && Boolean(args.permissions?.collections?.[args.slug]?.readVersions),\n annotations: {\n destructiveHint: false,\n idempotentHint: true,\n openWorldHint: false,\n readOnlyHint: true,\n title: 'Count Versions',\n },\n description: DEFAULT_DESCRIPTION,\n input: countVersionsInputSchema,\n}).handler(async ({ slug, authorizedMCP, input, req }) => {\n const payload = req.payload\n const logger = getLogger({ payload })\n const { locale, where } = input\n\n logger.info(`Counting versions in collection: ${slug}`)\n\n try {\n const result = await payload.countVersions({\n collection: slug,\n overrideAccess: authorizedMCP.overrideAccess,\n req,\n ...(locale ? { locale } : {}),\n ...(where ? { where } : {}),\n })\n\n return {\n content: [\n {\n type: 'text',\n text: `Collection \"${slug}\" contains ${result.totalDocs} matching versions.\\n\\`\\`\\`json\\n${JSON.stringify(result)}\\n\\`\\`\\``,\n },\n ],\n doc: result,\n }\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : 'Unknown error'\n logger.error(`Error counting versions in ${slug}: ${errorMessage}`)\n return {\n content: [\n {\n type: 'text',\n text: `❌ **Error counting versions in collection \"${slug}\":** ${errorMessage}`,\n },\n ],\n isError: true,\n }\n }\n})\n"],"names":["countVersionsInputSchema","defaultAccess","defineCollectionTool","getLogger","DEFAULT_DESCRIPTION","countVersionsTool","access","args","Boolean","permissions","collections","slug","readVersions","annotations","destructiveHint","idempotentHint","openWorldHint","readOnlyHint","title","description","input","handler","authorizedMCP","req","payload","logger","locale","where","info","result","countVersions","collection","overrideAccess","content","type","text","totalDocs","JSON","stringify","doc","error","errorMessage","Error","message","isError"],"mappings":"AAAA,SAASA,wBAAwB,QAAQ,UAAS;AAElD,SAASC,aAAa,QAAQ,4BAA2B;AACzD,SAASC,oBAAoB,QAAQ,yBAAwB;AAC7D,SAASC,SAAS,QAAQ,8BAA6B;AAEvD,MAAMC,sBACJ;AAEF,OAAO,MAAMC,oBAAoBH,qBAAqB;IACpDI,QAAQ,CAACC,OACPN,cAAcM,SAASC,QAAQD,KAAKE,WAAW,EAAEC,aAAa,CAACH,KAAKI,IAAI,CAAC,EAAEC;IAC7EC,aAAa;QACXC,iBAAiB;QACjBC,gBAAgB;QAChBC,eAAe;QACfC,cAAc;QACdC,OAAO;IACT;IACAC,aAAaf;IACbgB,OAAOpB;AACT,GAAGqB,OAAO,CAAC,OAAO,EAAEV,IAAI,EAAEW,aAAa,EAAEF,KAAK,EAAEG,GAAG,EAAE;IACnD,MAAMC,UAAUD,IAAIC,OAAO;IAC3B,MAAMC,SAAStB,UAAU;QAAEqB;IAAQ;IACnC,MAAM,EAAEE,MAAM,EAAEC,KAAK,EAAE,GAAGP;IAE1BK,OAAOG,IAAI,CAAC,CAAC,iCAAiC,EAAEjB,MAAM;IAEtD,IAAI;QACF,MAAMkB,SAAS,MAAML,QAAQM,aAAa,CAAC;YACzCC,YAAYpB;YACZqB,gBAAgBV,cAAcU,cAAc;YAC5CT;YACA,GAAIG,SAAS;gBAAEA;YAAO,IAAI,CAAC,CAAC;YAC5B,GAAIC,QAAQ;gBAAEA;YAAM,IAAI,CAAC,CAAC;QAC5B;QAEA,OAAO;YACLM,SAAS;gBACP;oBACEC,MAAM;oBACNC,MAAM,CAAC,YAAY,EAAExB,KAAK,WAAW,EAAEkB,OAAOO,SAAS,CAAC,iCAAiC,EAAEC,KAAKC,SAAS,CAACT,QAAQ,QAAQ,CAAC;gBAC7H;aACD;YACDU,KAAKV;QACP;IACF,EAAE,OAAOW,OAAO;QACd,MAAMC,eAAeD,iBAAiBE,QAAQF,MAAMG,OAAO,GAAG;QAC9DlB,OAAOe,KAAK,CAAC,CAAC,2BAA2B,EAAE7B,KAAK,EAAE,EAAE8B,cAAc;QAClE,OAAO;YACLR,SAAS;gBACP;oBACEC,MAAM;oBACNC,MAAM,CAAC,2CAA2C,EAAExB,KAAK,KAAK,EAAE8B,cAAc;gBAChF;aACD;YACDG,SAAS;QACX;IACF;AACF,GAAE"}
@@ -1,2 +1,2 @@
1
- export declare const createCollectionTool: import("../../../types.js").CollectionTool;
1
+ export declare const createDocumentsTool: import("../../../types.js").CollectionTool;
2
2
  //# sourceMappingURL=createTool.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"createTool.d.ts","sourceRoot":"","sources":["../../../../src/mcp/builtin/collections/createTool.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,oBAAoB,4CAmG/B,CAAA"}
1
+ {"version":3,"file":"createTool.d.ts","sourceRoot":"","sources":["../../../../src/mcp/builtin/collections/createTool.ts"],"names":[],"mappings":"AAkBA,eAAO,MAAM,mBAAmB,4CA8H9B,CAAA"}