@collage-dam/mcp-server 0.1.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.
Files changed (306) hide show
  1. package/.env.example +56 -0
  2. package/CHANGELOG.md +90 -0
  3. package/LICENSE +21 -0
  4. package/README.md +512 -0
  5. package/dist/client.d.ts +497 -0
  6. package/dist/client.d.ts.map +1 -0
  7. package/dist/client.js +1162 -0
  8. package/dist/client.js.map +1 -0
  9. package/dist/conventions/confirmation.d.ts +89 -0
  10. package/dist/conventions/confirmation.d.ts.map +1 -0
  11. package/dist/conventions/confirmation.js +132 -0
  12. package/dist/conventions/confirmation.js.map +1 -0
  13. package/dist/conventions/dry-run/batch-executor.d.ts +36 -0
  14. package/dist/conventions/dry-run/batch-executor.d.ts.map +1 -0
  15. package/dist/conventions/dry-run/batch-executor.js +89 -0
  16. package/dist/conventions/dry-run/batch-executor.js.map +1 -0
  17. package/dist/conventions/dry-run/diff-renderer.d.ts +34 -0
  18. package/dist/conventions/dry-run/diff-renderer.d.ts.map +1 -0
  19. package/dist/conventions/dry-run/diff-renderer.js +158 -0
  20. package/dist/conventions/dry-run/diff-renderer.js.map +1 -0
  21. package/dist/conventions/dry-run/index.d.ts +13 -0
  22. package/dist/conventions/dry-run/index.d.ts.map +1 -0
  23. package/dist/conventions/dry-run/index.js +10 -0
  24. package/dist/conventions/dry-run/index.js.map +1 -0
  25. package/dist/conventions/dry-run/mutating-tool.d.ts +64 -0
  26. package/dist/conventions/dry-run/mutating-tool.d.ts.map +1 -0
  27. package/dist/conventions/dry-run/mutating-tool.js +88 -0
  28. package/dist/conventions/dry-run/mutating-tool.js.map +1 -0
  29. package/dist/conventions/dry-run/summary.d.ts +66 -0
  30. package/dist/conventions/dry-run/summary.d.ts.map +1 -0
  31. package/dist/conventions/dry-run/summary.js +185 -0
  32. package/dist/conventions/dry-run/summary.js.map +1 -0
  33. package/dist/conventions/dry-run/types.d.ts +597 -0
  34. package/dist/conventions/dry-run/types.d.ts.map +1 -0
  35. package/dist/conventions/dry-run/types.js +108 -0
  36. package/dist/conventions/dry-run/types.js.map +1 -0
  37. package/dist/conventions/dry-run/with-dry-run.d.ts +66 -0
  38. package/dist/conventions/dry-run/with-dry-run.d.ts.map +1 -0
  39. package/dist/conventions/dry-run/with-dry-run.js +219 -0
  40. package/dist/conventions/dry-run/with-dry-run.js.map +1 -0
  41. package/dist/conventions/env.d.ts +49 -0
  42. package/dist/conventions/env.d.ts.map +1 -0
  43. package/dist/conventions/env.js +84 -0
  44. package/dist/conventions/env.js.map +1 -0
  45. package/dist/conventions/errors.d.ts +68 -0
  46. package/dist/conventions/errors.d.ts.map +1 -0
  47. package/dist/conventions/errors.js +81 -0
  48. package/dist/conventions/errors.js.map +1 -0
  49. package/dist/conventions/logger.d.ts +28 -0
  50. package/dist/conventions/logger.d.ts.map +1 -0
  51. package/dist/conventions/logger.js +105 -0
  52. package/dist/conventions/logger.js.map +1 -0
  53. package/dist/conventions/pagination.d.ts +37 -0
  54. package/dist/conventions/pagination.d.ts.map +1 -0
  55. package/dist/conventions/pagination.js +53 -0
  56. package/dist/conventions/pagination.js.map +1 -0
  57. package/dist/conventions/rate-limiter.d.ts +54 -0
  58. package/dist/conventions/rate-limiter.d.ts.map +1 -0
  59. package/dist/conventions/rate-limiter.js +143 -0
  60. package/dist/conventions/rate-limiter.js.map +1 -0
  61. package/dist/conventions/response-budget.d.ts +66 -0
  62. package/dist/conventions/response-budget.d.ts.map +1 -0
  63. package/dist/conventions/response-budget.js +89 -0
  64. package/dist/conventions/response-budget.js.map +1 -0
  65. package/dist/conventions/schema-version.d.ts +27 -0
  66. package/dist/conventions/schema-version.d.ts.map +1 -0
  67. package/dist/conventions/schema-version.js +29 -0
  68. package/dist/conventions/schema-version.js.map +1 -0
  69. package/dist/conventions/state-store-redis.d.ts +32 -0
  70. package/dist/conventions/state-store-redis.d.ts.map +1 -0
  71. package/dist/conventions/state-store-redis.js +77 -0
  72. package/dist/conventions/state-store-redis.js.map +1 -0
  73. package/dist/conventions/state-store.d.ts +46 -0
  74. package/dist/conventions/state-store.d.ts.map +1 -0
  75. package/dist/conventions/state-store.js +105 -0
  76. package/dist/conventions/state-store.js.map +1 -0
  77. package/dist/index.d.ts +5 -0
  78. package/dist/index.d.ts.map +1 -0
  79. package/dist/index.js +421 -0
  80. package/dist/index.js.map +1 -0
  81. package/dist/prompts/collection-audit.d.ts +13 -0
  82. package/dist/prompts/collection-audit.d.ts.map +1 -0
  83. package/dist/prompts/collection-audit.js +168 -0
  84. package/dist/prompts/collection-audit.js.map +1 -0
  85. package/dist/prompts/create-distribution.d.ts +15 -0
  86. package/dist/prompts/create-distribution.d.ts.map +1 -0
  87. package/dist/prompts/create-distribution.js +111 -0
  88. package/dist/prompts/create-distribution.js.map +1 -0
  89. package/dist/prompts/helpers.d.ts +20 -0
  90. package/dist/prompts/helpers.d.ts.map +1 -0
  91. package/dist/prompts/helpers.js +53 -0
  92. package/dist/prompts/helpers.js.map +1 -0
  93. package/dist/prompts/library-health-audit.d.ts +13 -0
  94. package/dist/prompts/library-health-audit.d.ts.map +1 -0
  95. package/dist/prompts/library-health-audit.js +131 -0
  96. package/dist/prompts/library-health-audit.js.map +1 -0
  97. package/dist/prompts/usage-insights.d.ts +13 -0
  98. package/dist/prompts/usage-insights.d.ts.map +1 -0
  99. package/dist/prompts/usage-insights.js +98 -0
  100. package/dist/prompts/usage-insights.js.map +1 -0
  101. package/dist/prompts/wrap-prompt-as-tool.d.ts +48 -0
  102. package/dist/prompts/wrap-prompt-as-tool.d.ts.map +1 -0
  103. package/dist/prompts/wrap-prompt-as-tool.js +61 -0
  104. package/dist/prompts/wrap-prompt-as-tool.js.map +1 -0
  105. package/dist/resources/asset-by-id.d.ts +4 -0
  106. package/dist/resources/asset-by-id.d.ts.map +1 -0
  107. package/dist/resources/asset-by-id.js +27 -0
  108. package/dist/resources/asset-by-id.js.map +1 -0
  109. package/dist/resources/collections.d.ts +5 -0
  110. package/dist/resources/collections.d.ts.map +1 -0
  111. package/dist/resources/collections.js +48 -0
  112. package/dist/resources/collections.js.map +1 -0
  113. package/dist/resources/custom-fields.d.ts +4 -0
  114. package/dist/resources/custom-fields.d.ts.map +1 -0
  115. package/dist/resources/custom-fields.js +30 -0
  116. package/dist/resources/custom-fields.js.map +1 -0
  117. package/dist/resources/folders.d.ts +5 -0
  118. package/dist/resources/folders.d.ts.map +1 -0
  119. package/dist/resources/folders.js +73 -0
  120. package/dist/resources/folders.js.map +1 -0
  121. package/dist/resources/helpers.d.ts +17 -0
  122. package/dist/resources/helpers.d.ts.map +1 -0
  123. package/dist/resources/helpers.js +59 -0
  124. package/dist/resources/helpers.js.map +1 -0
  125. package/dist/resources/portals.d.ts +5 -0
  126. package/dist/resources/portals.d.ts.map +1 -0
  127. package/dist/resources/portals.js +81 -0
  128. package/dist/resources/portals.js.map +1 -0
  129. package/dist/resources/recent-and-dashboard.d.ts +5 -0
  130. package/dist/resources/recent-and-dashboard.d.ts.map +1 -0
  131. package/dist/resources/recent-and-dashboard.js +42 -0
  132. package/dist/resources/recent-and-dashboard.js.map +1 -0
  133. package/dist/tools/asset-selection.d.ts +102 -0
  134. package/dist/tools/asset-selection.d.ts.map +1 -0
  135. package/dist/tools/asset-selection.js +133 -0
  136. package/dist/tools/asset-selection.js.map +1 -0
  137. package/dist/tools/audit/audit-folder-structure.d.ts +108 -0
  138. package/dist/tools/audit/audit-folder-structure.d.ts.map +1 -0
  139. package/dist/tools/audit/audit-folder-structure.js +260 -0
  140. package/dist/tools/audit/audit-folder-structure.js.map +1 -0
  141. package/dist/tools/audit/audit-naming-conventions.d.ts +83 -0
  142. package/dist/tools/audit/audit-naming-conventions.d.ts.map +1 -0
  143. package/dist/tools/audit/audit-naming-conventions.js +238 -0
  144. package/dist/tools/audit/audit-naming-conventions.js.map +1 -0
  145. package/dist/tools/audit/audit-tagging-hygiene.d.ts +77 -0
  146. package/dist/tools/audit/audit-tagging-hygiene.d.ts.map +1 -0
  147. package/dist/tools/audit/audit-tagging-hygiene.js +402 -0
  148. package/dist/tools/audit/audit-tagging-hygiene.js.map +1 -0
  149. package/dist/tools/audit/detect-duplicates.d.ts +62 -0
  150. package/dist/tools/audit/detect-duplicates.d.ts.map +1 -0
  151. package/dist/tools/audit/detect-duplicates.js +0 -0
  152. package/dist/tools/audit/detect-duplicates.js.map +1 -0
  153. package/dist/tools/audit/types.d.ts +526 -0
  154. package/dist/tools/audit/types.d.ts.map +1 -0
  155. package/dist/tools/audit/types.js +188 -0
  156. package/dist/tools/audit/types.js.map +1 -0
  157. package/dist/tools/bulk-move-assets.d.ts +78 -0
  158. package/dist/tools/bulk-move-assets.d.ts.map +1 -0
  159. package/dist/tools/bulk-move-assets.js +122 -0
  160. package/dist/tools/bulk-move-assets.js.map +1 -0
  161. package/dist/tools/bulk-normalize-filenames.d.ts +62 -0
  162. package/dist/tools/bulk-normalize-filenames.d.ts.map +1 -0
  163. package/dist/tools/bulk-normalize-filenames.js +237 -0
  164. package/dist/tools/bulk-normalize-filenames.js.map +1 -0
  165. package/dist/tools/bulk-rename-assets.d.ts +79 -0
  166. package/dist/tools/bulk-rename-assets.d.ts.map +1 -0
  167. package/dist/tools/bulk-rename-assets.js +139 -0
  168. package/dist/tools/bulk-rename-assets.js.map +1 -0
  169. package/dist/tools/bulk-tags.d.ts +107 -0
  170. package/dist/tools/bulk-tags.d.ts.map +1 -0
  171. package/dist/tools/bulk-tags.js +220 -0
  172. package/dist/tools/bulk-tags.js.map +1 -0
  173. package/dist/tools/client-adapters.d.ts +76 -0
  174. package/dist/tools/client-adapters.d.ts.map +1 -0
  175. package/dist/tools/client-adapters.js +648 -0
  176. package/dist/tools/client-adapters.js.map +1 -0
  177. package/dist/tools/collection-membership.d.ts +90 -0
  178. package/dist/tools/collection-membership.d.ts.map +1 -0
  179. package/dist/tools/collection-membership.js +195 -0
  180. package/dist/tools/collection-membership.js.map +1 -0
  181. package/dist/tools/create-collection.d.ts +63 -0
  182. package/dist/tools/create-collection.d.ts.map +1 -0
  183. package/dist/tools/create-collection.js +151 -0
  184. package/dist/tools/create-collection.js.map +1 -0
  185. package/dist/tools/create-folder.d.ts +46 -0
  186. package/dist/tools/create-folder.d.ts.map +1 -0
  187. package/dist/tools/create-folder.js +83 -0
  188. package/dist/tools/create-folder.js.map +1 -0
  189. package/dist/tools/create-share-link.d.ts +107 -0
  190. package/dist/tools/create-share-link.d.ts.map +1 -0
  191. package/dist/tools/create-share-link.js +239 -0
  192. package/dist/tools/create-share-link.js.map +1 -0
  193. package/dist/tools/get-asset-details.d.ts +401 -0
  194. package/dist/tools/get-asset-details.d.ts.map +1 -0
  195. package/dist/tools/get-asset-details.js +56 -0
  196. package/dist/tools/get-asset-details.js.map +1 -0
  197. package/dist/tools/get-collection.d.ts +126 -0
  198. package/dist/tools/get-collection.d.ts.map +1 -0
  199. package/dist/tools/get-collection.js +52 -0
  200. package/dist/tools/get-collection.js.map +1 -0
  201. package/dist/tools/get-embed-code.d.ts +195 -0
  202. package/dist/tools/get-embed-code.d.ts.map +1 -0
  203. package/dist/tools/get-embed-code.js +214 -0
  204. package/dist/tools/get-embed-code.js.map +1 -0
  205. package/dist/tools/insights/analyze-share-links.d.ts +159 -0
  206. package/dist/tools/insights/analyze-share-links.d.ts.map +1 -0
  207. package/dist/tools/insights/analyze-share-links.js +314 -0
  208. package/dist/tools/insights/analyze-share-links.js.map +1 -0
  209. package/dist/tools/insights/insight-cache.d.ts +36 -0
  210. package/dist/tools/insights/insight-cache.d.ts.map +1 -0
  211. package/dist/tools/insights/insight-cache.js +98 -0
  212. package/dist/tools/insights/insight-cache.js.map +1 -0
  213. package/dist/tools/insights/report-asset-activation.d.ts +149 -0
  214. package/dist/tools/insights/report-asset-activation.d.ts.map +1 -0
  215. package/dist/tools/insights/report-asset-activation.js +380 -0
  216. package/dist/tools/insights/report-asset-activation.js.map +1 -0
  217. package/dist/tools/insights/report-stale-assets.d.ts +120 -0
  218. package/dist/tools/insights/report-stale-assets.d.ts.map +1 -0
  219. package/dist/tools/insights/report-stale-assets.js +281 -0
  220. package/dist/tools/insights/report-stale-assets.js.map +1 -0
  221. package/dist/tools/insights/report-top-assets.d.ts +139 -0
  222. package/dist/tools/insights/report-top-assets.d.ts.map +1 -0
  223. package/dist/tools/insights/report-top-assets.js +407 -0
  224. package/dist/tools/insights/report-top-assets.js.map +1 -0
  225. package/dist/tools/list-categories.d.ts +127 -0
  226. package/dist/tools/list-categories.d.ts.map +1 -0
  227. package/dist/tools/list-categories.js +68 -0
  228. package/dist/tools/list-categories.js.map +1 -0
  229. package/dist/tools/list-collections.d.ts +127 -0
  230. package/dist/tools/list-collections.d.ts.map +1 -0
  231. package/dist/tools/list-collections.js +53 -0
  232. package/dist/tools/list-collections.js.map +1 -0
  233. package/dist/tools/list-custom-fields.d.ts +125 -0
  234. package/dist/tools/list-custom-fields.d.ts.map +1 -0
  235. package/dist/tools/list-custom-fields.js +51 -0
  236. package/dist/tools/list-custom-fields.js.map +1 -0
  237. package/dist/tools/list-share-links.d.ts +192 -0
  238. package/dist/tools/list-share-links.d.ts.map +1 -0
  239. package/dist/tools/list-share-links.js +92 -0
  240. package/dist/tools/list-share-links.js.map +1 -0
  241. package/dist/tools/list-workspaces.d.ts +88 -0
  242. package/dist/tools/list-workspaces.d.ts.map +1 -0
  243. package/dist/tools/list-workspaces.js +71 -0
  244. package/dist/tools/list-workspaces.js.map +1 -0
  245. package/dist/tools/move-asset.d.ts +48 -0
  246. package/dist/tools/move-asset.d.ts.map +1 -0
  247. package/dist/tools/move-asset.js +85 -0
  248. package/dist/tools/move-asset.js.map +1 -0
  249. package/dist/tools/rename-asset.d.ts +88 -0
  250. package/dist/tools/rename-asset.d.ts.map +1 -0
  251. package/dist/tools/rename-asset.js +100 -0
  252. package/dist/tools/rename-asset.js.map +1 -0
  253. package/dist/tools/rename-folder.d.ts +55 -0
  254. package/dist/tools/rename-folder.d.ts.map +1 -0
  255. package/dist/tools/rename-folder.js +101 -0
  256. package/dist/tools/rename-folder.js.map +1 -0
  257. package/dist/tools/revoke-share-link.d.ts +55 -0
  258. package/dist/tools/revoke-share-link.d.ts.map +1 -0
  259. package/dist/tools/revoke-share-link.js +77 -0
  260. package/dist/tools/revoke-share-link.js.map +1 -0
  261. package/dist/tools/search/facets.d.ts +34 -0
  262. package/dist/tools/search/facets.d.ts.map +1 -0
  263. package/dist/tools/search/facets.js +147 -0
  264. package/dist/tools/search/facets.js.map +1 -0
  265. package/dist/tools/search/filter-builder.d.ts +33 -0
  266. package/dist/tools/search/filter-builder.d.ts.map +1 -0
  267. package/dist/tools/search/filter-builder.js +111 -0
  268. package/dist/tools/search/filter-builder.js.map +1 -0
  269. package/dist/tools/search/search-assets.d.ts +41 -0
  270. package/dist/tools/search/search-assets.d.ts.map +1 -0
  271. package/dist/tools/search/search-assets.js +162 -0
  272. package/dist/tools/search/search-assets.js.map +1 -0
  273. package/dist/tools/search/search-collections.d.ts +35 -0
  274. package/dist/tools/search/search-collections.d.ts.map +1 -0
  275. package/dist/tools/search/search-collections.js +103 -0
  276. package/dist/tools/search/search-collections.js.map +1 -0
  277. package/dist/tools/search/types.d.ts +1047 -0
  278. package/dist/tools/search/types.d.ts.map +1 -0
  279. package/dist/tools/search/types.js +216 -0
  280. package/dist/tools/search/types.js.map +1 -0
  281. package/dist/tools/update-asset-metadata.d.ts +78 -0
  282. package/dist/tools/update-asset-metadata.d.ts.map +1 -0
  283. package/dist/tools/update-asset-metadata.js +203 -0
  284. package/dist/tools/update-asset-metadata.js.map +1 -0
  285. package/dist/tools/update-collection.d.ts +69 -0
  286. package/dist/tools/update-collection.d.ts.map +1 -0
  287. package/dist/tools/update-collection.js +142 -0
  288. package/dist/tools/update-collection.js.map +1 -0
  289. package/dist/tools/view-category-contents.d.ts +231 -0
  290. package/dist/tools/view-category-contents.d.ts.map +1 -0
  291. package/dist/tools/view-category-contents.js +97 -0
  292. package/dist/tools/view-category-contents.js.map +1 -0
  293. package/dist/types.d.ts +1326 -0
  294. package/dist/types.d.ts.map +1 -0
  295. package/dist/types.js +288 -0
  296. package/dist/types.js.map +1 -0
  297. package/dist/typesense.d.ts +84 -0
  298. package/dist/typesense.d.ts.map +1 -0
  299. package/dist/typesense.js +243 -0
  300. package/dist/typesense.js.map +1 -0
  301. package/docs/api-field-verification.md +244 -0
  302. package/docs/deployment-runbook.md +446 -0
  303. package/docs/security-review.md +195 -0
  304. package/docs/typesense-filter-schema.md +262 -0
  305. package/docs/verified-endpoints.md +38 -0
  306. package/package.json +72 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typesense.js","sourceRoot":"","sources":["../src/typesense.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,244 @@
