import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
import { DataverseClient } from "../dataverse-client.js";
export const registerWebResourceTools = (server: McpServer) => {
server.tool(
"deploy_web_resource",
{
name: "deploy_web_resource",
description: "Deploys or updates a Web Resource (JS, CSS, HTML, XML) in the Dataverse environment.", // ΠΡΟΣΘΕΣΕ ΑΥΤΟ
inputSchema: {
type: "object",
properties: {
name: { type: "string" },
displayname: { type: "string" },
type: { type: "number" },
content: { type: "string" },
solutionUniqueName: { type: "string" },
}
}
}
,
async (args, extra: any) => {
const client = new DataverseClient(extra.headers as any);
const base64Content = Buffer.from(args.content).toString('base64');
try {
// 1. Αναζήτηση στον υπάρχοντα συστημικό πίνακα webresourceset
const existing = await client.get(`webresourceset?$filter=name eq '${args.name}'&$select=webresourceid`);
let webresourceid: string;
if (existing.value && existing.value.length > 0) {
// UPDATE υπάρχοντος
webresourceid = existing.value[0].webresourceid;
await client.patch(`webresourceset(${webresourceid})`, {
content: base64Content,
displayname: args.displayname || args.name
});
} else {
// CREATE νέου (στον ίδιο πίνακα)
await client.post(`webresourceset`, {
name: args.name,
displayname: args.displayname || args.name,
content: base64Content,
webresourcetype: args.webresourcetype
});
const check = await client.get(`webresourceset?$filter=name eq '${args.name}'&$select=webresourceid`);
webresourceid = check.value[0].webresourceid;
}
// 2. Σύνδεση με το Solution (AddSolutionComponent)
await client.post('AddSolutionComponent', {
ComponentId: webresourceid,
ComponentType: 61,
SolutionUniqueName: args.solution_unique_name,
AddRequiredComponents: false,
DoNotIncludeSubcomponents: true
});
// 3. Δημοσίευση (Publish)
const parameterXml = `<importexportxml><webresources><webresource>${webresourceid}</webresource></webresources></importexportxml>`;
await client.post('PublishXml', { ParameterXml: parameterXml });
return {
content: [{ type: "text", text: `✅ Επιτυχία! Το '${args.name}' αναπτύχθηκε στον πίνακα webresource, προστέθηκε στο solution '${args.solution_unique_name}' και έγινε publish.` }]
};
} catch (error: any) {
return { content: [{ type: "text", text: `Σφάλμα Deployment: ${error.message}` }], isError: true };
}
}
);
server.tool(
"delete_web_resource",
{
name: "delete_web_resource",
description: "Deletes a specific Web Resource from the Dataverse environment by its unique name.", // ΠΡΟΣΘΕΣΕ ΑΥΤΟ
inputSchema: {
type: "object",
properties: {
name: { type: "string" },
}
}
},
async (args, extra: any) => {
const client = new DataverseClient(extra.headers as any);
try {
const existing = await client.get(`webresourceset?$filter=name eq '${args.name}'&$select=webresourceid`);
if (!existing.value || existing.value.length === 0) {
return { content: [{ type: "text", text: `Το Web Resource '${args.name}' δεν βρέθηκε.` }], isError: true };
}
const webresourceid = existing.value[0].webresourceid;
await client.delete(`webresourceset(${webresourceid})`);
return {
content: [{ type: "text", text: `✅ Το Web Resource '${args.name}' διαγράφηκε επιτυχώς από τον πίνακα webresource.` }]
};
} catch (error: any) {
return { content: [{ type: "text", text: `Σφάλμα Διαγραφής: ${error.message}` }], isError: true };
}
}
);
};