@payloadcms/plugin-mcp 4.0.0-internal.d927017 → 4.0.0-internal.e387174
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 +6 -8
- package/dist/stdio.d.ts +1 -2
- package/dist/stdio.d.ts.map +1 -1
- package/dist/stdio.js +3 -4
- package/dist/stdio.js.map +1 -1
- package/package.json +4 -17
- package/src/stdio.ts +3 -4
- package/dist/bin/index.d.ts +0 -2
- package/dist/bin/index.d.ts.map +0 -1
- package/dist/bin/index.js +0 -12
- package/dist/bin/index.js.map +0 -1
- package/dist/bin/initializeViteHMR.d.ts +0 -8
- package/dist/bin/initializeViteHMR.d.ts.map +0 -1
- package/dist/bin/initializeViteHMR.js +0 -63
- package/dist/bin/initializeViteHMR.js.map +0 -1
- package/dist/bin/viteConfigBoundary.d.ts +0 -6
- package/dist/bin/viteConfigBoundary.d.ts.map +0 -1
- package/dist/bin/viteConfigBoundary.js +0 -25
- package/dist/bin/viteConfigBoundary.js.map +0 -1
- package/src/bin/index.ts +0 -16
- package/src/bin/initializeViteHMR.ts +0 -60
- package/src/bin/viteConfigBoundary.ts +0 -39
package/bin.js
CHANGED
|
@@ -19,10 +19,12 @@ const filename = fileURLToPath(import.meta.url)
|
|
|
19
19
|
const dirname = path.dirname(filename)
|
|
20
20
|
const baseURL = pathToFileURL(dirname).toString() + '/'
|
|
21
21
|
|
|
22
|
-
const
|
|
22
|
+
const start = async () => {
|
|
23
23
|
if (disableTranspile) {
|
|
24
24
|
process.argv = process.argv.filter((arg) => arg !== '--disable-transpile')
|
|
25
|
-
|
|
25
|
+
const { runMcpStdio } = await import('./dist/stdio.js')
|
|
26
|
+
await runMcpStdio()
|
|
27
|
+
return
|
|
26
28
|
}
|
|
27
29
|
|
|
28
30
|
// tsx 4.22.4's synchronous loader leaks its namespace query onto Node built-ins on Node 23.5+.
|
|
@@ -33,12 +35,8 @@ const loadBin = async () => {
|
|
|
33
35
|
}
|
|
34
36
|
|
|
35
37
|
const { tsImport } = await import('tsx/esm/api')
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
const start = async () => {
|
|
40
|
-
const { bin } = await loadBin()
|
|
41
|
-
await bin()
|
|
38
|
+
const { runMcpStdio } = await tsImport('./dist/stdio.js', baseURL)
|
|
39
|
+
await runMcpStdio()
|
|
42
40
|
}
|
|
43
41
|
|
|
44
42
|
start().catch((err) => {
|
package/dist/stdio.d.ts
CHANGED
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import type { SanitizedConfig } from 'payload';
|
|
2
1
|
/**
|
|
3
2
|
* Starts Payload's MCP server over stdin and stdout.
|
|
4
3
|
*
|
|
5
4
|
* Set `PAYLOAD_MCP_AUTHORIZATION` to authenticate. In development,
|
|
6
5
|
* `PAYLOAD_MCP_OVERRIDE_ACCESS=true` skips access checks.
|
|
7
6
|
*/
|
|
8
|
-
export declare const runMcpStdio: (
|
|
7
|
+
export declare const runMcpStdio: () => Promise<void>;
|
|
9
8
|
//# sourceMappingURL=stdio.d.ts.map
|
package/dist/stdio.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../src/stdio.ts"],"names":[],"mappings":"AAgBA;;;;;GAKG;AACH,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC,IAAI,CA2GhD,CAAA"}
|
package/dist/stdio.js
CHANGED
|
@@ -12,7 +12,7 @@ import { resolveProjectRoot } from './utils/resolveProjectRoot.js';
|
|
|
12
12
|
*
|
|
13
13
|
* Set `PAYLOAD_MCP_AUTHORIZATION` to authenticate. In development,
|
|
14
14
|
* `PAYLOAD_MCP_OVERRIDE_ACCESS=true` skips access checks.
|
|
15
|
-
*/ export const runMcpStdio = async (
|
|
15
|
+
*/ export const runMcpStdio = async ()=>{
|
|
16
16
|
// MCP clients may start this command from another folder. Move to the Payload
|
|
17
17
|
// project so findConfig() can find the config.
|
|
18
18
|
const projectRoot = resolveProjectRoot(fileURLToPath(import.meta.url));
|
|
@@ -20,9 +20,8 @@ import { resolveProjectRoot } from './utils/resolveProjectRoot.js';
|
|
|
20
20
|
process.chdir(projectRoot);
|
|
21
21
|
}
|
|
22
22
|
const configPath = findConfig();
|
|
23
|
-
const
|
|
24
|
-
const
|
|
25
|
-
const config = configOverride ?? await (configModule?.default ?? configModule);
|
|
23
|
+
const configModule = await import(pathToFileURL(configPath).toString());
|
|
24
|
+
const config = await (configModule.default ?? configModule);
|
|
26
25
|
/**
|
|
27
26
|
* stdout is only for MCP messages. The spec says the server must not write
|
|
28
27
|
* logs there and may write them to stderr instead.
|
package/dist/stdio.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stdio.ts"],"sourcesContent":["import type { Config, Plugin, SanitizedConfig } from 'payload'\n\n/* eslint-disable no-console */\nimport { serveStdio } from '@modelcontextprotocol/server/stdio'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport { createLocalReq, getPayload } from 'payload'\nimport { findConfig } from 'payload/node'\n\nimport type { SanitizedMCPPluginConfig } from './types.js'\n\nimport { getAuthorizedMCP } from './endpoint/access.js'\nimport { buildMcpServer } from './mcp/buildMcpServer.js'\nimport { sanitizeMCPConfig } from './mcp/sanitizeMCPConfig.js'\nimport { getPluginConfig } from './utils/getPluginConfig.js'\nimport { resolveProjectRoot } from './utils/resolveProjectRoot.js'\n\n/**\n * Starts Payload's MCP server over stdin and stdout.\n *\n * Set `PAYLOAD_MCP_AUTHORIZATION` to authenticate. In development,\n * `PAYLOAD_MCP_OVERRIDE_ACCESS=true` skips access checks.\n */\nexport const runMcpStdio = async (
|
|
1
|
+
{"version":3,"sources":["../src/stdio.ts"],"sourcesContent":["import type { Config, Plugin, SanitizedConfig } from 'payload'\n\n/* eslint-disable no-console */\nimport { serveStdio } from '@modelcontextprotocol/server/stdio'\nimport { fileURLToPath, pathToFileURL } from 'node:url'\nimport { createLocalReq, getPayload } from 'payload'\nimport { findConfig } from 'payload/node'\n\nimport type { SanitizedMCPPluginConfig } from './types.js'\n\nimport { getAuthorizedMCP } from './endpoint/access.js'\nimport { buildMcpServer } from './mcp/buildMcpServer.js'\nimport { sanitizeMCPConfig } from './mcp/sanitizeMCPConfig.js'\nimport { getPluginConfig } from './utils/getPluginConfig.js'\nimport { resolveProjectRoot } from './utils/resolveProjectRoot.js'\n\n/**\n * Starts Payload's MCP server over stdin and stdout.\n *\n * Set `PAYLOAD_MCP_AUTHORIZATION` to authenticate. In development,\n * `PAYLOAD_MCP_OVERRIDE_ACCESS=true` skips access checks.\n */\nexport const runMcpStdio = async (): Promise<void> => {\n // MCP clients may start this command from another folder. Move to the Payload\n // project so findConfig() can find the config.\n const projectRoot = resolveProjectRoot(fileURLToPath(import.meta.url))\n if (projectRoot) {\n process.chdir(projectRoot)\n }\n\n const configPath = findConfig()\n const configModule = await import(pathToFileURL(configPath).toString())\n const config = (await (configModule.default ?? configModule)) as SanitizedConfig\n\n /**\n * stdout is only for MCP messages. The spec says the server must not write\n * logs there and may write them to stderr instead.\n *\n * The 2.0 client library recovers from stray stdout logs, but that behavior is not\n * guaranteed. Move Payload logs to stderr so Payload does not add invalid data\n * to stdout. Keep options from configurable loggers. Replace pre-built loggers\n * because their output cannot be redirected.\n *\n * @see https://modelcontextprotocol.io/specification/2025-11-25/basic/transports#stdio\n */\n const loggerConfig: { logger?: Config['logger'] } = config\n if (\n loggerConfig.logger &&\n typeof loggerConfig.logger === 'object' &&\n 'options' in loggerConfig.logger\n ) {\n loggerConfig.logger.destination = process.stderr\n } else {\n loggerConfig.logger = { destination: process.stderr, options: {} }\n }\n\n const payload = await getPayload({ config, cron: false, disableOnInit: true })\n\n let pluginConfig: SanitizedMCPPluginConfig\n try {\n pluginConfig = getPluginConfig({ config: payload.config })\n } catch {\n // The command also works when mcpPlugin() is not in the Payload config.\n pluginConfig = sanitizeMCPConfig({ config: payload.config, pluginConfig: {} })\n\n const fallbackPlugin: Plugin = (config) => config\n Object.assign(fallbackPlugin, {\n slug: '@payloadcms/plugin-mcp',\n sanitizedOptions: pluginConfig,\n })\n payload.config.plugins ??= []\n payload.config.plugins.push(fallbackPlugin)\n }\n\n const overrideAccessEnv = process.env.PAYLOAD_MCP_OVERRIDE_ACCESS\n let overrideAccess = false\n\n if (overrideAccessEnv === 'true') {\n overrideAccess = true\n } else if (overrideAccessEnv && overrideAccessEnv !== 'false') {\n throw new Error('PAYLOAD_MCP_OVERRIDE_ACCESS must be \"true\" or \"false\".')\n }\n\n if (overrideAccess && process.env.NODE_ENV !== 'development') {\n throw new Error('PAYLOAD_MCP_OVERRIDE_ACCESS is only available in development.')\n }\n\n const headers = new Headers()\n if (process.env.PAYLOAD_MCP_AUTHORIZATION) {\n headers.set('Authorization', process.env.PAYLOAD_MCP_AUTHORIZATION)\n }\n\n const req = await createLocalReq({ req: { headers } }, payload)\n req.payloadAPI = 'MCP' as const\n const authorizedMCP = await getAuthorizedMCP({ overrideAccess, req })\n\n const stdioServer = serveStdio(() => buildMcpServer({ authorizedMCP, pluginConfig, req }), {\n onerror: (err) => {\n // MCP messages use stdout, so write SDK errors to stderr.\n console.error('[payload-mcp] error serving MCP over stdio:', err)\n },\n })\n\n // Close the MCP server and Payload when the client disconnects or the process stops.\n let isShuttingDown = false\n const shutdown = async () => {\n if (isShuttingDown) {\n return\n }\n isShuttingDown = true\n\n try {\n await stdioServer.close()\n } catch (err) {\n console.error('[payload-mcp] error closing server:', err)\n }\n\n try {\n await payload.destroy()\n } catch (err) {\n console.error('[payload-mcp] error destroying payload:', err)\n }\n\n process.exit(0)\n }\n\n process.once('SIGINT', () => void shutdown())\n process.once('SIGTERM', () => void shutdown())\n process.stdin.once('close', () => void shutdown())\n}\n"],"names":["serveStdio","fileURLToPath","pathToFileURL","createLocalReq","getPayload","findConfig","getAuthorizedMCP","buildMcpServer","sanitizeMCPConfig","getPluginConfig","resolveProjectRoot","runMcpStdio","projectRoot","url","process","chdir","configPath","configModule","toString","config","default","loggerConfig","logger","destination","stderr","options","payload","cron","disableOnInit","pluginConfig","fallbackPlugin","Object","assign","slug","sanitizedOptions","plugins","push","overrideAccessEnv","env","PAYLOAD_MCP_OVERRIDE_ACCESS","overrideAccess","Error","NODE_ENV","headers","Headers","PAYLOAD_MCP_AUTHORIZATION","set","req","payloadAPI","authorizedMCP","stdioServer","onerror","err","console","error","isShuttingDown","shutdown","close","destroy","exit","once","stdin"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@payloadcms/plugin-mcp",
|
|
3
|
-
"version": "4.0.0-internal.
|
|
3
|
+
"version": "4.0.0-internal.e387174",
|
|
4
4
|
"description": "MCP (Model Context Protocol) capabilities with Payload",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"plugin",
|
|
@@ -28,11 +28,6 @@
|
|
|
28
28
|
"types": "./dist/index.d.ts",
|
|
29
29
|
"default": "./dist/index.js"
|
|
30
30
|
},
|
|
31
|
-
"./bin": {
|
|
32
|
-
"import": "./dist/bin/index.js",
|
|
33
|
-
"types": "./dist/bin/index.d.ts",
|
|
34
|
-
"default": "./dist/bin/index.js"
|
|
35
|
-
},
|
|
36
31
|
"./client": {
|
|
37
32
|
"import": "./dist/exports/client.js",
|
|
38
33
|
"types": "./dist/exports/client.d.ts",
|
|
@@ -65,23 +60,15 @@
|
|
|
65
60
|
"zod": "^4.2.0"
|
|
66
61
|
},
|
|
67
62
|
"devDependencies": {
|
|
68
|
-
"vite": "~8.1.4",
|
|
69
63
|
"@payloadcms/eslint-config": "3.28.0",
|
|
70
|
-
"payload": "4.0.0-internal.
|
|
64
|
+
"payload": "4.0.0-internal.e387174"
|
|
71
65
|
},
|
|
72
66
|
"peerDependencies": {
|
|
73
|
-
"
|
|
74
|
-
"payload": "4.0.0-internal.d927017"
|
|
75
|
-
},
|
|
76
|
-
"peerDependenciesMeta": {
|
|
77
|
-
"vite": {
|
|
78
|
-
"optional": true
|
|
79
|
-
}
|
|
67
|
+
"payload": "4.0.0-internal.e387174"
|
|
80
68
|
},
|
|
81
69
|
"//deps_notes": {
|
|
82
70
|
"zod": "zod is a hard dependency of @modelcontextprotocol/server, thus we can safely use it without it impacting bundle size. Make extra sure the zod version here matches exactly what's defined in the dependencies of @modelcontextprotocol/server to avoid duplicate versions being installed.",
|
|
83
|
-
"tsx": "Required by the `bin.js` stdio mcp. Keep the version pinned to whatever `payload` ships to avoid duplicate installs."
|
|
84
|
-
"vite": "Vite is an optional peer used by stdio development HMR and duplicated in devDependencies for this package's build and tests. Keep the Vite minor pinned while its server module runner API is experimental."
|
|
71
|
+
"tsx": "Required by the `bin.js` stdio mcp. Keep the version pinned to whatever `payload` ships to avoid duplicate installs."
|
|
85
72
|
},
|
|
86
73
|
"homepage:": "https://payloadcms.com",
|
|
87
74
|
"scripts": {
|
package/src/stdio.ts
CHANGED
|
@@ -20,7 +20,7 @@ import { resolveProjectRoot } from './utils/resolveProjectRoot.js'
|
|
|
20
20
|
* Set `PAYLOAD_MCP_AUTHORIZATION` to authenticate. In development,
|
|
21
21
|
* `PAYLOAD_MCP_OVERRIDE_ACCESS=true` skips access checks.
|
|
22
22
|
*/
|
|
23
|
-
export const runMcpStdio = async (
|
|
23
|
+
export const runMcpStdio = async (): Promise<void> => {
|
|
24
24
|
// MCP clients may start this command from another folder. Move to the Payload
|
|
25
25
|
// project so findConfig() can find the config.
|
|
26
26
|
const projectRoot = resolveProjectRoot(fileURLToPath(import.meta.url))
|
|
@@ -29,9 +29,8 @@ export const runMcpStdio = async (configOverride?: SanitizedConfig): Promise<voi
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
const configPath = findConfig()
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
const config: SanitizedConfig = configOverride ?? (await (configModule?.default ?? configModule))
|
|
32
|
+
const configModule = await import(pathToFileURL(configPath).toString())
|
|
33
|
+
const config = (await (configModule.default ?? configModule)) as SanitizedConfig
|
|
35
34
|
|
|
36
35
|
/**
|
|
37
36
|
* stdout is only for MCP messages. The spec says the server must not write
|
package/dist/bin/index.d.ts
DELETED
package/dist/bin/index.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bin/index.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,GAAG,QAAa,OAAO,CAAC,IAAI,CAaxC,CAAA"}
|
package/dist/bin/index.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { runMcpStdio } from '../stdio.js';
|
|
2
|
-
export const bin = async ()=>{
|
|
3
|
-
let viteHMR;
|
|
4
|
-
if (process.env.NODE_ENV !== 'production' && process.env.NODE_ENV !== 'test' && process.env.DISABLE_PAYLOAD_HMR !== 'true') {
|
|
5
|
-
const { initializeViteHMR } = await import('./initializeViteHMR.js');
|
|
6
|
-
viteHMR = await initializeViteHMR();
|
|
7
|
-
}
|
|
8
|
-
await runMcpStdio(viteHMR?.config);
|
|
9
|
-
await viteHMR?.connect();
|
|
10
|
-
};
|
|
11
|
-
|
|
12
|
-
//# sourceMappingURL=index.js.map
|
package/dist/bin/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/bin/index.ts"],"sourcesContent":["import { runMcpStdio } from '../stdio.js'\n\nexport const bin = async (): Promise<void> => {\n let viteHMR\n if (\n process.env.NODE_ENV !== 'production' &&\n process.env.NODE_ENV !== 'test' &&\n process.env.DISABLE_PAYLOAD_HMR !== 'true'\n ) {\n const { initializeViteHMR } = await import('./initializeViteHMR.js')\n viteHMR = await initializeViteHMR()\n }\n\n await runMcpStdio(viteHMR?.config)\n await viteHMR?.connect()\n}\n"],"names":["runMcpStdio","bin","viteHMR","process","env","NODE_ENV","DISABLE_PAYLOAD_HMR","initializeViteHMR","config","connect"],"mappings":"AAAA,SAASA,WAAW,QAAQ,cAAa;AAEzC,OAAO,MAAMC,MAAM;IACjB,IAAIC;IACJ,IACEC,QAAQC,GAAG,CAACC,QAAQ,KAAK,gBACzBF,QAAQC,GAAG,CAACC,QAAQ,KAAK,UACzBF,QAAQC,GAAG,CAACE,mBAAmB,KAAK,QACpC;QACA,MAAM,EAAEC,iBAAiB,EAAE,GAAG,MAAM,MAAM,CAAC;QAC3CL,UAAU,MAAMK;IAClB;IAEA,MAAMP,YAAYE,SAASM;IAC3B,MAAMN,SAASO;AACjB,EAAC"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"initializeViteHMR.d.ts","sourceRoot":"","sources":["../../src/bin/initializeViteHMR.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAY9C,KAAK,OAAO,GAAG;IACb,MAAM,EAAE,eAAe,CAAA;IACvB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7B,CAAA;AAED,eAAO,MAAM,iBAAiB,QAAa,OAAO,CAAC,OAAO,CA0CzD,CAAA"}
|
|
@@ -1,63 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-console */ import { fileURLToPath } from 'node:url';
|
|
2
|
-
import { getPayload, reload } from 'payload';
|
|
3
|
-
import { findConfig } from 'payload/node';
|
|
4
|
-
import { createServer, createServerModuleRunner, normalizePath } from 'vite';
|
|
5
|
-
import { resolveProjectRoot } from '../utils/resolveProjectRoot.js';
|
|
6
|
-
export const initializeViteHMR = async ()=>{
|
|
7
|
-
const projectRoot = resolveProjectRoot(fileURLToPath(import.meta.url));
|
|
8
|
-
if (projectRoot) {
|
|
9
|
-
process.chdir(projectRoot);
|
|
10
|
-
}
|
|
11
|
-
const vite = await createServer({
|
|
12
|
-
clearScreen: false,
|
|
13
|
-
configFile: false,
|
|
14
|
-
envDir: false,
|
|
15
|
-
logLevel: 'error',
|
|
16
|
-
optimizeDeps: {
|
|
17
|
-
noDiscovery: true
|
|
18
|
-
},
|
|
19
|
-
publicDir: false,
|
|
20
|
-
resolve: {
|
|
21
|
-
alias: {
|
|
22
|
-
'payload-mcp:config': normalizePath(findConfig())
|
|
23
|
-
},
|
|
24
|
-
tsconfigPaths: true
|
|
25
|
-
},
|
|
26
|
-
server: {
|
|
27
|
-
middlewareMode: true,
|
|
28
|
-
ws: false
|
|
29
|
-
},
|
|
30
|
-
ssr: {
|
|
31
|
-
noExternal: [
|
|
32
|
-
/^@payloadcms\//,
|
|
33
|
-
/^payload$/
|
|
34
|
-
]
|
|
35
|
-
}
|
|
36
|
-
});
|
|
37
|
-
const runner = createServerModuleRunner(vite.environments.ssr);
|
|
38
|
-
const boundaryPath = fileURLToPath(new URL('./viteConfigBoundary.js', import.meta.url));
|
|
39
|
-
const boundary = await runner.import(boundaryPath);
|
|
40
|
-
const config = boundary.getConfig();
|
|
41
|
-
return {
|
|
42
|
-
config,
|
|
43
|
-
connect: async ()=>{
|
|
44
|
-
const payload = await getPayload({
|
|
45
|
-
config,
|
|
46
|
-
cron: false,
|
|
47
|
-
disableOnInit: true
|
|
48
|
-
});
|
|
49
|
-
let payloadReloadQueue = Promise.resolve();
|
|
50
|
-
const reloadPayload = (nextConfig)=>{
|
|
51
|
-
payloadReloadQueue = payloadReloadQueue.then(()=>reload(nextConfig, payload, false)).catch((error)=>console.error('[payload-mcp] config reload failed:', error));
|
|
52
|
-
return payloadReloadQueue;
|
|
53
|
-
};
|
|
54
|
-
boundary.subscribe(reloadPayload);
|
|
55
|
-
const latestConfig = boundary.getConfig();
|
|
56
|
-
if (config !== latestConfig) {
|
|
57
|
-
await reloadPayload(latestConfig);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
//# sourceMappingURL=initializeViteHMR.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/bin/initializeViteHMR.ts"],"sourcesContent":["import type { SanitizedConfig } from 'payload'\n\n/* eslint-disable no-console */\nimport { fileURLToPath } from 'node:url'\nimport { getPayload, reload } from 'payload'\nimport { findConfig } from 'payload/node'\nimport { createServer, createServerModuleRunner, normalizePath } from 'vite'\n\nimport type * as ConfigBoundary from './viteConfigBoundary.js'\n\nimport { resolveProjectRoot } from '../utils/resolveProjectRoot.js'\n\ntype ViteHMR = {\n config: SanitizedConfig\n connect: () => Promise<void>\n}\n\nexport const initializeViteHMR = async (): Promise<ViteHMR> => {\n const projectRoot = resolveProjectRoot(fileURLToPath(import.meta.url))\n if (projectRoot) {\n process.chdir(projectRoot)\n }\n\n const vite = await createServer({\n clearScreen: false,\n configFile: false,\n envDir: false,\n logLevel: 'error',\n optimizeDeps: { noDiscovery: true },\n publicDir: false,\n resolve: { alias: { 'payload-mcp:config': normalizePath(findConfig()) }, tsconfigPaths: true },\n server: { middlewareMode: true, ws: false },\n ssr: { noExternal: [/^@payloadcms\\//, /^payload$/] },\n })\n const runner = createServerModuleRunner(vite.environments.ssr)\n const boundaryPath = fileURLToPath(new URL('./viteConfigBoundary.js', import.meta.url))\n const boundary = await runner.import<typeof ConfigBoundary>(boundaryPath)\n const config = boundary.getConfig()\n\n return {\n config,\n connect: async () => {\n const payload = await getPayload({ config, cron: false, disableOnInit: true })\n let payloadReloadQueue = Promise.resolve()\n const reloadPayload = (nextConfig: SanitizedConfig): Promise<void> => {\n payloadReloadQueue = payloadReloadQueue\n .then(() => reload(nextConfig, payload, false))\n .catch((error) => console.error('[payload-mcp] config reload failed:', error))\n return payloadReloadQueue\n }\n\n boundary.subscribe(reloadPayload)\n\n const latestConfig = boundary.getConfig()\n if (config !== latestConfig) {\n await reloadPayload(latestConfig)\n }\n },\n }\n}\n"],"names":["fileURLToPath","getPayload","reload","findConfig","createServer","createServerModuleRunner","normalizePath","resolveProjectRoot","initializeViteHMR","projectRoot","url","process","chdir","vite","clearScreen","configFile","envDir","logLevel","optimizeDeps","noDiscovery","publicDir","resolve","alias","tsconfigPaths","server","middlewareMode","ws","ssr","noExternal","runner","environments","boundaryPath","URL","boundary","import","config","getConfig","connect","payload","cron","disableOnInit","payloadReloadQueue","Promise","reloadPayload","nextConfig","then","catch","error","console","subscribe","latestConfig"],"mappings":"AAEA,6BAA6B,GAC7B,SAASA,aAAa,QAAQ,WAAU;AACxC,SAASC,UAAU,EAAEC,MAAM,QAAQ,UAAS;AAC5C,SAASC,UAAU,QAAQ,eAAc;AACzC,SAASC,YAAY,EAAEC,wBAAwB,EAAEC,aAAa,QAAQ,OAAM;AAI5E,SAASC,kBAAkB,QAAQ,iCAAgC;AAOnE,OAAO,MAAMC,oBAAoB;IAC/B,MAAMC,cAAcF,mBAAmBP,cAAc,YAAYU,GAAG;IACpE,IAAID,aAAa;QACfE,QAAQC,KAAK,CAACH;IAChB;IAEA,MAAMI,OAAO,MAAMT,aAAa;QAC9BU,aAAa;QACbC,YAAY;QACZC,QAAQ;QACRC,UAAU;QACVC,cAAc;YAAEC,aAAa;QAAK;QAClCC,WAAW;QACXC,SAAS;YAAEC,OAAO;gBAAE,sBAAsBhB,cAAcH;YAAc;YAAGoB,eAAe;QAAK;QAC7FC,QAAQ;YAAEC,gBAAgB;YAAMC,IAAI;QAAM;QAC1CC,KAAK;YAAEC,YAAY;gBAAC;gBAAkB;aAAY;QAAC;IACrD;IACA,MAAMC,SAASxB,yBAAyBQ,KAAKiB,YAAY,CAACH,GAAG;IAC7D,MAAMI,eAAe/B,cAAc,IAAIgC,IAAI,2BAA2B,YAAYtB,GAAG;IACrF,MAAMuB,WAAW,MAAMJ,OAAOK,MAAM,CAAwBH;IAC5D,MAAMI,SAASF,SAASG,SAAS;IAEjC,OAAO;QACLD;QACAE,SAAS;YACP,MAAMC,UAAU,MAAMrC,WAAW;gBAAEkC;gBAAQI,MAAM;gBAAOC,eAAe;YAAK;YAC5E,IAAIC,qBAAqBC,QAAQrB,OAAO;YACxC,MAAMsB,gBAAgB,CAACC;gBACrBH,qBAAqBA,mBAClBI,IAAI,CAAC,IAAM3C,OAAO0C,YAAYN,SAAS,QACvCQ,KAAK,CAAC,CAACC,QAAUC,QAAQD,KAAK,CAAC,uCAAuCA;gBACzE,OAAON;YACT;YAEAR,SAASgB,SAAS,CAACN;YAEnB,MAAMO,eAAejB,SAASG,SAAS;YACvC,IAAID,WAAWe,cAAc;gBAC3B,MAAMP,cAAcO;YACtB;QACF;IACF;AACF,EAAC"}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
import type { SanitizedConfig } from 'payload';
|
|
2
|
-
type ConfigListener = (config: SanitizedConfig) => Promise<void> | void;
|
|
3
|
-
export declare const getConfig: () => SanitizedConfig;
|
|
4
|
-
export declare const subscribe: (nextListener: ConfigListener) => void;
|
|
5
|
-
export {};
|
|
6
|
-
//# sourceMappingURL=viteConfigBoundary.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"viteConfigBoundary.d.ts","sourceRoot":"","sources":["../../src/bin/viteConfigBoundary.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAA;AAM9C,KAAK,cAAc,GAAG,CAAC,MAAM,EAAE,eAAe,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAA;AAavE,eAAO,MAAM,SAAS,QAAO,eAAyB,CAAA;AAEtD,eAAO,MAAM,SAAS,GAAI,cAAc,cAAc,KAAG,IAExD,CAAA"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
/// <reference types="vite/client" />
|
|
2
|
-
/* eslint-disable no-console */ // @ts-expect-error - The Vite initializer resolves this ID to the Payload config.
|
|
3
|
-
import * as configModule from 'payload-mcp:config';
|
|
4
|
-
let listener;
|
|
5
|
-
let configQueue = Promise.resolve();
|
|
6
|
-
const resolveConfig = async (module)=>{
|
|
7
|
-
const config = module;
|
|
8
|
-
return await (config.default ?? module);
|
|
9
|
-
};
|
|
10
|
-
let config = await resolveConfig(configModule);
|
|
11
|
-
export const getConfig = ()=>config;
|
|
12
|
-
export const subscribe = (nextListener)=>{
|
|
13
|
-
listener = nextListener;
|
|
14
|
-
};
|
|
15
|
-
import.meta.hot?.accept('payload-mcp:config', (nextModule)=>{
|
|
16
|
-
if (!nextModule) {
|
|
17
|
-
return;
|
|
18
|
-
}
|
|
19
|
-
configQueue = configQueue.then(async ()=>{
|
|
20
|
-
config = await resolveConfig(nextModule);
|
|
21
|
-
await listener?.(config);
|
|
22
|
-
}).catch((error)=>console.error('[payload-mcp] config reload failed:', error));
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
//# sourceMappingURL=viteConfigBoundary.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/bin/viteConfigBoundary.ts"],"sourcesContent":["/// <reference types=\"vite/client\" />\n\nimport type { SanitizedConfig } from 'payload'\n\n/* eslint-disable no-console */\n// @ts-expect-error - The Vite initializer resolves this ID to the Payload config.\nimport * as configModule from 'payload-mcp:config'\n\ntype ConfigListener = (config: SanitizedConfig) => Promise<void> | void\n\nlet listener: ConfigListener | undefined\nlet configQueue = Promise.resolve()\n\nconst resolveConfig = async (module: unknown): Promise<SanitizedConfig> => {\n const config = module as { default?: unknown }\n\n return (await (config.default ?? module)) as SanitizedConfig\n}\n\nlet config = await resolveConfig(configModule)\n\nexport const getConfig = (): SanitizedConfig => config\n\nexport const subscribe = (nextListener: ConfigListener): void => {\n listener = nextListener\n}\n\nimport.meta.hot?.accept('payload-mcp:config', (nextModule) => {\n if (!nextModule) {\n return\n }\n\n configQueue = configQueue\n .then(async () => {\n config = await resolveConfig(nextModule)\n await listener?.(config)\n })\n .catch((error) => console.error('[payload-mcp] config reload failed:', error))\n})\n"],"names":["configModule","listener","configQueue","Promise","resolve","resolveConfig","module","config","default","getConfig","subscribe","nextListener","hot","accept","nextModule","then","catch","error","console"],"mappings":"AAAA,qCAAqC;AAIrC,6BAA6B,GAC7B,kFAAkF;AAClF,YAAYA,kBAAkB,qBAAoB;AAIlD,IAAIC;AACJ,IAAIC,cAAcC,QAAQC,OAAO;AAEjC,MAAMC,gBAAgB,OAAOC;IAC3B,MAAMC,SAASD;IAEf,OAAQ,MAAOC,CAAAA,OAAOC,OAAO,IAAIF,MAAK;AACxC;AAEA,IAAIC,SAAS,MAAMF,cAAcL;AAEjC,OAAO,MAAMS,YAAY,IAAuBF,OAAM;AAEtD,OAAO,MAAMG,YAAY,CAACC;IACxBV,WAAWU;AACb,EAAC;AAED,YAAYC,GAAG,EAAEC,OAAO,sBAAsB,CAACC;IAC7C,IAAI,CAACA,YAAY;QACf;IACF;IAEAZ,cAAcA,YACXa,IAAI,CAAC;QACJR,SAAS,MAAMF,cAAcS;QAC7B,MAAMb,WAAWM;IACnB,GACCS,KAAK,CAAC,CAACC,QAAUC,QAAQD,KAAK,CAAC,uCAAuCA;AAC3E"}
|
package/src/bin/index.ts
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { runMcpStdio } from '../stdio.js'
|
|
2
|
-
|
|
3
|
-
export const bin = async (): Promise<void> => {
|
|
4
|
-
let viteHMR
|
|
5
|
-
if (
|
|
6
|
-
process.env.NODE_ENV !== 'production' &&
|
|
7
|
-
process.env.NODE_ENV !== 'test' &&
|
|
8
|
-
process.env.DISABLE_PAYLOAD_HMR !== 'true'
|
|
9
|
-
) {
|
|
10
|
-
const { initializeViteHMR } = await import('./initializeViteHMR.js')
|
|
11
|
-
viteHMR = await initializeViteHMR()
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
await runMcpStdio(viteHMR?.config)
|
|
15
|
-
await viteHMR?.connect()
|
|
16
|
-
}
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import type { SanitizedConfig } from 'payload'
|
|
2
|
-
|
|
3
|
-
/* eslint-disable no-console */
|
|
4
|
-
import { fileURLToPath } from 'node:url'
|
|
5
|
-
import { getPayload, reload } from 'payload'
|
|
6
|
-
import { findConfig } from 'payload/node'
|
|
7
|
-
import { createServer, createServerModuleRunner, normalizePath } from 'vite'
|
|
8
|
-
|
|
9
|
-
import type * as ConfigBoundary from './viteConfigBoundary.js'
|
|
10
|
-
|
|
11
|
-
import { resolveProjectRoot } from '../utils/resolveProjectRoot.js'
|
|
12
|
-
|
|
13
|
-
type ViteHMR = {
|
|
14
|
-
config: SanitizedConfig
|
|
15
|
-
connect: () => Promise<void>
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
export const initializeViteHMR = async (): Promise<ViteHMR> => {
|
|
19
|
-
const projectRoot = resolveProjectRoot(fileURLToPath(import.meta.url))
|
|
20
|
-
if (projectRoot) {
|
|
21
|
-
process.chdir(projectRoot)
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
const vite = await createServer({
|
|
25
|
-
clearScreen: false,
|
|
26
|
-
configFile: false,
|
|
27
|
-
envDir: false,
|
|
28
|
-
logLevel: 'error',
|
|
29
|
-
optimizeDeps: { noDiscovery: true },
|
|
30
|
-
publicDir: false,
|
|
31
|
-
resolve: { alias: { 'payload-mcp:config': normalizePath(findConfig()) }, tsconfigPaths: true },
|
|
32
|
-
server: { middlewareMode: true, ws: false },
|
|
33
|
-
ssr: { noExternal: [/^@payloadcms\//, /^payload$/] },
|
|
34
|
-
})
|
|
35
|
-
const runner = createServerModuleRunner(vite.environments.ssr)
|
|
36
|
-
const boundaryPath = fileURLToPath(new URL('./viteConfigBoundary.js', import.meta.url))
|
|
37
|
-
const boundary = await runner.import<typeof ConfigBoundary>(boundaryPath)
|
|
38
|
-
const config = boundary.getConfig()
|
|
39
|
-
|
|
40
|
-
return {
|
|
41
|
-
config,
|
|
42
|
-
connect: async () => {
|
|
43
|
-
const payload = await getPayload({ config, cron: false, disableOnInit: true })
|
|
44
|
-
let payloadReloadQueue = Promise.resolve()
|
|
45
|
-
const reloadPayload = (nextConfig: SanitizedConfig): Promise<void> => {
|
|
46
|
-
payloadReloadQueue = payloadReloadQueue
|
|
47
|
-
.then(() => reload(nextConfig, payload, false))
|
|
48
|
-
.catch((error) => console.error('[payload-mcp] config reload failed:', error))
|
|
49
|
-
return payloadReloadQueue
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
boundary.subscribe(reloadPayload)
|
|
53
|
-
|
|
54
|
-
const latestConfig = boundary.getConfig()
|
|
55
|
-
if (config !== latestConfig) {
|
|
56
|
-
await reloadPayload(latestConfig)
|
|
57
|
-
}
|
|
58
|
-
},
|
|
59
|
-
}
|
|
60
|
-
}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/// <reference types="vite/client" />
|
|
2
|
-
|
|
3
|
-
import type { SanitizedConfig } from 'payload'
|
|
4
|
-
|
|
5
|
-
/* eslint-disable no-console */
|
|
6
|
-
// @ts-expect-error - The Vite initializer resolves this ID to the Payload config.
|
|
7
|
-
import * as configModule from 'payload-mcp:config'
|
|
8
|
-
|
|
9
|
-
type ConfigListener = (config: SanitizedConfig) => Promise<void> | void
|
|
10
|
-
|
|
11
|
-
let listener: ConfigListener | undefined
|
|
12
|
-
let configQueue = Promise.resolve()
|
|
13
|
-
|
|
14
|
-
const resolveConfig = async (module: unknown): Promise<SanitizedConfig> => {
|
|
15
|
-
const config = module as { default?: unknown }
|
|
16
|
-
|
|
17
|
-
return (await (config.default ?? module)) as SanitizedConfig
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
let config = await resolveConfig(configModule)
|
|
21
|
-
|
|
22
|
-
export const getConfig = (): SanitizedConfig => config
|
|
23
|
-
|
|
24
|
-
export const subscribe = (nextListener: ConfigListener): void => {
|
|
25
|
-
listener = nextListener
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
import.meta.hot?.accept('payload-mcp:config', (nextModule) => {
|
|
29
|
-
if (!nextModule) {
|
|
30
|
-
return
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
configQueue = configQueue
|
|
34
|
-
.then(async () => {
|
|
35
|
-
config = await resolveConfig(nextModule)
|
|
36
|
-
await listener?.(config)
|
|
37
|
-
})
|
|
38
|
-
.catch((error) => console.error('[payload-mcp] config reload failed:', error))
|
|
39
|
-
})
|