@payloadcms/plugin-mcp 4.0.0-internal.5b1e7cd → 4.0.0-internal.a0ef1b8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin.js +39 -0
- package/dist/@types/assets.d.js +2 -0
- package/dist/@types/assets.d.js.map +1 -0
- package/dist/collection/getAccessField.d.ts +12 -0
- package/dist/collection/getAccessField.d.ts.map +1 -0
- package/dist/collection/getAccessField.js +57 -0
- package/dist/collection/getAccessField.js.map +1 -0
- package/dist/collection/index.d.ts +6 -0
- package/dist/collection/index.d.ts.map +1 -0
- package/dist/collection/index.js +60 -0
- package/dist/collection/index.js.map +1 -0
- package/dist/components/AccessField/index.client.d.ts +10 -0
- package/dist/components/AccessField/index.client.d.ts.map +1 -0
- package/dist/components/AccessField/index.client.js +305 -0
- package/dist/components/AccessField/index.client.js.map +1 -0
- package/dist/components/AccessField/index.css +93 -0
- package/dist/defineTool.d.ts +26 -0
- package/dist/defineTool.d.ts.map +1 -0
- package/dist/defineTool.js +37 -0
- package/dist/defineTool.js.map +1 -0
- package/dist/endpoint/access.d.ts +10 -0
- package/dist/endpoint/access.d.ts.map +1 -0
- package/dist/endpoint/access.js +106 -0
- package/dist/endpoint/access.js.map +1 -0
- package/dist/endpoint/index.d.ts +3 -0
- package/dist/endpoint/index.d.ts.map +1 -0
- package/dist/endpoint/index.js +36 -0
- package/dist/endpoint/index.js.map +1 -0
- package/dist/exports/client.d.ts +2 -0
- package/dist/exports/client.d.ts.map +1 -0
- package/dist/exports/client.js +4 -0
- package/dist/exports/client.js.map +1 -0
- package/dist/index.d.ts +4 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +44 -67
- package/dist/index.js.map +1 -1
- package/dist/mcp/buildMcpServer.d.ts +19 -0
- package/dist/mcp/buildMcpServer.d.ts.map +1 -0
- package/dist/mcp/buildMcpServer.js +170 -0
- package/dist/mcp/buildMcpServer.js.map +1 -0
- package/dist/mcp/builtin/collections/authTools.d.ts +7 -0
- package/dist/mcp/builtin/collections/authTools.d.ts.map +1 -0
- package/dist/mcp/builtin/collections/authTools.js +250 -0
- package/dist/mcp/builtin/collections/authTools.js.map +1 -0
- package/dist/mcp/builtin/collections/createTool.d.ts +2 -0
- package/dist/mcp/builtin/collections/createTool.d.ts.map +1 -0
- package/dist/mcp/builtin/collections/createTool.js +91 -0
- package/dist/mcp/builtin/collections/createTool.js.map +1 -0
- package/dist/mcp/builtin/collections/deleteTool.d.ts +2 -0
- package/dist/mcp/builtin/collections/deleteTool.d.ts.map +1 -0
- package/dist/mcp/builtin/collections/deleteTool.js +117 -0
- package/dist/mcp/builtin/collections/deleteTool.js.map +1 -0
- package/dist/mcp/builtin/collections/findTool.d.ts +2 -0
- package/dist/mcp/builtin/collections/findTool.d.ts.map +1 -0
- package/dist/mcp/builtin/collections/findTool.js +159 -0
- package/dist/mcp/builtin/collections/findTool.js.map +1 -0
- package/dist/mcp/builtin/collections/updateTool.d.ts +2 -0
- package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -0
- package/dist/mcp/builtin/collections/updateTool.js +191 -0
- package/dist/mcp/builtin/collections/updateTool.js.map +1 -0
- package/dist/mcp/builtin/globals/findTool.d.ts +2 -0
- package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -0
- package/dist/mcp/builtin/globals/findTool.js +76 -0
- package/dist/mcp/builtin/globals/findTool.js.map +1 -0
- package/dist/mcp/builtin/globals/updateTool.d.ts +2 -0
- package/dist/mcp/builtin/globals/updateTool.d.ts.map +1 -0
- package/dist/mcp/builtin/globals/updateTool.js +96 -0
- package/dist/mcp/builtin/globals/updateTool.js.map +1 -0
- package/dist/mcp/builtinTools.d.ts +37 -0
- package/dist/mcp/builtinTools.d.ts.map +1 -0
- package/dist/mcp/builtinTools.js +64 -0
- package/dist/mcp/builtinTools.js.map +1 -0
- package/dist/mcp/sanitizeMCPConfig.d.ts +17 -0
- package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -0
- package/dist/mcp/sanitizeMCPConfig.js +167 -0
- package/dist/mcp/sanitizeMCPConfig.js.map +1 -0
- package/dist/stdio.d.ts +8 -0
- package/dist/stdio.d.ts.map +1 -0
- package/dist/stdio.js +89 -0
- package/dist/stdio.js.map +1 -0
- package/dist/types.d.ts +262 -455
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +6 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/camelCase.d.ts.map +1 -1
- package/dist/utils/getLogger.d.ts +10 -0
- package/dist/utils/getLogger.d.ts.map +1 -0
- package/dist/utils/getLogger.js +22 -0
- package/dist/utils/getLogger.js.map +1 -0
- package/dist/utils/getPluginConfig.d.ts +12 -0
- package/dist/utils/getPluginConfig.d.ts.map +1 -0
- package/dist/utils/getPluginConfig.js +15 -0
- package/dist/utils/getPluginConfig.js.map +1 -0
- package/dist/utils/localAPIDefaults.d.ts +20 -0
- package/dist/utils/localAPIDefaults.d.ts.map +1 -0
- package/dist/utils/localAPIDefaults.js +19 -0
- package/dist/utils/localAPIDefaults.js.map +1 -0
- package/dist/utils/resolveProjectRoot.d.ts +7 -0
- package/dist/utils/resolveProjectRoot.d.ts.map +1 -0
- package/dist/utils/resolveProjectRoot.js +15 -0
- package/dist/utils/resolveProjectRoot.js.map +1 -0
- package/dist/utils/schemaConversion/buildToolInput.d.ts +29 -0
- package/dist/utils/schemaConversion/buildToolInput.d.ts.map +1 -0
- package/dist/utils/schemaConversion/buildToolInput.js +51 -0
- package/dist/utils/schemaConversion/buildToolInput.js.map +1 -0
- package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts +2 -2
- package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts.map +1 -1
- package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js.map +1 -1
- package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts +15 -0
- package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts.map +1 -0
- package/dist/utils/schemaConversion/sanitizeEntitySchema.js +464 -0
- package/dist/utils/schemaConversion/sanitizeEntitySchema.js.map +1 -0
- package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js +158 -0
- package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js.map +1 -0
- package/dist/utils/toStandardSchema.d.ts +5 -0
- package/dist/utils/toStandardSchema.d.ts.map +1 -0
- package/dist/utils/toStandardSchema.js +4 -0
- package/dist/utils/toStandardSchema.js.map +1 -0
- package/package.json +35 -10
- package/src/@types/assets.d.ts +3 -0
- package/src/collection/getAccessField.ts +64 -0
- package/src/collection/index.ts +64 -0
- package/src/components/AccessField/index.client.tsx +344 -0
- package/src/components/AccessField/index.css +93 -0
- package/src/defineTool.ts +44 -0
- package/src/endpoint/access.ts +132 -0
- package/src/endpoint/index.ts +35 -0
- package/src/exports/client.ts +2 -0
- package/src/index.ts +35 -85
- package/src/mcp/buildMcpServer.ts +229 -0
- package/src/mcp/builtin/collections/authTools.ts +233 -0
- package/src/mcp/builtin/collections/createTool.ts +116 -0
- package/src/mcp/builtin/collections/deleteTool.ts +123 -0
- package/src/mcp/builtin/collections/findTool.ts +187 -0
- package/src/mcp/builtin/collections/updateTool.ts +210 -0
- package/src/mcp/builtin/globals/findTool.ts +96 -0
- package/src/mcp/builtin/globals/updateTool.ts +120 -0
- package/src/mcp/builtinTools.ts +84 -0
- package/src/mcp/sanitizeMCPConfig.ts +239 -0
- package/src/stdio.ts +98 -0
- package/src/types.ts +295 -490
- package/src/utils/getLogger.ts +22 -0
- package/src/utils/getPluginConfig.ts +24 -0
- package/src/utils/localAPIDefaults.ts +22 -0
- package/src/utils/resolveProjectRoot.ts +17 -0
- package/src/utils/schemaConversion/buildToolInput.ts +68 -0
- package/src/utils/schemaConversion/removeVirtualFieldsFromSchema.ts +3 -3
- package/src/utils/schemaConversion/sanitizeEntitySchema.spec.ts +103 -0
- package/src/utils/schemaConversion/sanitizeEntitySchema.ts +529 -0
- package/src/utils/toStandardSchema.ts +9 -0
- package/dist/collections/createApiKeysCollection.d.ts +0 -7
- package/dist/collections/createApiKeysCollection.d.ts.map +0 -1
- package/dist/collections/createApiKeysCollection.js +0 -317
- package/dist/collections/createApiKeysCollection.js.map +0 -1
- package/dist/defaults.d.ts +0 -4
- package/dist/defaults.d.ts.map +0 -1
- package/dist/defaults.js +0 -5
- package/dist/defaults.js.map +0 -1
- package/dist/endpoints/mcp.d.ts +0 -4
- package/dist/endpoints/mcp.d.ts.map +0 -1
- package/dist/endpoints/mcp.js +0 -71
- package/dist/endpoints/mcp.js.map +0 -1
- package/dist/mcp/createRequest.d.ts +0 -3
- package/dist/mcp/createRequest.d.ts.map +0 -1
- package/dist/mcp/createRequest.js +0 -14
- package/dist/mcp/createRequest.js.map +0 -1
- package/dist/mcp/getMcpHandler.d.ts +0 -4
- package/dist/mcp/getMcpHandler.d.ts.map +0 -1
- package/dist/mcp/getMcpHandler.js +0 -231
- package/dist/mcp/getMcpHandler.js.map +0 -1
- package/dist/mcp/helpers/config.d.ts +0 -22
- package/dist/mcp/helpers/config.d.ts.map +0 -1
- package/dist/mcp/helpers/config.js +0 -153
- package/dist/mcp/helpers/config.js.map +0 -1
- package/dist/mcp/helpers/fields.d.ts +0 -19
- package/dist/mcp/helpers/fields.d.ts.map +0 -1
- package/dist/mcp/helpers/fields.js +0 -102
- package/dist/mcp/helpers/fields.js.map +0 -1
- package/dist/mcp/helpers/fileValidation.d.ts +0 -67
- package/dist/mcp/helpers/fileValidation.d.ts.map +0 -1
- package/dist/mcp/helpers/fileValidation.js +0 -267
- package/dist/mcp/helpers/fileValidation.js.map +0 -1
- package/dist/mcp/registerTool.d.ts +0 -6
- package/dist/mcp/registerTool.d.ts.map +0 -1
- package/dist/mcp/registerTool.js +0 -18
- package/dist/mcp/registerTool.js.map +0 -1
- package/dist/mcp/tools/auth/auth.d.ts +0 -4
- package/dist/mcp/tools/auth/auth.d.ts.map +0 -1
- package/dist/mcp/tools/auth/auth.js +0 -57
- package/dist/mcp/tools/auth/auth.js.map +0 -1
- package/dist/mcp/tools/auth/forgotPassword.d.ts +0 -4
- package/dist/mcp/tools/auth/forgotPassword.d.ts.map +0 -1
- package/dist/mcp/tools/auth/forgotPassword.js +0 -48
- package/dist/mcp/tools/auth/forgotPassword.js.map +0 -1
- package/dist/mcp/tools/auth/login.d.ts +0 -4
- package/dist/mcp/tools/auth/login.d.ts.map +0 -1
- package/dist/mcp/tools/auth/login.js +0 -51
- package/dist/mcp/tools/auth/login.js.map +0 -1
- package/dist/mcp/tools/auth/resetPassword.d.ts +0 -4
- package/dist/mcp/tools/auth/resetPassword.d.ts.map +0 -1
- package/dist/mcp/tools/auth/resetPassword.js +0 -49
- package/dist/mcp/tools/auth/resetPassword.js.map +0 -1
- package/dist/mcp/tools/auth/unlock.d.ts +0 -4
- package/dist/mcp/tools/auth/unlock.d.ts.map +0 -1
- package/dist/mcp/tools/auth/unlock.js +0 -48
- package/dist/mcp/tools/auth/unlock.js.map +0 -1
- package/dist/mcp/tools/auth/verify.d.ts +0 -4
- package/dist/mcp/tools/auth/verify.d.ts.map +0 -1
- package/dist/mcp/tools/auth/verify.js +0 -45
- package/dist/mcp/tools/auth/verify.js.map +0 -1
- package/dist/mcp/tools/collection/create.d.ts +0 -10
- package/dist/mcp/tools/collection/create.d.ts.map +0 -1
- package/dist/mcp/tools/collection/create.js +0 -139
- package/dist/mcp/tools/collection/create.js.map +0 -1
- package/dist/mcp/tools/collection/delete.d.ts +0 -10
- package/dist/mcp/tools/collection/delete.d.ts.map +0 -1
- package/dist/mcp/tools/collection/delete.js +0 -154
- package/dist/mcp/tools/collection/delete.js.map +0 -1
- package/dist/mcp/tools/collection/find.d.ts +0 -10
- package/dist/mcp/tools/collection/find.d.ts.map +0 -1
- package/dist/mcp/tools/collection/find.js +0 -165
- package/dist/mcp/tools/collection/find.js.map +0 -1
- package/dist/mcp/tools/collection/update.d.ts +0 -10
- package/dist/mcp/tools/collection/update.d.ts.map +0 -1
- package/dist/mcp/tools/collection/update.js +0 -209
- package/dist/mcp/tools/collection/update.js.map +0 -1
- package/dist/mcp/tools/config/find.d.ts +0 -10
- package/dist/mcp/tools/config/find.d.ts.map +0 -1
- package/dist/mcp/tools/config/find.js +0 -97
- package/dist/mcp/tools/config/find.js.map +0 -1
- package/dist/mcp/tools/config/update.d.ts +0 -10
- package/dist/mcp/tools/config/update.d.ts.map +0 -1
- package/dist/mcp/tools/config/update.js +0 -215
- package/dist/mcp/tools/config/update.js.map +0 -1
- package/dist/mcp/tools/global/find.d.ts +0 -5
- package/dist/mcp/tools/global/find.d.ts.map +0 -1
- package/dist/mcp/tools/global/find.js +0 -82
- package/dist/mcp/tools/global/find.js.map +0 -1
- package/dist/mcp/tools/global/update.d.ts +0 -6
- package/dist/mcp/tools/global/update.d.ts.map +0 -1
- package/dist/mcp/tools/global/update.js +0 -124
- package/dist/mcp/tools/global/update.js.map +0 -1
- package/dist/mcp/tools/job/create.d.ts +0 -10
- package/dist/mcp/tools/job/create.d.ts.map +0 -1
- package/dist/mcp/tools/job/create.js +0 -293
- package/dist/mcp/tools/job/create.js.map +0 -1
- package/dist/mcp/tools/job/run.d.ts +0 -10
- package/dist/mcp/tools/job/run.d.ts.map +0 -1
- package/dist/mcp/tools/job/run.js +0 -129
- package/dist/mcp/tools/job/run.js.map +0 -1
- package/dist/mcp/tools/job/update.d.ts +0 -11
- package/dist/mcp/tools/job/update.d.ts.map +0 -1
- package/dist/mcp/tools/job/update.js +0 -186
- package/dist/mcp/tools/job/update.js.map +0 -1
- package/dist/mcp/tools/resource/create.d.ts +0 -6
- package/dist/mcp/tools/resource/create.d.ts.map +0 -1
- package/dist/mcp/tools/resource/create.js +0 -124
- package/dist/mcp/tools/resource/create.js.map +0 -1
- package/dist/mcp/tools/resource/delete.d.ts +0 -5
- package/dist/mcp/tools/resource/delete.d.ts.map +0 -1
- package/dist/mcp/tools/resource/delete.js +0 -151
- package/dist/mcp/tools/resource/delete.js.map +0 -1
- package/dist/mcp/tools/resource/find.d.ts +0 -5
- package/dist/mcp/tools/resource/find.d.ts.map +0 -1
- package/dist/mcp/tools/resource/find.js +0 -170
- package/dist/mcp/tools/resource/find.js.map +0 -1
- package/dist/mcp/tools/resource/update.d.ts +0 -6
- package/dist/mcp/tools/resource/update.d.ts.map +0 -1
- package/dist/mcp/tools/resource/update.js +0 -256
- package/dist/mcp/tools/resource/update.js.map +0 -1
- package/dist/mcp/tools/schemas.d.ts +0 -457
- package/dist/mcp/tools/schemas.d.ts.map +0 -1
- package/dist/mcp/tools/schemas.js +0 -243
- package/dist/mcp/tools/schemas.js.map +0 -1
- package/dist/utils/adminEntitySettings.d.ts +0 -17
- package/dist/utils/adminEntitySettings.d.ts.map +0 -1
- package/dist/utils/adminEntitySettings.js +0 -41
- package/dist/utils/adminEntitySettings.js.map +0 -1
- package/dist/utils/createApiKeyFields.d.ts +0 -15
- package/dist/utils/createApiKeyFields.d.ts.map +0 -1
- package/dist/utils/createApiKeyFields.js +0 -57
- package/dist/utils/createApiKeyFields.js.map +0 -1
- package/dist/utils/getEnabledSlugs.d.ts +0 -13
- package/dist/utils/getEnabledSlugs.d.ts.map +0 -1
- package/dist/utils/getEnabledSlugs.js +0 -32
- package/dist/utils/getEnabledSlugs.js.map +0 -1
- package/dist/utils/schemaConversion/convertCollectionSchemaToZod.d.ts +0 -3
- package/dist/utils/schemaConversion/convertCollectionSchemaToZod.d.ts.map +0 -1
- package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js +0 -43
- package/dist/utils/schemaConversion/convertCollectionSchemaToZod.js.map +0 -1
- package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts +0 -13
- package/dist/utils/schemaConversion/sanitizeJsonSchema.d.ts.map +0 -1
- package/dist/utils/schemaConversion/sanitizeJsonSchema.js +0 -56
- package/dist/utils/schemaConversion/sanitizeJsonSchema.js.map +0 -1
- package/dist/utils/schemaConversion/simplifyRelationshipFields.d.ts +0 -20
- package/dist/utils/schemaConversion/simplifyRelationshipFields.d.ts.map +0 -1
- package/dist/utils/schemaConversion/simplifyRelationshipFields.js +0 -53
- package/dist/utils/schemaConversion/simplifyRelationshipFields.js.map +0 -1
- package/dist/utils/schemaConversion/transformPointFields.d.ts +0 -3
- package/dist/utils/schemaConversion/transformPointFields.d.ts.map +0 -1
- package/dist/utils/schemaConversion/transformPointFields.js +0 -51
- package/dist/utils/schemaConversion/transformPointFields.js.map +0 -1
- package/src/collections/createApiKeysCollection.ts +0 -373
- package/src/defaults.ts +0 -3
- package/src/endpoints/mcp.ts +0 -91
- package/src/mcp/createRequest.ts +0 -13
- package/src/mcp/getMcpHandler.ts +0 -545
- package/src/mcp/helpers/config.ts +0 -213
- package/src/mcp/helpers/fields.ts +0 -154
- package/src/mcp/helpers/fileValidation.ts +0 -362
- package/src/mcp/registerTool.ts +0 -22
- package/src/mcp/tools/auth/auth.ts +0 -71
- package/src/mcp/tools/auth/forgotPassword.ts +0 -70
- package/src/mcp/tools/auth/login.ts +0 -72
- package/src/mcp/tools/auth/resetPassword.ts +0 -61
- package/src/mcp/tools/auth/unlock.ts +0 -64
- package/src/mcp/tools/auth/verify.ts +0 -57
- package/src/mcp/tools/collection/create.ts +0 -210
- package/src/mcp/tools/collection/delete.ts +0 -211
- package/src/mcp/tools/collection/find.ts +0 -224
- package/src/mcp/tools/collection/update.ts +0 -290
- package/src/mcp/tools/config/find.ts +0 -128
- package/src/mcp/tools/config/update.ts +0 -280
- package/src/mcp/tools/global/find.ts +0 -128
- package/src/mcp/tools/global/update.ts +0 -207
- package/src/mcp/tools/job/create.ts +0 -416
- package/src/mcp/tools/job/run.ts +0 -167
- package/src/mcp/tools/job/update.ts +0 -274
- package/src/mcp/tools/resource/create.ts +0 -211
- package/src/mcp/tools/resource/delete.ts +0 -218
- package/src/mcp/tools/resource/find.ts +0 -246
- package/src/mcp/tools/resource/update.ts +0 -383
- package/src/mcp/tools/schemas.ts +0 -520
- package/src/utils/adminEntitySettings.ts +0 -40
- package/src/utils/createApiKeyFields.ts +0 -72
- package/src/utils/getEnabledSlugs.ts +0 -42
- package/src/utils/schemaConversion/convertCollectionSchemaToZod.ts +0 -52
- package/src/utils/schemaConversion/sanitizeJsonSchema.ts +0 -62
- package/src/utils/schemaConversion/simplifyRelationshipFields.ts +0 -65
- package/src/utils/schemaConversion/transformPointFields.ts +0 -55
package/bin.js
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* stdio MCP server for Payload.
|
|
4
|
+
*
|
|
5
|
+
* Loads the project's `payload.config.{ts,js}` (via `findConfig`), boots Payload,
|
|
6
|
+
* and serves MCP over stdin/stdout. Intended for local-dev MCP clients (Claude
|
|
7
|
+
* Desktop, IDEs) that spawn stdio MCP servers - no running Next.js dev server required.
|
|
8
|
+
*
|
|
9
|
+
* Mirrors `payload/bin.js`: by default, transpiles TS on the fly via `tsx`. Pass
|
|
10
|
+
* `--disable-transpile` if your config is already JS (or you've registered your
|
|
11
|
+
* own loader).
|
|
12
|
+
*/
|
|
13
|
+
import path from 'path'
|
|
14
|
+
import { fileURLToPath, pathToFileURL } from 'url'
|
|
15
|
+
|
|
16
|
+
const disableTranspile = process.argv.includes('--disable-transpile')
|
|
17
|
+
|
|
18
|
+
const filename = fileURLToPath(import.meta.url)
|
|
19
|
+
const dirname = path.dirname(filename)
|
|
20
|
+
const baseURL = pathToFileURL(dirname).toString() + '/'
|
|
21
|
+
|
|
22
|
+
const start = async () => {
|
|
23
|
+
if (disableTranspile) {
|
|
24
|
+
process.argv = process.argv.filter((arg) => arg !== '--disable-transpile')
|
|
25
|
+
const { runMcpStdio } = await import('./dist/stdio.js')
|
|
26
|
+
await runMcpStdio()
|
|
27
|
+
return
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const { tsImport } = await import('tsx/esm/api')
|
|
31
|
+
const { runMcpStdio } = await tsImport('./dist/stdio.js', baseURL)
|
|
32
|
+
await runMcpStdio()
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
start().catch((err) => {
|
|
36
|
+
// eslint-disable-next-line no-console
|
|
37
|
+
console.error('[payload-mcp] error:', err)
|
|
38
|
+
process.exit(1)
|
|
39
|
+
})
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/@types/assets.d.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { JSONField } from 'payload';
|
|
2
|
+
import type { SanitizedMCPPluginConfig } from '../types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Returns the API key collection's `access` field — a JSON field whose value
|
|
5
|
+
* is the `MCPAPIKeysDocAccessTree` the endpoint consults. The actual UI is
|
|
6
|
+
* a custom client component (`AccessField`) which renders a permissions
|
|
7
|
+
* matrix; the field's stored shape is just the runtime access tree.
|
|
8
|
+
*/
|
|
9
|
+
export declare const getAccessField: ({ pluginConfig, }: {
|
|
10
|
+
pluginConfig: SanitizedMCPPluginConfig;
|
|
11
|
+
}) => JSONField;
|
|
12
|
+
//# sourceMappingURL=getAccessField.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getAccessField.d.ts","sourceRoot":"","sources":["../../src/collection/getAccessField.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAA;AAExC,OAAO,KAAK,EAAkC,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAE3F;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,mBAE5B;IACD,YAAY,EAAE,wBAAwB,CAAA;CACvC,KAAG,SAqBH,CAAA"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns the API key collection's `access` field — a JSON field whose value
|
|
3
|
+
* is the `MCPAPIKeysDocAccessTree` the endpoint consults. The actual UI is
|
|
4
|
+
* a custom client component (`AccessField`) which renders a permissions
|
|
5
|
+
* matrix; the field's stored shape is just the runtime access tree.
|
|
6
|
+
*/ export const getAccessField = ({ pluginConfig })=>{
|
|
7
|
+
const clientPluginConfig = sanitizeClientPluginConfig(pluginConfig);
|
|
8
|
+
return {
|
|
9
|
+
name: 'access',
|
|
10
|
+
type: 'json',
|
|
11
|
+
admin: {
|
|
12
|
+
components: {
|
|
13
|
+
Field: {
|
|
14
|
+
clientProps: {
|
|
15
|
+
pluginConfig: clientPluginConfig
|
|
16
|
+
},
|
|
17
|
+
path: '@payloadcms/plugin-mcp/client#AccessField'
|
|
18
|
+
}
|
|
19
|
+
},
|
|
20
|
+
// TODO: needs i18n once design is finalized
|
|
21
|
+
description: 'Access for this API key — uncheck to revoke individual tools.',
|
|
22
|
+
position: 'sidebar'
|
|
23
|
+
},
|
|
24
|
+
defaultValue: {},
|
|
25
|
+
// TODO: needs i18n once design is finalized
|
|
26
|
+
label: 'Access'
|
|
27
|
+
};
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* Strips the non-serializable parts of `SanitizedMCPPluginConfig` (handlers,
|
|
31
|
+
* input/argsSchema functions, etc.) so the result is safe to thread to a
|
|
32
|
+
* client component via `clientProps`.
|
|
33
|
+
*/ const sanitizeClientPluginConfig = (pluginConfig)=>({
|
|
34
|
+
items: pluginConfig.items.map((item)=>({
|
|
35
|
+
...item.type === 'collectionTool' ? {
|
|
36
|
+
collectionSlug: item.collectionSlug
|
|
37
|
+
} : {},
|
|
38
|
+
...item.type === 'globalTool' ? {
|
|
39
|
+
globalSlug: item.globalSlug
|
|
40
|
+
} : {},
|
|
41
|
+
type: item.type,
|
|
42
|
+
description: itemDescription(item),
|
|
43
|
+
key: item.key,
|
|
44
|
+
label: item.label
|
|
45
|
+
}))
|
|
46
|
+
});
|
|
47
|
+
const itemDescription = (item)=>{
|
|
48
|
+
if (item.type === 'prompt') {
|
|
49
|
+
return item.prompt.description;
|
|
50
|
+
}
|
|
51
|
+
if (item.type === 'resource') {
|
|
52
|
+
return item.resource.description;
|
|
53
|
+
}
|
|
54
|
+
return item.tool.description;
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
//# sourceMappingURL=getAccessField.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/collection/getAccessField.ts"],"sourcesContent":["import type { JSONField } from 'payload'\n\nimport type { ClientMCPPluginConfig, MCPItem, SanitizedMCPPluginConfig } from '../types.js'\n\n/**\n * Returns the API key collection's `access` field — a JSON field whose value\n * is the `MCPAPIKeysDocAccessTree` the endpoint consults. The actual UI is\n * a custom client component (`AccessField`) which renders a permissions\n * matrix; the field's stored shape is just the runtime access tree.\n */\nexport const getAccessField = ({\n pluginConfig,\n}: {\n pluginConfig: SanitizedMCPPluginConfig\n}): JSONField => {\n const clientPluginConfig = sanitizeClientPluginConfig(pluginConfig)\n\n return {\n name: 'access',\n type: 'json',\n admin: {\n components: {\n Field: {\n clientProps: { pluginConfig: clientPluginConfig },\n path: '@payloadcms/plugin-mcp/client#AccessField',\n },\n },\n // TODO: needs i18n once design is finalized\n description: 'Access for this API key — uncheck to revoke individual tools.',\n position: 'sidebar',\n },\n defaultValue: {},\n // TODO: needs i18n once design is finalized\n label: 'Access',\n }\n}\n\n/**\n * Strips the non-serializable parts of `SanitizedMCPPluginConfig` (handlers,\n * input/argsSchema functions, etc.) so the result is safe to thread to a\n * client component via `clientProps`.\n */\nconst sanitizeClientPluginConfig = (\n pluginConfig: SanitizedMCPPluginConfig,\n): ClientMCPPluginConfig => ({\n items: pluginConfig.items.map((item) => ({\n ...(item.type === 'collectionTool' ? { collectionSlug: item.collectionSlug } : {}),\n ...(item.type === 'globalTool' ? { globalSlug: item.globalSlug } : {}),\n type: item.type,\n description: itemDescription(item),\n key: item.key,\n label: item.label,\n })),\n})\n\nconst itemDescription = (item: MCPItem): string => {\n if (item.type === 'prompt') {\n return item.prompt.description\n }\n if (item.type === 'resource') {\n return item.resource.description\n }\n return item.tool.description\n}\n"],"names":["getAccessField","pluginConfig","clientPluginConfig","sanitizeClientPluginConfig","name","type","admin","components","Field","clientProps","path","description","position","defaultValue","label","items","map","item","collectionSlug","globalSlug","itemDescription","key","prompt","resource","tool"],"mappings":"AAIA;;;;;CAKC,GACD,OAAO,MAAMA,iBAAiB,CAAC,EAC7BC,YAAY,EAGb;IACC,MAAMC,qBAAqBC,2BAA2BF;IAEtD,OAAO;QACLG,MAAM;QACNC,MAAM;QACNC,OAAO;YACLC,YAAY;gBACVC,OAAO;oBACLC,aAAa;wBAAER,cAAcC;oBAAmB;oBAChDQ,MAAM;gBACR;YACF;YACA,4CAA4C;YAC5CC,aAAa;YACbC,UAAU;QACZ;QACAC,cAAc,CAAC;QACf,4CAA4C;QAC5CC,OAAO;IACT;AACF,EAAC;AAED;;;;CAIC,GACD,MAAMX,6BAA6B,CACjCF,eAC2B,CAAA;QAC3Bc,OAAOd,aAAac,KAAK,CAACC,GAAG,CAAC,CAACC,OAAU,CAAA;gBACvC,GAAIA,KAAKZ,IAAI,KAAK,mBAAmB;oBAAEa,gBAAgBD,KAAKC,cAAc;gBAAC,IAAI,CAAC,CAAC;gBACjF,GAAID,KAAKZ,IAAI,KAAK,eAAe;oBAAEc,YAAYF,KAAKE,UAAU;gBAAC,IAAI,CAAC,CAAC;gBACrEd,MAAMY,KAAKZ,IAAI;gBACfM,aAAaS,gBAAgBH;gBAC7BI,KAAKJ,KAAKI,GAAG;gBACbP,OAAOG,KAAKH,KAAK;YACnB,CAAA;IACF,CAAA;AAEA,MAAMM,kBAAkB,CAACH;IACvB,IAAIA,KAAKZ,IAAI,KAAK,UAAU;QAC1B,OAAOY,KAAKK,MAAM,CAACX,WAAW;IAChC;IACA,IAAIM,KAAKZ,IAAI,KAAK,YAAY;QAC5B,OAAOY,KAAKM,QAAQ,CAACZ,WAAW;IAClC;IACA,OAAOM,KAAKO,IAAI,CAACb,WAAW;AAC9B"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { CollectionConfig } from 'payload';
|
|
2
|
+
import type { SanitizedMCPPluginConfig } from '../types.js';
|
|
3
|
+
export declare const getAPIKeysCollection: ({ pluginConfig, }: {
|
|
4
|
+
pluginConfig: SanitizedMCPPluginConfig;
|
|
5
|
+
}) => CollectionConfig;
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/collection/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AAI3D,eAAO,MAAM,oBAAoB,GAAI,mBAElC;IACD,YAAY,EAAE,wBAAwB,CAAA;CACvC,KAAG,gBAqDH,CAAA"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { getAccessField } from './getAccessField.js';
|
|
2
|
+
export const getAPIKeysCollection = ({ pluginConfig })=>{
|
|
3
|
+
const collection = {
|
|
4
|
+
slug: 'payload-mcp-api-keys',
|
|
5
|
+
admin: {
|
|
6
|
+
description: 'API keys control which collections, resources, tools, and prompts MCP clients can access',
|
|
7
|
+
group: 'MCP',
|
|
8
|
+
useAsTitle: 'label'
|
|
9
|
+
},
|
|
10
|
+
auth: {
|
|
11
|
+
disableLocalStrategy: true,
|
|
12
|
+
useAPIKey: true
|
|
13
|
+
},
|
|
14
|
+
fields: [
|
|
15
|
+
{
|
|
16
|
+
name: 'user',
|
|
17
|
+
type: 'relationship',
|
|
18
|
+
admin: {
|
|
19
|
+
description: 'The user that the API key is associated with.'
|
|
20
|
+
},
|
|
21
|
+
relationTo: pluginConfig.userCollection,
|
|
22
|
+
required: true
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
name: 'label',
|
|
26
|
+
type: 'text',
|
|
27
|
+
admin: {
|
|
28
|
+
description: 'A useful label for the API key.'
|
|
29
|
+
}
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
name: 'description',
|
|
33
|
+
type: 'text',
|
|
34
|
+
admin: {
|
|
35
|
+
description: 'The purpose of the API key.'
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
name: 'overrideAccess',
|
|
40
|
+
type: 'checkbox',
|
|
41
|
+
admin: {
|
|
42
|
+
description: 'When checked, this key bypasses Payload access control on every operation it performs. Leave unchecked unless you have a specific reason.'
|
|
43
|
+
},
|
|
44
|
+
defaultValue: false,
|
|
45
|
+
label: 'Override access control'
|
|
46
|
+
},
|
|
47
|
+
getAccessField({
|
|
48
|
+
pluginConfig
|
|
49
|
+
})
|
|
50
|
+
],
|
|
51
|
+
labels: {
|
|
52
|
+
plural: 'API Keys',
|
|
53
|
+
singular: 'API Key'
|
|
54
|
+
},
|
|
55
|
+
versions: false
|
|
56
|
+
};
|
|
57
|
+
return pluginConfig.overrideApiKeyCollection ? pluginConfig.overrideApiKeyCollection(collection) : collection;
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/collection/index.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\nimport type { SanitizedMCPPluginConfig } from '../types.js'\n\nimport { getAccessField } from './getAccessField.js'\n\nexport const getAPIKeysCollection = ({\n pluginConfig,\n}: {\n pluginConfig: SanitizedMCPPluginConfig\n}): CollectionConfig => {\n const collection: CollectionConfig = {\n slug: 'payload-mcp-api-keys',\n admin: {\n description:\n 'API keys control which collections, resources, tools, and prompts MCP clients can access',\n group: 'MCP',\n useAsTitle: 'label',\n },\n auth: {\n disableLocalStrategy: true,\n useAPIKey: true,\n },\n fields: [\n {\n name: 'user',\n type: 'relationship',\n admin: { description: 'The user that the API key is associated with.' },\n relationTo: pluginConfig.userCollection,\n required: true,\n },\n {\n name: 'label',\n type: 'text',\n admin: { description: 'A useful label for the API key.' },\n },\n {\n name: 'description',\n type: 'text',\n admin: { description: 'The purpose of the API key.' },\n },\n {\n name: 'overrideAccess',\n type: 'checkbox',\n admin: {\n description:\n 'When checked, this key bypasses Payload access control on every operation it performs. Leave unchecked unless you have a specific reason.',\n },\n defaultValue: false,\n label: 'Override access control',\n },\n getAccessField({ pluginConfig }),\n ],\n labels: {\n plural: 'API Keys',\n singular: 'API Key',\n },\n versions: false,\n }\n\n return pluginConfig.overrideApiKeyCollection\n ? pluginConfig.overrideApiKeyCollection(collection)\n : collection\n}\n"],"names":["getAccessField","getAPIKeysCollection","pluginConfig","collection","slug","admin","description","group","useAsTitle","auth","disableLocalStrategy","useAPIKey","fields","name","type","relationTo","userCollection","required","defaultValue","label","labels","plural","singular","versions","overrideApiKeyCollection"],"mappings":"AAIA,SAASA,cAAc,QAAQ,sBAAqB;AAEpD,OAAO,MAAMC,uBAAuB,CAAC,EACnCC,YAAY,EAGb;IACC,MAAMC,aAA+B;QACnCC,MAAM;QACNC,OAAO;YACLC,aACE;YACFC,OAAO;YACPC,YAAY;QACd;QACAC,MAAM;YACJC,sBAAsB;YACtBC,WAAW;QACb;QACAC,QAAQ;YACN;gBACEC,MAAM;gBACNC,MAAM;gBACNT,OAAO;oBAAEC,aAAa;gBAAgD;gBACtES,YAAYb,aAAac,cAAc;gBACvCC,UAAU;YACZ;YACA;gBACEJ,MAAM;gBACNC,MAAM;gBACNT,OAAO;oBAAEC,aAAa;gBAAkC;YAC1D;YACA;gBACEO,MAAM;gBACNC,MAAM;gBACNT,OAAO;oBAAEC,aAAa;gBAA8B;YACtD;YACA;gBACEO,MAAM;gBACNC,MAAM;gBACNT,OAAO;oBACLC,aACE;gBACJ;gBACAY,cAAc;gBACdC,OAAO;YACT;YACAnB,eAAe;gBAAEE;YAAa;SAC/B;QACDkB,QAAQ;YACNC,QAAQ;YACRC,UAAU;QACZ;QACAC,UAAU;IACZ;IAEA,OAAOrB,aAAasB,wBAAwB,GACxCtB,aAAasB,wBAAwB,CAACrB,cACtCA;AACN,EAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { JSONFieldClientProps } from 'payload';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import type { ClientMCPPluginConfig } from '../../types.js';
|
|
4
|
+
import './index.css';
|
|
5
|
+
type Props = {
|
|
6
|
+
pluginConfig: ClientMCPPluginConfig;
|
|
7
|
+
} & JSONFieldClientProps;
|
|
8
|
+
export declare const AccessField: React.FC<Props>;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=index.client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.client.d.ts","sourceRoot":"","sources":["../../../src/components/AccessField/index.client.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAA;AAGnD,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,qBAAqB,EAA2B,MAAM,gBAAgB,CAAA;AAEpF,OAAO,aAAa,CAAA;AAQpB,KAAK,KAAK,GAAG;IACX,YAAY,EAAE,qBAAqB,CAAA;CACpC,GAAG,oBAAoB,CAAA;AAoBxB,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,KAAK,CA0QvC,CAAA"}
|
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { CheckboxInput, Collapsible, useField } from '@payloadcms/ui';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import './index.css';
|
|
6
|
+
const baseClass = 'mcp-access-field';
|
|
7
|
+
/** Drop a key from an object and return a new object — or `undefined` if it'd be empty. */ const without = (obj, key)=>{
|
|
8
|
+
if (!obj || !(key in obj)) {
|
|
9
|
+
return obj;
|
|
10
|
+
}
|
|
11
|
+
const { [key]: _omitted, ...rest } = obj;
|
|
12
|
+
return Object.keys(rest).length === 0 ? undefined : rest;
|
|
13
|
+
};
|
|
14
|
+
const setKey = (obj, key, value)=>({
|
|
15
|
+
...obj ?? {},
|
|
16
|
+
[key]: value
|
|
17
|
+
});
|
|
18
|
+
export const AccessField = ({ path, pluginConfig })=>{
|
|
19
|
+
const { setValue, value } = useField({
|
|
20
|
+
path
|
|
21
|
+
});
|
|
22
|
+
const access = value ?? {};
|
|
23
|
+
// Bucket items for rendering. (Bucketing is cheap and runs once per render;
|
|
24
|
+
// memoizing would mean managing inputs/refs for marginal benefit.)
|
|
25
|
+
const collectionsBySlug = {};
|
|
26
|
+
const globalsBySlug = {};
|
|
27
|
+
const tools = [];
|
|
28
|
+
const prompts = [];
|
|
29
|
+
const resources = [];
|
|
30
|
+
for (const item of pluginConfig.items){
|
|
31
|
+
switch(item.type){
|
|
32
|
+
case 'collectionTool':
|
|
33
|
+
;
|
|
34
|
+
(collectionsBySlug[item.collectionSlug] ??= []).push(item);
|
|
35
|
+
break;
|
|
36
|
+
case 'globalTool':
|
|
37
|
+
;
|
|
38
|
+
(globalsBySlug[item.globalSlug] ??= []).push(item);
|
|
39
|
+
break;
|
|
40
|
+
case 'prompt':
|
|
41
|
+
prompts.push(item);
|
|
42
|
+
break;
|
|
43
|
+
case 'resource':
|
|
44
|
+
resources.push(item);
|
|
45
|
+
break;
|
|
46
|
+
case 'tool':
|
|
47
|
+
tools.push(item);
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
const isScopedAllowed = (scope, slug, key)=>access[scope]?.[slug]?.[key] !== false;
|
|
52
|
+
const isFlatAllowed = (scope, key)=>access[scope]?.[key] !== false;
|
|
53
|
+
const toggleScoped = (scope, slug, key, allow)=>{
|
|
54
|
+
if (allow) {
|
|
55
|
+
const slugBucket = without(access[scope]?.[slug], key);
|
|
56
|
+
const scopeBucket = slugBucket ? setKey(access[scope], slug, slugBucket) : without(access[scope], slug);
|
|
57
|
+
setValue(scopeBucket ? setKey(access, scope, scopeBucket) : without(access, scope) ?? {});
|
|
58
|
+
} else {
|
|
59
|
+
setValue(setKey(access, scope, setKey(access[scope], slug, setKey(access[scope]?.[slug], key, false))));
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const toggleFlat = (scope, key, allow)=>{
|
|
63
|
+
if (allow) {
|
|
64
|
+
const bucket = without(access[scope], key);
|
|
65
|
+
setValue(bucket ? setKey(access, scope, bucket) : without(access, scope) ?? {});
|
|
66
|
+
} else {
|
|
67
|
+
setValue(setKey(access, scope, setKey(access[scope], key, false)));
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
const setAllScoped = (scope, slug, leaves, allow)=>{
|
|
71
|
+
if (allow) {
|
|
72
|
+
const scopeBucket = without(access[scope], slug);
|
|
73
|
+
setValue(scopeBucket ? setKey(access, scope, scopeBucket) : without(access, scope) ?? {});
|
|
74
|
+
} else {
|
|
75
|
+
const slugBucket = leaves.reduce((acc, leaf)=>({
|
|
76
|
+
...acc,
|
|
77
|
+
[leaf.key]: false
|
|
78
|
+
}), {});
|
|
79
|
+
setValue(setKey(access, scope, setKey(access[scope], slug, slugBucket)));
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
const setAllFlat = (scope, leaves, allow)=>{
|
|
83
|
+
if (allow) {
|
|
84
|
+
setValue(without(access, scope) ?? {});
|
|
85
|
+
} else {
|
|
86
|
+
const bucket = leaves.reduce((acc, leaf)=>({
|
|
87
|
+
...acc,
|
|
88
|
+
[leaf.key]: false
|
|
89
|
+
}), {});
|
|
90
|
+
setValue(setKey(access, scope, bucket));
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
const collectionSlugs = Object.keys(collectionsBySlug);
|
|
94
|
+
const globalSlugs = Object.keys(globalsBySlug);
|
|
95
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
96
|
+
className: baseClass,
|
|
97
|
+
children: [
|
|
98
|
+
collectionSlugs.length > 0 && /*#__PURE__*/ _jsxs("section", {
|
|
99
|
+
className: `${baseClass}__section`,
|
|
100
|
+
children: [
|
|
101
|
+
/*#__PURE__*/ _jsxs("header", {
|
|
102
|
+
className: `${baseClass}__section-header`,
|
|
103
|
+
children: [
|
|
104
|
+
/*#__PURE__*/ _jsx("h4", {
|
|
105
|
+
children: "Collection-level permissions"
|
|
106
|
+
}),
|
|
107
|
+
/*#__PURE__*/ _jsx("p", {
|
|
108
|
+
children: "Allow MCP clients to perform the following actions within these collections:"
|
|
109
|
+
})
|
|
110
|
+
]
|
|
111
|
+
}),
|
|
112
|
+
collectionSlugs.map((slug)=>{
|
|
113
|
+
const leaves = collectionsBySlug[slug];
|
|
114
|
+
return /*#__PURE__*/ _jsx(Collapsible, {
|
|
115
|
+
actions: /*#__PURE__*/ _jsx(GroupActions, {
|
|
116
|
+
onSetAll: (allow)=>setAllScoped('collections', slug, leaves, allow)
|
|
117
|
+
}),
|
|
118
|
+
className: `${baseClass}__group`,
|
|
119
|
+
header: /*#__PURE__*/ _jsx("span", {
|
|
120
|
+
className: `${baseClass}__group-label`,
|
|
121
|
+
children: titleCase(slug)
|
|
122
|
+
}),
|
|
123
|
+
initCollapsed: true,
|
|
124
|
+
children: /*#__PURE__*/ _jsx("ul", {
|
|
125
|
+
className: `${baseClass}__list`,
|
|
126
|
+
children: leaves.map((leaf)=>/*#__PURE__*/ _jsx("li", {
|
|
127
|
+
children: /*#__PURE__*/ _jsx(CheckboxInput, {
|
|
128
|
+
checked: isScopedAllowed('collections', slug, leaf.key),
|
|
129
|
+
id: `${path}.collections.${slug}.${leaf.key}`,
|
|
130
|
+
label: leaf.label,
|
|
131
|
+
onToggle: (e)=>toggleScoped('collections', slug, leaf.key, e.target.checked),
|
|
132
|
+
tooltip: leaf.description
|
|
133
|
+
})
|
|
134
|
+
}, leaf.key))
|
|
135
|
+
})
|
|
136
|
+
}, `collection-${slug}`);
|
|
137
|
+
})
|
|
138
|
+
]
|
|
139
|
+
}),
|
|
140
|
+
globalSlugs.length > 0 && /*#__PURE__*/ _jsxs("section", {
|
|
141
|
+
className: `${baseClass}__section`,
|
|
142
|
+
children: [
|
|
143
|
+
/*#__PURE__*/ _jsxs("header", {
|
|
144
|
+
className: `${baseClass}__section-header`,
|
|
145
|
+
children: [
|
|
146
|
+
/*#__PURE__*/ _jsx("h4", {
|
|
147
|
+
children: "Global-level permissions"
|
|
148
|
+
}),
|
|
149
|
+
/*#__PURE__*/ _jsx("p", {
|
|
150
|
+
children: "Allow MCP clients to perform the following actions on these globals:"
|
|
151
|
+
})
|
|
152
|
+
]
|
|
153
|
+
}),
|
|
154
|
+
globalSlugs.map((slug)=>{
|
|
155
|
+
const leaves = globalsBySlug[slug];
|
|
156
|
+
return /*#__PURE__*/ _jsx(Collapsible, {
|
|
157
|
+
actions: /*#__PURE__*/ _jsx(GroupActions, {
|
|
158
|
+
onSetAll: (allow)=>setAllScoped('globals', slug, leaves, allow)
|
|
159
|
+
}),
|
|
160
|
+
className: `${baseClass}__group`,
|
|
161
|
+
header: /*#__PURE__*/ _jsx("span", {
|
|
162
|
+
className: `${baseClass}__group-label`,
|
|
163
|
+
children: titleCase(slug)
|
|
164
|
+
}),
|
|
165
|
+
initCollapsed: true,
|
|
166
|
+
children: /*#__PURE__*/ _jsx("ul", {
|
|
167
|
+
className: `${baseClass}__list`,
|
|
168
|
+
children: leaves.map((leaf)=>/*#__PURE__*/ _jsx("li", {
|
|
169
|
+
children: /*#__PURE__*/ _jsx(CheckboxInput, {
|
|
170
|
+
checked: isScopedAllowed('globals', slug, leaf.key),
|
|
171
|
+
id: `${path}.globals.${slug}.${leaf.key}`,
|
|
172
|
+
label: leaf.label,
|
|
173
|
+
onToggle: (e)=>toggleScoped('globals', slug, leaf.key, e.target.checked),
|
|
174
|
+
tooltip: leaf.description
|
|
175
|
+
})
|
|
176
|
+
}, leaf.key))
|
|
177
|
+
})
|
|
178
|
+
}, `global-${slug}`);
|
|
179
|
+
})
|
|
180
|
+
]
|
|
181
|
+
}),
|
|
182
|
+
(tools.length > 0 || prompts.length > 0 || resources.length > 0) && /*#__PURE__*/ _jsxs("section", {
|
|
183
|
+
className: `${baseClass}__section`,
|
|
184
|
+
children: [
|
|
185
|
+
/*#__PURE__*/ _jsxs("header", {
|
|
186
|
+
className: `${baseClass}__section-header`,
|
|
187
|
+
children: [
|
|
188
|
+
/*#__PURE__*/ _jsx("h4", {
|
|
189
|
+
children: "Project-level permissions"
|
|
190
|
+
}),
|
|
191
|
+
/*#__PURE__*/ _jsx("p", {
|
|
192
|
+
children: "Cross-cutting tools, prompts, and resources not scoped to a single collection."
|
|
193
|
+
})
|
|
194
|
+
]
|
|
195
|
+
}),
|
|
196
|
+
tools.length > 0 && /*#__PURE__*/ _jsx(Collapsible, {
|
|
197
|
+
actions: /*#__PURE__*/ _jsx(GroupActions, {
|
|
198
|
+
onSetAll: (allow)=>setAllFlat('tools', tools, allow)
|
|
199
|
+
}),
|
|
200
|
+
className: `${baseClass}__group`,
|
|
201
|
+
header: /* TODO: needs i18n once design is finalized */ /*#__PURE__*/ _jsx("span", {
|
|
202
|
+
className: `${baseClass}__group-label`,
|
|
203
|
+
children: "Tools"
|
|
204
|
+
}),
|
|
205
|
+
initCollapsed: true,
|
|
206
|
+
children: /*#__PURE__*/ _jsx("ul", {
|
|
207
|
+
className: `${baseClass}__list`,
|
|
208
|
+
children: tools.map((leaf)=>/*#__PURE__*/ _jsx("li", {
|
|
209
|
+
children: /*#__PURE__*/ _jsx(CheckboxInput, {
|
|
210
|
+
checked: isFlatAllowed('tools', leaf.key),
|
|
211
|
+
id: `${path}.tools.${leaf.key}`,
|
|
212
|
+
label: leaf.label,
|
|
213
|
+
onToggle: (e)=>toggleFlat('tools', leaf.key, e.target.checked),
|
|
214
|
+
tooltip: leaf.description
|
|
215
|
+
})
|
|
216
|
+
}, leaf.key))
|
|
217
|
+
})
|
|
218
|
+
}),
|
|
219
|
+
prompts.length > 0 && /*#__PURE__*/ _jsx(Collapsible, {
|
|
220
|
+
actions: /*#__PURE__*/ _jsx(GroupActions, {
|
|
221
|
+
onSetAll: (allow)=>setAllFlat('prompts', prompts, allow)
|
|
222
|
+
}),
|
|
223
|
+
className: `${baseClass}__group`,
|
|
224
|
+
header: /* TODO: needs i18n once design is finalized */ /*#__PURE__*/ _jsx("span", {
|
|
225
|
+
className: `${baseClass}__group-label`,
|
|
226
|
+
children: "Prompts"
|
|
227
|
+
}),
|
|
228
|
+
initCollapsed: true,
|
|
229
|
+
children: /*#__PURE__*/ _jsx("ul", {
|
|
230
|
+
className: `${baseClass}__list`,
|
|
231
|
+
children: prompts.map((leaf)=>/*#__PURE__*/ _jsx("li", {
|
|
232
|
+
children: /*#__PURE__*/ _jsx(CheckboxInput, {
|
|
233
|
+
checked: isFlatAllowed('prompts', leaf.key),
|
|
234
|
+
id: `${path}.prompts.${leaf.key}`,
|
|
235
|
+
label: leaf.label,
|
|
236
|
+
onToggle: (e)=>toggleFlat('prompts', leaf.key, e.target.checked),
|
|
237
|
+
tooltip: leaf.description
|
|
238
|
+
})
|
|
239
|
+
}, leaf.key))
|
|
240
|
+
})
|
|
241
|
+
}),
|
|
242
|
+
resources.length > 0 && /*#__PURE__*/ _jsx(Collapsible, {
|
|
243
|
+
actions: /*#__PURE__*/ _jsx(GroupActions, {
|
|
244
|
+
onSetAll: (allow)=>setAllFlat('resources', resources, allow)
|
|
245
|
+
}),
|
|
246
|
+
className: `${baseClass}__group`,
|
|
247
|
+
header: /* TODO: needs i18n once design is finalized */ /*#__PURE__*/ _jsx("span", {
|
|
248
|
+
className: `${baseClass}__group-label`,
|
|
249
|
+
children: "Resources"
|
|
250
|
+
}),
|
|
251
|
+
initCollapsed: true,
|
|
252
|
+
children: /*#__PURE__*/ _jsx("ul", {
|
|
253
|
+
className: `${baseClass}__list`,
|
|
254
|
+
children: resources.map((leaf)=>/*#__PURE__*/ _jsx("li", {
|
|
255
|
+
children: /*#__PURE__*/ _jsx(CheckboxInput, {
|
|
256
|
+
checked: isFlatAllowed('resources', leaf.key),
|
|
257
|
+
id: `${path}.resources.${leaf.key}`,
|
|
258
|
+
label: leaf.label,
|
|
259
|
+
onToggle: (e)=>toggleFlat('resources', leaf.key, e.target.checked),
|
|
260
|
+
tooltip: leaf.description
|
|
261
|
+
})
|
|
262
|
+
}, leaf.key))
|
|
263
|
+
})
|
|
264
|
+
})
|
|
265
|
+
]
|
|
266
|
+
})
|
|
267
|
+
]
|
|
268
|
+
});
|
|
269
|
+
};
|
|
270
|
+
const GroupActions = ({ onSetAll })=>// TODO: button labels + aria-labels need i18n once design is finalized
|
|
271
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
272
|
+
className: `${baseClass}__group-actions`,
|
|
273
|
+
children: [
|
|
274
|
+
/*#__PURE__*/ _jsx("button", {
|
|
275
|
+
"aria-label": "Select all",
|
|
276
|
+
className: `${baseClass}__action`,
|
|
277
|
+
onClick: (e)=>{
|
|
278
|
+
e.stopPropagation();
|
|
279
|
+
onSetAll(true);
|
|
280
|
+
},
|
|
281
|
+
title: "Select all",
|
|
282
|
+
type: "button",
|
|
283
|
+
children: "all"
|
|
284
|
+
}),
|
|
285
|
+
/*#__PURE__*/ _jsx("span", {
|
|
286
|
+
"aria-hidden": true,
|
|
287
|
+
className: `${baseClass}__action-sep`,
|
|
288
|
+
children: "/"
|
|
289
|
+
}),
|
|
290
|
+
/*#__PURE__*/ _jsx("button", {
|
|
291
|
+
"aria-label": "Clear all",
|
|
292
|
+
className: `${baseClass}__action`,
|
|
293
|
+
onClick: (e)=>{
|
|
294
|
+
e.stopPropagation();
|
|
295
|
+
onSetAll(false);
|
|
296
|
+
},
|
|
297
|
+
title: "Clear all",
|
|
298
|
+
type: "button",
|
|
299
|
+
children: "none"
|
|
300
|
+
})
|
|
301
|
+
]
|
|
302
|
+
});
|
|
303
|
+
const titleCase = (slug)=>slug.replace(/(^|[-_])(.)/g, (_, sep, ch)=>sep ? ` ${ch.toUpperCase()}` : ch.toUpperCase());
|
|
304
|
+
|
|
305
|
+
//# sourceMappingURL=index.client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/AccessField/index.client.tsx"],"sourcesContent":["'use client'\n\nimport type { JSONFieldClientProps } from 'payload'\n\nimport { CheckboxInput, Collapsible, useField } from '@payloadcms/ui'\nimport React from 'react'\n\nimport type { ClientMCPPluginConfig, MCPAPIKeysDocAccessTree } from '../../types.js'\n\nimport './index.css'\n\nconst baseClass = 'mcp-access-field'\n\ntype ClientItem = ClientMCPPluginConfig['items'][number]\ntype ScopeKey = 'collections' | 'globals'\ntype FlatKey = 'prompts' | 'resources' | 'tools'\n\ntype Props = {\n pluginConfig: ClientMCPPluginConfig\n} & JSONFieldClientProps\n\n/** Drop a key from an object and return a new object — or `undefined` if it'd be empty. */\nconst without = <T extends Record<string, unknown>>(\n obj: T | undefined,\n key: string,\n): T | undefined => {\n if (!obj || !(key in obj)) {\n return obj\n }\n const { [key]: _omitted, ...rest } = obj\n return Object.keys(rest).length === 0 ? undefined : (rest as T)\n}\n\nconst setKey = <T extends Record<string, unknown>>(\n obj: T | undefined,\n key: string,\n value: unknown,\n): T => ({ ...(obj ?? {}), [key]: value }) as T\n\nexport const AccessField: React.FC<Props> = ({ path, pluginConfig }) => {\n const { setValue, value } = useField<MCPAPIKeysDocAccessTree>({ path })\n const access = value ?? {}\n\n // Bucket items for rendering. (Bucketing is cheap and runs once per render;\n // memoizing would mean managing inputs/refs for marginal benefit.)\n const collectionsBySlug: Record<string, ClientItem[]> = {}\n const globalsBySlug: Record<string, ClientItem[]> = {}\n const tools: ClientItem[] = []\n const prompts: ClientItem[] = []\n const resources: ClientItem[] = []\n for (const item of pluginConfig.items) {\n switch (item.type) {\n case 'collectionTool':\n ;(collectionsBySlug[item.collectionSlug!] ??= []).push(item)\n break\n case 'globalTool':\n ;(globalsBySlug[item.globalSlug!] ??= []).push(item)\n break\n case 'prompt':\n prompts.push(item)\n break\n case 'resource':\n resources.push(item)\n break\n case 'tool':\n tools.push(item)\n break\n }\n }\n\n const isScopedAllowed = (scope: ScopeKey, slug: string, key: string): boolean =>\n access[scope]?.[slug]?.[key] !== false\n\n const isFlatAllowed = (scope: FlatKey, key: string): boolean => access[scope]?.[key] !== false\n\n const toggleScoped = (scope: ScopeKey, slug: string, key: string, allow: boolean) => {\n if (allow) {\n const slugBucket = without(access[scope]?.[slug], key)\n const scopeBucket = slugBucket\n ? setKey(access[scope], slug, slugBucket)\n : without(access[scope], slug)\n setValue(scopeBucket ? setKey(access, scope, scopeBucket) : (without(access, scope) ?? {}))\n } else {\n setValue(\n setKey(\n access,\n scope,\n setKey(access[scope], slug, setKey(access[scope]?.[slug], key, false)),\n ),\n )\n }\n }\n\n const toggleFlat = (scope: FlatKey, key: string, allow: boolean) => {\n if (allow) {\n const bucket = without(access[scope], key)\n setValue(bucket ? setKey(access, scope, bucket) : (without(access, scope) ?? {}))\n } else {\n setValue(setKey(access, scope, setKey(access[scope], key, false)))\n }\n }\n\n const setAllScoped = (scope: ScopeKey, slug: string, leaves: ClientItem[], allow: boolean) => {\n if (allow) {\n const scopeBucket = without(access[scope], slug)\n setValue(scopeBucket ? setKey(access, scope, scopeBucket) : (without(access, scope) ?? {}))\n } else {\n const slugBucket = leaves.reduce<Record<string, boolean>>(\n (acc, leaf) => ({ ...acc, [leaf.key]: false }),\n {},\n )\n setValue(setKey(access, scope, setKey(access[scope], slug, slugBucket)))\n }\n }\n\n const setAllFlat = (scope: FlatKey, leaves: ClientItem[], allow: boolean) => {\n if (allow) {\n setValue(without(access, scope) ?? {})\n } else {\n const bucket = leaves.reduce<Record<string, boolean>>(\n (acc, leaf) => ({ ...acc, [leaf.key]: false }),\n {},\n )\n setValue(setKey(access, scope, bucket))\n }\n }\n\n const collectionSlugs = Object.keys(collectionsBySlug)\n const globalSlugs = Object.keys(globalsBySlug)\n\n return (\n <div className={baseClass}>\n {collectionSlugs.length > 0 && (\n <section className={`${baseClass}__section`}>\n <header className={`${baseClass}__section-header`}>\n {/* TODO: needs i18n once design is finalized */}\n <h4>Collection-level permissions</h4>\n {/* TODO: needs i18n once design is finalized */}\n <p>Allow MCP clients to perform the following actions within these collections:</p>\n </header>\n {collectionSlugs.map((slug) => {\n const leaves = collectionsBySlug[slug]!\n return (\n <Collapsible\n actions={\n <GroupActions\n onSetAll={(allow) => setAllScoped('collections', slug, leaves, allow)}\n />\n }\n className={`${baseClass}__group`}\n header={<span className={`${baseClass}__group-label`}>{titleCase(slug)}</span>}\n initCollapsed\n key={`collection-${slug}`}\n >\n <ul className={`${baseClass}__list`}>\n {leaves.map((leaf) => (\n <li key={leaf.key}>\n <CheckboxInput\n checked={isScopedAllowed('collections', slug, leaf.key)}\n id={`${path}.collections.${slug}.${leaf.key}`}\n label={leaf.label}\n onToggle={(e) =>\n toggleScoped('collections', slug, leaf.key, e.target.checked)\n }\n tooltip={leaf.description}\n />\n </li>\n ))}\n </ul>\n </Collapsible>\n )\n })}\n </section>\n )}\n\n {globalSlugs.length > 0 && (\n <section className={`${baseClass}__section`}>\n <header className={`${baseClass}__section-header`}>\n {/* TODO: needs i18n once design is finalized */}\n <h4>Global-level permissions</h4>\n {/* TODO: needs i18n once design is finalized */}\n <p>Allow MCP clients to perform the following actions on these globals:</p>\n </header>\n {globalSlugs.map((slug) => {\n const leaves = globalsBySlug[slug]!\n return (\n <Collapsible\n actions={\n <GroupActions\n onSetAll={(allow) => setAllScoped('globals', slug, leaves, allow)}\n />\n }\n className={`${baseClass}__group`}\n header={<span className={`${baseClass}__group-label`}>{titleCase(slug)}</span>}\n initCollapsed\n key={`global-${slug}`}\n >\n <ul className={`${baseClass}__list`}>\n {leaves.map((leaf) => (\n <li key={leaf.key}>\n <CheckboxInput\n checked={isScopedAllowed('globals', slug, leaf.key)}\n id={`${path}.globals.${slug}.${leaf.key}`}\n label={leaf.label}\n onToggle={(e) => toggleScoped('globals', slug, leaf.key, e.target.checked)}\n tooltip={leaf.description}\n />\n </li>\n ))}\n </ul>\n </Collapsible>\n )\n })}\n </section>\n )}\n\n {(tools.length > 0 || prompts.length > 0 || resources.length > 0) && (\n <section className={`${baseClass}__section`}>\n <header className={`${baseClass}__section-header`}>\n {/* TODO: needs i18n once design is finalized */}\n <h4>Project-level permissions</h4>\n {/* TODO: needs i18n once design is finalized */}\n <p>Cross-cutting tools, prompts, and resources not scoped to a single collection.</p>\n </header>\n {tools.length > 0 && (\n <Collapsible\n actions={<GroupActions onSetAll={(allow) => setAllFlat('tools', tools, allow)} />}\n className={`${baseClass}__group`}\n header={\n /* TODO: needs i18n once design is finalized */\n <span className={`${baseClass}__group-label`}>Tools</span>\n }\n initCollapsed\n >\n <ul className={`${baseClass}__list`}>\n {tools.map((leaf) => (\n <li key={leaf.key}>\n <CheckboxInput\n checked={isFlatAllowed('tools', leaf.key)}\n id={`${path}.tools.${leaf.key}`}\n label={leaf.label}\n onToggle={(e) => toggleFlat('tools', leaf.key, e.target.checked)}\n tooltip={leaf.description}\n />\n </li>\n ))}\n </ul>\n </Collapsible>\n )}\n {prompts.length > 0 && (\n <Collapsible\n actions={<GroupActions onSetAll={(allow) => setAllFlat('prompts', prompts, allow)} />}\n className={`${baseClass}__group`}\n header={\n /* TODO: needs i18n once design is finalized */\n <span className={`${baseClass}__group-label`}>Prompts</span>\n }\n initCollapsed\n >\n <ul className={`${baseClass}__list`}>\n {prompts.map((leaf) => (\n <li key={leaf.key}>\n <CheckboxInput\n checked={isFlatAllowed('prompts', leaf.key)}\n id={`${path}.prompts.${leaf.key}`}\n label={leaf.label}\n onToggle={(e) => toggleFlat('prompts', leaf.key, e.target.checked)}\n tooltip={leaf.description}\n />\n </li>\n ))}\n </ul>\n </Collapsible>\n )}\n {resources.length > 0 && (\n <Collapsible\n actions={\n <GroupActions onSetAll={(allow) => setAllFlat('resources', resources, allow)} />\n }\n className={`${baseClass}__group`}\n header={\n /* TODO: needs i18n once design is finalized */\n <span className={`${baseClass}__group-label`}>Resources</span>\n }\n initCollapsed\n >\n <ul className={`${baseClass}__list`}>\n {resources.map((leaf) => (\n <li key={leaf.key}>\n <CheckboxInput\n checked={isFlatAllowed('resources', leaf.key)}\n id={`${path}.resources.${leaf.key}`}\n label={leaf.label}\n onToggle={(e) => toggleFlat('resources', leaf.key, e.target.checked)}\n tooltip={leaf.description}\n />\n </li>\n ))}\n </ul>\n </Collapsible>\n )}\n </section>\n )}\n </div>\n )\n}\n\nconst GroupActions: React.FC<{ onSetAll: (allow: boolean) => void }> = ({ onSetAll }) => (\n // TODO: button labels + aria-labels need i18n once design is finalized\n <div className={`${baseClass}__group-actions`}>\n <button\n aria-label=\"Select all\"\n className={`${baseClass}__action`}\n onClick={(e) => {\n e.stopPropagation()\n onSetAll(true)\n }}\n title=\"Select all\"\n type=\"button\"\n >\n all\n </button>\n <span aria-hidden className={`${baseClass}__action-sep`}>\n /\n </span>\n <button\n aria-label=\"Clear all\"\n className={`${baseClass}__action`}\n onClick={(e) => {\n e.stopPropagation()\n onSetAll(false)\n }}\n title=\"Clear all\"\n type=\"button\"\n >\n none\n </button>\n </div>\n)\n\nconst titleCase = (slug: string): string =>\n slug.replace(/(^|[-_])(.)/g, (_, sep: string, ch: string) =>\n sep ? ` ${ch.toUpperCase()}` : ch.toUpperCase(),\n )\n"],"names":["CheckboxInput","Collapsible","useField","React","baseClass","without","obj","key","_omitted","rest","Object","keys","length","undefined","setKey","value","AccessField","path","pluginConfig","setValue","access","collectionsBySlug","globalsBySlug","tools","prompts","resources","item","items","type","collectionSlug","push","globalSlug","isScopedAllowed","scope","slug","isFlatAllowed","toggleScoped","allow","slugBucket","scopeBucket","toggleFlat","bucket","setAllScoped","leaves","reduce","acc","leaf","setAllFlat","collectionSlugs","globalSlugs","div","className","section","header","h4","p","map","actions","GroupActions","onSetAll","span","titleCase","initCollapsed","ul","li","checked","id","label","onToggle","e","target","tooltip","description","button","aria-label","onClick","stopPropagation","title","aria-hidden","replace","_","sep","ch","toUpperCase"],"mappings":"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"}
|