import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
import type { ToolContext } from "../utils/api.js";
const json = (d: unknown) => ({ type: "text" as const, text: JSON.stringify(d, null, 2) });
export function registerAssets(server: McpServer, ctx: ToolContext): void {
const { api, requireConfig, buildQuery } = ctx;
server.registerTool(
"fetch_assets",
{
description: "List assets. Optional folder_id, per_page, page, filter_query.",
inputSchema: { folder_id: z.string().optional(), per_page: z.number().optional(), page: z.number().optional(), filter_query: z.string().optional() },
},
async (a) => {
requireConfig();
const q = buildQuery({
folder_id: a?.folder_id,
per_page: a?.per_page,
page: a?.page,
filter_query: a?.filter_query,
});
const d = await api(`/assets${q}`);
return { content: [json(d)] };
}
);
server.registerTool(
"get_asset",
{ description: "Get an asset by ID.", inputSchema: { asset_id: z.string() } },
async ({ asset_id }) => {
requireConfig();
const d = await api(`/assets/${asset_id}`);
return { content: [json(d)] };
}
);
server.registerTool(
"update_asset",
{
description: "Update asset metadata: filename, asset_folder_id, alt, title, copyright, etc.",
inputSchema: {
asset_id: z.string(),
filename: z.string().optional(),
asset_folder_id: z.string().optional(),
alt: z.string().optional(),
title: z.string().optional(),
copyright: z.string().optional(),
},
},
async ({ asset_id, ...meta }) => {
requireConfig();
const d = await api(`/assets/${asset_id}`, { method: "PUT", body: JSON.stringify({ asset: meta }) });
return { content: [json(d)] };
}
);
server.registerTool(
"delete_asset",
{ description: "Delete an asset by ID.", inputSchema: { asset_id: z.string() } },
async ({ asset_id }) => {
requireConfig();
await api(`/assets/${asset_id}`, { method: "DELETE" });
return { content: [json({ success: true })] };
}
);
server.registerTool(
"bulk_move_assets",
{
description: "Move multiple assets to a folder.",
inputSchema: { asset_ids: z.array(z.string()), asset_folder_id: z.string() },
},
async (body) => {
requireConfig();
const d = await api("/assets/bulk_move", { method: "POST", body: JSON.stringify(body) });
return { content: [json(d)] };
}
);
server.registerTool(
"bulk_delete_assets",
{ description: "Delete multiple assets.", inputSchema: { asset_ids: z.array(z.string()) } },
async (body) => {
requireConfig();
const d = await api("/assets/bulk_delete", { method: "POST", body: JSON.stringify(body) });
return { content: [json(d)] };
}
);
server.registerTool(
"bulk_restore_assets",
{ description: "Restore multiple deleted assets.", inputSchema: { asset_ids: z.array(z.string()) } },
async (body) => {
requireConfig();
const d = await api("/assets/bulk_restore", { method: "POST", body: JSON.stringify(body) });
return { content: [json(d)] };
}
);
}