@strapi/upload 5.52.3 → 5.54.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/future/components/Drawer.js +6 -3
- package/dist/admin/future/components/Drawer.js.map +1 -1
- package/dist/admin/future/components/Drawer.mjs +6 -3
- package/dist/admin/future/components/Drawer.mjs.map +1 -1
- package/dist/admin/future/components/UploadProgressDialog.js +9 -8
- package/dist/admin/future/components/UploadProgressDialog.js.map +1 -1
- package/dist/admin/future/components/UploadProgressDialog.mjs +9 -8
- package/dist/admin/future/components/UploadProgressDialog.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/AssetsPage.js +16 -4
- package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
- package/dist/admin/future/pages/Assets/AssetsPage.mjs +16 -4
- package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js +5 -0
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs +5 -0
- package/dist/admin/future/pages/Assets/components/AssetActionsMenu.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js +19 -4
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs +19 -4
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetCropEditor.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +35 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs +35 -1
- package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js +10 -0
- package/dist/admin/future/pages/Assets/components/AssetsGrid.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs +10 -0
- package/dist/admin/future/pages/Assets/components/AssetsGrid.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.js +9 -0
- package/dist/admin/future/pages/Assets/components/AssetsTable.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs +10 -1
- package/dist/admin/future/pages/Assets/components/AssetsTable.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js +132 -88
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs +135 -91
- package/dist/admin/future/pages/Assets/components/BulkActionsBar.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js +7 -0
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs +7 -0
- package/dist/admin/future/pages/Assets/components/Dnd/AssetsDndProvider.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js +4 -1
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.js.map +1 -1
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs +4 -1
- package/dist/admin/future/pages/Assets/components/Dnd/DragOverlayChip.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/components/MainAreaContextMenu.js +181 -0
- package/dist/admin/future/pages/Assets/components/MainAreaContextMenu.js.map +1 -0
- package/dist/admin/future/pages/Assets/components/MainAreaContextMenu.mjs +179 -0
- package/dist/admin/future/pages/Assets/components/MainAreaContextMenu.mjs.map +1 -0
- package/dist/admin/future/pages/Assets/constants.js +22 -0
- package/dist/admin/future/pages/Assets/constants.js.map +1 -1
- package/dist/admin/future/pages/Assets/constants.mjs +19 -1
- package/dist/admin/future/pages/Assets/constants.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js +65 -10
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.js.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs +66 -11
- package/dist/admin/future/pages/Assets/hooks/useInfiniteAssets.mjs.map +1 -1
- package/dist/admin/future/pages/Assets/hooks/useListScrollRestoration.js +111 -0
- package/dist/admin/future/pages/Assets/hooks/useListScrollRestoration.js.map +1 -0
- package/dist/admin/future/pages/Assets/hooks/useListScrollRestoration.mjs +109 -0
- package/dist/admin/future/pages/Assets/hooks/useListScrollRestoration.mjs.map +1 -0
- package/dist/admin/future/services/api.js +17 -0
- package/dist/admin/future/services/api.js.map +1 -1
- package/dist/admin/future/services/api.mjs +18 -1
- package/dist/admin/future/services/api.mjs.map +1 -1
- package/dist/admin/future/store/uploadProgress.js +31 -22
- package/dist/admin/future/store/uploadProgress.js.map +1 -1
- package/dist/admin/future/store/uploadProgress.mjs +31 -22
- package/dist/admin/future/store/uploadProgress.mjs.map +1 -1
- package/dist/admin/index.js +11 -10
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +11 -10
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/src/future/components/Drawer.d.ts +10 -0
- package/dist/admin/src/future/pages/Assets/components/MainAreaContextMenu.d.ts +28 -0
- package/dist/admin/src/future/pages/Assets/constants.d.ts +20 -0
- package/dist/admin/src/future/pages/Assets/hooks/useInfiniteAssets.d.ts +4 -0
- package/dist/admin/src/future/pages/Assets/hooks/useListScrollRestoration.d.ts +15 -0
- package/dist/admin/src/future/store/uploadProgress.d.ts +14 -20
- package/dist/admin/translations/en.json.js +1 -3
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +1 -3
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/server/bootstrap.js +11 -0
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs +11 -0
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/controllers/admin-upload.js +31 -1
- package/dist/server/controllers/admin-upload.js.map +1 -1
- package/dist/server/controllers/admin-upload.mjs +31 -1
- package/dist/server/controllers/admin-upload.mjs.map +1 -1
- package/dist/server/controllers/utils/find-entity-and-check-permissions.js +15 -4
- package/dist/server/controllers/utils/find-entity-and-check-permissions.js.map +1 -1
- package/dist/server/controllers/utils/find-entity-and-check-permissions.mjs +15 -4
- package/dist/server/controllers/utils/find-entity-and-check-permissions.mjs.map +1 -1
- package/dist/server/controllers/utils/folders.js +1 -1
- package/dist/server/controllers/utils/folders.js.map +1 -1
- package/dist/server/controllers/utils/folders.mjs +1 -1
- package/dist/server/controllers/utils/folders.mjs.map +1 -1
- package/dist/server/mcp/ambient-instance.js +46 -0
- package/dist/server/mcp/ambient-instance.js.map +1 -0
- package/dist/server/mcp/ambient-instance.mjs +43 -0
- package/dist/server/mcp/ambient-instance.mjs.map +1 -0
- package/dist/server/mcp/handlers/constants.js +60 -0
- package/dist/server/mcp/handlers/constants.js.map +1 -0
- package/dist/server/mcp/handlers/constants.mjs +45 -0
- package/dist/server/mcp/handlers/constants.mjs.map +1 -0
- package/dist/server/mcp/handlers/folder-handlers.js +308 -0
- package/dist/server/mcp/handlers/folder-handlers.js.map +1 -0
- package/dist/server/mcp/handlers/folder-handlers.mjs +303 -0
- package/dist/server/mcp/handlers/folder-handlers.mjs.map +1 -0
- package/dist/server/mcp/handlers/read-handlers.js +134 -0
- package/dist/server/mcp/handlers/read-handlers.js.map +1 -0
- package/dist/server/mcp/handlers/read-handlers.mjs +130 -0
- package/dist/server/mcp/handlers/read-handlers.mjs.map +1 -0
- package/dist/server/mcp/handlers/write-handlers.js +315 -0
- package/dist/server/mcp/handlers/write-handlers.js.map +1 -0
- package/dist/server/mcp/handlers/write-handlers.mjs +311 -0
- package/dist/server/mcp/handlers/write-handlers.mjs.map +1 -0
- package/dist/server/mcp/permissions.js +36 -0
- package/dist/server/mcp/permissions.js.map +1 -0
- package/dist/server/mcp/permissions.mjs +33 -0
- package/dist/server/mcp/permissions.mjs.map +1 -0
- package/dist/server/mcp/register-upload-mcp-tools.js +235 -0
- package/dist/server/mcp/register-upload-mcp-tools.js.map +1 -0
- package/dist/server/mcp/register-upload-mcp-tools.mjs +232 -0
- package/dist/server/mcp/register-upload-mcp-tools.mjs.map +1 -0
- package/dist/server/mcp/sanitizers/sanitize-media.js +97 -0
- package/dist/server/mcp/sanitizers/sanitize-media.js.map +1 -0
- package/dist/server/mcp/sanitizers/sanitize-media.mjs +93 -0
- package/dist/server/mcp/sanitizers/sanitize-media.mjs.map +1 -0
- package/dist/server/mcp/schemas/input-schemas.js +206 -0
- package/dist/server/mcp/schemas/input-schemas.js.map +1 -0
- package/dist/server/mcp/schemas/input-schemas.mjs +190 -0
- package/dist/server/mcp/schemas/input-schemas.mjs.map +1 -0
- package/dist/server/mcp/schemas/output-schemas.js +158 -0
- package/dist/server/mcp/schemas/output-schemas.js.map +1 -0
- package/dist/server/mcp/schemas/output-schemas.mjs +142 -0
- package/dist/server/mcp/schemas/output-schemas.mjs.map +1 -0
- package/dist/server/mcp/utils.js +14 -0
- package/dist/server/mcp/utils.js.map +1 -0
- package/dist/server/mcp/utils.mjs +12 -0
- package/dist/server/mcp/utils.mjs.map +1 -0
- package/dist/server/media-library-default-notice.js +42 -0
- package/dist/server/media-library-default-notice.js.map +1 -0
- package/dist/server/media-library-default-notice.mjs +40 -0
- package/dist/server/media-library-default-notice.mjs.map +1 -0
- package/dist/server/register.js +5 -0
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs +5 -0
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/services/folder.js.map +1 -1
- package/dist/server/services/folder.mjs.map +1 -1
- package/dist/server/services/upload.js +34 -10
- package/dist/server/services/upload.js.map +1 -1
- package/dist/server/services/upload.mjs +34 -10
- package/dist/server/services/upload.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-upload.d.ts +1 -0
- package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
- package/dist/server/src/controllers/utils/find-entity-and-check-permissions.d.ts +14 -1
- package/dist/server/src/controllers/utils/find-entity-and-check-permissions.d.ts.map +1 -1
- package/dist/server/src/controllers/utils/folders.d.ts +2 -1
- package/dist/server/src/controllers/utils/folders.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +10 -2
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/mcp/ambient-instance.d.ts +65 -0
- package/dist/server/src/mcp/ambient-instance.d.ts.map +1 -0
- package/dist/server/src/mcp/handlers/constants.d.ts +48 -0
- package/dist/server/src/mcp/handlers/constants.d.ts.map +1 -0
- package/dist/server/src/mcp/handlers/folder-handlers.d.ts +49 -0
- package/dist/server/src/mcp/handlers/folder-handlers.d.ts.map +1 -0
- package/dist/server/src/mcp/handlers/index.d.ts +5 -0
- package/dist/server/src/mcp/handlers/index.d.ts.map +1 -0
- package/dist/server/src/mcp/handlers/read-handlers.d.ts +35 -0
- package/dist/server/src/mcp/handlers/read-handlers.d.ts.map +1 -0
- package/dist/server/src/mcp/handlers/write-handlers.d.ts +66 -0
- package/dist/server/src/mcp/handlers/write-handlers.d.ts.map +1 -0
- package/dist/server/src/mcp/index.d.ts +3 -0
- package/dist/server/src/mcp/index.d.ts.map +1 -0
- package/dist/server/src/mcp/permissions.d.ts +22 -0
- package/dist/server/src/mcp/permissions.d.ts.map +1 -0
- package/dist/server/src/mcp/register-upload-mcp-tools.d.ts +29 -0
- package/dist/server/src/mcp/register-upload-mcp-tools.d.ts.map +1 -0
- package/dist/server/src/mcp/sanitizers/sanitize-media.d.ts +63 -0
- package/dist/server/src/mcp/sanitizers/sanitize-media.d.ts.map +1 -0
- package/dist/server/src/mcp/schemas/index.d.ts +3 -0
- package/dist/server/src/mcp/schemas/index.d.ts.map +1 -0
- package/dist/server/src/mcp/schemas/input-schemas.d.ts +148 -0
- package/dist/server/src/mcp/schemas/input-schemas.d.ts.map +1 -0
- package/dist/server/src/mcp/schemas/output-schemas.d.ts +276 -0
- package/dist/server/src/mcp/schemas/output-schemas.d.ts.map +1 -0
- package/dist/server/src/mcp/types.d.ts +19 -0
- package/dist/server/src/mcp/types.d.ts.map +1 -0
- package/dist/server/src/mcp/utils.d.ts +4 -0
- package/dist/server/src/mcp/utils.d.ts.map +1 -0
- package/dist/server/src/media-library-default-notice.d.ts +19 -0
- package/dist/server/src/media-library-default-notice.d.ts.map +1 -0
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/services/folder.d.ts +6 -2
- package/dist/server/src/services/folder.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +10 -2
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/upload.d.ts +10 -1
- package/dist/server/src/services/upload.d.ts.map +1 -1
- package/dist/server/src/types.d.ts +2 -2
- package/dist/server/src/types.d.ts.map +1 -1
- package/dist/server/src/utils/index.d.ts +2 -1
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/server/utils/index.js +2 -2
- package/dist/server/utils/index.js.map +1 -1
- package/dist/server/utils/index.mjs +2 -2
- package/dist/server/utils/index.mjs.map +1 -1
- package/dist/shared/contracts/files.d.ts +22 -0
- package/dist/shared/contracts/files.d.ts.map +1 -1
- package/package.json +7 -6
- package/dist/admin/future/components/BetaNotice.js +0 -72
- package/dist/admin/future/components/BetaNotice.js.map +0 -1
- package/dist/admin/future/components/BetaNotice.mjs +0 -70
- package/dist/admin/future/components/BetaNotice.mjs.map +0 -1
- package/dist/admin/src/future/components/BetaNotice.d.ts +0 -11
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import type { Core, Modules } from '@strapi/types';
|
|
2
|
+
/**
|
|
3
|
+
* `media_update_asset` — edits the writable metadata of one asset.
|
|
4
|
+
*
|
|
5
|
+
* Gated on `plugin::upload.assets.update` and mirrors `PUT /upload/files/:id`: the same
|
|
6
|
+
* `findEntityAndCheckPermissions` row-level check, the same `updateFileInfo` service call, and
|
|
7
|
+
* the same `updatedBy` attribution from the session user.
|
|
8
|
+
*
|
|
9
|
+
* The response carries the updated asset through the read sanitizer, so a client can confirm
|
|
10
|
+
* the write without a second `media_get_asset` round-trip — and so provider fields stay
|
|
11
|
+
* invisible on the write path too.
|
|
12
|
+
*/
|
|
13
|
+
export declare const createMediaUpdateAssetHandler: (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) => ({ args, }: {
|
|
14
|
+
args: Record<string, unknown>;
|
|
15
|
+
}) => Promise<Modules.MCP.McpToolHandlerReturn>;
|
|
16
|
+
/**
|
|
17
|
+
* `media_move_assets` — moves assets between folders in bulk.
|
|
18
|
+
*
|
|
19
|
+
* Bulk with a per-id report, rather than all-or-nothing: an agent reorganising a library moves
|
|
20
|
+
* many assets at once, and one bad id among good ones must not discard the valid moves. Each
|
|
21
|
+
* asset is moved on its own, so a failure is confined to its own id and the response says exactly
|
|
22
|
+
* which ids to retry.
|
|
23
|
+
*
|
|
24
|
+
* That is why this does not reuse the admin `/actions/bulk-move` controller path, whose single
|
|
25
|
+
* transaction is all-or-nothing by construction (and which also handles folders, out of scope
|
|
26
|
+
* here). It goes through `updateFileInfo` instead — the same service `media_update_asset` and
|
|
27
|
+
* `PUT /upload/files/:id` use — which sets the `folder` relation, recomputes the private
|
|
28
|
+
* `folderPath`, attributes `updatedBy`, and emits `media.update` per asset. Replicating the
|
|
29
|
+
* controller's raw join-table writes would skip all four.
|
|
30
|
+
*
|
|
31
|
+
* The moves are sequential on purpose. Each one writes the join table and `folderPath` for its
|
|
32
|
+
* asset, and a bounded reorganisation (100 ids max, per the input schema) is not worth the
|
|
33
|
+
* connection-pool contention of firing them in parallel.
|
|
34
|
+
*/
|
|
35
|
+
export declare const createMediaMoveAssetsHandler: (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) => ({ args, }: {
|
|
36
|
+
args: Record<string, unknown>;
|
|
37
|
+
}) => Promise<Modules.MCP.McpToolHandlerReturn>;
|
|
38
|
+
/**
|
|
39
|
+
* `media_delete_assets` — previews or performs the permanent deletion of assets, in bulk.
|
|
40
|
+
*
|
|
41
|
+
* Two branches behind one tool, for the same reason as `media_delete_folder`: the preview and the
|
|
42
|
+
* deletion must agree on what would be destroyed, and splitting them across tools would both let
|
|
43
|
+
* the two drift apart and let an agent reach the destructive one without ever seeing a preview.
|
|
44
|
+
* `dryRun` defaults to true (see the input schema), so omitting the flag previews and deleting
|
|
45
|
+
* takes an explicit `dryRun: false`.
|
|
46
|
+
*
|
|
47
|
+
* Per-id, not all-or-nothing — the opposite of `media_delete_folder`, on purpose. A folder delete
|
|
48
|
+
* cascades, so a mixed id list there is refused outright rather than half-applied over an unknown
|
|
49
|
+
* amount of content. Here each id is exactly one asset, the blast radius of a bad one is nil, and
|
|
50
|
+
* the requirement is explicit: a bad id among good ones must not discard the valid deletions.
|
|
51
|
+
* The dry run reports the same per-id split, so an agent sees which ids will not resolve *before*
|
|
52
|
+
* anything is destroyed rather than after.
|
|
53
|
+
*
|
|
54
|
+
* This does not reuse `file.deleteByIds` (the admin `/actions/bulk-delete` path). That helper
|
|
55
|
+
* fires `upload.remove` under a single `Promise.all`, so the first rejection discards the report
|
|
56
|
+
* of everything already deleted — unrecoverable for an operation with no undo. The removals are
|
|
57
|
+
* driven one at a time here instead, through the same `upload.remove` service, which deletes the
|
|
58
|
+
* provider file and every generated format, emits `media.delete`, and then deletes the row.
|
|
59
|
+
*
|
|
60
|
+
* The deletions are sequential on purpose: each one performs provider I/O, and a bounded batch
|
|
61
|
+
* (100 ids max, per the input schema) is not worth firing at a provider in parallel.
|
|
62
|
+
*/
|
|
63
|
+
export declare const createMediaDeleteAssetsHandler: (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext) => ({ args, }: {
|
|
64
|
+
args: Record<string, unknown>;
|
|
65
|
+
}) => Promise<Modules.MCP.McpToolHandlerReturn>;
|
|
66
|
+
//# sourceMappingURL=write-handlers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-handlers.d.ts","sourceRoot":"","sources":["../../../../../server/src/mcp/handlers/write-handlers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAiEnD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,6BAA6B,GACxC,QAAQ,IAAI,CAAC,MAAM,EACnB,SAAS,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAIxB,WAEX;IACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CA4C7C,CAAC;AA8BF;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,4BAA4B,GACvC,QAAQ,IAAI,CAAC,MAAM,EACnB,SAAS,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAIxB,WAEX;IACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAgF7C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,8BAA8B,GACzC,QAAQ,IAAI,CAAC,MAAM,EACnB,SAAS,OAAO,CAAC,GAAG,CAAC,iBAAiB,MAIxB,WAEX;IACD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAmF7C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../server/src/mcp/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,6BAA6B,EAAE,MAAM,6BAA6B,CAAC;AACpG,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { Core, Modules } from '@strapi/types';
|
|
2
|
+
/**
|
|
3
|
+
* Builds an admin permissions manager for a media model bound to the MCP session's ability.
|
|
4
|
+
*
|
|
5
|
+
* MCP tool handlers have no Koa context, so they cannot rely on route policies: each handler must
|
|
6
|
+
* re-check permissions itself, exactly as the admin controllers do via `ctx.state.userAbility`.
|
|
7
|
+
* The declarative `auth.policies` on a tool definition already gates registration and invocation;
|
|
8
|
+
* this second check is what keeps a handler safe if it is ever called from another entry point.
|
|
9
|
+
*
|
|
10
|
+
* It is also the only check bound to a model. `plugin::upload.read` is registered in the
|
|
11
|
+
* `plugins` section with no subject (see the upload plugin bootstrap), so a tool's policies
|
|
12
|
+
* carry an action only — a subject-less grant registers as CASL `subject: 'all'`. Passing a
|
|
13
|
+
* model UID as the policy subject is rejected by the admin-token validation, so the file /
|
|
14
|
+
* folder distinction is enforced here, where the permissions manager is bound to the UID.
|
|
15
|
+
*/
|
|
16
|
+
export declare const createMediaPermissionsManager: (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext, action: string, model: string) => any;
|
|
17
|
+
/**
|
|
18
|
+
* Throws `ForbiddenError` unless the session's ability permits `action` on `model`.
|
|
19
|
+
* Mirrors the `if (!pm.isAllowed) return ctx.forbidden()` guard in the admin controllers.
|
|
20
|
+
*/
|
|
21
|
+
export declare const assertMediaPermission: (strapi: Core.Strapi, context: Modules.MCP.McpHandlerContext, action: string, model: string) => any;
|
|
22
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../../server/src/mcp/permissions.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AAEnD;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,6BAA6B,GACxC,QAAQ,IAAI,CAAC,MAAM,EACnB,SAAS,OAAO,CAAC,GAAG,CAAC,iBAAiB,EACtC,QAAQ,MAAM,EACd,OAAO,MAAM,QAMX,CAAC;AAEL;;;GAGG;AACH,eAAO,MAAM,qBAAqB,GAChC,QAAQ,IAAI,CAAC,MAAM,EACnB,SAAS,OAAO,CAAC,GAAG,CAAC,iBAAiB,EACtC,QAAQ,MAAM,EACd,OAAO,MAAM,QASd,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { Core } from '@strapi/types';
|
|
2
|
+
import type { UploadMcpTool } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* The Media Library MCP tools.
|
|
5
|
+
*
|
|
6
|
+
* Folder writes inherit the same `plugin::upload.assets.update` action rather than introducing a
|
|
7
|
+
* folder-specific one, matching what the admin UI enforces today. MCP-specific folder RBAC is
|
|
8
|
+
* out of scope.
|
|
9
|
+
*
|
|
10
|
+
* Renaming and moving are separate tools for both objects — rename/update changes attributes,
|
|
11
|
+
* move changes location — so an agent selects by intent instead of assembling a combined patch.
|
|
12
|
+
*
|
|
13
|
+
* The asset and folder tools stay separate for both move and delete, even though
|
|
14
|
+
* `/actions/bulk-move` accepts both id lists at once and `/actions/bulk-delete` accepts `fileIds`
|
|
15
|
+
* and `folderIds` together. Asset ids and folder ids are indistinguishable integers from separate
|
|
16
|
+
* namespaces, and both `media_list_assets` and `media_list_folders` return a plain `id`, so a
|
|
17
|
+
* combined tool would let an agent pass folder ids where assets were meant with nothing to
|
|
18
|
+
* object. On the delete side that mistake is unrecoverable, and two tools also let each
|
|
19
|
+
* description carry the warning matched to its own blast radius.
|
|
20
|
+
*/
|
|
21
|
+
export declare const buildUploadMcpToolDefinitions: () => UploadMcpTool[];
|
|
22
|
+
/**
|
|
23
|
+
* Registers the Media Library MCP tools via `strapi.ai.mcp.registerTool()`.
|
|
24
|
+
* Must be called from the plugin register phase, before the MCP HTTP server starts.
|
|
25
|
+
*/
|
|
26
|
+
export declare const registerUploadMcpTools: ({ strapi }: {
|
|
27
|
+
strapi: Core.Strapi;
|
|
28
|
+
}) => void;
|
|
29
|
+
//# sourceMappingURL=register-upload-mcp-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register-upload-mcp-tools.d.ts","sourceRoot":"","sources":["../../../../server/src/mcp/register-upload-mcp-tools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAG1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAmC7C;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,6BAA6B,QAAO,aAAa,EAiH7D,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAAI,YAAY;IAAE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAA;CAAE,KAAG,IAO5E,CAAC"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import type { MediaFolderNode } from '../schemas';
|
|
2
|
+
type RawFolder = {
|
|
3
|
+
id?: unknown;
|
|
4
|
+
name?: unknown;
|
|
5
|
+
children?: unknown;
|
|
6
|
+
};
|
|
7
|
+
type RawAsset = Record<string, unknown> & {
|
|
8
|
+
folder?: RawFolder | null;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Projects a raw file row onto the MCP asset shape.
|
|
12
|
+
*
|
|
13
|
+
* This is an allowlist: every exposed key is named explicitly, so `provider`,
|
|
14
|
+
* `provider_metadata` (which can carry provider credentials), `hash`, `formats`, `related`,
|
|
15
|
+
* and the private `folderPath` never reach an MCP client — including after new fields are
|
|
16
|
+
* added to the file content-type.
|
|
17
|
+
*/
|
|
18
|
+
export declare const sanitizeMediaAsset: (asset: RawAsset) => {
|
|
19
|
+
id: number;
|
|
20
|
+
name: string;
|
|
21
|
+
alternativeText: string | null;
|
|
22
|
+
caption: string | null;
|
|
23
|
+
url: string;
|
|
24
|
+
mime: string;
|
|
25
|
+
size: number;
|
|
26
|
+
width: number | null;
|
|
27
|
+
height: number | null;
|
|
28
|
+
ext: string | null;
|
|
29
|
+
folder: {
|
|
30
|
+
id: number;
|
|
31
|
+
name: string;
|
|
32
|
+
} | null;
|
|
33
|
+
createdAt: string | null;
|
|
34
|
+
updatedAt: string | null;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Projects the recursive output of `folder.getStructure()` onto `{ id, name, children }`,
|
|
38
|
+
* dropping `path` and `pathId` (internal materialized-path bookkeeping).
|
|
39
|
+
*/
|
|
40
|
+
export declare const sanitizeMediaFolderTree: (nodes: unknown) => MediaFolderNode[];
|
|
41
|
+
/**
|
|
42
|
+
* Projects a raw folder row onto the MCP folder shape.
|
|
43
|
+
*
|
|
44
|
+
* An allowlist for the same reason as `sanitizeMediaAsset`: `path` and `pathId` are the internal
|
|
45
|
+
* materialized-path bookkeeping the folder service uses to cascade moves and deletes. Exposing
|
|
46
|
+
* them would invite an agent to treat them as addressable, and any field added to the folder
|
|
47
|
+
* content-type later stays invisible until it is named here on purpose.
|
|
48
|
+
*/
|
|
49
|
+
export declare const sanitizeMediaFolder: (folder: (RawFolder & Record<string, unknown>) | null | undefined) => {
|
|
50
|
+
createdAt: string | null;
|
|
51
|
+
updatedAt: string | null;
|
|
52
|
+
parent?: {
|
|
53
|
+
id: number;
|
|
54
|
+
name?: undefined;
|
|
55
|
+
} | {
|
|
56
|
+
id: number;
|
|
57
|
+
name: string;
|
|
58
|
+
} | null | undefined;
|
|
59
|
+
id: number;
|
|
60
|
+
name: string;
|
|
61
|
+
} | null;
|
|
62
|
+
export {};
|
|
63
|
+
//# sourceMappingURL=sanitize-media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sanitize-media.d.ts","sourceRoot":"","sources":["../../../../../server/src/mcp/sanitizers/sanitize-media.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,KAAK,SAAS,GAAG;IACf,EAAE,CAAC,EAAE,OAAO,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;AAEF,KAAK,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IACxC,MAAM,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CAC3B,CAAC;AAeF;;;;;;;GAOG;AACH,eAAO,MAAM,kBAAkB,GAAI,OAAO,QAAQ;;;;;;;;;;;;;;;;;CAqBjD,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,GAAI,OAAO,OAAO,KAAG,eAAe,EAQvE,CAAC;AAEF;;;;;;;GAOG;AACH,eAAO,MAAM,mBAAmB,GAC9B,QAAQ,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS;;;;;;;;;;;;QA+BjE,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { mediaIdSchema, folderIdSchema, folderNameSchema, pageSchema, pageSizeSchema, sortSchema, mediaListAssetsInputSchema, mediaGetAssetInputSchema, mediaListFoldersInputSchema, mediaUpdateAssetInputSchema, mediaCreateFolderInputSchema, mediaRenameFolderInputSchema, mediaMoveFolderInputSchema, mediaDeleteFolderInputSchema, mediaMoveAssetsInputSchema, mediaDeleteAssetsInputSchema, } from './input-schemas';
|
|
2
|
+
export { mediaAssetOutputSchema, mediaGetAssetOutputSchema, mediaListAssetsOutputSchema, mediaFolderNodeSchema, mediaListFoldersOutputSchema, mediaUpdateAssetOutputSchema, mediaFolderOutputSchema, mediaCreateFolderOutputSchema, mediaRenameFolderOutputSchema, mediaMoveFolderOutputSchema, mediaDeleteFolderOutputSchema, mediaMoveAssetsFailureSchema, mediaMoveAssetsOutputSchema, mediaDeleteAssetsFailureSchema, mediaDeleteAssetsOutputSchema, type MediaFolderNode, } from './output-schemas';
|
|
3
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../server/src/mcp/schemas/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,UAAU,EACV,cAAc,EACd,UAAU,EACV,0BAA0B,EAC1B,wBAAwB,EACxB,2BAA2B,EAC3B,2BAA2B,EAC3B,4BAA4B,EAC5B,4BAA4B,EAC5B,0BAA0B,EAC1B,4BAA4B,EAC5B,0BAA0B,EAC1B,4BAA4B,GAC7B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,sBAAsB,EACtB,yBAAyB,EACzB,2BAA2B,EAC3B,qBAAqB,EACrB,4BAA4B,EAC5B,4BAA4B,EAC5B,uBAAuB,EACvB,6BAA6B,EAC7B,6BAA6B,EAC7B,2BAA2B,EAC3B,6BAA6B,EAC7B,4BAA4B,EAC5B,2BAA2B,EAC3B,8BAA8B,EAC9B,6BAA6B,EAC7B,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { z } from '@strapi/utils';
|
|
2
|
+
/**
|
|
3
|
+
* Media files and folders are NOT documents: they are plain entities keyed by a numeric `id`,
|
|
4
|
+
* so there is no `documentId` and no draft/published pair. Every media identifier in the MCP
|
|
5
|
+
* surface is this numeric id.
|
|
6
|
+
*/
|
|
7
|
+
export declare const mediaIdSchema: z.ZodNumber;
|
|
8
|
+
export declare const folderIdSchema: z.ZodNumber;
|
|
9
|
+
export declare const pageSchema: z.ZodOptional<z.ZodNumber>;
|
|
10
|
+
export declare const pageSizeSchema: z.ZodOptional<z.ZodNumber>;
|
|
11
|
+
/**
|
|
12
|
+
* Sort is constrained to the same whitelist the Media Library admin uses, so MCP callers
|
|
13
|
+
* cannot sort by private columns such as `folderPath`.
|
|
14
|
+
*/
|
|
15
|
+
export declare const sortSchema: z.ZodOptional<z.ZodEnum<{
|
|
16
|
+
[x: string]: string;
|
|
17
|
+
}>>;
|
|
18
|
+
export declare const mediaListAssetsInputSchema: z.ZodObject<{
|
|
19
|
+
folderId: z.ZodNullable<z.ZodOptional<z.ZodNumber>>;
|
|
20
|
+
mime: z.ZodOptional<z.ZodString>;
|
|
21
|
+
name: z.ZodOptional<z.ZodString>;
|
|
22
|
+
page: z.ZodOptional<z.ZodNumber>;
|
|
23
|
+
pageSize: z.ZodOptional<z.ZodNumber>;
|
|
24
|
+
sort: z.ZodOptional<z.ZodEnum<{
|
|
25
|
+
[x: string]: string;
|
|
26
|
+
}>>;
|
|
27
|
+
}, z.core.$strip>;
|
|
28
|
+
export declare const mediaGetAssetInputSchema: z.ZodObject<{
|
|
29
|
+
id: z.ZodNumber;
|
|
30
|
+
}, z.core.$strip>;
|
|
31
|
+
export declare const mediaListFoldersInputSchema: z.ZodObject<{}, z.core.$strip>;
|
|
32
|
+
/**
|
|
33
|
+
* `media_update_asset` input — the only writable asset metadata.
|
|
34
|
+
*
|
|
35
|
+
* `.strict()` turns an out-of-scope field into an error rather than a silent no-op. The custom
|
|
36
|
+
* object error directs folder-shaped inputs to `media_move_assets`; other unknown keys are named by
|
|
37
|
+
* Zod's default error, so the agent can correct the call without a round-trip.
|
|
38
|
+
*
|
|
39
|
+
* The "at least one field" rule is enforced in the handler, not here: a `.refine()` would turn
|
|
40
|
+
* this into a `ZodEffects`, which the MCP tool registry cannot expose as an input schema.
|
|
41
|
+
*/
|
|
42
|
+
export declare const mediaUpdateAssetInputSchema: z.ZodObject<{
|
|
43
|
+
id: z.ZodNumber;
|
|
44
|
+
name: z.ZodOptional<z.ZodString>;
|
|
45
|
+
alternativeText: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
46
|
+
caption: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
47
|
+
}, z.core.$strict>;
|
|
48
|
+
/**
|
|
49
|
+
* Folder name, validated to the same rules as the admin folder controller
|
|
50
|
+
* (`controllers/validation/admin/folder.ts`): non-empty, no slashes, no surrounding whitespace.
|
|
51
|
+
*
|
|
52
|
+
* Enforcing the shape here rather than only in the handler means the agent is corrected by the
|
|
53
|
+
* tool schema — before a call is made — instead of by a service-level error afterwards. The
|
|
54
|
+
* uniqueness rule cannot live here: it needs a DB read, so it stays in the handler.
|
|
55
|
+
*/
|
|
56
|
+
export declare const folderNameSchema: z.ZodString;
|
|
57
|
+
export declare const mediaCreateFolderInputSchema: z.ZodObject<{
|
|
58
|
+
name: z.ZodString;
|
|
59
|
+
parent: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
60
|
+
}, z.core.$strict>;
|
|
61
|
+
/**
|
|
62
|
+
* `media_rename_folder` deliberately takes no `parent`: renaming and moving are separate tools, so an
|
|
63
|
+
* agent picks by intent. A `parent` here is a sign the caller wanted `media_move_folder`, and the
|
|
64
|
+
* custom object error says so rather than letting Zod's generic "unrecognized key" stand.
|
|
65
|
+
*/
|
|
66
|
+
export declare const mediaRenameFolderInputSchema: z.ZodObject<{
|
|
67
|
+
id: z.ZodNumber;
|
|
68
|
+
name: z.ZodString;
|
|
69
|
+
}, z.core.$strict>;
|
|
70
|
+
/**
|
|
71
|
+
* `media_move_folder` requires `parent` — including an explicit null for the root. Making it required
|
|
72
|
+
* is what keeps a mistyped move from silently becoming a no-op update.
|
|
73
|
+
*/
|
|
74
|
+
export declare const mediaMoveFolderInputSchema: z.ZodObject<{
|
|
75
|
+
id: z.ZodNumber;
|
|
76
|
+
parent: z.ZodNullable<z.ZodNumber>;
|
|
77
|
+
}, z.core.$strict>;
|
|
78
|
+
/**
|
|
79
|
+
* `media_delete_folder` input.
|
|
80
|
+
*
|
|
81
|
+
* `dryRun` defaults to true: the safe branch is the one an agent gets when it omits the flag, so
|
|
82
|
+
* a destructive cascade is never the path of least resistance (the initiative card's mitigation
|
|
83
|
+
* for irreversible MCP operations). Deleting requires saying `dryRun: false` on purpose.
|
|
84
|
+
*
|
|
85
|
+
* That default lives in the handler (`folder-handlers.ts`, `dryRun = true`), NOT in this schema:
|
|
86
|
+
* `.default(true)` here is deliberately avoided so an omitted flag is a preview no matter how a
|
|
87
|
+
* client serialises the advertised schema. The `.describe()` text below is what tells an agent
|
|
88
|
+
* the default, so the two must be kept in step — do not "fix" this to `.default(true)`.
|
|
89
|
+
*/
|
|
90
|
+
export declare const mediaDeleteFolderInputSchema: z.ZodObject<{
|
|
91
|
+
ids: z.ZodArray<z.ZodNumber>;
|
|
92
|
+
dryRun: z.ZodOptional<z.ZodBoolean>;
|
|
93
|
+
}, z.core.$strict>;
|
|
94
|
+
/**
|
|
95
|
+
* `media_move_assets` input.
|
|
96
|
+
*
|
|
97
|
+
* Bulk by design: an agent reorganising a library moves many assets at once, and one call with a
|
|
98
|
+
* per-id report is cheaper and easier to recover from than N sequential calls. There is no
|
|
99
|
+
* single-asset variant — the array length is the only difference, and a second tool would add a
|
|
100
|
+
* choice without removing a mistake. The admin REST API agrees: `/actions/bulk-move` is the only
|
|
101
|
+
* move route.
|
|
102
|
+
*
|
|
103
|
+
* `folder` is required, including an explicit null for the root, for the same reason `media_move_folder`
|
|
104
|
+
* requires `parent`: a move needs a destination, and an omitted key would silently become a no-op.
|
|
105
|
+
*
|
|
106
|
+
* ASSET ids only, and the schema CANNOT enforce it. Asset ids and folder ids are independently
|
|
107
|
+
* numbered, so the same integer routinely names both; the handler resolves ids in the file table,
|
|
108
|
+
* which means a folder id whose number collides with an asset moves that asset — and reports it
|
|
109
|
+
* as a success. Only an id matching no asset at all is reported as failed.
|
|
110
|
+
*
|
|
111
|
+
* This is an accepted risk, not an oversight: with a bare `ids: number[]` there is no way for the
|
|
112
|
+
* caller to say which namespace it meant, and refusing every colliding id would make those assets
|
|
113
|
+
* permanently unmovable over MCP. The mitigation is the tool description. The durable fix is
|
|
114
|
+
* namespaced handles (`asset:1` / `folder:1`) across the whole media surface, which is a breaking
|
|
115
|
+
* change to the read tools and belongs to its own ticket.
|
|
116
|
+
*/
|
|
117
|
+
export declare const mediaMoveAssetsInputSchema: z.ZodObject<{
|
|
118
|
+
ids: z.ZodArray<z.ZodNumber>;
|
|
119
|
+
folder: z.ZodNullable<z.ZodNumber>;
|
|
120
|
+
}, z.core.$strict>;
|
|
121
|
+
/**
|
|
122
|
+
* `media_delete_assets` input.
|
|
123
|
+
*
|
|
124
|
+
* Bulk-only, like `media_move_assets`: the admin REST API has no single-asset delete route either
|
|
125
|
+
* (`/actions/bulk-delete` is the only one), and single-vs-bulk is an array length rather than a
|
|
126
|
+
* distinction an agent can get wrong.
|
|
127
|
+
*
|
|
128
|
+
* `dryRun` defaults to true in the handler, not here — same reasoning as `media_delete_folder`: the
|
|
129
|
+
* safe branch is what an agent gets when it omits the flag, so an irreversible delete is never
|
|
130
|
+
* the path of least resistance. A schema-level `.default(true)` would publish as a JSON Schema
|
|
131
|
+
* default a client could serialise away.
|
|
132
|
+
*
|
|
133
|
+
* ASSET ids only, and the schema CANNOT enforce it. Asset ids and folder ids are independently
|
|
134
|
+
* numbered, so the same integer routinely names both; the handler resolves ids in the file table,
|
|
135
|
+
* which means a folder id whose number collides with an asset deletes that asset. Only an id
|
|
136
|
+
* matching no asset at all is reported as failed.
|
|
137
|
+
*
|
|
138
|
+
* This is an accepted risk, not an oversight: with a bare `ids: number[]` there is no way for the
|
|
139
|
+
* caller to say which namespace it meant, and refusing every colliding id would make those assets
|
|
140
|
+
* permanently undeletable over MCP. The mitigations are the dry run and the tool description. The
|
|
141
|
+
* durable fix is namespaced handles (`asset:1` / `folder:1`) across the whole media surface, which
|
|
142
|
+
* is a breaking change to the read tools and belongs to its own ticket.
|
|
143
|
+
*/
|
|
144
|
+
export declare const mediaDeleteAssetsInputSchema: z.ZodObject<{
|
|
145
|
+
ids: z.ZodArray<z.ZodNumber>;
|
|
146
|
+
dryRun: z.ZodOptional<z.ZodBoolean>;
|
|
147
|
+
}, z.core.$strict>;
|
|
148
|
+
//# sourceMappingURL=input-schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-schemas.d.ts","sourceRoot":"","sources":["../../../../../server/src/mcp/schemas/input-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAIlC;;;;GAIG;AACH,eAAO,MAAM,aAAa,aAMvB,CAAC;AAEJ,eAAO,MAAM,cAAc,aAIuE,CAAC;AAEnG,eAAO,MAAM,UAAU,4BAK4B,CAAC;AAEpD,eAAO,MAAM,cAAc,4BAM2B,CAAC;AAEvD;;;GAGG;AACH,eAAO,MAAM,UAAU;;GAKpB,CAAC;AAEJ,eAAO,MAAM,0BAA0B;;;;;;;;;iBAsBrC,CAAC;AAEH,eAAO,MAAM,wBAAwB;;iBAEnC,CAAC;AAEH,eAAO,MAAM,2BAA2B,gCAAe,CAAC;AAIxD;;;;;;;;;GASG;AACH,eAAO,MAAM,2BAA2B;;;;;kBAuC7B,CAAC;AAEZ;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,aAO1B,CAAC;AAaJ,eAAO,MAAM,4BAA4B;;;kBAS9B,CAAC;AAEZ;;;;GAIG;AACH,eAAO,MAAM,4BAA4B;;;kBAgB9B,CAAC;AAEZ;;;GAGG;AACH,eAAO,MAAM,0BAA0B;;;kBAgB5B,CAAC;AAEZ;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,4BAA4B;;;kBAgB9B,CAAC;AAEZ;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,0BAA0B;;;kBAiC5B,CAAC;AAEZ;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,eAAO,MAAM,4BAA4B;;;kBAkC9B,CAAC"}
|
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
import { z } from '@strapi/utils';
|
|
2
|
+
/**
|
|
3
|
+
* The exhaustive set of asset fields the MCP surface may expose — an allowlist, for the reasons
|
|
4
|
+
* in `sanitizeMediaAsset`. A field added to the file content-type stays invisible to MCP until
|
|
5
|
+
* it is added both here and there.
|
|
6
|
+
*/
|
|
7
|
+
export declare const mediaAssetOutputSchema: z.ZodObject<{
|
|
8
|
+
id: z.ZodNumber;
|
|
9
|
+
name: z.ZodString;
|
|
10
|
+
alternativeText: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
11
|
+
caption: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
12
|
+
url: z.ZodString;
|
|
13
|
+
mime: z.ZodString;
|
|
14
|
+
size: z.ZodNumber;
|
|
15
|
+
width: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
16
|
+
height: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
17
|
+
ext: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
18
|
+
folder: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
19
|
+
id: z.ZodNumber;
|
|
20
|
+
name: z.ZodString;
|
|
21
|
+
}, z.core.$strip>>>;
|
|
22
|
+
createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
23
|
+
updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
24
|
+
}, z.core.$strip>;
|
|
25
|
+
export declare const mediaGetAssetOutputSchema: z.ZodObject<{
|
|
26
|
+
data: z.ZodNullable<z.ZodObject<{
|
|
27
|
+
id: z.ZodNumber;
|
|
28
|
+
name: z.ZodString;
|
|
29
|
+
alternativeText: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
30
|
+
caption: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
31
|
+
url: z.ZodString;
|
|
32
|
+
mime: z.ZodString;
|
|
33
|
+
size: z.ZodNumber;
|
|
34
|
+
width: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
35
|
+
height: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
36
|
+
ext: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
37
|
+
folder: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
38
|
+
id: z.ZodNumber;
|
|
39
|
+
name: z.ZodString;
|
|
40
|
+
}, z.core.$strip>>>;
|
|
41
|
+
createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
42
|
+
updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
43
|
+
}, z.core.$strip>>;
|
|
44
|
+
}, z.core.$strip>;
|
|
45
|
+
export declare const mediaListAssetsOutputSchema: z.ZodObject<{
|
|
46
|
+
results: z.ZodArray<z.ZodObject<{
|
|
47
|
+
id: z.ZodNumber;
|
|
48
|
+
name: z.ZodString;
|
|
49
|
+
alternativeText: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
50
|
+
caption: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
51
|
+
url: z.ZodString;
|
|
52
|
+
mime: z.ZodString;
|
|
53
|
+
size: z.ZodNumber;
|
|
54
|
+
width: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
55
|
+
height: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
56
|
+
ext: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
57
|
+
folder: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
58
|
+
id: z.ZodNumber;
|
|
59
|
+
name: z.ZodString;
|
|
60
|
+
}, z.core.$strip>>>;
|
|
61
|
+
createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
62
|
+
updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
63
|
+
}, z.core.$strip>>;
|
|
64
|
+
pagination: z.ZodObject<{
|
|
65
|
+
page: z.ZodNumber;
|
|
66
|
+
pageSize: z.ZodNumber;
|
|
67
|
+
pageCount: z.ZodNumber;
|
|
68
|
+
total: z.ZodNumber;
|
|
69
|
+
}, z.core.$strip>;
|
|
70
|
+
}, z.core.$strip>;
|
|
71
|
+
/**
|
|
72
|
+
* Folder tree node. `children` is recursive and unbounded in depth, so it is typed lazily.
|
|
73
|
+
*/
|
|
74
|
+
export type MediaFolderNode = {
|
|
75
|
+
id: number;
|
|
76
|
+
name: string;
|
|
77
|
+
children: MediaFolderNode[];
|
|
78
|
+
};
|
|
79
|
+
export declare const mediaFolderNodeSchema: z.ZodType<MediaFolderNode>;
|
|
80
|
+
export declare const mediaListFoldersOutputSchema: z.ZodObject<{
|
|
81
|
+
data: z.ZodArray<z.ZodType<MediaFolderNode, unknown, z.core.$ZodTypeInternals<MediaFolderNode, unknown>>>;
|
|
82
|
+
}, z.core.$strip>;
|
|
83
|
+
/**
|
|
84
|
+
* `media_update_asset` output — the updated asset in the same shape the read tools return,
|
|
85
|
+
* so an agent can confirm the write without a follow-up `media_get_asset` call.
|
|
86
|
+
*/
|
|
87
|
+
export declare const mediaUpdateAssetOutputSchema: z.ZodObject<{
|
|
88
|
+
data: z.ZodObject<{
|
|
89
|
+
id: z.ZodNumber;
|
|
90
|
+
name: z.ZodString;
|
|
91
|
+
alternativeText: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
92
|
+
caption: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
93
|
+
url: z.ZodString;
|
|
94
|
+
mime: z.ZodString;
|
|
95
|
+
size: z.ZodNumber;
|
|
96
|
+
width: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
97
|
+
height: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
98
|
+
ext: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
99
|
+
folder: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
100
|
+
id: z.ZodNumber;
|
|
101
|
+
name: z.ZodString;
|
|
102
|
+
}, z.core.$strip>>>;
|
|
103
|
+
createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
104
|
+
updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
105
|
+
}, z.core.$strip>;
|
|
106
|
+
}, z.core.$strip>;
|
|
107
|
+
/**
|
|
108
|
+
* A folder as returned by the write tools.
|
|
109
|
+
*
|
|
110
|
+
* Like the asset schema this is an ALLOWLIST: `path` and `pathId` are internal materialized-path
|
|
111
|
+
* bookkeeping and stay invisible to MCP clients, matching what `media_list_folders` already exposes.
|
|
112
|
+
*/
|
|
113
|
+
export declare const mediaFolderOutputSchema: z.ZodObject<{
|
|
114
|
+
id: z.ZodNumber;
|
|
115
|
+
name: z.ZodString;
|
|
116
|
+
parent: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
117
|
+
id: z.ZodNumber;
|
|
118
|
+
name: z.ZodOptional<z.ZodString>;
|
|
119
|
+
}, z.core.$strip>>>;
|
|
120
|
+
createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
121
|
+
updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
122
|
+
}, z.core.$strip>;
|
|
123
|
+
export declare const mediaCreateFolderOutputSchema: z.ZodObject<{
|
|
124
|
+
data: z.ZodObject<{
|
|
125
|
+
id: z.ZodNumber;
|
|
126
|
+
name: z.ZodString;
|
|
127
|
+
parent: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
128
|
+
id: z.ZodNumber;
|
|
129
|
+
name: z.ZodOptional<z.ZodString>;
|
|
130
|
+
}, z.core.$strip>>>;
|
|
131
|
+
createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
132
|
+
updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
133
|
+
}, z.core.$strip>;
|
|
134
|
+
}, z.core.$strip>;
|
|
135
|
+
export declare const mediaRenameFolderOutputSchema: z.ZodObject<{
|
|
136
|
+
data: z.ZodObject<{
|
|
137
|
+
id: z.ZodNumber;
|
|
138
|
+
name: z.ZodString;
|
|
139
|
+
parent: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
140
|
+
id: z.ZodNumber;
|
|
141
|
+
name: z.ZodOptional<z.ZodString>;
|
|
142
|
+
}, z.core.$strip>>>;
|
|
143
|
+
createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
144
|
+
updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
145
|
+
}, z.core.$strip>;
|
|
146
|
+
}, z.core.$strip>;
|
|
147
|
+
export declare const mediaMoveFolderOutputSchema: z.ZodObject<{
|
|
148
|
+
data: z.ZodObject<{
|
|
149
|
+
id: z.ZodNumber;
|
|
150
|
+
name: z.ZodString;
|
|
151
|
+
parent: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
152
|
+
id: z.ZodNumber;
|
|
153
|
+
name: z.ZodOptional<z.ZodString>;
|
|
154
|
+
}, z.core.$strip>>>;
|
|
155
|
+
createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
156
|
+
updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
157
|
+
}, z.core.$strip>;
|
|
158
|
+
}, z.core.$strip>;
|
|
159
|
+
/**
|
|
160
|
+
* `media_delete_folder` output — the same shape for both branches, so an agent reads one contract.
|
|
161
|
+
*
|
|
162
|
+
* `dryRun` echoes which branch ran: on true the counts are what *would* be removed and nothing
|
|
163
|
+
* was touched; on false they are what actually was. Echoing it back means the agent can tell a
|
|
164
|
+
* preview from a completed deletion without tracking what it sent.
|
|
165
|
+
*
|
|
166
|
+
* There is no "skipped ids" field: an id that does not resolve to a folder rejects the whole
|
|
167
|
+
* call, so every id in the request is accounted for by `folders` on any successful response.
|
|
168
|
+
*/
|
|
169
|
+
export declare const mediaDeleteFolderOutputSchema: z.ZodObject<{
|
|
170
|
+
dryRun: z.ZodBoolean;
|
|
171
|
+
folders: z.ZodArray<z.ZodObject<{
|
|
172
|
+
id: z.ZodNumber;
|
|
173
|
+
name: z.ZodString;
|
|
174
|
+
parent: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
175
|
+
id: z.ZodNumber;
|
|
176
|
+
name: z.ZodOptional<z.ZodString>;
|
|
177
|
+
}, z.core.$strip>>>;
|
|
178
|
+
createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
179
|
+
updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
180
|
+
}, z.core.$strip>>;
|
|
181
|
+
totalFolderNumber: z.ZodNumber;
|
|
182
|
+
totalFileNumber: z.ZodNumber;
|
|
183
|
+
}, z.core.$strip>;
|
|
184
|
+
/**
|
|
185
|
+
* `media_move_assets` output — a per-id report rather than a single verdict.
|
|
186
|
+
*
|
|
187
|
+
* A bad id among good ones does not roll back the valid moves (see the handler), so the response
|
|
188
|
+
* has to say which ids moved and which did not: an agent that only learned "the call failed"
|
|
189
|
+
* would either retry moves that already happened or abandon ones that did. `moved` and `failed`
|
|
190
|
+
* together account for every id in the request, on every successful response — including one
|
|
191
|
+
* where `moved` is empty because no id resolved.
|
|
192
|
+
*
|
|
193
|
+
* `moved` carries the full asset in the same shape the read tools return, so the new folder can
|
|
194
|
+
* be confirmed without a follow-up `media_get_asset`.
|
|
195
|
+
*/
|
|
196
|
+
export declare const mediaMoveAssetsFailureSchema: z.ZodObject<{
|
|
197
|
+
id: z.ZodNumber;
|
|
198
|
+
reason: z.ZodString;
|
|
199
|
+
}, z.core.$strip>;
|
|
200
|
+
export declare const mediaMoveAssetsOutputSchema: z.ZodObject<{
|
|
201
|
+
destinationFolder: z.ZodNullable<z.ZodObject<{
|
|
202
|
+
id: z.ZodNumber;
|
|
203
|
+
name: z.ZodOptional<z.ZodString>;
|
|
204
|
+
}, z.core.$strip>>;
|
|
205
|
+
moved: z.ZodArray<z.ZodObject<{
|
|
206
|
+
id: z.ZodNumber;
|
|
207
|
+
name: z.ZodString;
|
|
208
|
+
alternativeText: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
209
|
+
caption: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
210
|
+
url: z.ZodString;
|
|
211
|
+
mime: z.ZodString;
|
|
212
|
+
size: z.ZodNumber;
|
|
213
|
+
width: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
214
|
+
height: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
215
|
+
ext: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
216
|
+
folder: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
217
|
+
id: z.ZodNumber;
|
|
218
|
+
name: z.ZodString;
|
|
219
|
+
}, z.core.$strip>>>;
|
|
220
|
+
createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
221
|
+
updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
222
|
+
}, z.core.$strip>>;
|
|
223
|
+
failed: z.ZodArray<z.ZodObject<{
|
|
224
|
+
id: z.ZodNumber;
|
|
225
|
+
reason: z.ZodString;
|
|
226
|
+
}, z.core.$strip>>;
|
|
227
|
+
}, z.core.$strip>;
|
|
228
|
+
/**
|
|
229
|
+
* `media_delete_assets` output — one contract for both branches, with a per-id account of every
|
|
230
|
+
* requested id.
|
|
231
|
+
*
|
|
232
|
+
* `dryRun` echoes which branch ran: on true `deleted` is what *would* be removed and nothing was
|
|
233
|
+
* touched; on false it is what actually was. Echoing it back means an agent can tell a preview
|
|
234
|
+
* from a completed deletion without tracking what it sent — the difference matters more here
|
|
235
|
+
* than anywhere else in this surface, because one branch is irreversible.
|
|
236
|
+
*
|
|
237
|
+
* `deleted` carries the full asset rather than a bare id, so the agent can report what it
|
|
238
|
+
* destroyed after the row is gone and no read can recover it. On a dry run it is the same shape,
|
|
239
|
+
* which is exactly what makes the preview a confirmation an agent can act on.
|
|
240
|
+
*
|
|
241
|
+
* Unlike `media_delete_folder`, an unresolvable id does NOT reject the call: deletions are performed
|
|
242
|
+
* per asset and reported per id, so a bad id among good ones neither rolls back the valid
|
|
243
|
+
* deletions nor stops them from happening. `deleted` and `failed` together account for every id
|
|
244
|
+
* in the request, on every successful response.
|
|
245
|
+
*/
|
|
246
|
+
export declare const mediaDeleteAssetsFailureSchema: z.ZodObject<{
|
|
247
|
+
id: z.ZodNumber;
|
|
248
|
+
reason: z.ZodString;
|
|
249
|
+
}, z.core.$strip>;
|
|
250
|
+
export declare const mediaDeleteAssetsOutputSchema: z.ZodObject<{
|
|
251
|
+
dryRun: z.ZodBoolean;
|
|
252
|
+
deleted: z.ZodArray<z.ZodObject<{
|
|
253
|
+
id: z.ZodNumber;
|
|
254
|
+
name: z.ZodString;
|
|
255
|
+
alternativeText: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
256
|
+
caption: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
257
|
+
url: z.ZodString;
|
|
258
|
+
mime: z.ZodString;
|
|
259
|
+
size: z.ZodNumber;
|
|
260
|
+
width: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
261
|
+
height: z.ZodOptional<z.ZodNullable<z.ZodNumber>>;
|
|
262
|
+
ext: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
263
|
+
folder: z.ZodOptional<z.ZodNullable<z.ZodObject<{
|
|
264
|
+
id: z.ZodNumber;
|
|
265
|
+
name: z.ZodString;
|
|
266
|
+
}, z.core.$strip>>>;
|
|
267
|
+
createdAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
268
|
+
updatedAt: z.ZodOptional<z.ZodNullable<z.ZodString>>;
|
|
269
|
+
}, z.core.$strip>>;
|
|
270
|
+
failed: z.ZodArray<z.ZodObject<{
|
|
271
|
+
id: z.ZodNumber;
|
|
272
|
+
reason: z.ZodString;
|
|
273
|
+
}, z.core.$strip>>;
|
|
274
|
+
totalFileNumber: z.ZodNumber;
|
|
275
|
+
}, z.core.$strip>;
|
|
276
|
+
//# sourceMappingURL=output-schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"output-schemas.d.ts","sourceRoot":"","sources":["../../../../../server/src/mcp/schemas/output-schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAElC;;;;GAIG;AACH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;iBAqBjC,CAAC;AAEH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;iBAEpC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;iBAQtC,CAAC;AAEH;;GAEG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B,CAAC;AAEF,eAAO,MAAM,qBAAqB,EAAE,CAAC,CAAC,OAAO,CAAC,eAAe,CAM5D,CAAC;AAEF,eAAO,MAAM,4BAA4B;;iBAEvC,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,4BAA4B;;;;;;;;;;;;;;;;;;;iBAEvC,CAAC;AAEH;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB;;;;;;;;;iBAelC,CAAC;AAEH,eAAO,MAAM,6BAA6B;;;;;;;;;;;iBAExC,CAAC;AAEH,eAAO,MAAM,6BAA6B;;;;;;;;;;;iBAExC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;;;;;;;iBAEtC,CAAC;AAEH;;;;;;;;;GASG;AACH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;iBAexC,CAAC;AAEH;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,4BAA4B;;;iBAKvC,CAAC;AAEH,eAAO,MAAM,2BAA2B;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAkBtC,CAAC;AAEH;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,8BAA8B;;;iBAOzC,CAAC;AAEH,eAAO,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;iBAqBxC,CAAC"}
|