@sylphlab/mcp-net-core
Version:
Core logic for MCP network tools
1 lines • 39 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/tools/getPublicIpTool.ts","../src/tools/getPublicIpTool.schema.ts","../src/tools/getInterfacesTool.ts","../src/tools/getInterfacesTool.schema.ts","../src/tools/downloadTool.ts","../src/tools/downloadTool.schema.ts","../src/tools/fetchTool.ts","../src/tools/fetchTool.schema.ts"],"sourcesContent":["// src/index.ts for @sylphlab/mcp-net-core\n\n// --- Get Public IP Tool ---\nexport { getPublicIpTool } from './tools/getPublicIpTool.js';\nexport { GetPublicIpToolInputSchema } from './tools/getPublicIpTool.schema.js'; // Export schema from schema file\nexport type { GetPublicIpToolInput, GetPublicIpResult } from './tools/getPublicIpTool.js';\n\n// --- Get Interfaces Tool ---\nexport { getInterfacesTool } from './tools/getInterfacesTool.js';\nexport { GetInterfacesToolInputSchema } from './tools/getInterfacesTool.schema.js'; // Export schema from schema file\nexport type {\n GetInterfacesToolInput,\n GetInterfacesResult,\n NetworkInterfaces,\n} from './tools/getInterfacesTool.js';\n\n// --- Download Tool ---\nexport { downloadTool } from './tools/downloadTool.js';\nexport { downloadToolInputSchema } from './tools/downloadTool.schema.js';\nexport type { DownloadResultItem } from './tools/downloadTool.types.js'; // Correct path for output interface\n\n// --- Fetch Tool ---\nexport { fetchTool } from './tools/fetchTool.js';\nexport type {\n FetchToolInput,\n FetchResultItem,\n FetchInputItem,\n} from './tools/fetchTool.js';\n","import { defineTool } from '@sylphlab/mcp-core';\nimport { jsonPart } from '@sylphlab/mcp-core';\nimport type { McpToolExecuteOptions, Part } from '@sylphlab/mcp-core';\nimport { z } from 'zod';\nimport { GetPublicIpToolInputSchema } from './getPublicIpTool.schema.js';\n\n// --- TypeScript Types ---\nexport type GetPublicIpToolInput = z.infer<typeof GetPublicIpToolInputSchema>;\n\n// --- Output Types ---\nexport interface GetPublicIpResult {\n /** Optional ID from the input. */\n id?: string;\n /** Whether retrieving the public IP was successful. */\n success: boolean;\n /** The public IP address string, if successful. */\n ip?: string;\n /** Error message, if retrieval failed. */\n error?: string;\n /** Suggestion for fixing the error. */\n suggestion?: string;\n}\n\n// Zod Schema for the individual result\nconst GetPublicIpResultSchema = z.object({\n id: z.string().optional(),\n success: z.boolean(),\n ip: z.string().optional(),\n error: z.string().optional(),\n suggestion: z.string().optional(),\n});\n\n// Define the output schema instance as a constant array\nconst GetPublicIpOutputSchema = z.array(GetPublicIpResultSchema);\n\n// --- Helper Function ---\n\n// Helper to fetch public IP with fallback\nasync function fetchPublicIp(): Promise<{ ip: string | null; error: string | null }> {\n try {\n const response = await fetch('https://ipinfo.io/json');\n if (!response.ok) throw new Error(`ipinfo.io HTTP error! status: ${response.status}`);\n const data = await response.json();\n if (typeof data?.ip !== 'string')\n throw new Error('IP address not found or invalid in response from ipinfo.io');\n return { ip: data.ip, error: null };\n } catch (e: unknown) {\n const errorMsg = `Failed to fetch public IP from ipinfo.io: ${e instanceof Error ? e.message : String(e)}`;\n // Attempt fallback\n try {\n const fallbackResponse = await fetch('https://api.ipify.org?format=json');\n if (!fallbackResponse.ok)\n throw new Error(`api.ipify.org HTTP error! status: ${fallbackResponse.status}`);\n const fallbackData = await fallbackResponse.json();\n if (typeof fallbackData?.ip !== 'string')\n throw new Error('IP address not found or invalid in fallback response from api.ipify.org');\n return { ip: fallbackData.ip, error: null };\n } catch (fallbackError: unknown) {\n const fallbackErrorMsg = `Fallback failed: ${fallbackError instanceof Error ? fallbackError.message : String(fallbackError)}`;\n return { ip: null, error: `${errorMsg}. ${fallbackErrorMsg}` }; // Combine errors\n }\n }\n}\n\n// --- Tool Definition using defineTool ---\nexport const getPublicIpTool = defineTool({\n name: 'getPublicIp',\n description: 'Retrieves the public IP address of the machine running the MCP server.',\n inputSchema: GetPublicIpToolInputSchema,\n outputSchema: GetPublicIpOutputSchema, // Use the array schema\n\n execute: async (\n input: GetPublicIpToolInput,\n _options: McpToolExecuteOptions,\n ): Promise<Part[]> => {\n // Return Part[]\n\n // Zod validation (throw error on failure)\n const parsed = GetPublicIpToolInputSchema.safeParse(input);\n if (!parsed.success) {\n const errorMessages = Object.entries(parsed.error.flatten().fieldErrors)\n .map(([field, messages]) => `${field}: ${messages.join(', ')}`)\n .join('; ');\n throw new Error(`Input validation failed: ${errorMessages}`);\n }\n const { id } = parsed.data; // Input schema might be empty\n\n const results: GetPublicIpResult[] = [];\n let ip: string | undefined;\n let error: string | undefined;\n let suggestion: string | undefined;\n let success = false;\n\n try {\n const publicIpInfo = await fetchPublicIp();\n\n if (publicIpInfo.error) {\n // If helper returned an error (primary and fallback failed)\n throw new Error(publicIpInfo.error);\n }\n\n // If helper returned an IP (should always happen if no error)\n if (publicIpInfo.ip) {\n ip = publicIpInfo.ip;\n success = true;\n } else {\n // This case should theoretically not be reached if fetchPublicIp is correct\n throw new Error('Public IP could not be determined despite no specific error reported.');\n }\n } catch (e: unknown) {\n success = false;\n error = e instanceof Error ? e.message : 'Unknown error retrieving public IP';\n suggestion =\n 'Check network connectivity and reachability of public IP services (ipinfo.io, api.ipify.org).';\n ip = undefined;\n }\n\n // Push the single result\n results.push({\n id,\n success,\n ip,\n error,\n suggestion,\n });\n\n // Return the result wrapped in jsonPart\n return [jsonPart(results, GetPublicIpOutputSchema)];\n },\n});\n\n// Export necessary types\n","import { z } from 'zod';\n\n// Input schema - no parameters needed for this specific tool\nexport const GetPublicIpToolInputSchema = z.object({\n id: z.string().optional(), // Keep id for correlation if used in batch by server\n});\n","import os from 'node:os';\nimport { defineTool } from '@sylphlab/mcp-core';\nimport { jsonPart } from '@sylphlab/mcp-core';\nimport type { McpToolExecuteOptions, Part } from '@sylphlab/mcp-core';\nimport { z } from 'zod';\nimport { GetInterfacesToolInputSchema } from './getInterfacesTool.schema.js';\n\n// --- TypeScript Types ---\nexport type GetInterfacesToolInput = z.infer<typeof GetInterfacesToolInputSchema>;\n\n// Define a more specific type for the result based on os.networkInterfaces()\nexport type NetworkInterfaces = { [key: string]: os.NetworkInterfaceInfo[] | undefined };\n\n// --- Output Types ---\nexport interface GetInterfacesResult {\n /** Optional ID from the input. */\n id?: string;\n /** Whether retrieving interfaces was successful. */\n success: boolean;\n /** The network interfaces object, if successful. */\n result?: NetworkInterfaces;\n /** Error message, if retrieval failed. */\n error?: string;\n /** Suggestion for fixing the error. */\n suggestion?: string;\n}\n\n// Zod Schema for the individual result\nconst GetInterfacesResultSchema = z.object({\n id: z.string().optional(),\n success: z.boolean(),\n // Using z.custom for complex os types, refine if needed\n result: z.custom<NetworkInterfaces>().optional(),\n error: z.string().optional(),\n suggestion: z.string().optional(),\n});\n\n// Define the output schema instance as a constant array\nconst GetInterfacesOutputSchema = z.array(GetInterfacesResultSchema);\n\n// --- Tool Definition using defineTool ---\nexport const getInterfacesTool = defineTool({\n name: 'getInterfaces',\n description: 'Retrieves details about the network interfaces on the machine.',\n inputSchema: GetInterfacesToolInputSchema,\n outputSchema: GetInterfacesOutputSchema, // Use the array schema\n\n execute: async (\n input: GetInterfacesToolInput,\n _options: McpToolExecuteOptions,\n ): Promise<Part[]> => {\n // Return Part[]\n\n // Zod validation (throw error on failure)\n const parsed = GetInterfacesToolInputSchema.safeParse(input);\n if (!parsed.success) {\n const errorMessages = Object.entries(parsed.error.flatten().fieldErrors)\n .map(([field, messages]) => `${field}: ${messages.join(', ')}`)\n .join('; ');\n throw new Error(`Input validation failed: ${errorMessages}`);\n }\n const { id } = parsed.data; // Input schema might be empty, handle accordingly\n\n const results: GetInterfacesResult[] = [];\n let interfaces: NetworkInterfaces | undefined;\n let error: string | undefined;\n let suggestion: string | undefined;\n let success = false;\n\n try {\n interfaces = os.networkInterfaces();\n if (!interfaces || Object.keys(interfaces).length === 0) {\n // Consider it an error if no interfaces are found, as it's unusual\n throw new Error('No network interfaces found on the system.');\n }\n success = true;\n suggestion = 'Result contains local network interface details.';\n } catch (e: unknown) {\n success = false;\n error = e instanceof Error ? e.message : 'Unknown error retrieving network interfaces';\n suggestion = 'Check system permissions or if network interfaces are available.';\n interfaces = undefined;\n }\n\n // Push the single result\n results.push({\n id,\n success,\n result: interfaces,\n error,\n suggestion,\n });\n\n // Return the result wrapped in jsonPart\n return [jsonPart(results, GetInterfacesOutputSchema)];\n },\n});\n\n// Export necessary types\n","import { z } from 'zod';\n\n// Input schema - no parameters needed for this specific tool\nexport const GetInterfacesToolInputSchema = z.object({\n id: z.string().optional(), // Keep id for correlation if used in batch by server\n});\n","import { defineTool } from '@sylphlab/mcp-core';\nimport { jsonPart, validateAndResolvePath } from '@sylphlab/mcp-core';\nimport type { McpToolExecuteOptions, Part } from '@sylphlab/mcp-core';\nimport { z } from 'zod';\nimport { downloadToolInputSchema } from './downloadTool.schema.js';\nimport type {\n DownloadInputItem,\n // DownloadResultItem is defined below\n DownloadToolInput,\n // DownloadToolOutput is inferred from schema\n} from './downloadTool.types';\n\nimport * as fs from 'node:fs';\nimport * as fsp from 'node:fs/promises';\nimport type { IncomingMessage } from 'node:http';\nimport * as https from 'node:https';\nimport * as path from 'node:path';\nimport { pipeline } from 'node:stream/promises';\n\n// --- Output Types ---\nexport interface DownloadResultItem {\n /** Optional ID from the input item. */\n id?: string;\n /** The destination path provided in the input. */\n path: string;\n /** Whether the download operation for this item was successful. */\n success: boolean;\n /** Optional message providing more details (e.g., success message). */\n message?: string;\n /** Optional error message if the operation failed for this item. */\n error?: string;\n /** Optional suggestion for fixing the error. */\n suggestion?: string;\n}\n\n// Zod Schema for the individual result\nconst DownloadResultItemSchema = z.object({\n id: z.string().optional(),\n path: z.string(),\n success: z.boolean(),\n message: z.string().optional(),\n error: z.string().optional(),\n suggestion: z.string().optional(),\n});\n\n// Define the output schema instance as a constant array\nconst DownloadToolOutputSchema = z.array(DownloadResultItemSchema);\n\n// --- Helper Function for Single Download ---\n\nasync function processSingleDownload(\n item: DownloadInputItem,\n options: McpToolExecuteOptions,\n): Promise<DownloadResultItem> {\n const { id, url, destinationPath, overwrite } = item;\n const { workspaceRoot, allowOutsideWorkspace } = options;\n\n let absoluteDestPath: string | undefined;\n try {\n // 1. Validate and Resolve destinationPath\n const validationResult = validateAndResolvePath(\n destinationPath,\n workspaceRoot,\n allowOutsideWorkspace,\n );\n if (typeof validationResult !== 'string') {\n const error = validationResult?.error ?? 'Unknown path validation error';\n const suggestion = validationResult?.suggestion ?? 'Review path and workspace settings.';\n throw new Error(`Path validation failed: ${error} ${suggestion}`);\n }\n absoluteDestPath = validationResult;\n\n // Ensure target directory exists\n const destDir = path.dirname(absoluteDestPath);\n await fsp.mkdir(destDir, { recursive: true });\n\n // 2. Check file existence and overwrite flag\n try {\n await fsp.access(absoluteDestPath);\n if (!overwrite) {\n throw new Error(\n `File already exists at '${destinationPath}'. Use overwrite: true to replace.`,\n );\n }\n // If overwrite is true, attempt to delete existing file before download\n await fsp.unlink(absoluteDestPath);\n } catch (error: unknown) {\n const isEnoent =\n error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT';\n if (!isEnoent) {\n // Re-throw if it's not a 'file not found' error (includes the 'File already exists' error if overwrite is false)\n throw error;\n }\n // If ENOENT, proceed (file doesn't exist or was just deleted)\n }\n\n // 3. Fetch and Stream (with basic redirect handling)\n const response = await new Promise<IncomingMessage>((resolve, reject) => {\n let redirectCount = 0;\n const maxRedirects = 5;\n\n const makeRequest = (currentUrl: string) => {\n const request = https.get(currentUrl, (res) => {\n const statusCode = res.statusCode ?? 0;\n\n if (statusCode >= 300 && statusCode < 400 && res.headers.location) {\n redirectCount++;\n if (redirectCount > maxRedirects) {\n reject(new Error('Exceeded maximum redirects (5).'));\n res.resume();\n return;\n }\n res.resume();\n makeRequest(res.headers.location);\n return;\n }\n\n if (statusCode < 200 || statusCode >= 300) {\n let errorBody = '';\n res.on('data', (chunk) => {\n if (errorBody.length < 500) errorBody += chunk.toString();\n });\n res.on('end', () => {\n reject(\n new Error(\n `Download failed. Status Code: ${statusCode}. ${errorBody.substring(0, 100)}`,\n ),\n );\n });\n res.resume();\n return;\n }\n resolve(res);\n });\n\n request.on('error', (err) => {\n reject(new Error(`Network request failed: ${err.message}`));\n });\n request.setTimeout(30000, () => {\n request.destroy(new Error('Request timed out after 30 seconds'));\n });\n request.end();\n };\n makeRequest(url);\n });\n\n // 4. Pipe to file\n const fileStream = fs.createWriteStream(absoluteDestPath);\n try {\n await pipeline(response, fileStream);\n } catch (pipeError: unknown) {\n throw new Error(\n `File write failed: ${pipeError instanceof Error ? pipeError.message : String(pipeError)}`,\n );\n }\n\n // 5. Report success\n const successMsg = `Successfully downloaded '${url}' to '${destinationPath}'.`;\n return { id, path: destinationPath, success: true, message: successMsg };\n } catch (error: unknown) {\n const errorMsg = `Download failed for item ${id ?? url}: ${error instanceof Error ? error.message : String(error)}`;\n\n // Attempt cleanup only if path was resolved\n if (absoluteDestPath) {\n try {\n await fsp.unlink(absoluteDestPath);\n } catch (cleanupError: unknown) {\n if (\n cleanupError &&\n typeof cleanupError === 'object' &&\n 'code' in cleanupError &&\n cleanupError.code !== 'ENOENT'\n ) {\n // Log or handle cleanup error if needed, but don't obscure original error\n }\n }\n }\n\n let suggestion: string | undefined;\n if (error instanceof Error) {\n if (\n error.message?.includes('ENOTFOUND') ||\n error.message?.includes('ECONNREFUSED') ||\n error.message?.includes('Network request failed') ||\n error.message?.includes('timed out')\n ) {\n suggestion = 'Check the URL and network connectivity.';\n } else if (error.message?.includes('EACCES')) {\n suggestion = 'Check file system write permissions for the destination directory.';\n } else if (error.message?.includes('File already exists')) {\n suggestion = 'Set overwrite: true if you want to replace the existing file.';\n } else if (error.message?.includes('Path validation failed')) {\n // Extract suggestion from the validation error message itself\n suggestion =\n error.message.split('Path validation failed: ')[1]?.split('Suggestion: ')[1] ??\n 'Check path validity and workspace settings.';\n } else if (error.message?.includes('File write failed')) {\n suggestion = 'Check disk space and file system permissions.';\n } else {\n suggestion = 'Review the error message and input parameters.';\n }\n }\n\n return {\n id,\n path: destinationPath,\n success: false,\n error: errorMsg,\n // message: errorMsg, // Keep message for success only\n suggestion,\n };\n }\n}\n\n// --- Tool Definition using defineTool ---\n\nexport const downloadTool = defineTool({\n name: 'downloadTool',\n description: 'Downloads one or more files from URLs to specified paths within the workspace.',\n inputSchema: downloadToolInputSchema,\n outputSchema: DownloadToolOutputSchema, // Use the array schema\n\n execute: async (input: DownloadToolInput, options: McpToolExecuteOptions): Promise<Part[]> => {\n // Return Part[]\n\n // Zod validation (throw error on failure)\n const parsed = downloadToolInputSchema.safeParse(input);\n if (!parsed.success) {\n const errorMessages = Object.entries(parsed.error.flatten().fieldErrors)\n .map(([field, messages]) => `${field}: ${messages.join(', ')}`)\n .join('; ');\n throw new Error(`Input validation failed: ${errorMessages}`);\n }\n\n // Add upfront check for workspaceRoot within options\n if (!options?.workspaceRoot) {\n throw new Error('Workspace root is not available in options.');\n }\n\n const { items } = parsed.data;\n const results: DownloadResultItem[] = [];\n\n // Process downloads (could be parallelized with Promise.all for performance)\n for (const item of items) {\n const result = await processSingleDownload(item, options);\n results.push(result);\n }\n\n // Return the results wrapped in jsonPart\n return [jsonPart(results, DownloadToolOutputSchema)];\n },\n});\n\n// Ensure necessary types are still exported\n","import { z } from 'zod';\n\n// Schema for a single download item\nexport const DownloadItemSchema = z.object({\n id: z.string().optional(),\n url: z.string().url('Invalid URL format.'),\n destinationPath: z.string().min(1, 'Destination path cannot be empty.'),\n overwrite: z.boolean().default(false),\n});\n\n// Main input schema: an array of download items\nexport const downloadToolInputSchema = z.object({\n items: z.array(DownloadItemSchema).min(1, 'At least one download item is required.'),\n});\n","import { defineTool } from '@sylphlab/mcp-core';\nimport { jsonPart } from '@sylphlab/mcp-core';\nimport type { McpToolExecuteOptions, Part } from '@sylphlab/mcp-core';\nimport { z } from 'zod';\nimport { type FetchItemSchema, fetchToolInputSchema } from './fetchTool.schema.js';\n\n// --- TypeScript Types ---\nexport type FetchInputItem = z.infer<typeof FetchItemSchema>;\nexport type FetchToolInput = z.infer<typeof fetchToolInputSchema>;\n\n// --- Output Types ---\n// Interface for a single fetch result item\nexport interface FetchResultItem {\n /** Optional ID from the input item. */\n id?: string;\n /** Whether the fetch operation for this item was successful (HTTP status 2xx). */\n success: boolean;\n /** HTTP status code of the response. */\n status?: number;\n /** HTTP status text of the response. */\n statusText?: string;\n /** Response headers. */\n headers?: Record<string, string>;\n /** Parsed response body (string, JSON object, or null if ignored), if successful. */\n body?: unknown;\n /** Error message, if the operation failed. */\n error?: string;\n /** Suggestion for fixing the error. */\n suggestion?: string;\n}\n\n// Zod Schema for the individual result\nconst FetchResultItemSchema = z.object({\n id: z.string().optional(),\n success: z.boolean(),\n status: z.number().optional(),\n statusText: z.string().optional(),\n headers: z.record(z.string()).optional(),\n body: z.unknown().optional(),\n error: z.string().optional(),\n suggestion: z.string().optional(),\n});\n\n// Define the output schema instance as a constant array\nconst FetchToolOutputSchema = z.array(FetchResultItemSchema);\n\n// --- Helper Function ---\n\n// Helper function to process a single fetch item\nasync function processSingleFetch(item: FetchInputItem): Promise<FetchResultItem> {\n const { id, url, method = 'GET', headers = {}, body, responseType = 'text' } = item;\n const resultItem: FetchResultItem = { id, success: false };\n\n try {\n const requestOptions: RequestInit = {\n method,\n headers: headers as HeadersInit, // Cast headers\n };\n\n // Only add body for relevant methods and if body is provided\n if (body && ['POST', 'PUT', 'PATCH'].includes(method)) {\n requestOptions.body = body;\n // Default Content-Type if not provided\n if (\n !requestOptions.headers ||\n (!(requestOptions.headers as Record<string, string>)['Content-Type'] &&\n !(requestOptions.headers as Record<string, string>)['content-type'])\n ) {\n // Ensure headers is an object before assigning\n if (\n typeof requestOptions.headers !== 'object' ||\n requestOptions.headers === null ||\n Array.isArray(requestOptions.headers)\n ) {\n requestOptions.headers = {};\n }\n (requestOptions.headers as Record<string, string>)['Content-Type'] = 'application/json';\n }\n }\n\n const response = await fetch(url, requestOptions);\n\n resultItem.status = response.status;\n resultItem.statusText = response.statusText;\n const responseHeaders: Record<string, string> = {};\n response.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n resultItem.headers = responseHeaders;\n\n let responseBody: unknown = null;\n let bodyForError: string | null = null;\n\n // Try reading body text first for potential error messages\n try {\n bodyForError = await response.clone().text(); // Clone to read text\n } catch {\n // Ignore error reading body text for error reporting\n }\n\n if (!response.ok) {\n let errorDetail = '';\n if (typeof bodyForError === 'string' && bodyForError.length > 0) {\n errorDetail = ` - Body: ${bodyForError.substring(0, 150)}`; // Limit error body length\n }\n throw new Error(`HTTP error! Status: ${response.status}${errorDetail}`);\n }\n\n // If response is OK, parse body based on responseType\n try {\n if (responseType === 'json') {\n // Use the original response stream for JSON parsing\n responseBody = await response.json();\n } else if (responseType === 'text') {\n // We already read the text into bodyForError\n responseBody = bodyForError;\n } else {\n // 'ignore' or unknown - body is null\n responseBody = null;\n }\n } catch (parseError: unknown) {\n // Handle JSON parsing error specifically\n throw new Error(\n `Failed to parse response body as ${responseType}: ${parseError instanceof Error ? parseError.message : String(parseError)}`,\n );\n }\n\n resultItem.body = responseBody;\n resultItem.success = true;\n } catch (e: unknown) {\n const errorMsg = e instanceof Error ? e.message : 'Unknown error';\n resultItem.error = `Fetch failed for ${url}: ${errorMsg}`;\n // Provide suggestions based on error type\n if (errorMsg.includes('Failed to parse response body')) {\n resultItem.suggestion = `The server responded with status ${resultItem.status}, but the response body was not valid ${responseType}. Check the 'responseType' parameter or the server's response format.`;\n } else if (errorMsg.includes('HTTP error')) {\n resultItem.suggestion =\n 'The server returned an error status code. Check the error message body (if available) and the request details (URL, method, headers, body).';\n } else if (errorMsg.includes('fetch') || errorMsg.includes('Network request failed')) {\n // More generic network errors\n resultItem.suggestion =\n 'Check URL, network connection, DNS resolution, and potential CORS issues if running in a browser.';\n } else {\n resultItem.suggestion =\n 'Check URL, network connection, method, headers, body, and potential CORS issues.';\n }\n resultItem.success = false;\n }\n return resultItem;\n}\n\n// --- Tool Definition using defineTool ---\nexport const fetchTool = defineTool({\n name: 'fetch', // Keep tool name simple\n description: 'Performs one or more HTTP fetch requests sequentially.',\n inputSchema: fetchToolInputSchema,\n outputSchema: FetchToolOutputSchema, // Use the array schema\n\n execute: async (input: FetchToolInput, _options: McpToolExecuteOptions): Promise<Part[]> => {\n // Return Part[]\n\n // Zod validation (throw error on failure)\n const parsed = fetchToolInputSchema.safeParse(input);\n if (!parsed.success) {\n const errorMessages = Object.entries(parsed.error.flatten().fieldErrors)\n .map(([field, messages]) => `${field}: ${messages.join(', ')}`)\n .join('; ');\n throw new Error(`Input validation failed: ${errorMessages}`);\n }\n const { items } = parsed.data;\n\n const results: FetchResultItem[] = [];\n\n // Process requests sequentially\n for (const item of items) {\n const result = await processSingleFetch(item);\n results.push(result);\n }\n\n // Return the results wrapped in jsonPart\n return [jsonPart(results, FetchToolOutputSchema)];\n },\n});\n","import { z } from 'zod';\n\n// Define allowed HTTP methods\nconst HttpMethodSchema = z.enum(['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS']);\n\n// Define allowed response types\nconst ResponseTypeSchema = z.enum(['text', 'json', 'ignore']);\n\n// Schema for a single fetch item\nexport const FetchItemSchema = z.object({\n id: z.string().optional(),\n url: z.string().url('Invalid URL format.'),\n method: HttpMethodSchema.default('GET'),\n headers: z.record(z.string()).optional(), // Record<string, string>\n body: z.string().optional(), // Body is expected as a string\n responseType: ResponseTypeSchema.default('text'),\n});\n\n// Main input schema: an array of fetch items\nexport const fetchToolInputSchema = z.object({\n items: z.array(FetchItemSchema).min(1, 'At least one fetch item is required.'),\n});\n"],"mappings":"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","names":["import_mcp_core","import_zod","import_mcp_core","import_zod","import_zod","os","import_mcp_core","import_zod","import_zod","import_mcp_core","import_zod","import_zod"]}