@etm-professional-control/winccoa-mcp-server
Version:
MCP Server for WinCC OA with field-specific configurations
55 lines (52 loc) • 2.24 kB
JavaScript
import { z } from 'zod';
import { createSuccessResponse, createErrorResponse } from '../../utils/helpers.js';
/**
* Register datapoint set tools
* @param {McpServer} server - MCP server instance
* @param {Object} context - Server context with winccoa, configs, etc.
* @returns {number} Number of tools registered
*/
export function registerTools(server, context) {
const { winccoa } = context;
server.tool("dp-set", `Set value of datapoint element(s) in WinCC OA.
For a single datapoint: pass as object with dpeName and value
For multiple datapoints: pass as array of objects with dpeName and value
Example single: { dpeName: 'System1:Pump.cmd.start', value: true }
Example multiple: [{ dpeName: 'System1:Pump.cmd.start', value: true }, { dpeName: 'System1:Valve.cmd.open', value: 50 }]
CAUTION: This operation directly controls real industrial equipment. Use with care in production environments.
`, {
datapoints: z.union([
z.object({
dpeName: z.string(),
value: z.any()
}),
z.array(z.object({
dpeName: z.string(),
value: z.any()
}))
]),
}, async ({ datapoints }) => {
try {
const dpArray = Array.isArray(datapoints) ? datapoints : [datapoints];
const results = {};
for (const dp of dpArray) {
try {
console.log(`🔄 Setting ${dp.dpeName} = ${dp.value}`);
const result = winccoa.dpSet(dp.dpeName, dp.value);
results[dp.dpeName] = { success: true, result };
}
catch (error) {
console.error(`❌ Error setting ${dp.dpeName}:`, error.message);
results[dp.dpeName] = { success: false, error: error.message };
}
}
return createSuccessResponse(results);
}
catch (error) {
console.error(`Error in dp-set:`, error);
return createErrorResponse(`Failed to set datapoints: ${error.message}`);
}
});
return 1; // Number of tools registered
}
//# sourceMappingURL=dp_set.js.map