1
+ # Collage API Field Verification — Reference
2
+
3
+ > **Last updated 2026-05-04**
4
+
5
+ Canonical reference for every field-name / payload-shape mismatch the
6
+ MCP server has discovered between the live Collage API and the public
7
+ Swagger spec. Ships with the deployment runbook as a Week-6 handoff
8
+ deliverable.
9
+
10
+ ## Why this exists
11
+
12
+ The published Collage Swagger covers ~30 endpoints; the live frontend uses 150+. Naive consumers will hit silent-failure or 400-error walls. Every field name, payload shape, and response envelope captured below is verified two ways: (1) against the Admin-Frontend source (cited per row), and (2) by a live contract test against workspace `1927483178` (BREZ).
13
+
14
+ ## How to use this
15
+
16
+ If you're adding a CollageClient method:
17
+
18
+ 1. **Find the Admin-Frontend call site** — use `grep -rn "<endpoint>" Admin-Frontend` to locate it. The frontend is the source of truth.
19
+ 2. **Mirror its payload shape exactly**. Don't trust Swagger; trust the frontend.
20
+ 3. **Add a contract test** in `tests/contract/<endpoint>.contract.test.ts` that hits BREZ live and asserts the response shape.
21
+ 4. **If you find a new mismatch**, append to this doc under the matching section.
22
+
23
+ If you're consuming a CollageClient method: it already absorbs every quirk listed here. The Zod-validated `ClientResult<T>` contract is stable.
24
+
25
+ ## Verified mismatches
26
+
27
+ ### Asset endpoints
28
+
29
+ #### `POST /digital-assets/view-detail`
30
+ - **Quirk**: body uses `digital_assets_id` (NOT `asset_id`).
31
+ - **Source**: `Admin-Frontend/pages/_workspace_id/dam/files/_id.vue` (passim).
32
+ - **Code**: `CollageClient.getAssetDetails()` (`src/client.ts`).
33
+ - **Contract test**: `tests/contract/get-asset-details.contract.test.ts`.
34
+
35
+ #### `POST /digital-assets/update-with-field`
36
+ - **Quirk**: body requires `digital_assets_id` (NOT `asset_id`) AND `workspace_id` AND the global `?url_workspace_id=` query — three workspace identifiers in three places.
37
+ - **Body shape**: `{ workspace_id, digital_assets_id, field_name, field_value }`.
38
+ - **Source**: `pages/_workspace_id/dam/files/_id.vue:2329`, `components/dam/SearchAssets.vue:1206`.
39
+ - **Code**: `CollageClient.updateAssetField()`, `renameAsset()` (the rename flow uses `field_name: 'display_file_name'`).
40
+
41
+ #### `GET /digital-assets/get-custom-fields`
42
+ - **Quirk**: requires `workspace_id` in the query in addition to the global `?url_workspace_id=` (different param name). Missing → HTTP 400 "Validation is failed."
43
+ - **Query shape**: `{ asset_id, workspace_id }`.
44
+ - **Source**: `pages/_workspace_id/dam/files/_id.vue:1319`.
45
+ - **Code**: `CollageClient.getAssetCustomFields()`.
46
+
47
+ #### `POST /digital-assets/update-custom-fields`
48
+ - **Quirk**: uses `asset_ids` (plural) even when updating one asset; `updated_data` is the FULL row projection (id, name, value, …) — not a partial patch.
49
+ - **Body shape**: `{ workspace_id, asset_ids: [id], updated_data: [{ id, value, … }] }`.
50
+ - **Source**: `pages/_workspace_id/dam/files/_id.vue:2894`.
51
+ - **Code**: `CollageClient.updateAssetCustomFields()`.
52
+
53
+ ### Tag endpoints
54
+
55
+ #### `POST /digital-assets/add-tags-to-multiple-file`
56
+ - **Body shape**: `{ workspace_id, digital_assets_ids: [id, …], tags: ['name', …] }`.
57
+ - **`tags`** is an array of plain string names — the upstream creates new tag rows on demand.
58
+ - **Source**: `components/dam/AssetList/AddTags.vue:86`.
59
+ - **Code**: `CollageClient.addTagsToAssets()`.
60
+
61
+ #### `POST /digital-assets/delete-tag-from-multiple-file`
62
+ - **Quirk**: TWO payload shapes depending on caller.
63
+ - **Single-asset**: uses `tag_id`.
64
+ - **Multi-asset (or full-replace)**: uses `tag_name`, `digital_assets_ids` is an array of `{ id }` *objects*.
65
+ - **Body shape (multi)**: `{ workspace_id, digital_assets_ids: [{ id }, …], tag_name }`.
66
+ - **Source**: `components/dam/Dialogs/AddTags/AddMultipleTags.vue:202`.
67
+ - **Code**: `CollageClient.removeTagFromAssets()` — uses the multi shape.
68
+
69
+ #### `POST /digital-assets/get-common-tag-list`
70
+ - **Quirk**: NOT a workspace-wide tag listing. Returns the *intersection* of tags across a given `asset_ids` list.
71
+ - **Body shape**: `{ workspace_id, asset_ids }`.
72
+ - **Source**: `Backend-API/.../TagController.php:499`, `Admin-Frontend/components/dam/Dialogs/AddTags/AddMultipleTags.vue:295`.
73
+ - **Effect**: blocks `collage://tags` resource (no workspace-wide endpoint). Tracked in `mcp-resources` spec backlog.
74
+
75
+ ### Folder / category endpoints
76
+
77
+ #### `POST /digital-assets/category/add` and `category/add-sub-category`
78
+ - **Quirk**: TWO endpoints, distinguished by the body — top-level uses `add`, nested uses `add-sub-category` AND adds the parent's id under the **misnamed `category_id` key** (not `parent_id`).
79
+ - **Body shapes**:
80
+ - Top-level: `{ workspace_id, folder_name }` → `category/add`
81
+ - Nested: `{ workspace_id, folder_name, category_id: parentId }` → `category/add-sub-category`
82
+ - **Source**: `components/dam/Dialogs/miniUploadBackdrop.vue:358,366`.
83
+ - **Code**: `CollageClient.createCategory()` — picks the path based on `parent_id`.
84
+
85
+ #### `POST /digital-assets/category/rename/{id}`
86
+ - **Body shape**: `{ workspace_id, folder_name, description? }`.
87
+ - **Source**: `pages/_workspace_id/dam/folders/index.vue:1281`.
88
+ - **Code**: `CollageClient.renameCategory()`.
89
+
90
+ #### `POST /digital-assets/multiple-file-folder-move`
91
+ - **Quirk**: keys are `assets_ids`, `category_ids`, and `move_id` — NOT `asset_ids`/`folder_ids`/`destination_id` as a clean API would suggest. `move_id` accepts `null` for the uncategorised root.
92
+ - **Body shape**: `{ workspace_id, assets_ids: number[], category_ids: number[], move_id: destFolderId | null }`.
93
+ - **Source**: `components/dam/Dialogs/FolderDialogs/FolderDialog.vue:1471`.
94
+ - **Code**: `CollageClient.moveAssetsAndFolders()`.
95
+
96
+ #### `GET /digital-assets/category/all-category-list`
97
+ - **Quirk**: returns ROOT-LEVEL folders only — the upstream is flat-by-design. To traverse, walk `sub-category-list` per parent.
98
+ - **Code**: `CollageClient.listCategories()` for roots; `CollageClient.listAllCategoriesRecursive()` for the full tree (FU3, 2026-05-04).
99
+ - **Source**: `pages/_workspace_id/dam/folders/index.vue:999-1008`.
100
+
101
+ #### `GET /digital-assets/category/sub-category-list`
102
+ - **Query shape**: `{ workspace_id, category_id }`.
103
+ - **Source**: `components/dam/Dialogs/FolderDialogs/FolderDialog.vue:758`.
104
+ - **Code**: `CollageClient.listSubCategories()`.
105
+
106
+ #### `GET /digital-assets/category/view-files-with-category`
107
+ - **Quirk**: returns Laravel paginator nested as `data.assets_with_folder.{data, last_page, total}`, NOT a flat `data` array. Each row in `assets_with_folder.data` is the raw `digital_assets` row, NOT the `view-detail` projection (no joined tags).
108
+ - **Query shape**: `{ workspace_id, category_id, page, sort_by, sort_value }`.
109
+ - **Source**: `pages/_workspace_id/dam/folders/_id/index.vue:3357`.
110
+ - **Code**: `CollageClient.listAssetsByCategory()`.
111
+
112
+ #### Workspace-id requirements (global)
113
+ - Every read endpoint requires the `?url_workspace_id=` query AND most also require `workspace_id` in the body or query — root cause of the original 402 critical (resolved 2026-05-01). Ross confirmed this is by design; the frontend always sends both.
114
+
115
+ ### Collection endpoints
116
+
117
+ #### `GET /digital-assets/collection/get-all`
118
+ - **Quirk**: response includes the FULL asset detail objects in `collage_assets`, not just IDs.
119
+ - **Code**: `CollageClient.listCollections()`, `getCollection()`.
120
+
121
+ #### `POST /digital-assets/collection/update/{id}`
122
+ - **Quirk**: response payload omits `id` at the top level on BREZ. The path id is the canonical identity; client falls back to it.
123
+ - **Body shape**: `{ name?, description? }`.
124
+ - **Code**: `CollageClient.updateCollection()`.
125
+
126
+ #### `POST /digital-assets/collection/{id}/add-assets` and `remove-assets`
127
+ - **Quirk**: body uses `assets_id` (singular noun with trailing `s`, NOT `asset_ids`).
128
+ - **Body shape**: `{ assets_id: (string|number)[] }`.
129
+ - **Code**: `CollageClient.addAssetsToCollection()`, `removeAssetsFromCollection()`.
130
+
131
+ ### Share-link endpoints
132
+
133
+ #### `POST /digital-assets/dashboard/generate-share-assets-url`
134
+ - **Quirk**: body uses `assets` (NOT `asset_ids`) and `category` (NOT `folder_ids`).
135
+ - **Body shape**: `{ workspace_id, assets: number[], category: number[], title?, description?, password?, hide_download?: 0|1, expiration?: 'MMM D, YYYY' }`.
136
+ - **Source**: `components/dam/Dialogs/ShareAssetDialog/index.vue:399`.
137
+ - **Code**: `CollageClient.generateShareAssetsUrl()`.
138
+
139
+ #### `POST /digital-assets/collection/generate-share-url`
140
+ - **Body shape**: `{ workspace_id, id (collection id), assets: number[], title?, description?, password?, hide_download?: 0|1, expiration?: 'MMM D, YYYY' }`.
141
+ - **Source**: `components/dam/Dialogs/ShareAssetDialog/index.vue:520`.
142
+ - **Code**: `CollageClient.generateCollectionShareUrl()`.
143
+
144
+ #### `expiration` format
145
+ - **Quirk**: sent as `'MMM D, YYYY'`-formatted string (e.g. `'May 4, 2026'`). Admin-Frontend uses `moment(...).format('MMM D, YYYY')`.
146
+ - **Code**: our share-link tool accepts ISO 8601 input and translates internally.
147
+
148
+ #### `GET /digital-assets/dashboard/list-share-assets-url`
149
+ - **Quirk**: `filter_by` is REQUIRED. Omitting it returns HTTP 400 "The filter by field is required." Admin-Frontend defaults to `'active'`.
150
+ - **Query shape**: `{ workspace_id, page, total_record, filter_by, sort_value?, sort_by? }`.
151
+ - **Valid `filter_by` values**: `'active'`, `'expired'`, `'revoked'`.
152
+ - **Source**: `pages/_workspace_id/dam/sharing/index.vue:784`.
153
+ - **Code**: `CollageClient.listShareLinks()` defaults `filter_by` to `'active'`.
154
+
155
+ #### `POST /digital-assets/dashboard/delete-share-assets-url`
156
+ - **Quirk**: single-id revoke uses `share_url_id` (singular key, **array value**). Bulk uses a different endpoint (`delete-multiple-share-assets-url`) with `share_url_ids` (plural key).
157
+ - **Body shape (single)**: `{ workspace_id, share_url_id: number[] }`.
158
+ - **Source**: `pages/_workspace_id/dam/sharing/index.vue:1059`.
159
+ - **Code**: `CollageClient.revokeShareLink()`.
160
+
161
+ ### Embed-code endpoints
162
+
163
+ #### `GET /digital-assets/{id}/generate-embed-code`
164
+ - **Quirk**: asset-only — there is **no collection-level embed endpoint**. `Admin-Frontend`'s `getEmbedLink` only operates on asset ids.
165
+ - **Code**: `CollageClient.generateEmbedCode()`.
166
+
167
+ ### Search endpoint
168
+
169
+ #### `POST app.collage.inc/typesense/search` (Nuxt proxy, not Laravel)
170
+ - **Quirk #1 — different host**: lives on `app.collage.inc`, not `damapi.collage.inc`. The Laravel host serves no `/typesense*` path.
171
+ - **Quirk #2 — workspace_id resolution**: the proxy receives the DB workspace id (e.g. `1927483178`) in the body, then resolves it to the **`workspace_unique_id`** (e.g. `178`) by hitting Laravel's `/user` endpoint with the inbound Bearer token. The Typesense documents store the unique_id under the `workspace_id` field. Client-side filter clauses MUST NOT prepend `workspace_id:=<DB-id>` — that double-ANDs against the proxy's `workspace_id: <unique_id>` clause and zero-outs results.
172
+ - **Quirk #3 — facet_by stripped**: the Nuxt middleware drops `facet_by` and `max_facet_values` before forwarding to Typesense. `facet_counts` always returns `[]` regardless of request shape. Tracked in `nuxt-search-proxy-strips-facet-by-05-04-2026.md`.
173
+ - **Quirk #4 — auth**: the proxy verifies the inbound `Authorization: Bearer <token>` header against `${API_BASE_URL}user`. Our existing `COLLAGE_API_KEY` works as the token (no separate Typesense key needed).
174
+ - **Source**: `Admin-Frontend/api/typesense.js`.
175
+ - **Code**: `src/typesense.ts` — `createCollageSearchClient()`, `searchWorkspaceScoped()`.
176
+
177
+ ### Visibility / type values
178
+
179
+ #### Visibility numeric (NOT string)
180
+ - `0` = public
181
+ - `1` = private
182
+ - The MCP server passes the numeric form through unchanged. Consumers (LLMs) read Collage's native shape.
183
+
184
+ #### File type strings
185
+ - File type values are stored as the file extension stripped of leading dot: `'png'`, `'mp4'`, `'pdf'`. Not MIME types.
186
+
187
+ #### `is_archive`, `is_deleted`, `final_deleted`
188
+ - All are `0|1` flags (numeric, not boolean).
189
+
190
+ #### `category_id` on assets
191
+ - **`category_id` IS the folder ID.** Naming inconsistency carried through from the original DB schema (folders are stored in `digital_assets_categories`).
192
+
193
+ ## Workspace ID format gotcha
194
+
195
+ | Where used | Format | Example |
196
+ |---|---|---|
197
+ | `?url_workspace_id=` (every request) | full DB id | `1927483178` |
198
+ | `workspace_id` in bodies/queries | full DB id | `1927483178` |
199
+ | Inside Typesense indexed documents | `workspace_unique_id` | `178` |
200
+ | `workspace_unique_id` field on `accessibleWorkspaces` | unique id | `178` |
201
+
202
+ The Nuxt search proxy bridges the two formats server-side via `/user` lookup.
203
+
204
+ ## What our tests cover
205
+
206
+ The contract test suite (`tests/contract/`) hits every wired endpoint live against BREZ on every `INTEGRATION=1` run:
207
+
208
+ - `get-asset-details.contract.test.ts` — `view-detail` shape.
209
+ - `list-categories.contract.test.ts` — `all-category-list`.
210
+ - `list-collections.contract.test.ts` — `collection/get-all`.
211
+ - `list-embed-codes.contract.test.ts` — `embed-code-list`.
212
+ - `enumerate-assets.contract.test.ts` — `view-files-with-category`.
213
+ - `folder-tools.contract.test.ts` — `list_categories`, `view_category_contents`.
214
+ - `unblocked-endpoints.contract.test.ts` — `sub-category-list`, `instance/get`, `dashboard/common-data`, `get-recent-uploaded`.
215
+ - `share-link.contract.test.ts` — `list-share-assets-url`, `generate-share-assets-url`.
216
+ - `check-workspace-access.contract.test.ts` — `check-workspace-access`.
217
+ - `resources.contract.test.ts` — every wired MCP resource (12 tests).
218
+ - `search.contract.test.ts` — Nuxt `/typesense/search` proxy (added 2026-05-04).
219
+ - `asset-write.contract.test.ts` + `collection-mutations.contract.test.ts` — write-side; conditional on workspace state.
220
+
221
+ **As of 2026-05-04: 34 contract tests pass live against BREZ. Any new field-name surprise will fail a contract test, not become a runtime bug.**
222
+
223
+ ## Open mismatches NOT yet absorbed
224
+
225
+ None at the time of writing. Three resources blocked on UPSTREAM endpoint design (not field-name) issues are tracked separately in the `mcp-resources` spec backlog:
226
+
227
+ - `collage://tags` — no workspace-wide endpoint exists.
228
+ - `collage://analytics` — only per-asset analytics exists.
229
+ - `collage://portals/{id}/users` — endpoint TBD.
230
+
231
+ ## Maintenance
232
+
233
+ When adding a new endpoint to `CollageClient`:
234
+
235
+ 1. Cite the Admin-Frontend source line in the docstring.
236
+ 2. Add a contract test under `tests/contract/<endpoint>.contract.test.ts`.
237
+ 3. Append to the appropriate section above.
238
+ 4. If the endpoint exposes a NEW class of quirk, add a new section.
239
+
240
+ When a contract test starts failing after an upstream change:
241
+
242
+ 1. Diff the response against the schema. Update the schema if the change is benign.
243
+ 2. If the change is a breaking field rename, update the client, update the docstring, and append a "Resolved" note to this doc with the date.
244
+ 3. Bump `updated:` in the frontmatter.