File size: 2,988 Bytes
07af8f3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/**
 * Utility functions for converting parameter types based on JSON schema definitions
 */

/**
 * Convert parameters to their proper types based on the tool's input schema
 * This ensures that form-submitted string values are converted to the correct types
 * (e.g., numbers, booleans, arrays) before being passed to MCP tools.
 *
 * @param params - The parameters to convert (typically from form submission)
 * @param inputSchema - The JSON schema definition for the tool's input
 * @returns The converted parameters with proper types
 */
export function convertParametersToTypes(
  params: Record<string, any>,
  inputSchema: Record<string, any>,
): Record<string, any> {
  if (!inputSchema || typeof inputSchema !== 'object' || !inputSchema.properties) {
    return params;
  }

  const convertedParams: Record<string, any> = {};
  const properties = inputSchema.properties;

  for (const [key, value] of Object.entries(params)) {
    const propDef = properties[key];
    if (!propDef || typeof propDef !== 'object') {
      // No schema definition found, keep as is
      convertedParams[key] = value;
      continue;
    }

    const propType = propDef.type;

    try {
      switch (propType) {
        case 'integer':
        case 'number':
          // Convert string to number
          if (typeof value === 'string') {
            const numValue = propType === 'integer' ? parseInt(value, 10) : parseFloat(value);
            convertedParams[key] = isNaN(numValue) ? value : numValue;
          } else {
            convertedParams[key] = value;
          }
          break;

        case 'boolean':
          // Convert string to boolean
          if (typeof value === 'string') {
            convertedParams[key] = value.toLowerCase() === 'true' || value === '1';
          } else {
            convertedParams[key] = value;
          }
          break;

        case 'array':
          // Handle array conversion if needed (e.g., comma-separated strings)
          if (typeof value === 'string' && value.includes(',')) {
            convertedParams[key] = value.split(',').map((item) => item.trim());
          } else {
            convertedParams[key] = value;
          }
          break;

        case 'object':
          // Handle object conversion if needed
          if (typeof value === 'string') {
            try {
              convertedParams[key] = JSON.parse(value);
            } catch {
              // If parsing fails, keep as is
              convertedParams[key] = value;
            }
          } else {
            convertedParams[key] = value;
          }
          break;

        default:
          // For string and other types, keep as is
          convertedParams[key] = value;
          break;
      }
    } catch (error) {
      // If conversion fails, keep the original value
      console.warn(`Failed to convert parameter '${key}' to type '${propType}':`, error);
      convertedParams[key] = value;
    }
  }

  return convertedParams;
}