// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the MIT License. import { McpToolProperty, McpToolTriggerOptions, McpToolTriggerOptionsToRpc } from '../../types'; import { normalizeToolProperties } from '../utils/toolProperties'; // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the MIT License. /** * Converts an McpToolTriggerOptions object to an McpToolTriggerOptionsToRpc object. * * @param mcpToolTriggerOptions - The input options to be converted. * @returns The converted McpToolTriggerOptionsToRpc object. */ export function converToMcpToolTriggerOptionsToRpc( mcpToolTriggerOptions: McpToolTriggerOptions ): McpToolTriggerOptionsToRpc { // Validate metadata if provided - skip empty/whitespace strings let validatedMetadata: string | undefined; if ( mcpToolTriggerOptions.metadata !== undefined && typeof mcpToolTriggerOptions.metadata === 'string' && mcpToolTriggerOptions.metadata.trim() !== '' ) { try { JSON.parse(mcpToolTriggerOptions.metadata); validatedMetadata = mcpToolTriggerOptions.metadata; } catch (e) { throw new Error('MCP Tool trigger "metadata" must be a valid JSON string.'); } } // Base object for the return value - metadata is independent of toolProperties const baseResult = { toolName: mcpToolTriggerOptions.toolName, description: mcpToolTriggerOptions.description, ...(validatedMetadata !== undefined && { metadata: validatedMetadata }), }; // Try to normalize tool properties first (handles both array and fluent formats) let normalizedProperties: McpToolProperty[] | undefined; try { // eslint-disable-next-line @typescript-eslint/no-unsafe-argument normalizedProperties = normalizeToolProperties(mcpToolTriggerOptions.toolProperties); } catch (error) { // Re-throw validation errors from normalizeToolProperties if ( error instanceof Error && (error.message.includes('Property type is required') || error.message.includes('Property type must be specified')) ) { throw error; } normalizedProperties = undefined; } // If we successfully normalized the properties, use them if (normalizedProperties !== undefined) { return { ...baseResult, toolProperties: JSON.stringify(normalizedProperties), }; } // Handle cases where toolProperties is not an array throw new Error( `Invalid toolProperties for tool '${mcpToolTriggerOptions.toolName}': Expected an array of McpToolProperty or ToolProps objects or ToolProps need a type defined.` ); }