@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.
- package/.env.example +56 -0
- package/CHANGELOG.md +90 -0
- package/LICENSE +21 -0
- package/README.md +512 -0
- package/dist/client.d.ts +497 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +1162 -0
- package/dist/client.js.map +1 -0
- package/dist/conventions/confirmation.d.ts +89 -0
- package/dist/conventions/confirmation.d.ts.map +1 -0
- package/dist/conventions/confirmation.js +132 -0
- package/dist/conventions/confirmation.js.map +1 -0
- package/dist/conventions/dry-run/batch-executor.d.ts +36 -0
- package/dist/conventions/dry-run/batch-executor.d.ts.map +1 -0
- package/dist/conventions/dry-run/batch-executor.js +89 -0
- package/dist/conventions/dry-run/batch-executor.js.map +1 -0
- package/dist/conventions/dry-run/diff-renderer.d.ts +34 -0
- package/dist/conventions/dry-run/diff-renderer.d.ts.map +1 -0
- package/dist/conventions/dry-run/diff-renderer.js +158 -0
- package/dist/conventions/dry-run/diff-renderer.js.map +1 -0
- package/dist/conventions/dry-run/index.d.ts +13 -0
- package/dist/conventions/dry-run/index.d.ts.map +1 -0
- package/dist/conventions/dry-run/index.js +10 -0
- package/dist/conventions/dry-run/index.js.map +1 -0
- package/dist/conventions/dry-run/mutating-tool.d.ts +64 -0
- package/dist/conventions/dry-run/mutating-tool.d.ts.map +1 -0
- package/dist/conventions/dry-run/mutating-tool.js +88 -0
- package/dist/conventions/dry-run/mutating-tool.js.map +1 -0
- package/dist/conventions/dry-run/summary.d.ts +66 -0
- package/dist/conventions/dry-run/summary.d.ts.map +1 -0
- package/dist/conventions/dry-run/summary.js +185 -0
- package/dist/conventions/dry-run/summary.js.map +1 -0
- package/dist/conventions/dry-run/types.d.ts +597 -0
- package/dist/conventions/dry-run/types.d.ts.map +1 -0
- package/dist/conventions/dry-run/types.js +108 -0
- package/dist/conventions/dry-run/types.js.map +1 -0
- package/dist/conventions/dry-run/with-dry-run.d.ts +66 -0
- package/dist/conventions/dry-run/with-dry-run.d.ts.map +1 -0
- package/dist/conventions/dry-run/with-dry-run.js +219 -0
- package/dist/conventions/dry-run/with-dry-run.js.map +1 -0
- package/dist/conventions/env.d.ts +49 -0
- package/dist/conventions/env.d.ts.map +1 -0
- package/dist/conventions/env.js +84 -0
- package/dist/conventions/env.js.map +1 -0
- package/dist/conventions/errors.d.ts +68 -0
- package/dist/conventions/errors.d.ts.map +1 -0
- package/dist/conventions/errors.js +81 -0
- package/dist/conventions/errors.js.map +1 -0
- package/dist/conventions/logger.d.ts +28 -0
- package/dist/conventions/logger.d.ts.map +1 -0
- package/dist/conventions/logger.js +105 -0
- package/dist/conventions/logger.js.map +1 -0
- package/dist/conventions/pagination.d.ts +37 -0
- package/dist/conventions/pagination.d.ts.map +1 -0
- package/dist/conventions/pagination.js +53 -0
- package/dist/conventions/pagination.js.map +1 -0
- package/dist/conventions/rate-limiter.d.ts +54 -0
- package/dist/conventions/rate-limiter.d.ts.map +1 -0
- package/dist/conventions/rate-limiter.js +143 -0
- package/dist/conventions/rate-limiter.js.map +1 -0
- package/dist/conventions/response-budget.d.ts +66 -0
- package/dist/conventions/response-budget.d.ts.map +1 -0
- package/dist/conventions/response-budget.js +89 -0
- package/dist/conventions/response-budget.js.map +1 -0
- package/dist/conventions/schema-version.d.ts +27 -0
- package/dist/conventions/schema-version.d.ts.map +1 -0
- package/dist/conventions/schema-version.js +29 -0
- package/dist/conventions/schema-version.js.map +1 -0
- package/dist/conventions/state-store-redis.d.ts +32 -0
- package/dist/conventions/state-store-redis.d.ts.map +1 -0
- package/dist/conventions/state-store-redis.js +77 -0
- package/dist/conventions/state-store-redis.js.map +1 -0
- package/dist/conventions/state-store.d.ts +46 -0
- package/dist/conventions/state-store.d.ts.map +1 -0
- package/dist/conventions/state-store.js +105 -0
- package/dist/conventions/state-store.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +421 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts/collection-audit.d.ts +13 -0
- package/dist/prompts/collection-audit.d.ts.map +1 -0
- package/dist/prompts/collection-audit.js +168 -0
- package/dist/prompts/collection-audit.js.map +1 -0
- package/dist/prompts/create-distribution.d.ts +15 -0
- package/dist/prompts/create-distribution.d.ts.map +1 -0
- package/dist/prompts/create-distribution.js +111 -0
- package/dist/prompts/create-distribution.js.map +1 -0
- package/dist/prompts/helpers.d.ts +20 -0
- package/dist/prompts/helpers.d.ts.map +1 -0
- package/dist/prompts/helpers.js +53 -0
- package/dist/prompts/helpers.js.map +1 -0
- package/dist/prompts/library-health-audit.d.ts +13 -0
- package/dist/prompts/library-health-audit.d.ts.map +1 -0
- package/dist/prompts/library-health-audit.js +131 -0
- package/dist/prompts/library-health-audit.js.map +1 -0
- package/dist/prompts/usage-insights.d.ts +13 -0
- package/dist/prompts/usage-insights.d.ts.map +1 -0
- package/dist/prompts/usage-insights.js +98 -0
- package/dist/prompts/usage-insights.js.map +1 -0
- package/dist/prompts/wrap-prompt-as-tool.d.ts +48 -0
- package/dist/prompts/wrap-prompt-as-tool.d.ts.map +1 -0
- package/dist/prompts/wrap-prompt-as-tool.js +61 -0
- package/dist/prompts/wrap-prompt-as-tool.js.map +1 -0
- package/dist/resources/asset-by-id.d.ts +4 -0
- package/dist/resources/asset-by-id.d.ts.map +1 -0
- package/dist/resources/asset-by-id.js +27 -0
- package/dist/resources/asset-by-id.js.map +1 -0
- package/dist/resources/collections.d.ts +5 -0
- package/dist/resources/collections.d.ts.map +1 -0
- package/dist/resources/collections.js +48 -0
- package/dist/resources/collections.js.map +1 -0
- package/dist/resources/custom-fields.d.ts +4 -0
- package/dist/resources/custom-fields.d.ts.map +1 -0
- package/dist/resources/custom-fields.js +30 -0
- package/dist/resources/custom-fields.js.map +1 -0
- package/dist/resources/folders.d.ts +5 -0
- package/dist/resources/folders.d.ts.map +1 -0
- package/dist/resources/folders.js +73 -0
- package/dist/resources/folders.js.map +1 -0
- package/dist/resources/helpers.d.ts +17 -0
- package/dist/resources/helpers.d.ts.map +1 -0
- package/dist/resources/helpers.js +59 -0
- package/dist/resources/helpers.js.map +1 -0
- package/dist/resources/portals.d.ts +5 -0
- package/dist/resources/portals.d.ts.map +1 -0
- package/dist/resources/portals.js +81 -0
- package/dist/resources/portals.js.map +1 -0
- package/dist/resources/recent-and-dashboard.d.ts +5 -0
- package/dist/resources/recent-and-dashboard.d.ts.map +1 -0
- package/dist/resources/recent-and-dashboard.js +42 -0
- package/dist/resources/recent-and-dashboard.js.map +1 -0
- package/dist/tools/asset-selection.d.ts +102 -0
- package/dist/tools/asset-selection.d.ts.map +1 -0
- package/dist/tools/asset-selection.js +133 -0
- package/dist/tools/asset-selection.js.map +1 -0
- package/dist/tools/audit/audit-folder-structure.d.ts +108 -0
- package/dist/tools/audit/audit-folder-structure.d.ts.map +1 -0
- package/dist/tools/audit/audit-folder-structure.js +260 -0
- package/dist/tools/audit/audit-folder-structure.js.map +1 -0
- package/dist/tools/audit/audit-naming-conventions.d.ts +83 -0
- package/dist/tools/audit/audit-naming-conventions.d.ts.map +1 -0
- package/dist/tools/audit/audit-naming-conventions.js +238 -0
- package/dist/tools/audit/audit-naming-conventions.js.map +1 -0
- package/dist/tools/audit/audit-tagging-hygiene.d.ts +77 -0
- package/dist/tools/audit/audit-tagging-hygiene.d.ts.map +1 -0
- package/dist/tools/audit/audit-tagging-hygiene.js +402 -0
- package/dist/tools/audit/audit-tagging-hygiene.js.map +1 -0
- package/dist/tools/audit/detect-duplicates.d.ts +62 -0
- package/dist/tools/audit/detect-duplicates.d.ts.map +1 -0
- package/dist/tools/audit/detect-duplicates.js +0 -0
- package/dist/tools/audit/detect-duplicates.js.map +1 -0
- package/dist/tools/audit/types.d.ts +526 -0
- package/dist/tools/audit/types.d.ts.map +1 -0
- package/dist/tools/audit/types.js +188 -0
- package/dist/tools/audit/types.js.map +1 -0
- package/dist/tools/bulk-move-assets.d.ts +78 -0
- package/dist/tools/bulk-move-assets.d.ts.map +1 -0
- package/dist/tools/bulk-move-assets.js +122 -0
- package/dist/tools/bulk-move-assets.js.map +1 -0
- package/dist/tools/bulk-normalize-filenames.d.ts +62 -0
- package/dist/tools/bulk-normalize-filenames.d.ts.map +1 -0
- package/dist/tools/bulk-normalize-filenames.js +237 -0
- package/dist/tools/bulk-normalize-filenames.js.map +1 -0
- package/dist/tools/bulk-rename-assets.d.ts +79 -0
- package/dist/tools/bulk-rename-assets.d.ts.map +1 -0
- package/dist/tools/bulk-rename-assets.js +139 -0
- package/dist/tools/bulk-rename-assets.js.map +1 -0
- package/dist/tools/bulk-tags.d.ts +107 -0
- package/dist/tools/bulk-tags.d.ts.map +1 -0
- package/dist/tools/bulk-tags.js +220 -0
- package/dist/tools/bulk-tags.js.map +1 -0
- package/dist/tools/client-adapters.d.ts +76 -0
- package/dist/tools/client-adapters.d.ts.map +1 -0
- package/dist/tools/client-adapters.js +648 -0
- package/dist/tools/client-adapters.js.map +1 -0
- package/dist/tools/collection-membership.d.ts +90 -0
- package/dist/tools/collection-membership.d.ts.map +1 -0
- package/dist/tools/collection-membership.js +195 -0
- package/dist/tools/collection-membership.js.map +1 -0
- package/dist/tools/create-collection.d.ts +63 -0
- package/dist/tools/create-collection.d.ts.map +1 -0
- package/dist/tools/create-collection.js +151 -0
- package/dist/tools/create-collection.js.map +1 -0
- package/dist/tools/create-folder.d.ts +46 -0
- package/dist/tools/create-folder.d.ts.map +1 -0
- package/dist/tools/create-folder.js +83 -0
- package/dist/tools/create-folder.js.map +1 -0
- package/dist/tools/create-share-link.d.ts +107 -0
- package/dist/tools/create-share-link.d.ts.map +1 -0
- package/dist/tools/create-share-link.js +239 -0
- package/dist/tools/create-share-link.js.map +1 -0
- package/dist/tools/get-asset-details.d.ts +401 -0
- package/dist/tools/get-asset-details.d.ts.map +1 -0
- package/dist/tools/get-asset-details.js +56 -0
- package/dist/tools/get-asset-details.js.map +1 -0
- package/dist/tools/get-collection.d.ts +126 -0
- package/dist/tools/get-collection.d.ts.map +1 -0
- package/dist/tools/get-collection.js +52 -0
- package/dist/tools/get-collection.js.map +1 -0
- package/dist/tools/get-embed-code.d.ts +195 -0
- package/dist/tools/get-embed-code.d.ts.map +1 -0
- package/dist/tools/get-embed-code.js +214 -0
- package/dist/tools/get-embed-code.js.map +1 -0
- package/dist/tools/insights/analyze-share-links.d.ts +159 -0
- package/dist/tools/insights/analyze-share-links.d.ts.map +1 -0
- package/dist/tools/insights/analyze-share-links.js +314 -0
- package/dist/tools/insights/analyze-share-links.js.map +1 -0
- package/dist/tools/insights/insight-cache.d.ts +36 -0
- package/dist/tools/insights/insight-cache.d.ts.map +1 -0
- package/dist/tools/insights/insight-cache.js +98 -0
- package/dist/tools/insights/insight-cache.js.map +1 -0
- package/dist/tools/insights/report-asset-activation.d.ts +149 -0
- package/dist/tools/insights/report-asset-activation.d.ts.map +1 -0
- package/dist/tools/insights/report-asset-activation.js +380 -0
- package/dist/tools/insights/report-asset-activation.js.map +1 -0
- package/dist/tools/insights/report-stale-assets.d.ts +120 -0
- package/dist/tools/insights/report-stale-assets.d.ts.map +1 -0
- package/dist/tools/insights/report-stale-assets.js +281 -0
- package/dist/tools/insights/report-stale-assets.js.map +1 -0
- package/dist/tools/insights/report-top-assets.d.ts +139 -0
- package/dist/tools/insights/report-top-assets.d.ts.map +1 -0
- package/dist/tools/insights/report-top-assets.js +407 -0
- package/dist/tools/insights/report-top-assets.js.map +1 -0
- package/dist/tools/list-categories.d.ts +127 -0
- package/dist/tools/list-categories.d.ts.map +1 -0
- package/dist/tools/list-categories.js +68 -0
- package/dist/tools/list-categories.js.map +1 -0
- package/dist/tools/list-collections.d.ts +127 -0
- package/dist/tools/list-collections.d.ts.map +1 -0
- package/dist/tools/list-collections.js +53 -0
- package/dist/tools/list-collections.js.map +1 -0
- package/dist/tools/list-custom-fields.d.ts +125 -0
- package/dist/tools/list-custom-fields.d.ts.map +1 -0
- package/dist/tools/list-custom-fields.js +51 -0
- package/dist/tools/list-custom-fields.js.map +1 -0
- package/dist/tools/list-share-links.d.ts +192 -0
- package/dist/tools/list-share-links.d.ts.map +1 -0
- package/dist/tools/list-share-links.js +92 -0
- package/dist/tools/list-share-links.js.map +1 -0
- package/dist/tools/list-workspaces.d.ts +88 -0
- package/dist/tools/list-workspaces.d.ts.map +1 -0
- package/dist/tools/list-workspaces.js +71 -0
- package/dist/tools/list-workspaces.js.map +1 -0
- package/dist/tools/move-asset.d.ts +48 -0
- package/dist/tools/move-asset.d.ts.map +1 -0
- package/dist/tools/move-asset.js +85 -0
- package/dist/tools/move-asset.js.map +1 -0
- package/dist/tools/rename-asset.d.ts +88 -0
- package/dist/tools/rename-asset.d.ts.map +1 -0
- package/dist/tools/rename-asset.js +100 -0
- package/dist/tools/rename-asset.js.map +1 -0
- package/dist/tools/rename-folder.d.ts +55 -0
- package/dist/tools/rename-folder.d.ts.map +1 -0
- package/dist/tools/rename-folder.js +101 -0
- package/dist/tools/rename-folder.js.map +1 -0
- package/dist/tools/revoke-share-link.d.ts +55 -0
- package/dist/tools/revoke-share-link.d.ts.map +1 -0
- package/dist/tools/revoke-share-link.js +77 -0
- package/dist/tools/revoke-share-link.js.map +1 -0
- package/dist/tools/search/facets.d.ts +34 -0
- package/dist/tools/search/facets.d.ts.map +1 -0
- package/dist/tools/search/facets.js +147 -0
- package/dist/tools/search/facets.js.map +1 -0
- package/dist/tools/search/filter-builder.d.ts +33 -0
- package/dist/tools/search/filter-builder.d.ts.map +1 -0
- package/dist/tools/search/filter-builder.js +111 -0
- package/dist/tools/search/filter-builder.js.map +1 -0
- package/dist/tools/search/search-assets.d.ts +41 -0
- package/dist/tools/search/search-assets.d.ts.map +1 -0
- package/dist/tools/search/search-assets.js +162 -0
- package/dist/tools/search/search-assets.js.map +1 -0
- package/dist/tools/search/search-collections.d.ts +35 -0
- package/dist/tools/search/search-collections.d.ts.map +1 -0
- package/dist/tools/search/search-collections.js +103 -0
- package/dist/tools/search/search-collections.js.map +1 -0
- package/dist/tools/search/types.d.ts +1047 -0
- package/dist/tools/search/types.d.ts.map +1 -0
- package/dist/tools/search/types.js +216 -0
- package/dist/tools/search/types.js.map +1 -0
- package/dist/tools/update-asset-metadata.d.ts +78 -0
- package/dist/tools/update-asset-metadata.d.ts.map +1 -0
- package/dist/tools/update-asset-metadata.js +203 -0
- package/dist/tools/update-asset-metadata.js.map +1 -0
- package/dist/tools/update-collection.d.ts +69 -0
- package/dist/tools/update-collection.d.ts.map +1 -0
- package/dist/tools/update-collection.js +142 -0
- package/dist/tools/update-collection.js.map +1 -0
- package/dist/tools/view-category-contents.d.ts +231 -0
- package/dist/tools/view-category-contents.d.ts.map +1 -0
- package/dist/tools/view-category-contents.js +97 -0
- package/dist/tools/view-category-contents.js.map +1 -0
- package/dist/types.d.ts +1326 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +288 -0
- package/dist/types.js.map +1 -0
- package/dist/typesense.d.ts +84 -0
- package/dist/typesense.d.ts.map +1 -0
- package/dist/typesense.js +243 -0
- package/dist/typesense.js.map +1 -0
- package/docs/api-field-verification.md +244 -0
- package/docs/deployment-runbook.md +446 -0
- package/docs/security-review.md +195 -0
- package/docs/typesense-filter-schema.md +262 -0
- package/docs/verified-endpoints.md +38 -0
- package/package.json +72 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
// ── list_share_links (read-only) ─────────────────────────────────────
|
|
2
|
+
// Paginated enumeration of share links for the configured workspace.
|
|
3
|
+
// Backed by GET /digital-assets/dashboard/list-share-assets-url. Source:
|
|
4
|
+
// Admin-Frontend `pages/_workspace_id/dam/sharing/index.vue:784`.
|
|
5
|
+
//
|
|
6
|
+
// Cursor envelope follows Shared Conventions: opaque base64 offset cursor,
|
|
7
|
+
// page-size clamp, and `next_cursor`/`total_estimate` in the response.
|
|
8
|
+
import { z } from 'zod';
|
|
9
|
+
import { buildPaginatedResponse, clampPageSize, decodeCursor, } from '../conventions/pagination.js';
|
|
10
|
+
import { ShareLinkSchema } from '../types.js';
|
|
11
|
+
export const ListShareLinksInputSchema = z.object({
|
|
12
|
+
cursor: z.string().optional(),
|
|
13
|
+
page_size: z.number().int().min(1).max(500).optional(),
|
|
14
|
+
/**
|
|
15
|
+
* Mirrors the Admin-Frontend filter dropdown values
|
|
16
|
+
* (`active`, `expired`, `revoked`). Pass-through — upstream interprets.
|
|
17
|
+
*/
|
|
18
|
+
filter_by: z.string().optional(),
|
|
19
|
+
sort_by: z.enum(['ASC', 'DESC']).optional(),
|
|
20
|
+
sort_value: z.string().optional(),
|
|
21
|
+
});
|
|
22
|
+
export const ListShareLinksOutputSchema = z.object({
|
|
23
|
+
items: z.array(ShareLinkSchema),
|
|
24
|
+
next_cursor: z.string().nullable(),
|
|
25
|
+
total_estimate: z.number().nullable(),
|
|
26
|
+
request_id: z.string(),
|
|
27
|
+
});
|
|
28
|
+
export const LIST_SHARE_LINKS_DESCRIPTION = 'List share links in the configured workspace, paginated. Each item ' +
|
|
29
|
+
'carries the share id, title, description, share URL, expiration, ' +
|
|
30
|
+
'password flag, hide_download flag, view count, and timestamps. ' +
|
|
31
|
+
'Read-only.';
|
|
32
|
+
/**
|
|
33
|
+
* The upstream uses 1-based page numbering with a `total_record` page
|
|
34
|
+
* size, which we map onto our base64 offset cursor by floor-dividing
|
|
35
|
+
* `offset / pageSize` and translating between pages and offsets at the
|
|
36
|
+
* boundary. Cursors that don't align to page boundaries are clamped to
|
|
37
|
+
* the next-lower page start — this is fine because we don't expose
|
|
38
|
+
* arbitrary offsets to callers; cursors are always derived from a prior
|
|
39
|
+
* `next_cursor`.
|
|
40
|
+
*/
|
|
41
|
+
export function buildListShareLinksHandler(client) {
|
|
42
|
+
return async (args) => {
|
|
43
|
+
const pageSize = clampPageSize(args.page_size);
|
|
44
|
+
const offset = args.cursor !== undefined ? decodeCursor(args.cursor) : 0;
|
|
45
|
+
const page = Math.floor(offset / pageSize) + 1;
|
|
46
|
+
const fetchInput = {
|
|
47
|
+
page,
|
|
48
|
+
pageSize,
|
|
49
|
+
};
|
|
50
|
+
if (args.filter_by !== undefined)
|
|
51
|
+
fetchInput.filterBy = args.filter_by;
|
|
52
|
+
if (args.sort_by !== undefined)
|
|
53
|
+
fetchInput.sortBy = args.sort_by;
|
|
54
|
+
if (args.sort_value !== undefined)
|
|
55
|
+
fetchInput.sortValue = args.sort_value;
|
|
56
|
+
const result = await client.listShareLinks(fetchInput);
|
|
57
|
+
if (!result.ok) {
|
|
58
|
+
return {
|
|
59
|
+
isError: true,
|
|
60
|
+
content: [
|
|
61
|
+
{
|
|
62
|
+
type: 'text',
|
|
63
|
+
text: `list_share_links failed: ${result.error.code} — ${result.error.message}`,
|
|
64
|
+
},
|
|
65
|
+
],
|
|
66
|
+
structuredContent: {
|
|
67
|
+
error: result.error,
|
|
68
|
+
request_id: result.request_id,
|
|
69
|
+
},
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
const items = result.data.data;
|
|
73
|
+
const total = result.data.total ?? null;
|
|
74
|
+
const paged = buildPaginatedResponse(items, offset, pageSize, total);
|
|
75
|
+
const output = {
|
|
76
|
+
items: paged.items,
|
|
77
|
+
next_cursor: paged.next_cursor,
|
|
78
|
+
total_estimate: paged.total_estimate,
|
|
79
|
+
request_id: result.request_id,
|
|
80
|
+
};
|
|
81
|
+
return {
|
|
82
|
+
content: [
|
|
83
|
+
{
|
|
84
|
+
type: 'text',
|
|
85
|
+
text: JSON.stringify(output, null, 2),
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
structuredContent: output,
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=list-share-links.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-share-links.js","sourceRoot":"","sources":["../../src/tools/list-share-links.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { CollageClient } from '../client.js';
|
|
3
|
+
/**
|
|
4
|
+
* Output schema for `list_workspaces`.
|
|
5
|
+
*
|
|
6
|
+
* Phase 1 caveat: the Collage REST API does not expose a list endpoint for
|
|
7
|
+
* workspaces accessible to the current token (Swagger has no such route,
|
|
8
|
+
* and `/api/v1/user` 404s for service tokens). The MVP smoke tool therefore
|
|
9
|
+
* returns the *configured* workspace plus a `has_access` flag verified via
|
|
10
|
+
* `check-workspace-access`.
|
|
11
|
+
*
|
|
12
|
+
* When/if the upstream team ships a proper enumeration endpoint, this tool
|
|
13
|
+
* will be expanded to return all accessible workspaces. Tracked separately.
|
|
14
|
+
*/
|
|
15
|
+
export declare const ListWorkspacesOutputSchema: z.ZodObject<{
|
|
16
|
+
workspaces: z.ZodArray<z.ZodObject<{
|
|
17
|
+
id: z.ZodString;
|
|
18
|
+
has_access: z.ZodBoolean;
|
|
19
|
+
message: z.ZodOptional<z.ZodString>;
|
|
20
|
+
}, "strip", z.ZodTypeAny, {
|
|
21
|
+
id: string;
|
|
22
|
+
has_access: boolean;
|
|
23
|
+
message?: string | undefined;
|
|
24
|
+
}, {
|
|
25
|
+
id: string;
|
|
26
|
+
has_access: boolean;
|
|
27
|
+
message?: string | undefined;
|
|
28
|
+
}>, "many">;
|
|
29
|
+
request_id: z.ZodString;
|
|
30
|
+
}, "strip", z.ZodTypeAny, {
|
|
31
|
+
request_id: string;
|
|
32
|
+
workspaces: {
|
|
33
|
+
id: string;
|
|
34
|
+
has_access: boolean;
|
|
35
|
+
message?: string | undefined;
|
|
36
|
+
}[];
|
|
37
|
+
}, {
|
|
38
|
+
request_id: string;
|
|
39
|
+
workspaces: {
|
|
40
|
+
id: string;
|
|
41
|
+
has_access: boolean;
|
|
42
|
+
message?: string | undefined;
|
|
43
|
+
}[];
|
|
44
|
+
}>;
|
|
45
|
+
export type ListWorkspacesOutput = z.infer<typeof ListWorkspacesOutputSchema>;
|
|
46
|
+
export declare const LIST_WORKSPACES_DESCRIPTION: string;
|
|
47
|
+
/**
|
|
48
|
+
* Build the handler for the `list_workspaces` tool.
|
|
49
|
+
*
|
|
50
|
+
* Returns a function suitable for `McpServer#registerTool`. The handler
|
|
51
|
+
* shape mirrors the contract used by every other tool in the project:
|
|
52
|
+
* structured content + a textual fallback so non-structured-content
|
|
53
|
+
* clients still get a readable response.
|
|
54
|
+
*/
|
|
55
|
+
export declare function buildListWorkspacesHandler(client: CollageClient, configuredWorkspaceId: string): () => Promise<{
|
|
56
|
+
isError: boolean;
|
|
57
|
+
content: {
|
|
58
|
+
type: "text";
|
|
59
|
+
text: string;
|
|
60
|
+
}[];
|
|
61
|
+
structuredContent: {
|
|
62
|
+
error: {
|
|
63
|
+
code: "UNAUTHORIZED" | "FORBIDDEN" | "NOT_FOUND" | "VALIDATION" | "RATE_LIMITED" | "UPSTREAM" | "CONFIRMATION_STALE" | "CONFIRMATION_MISSING" | "CONFIRMATION_STATE_DIVERGED" | "ENTITLEMENT" | "INTERNAL";
|
|
64
|
+
message: string;
|
|
65
|
+
retriable: boolean;
|
|
66
|
+
cause?: z.objectOutputType<{
|
|
67
|
+
upstream_status: z.ZodOptional<z.ZodNumber>;
|
|
68
|
+
request_id: z.ZodOptional<z.ZodString>;
|
|
69
|
+
}, z.ZodTypeAny, "passthrough"> | undefined;
|
|
70
|
+
};
|
|
71
|
+
request_id: string;
|
|
72
|
+
};
|
|
73
|
+
} | {
|
|
74
|
+
content: {
|
|
75
|
+
type: "text";
|
|
76
|
+
text: string;
|
|
77
|
+
}[];
|
|
78
|
+
structuredContent: {
|
|
79
|
+
request_id: string;
|
|
80
|
+
workspaces: {
|
|
81
|
+
id: string;
|
|
82
|
+
has_access: boolean;
|
|
83
|
+
message?: string | undefined;
|
|
84
|
+
}[];
|
|
85
|
+
};
|
|
86
|
+
isError?: undefined;
|
|
87
|
+
}>;
|
|
88
|
+
//# sourceMappingURL=list-workspaces.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-workspaces.d.ts","sourceRoot":"","sources":["../../src/tools/list-workspaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,0BAA0B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASrC,CAAC;AAEH,MAAM,MAAM,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,0BAA0B,CAAC,CAAC;AAE9E,eAAO,MAAM,2BAA2B,QAE6B,CAAC;AAEtE;;;;;;;GAOG;AACH,wBAAgB,0BAA0B,CACxC,MAAM,EAAE,aAAa,EACrB,qBAAqB,EAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0C9B"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Output schema for `list_workspaces`.
|
|
4
|
+
*
|
|
5
|
+
* Phase 1 caveat: the Collage REST API does not expose a list endpoint for
|
|
6
|
+
* workspaces accessible to the current token (Swagger has no such route,
|
|
7
|
+
* and `/api/v1/user` 404s for service tokens). The MVP smoke tool therefore
|
|
8
|
+
* returns the *configured* workspace plus a `has_access` flag verified via
|
|
9
|
+
* `check-workspace-access`.
|
|
10
|
+
*
|
|
11
|
+
* When/if the upstream team ships a proper enumeration endpoint, this tool
|
|
12
|
+
* will be expanded to return all accessible workspaces. Tracked separately.
|
|
13
|
+
*/
|
|
14
|
+
export const ListWorkspacesOutputSchema = z.object({
|
|
15
|
+
workspaces: z.array(z.object({
|
|
16
|
+
id: z.string(),
|
|
17
|
+
has_access: z.boolean(),
|
|
18
|
+
message: z.string().optional(),
|
|
19
|
+
})),
|
|
20
|
+
request_id: z.string(),
|
|
21
|
+
});
|
|
22
|
+
export const LIST_WORKSPACES_DESCRIPTION = 'Smoke-test tool. Verifies the configured Collage API token can reach ' +
|
|
23
|
+
'the configured workspace and returns it as a single-element list.';
|
|
24
|
+
/**
|
|
25
|
+
* Build the handler for the `list_workspaces` tool.
|
|
26
|
+
*
|
|
27
|
+
* Returns a function suitable for `McpServer#registerTool`. The handler
|
|
28
|
+
* shape mirrors the contract used by every other tool in the project:
|
|
29
|
+
* structured content + a textual fallback so non-structured-content
|
|
30
|
+
* clients still get a readable response.
|
|
31
|
+
*/
|
|
32
|
+
export function buildListWorkspacesHandler(client, configuredWorkspaceId) {
|
|
33
|
+
return async () => {
|
|
34
|
+
const result = await client.checkWorkspaceAccess();
|
|
35
|
+
if (!result.ok) {
|
|
36
|
+
return {
|
|
37
|
+
isError: true,
|
|
38
|
+
content: [
|
|
39
|
+
{
|
|
40
|
+
type: 'text',
|
|
41
|
+
text: `list_workspaces failed: ${result.error.code} — ${result.error.message}`,
|
|
42
|
+
},
|
|
43
|
+
],
|
|
44
|
+
structuredContent: {
|
|
45
|
+
error: result.error,
|
|
46
|
+
request_id: result.request_id,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
const output = {
|
|
51
|
+
workspaces: [
|
|
52
|
+
{
|
|
53
|
+
id: configuredWorkspaceId,
|
|
54
|
+
has_access: result.data.has_access,
|
|
55
|
+
...(result.data.message !== undefined ? { message: result.data.message } : {}),
|
|
56
|
+
},
|
|
57
|
+
],
|
|
58
|
+
request_id: result.request_id,
|
|
59
|
+
};
|
|
60
|
+
return {
|
|
61
|
+
content: [
|
|
62
|
+
{
|
|
63
|
+
type: 'text',
|
|
64
|
+
text: JSON.stringify(output, null, 2),
|
|
65
|
+
},
|
|
66
|
+
],
|
|
67
|
+
structuredContent: output,
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=list-workspaces.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list-workspaces.js","sourceRoot":"","sources":["../../src/tools/list-workspaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,UAAU,EAAE,CAAC,CAAC,KAAK,CACjB,CAAC,CAAC,MAAM,CAAC;QACP,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;QACd,UAAU,EAAE,CAAC,CAAC,OAAO,EAAE;QACvB,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;KAC/B,CAAC,CACH;IACD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE;CACvB,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,2BAA2B,GACtC,uEAAuE;IACvE,mEAAmE,CAAC;AAEtE;;;;;;;GAOG;AACH,MAAM,UAAU,0BAA0B,CACxC,MAAqB,EACrB,qBAA6B;IAE7B,OAAO,KAAK,IAAI,EAAE;QAChB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,oBAAoB,EAAE,CAAC;QAEnD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,OAAO;gBACL,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE;oBACP;wBACE,IAAI,EAAE,MAAe;wBACrB,IAAI,EAAE,2BAA2B,MAAM,CAAC,KAAK,CAAC,IAAI,MAAM,MAAM,CAAC,KAAK,CAAC,OAAO,EAAE;qBAC/E;iBACF;gBACD,iBAAiB,EAAE;oBACjB,KAAK,EAAE,MAAM,CAAC,KAAK;oBACnB,UAAU,EAAE,MAAM,CAAC,UAAU;iBAC9B;aACF,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAyB;YACnC,UAAU,EAAE;gBACV;oBACE,EAAE,EAAE,qBAAqB;oBACzB,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU;oBAClC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC/E;aACF;YACD,UAAU,EAAE,MAAM,CAAC,UAAU;SAC9B,CAAC;QAEF,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;iBACtC;aACF;YACD,iBAAiB,EAAE,MAAM;SAC1B,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { MutatingTool, type ApplyFn, type MutatingToolDeps, type PlanResult } from '../conventions/dry-run/index.js';
|
|
3
|
+
import type { DryRunPlan } from '../conventions/dry-run/index.js';
|
|
4
|
+
import { type McpToolError } from '../conventions/errors.js';
|
|
5
|
+
export declare const MoveAssetInputSchema: z.ZodObject<{
|
|
6
|
+
asset_id: z.ZodUnion<[z.ZodNumber, z.ZodString]>;
|
|
7
|
+
destination_category_id: z.ZodNullable<z.ZodUnion<[z.ZodNumber, z.ZodString]>>;
|
|
8
|
+
/** Optional current category id for diff display; opaque otherwise. */
|
|
9
|
+
current_category_id: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodNumber, z.ZodString]>>>;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
asset_id: string | number;
|
|
12
|
+
destination_category_id: string | number | null;
|
|
13
|
+
current_category_id?: string | number | null | undefined;
|
|
14
|
+
}, {
|
|
15
|
+
asset_id: string | number;
|
|
16
|
+
destination_category_id: string | number | null;
|
|
17
|
+
current_category_id?: string | number | null | undefined;
|
|
18
|
+
}>;
|
|
19
|
+
export type MoveAssetInput = z.infer<typeof MoveAssetInputSchema>;
|
|
20
|
+
export declare const MOVE_ASSET_DESCRIPTION: string;
|
|
21
|
+
export interface MoveAssetItemResult {
|
|
22
|
+
asset_id: string;
|
|
23
|
+
destination_category_id: string | null;
|
|
24
|
+
}
|
|
25
|
+
export interface MoveAssetClient {
|
|
26
|
+
moveAsset(input: {
|
|
27
|
+
asset_id: string;
|
|
28
|
+
destination_category_id: string | null;
|
|
29
|
+
}): Promise<{
|
|
30
|
+
ok: true;
|
|
31
|
+
} | {
|
|
32
|
+
ok: false;
|
|
33
|
+
error: McpToolError;
|
|
34
|
+
}>;
|
|
35
|
+
}
|
|
36
|
+
export interface MoveAssetDeps extends MutatingToolDeps<MoveAssetInput> {
|
|
37
|
+
client: MoveAssetClient;
|
|
38
|
+
}
|
|
39
|
+
export declare class MoveAssetTool extends MutatingTool<MoveAssetInput, MoveAssetItemResult> {
|
|
40
|
+
readonly name = "move_asset";
|
|
41
|
+
protected readonly chunkSize = 1;
|
|
42
|
+
private readonly client;
|
|
43
|
+
constructor(deps: MoveAssetDeps);
|
|
44
|
+
protected plan(input: MoveAssetInput): PlanResult;
|
|
45
|
+
protected apply: ApplyFn<MoveAssetItemResult>;
|
|
46
|
+
}
|
|
47
|
+
export type MoveAssetPlan = DryRunPlan<MoveAssetInput>;
|
|
48
|
+
//# sourceMappingURL=move-asset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"move-asset.d.ts","sourceRoot":"","sources":["../../src/tools/move-asset.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,YAAY,EACZ,KAAK,OAAO,EACZ,KAAK,gBAAgB,EACrB,KAAK,UAAU,EAEhB,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAgB,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAG9E,eAAO,MAAM,oBAAoB;;;IAG/B,uEAAuE;;;;;;;;;;EAEvE,CAAC;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,sBAAsB,QAII,CAAC;AAExC,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,MAAM,CAAC;IACjB,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,KAAK,EAAE;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;KACxC,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;CAChE;AAED,MAAM,WAAW,aAAc,SAAQ,gBAAgB,CAAC,cAAc,CAAC;IACrE,MAAM,EAAE,eAAe,CAAC;CACzB;AAED,qBAAa,aAAc,SAAQ,YAAY,CAC7C,cAAc,EACd,mBAAmB,CACpB;IACC,QAAQ,CAAC,IAAI,gBAAgB;IAC7B,mBAA4B,SAAS,KAAK;IAE1C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;gBAE7B,IAAI,EAAE,aAAa;IAK/B,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,cAAc,GAAG,UAAU;IAsCjD,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,mBAAmB,CAAC,CA0B3C;CACH;AAED,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,cAAc,CAAC,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
// ── move_asset ───────────────────────────────────────────────────────
|
|
2
|
+
// Moves a single asset between folders. Two-step dry-run flow.
|
|
3
|
+
//
|
|
4
|
+
// Upstream surface:
|
|
5
|
+
// POST digital-assets/multiple-file-folder-move
|
|
6
|
+
// body: { workspace_id, assets_ids: number[], category_ids: number[],
|
|
7
|
+
// move_id: destinationFolderId | null }
|
|
8
|
+
//
|
|
9
|
+
// MVP scope: one asset per call. Bulk move is Phase 1.5
|
|
10
|
+
// (`bulk_move_assets`).
|
|
11
|
+
import { z } from 'zod';
|
|
12
|
+
import { MutatingTool, } from '../conventions/dry-run/index.js';
|
|
13
|
+
import { createToolError } from '../conventions/errors.js';
|
|
14
|
+
import { IdSchema } from '../types.js';
|
|
15
|
+
export const MoveAssetInputSchema = z.object({
|
|
16
|
+
asset_id: IdSchema,
|
|
17
|
+
destination_category_id: IdSchema.nullable(),
|
|
18
|
+
/** Optional current category id for diff display; opaque otherwise. */
|
|
19
|
+
current_category_id: IdSchema.nullable().optional(),
|
|
20
|
+
});
|
|
21
|
+
export const MOVE_ASSET_DESCRIPTION = 'Move a single asset to a different folder. Pass `destination_category_id: null` ' +
|
|
22
|
+
'to move the asset out to the workspace root (uncategorised). Two-step: ' +
|
|
23
|
+
'first call returns a preview plus a confirmation_token; second call ' +
|
|
24
|
+
'(with the token) executes the move.';
|
|
25
|
+
export class MoveAssetTool extends MutatingTool {
|
|
26
|
+
name = 'move_asset';
|
|
27
|
+
chunkSize = 1;
|
|
28
|
+
client;
|
|
29
|
+
constructor(deps) {
|
|
30
|
+
super(deps);
|
|
31
|
+
this.client = deps.client;
|
|
32
|
+
}
|
|
33
|
+
plan(input) {
|
|
34
|
+
const assetId = String(input.asset_id);
|
|
35
|
+
const dest = input.destination_category_id === null
|
|
36
|
+
? null
|
|
37
|
+
: String(input.destination_category_id);
|
|
38
|
+
const before = input.current_category_id === undefined
|
|
39
|
+
? '(unknown)'
|
|
40
|
+
: input.current_category_id === null
|
|
41
|
+
? null
|
|
42
|
+
: String(input.current_category_id);
|
|
43
|
+
const change = {
|
|
44
|
+
id: assetId,
|
|
45
|
+
operation: 'update',
|
|
46
|
+
before: { category_id: before },
|
|
47
|
+
after: { category_id: dest },
|
|
48
|
+
metadata: { asset_id: assetId, destination_category_id: dest },
|
|
49
|
+
};
|
|
50
|
+
const riskFlags = [];
|
|
51
|
+
if (input.current_category_id !== undefined &&
|
|
52
|
+
input.current_category_id !== null &&
|
|
53
|
+
String(input.current_category_id) === dest) {
|
|
54
|
+
riskFlags.push({
|
|
55
|
+
code: 'noop_move',
|
|
56
|
+
severity: 'info',
|
|
57
|
+
message: 'destination is the asset\'s current folder (no-op)',
|
|
58
|
+
count: 1,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return { changes: [change], riskFlags };
|
|
62
|
+
}
|
|
63
|
+
apply = async (change) => {
|
|
64
|
+
const meta = (change.metadata ?? {});
|
|
65
|
+
if (typeof meta.asset_id !== 'string' || meta.asset_id.length === 0) {
|
|
66
|
+
return {
|
|
67
|
+
ok: false,
|
|
68
|
+
error: createToolError('VALIDATION', `change ${change.id} missing asset_id`),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
const dest = meta.destination_category_id ?? null;
|
|
72
|
+
const result = await this.client.moveAsset({
|
|
73
|
+
asset_id: meta.asset_id,
|
|
74
|
+
destination_category_id: dest,
|
|
75
|
+
});
|
|
76
|
+
if (!result.ok) {
|
|
77
|
+
return { ok: false, error: result.error };
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
ok: true,
|
|
81
|
+
result: { asset_id: meta.asset_id, destination_category_id: dest },
|
|
82
|
+
};
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
//# sourceMappingURL=move-asset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"move-asset.js","sourceRoot":"","sources":["../../src/tools/move-asset.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { MutatingTool, type MutatingToolDeps, type PlanResult, type ApplyFn } from '../conventions/dry-run/index.js';
|
|
3
|
+
import type { DryRunPlan } from '../conventions/dry-run/index.js';
|
|
4
|
+
import { type McpToolError } from '../conventions/errors.js';
|
|
5
|
+
export declare const RenameAssetItemSchema: z.ZodObject<{
|
|
6
|
+
asset_id: z.ZodUnion<[z.ZodNumber, z.ZodString]>;
|
|
7
|
+
/** Current name (used for the diff preview; optional — looked up if absent). */
|
|
8
|
+
current_name: z.ZodOptional<z.ZodString>;
|
|
9
|
+
new_name: z.ZodString;
|
|
10
|
+
}, "strip", z.ZodTypeAny, {
|
|
11
|
+
asset_id: string | number;
|
|
12
|
+
new_name: string;
|
|
13
|
+
current_name?: string | undefined;
|
|
14
|
+
}, {
|
|
15
|
+
asset_id: string | number;
|
|
16
|
+
new_name: string;
|
|
17
|
+
current_name?: string | undefined;
|
|
18
|
+
}>;
|
|
19
|
+
export type RenameAssetItem = z.infer<typeof RenameAssetItemSchema>;
|
|
20
|
+
export declare const RenameAssetInputSchema: z.ZodObject<{
|
|
21
|
+
renames: z.ZodArray<z.ZodObject<{
|
|
22
|
+
asset_id: z.ZodUnion<[z.ZodNumber, z.ZodString]>;
|
|
23
|
+
/** Current name (used for the diff preview; optional — looked up if absent). */
|
|
24
|
+
current_name: z.ZodOptional<z.ZodString>;
|
|
25
|
+
new_name: z.ZodString;
|
|
26
|
+
}, "strip", z.ZodTypeAny, {
|
|
27
|
+
asset_id: string | number;
|
|
28
|
+
new_name: string;
|
|
29
|
+
current_name?: string | undefined;
|
|
30
|
+
}, {
|
|
31
|
+
asset_id: string | number;
|
|
32
|
+
new_name: string;
|
|
33
|
+
current_name?: string | undefined;
|
|
34
|
+
}>, "many">;
|
|
35
|
+
}, "strip", z.ZodTypeAny, {
|
|
36
|
+
renames: {
|
|
37
|
+
asset_id: string | number;
|
|
38
|
+
new_name: string;
|
|
39
|
+
current_name?: string | undefined;
|
|
40
|
+
}[];
|
|
41
|
+
}, {
|
|
42
|
+
renames: {
|
|
43
|
+
asset_id: string | number;
|
|
44
|
+
new_name: string;
|
|
45
|
+
current_name?: string | undefined;
|
|
46
|
+
}[];
|
|
47
|
+
}>;
|
|
48
|
+
export type RenameAssetInput = z.infer<typeof RenameAssetInputSchema>;
|
|
49
|
+
export declare const RENAME_ASSET_DESCRIPTION: string;
|
|
50
|
+
export interface RenameAssetItemResult {
|
|
51
|
+
asset_id: string;
|
|
52
|
+
new_name: string;
|
|
53
|
+
}
|
|
54
|
+
export interface RenameAssetClient {
|
|
55
|
+
/** Lookup current name for diff display. Returns null if unavailable. */
|
|
56
|
+
getCurrentName(assetId: string): Promise<string | null>;
|
|
57
|
+
/** Perform the rename. Returns ok or a typed error. */
|
|
58
|
+
renameAsset(assetId: string, newName: string): Promise<{
|
|
59
|
+
ok: true;
|
|
60
|
+
} | {
|
|
61
|
+
ok: false;
|
|
62
|
+
error: McpToolError;
|
|
63
|
+
}>;
|
|
64
|
+
}
|
|
65
|
+
export interface RenameAssetDeps extends MutatingToolDeps<RenameAssetInput> {
|
|
66
|
+
client: RenameAssetClient;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Reference implementation that exercises every framework hook:
|
|
70
|
+
* planning, risk-flagging (rename to identical name = no-op flag,
|
|
71
|
+
* rename to a name longer than 200 chars = warning flag), batched
|
|
72
|
+
* execution, and per-item ledger.
|
|
73
|
+
*/
|
|
74
|
+
export declare class RenameAssetTool extends MutatingTool<RenameAssetInput, RenameAssetItemResult> {
|
|
75
|
+
readonly name = "rename_asset";
|
|
76
|
+
protected readonly chunkSize = 25;
|
|
77
|
+
constructor(deps: RenameAssetDeps);
|
|
78
|
+
private readonly client;
|
|
79
|
+
protected plan(input: RenameAssetInput): Promise<PlanResult>;
|
|
80
|
+
protected apply: ApplyFn<RenameAssetItemResult>;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Convenience factory for wiring the tool into the MCP server. Mirrors the
|
|
84
|
+
* pattern used by read-only tools.
|
|
85
|
+
*/
|
|
86
|
+
export declare function buildRenameAssetTool(deps: RenameAssetDeps): RenameAssetTool;
|
|
87
|
+
export type RenameAssetPlan = DryRunPlan<RenameAssetInput>;
|
|
88
|
+
//# sourceMappingURL=rename-asset.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rename-asset.d.ts","sourceRoot":"","sources":["../../src/tools/rename-asset.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,UAAU,EACf,KAAK,OAAO,EACb,MAAM,iCAAiC,CAAC;AACzC,OAAO,KAAK,EAAgB,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAChF,OAAO,EAAmB,KAAK,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAI9E,eAAO,MAAM,qBAAqB;;IAEhC,gFAAgF;;;;;;;;;;;EAGhF,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,sBAAsB;;;QANjC,gFAAgF;;;;;;;;;;;;;;;;;;;;;;;;EAQhF,CAAC;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAEtE,eAAO,MAAM,wBAAwB,QAGgB,CAAC;AAItD,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAKD,MAAM,WAAW,iBAAiB;IAChC,yEAAyE;IACzE,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACxD,uDAAuD;IACvD,WAAW,CACT,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,KAAK,EAAE,YAAY,CAAA;KAAE,CAAC,CAAC;CAC/D;AAID,MAAM,WAAW,eAAgB,SAAQ,gBAAgB,CAAC,gBAAgB,CAAC;IACzE,MAAM,EAAE,iBAAiB,CAAC;CAC3B;AAED;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,YAAY,CAAC,gBAAgB,EAAE,qBAAqB,CAAC;IACxF,QAAQ,CAAC,IAAI,kBAAkB;IAC/B,mBAA4B,SAAS,MAAM;gBAE/B,IAAI,EAAE,eAAe;IAKjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoB;cAE3B,IAAI,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IA6ClE,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,qBAAqB,CAAC,CAc7C;CACH;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,eAAe,GAAG,eAAe,CAE3E;AAGD,MAAM,MAAM,eAAe,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
// ── rename_asset (Reference Implementation) ──────────────────────────
|
|
2
|
+
// End-to-end demonstration of the dry-run framework. Renames one or more
|
|
3
|
+
// assets in a single tool call. Real upstream calls are injected via the
|
|
4
|
+
// `client` dependency so the tool is fully testable without HTTP.
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { MutatingTool, } from '../conventions/dry-run/index.js';
|
|
7
|
+
import { createToolError } from '../conventions/errors.js';
|
|
8
|
+
// ── Tool I/O Schema ──────────────────────────────────────────────────
|
|
9
|
+
export const RenameAssetItemSchema = z.object({
|
|
10
|
+
asset_id: z.union([z.number().int().positive(), z.string().min(1)]),
|
|
11
|
+
/** Current name (used for the diff preview; optional — looked up if absent). */
|
|
12
|
+
current_name: z.string().min(1).optional(),
|
|
13
|
+
new_name: z.string().min(1).max(255),
|
|
14
|
+
});
|
|
15
|
+
export const RenameAssetInputSchema = z.object({
|
|
16
|
+
renames: z.array(RenameAssetItemSchema).min(1).max(500),
|
|
17
|
+
});
|
|
18
|
+
export const RENAME_ASSET_DESCRIPTION = 'Rename one or more Collage assets. Two-step: first call returns a preview ' +
|
|
19
|
+
'plus a confirmation_token; second call (with the token) executes the ' +
|
|
20
|
+
'renames in batches and returns a per-item ledger.';
|
|
21
|
+
/**
|
|
22
|
+
* Reference implementation that exercises every framework hook:
|
|
23
|
+
* planning, risk-flagging (rename to identical name = no-op flag,
|
|
24
|
+
* rename to a name longer than 200 chars = warning flag), batched
|
|
25
|
+
* execution, and per-item ledger.
|
|
26
|
+
*/
|
|
27
|
+
export class RenameAssetTool extends MutatingTool {
|
|
28
|
+
name = 'rename_asset';
|
|
29
|
+
chunkSize = 25;
|
|
30
|
+
constructor(deps) {
|
|
31
|
+
super(deps);
|
|
32
|
+
this.client = deps.client;
|
|
33
|
+
}
|
|
34
|
+
client;
|
|
35
|
+
async plan(input) {
|
|
36
|
+
const changes = [];
|
|
37
|
+
let noopCount = 0;
|
|
38
|
+
let longNameCount = 0;
|
|
39
|
+
for (const item of input.renames) {
|
|
40
|
+
const id = String(item.asset_id);
|
|
41
|
+
const before = item.current_name ?? (await this.client.getCurrentName(id)) ?? '(unknown)';
|
|
42
|
+
const isNoop = before === item.new_name;
|
|
43
|
+
if (isNoop)
|
|
44
|
+
noopCount++;
|
|
45
|
+
if (item.new_name.length > 200)
|
|
46
|
+
longNameCount++;
|
|
47
|
+
changes.push({
|
|
48
|
+
id,
|
|
49
|
+
operation: 'update',
|
|
50
|
+
before: { name: before },
|
|
51
|
+
after: { name: item.new_name },
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
const riskFlags = [];
|
|
55
|
+
if (noopCount > 0) {
|
|
56
|
+
riskFlags.push({
|
|
57
|
+
code: 'noop_rename',
|
|
58
|
+
severity: 'info',
|
|
59
|
+
message: 'rename to identical name (no-op)',
|
|
60
|
+
count: noopCount,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
if (longNameCount > 0) {
|
|
64
|
+
riskFlags.push({
|
|
65
|
+
code: 'long_name',
|
|
66
|
+
severity: 'warning',
|
|
67
|
+
message: 'name exceeds 200 characters',
|
|
68
|
+
count: longNameCount,
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
changes,
|
|
73
|
+
riskFlags,
|
|
74
|
+
extraAggregates: { noops: noopCount, long_names: longNameCount },
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
apply = async (change) => {
|
|
78
|
+
const after = change.after ?? {};
|
|
79
|
+
const newName = typeof after['name'] === 'string' ? after['name'] : null;
|
|
80
|
+
if (newName === null) {
|
|
81
|
+
return {
|
|
82
|
+
ok: false,
|
|
83
|
+
error: createToolError('VALIDATION', `change ${change.id} missing after.name`),
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
const result = await this.client.renameAsset(change.id, newName);
|
|
87
|
+
if (result.ok) {
|
|
88
|
+
return { ok: true, result: { asset_id: change.id, new_name: newName } };
|
|
89
|
+
}
|
|
90
|
+
return { ok: false, error: result.error };
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Convenience factory for wiring the tool into the MCP server. Mirrors the
|
|
95
|
+
* pattern used by read-only tools.
|
|
96
|
+
*/
|
|
97
|
+
export function buildRenameAssetTool(deps) {
|
|
98
|
+
return new RenameAssetTool(deps);
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=rename-asset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rename-asset.js","sourceRoot":"","sources":["../../src/tools/rename-asset.ts"],"names":[],"mappings":"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"}
|