@payloadcms/plugin-mcp 4.0.0-internal.40de3ec → 4.0.0-internal.41055b1

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 (247) hide show
  1. package/LICENSE.md +1 -1
  2. package/bin.js +15 -6
  3. package/dist/bin/index.d.ts +2 -0
  4. package/dist/bin/index.d.ts.map +1 -0
  5. package/dist/bin/index.js +12 -0
  6. package/dist/bin/index.js.map +1 -0
  7. package/dist/bin/initializeViteHMR.d.ts +8 -0
  8. package/dist/bin/initializeViteHMR.d.ts.map +1 -0
  9. package/dist/bin/initializeViteHMR.js +75 -0
  10. package/dist/bin/initializeViteHMR.js.map +1 -0
  11. package/dist/bin/viteConfigBoundary.d.ts +6 -0
  12. package/dist/bin/viteConfigBoundary.d.ts.map +1 -0
  13. package/dist/bin/viteConfigBoundary.js +25 -0
  14. package/dist/bin/viteConfigBoundary.js.map +1 -0
  15. package/dist/defaultAccess.d.ts +3 -0
  16. package/dist/defaultAccess.d.ts.map +1 -0
  17. package/dist/defaultAccess.js +3 -0
  18. package/dist/defaultAccess.js.map +1 -0
  19. package/dist/endpoint/access.d.ts +12 -5
  20. package/dist/endpoint/access.d.ts.map +1 -1
  21. package/dist/endpoint/access.js +75 -88
  22. package/dist/endpoint/access.js.map +1 -1
  23. package/dist/endpoint/index.d.ts +1 -1
  24. package/dist/endpoint/index.d.ts.map +1 -1
  25. package/dist/endpoint/index.js +68 -17
  26. package/dist/endpoint/index.js.map +1 -1
  27. package/dist/exports/client.d.ts +1 -1
  28. package/dist/exports/client.d.ts.map +1 -1
  29. package/dist/exports/client.js +1 -1
  30. package/dist/exports/client.js.map +1 -1
  31. package/dist/exports/internal.d.ts +2 -0
  32. package/dist/exports/internal.d.ts.map +1 -0
  33. package/dist/exports/internal.js +3 -0
  34. package/dist/exports/internal.js.map +1 -0
  35. package/dist/index.d.ts +2 -2
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +15 -20
  38. package/dist/index.js.map +1 -1
  39. package/dist/mcp/buildMcpServer.d.ts +4 -4
  40. package/dist/mcp/buildMcpServer.d.ts.map +1 -1
  41. package/dist/mcp/buildMcpServer.js +133 -80
  42. package/dist/mcp/buildMcpServer.js.map +1 -1
  43. package/dist/mcp/builtin/collections/authTools.d.ts.map +1 -1
  44. package/dist/mcp/builtin/collections/authTools.js +44 -6
  45. package/dist/mcp/builtin/collections/authTools.js.map +1 -1
  46. package/dist/mcp/builtin/collections/countTool.d.ts +2 -0
  47. package/dist/mcp/builtin/collections/countTool.d.ts.map +1 -0
  48. package/dist/mcp/builtin/collections/countTool.js +68 -0
  49. package/dist/mcp/builtin/collections/countTool.js.map +1 -0
  50. package/dist/mcp/builtin/collections/countVersionsTool.d.ts +2 -0
  51. package/dist/mcp/builtin/collections/countVersionsTool.d.ts.map +1 -0
  52. package/dist/mcp/builtin/collections/countVersionsTool.js +64 -0
  53. package/dist/mcp/builtin/collections/countVersionsTool.js.map +1 -0
  54. package/dist/mcp/builtin/collections/createTool.d.ts +1 -1
  55. package/dist/mcp/builtin/collections/createTool.d.ts.map +1 -1
  56. package/dist/mcp/builtin/collections/createTool.js +39 -44
  57. package/dist/mcp/builtin/collections/createTool.js.map +1 -1
  58. package/dist/mcp/builtin/collections/deleteTool.d.ts +1 -1
  59. package/dist/mcp/builtin/collections/deleteTool.d.ts.map +1 -1
  60. package/dist/mcp/builtin/collections/deleteTool.js +15 -22
  61. package/dist/mcp/builtin/collections/deleteTool.js.map +1 -1
  62. package/dist/mcp/builtin/collections/duplicateTool.d.ts +2 -0
  63. package/dist/mcp/builtin/collections/duplicateTool.d.ts.map +1 -0
  64. package/dist/mcp/builtin/collections/duplicateTool.js +96 -0
  65. package/dist/mcp/builtin/collections/duplicateTool.js.map +1 -0
  66. package/dist/mcp/builtin/collections/findDistinctTool.d.ts +2 -0
  67. package/dist/mcp/builtin/collections/findDistinctTool.d.ts.map +1 -0
  68. package/dist/mcp/builtin/collections/findDistinctTool.js +92 -0
  69. package/dist/mcp/builtin/collections/findDistinctTool.js.map +1 -0
  70. package/dist/mcp/builtin/collections/findTool.d.ts +1 -1
  71. package/dist/mcp/builtin/collections/findTool.d.ts.map +1 -1
  72. package/dist/mcp/builtin/collections/findTool.js +52 -47
  73. package/dist/mcp/builtin/collections/findTool.js.map +1 -1
  74. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts +2 -0
  75. package/dist/mcp/builtin/collections/findVersionByIDTool.d.ts.map +1 -0
  76. package/dist/mcp/builtin/collections/findVersionByIDTool.js +83 -0
  77. package/dist/mcp/builtin/collections/findVersionByIDTool.js.map +1 -0
  78. package/dist/mcp/builtin/collections/findVersionsTool.d.ts +2 -0
  79. package/dist/mcp/builtin/collections/findVersionsTool.d.ts.map +1 -0
  80. package/dist/mcp/builtin/collections/findVersionsTool.js +98 -0
  81. package/dist/mcp/builtin/collections/findVersionsTool.js.map +1 -0
  82. package/dist/mcp/builtin/collections/formatCollectionError.d.ts +9 -0
  83. package/dist/mcp/builtin/collections/formatCollectionError.d.ts.map +1 -0
  84. package/dist/mcp/builtin/collections/formatCollectionError.js +60 -0
  85. package/dist/mcp/builtin/collections/formatCollectionError.js.map +1 -0
  86. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts +2 -0
  87. package/dist/mcp/builtin/collections/getCollectionSchemaTool.d.ts.map +1 -0
  88. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js +65 -0
  89. package/dist/mcp/builtin/collections/getCollectionSchemaTool.js.map +1 -0
  90. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts +2 -0
  91. package/dist/mcp/builtin/collections/restoreVersionTool.d.ts.map +1 -0
  92. package/dist/mcp/builtin/collections/restoreVersionTool.js +81 -0
  93. package/dist/mcp/builtin/collections/restoreVersionTool.js.map +1 -0
  94. package/dist/mcp/builtin/collections/updateTool.d.ts +1 -1
  95. package/dist/mcp/builtin/collections/updateTool.d.ts.map +1 -1
  96. package/dist/mcp/builtin/collections/updateTool.js +96 -89
  97. package/dist/mcp/builtin/collections/updateTool.js.map +1 -1
  98. package/dist/mcp/builtin/getConfigInfoTool.d.ts +2 -0
  99. package/dist/mcp/builtin/getConfigInfoTool.d.ts.map +1 -0
  100. package/dist/mcp/builtin/getConfigInfoTool.js +68 -0
  101. package/dist/mcp/builtin/getConfigInfoTool.js.map +1 -0
  102. package/dist/mcp/builtin/globals/countVersionsTool.d.ts +2 -0
  103. package/dist/mcp/builtin/globals/countVersionsTool.d.ts.map +1 -0
  104. package/dist/mcp/builtin/globals/countVersionsTool.js +64 -0
  105. package/dist/mcp/builtin/globals/countVersionsTool.js.map +1 -0
  106. package/dist/mcp/builtin/globals/findTool.d.ts.map +1 -1
  107. package/dist/mcp/builtin/globals/findTool.js +20 -23
  108. package/dist/mcp/builtin/globals/findTool.js.map +1 -1
  109. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts +2 -0
  110. package/dist/mcp/builtin/globals/findVersionByIDTool.d.ts.map +1 -0
  111. package/dist/mcp/builtin/globals/findVersionByIDTool.js +79 -0
  112. package/dist/mcp/builtin/globals/findVersionByIDTool.js.map +1 -0
  113. package/dist/mcp/builtin/globals/findVersionsTool.d.ts +2 -0
  114. package/dist/mcp/builtin/globals/findVersionsTool.d.ts.map +1 -0
  115. package/dist/mcp/builtin/globals/findVersionsTool.js +94 -0
  116. package/dist/mcp/builtin/globals/findVersionsTool.js.map +1 -0
  117. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts +2 -0
  118. package/dist/mcp/builtin/globals/getGlobalSchemaTool.d.ts.map +1 -0
  119. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js +65 -0
  120. package/dist/mcp/builtin/globals/getGlobalSchemaTool.js.map +1 -0
  121. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts +2 -0
  122. package/dist/mcp/builtin/globals/restoreVersionTool.d.ts.map +1 -0
  123. package/dist/mcp/builtin/globals/restoreVersionTool.js +77 -0
  124. package/dist/mcp/builtin/globals/restoreVersionTool.js.map +1 -0
  125. package/dist/mcp/builtin/globals/updateTool.d.ts.map +1 -1
  126. package/dist/mcp/builtin/globals/updateTool.js +33 -42
  127. package/dist/mcp/builtin/globals/updateTool.js.map +1 -1
  128. package/dist/mcp/builtin/validateEntityData.d.ts +14 -0
  129. package/dist/mcp/builtin/validateEntityData.d.ts.map +1 -0
  130. package/dist/mcp/builtin/validateEntityData.js +82 -0
  131. package/dist/mcp/builtin/validateEntityData.js.map +1 -0
  132. package/dist/mcp/builtinTools.d.ts +144 -19
  133. package/dist/mcp/builtinTools.d.ts.map +1 -1
  134. package/dist/mcp/builtinTools.js +119 -20
  135. package/dist/mcp/builtinTools.js.map +1 -1
  136. package/dist/mcp/sanitizeMCPConfig.d.ts +0 -1
  137. package/dist/mcp/sanitizeMCPConfig.d.ts.map +1 -1
  138. package/dist/mcp/sanitizeMCPConfig.js +121 -58
  139. package/dist/mcp/sanitizeMCPConfig.js.map +1 -1
  140. package/dist/stdio.d.ts +5 -4
  141. package/dist/stdio.d.ts.map +1 -1
  142. package/dist/stdio.js +88 -49
  143. package/dist/stdio.js.map +1 -1
  144. package/dist/types.d.ts +112 -110
  145. package/dist/types.d.ts.map +1 -1
  146. package/dist/types.js +2 -4
  147. package/dist/types.js.map +1 -1
  148. package/dist/utils/getPluginConfig.d.ts +1 -1
  149. package/dist/utils/getPluginConfig.js +1 -1
  150. package/dist/utils/getPluginConfig.js.map +1 -1
  151. package/dist/utils/schemaConversion/filterFieldsByAccess.d.ts +28 -0
  152. package/dist/utils/schemaConversion/filterFieldsByAccess.d.ts.map +1 -0
  153. package/dist/utils/schemaConversion/filterFieldsByAccess.js +71 -0
  154. package/dist/utils/schemaConversion/filterFieldsByAccess.js.map +1 -0
  155. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts +13 -0
  156. package/dist/utils/schemaConversion/getEntityInputSchema.d.ts.map +1 -0
  157. package/dist/utils/schemaConversion/getEntityInputSchema.js +66 -0
  158. package/dist/utils/schemaConversion/getEntityInputSchema.js.map +1 -0
  159. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts +5 -10
  160. package/dist/utils/schemaConversion/sanitizeEntitySchema.d.ts.map +1 -1
  161. package/dist/utils/schemaConversion/sanitizeEntitySchema.js +15 -95
  162. package/dist/utils/schemaConversion/sanitizeEntitySchema.js.map +1 -1
  163. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js +15 -40
  164. package/dist/utils/schemaConversion/sanitizeEntitySchema.spec.js.map +1 -1
  165. package/dist/utils/whereSchema.d.ts +9 -0
  166. package/dist/utils/whereSchema.d.ts.map +1 -0
  167. package/dist/utils/whereSchema.js +13 -0
  168. package/dist/utils/whereSchema.js.map +1 -0
  169. package/package.json +25 -17
  170. package/src/bin/index.ts +16 -0
  171. package/src/bin/initializeViteHMR.ts +76 -0
  172. package/src/bin/viteConfigBoundary.ts +39 -0
  173. package/src/defaultAccess.ts +3 -0
  174. package/src/endpoint/access.ts +81 -101
  175. package/src/endpoint/index.ts +58 -16
  176. package/src/exports/client.ts +2 -1
  177. package/src/exports/internal.ts +1 -0
  178. package/src/index.ts +12 -20
  179. package/src/mcp/buildMcpServer.ts +170 -115
  180. package/src/mcp/builtin/collections/authTools.ts +45 -9
  181. package/src/mcp/builtin/collections/countTool.ts +73 -0
  182. package/src/mcp/builtin/collections/countVersionsTool.ts +69 -0
  183. package/src/mcp/builtin/collections/createTool.ts +62 -61
  184. package/src/mcp/builtin/collections/deleteTool.ts +20 -18
  185. package/src/mcp/builtin/collections/duplicateTool.ts +134 -0
  186. package/src/mcp/builtin/collections/findDistinctTool.ts +119 -0
  187. package/src/mcp/builtin/collections/findTool.ts +66 -37
  188. package/src/mcp/builtin/collections/findVersionByIDTool.ts +109 -0
  189. package/src/mcp/builtin/collections/findVersionsTool.ts +154 -0
  190. package/src/mcp/builtin/collections/formatCollectionError.ts +84 -0
  191. package/src/mcp/builtin/collections/getCollectionSchemaTool.ts +63 -0
  192. package/src/mcp/builtin/collections/restoreVersionTool.ts +107 -0
  193. package/src/mcp/builtin/collections/updateTool.ts +127 -112
  194. package/src/mcp/builtin/getConfigInfoTool.ts +67 -0
  195. package/src/mcp/builtin/globals/countVersionsTool.ts +68 -0
  196. package/src/mcp/builtin/globals/findTool.ts +28 -19
  197. package/src/mcp/builtin/globals/findVersionByIDTool.ts +103 -0
  198. package/src/mcp/builtin/globals/findVersionsTool.ts +147 -0
  199. package/src/mcp/builtin/globals/getGlobalSchemaTool.ts +63 -0
  200. package/src/mcp/builtin/globals/restoreVersionTool.ts +99 -0
  201. package/src/mcp/builtin/globals/updateTool.ts +52 -57
  202. package/src/mcp/builtin/validateEntityData.ts +132 -0
  203. package/src/mcp/builtinTools.ts +111 -41
  204. package/src/mcp/sanitizeMCPConfig.ts +117 -78
  205. package/src/stdio.ts +82 -48
  206. package/src/types.ts +128 -115
  207. package/src/utils/getPluginConfig.ts +1 -1
  208. package/src/utils/schemaConversion/filterFieldsByAccess.ts +123 -0
  209. package/src/utils/schemaConversion/getEntityInputSchema.ts +96 -0
  210. package/src/utils/schemaConversion/sanitizeEntitySchema.spec.ts +12 -19
  211. package/src/utils/schemaConversion/sanitizeEntitySchema.ts +17 -114
  212. package/src/utils/whereSchema.ts +24 -0
  213. package/dist/@types/assets.d.js +0 -2
  214. package/dist/@types/assets.d.js.map +0 -1
  215. package/dist/collection/getAccessField.d.ts +0 -12
  216. package/dist/collection/getAccessField.d.ts.map +0 -1
  217. package/dist/collection/getAccessField.js +0 -57
  218. package/dist/collection/getAccessField.js.map +0 -1
  219. package/dist/collection/index.d.ts +0 -6
  220. package/dist/collection/index.d.ts.map +0 -1
  221. package/dist/collection/index.js +0 -60
  222. package/dist/collection/index.js.map +0 -1
  223. package/dist/components/AccessField/index.client.d.ts +0 -10
  224. package/dist/components/AccessField/index.client.d.ts.map +0 -1
  225. package/dist/components/AccessField/index.client.js +0 -305
  226. package/dist/components/AccessField/index.client.js.map +0 -1
  227. package/dist/components/AccessField/index.css +0 -93
  228. package/dist/utils/localAPIDefaults.d.ts +0 -20
  229. package/dist/utils/localAPIDefaults.d.ts.map +0 -1
  230. package/dist/utils/localAPIDefaults.js +0 -19
  231. package/dist/utils/localAPIDefaults.js.map +0 -1
  232. package/dist/utils/schemaConversion/buildToolInput.d.ts +0 -29
  233. package/dist/utils/schemaConversion/buildToolInput.d.ts.map +0 -1
  234. package/dist/utils/schemaConversion/buildToolInput.js +0 -51
  235. package/dist/utils/schemaConversion/buildToolInput.js.map +0 -1
  236. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts +0 -7
  237. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.d.ts.map +0 -1
  238. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js +0 -20
  239. package/dist/utils/schemaConversion/removeVirtualFieldsFromSchema.js.map +0 -1
  240. package/src/@types/assets.d.ts +0 -3
  241. package/src/collection/getAccessField.ts +0 -64
  242. package/src/collection/index.ts +0 -64
  243. package/src/components/AccessField/index.client.tsx +0 -344
  244. package/src/components/AccessField/index.css +0 -93
  245. package/src/utils/localAPIDefaults.ts +0 -22
  246. package/src/utils/schemaConversion/buildToolInput.ts +0 -68
  247. package/src/utils/schemaConversion/removeVirtualFieldsFromSchema.ts +0 -27
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/endpoint/index.ts"],"sourcesContent":["import { WebStandardStreamableHTTPServerTransport } from '@modelcontextprotocol/server'\nimport { APIError, type PayloadHandler } from 'payload'\n\nimport { buildMcpServer } from '../mcp/buildMcpServer.js'\nimport { getPluginConfig } from '../utils/getPluginConfig.js'\nimport { getAuthorizedMCP } from './access.js'\n\nexport const mcpEndpoint: PayloadHandler = async (req) => {\n if (!req.url) {\n throw new APIError('Missing request URL', 400)\n }\n\n req.payloadAPI = 'MCP' as const\n\n const pluginConfig = getPluginConfig({ config: req.payload.config })\n const authorizedMCP = await getAuthorizedMCP({ req })\n\n const server = buildMcpServer({ authorizedMCP, pluginConfig, req })\n\n const transport = new WebStandardStreamableHTTPServerTransport({\n enableJsonResponse: true,\n sessionIdGenerator: undefined, // stateless mode\n })\n\n await server.connect(transport)\n\n const mcpRequest = new Request(req.url, {\n body: req.body,\n duplex: 'half',\n headers: req.headers,\n method: req.method,\n } as { duplex: 'half' } & RequestInit)\n\n return await transport.handleRequest(mcpRequest)\n}\n"],"names":["WebStandardStreamableHTTPServerTransport","APIError","buildMcpServer","getPluginConfig","getAuthorizedMCP","mcpEndpoint","req","url","payloadAPI","pluginConfig","config","payload","authorizedMCP","server","transport","enableJsonResponse","sessionIdGenerator","undefined","connect","mcpRequest","Request","body","duplex","headers","method","handleRequest"],"mappings":"AAAA,SAASA,wCAAwC,QAAQ,+BAA8B;AACvF,SAASC,QAAQ,QAA6B,UAAS;AAEvD,SAASC,cAAc,QAAQ,2BAA0B;AACzD,SAASC,eAAe,QAAQ,8BAA6B;AAC7D,SAASC,gBAAgB,QAAQ,cAAa;AAE9C,OAAO,MAAMC,cAA8B,OAAOC;IAChD,IAAI,CAACA,IAAIC,GAAG,EAAE;QACZ,MAAM,IAAIN,SAAS,uBAAuB;IAC5C;IAEAK,IAAIE,UAAU,GAAG;IAEjB,MAAMC,eAAeN,gBAAgB;QAAEO,QAAQJ,IAAIK,OAAO,CAACD,MAAM;IAAC;IAClE,MAAME,gBAAgB,MAAMR,iBAAiB;QAAEE;IAAI;IAEnD,MAAMO,SAASX,eAAe;QAAEU;QAAeH;QAAcH;IAAI;IAEjE,MAAMQ,YAAY,IAAId,yCAAyC;QAC7De,oBAAoB;QACpBC,oBAAoBC;IACtB;IAEA,MAAMJ,OAAOK,OAAO,CAACJ;IAErB,MAAMK,aAAa,IAAIC,QAAQd,IAAIC,GAAG,EAAE;QACtCc,MAAMf,IAAIe,IAAI;QACdC,QAAQ;QACRC,SAASjB,IAAIiB,OAAO;QACpBC,QAAQlB,IAAIkB,MAAM;IACpB;IAEA,OAAO,MAAMV,UAAUW,aAAa,CAACN;AACvC,EAAC"}
1
+ {"version":3,"sources":["../../src/endpoint/index.ts"],"sourcesContent":["import type { PayloadHandler, PayloadRequest } from 'payload'\n\nimport {\n createMcpHandler,\n isLegacyRequest,\n WebStandardStreamableHTTPServerTransport,\n} from '@modelcontextprotocol/server'\nimport { APIError } from 'payload'\n\nimport { buildMcpServer } from '../mcp/buildMcpServer.js'\nimport { getPluginConfig } from '../utils/getPluginConfig.js'\nimport { getAuthorizedMCP } from './access.js'\n\nexport const mcpEndpoint: PayloadHandler = async (req) => {\n if (!req.url) {\n throw new APIError('Missing request URL', 400)\n }\n\n req.payloadAPI = 'MCP' as const\n\n const pluginConfig = getPluginConfig({ config: req.payload.config })\n const overrideAccessParam = new URL(req.url).searchParams.get('overrideAccess')\n\n if (overrideAccessParam !== null && process.env.NODE_ENV !== 'development') {\n throw new APIError('MCP overrideAccess is only available in development.', 400)\n }\n\n let overrideAccess = false\n if (overrideAccessParam === 'true') {\n overrideAccess = true\n } else if (overrideAccessParam !== null && overrideAccessParam !== 'false') {\n throw new APIError('MCP overrideAccess must be \"true\" or \"false\".', 400)\n }\n\n const authorizedMCP = await getAuthorizedMCP({ overrideAccess, req })\n // Payload augments the original web-standard Request in place.\n const mcpRequest = req as PayloadRequest & Request\n\n // Keep the old JSON-only, stateless behavior because the SDK's 2025 fallback uses SSE.\n if (await isLegacyRequest(mcpRequest)) {\n const server = buildMcpServer({ authorizedMCP, pluginConfig, req })\n const transport = new WebStandardStreamableHTTPServerTransport({\n enableJsonResponse: true,\n sessionIdGenerator: undefined, // stateless mode\n })\n transport.onerror = (err) => {\n req.payload.logger.error({ err, msg: 'Error serving legacy MCP request' })\n }\n\n try {\n await server.connect(transport)\n return await transport.handleRequest(mcpRequest)\n } finally {\n await server.close().catch((err) => {\n req.payload.logger.error({ err, msg: 'Error closing MCP server' })\n })\n }\n }\n\n const handler = createMcpHandler(() => buildMcpServer({ authorizedMCP, pluginConfig, req }), {\n legacy: 'reject',\n // SDK subscriptions always use SSE, so disable them to keep every response JSON-only.\n maxSubscriptions: 0,\n onerror: (err) => {\n req.payload.logger.error({ err, msg: 'Error serving modern MCP request' })\n },\n responseMode: 'json',\n })\n\n try {\n return await handler.fetch(mcpRequest)\n } finally {\n await handler.close().catch((err) => {\n req.payload.logger.error({ err, msg: 'Error closing modern MCP handler' })\n })\n }\n}\n"],"names":["createMcpHandler","isLegacyRequest","WebStandardStreamableHTTPServerTransport","APIError","buildMcpServer","getPluginConfig","getAuthorizedMCP","mcpEndpoint","req","url","payloadAPI","pluginConfig","config","payload","overrideAccessParam","URL","searchParams","get","process","env","NODE_ENV","overrideAccess","authorizedMCP","mcpRequest","server","transport","enableJsonResponse","sessionIdGenerator","undefined","onerror","err","logger","error","msg","connect","handleRequest","close","catch","handler","legacy","maxSubscriptions","responseMode","fetch"],"mappings":"AAEA,SACEA,gBAAgB,EAChBC,eAAe,EACfC,wCAAwC,QACnC,+BAA8B;AACrC,SAASC,QAAQ,QAAQ,UAAS;AAElC,SAASC,cAAc,QAAQ,2BAA0B;AACzD,SAASC,eAAe,QAAQ,8BAA6B;AAC7D,SAASC,gBAAgB,QAAQ,cAAa;AAE9C,OAAO,MAAMC,cAA8B,OAAOC;IAChD,IAAI,CAACA,IAAIC,GAAG,EAAE;QACZ,MAAM,IAAIN,SAAS,uBAAuB;IAC5C;IAEAK,IAAIE,UAAU,GAAG;IAEjB,MAAMC,eAAeN,gBAAgB;QAAEO,QAAQJ,IAAIK,OAAO,CAACD,MAAM;IAAC;IAClE,MAAME,sBAAsB,IAAIC,IAAIP,IAAIC,GAAG,EAAEO,YAAY,CAACC,GAAG,CAAC;IAE9D,IAAIH,wBAAwB,QAAQI,QAAQC,GAAG,CAACC,QAAQ,KAAK,eAAe;QAC1E,MAAM,IAAIjB,SAAS,wDAAwD;IAC7E;IAEA,IAAIkB,iBAAiB;IACrB,IAAIP,wBAAwB,QAAQ;QAClCO,iBAAiB;IACnB,OAAO,IAAIP,wBAAwB,QAAQA,wBAAwB,SAAS;QAC1E,MAAM,IAAIX,SAAS,iDAAiD;IACtE;IAEA,MAAMmB,gBAAgB,MAAMhB,iBAAiB;QAAEe;QAAgBb;IAAI;IACnE,+DAA+D;IAC/D,MAAMe,aAAaf;IAEnB,uFAAuF;IACvF,IAAI,MAAMP,gBAAgBsB,aAAa;QACrC,MAAMC,SAASpB,eAAe;YAAEkB;YAAeX;YAAcH;QAAI;QACjE,MAAMiB,YAAY,IAAIvB,yCAAyC;YAC7DwB,oBAAoB;YACpBC,oBAAoBC;QACtB;QACAH,UAAUI,OAAO,GAAG,CAACC;YACnBtB,IAAIK,OAAO,CAACkB,MAAM,CAACC,KAAK,CAAC;gBAAEF;gBAAKG,KAAK;YAAmC;QAC1E;QAEA,IAAI;YACF,MAAMT,OAAOU,OAAO,CAACT;YACrB,OAAO,MAAMA,UAAUU,aAAa,CAACZ;QACvC,SAAU;YACR,MAAMC,OAAOY,KAAK,GAAGC,KAAK,CAAC,CAACP;gBAC1BtB,IAAIK,OAAO,CAACkB,MAAM,CAACC,KAAK,CAAC;oBAAEF;oBAAKG,KAAK;gBAA2B;YAClE;QACF;IACF;IAEA,MAAMK,UAAUtC,iBAAiB,IAAMI,eAAe;YAAEkB;YAAeX;YAAcH;QAAI,IAAI;QAC3F+B,QAAQ;QACR,sFAAsF;QACtFC,kBAAkB;QAClBX,SAAS,CAACC;YACRtB,IAAIK,OAAO,CAACkB,MAAM,CAACC,KAAK,CAAC;gBAAEF;gBAAKG,KAAK;YAAmC;QAC1E;QACAQ,cAAc;IAChB;IAEA,IAAI;QACF,OAAO,MAAMH,QAAQI,KAAK,CAACnB;IAC7B,SAAU;QACR,MAAMe,QAAQF,KAAK,GAAGC,KAAK,CAAC,CAACP;YAC3BtB,IAAIK,OAAO,CAACkB,MAAM,CAACC,KAAK,CAAC;gBAAEF;gBAAKG,KAAK;YAAmC;QAC1E;IACF;AACF,EAAC"}
@@ -1,2 +1,2 @@
1
- export { AccessField } from '../components/AccessField/index.client.js';
1
+ export {};
2
2
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/exports/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,2CAA2C,CAAA"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/exports/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,CAAA"}
@@ -1,4 +1,4 @@
1
1
  'use client';
2
- export { AccessField } from '../components/AccessField/index.client.js';
2
+ export { };
3
3
 
4
4
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["'use client'\nexport { AccessField } from '../components/AccessField/index.client.js'\n"],"names":["AccessField"],"mappings":"AAAA;AACA,SAASA,WAAW,QAAQ,4CAA2C"}
1
+ {"version":3,"sources":["../../src/exports/client.ts"],"sourcesContent":["'use client'\n\nexport {}\n"],"names":[],"mappings":"AAAA;AAEA,WAAS"}
@@ -0,0 +1,2 @@
1
+ export { filterMCPItems, getAuthorizedMCP } from '../endpoint/access.js';
2
+ //# sourceMappingURL=internal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"internal.d.ts","sourceRoot":"","sources":["../../src/exports/internal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export { filterMCPItems, getAuthorizedMCP } from '../endpoint/access.js';
2
+
3
+ //# sourceMappingURL=internal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/exports/internal.ts"],"sourcesContent":["export { filterMCPItems, getAuthorizedMCP } from '../endpoint/access.js'\n"],"names":["filterMCPItems","getAuthorizedMCP"],"mappings":"AAAA,SAASA,cAAc,EAAEC,gBAAgB,QAAQ,wBAAuB"}
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { AuthorizedMCP, MCPPluginConfig, SanitizedMCPPluginConfig } from './types.js';
2
2
  declare module 'payload' {
3
- interface PayloadRequest {
4
- payloadAPI: 'GraphQL' | 'local' | 'MCP' | 'REST';
3
+ interface PayloadRequestAPI {
4
+ MCP: true;
5
5
  }
6
6
  interface RegisteredPlugins {
7
7
  /** After the plugin's `plugin` callback runs, `options` holds the sanitized config. */
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAM1F,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAiB,cAAc;QAC7B,UAAU,EAAE,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAA;KACjD;IACD,UAAU,iBAAiB;QACzB,uFAAuF;QACvF,wBAAwB,EAAE,eAAe,CAAA;KAC1C;CACF;AAED,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,wBAAwB,EAAE,CAAA;AAExE,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAElG,eAAO,MAAM,SAAS,wDAwCpB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,wBAAwB,EAAE,MAAM,YAAY,CAAA;AAK1F,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAiB,iBAAiB;QAChC,GAAG,EAAE,IAAI,CAAA;KACV;IACD,UAAU,iBAAiB;QACzB,uFAAuF;QACvF,wBAAwB,EAAE,eAAe,CAAA;KAC1C;CACF;AAED,YAAY,EAAE,aAAa,EAAE,eAAe,EAAE,wBAAwB,EAAE,CAAA;AAExE,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAElG,eAAO,MAAM,SAAS,wDAiCpB,CAAA"}
package/dist/index.js CHANGED
@@ -1,25 +1,14 @@
1
- import { defaultUserCollection, definePlugin } from 'payload';
2
- import { getAPIKeysCollection } from './collection/index.js';
1
+ import { definePlugin } from 'payload';
3
2
  import { mcpEndpoint } from './endpoint/index.js';
4
3
  import { sanitizeMCPConfig } from './mcp/sanitizeMCPConfig.js';
5
4
  export { defineCollectionTool, defineGlobalTool, definePrompt, defineTool } from './defineTool.js';
6
5
  export const mcpPlugin = definePlugin({
7
6
  slug: '@payloadcms/plugin-mcp',
8
7
  order: 10,
9
- plugin: ({ config, plugins, ...rawConfig })=>{
10
- // Our `payload-mcp-api-keys` is auth-enabled; if it'd be the only auth
11
- // collection, Payload's later sanitize would pick it as `admin.user`.
12
- // Pre-seed the default user collection to prevent that.
13
- if (!config.admin?.user) {
14
- const firstCollectionWithAuth = (config.collections ?? []).find(({ auth })=>Boolean(auth));
15
- if (!firstCollectionWithAuth) {
16
- ;
17
- (config.collections ??= []).push(defaultUserCollection);
18
- }
19
- }
8
+ plugin: ({ config, options, plugins })=>{
20
9
  const pluginConfig = sanitizeMCPConfig({
21
10
  config,
22
- pluginConfig: rawConfig
11
+ pluginConfig: options
23
12
  });
24
13
  // Stash the sanitized config on plugin options so `getPluginConfig()` reads it.
25
14
  const registered = plugins['@payloadcms/plugin-mcp'];
@@ -27,12 +16,6 @@ export const mcpPlugin = definePlugin({
27
16
  // @ts-expect-error
28
17
  registered.sanitizedOptions = pluginConfig;
29
18
  }
30
- ;
31
- (config.collections ??= []).push(getAPIKeysCollection({
32
- pluginConfig
33
- }));
34
- // Keep the API-keys collection registered even when disabled, so DB schema
35
- // and generated types don't drift between enabled/disabled environments.
36
19
  if (pluginConfig.disabled) {
37
20
  return config;
38
21
  }
@@ -45,6 +28,18 @@ export const mcpPlugin = definePlugin({
45
28
  handler: mcpEndpoint,
46
29
  method: 'post',
47
30
  path: '/mcp'
31
+ },
32
+ // Streamable HTTP's optional server=>client GET stream. We don't offer
33
+ // one, so answer 405 per spec-— clients then skip it cleanly
34
+ {
35
+ handler: ()=>new Response(null, {
36
+ headers: {
37
+ Allow: 'POST'
38
+ },
39
+ status: 405
40
+ }),
41
+ method: 'get',
42
+ path: '/mcp'
48
43
  }
49
44
  ]
50
45
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { defaultUserCollection, definePlugin } from 'payload'\n\nimport type { AuthorizedMCP, MCPPluginConfig, SanitizedMCPPluginConfig } from './types.js'\n\nimport { getAPIKeysCollection } from './collection/index.js'\nimport { mcpEndpoint } from './endpoint/index.js'\nimport { sanitizeMCPConfig } from './mcp/sanitizeMCPConfig.js'\n\ndeclare module 'payload' {\n export interface PayloadRequest {\n payloadAPI: 'GraphQL' | 'local' | 'MCP' | 'REST'\n }\n interface RegisteredPlugins {\n /** After the plugin's `plugin` callback runs, `options` holds the sanitized config. */\n '@payloadcms/plugin-mcp': MCPPluginConfig\n }\n}\n\nexport type { AuthorizedMCP, MCPPluginConfig, SanitizedMCPPluginConfig }\n\nexport { defineCollectionTool, defineGlobalTool, definePrompt, defineTool } from './defineTool.js'\n\nexport const mcpPlugin = definePlugin<MCPPluginConfig>({\n slug: '@payloadcms/plugin-mcp',\n order: 10,\n plugin: ({ config, plugins, ...rawConfig }) => {\n // Our `payload-mcp-api-keys` is auth-enabled; if it'd be the only auth\n // collection, Payload's later sanitize would pick it as `admin.user`.\n // Pre-seed the default user collection to prevent that.\n if (!config.admin?.user) {\n const firstCollectionWithAuth = (config.collections ?? []).find(({ auth }) => Boolean(auth))\n if (!firstCollectionWithAuth) {\n ;(config.collections ??= []).push(defaultUserCollection)\n }\n }\n\n const pluginConfig = sanitizeMCPConfig({ config, pluginConfig: rawConfig })\n\n // Stash the sanitized config on plugin options so `getPluginConfig()` reads it.\n const registered = plugins['@payloadcms/plugin-mcp']\n if (registered) {\n // @ts-expect-error\n registered.sanitizedOptions = pluginConfig as unknown as typeof registered.options\n }\n\n ;(config.collections ??= []).push(getAPIKeysCollection({ pluginConfig }))\n\n // Keep the API-keys collection registered even when disabled, so DB schema\n // and generated types don't drift between enabled/disabled environments.\n if (pluginConfig.disabled) {\n return config\n }\n\n return {\n ...config,\n endpoints: [\n ...(config.endpoints ?? []),\n // Payload prefixes /api, so the full path is /api/mcp.\n { handler: mcpEndpoint, method: 'post', path: '/mcp' },\n ],\n }\n },\n})\n"],"names":["defaultUserCollection","definePlugin","getAPIKeysCollection","mcpEndpoint","sanitizeMCPConfig","defineCollectionTool","defineGlobalTool","definePrompt","defineTool","mcpPlugin","slug","order","plugin","config","plugins","rawConfig","admin","user","firstCollectionWithAuth","collections","find","auth","Boolean","push","pluginConfig","registered","sanitizedOptions","disabled","endpoints","handler","method","path"],"mappings":"AAAA,SAASA,qBAAqB,EAAEC,YAAY,QAAQ,UAAS;AAI7D,SAASC,oBAAoB,QAAQ,wBAAuB;AAC5D,SAASC,WAAW,QAAQ,sBAAqB;AACjD,SAASC,iBAAiB,QAAQ,6BAA4B;AAc9D,SAASC,oBAAoB,EAAEC,gBAAgB,EAAEC,YAAY,EAAEC,UAAU,QAAQ,kBAAiB;AAElG,OAAO,MAAMC,YAAYR,aAA8B;IACrDS,MAAM;IACNC,OAAO;IACPC,QAAQ,CAAC,EAAEC,MAAM,EAAEC,OAAO,EAAE,GAAGC,WAAW;QACxC,uEAAuE;QACvE,sEAAsE;QACtE,wDAAwD;QACxD,IAAI,CAACF,OAAOG,KAAK,EAAEC,MAAM;YACvB,MAAMC,0BAA0B,AAACL,CAAAA,OAAOM,WAAW,IAAI,EAAE,AAAD,EAAGC,IAAI,CAAC,CAAC,EAAEC,IAAI,EAAE,GAAKC,QAAQD;YACtF,IAAI,CAACH,yBAAyB;;gBAC1BL,CAAAA,OAAOM,WAAW,KAAK,EAAE,AAAD,EAAGI,IAAI,CAACvB;YACpC;QACF;QAEA,MAAMwB,eAAepB,kBAAkB;YAAES;YAAQW,cAAcT;QAAU;QAEzE,gFAAgF;QAChF,MAAMU,aAAaX,OAAO,CAAC,yBAAyB;QACpD,IAAIW,YAAY;YACd,mBAAmB;YACnBA,WAAWC,gBAAgB,GAAGF;QAChC;;QAEEX,CAAAA,OAAOM,WAAW,KAAK,EAAE,AAAD,EAAGI,IAAI,CAACrB,qBAAqB;YAAEsB;QAAa;QAEtE,2EAA2E;QAC3E,yEAAyE;QACzE,IAAIA,aAAaG,QAAQ,EAAE;YACzB,OAAOd;QACT;QAEA,OAAO;YACL,GAAGA,MAAM;YACTe,WAAW;mBACLf,OAAOe,SAAS,IAAI,EAAE;gBAC1B,uDAAuD;gBACvD;oBAAEC,SAAS1B;oBAAa2B,QAAQ;oBAAQC,MAAM;gBAAO;aACtD;QACH;IACF;AACF,GAAE"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { definePlugin } from 'payload'\n\nimport type { AuthorizedMCP, MCPPluginConfig, SanitizedMCPPluginConfig } from './types.js'\n\nimport { mcpEndpoint } from './endpoint/index.js'\nimport { sanitizeMCPConfig } from './mcp/sanitizeMCPConfig.js'\n\ndeclare module 'payload' {\n export interface PayloadRequestAPI {\n MCP: true\n }\n interface RegisteredPlugins {\n /** After the plugin's `plugin` callback runs, `options` holds the sanitized config. */\n '@payloadcms/plugin-mcp': MCPPluginConfig\n }\n}\n\nexport type { AuthorizedMCP, MCPPluginConfig, SanitizedMCPPluginConfig }\n\nexport { defineCollectionTool, defineGlobalTool, definePrompt, defineTool } from './defineTool.js'\n\nexport const mcpPlugin = definePlugin<MCPPluginConfig>({\n slug: '@payloadcms/plugin-mcp',\n order: 10,\n plugin: ({ config, options, plugins }) => {\n const pluginConfig = sanitizeMCPConfig({ config, pluginConfig: options })\n\n // Stash the sanitized config on plugin options so `getPluginConfig()` reads it.\n const registered = plugins['@payloadcms/plugin-mcp']\n if (registered) {\n // @ts-expect-error\n registered.sanitizedOptions = pluginConfig as unknown as typeof registered.options\n }\n\n if (pluginConfig.disabled) {\n return config\n }\n\n return {\n ...config,\n endpoints: [\n ...(config.endpoints ?? []),\n // Payload prefixes /api, so the full path is /api/mcp.\n { handler: mcpEndpoint, method: 'post', path: '/mcp' },\n // Streamable HTTP's optional server=>client GET stream. We don't offer\n // one, so answer 405 per spec-— clients then skip it cleanly\n {\n handler: () => new Response(null, { headers: { Allow: 'POST' }, status: 405 }),\n method: 'get',\n path: '/mcp',\n },\n ],\n }\n },\n})\n"],"names":["definePlugin","mcpEndpoint","sanitizeMCPConfig","defineCollectionTool","defineGlobalTool","definePrompt","defineTool","mcpPlugin","slug","order","plugin","config","options","plugins","pluginConfig","registered","sanitizedOptions","disabled","endpoints","handler","method","path","Response","headers","Allow","status"],"mappings":"AAAA,SAASA,YAAY,QAAQ,UAAS;AAItC,SAASC,WAAW,QAAQ,sBAAqB;AACjD,SAASC,iBAAiB,QAAQ,6BAA4B;AAc9D,SAASC,oBAAoB,EAAEC,gBAAgB,EAAEC,YAAY,EAAEC,UAAU,QAAQ,kBAAiB;AAElG,OAAO,MAAMC,YAAYP,aAA8B;IACrDQ,MAAM;IACNC,OAAO;IACPC,QAAQ,CAAC,EAAEC,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAE;QACnC,MAAMC,eAAeZ,kBAAkB;YAAES;YAAQG,cAAcF;QAAQ;QAEvE,gFAAgF;QAChF,MAAMG,aAAaF,OAAO,CAAC,yBAAyB;QACpD,IAAIE,YAAY;YACd,mBAAmB;YACnBA,WAAWC,gBAAgB,GAAGF;QAChC;QAEA,IAAIA,aAAaG,QAAQ,EAAE;YACzB,OAAON;QACT;QAEA,OAAO;YACL,GAAGA,MAAM;YACTO,WAAW;mBACLP,OAAOO,SAAS,IAAI,EAAE;gBAC1B,uDAAuD;gBACvD;oBAAEC,SAASlB;oBAAamB,QAAQ;oBAAQC,MAAM;gBAAO;gBACrD,uEAAuE;gBACvE,6DAA6D;gBAC7D;oBACEF,SAAS,IAAM,IAAIG,SAAS,MAAM;4BAAEC,SAAS;gCAAEC,OAAO;4BAAO;4BAAGC,QAAQ;wBAAI;oBAC5EL,QAAQ;oBACRC,MAAM;gBACR;aACD;QACH;IACF;AACF,GAAE"}
@@ -2,10 +2,10 @@ import { McpServer } from '@modelcontextprotocol/server';
2
2
  import { type PayloadRequest } from 'payload';
3
3
  import type { AuthorizedMCP, SanitizedMCPPluginConfig } from '../types.js';
4
4
  /**
5
- * Transport-agnostic core: registers every authorized MCP item onto a fresh
6
- * `McpServer` and returns it. The caller is responsible for picking a transport
7
- * (`WebStandardStreamableHTTPServerTransport`, `StdioServerTransport`, …) and
8
- * calling `server.connect(transport)`.
5
+ * Serving-entry-agnostic core: registers every authorized MCP item onto a fresh
6
+ * `McpServer` and returns it. The HTTP and stdio entry point callers provide fresh
7
+ * instances from this builder while they own the transport and protocol-era
8
+ * decision.
9
9
  *
10
10
  * `req` is the request context handlers see. For HTTP it's the live
11
11
  * `PayloadRequest` derived from the incoming HTTP request; for stdio it's a
@@ -1 +1 @@
1
- {"version":3,"file":"buildMcpServer.d.ts","sourceRoot":"","sources":["../../src/mcp/buildMcpServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAsB,MAAM,8BAA8B,CAAA;AAC5E,OAAO,EAA0C,KAAK,cAAc,EAAE,MAAM,SAAS,CAAA;AAErF,OAAO,KAAK,EACV,aAAa,EAIb,wBAAwB,EACzB,MAAM,aAAa,CAAA;AAiBpB;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,GAAI,uCAI5B;IACD,aAAa,EAAE,aAAa,CAAA;IAC5B,YAAY,EAAE,wBAAwB,CAAA;IACtC,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,SAwLH,CAAA"}
1
+ {"version":3,"file":"buildMcpServer.d.ts","sourceRoot":"","sources":["../../src/mcp/buildMcpServer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAsB,MAAM,8BAA8B,CAAA;AAC5E,OAAO,EAAY,KAAK,cAAc,EAAE,MAAM,SAAS,CAAA;AAGvD,OAAO,KAAK,EACV,aAAa,EAMb,wBAAwB,EAEzB,MAAM,aAAa,CAAA;AAKpB;;;;;;;;;GASG;AACH,eAAO,MAAM,cAAc,GAAI,uCAI5B;IACD,aAAa,EAAE,aAAa,CAAA;IAC5B,YAAY,EAAE,wBAAwB,CAAA;IACtC,GAAG,EAAE,cAAc,CAAA;CACpB,KAAG,SAkNH,CAAA"}
@@ -1,19 +1,13 @@
1
1
  import { McpServer } from '@modelcontextprotocol/server';
2
- import { APIError, entityToStandaloneJSONSchema } from 'payload';
3
- import { toCamelCase } from '../utils/camelCase.js';
2
+ import { APIError } from 'payload';
3
+ import { z } from 'zod';
4
4
  import { getLogger } from '../utils/getLogger.js';
5
- import { getCollectionVirtualFieldNames, getGlobalVirtualFieldNames } from '../utils/getVirtualFieldNames.js';
6
- import { removeVirtualFieldsFromSchema } from '../utils/schemaConversion/removeVirtualFieldsFromSchema.js';
7
5
  import { toStandardSchema } from '../utils/toStandardSchema.js';
8
- /** `findPosts`, `updateSiteSettings` — auto-prefixed wire name for collection/global tools. */ const wireName = (key, slug)=>{
9
- const camel = toCamelCase(slug);
10
- return `${key}${camel.charAt(0).toUpperCase()}${camel.slice(1)}`;
11
- };
12
6
  /**
13
- * Transport-agnostic core: registers every authorized MCP item onto a fresh
14
- * `McpServer` and returns it. The caller is responsible for picking a transport
15
- * (`WebStandardStreamableHTTPServerTransport`, `StdioServerTransport`, …) and
16
- * calling `server.connect(transport)`.
7
+ * Serving-entry-agnostic core: registers every authorized MCP item onto a fresh
8
+ * `McpServer` and returns it. The HTTP and stdio entry point callers provide fresh
9
+ * instances from this builder while they own the transport and protocol-era
10
+ * decision.
17
11
  *
18
12
  * `req` is the request context handlers see. For HTTP it's the live
19
13
  * `PayloadRequest` derived from the incoming HTTP request; for stdio it's a
@@ -31,84 +25,103 @@ import { toStandardSchema } from '../utils/toStandardSchema.js';
31
25
  /**
32
26
  * Wrap a tool handler's response with the tool's `overrideResponse`, then
33
27
  * strip the internal `doc` field so it doesn't leak onto the wire.
34
- */ const finalizeToolResponse = (response, overrideResponse)=>{
35
- const overridden = overrideResponse?.(response, response.doc ?? {}, req) ?? response;
28
+ */ const finalizeToolResponse = async ({ input, overrideResponse, response, toolName })=>{
29
+ let overridden = overrideResponse?.(response, response.doc ?? {}, req) ?? response;
30
+ for (const hook of pluginConfig.hooks?.afterToolCall ?? []){
31
+ overridden = await hook({
32
+ input,
33
+ req,
34
+ response: overridden,
35
+ toolName
36
+ });
37
+ }
36
38
  const { doc: _doc, ...rest } = overridden;
37
39
  return rest;
38
40
  };
41
+ /**
42
+ * Runs a collection/global tool call:
43
+ * - reads `collectionSlug` / `globalSlug` from the input
44
+ * - runs access control: errors if `authorizedMCP.items` has no entry for this tool + slug
45
+ * - runs the tool handler and finalizes its response
46
+ */ const callEntityTool = async ({ input, item, serverContext })=>{
47
+ const entity = item.type === 'collectionTool' ? 'collection' : 'global';
48
+ const slugKey = item.type === 'collectionTool' ? 'collectionSlug' : 'globalSlug';
49
+ const toolInput = input ?? {};
50
+ const slug = toolInput[slugKey];
51
+ if (!slug) {
52
+ return {
53
+ content: [
54
+ {
55
+ type: 'text',
56
+ text: `Error: "${item.mcpName}" requires ${slugKey}. Use getConfigInfo to inspect ${entity} slugs.`
57
+ }
58
+ ],
59
+ isError: true
60
+ };
61
+ }
62
+ const match = authorizedMCP.items.find((candidate)=>candidate.type === item.type && candidate.mcpName === item.mcpName && (candidate.type === 'collectionTool' ? candidate.collectionSlug === slug : candidate.type === 'globalTool' && candidate.globalSlug === slug));
63
+ if (!match) {
64
+ return {
65
+ content: [
66
+ {
67
+ type: 'text',
68
+ text: `Error: MCP access to "${item.mcpName}" is not enabled for ${entity} "${slug}"`
69
+ }
70
+ ],
71
+ isError: true
72
+ };
73
+ }
74
+ const handlerArgs = {
75
+ authorizedMCP,
76
+ input: toolInput,
77
+ req,
78
+ serverContext
79
+ };
80
+ const response = await (match.type === 'collectionTool' ? match.tool.handler({
81
+ ...handlerArgs,
82
+ collectionSlug: slug
83
+ }) : match.tool.handler({
84
+ ...handlerArgs,
85
+ globalSlug: slug
86
+ }));
87
+ return finalizeToolResponse({
88
+ input: toolInput,
89
+ overrideResponse: match.tool.overrideResponse,
90
+ response,
91
+ toolName: match.mcpName
92
+ });
93
+ };
39
94
  try {
95
+ const registeredEntityTools = new Set();
40
96
  for (const item of authorizedMCP.items){
41
97
  switch(item.type){
42
98
  case 'collectionTool':
43
- {
44
- const tool = item.tool;
45
- const name = wireName(item.key, item.collectionSlug);
46
- let inputSchema = tool.input;
47
- if (typeof inputSchema === 'function') {
48
- const collection = req.payload.collections[item.collectionSlug]?.config;
49
- if (!collection) {
50
- throw new APIError(`Collection schema not found for slug: ${item.collectionSlug}`, 500);
51
- }
52
- const collectionSchema = removeVirtualFieldsFromSchema(entityToStandaloneJSONSchema({
53
- config: req.payload.config,
54
- defaultIDType: req.payload.db.defaultIDType,
55
- entity: collection,
56
- i18n: req.i18n
57
- }), getCollectionVirtualFieldNames(req.payload.config, item.collectionSlug));
58
- inputSchema = inputSchema({
59
- collectionSchema
60
- });
61
- }
62
- server.registerTool(name, {
63
- description: tool.description,
64
- inputSchema: inputSchema ? toStandardSchema(inputSchema) : undefined
65
- }, async (input, ctx)=>finalizeToolResponse(await tool.handler({
66
- authorizedMCP,
67
- collectionSlug: item.collectionSlug,
68
- input: input ?? {},
69
- req,
70
- serverContext: ctx
71
- }), tool.overrideResponse));
72
- logger.info(`✅ Tool: ${name} Registered.`);
73
- break;
74
- }
75
99
  case 'globalTool':
76
100
  {
77
- const tool = item.tool;
78
- const name = wireName(item.key, item.globalSlug);
79
- let inputSchema = tool.input;
80
- if (typeof inputSchema === 'function') {
81
- const globalEntity = req.payload.config.globals.find((globalConfig)=>globalConfig.slug === item.globalSlug);
82
- if (!globalEntity) {
83
- throw new APIError(`Global schema not found for slug: ${item.globalSlug}`, 500);
84
- }
85
- const globalSchema = removeVirtualFieldsFromSchema(entityToStandaloneJSONSchema({
86
- config: req.payload.config,
87
- defaultIDType: req.payload.db.defaultIDType,
88
- entity: globalEntity,
89
- i18n: req.i18n
90
- }), getGlobalVirtualFieldNames(req.payload.config, item.globalSlug));
91
- inputSchema = inputSchema({
92
- globalSchema
93
- });
101
+ if (registeredEntityTools.has(item.mcpName)) {
102
+ break;
94
103
  }
95
- server.registerTool(name, {
96
- description: tool.description,
97
- inputSchema: inputSchema ? toStandardSchema(inputSchema) : undefined
98
- }, async (input, ctx)=>finalizeToolResponse(await tool.handler({
99
- authorizedMCP,
100
- globalSlug: item.globalSlug,
101
- input: input ?? {},
102
- req,
104
+ registeredEntityTools.add(item.mcpName);
105
+ const inputSchema = withSlugInput({
106
+ name: item.type === 'collectionTool' ? 'collectionSlug' : 'globalSlug',
107
+ input: item.tool.input
108
+ });
109
+ server.registerTool(item.mcpName, {
110
+ annotations: item.tool.annotations,
111
+ description: item.tool.description,
112
+ inputSchema: toStandardSchema(inputSchema)
113
+ }, async (input, ctx)=>callEntityTool({
114
+ input,
115
+ item,
103
116
  serverContext: ctx
104
- }), tool.overrideResponse));
105
- logger.info(`✅ Tool: ${name} Registered.`);
117
+ }));
118
+ logger.info(`✅ Tool: ${item.mcpName} Registered.`);
106
119
  break;
107
120
  }
108
121
  case 'prompt':
109
122
  {
110
123
  const prompt = item.prompt;
111
- server.registerPrompt(item.key, {
124
+ server.registerPrompt(item.mcpName, {
112
125
  argsSchema: prompt.argsSchema ? toStandardSchema(prompt.argsSchema) : undefined,
113
126
  description: prompt.description,
114
127
  title: prompt.title
@@ -123,7 +136,7 @@ import { toStandardSchema } from '../utils/toStandardSchema.js';
123
136
  case 'resource':
124
137
  {
125
138
  const resource = item.resource;
126
- server.registerResource(item.key, // @ts-expect-error - Overload type ambiguity (string OR ResourceTemplate is valid)
139
+ server.registerResource(item.mcpName, // @ts-expect-error - Overload type ambiguity (string OR ResourceTemplate is valid)
127
140
  resource.uri, {
128
141
  description: resource.description,
129
142
  mimeType: resource.mimeType,
@@ -147,16 +160,26 @@ import { toStandardSchema } from '../utils/toStandardSchema.js';
147
160
  case 'tool':
148
161
  {
149
162
  const tool = item.tool;
150
- server.registerTool(item.key, {
163
+ server.registerTool(item.mcpName, {
164
+ annotations: tool.annotations,
151
165
  description: tool.description,
152
166
  inputSchema: tool.input ? toStandardSchema(tool.input) : undefined
153
- }, async (input, ctx)=>finalizeToolResponse(await tool.handler({
167
+ }, async (input, ctx)=>{
168
+ const toolInput = input ?? {};
169
+ const response = await tool.handler({
154
170
  authorizedMCP,
155
- input: input ?? {},
171
+ input: toolInput,
156
172
  req,
157
173
  serverContext: ctx
158
- }), tool.overrideResponse));
159
- logger.info(`✅ Tool: ${item.key} Registered.`);
174
+ });
175
+ return finalizeToolResponse({
176
+ input: toolInput,
177
+ overrideResponse: tool.overrideResponse,
178
+ response,
179
+ toolName: item.mcpName
180
+ });
181
+ });
182
+ logger.info(`✅ Tool: ${item.mcpName} Registered.`);
160
183
  break;
161
184
  }
162
185
  }
@@ -166,5 +189,35 @@ import { toStandardSchema } from '../utils/toStandardSchema.js';
166
189
  }
167
190
  return server;
168
191
  };
192
+ const withSlugInput = ({ name, input })=>{
193
+ const description = name === 'collectionSlug' ? 'The collection slug' : 'The global slug';
194
+ const slugSchema = z.string().describe(description);
195
+ if (!input) {
196
+ return z.object({
197
+ [name]: slugSchema
198
+ });
199
+ }
200
+ if (input instanceof z.ZodObject) {
201
+ return input.extend({
202
+ [name]: slugSchema
203
+ });
204
+ }
205
+ const schema = input;
206
+ return {
207
+ ...schema,
208
+ type: 'object',
209
+ properties: {
210
+ ...schema.properties,
211
+ [name]: {
212
+ type: 'string',
213
+ description
214
+ }
215
+ },
216
+ required: Array.from(new Set([
217
+ name,
218
+ ...schema.required ?? []
219
+ ]))
220
+ };
221
+ };
169
222
 
170
223
  //# sourceMappingURL=buildMcpServer.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/mcp/buildMcpServer.ts"],"sourcesContent":["import { McpServer, type ServerContext } from '@modelcontextprotocol/server'\nimport { APIError, entityToStandaloneJSONSchema, type PayloadRequest } from 'payload'\n\nimport type {\n AuthorizedMCP,\n JsonSchemaType,\n MCPResponseOverride,\n MCPToolResponse,\n SanitizedMCPPluginConfig,\n} from '../types.js'\n\nimport { toCamelCase } from '../utils/camelCase.js'\nimport { getLogger } from '../utils/getLogger.js'\nimport {\n getCollectionVirtualFieldNames,\n getGlobalVirtualFieldNames,\n} from '../utils/getVirtualFieldNames.js'\nimport { removeVirtualFieldsFromSchema } from '../utils/schemaConversion/removeVirtualFieldsFromSchema.js'\nimport { toStandardSchema } from '../utils/toStandardSchema.js'\n\n/** `findPosts`, `updateSiteSettings` — auto-prefixed wire name for collection/global tools. */\nconst wireName = (key: string, slug: string): string => {\n const camel = toCamelCase(slug)\n return `${key}${camel.charAt(0).toUpperCase()}${camel.slice(1)}`\n}\n\n/**\n * Transport-agnostic core: registers every authorized MCP item onto a fresh\n * `McpServer` and returns it. The caller is responsible for picking a transport\n * (`WebStandardStreamableHTTPServerTransport`, `StdioServerTransport`, …) and\n * calling `server.connect(transport)`.\n *\n * `req` is the request context handlers see. For HTTP it's the live\n * `PayloadRequest` derived from the incoming HTTP request; for stdio it's a\n * synthesized one built via `createLocalReq`.\n */\nexport const buildMcpServer = ({\n authorizedMCP,\n pluginConfig,\n req,\n}: {\n authorizedMCP: AuthorizedMCP\n pluginConfig: SanitizedMCPPluginConfig\n req: PayloadRequest\n}): McpServer => {\n const serverOptions = pluginConfig.mcp?.serverOptions || {}\n const server = new McpServer(\n { name: 'Payload MCP Server', version: '1.0.0', ...serverOptions.serverInfo },\n serverOptions.options,\n )\n\n const logger = getLogger({ payload: req.payload })\n\n /**\n * Wrap a tool handler's response with the tool's `overrideResponse`, then\n * strip the internal `doc` field so it doesn't leak onto the wire.\n */\n const finalizeToolResponse = (\n response: MCPToolResponse,\n overrideResponse?: MCPResponseOverride,\n ): MCPToolResponse => {\n const overridden = overrideResponse?.(response, response.doc ?? {}, req) ?? response\n const { doc: _doc, ...rest } = overridden\n return rest\n }\n\n try {\n for (const item of authorizedMCP.items) {\n switch (item.type) {\n case 'collectionTool': {\n const tool = item.tool\n const name = wireName(item.key, item.collectionSlug)\n let inputSchema = tool.input\n if (typeof inputSchema === 'function') {\n const collection = req.payload.collections[item.collectionSlug]?.config\n if (!collection) {\n throw new APIError(\n `Collection schema not found for slug: ${item.collectionSlug}`,\n 500,\n )\n }\n const collectionSchema = removeVirtualFieldsFromSchema(\n entityToStandaloneJSONSchema({\n config: req.payload.config,\n defaultIDType: req.payload.db.defaultIDType,\n entity: collection,\n i18n: req.i18n,\n }) as unknown as JsonSchemaType,\n getCollectionVirtualFieldNames(req.payload.config, item.collectionSlug),\n )\n inputSchema = inputSchema({ collectionSchema })\n }\n server.registerTool(\n name,\n {\n description: tool.description,\n inputSchema: inputSchema ? toStandardSchema(inputSchema) : undefined,\n },\n async (input: unknown, ctx: ServerContext) =>\n finalizeToolResponse(\n await tool.handler({\n authorizedMCP,\n collectionSlug: item.collectionSlug,\n input: (input ?? {}) as Record<string, unknown>,\n req,\n serverContext: ctx,\n }),\n tool.overrideResponse,\n ),\n )\n logger.info(`✅ Tool: ${name} Registered.`)\n break\n }\n case 'globalTool': {\n const tool = item.tool\n const name = wireName(item.key, item.globalSlug)\n let inputSchema = tool.input\n if (typeof inputSchema === 'function') {\n const globalEntity = req.payload.config.globals.find(\n (globalConfig) => globalConfig.slug === item.globalSlug,\n )\n if (!globalEntity) {\n throw new APIError(`Global schema not found for slug: ${item.globalSlug}`, 500)\n }\n const globalSchema = removeVirtualFieldsFromSchema(\n entityToStandaloneJSONSchema({\n config: req.payload.config,\n defaultIDType: req.payload.db.defaultIDType,\n entity: globalEntity,\n i18n: req.i18n,\n }) as unknown as JsonSchemaType,\n getGlobalVirtualFieldNames(req.payload.config, item.globalSlug),\n )\n\n inputSchema = inputSchema({ globalSchema })\n }\n server.registerTool(\n name,\n {\n description: tool.description,\n inputSchema: inputSchema ? toStandardSchema(inputSchema) : undefined,\n },\n async (input: unknown, ctx: ServerContext) =>\n finalizeToolResponse(\n await tool.handler({\n authorizedMCP,\n globalSlug: item.globalSlug,\n input: (input ?? {}) as Record<string, unknown>,\n req,\n serverContext: ctx,\n }),\n tool.overrideResponse,\n ),\n )\n logger.info(`✅ Tool: ${name} Registered.`)\n break\n }\n case 'prompt': {\n const prompt = item.prompt\n server.registerPrompt(\n item.key,\n {\n argsSchema: prompt.argsSchema ? toStandardSchema(prompt.argsSchema) : undefined,\n description: prompt.description,\n title: prompt.title,\n },\n async (input: unknown, ctx: ServerContext) =>\n prompt.handler({\n input: (input ?? {}) as Record<string, unknown>,\n req,\n serverContext: ctx,\n }),\n )\n logger.info(`✅ Prompt: ${prompt.title} Registered.`)\n break\n }\n case 'resource': {\n const resource = item.resource\n server.registerResource(\n item.key,\n // @ts-expect-error - Overload type ambiguity (string OR ResourceTemplate is valid)\n resource.uri,\n {\n description: resource.description,\n mimeType: resource.mimeType,\n title: resource.title,\n },\n // Static URIs call (uri, ctx); ResourceTemplates call (uri, params, ctx).\n // The rest-params shape lets us collect either signature uniformly.\n async (...sdkArgs: unknown[]) => {\n const ctx = sdkArgs[sdkArgs.length - 1] as ServerContext\n const uri = sdkArgs[0] as URL\n const params = (sdkArgs.length > 2 ? sdkArgs[1] : {}) as Record<string, string>\n return resource.handler({ params, req, serverContext: ctx, uri })\n },\n )\n logger.info(`✅ Resource: ${resource.title} Registered.`)\n break\n }\n case 'tool': {\n const tool = item.tool\n server.registerTool(\n item.key,\n {\n description: tool.description,\n inputSchema: tool.input ? toStandardSchema(tool.input) : undefined,\n },\n async (input: unknown, ctx: ServerContext) =>\n finalizeToolResponse(\n await tool.handler({\n authorizedMCP,\n input: (input ?? {}) as Record<string, unknown>,\n req,\n serverContext: ctx,\n }),\n tool.overrideResponse,\n ),\n )\n logger.info(`✅ Tool: ${item.key} Registered.`)\n break\n }\n }\n }\n } catch (error) {\n throw new APIError(`Error initializing MCP handler: ${String(error)}`, 500)\n }\n\n return server\n}\n"],"names":["McpServer","APIError","entityToStandaloneJSONSchema","toCamelCase","getLogger","getCollectionVirtualFieldNames","getGlobalVirtualFieldNames","removeVirtualFieldsFromSchema","toStandardSchema","wireName","key","slug","camel","charAt","toUpperCase","slice","buildMcpServer","authorizedMCP","pluginConfig","req","serverOptions","mcp","server","name","version","serverInfo","options","logger","payload","finalizeToolResponse","response","overrideResponse","overridden","doc","_doc","rest","item","items","type","tool","collectionSlug","inputSchema","input","collection","collections","config","collectionSchema","defaultIDType","db","entity","i18n","registerTool","description","undefined","ctx","handler","serverContext","info","globalSlug","globalEntity","globals","find","globalConfig","globalSchema","prompt","registerPrompt","argsSchema","title","resource","registerResource","uri","mimeType","sdkArgs","length","params","error","String"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/mcp/buildMcpServer.ts"],"sourcesContent":["import { McpServer, type ServerContext } from '@modelcontextprotocol/server'\nimport { APIError, type PayloadRequest } from 'payload'\nimport { z } from 'zod'\n\nimport type {\n AuthorizedMCP,\n CollectionMCPItem,\n GlobalMCPItem,\n JsonSchemaType,\n MCPResponseOverride,\n MCPToolResponse,\n SanitizedMCPPluginConfig,\n ToolInputSchema,\n} from '../types.js'\n\nimport { getLogger } from '../utils/getLogger.js'\nimport { toStandardSchema } from '../utils/toStandardSchema.js'\n\n/**\n * Serving-entry-agnostic core: registers every authorized MCP item onto a fresh\n * `McpServer` and returns it. The HTTP and stdio entry point callers provide fresh\n * instances from this builder while they own the transport and protocol-era\n * decision.\n *\n * `req` is the request context handlers see. For HTTP it's the live\n * `PayloadRequest` derived from the incoming HTTP request; for stdio it's a\n * synthesized one built via `createLocalReq`.\n */\nexport const buildMcpServer = ({\n authorizedMCP,\n pluginConfig,\n req,\n}: {\n authorizedMCP: AuthorizedMCP\n pluginConfig: SanitizedMCPPluginConfig\n req: PayloadRequest\n}): McpServer => {\n const serverOptions = pluginConfig.mcp?.serverOptions || {}\n const server = new McpServer(\n { name: 'Payload MCP Server', version: '1.0.0', ...serverOptions.serverInfo },\n serverOptions.options,\n )\n\n const logger = getLogger({ payload: req.payload })\n\n /**\n * Wrap a tool handler's response with the tool's `overrideResponse`, then\n * strip the internal `doc` field so it doesn't leak onto the wire.\n */\n const finalizeToolResponse = async ({\n input,\n overrideResponse,\n response,\n toolName,\n }: {\n input: unknown\n overrideResponse?: MCPResponseOverride\n response: MCPToolResponse\n toolName: string\n }): Promise<MCPToolResponse> => {\n let overridden = overrideResponse?.(response, response.doc ?? {}, req) ?? response\n for (const hook of pluginConfig.hooks?.afterToolCall ?? []) {\n overridden = await hook({ input, req, response: overridden, toolName })\n }\n const { doc: _doc, ...rest } = overridden\n return rest\n }\n\n /**\n * Runs a collection/global tool call:\n * - reads `collectionSlug` / `globalSlug` from the input\n * - runs access control: errors if `authorizedMCP.items` has no entry for this tool + slug\n * - runs the tool handler and finalizes its response\n */\n const callEntityTool = async ({\n input,\n item,\n serverContext,\n }: {\n input: unknown\n item: CollectionMCPItem | GlobalMCPItem\n serverContext: ServerContext\n }): Promise<MCPToolResponse> => {\n const entity = item.type === 'collectionTool' ? 'collection' : 'global'\n const slugKey = item.type === 'collectionTool' ? 'collectionSlug' : 'globalSlug'\n const toolInput = (input ?? {}) as Record<string, unknown>\n const slug = toolInput[slugKey] as string | undefined\n\n if (!slug) {\n return {\n content: [\n {\n type: 'text',\n text: `Error: \"${item.mcpName}\" requires ${slugKey}. Use getConfigInfo to inspect ${entity} slugs.`,\n },\n ],\n isError: true,\n }\n }\n\n const match = authorizedMCP.items.find(\n (candidate): candidate is CollectionMCPItem | GlobalMCPItem =>\n candidate.type === item.type &&\n candidate.mcpName === item.mcpName &&\n (candidate.type === 'collectionTool'\n ? candidate.collectionSlug === slug\n : candidate.type === 'globalTool' && candidate.globalSlug === slug),\n )\n\n if (!match) {\n return {\n content: [\n {\n type: 'text',\n text: `Error: MCP access to \"${item.mcpName}\" is not enabled for ${entity} \"${slug}\"`,\n },\n ],\n isError: true,\n }\n }\n\n const handlerArgs = {\n authorizedMCP,\n input: toolInput,\n req,\n serverContext,\n }\n const response = await (match.type === 'collectionTool'\n ? match.tool.handler({ ...handlerArgs, collectionSlug: slug })\n : match.tool.handler({ ...handlerArgs, globalSlug: slug }))\n\n return finalizeToolResponse({\n input: toolInput,\n overrideResponse: match.tool.overrideResponse,\n response,\n toolName: match.mcpName,\n })\n }\n\n try {\n const registeredEntityTools = new Set<string>()\n\n for (const item of authorizedMCP.items) {\n switch (item.type) {\n case 'collectionTool':\n case 'globalTool': {\n if (registeredEntityTools.has(item.mcpName)) {\n break\n }\n registeredEntityTools.add(item.mcpName)\n\n const inputSchema = withSlugInput({\n name: item.type === 'collectionTool' ? 'collectionSlug' : 'globalSlug',\n input: item.tool.input,\n })\n\n server.registerTool(\n item.mcpName,\n {\n annotations: item.tool.annotations,\n description: item.tool.description,\n inputSchema: toStandardSchema(inputSchema),\n },\n async (input: unknown, ctx: ServerContext) =>\n callEntityTool({ input, item, serverContext: ctx }),\n )\n logger.info(`✅ Tool: ${item.mcpName} Registered.`)\n break\n }\n case 'prompt': {\n const prompt = item.prompt\n server.registerPrompt(\n item.mcpName,\n {\n argsSchema: prompt.argsSchema ? toStandardSchema(prompt.argsSchema) : undefined,\n description: prompt.description,\n title: prompt.title,\n },\n async (input: unknown, ctx: ServerContext) =>\n prompt.handler({\n input: (input ?? {}) as Record<string, unknown>,\n req,\n serverContext: ctx,\n }),\n )\n logger.info(`✅ Prompt: ${prompt.title} Registered.`)\n break\n }\n case 'resource': {\n const resource = item.resource\n server.registerResource(\n item.mcpName,\n // @ts-expect-error - Overload type ambiguity (string OR ResourceTemplate is valid)\n resource.uri,\n {\n description: resource.description,\n mimeType: resource.mimeType,\n title: resource.title,\n },\n // Static URIs call (uri, ctx); ResourceTemplates call (uri, params, ctx).\n // The rest-params shape lets us collect either signature uniformly.\n async (...sdkArgs: unknown[]) => {\n const ctx = sdkArgs[sdkArgs.length - 1] as ServerContext\n const uri = sdkArgs[0] as URL\n const params = (sdkArgs.length > 2 ? sdkArgs[1] : {}) as Record<string, string>\n return resource.handler({ params, req, serverContext: ctx, uri })\n },\n )\n logger.info(`✅ Resource: ${resource.title} Registered.`)\n break\n }\n case 'tool': {\n const tool = item.tool\n server.registerTool(\n item.mcpName,\n {\n annotations: tool.annotations,\n description: tool.description,\n inputSchema: tool.input ? toStandardSchema(tool.input) : undefined,\n },\n async (input: unknown, ctx: ServerContext) => {\n const toolInput = (input ?? {}) as Record<string, unknown>\n const response = await tool.handler({\n authorizedMCP,\n input: toolInput,\n req,\n serverContext: ctx,\n })\n return finalizeToolResponse({\n input: toolInput,\n overrideResponse: tool.overrideResponse,\n response,\n toolName: item.mcpName,\n })\n },\n )\n logger.info(`✅ Tool: ${item.mcpName} Registered.`)\n break\n }\n }\n }\n } catch (error) {\n throw new APIError(`Error initializing MCP handler: ${String(error)}`, 500)\n }\n\n return server\n}\n\nconst withSlugInput = ({\n name,\n input,\n}: {\n input?: ToolInputSchema\n name: 'collectionSlug' | 'globalSlug'\n}): ToolInputSchema => {\n const description = name === 'collectionSlug' ? 'The collection slug' : 'The global slug'\n const slugSchema = z.string().describe(description)\n\n if (!input) {\n return z.object({ [name]: slugSchema })\n }\n\n if (input instanceof z.ZodObject) {\n return input.extend({ [name]: slugSchema })\n }\n\n const schema = input as {\n properties?: Record<string, JsonSchemaType>\n required?: string[]\n } & JsonSchemaType\n\n return {\n ...schema,\n type: 'object',\n properties: {\n ...schema.properties,\n [name]: {\n type: 'string',\n description,\n },\n },\n required: Array.from(new Set([name, ...(schema.required ?? [])])),\n }\n}\n"],"names":["McpServer","APIError","z","getLogger","toStandardSchema","buildMcpServer","authorizedMCP","pluginConfig","req","serverOptions","mcp","server","name","version","serverInfo","options","logger","payload","finalizeToolResponse","input","overrideResponse","response","toolName","overridden","doc","hook","hooks","afterToolCall","_doc","rest","callEntityTool","item","serverContext","entity","type","slugKey","toolInput","slug","content","text","mcpName","isError","match","items","find","candidate","collectionSlug","globalSlug","handlerArgs","tool","handler","registeredEntityTools","Set","has","add","inputSchema","withSlugInput","registerTool","annotations","description","ctx","info","prompt","registerPrompt","argsSchema","undefined","title","resource","registerResource","uri","mimeType","sdkArgs","length","params","error","String","slugSchema","string","describe","object","ZodObject","extend","schema","properties","required","Array","from"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"authTools.d.ts","sourceRoot":"","sources":["../../../../src/mcp/builtin/collections/authTools.ts"],"names":[],"mappings":"AAiCA,eAAO,MAAM,kBAAkB,4CAoC7B,CAAA;AAEF,eAAO,MAAM,4BAA4B,4CAgCvC,CAAA;AAEF,eAAO,MAAM,mBAAmB,4CA0C9B,CAAA;AAEF,eAAO,MAAM,2BAA2B,4CA4BtC,CAAA;AAEF,eAAO,MAAM,oBAAoB,4CAyB/B,CAAA;AAEF,eAAO,MAAM,oBAAoB,4CA0B/B,CAAA"}
1
+ {"version":3,"file":"authTools.d.ts","sourceRoot":"","sources":["../../../../src/mcp/builtin/collections/authTools.ts"],"names":[],"mappings":"AAiCA,eAAO,MAAM,kBAAkB,4CAqC7B,CAAA;AAEF,eAAO,MAAM,4BAA4B,4CAuCvC,CAAA;AAEF,eAAO,MAAM,mBAAmB,4CAiD9B,CAAA;AAEF,eAAO,MAAM,2BAA2B,4CAmCtC,CAAA;AAEF,eAAO,MAAM,oBAAoB,4CAgC/B,CAAA;AAEF,eAAO,MAAM,oBAAoB,4CAiC/B,CAAA"}