UNPKG

@anyshift/mcp-tools-common

Version:

Reusable JQ tool and file writing utilities for MCP servers

1 lines • 54.4 kB
{"version":3,"sources":["../src/utils/filename.ts","../src/fileWriter/schema.ts","../src/fileWriter/writer.ts","../src/fileWriter/index.ts","../src/utils/pathValidation.ts","../src/jq/handler.ts","../src/jq/tool.ts","../src/jq/index.ts","../src/truncation/truncate.ts"],"names":["crypto","path","fs","existsSync","realpathSync","spawn","z"],"mappings":"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","file":"index.cjs","sourcesContent":["import crypto from 'crypto'\n\n/**\n * Generate compact timestamp using epoch + milliseconds\n */\nconst generateCompactTimestamp = (): string => {\n const now = new Date()\n const epoch = Math.floor(now.getTime() / 1000)\n const ms = now.getMilliseconds().toString().padStart(3, '0')\n return `${epoch}${ms}`\n}\n\n/**\n * Generate short hash from arguments for collision resistance\n */\nconst hashArgs = (args: Record<string, unknown>): string => {\n const argsString = Object.entries(args)\n .filter(\n ([key, value]) =>\n // Filter out sensitive or irrelevant keys\n !['api_key', 'app_key', 'token', 'api_token'].includes(key.toLowerCase()) &&\n value !== undefined,\n )\n .map(([key, value]) => `${key}=${value}`)\n .join('_')\n\n if (!argsString) return 'noargs'\n\n return crypto\n .createHash('md5')\n .update(argsString)\n .digest('hex')\n .substring(0, 6)\n}\n\n/**\n * Generate LLM-friendly compact filename\n * @param toolName - Name of the tool that generated the data\n * @param args - Arguments passed to the tool\n * @param toolAbbreviations - Optional custom abbreviations for tool names\n * @returns Compact filename like \"1697834567123_met_qry_a3b4c5.json\"\n */\nexport const generateCompactFilename = (\n toolName: string,\n args: Record<string, unknown>,\n toolAbbreviations?: Record<string, string>,\n): string => {\n const timestamp = generateCompactTimestamp()\n const toolAbbrev = toolAbbreviations?.[toolName] || toolName.substring(0, 6)\n const argsHash = hashArgs(args)\n\n return `${timestamp}_${toolAbbrev}_${argsHash}.json`\n}\n","import { JsonSchema, NullableFields } from '../types/index.js'\n\n/**\n * Analyze JSON structure and generate enhanced schema\n * @param obj - The object to analyze\n * @param path - Current path in the object (for debugging)\n * @returns Schema representation of the object\n */\nexport function analyzeJsonSchema(obj: unknown, path: string = 'root'): JsonSchema {\n if (obj === null) return { type: 'null' }\n if (obj === undefined) return { type: 'undefined' }\n\n const type = Array.isArray(obj) ? 'array' : typeof obj\n\n if (type === 'object') {\n const properties: Record<string, unknown> = {}\n const objRecord = obj as Record<string, unknown>\n const keys = Object.keys(objRecord)\n\n // Detect numeric string keys (common in Cypher results)\n const numericKeys = keys.filter((k) => /^\\d+$/.test(k))\n const hasNumericKeys = keys.length > 0 && numericKeys.length >= keys.length * 0.8\n\n for (const key in objRecord) {\n if (Object.prototype.hasOwnProperty.call(objRecord, key)) {\n properties[key] = analyzeJsonSchema(objRecord[key], `${path}.${key}`)\n }\n }\n\n const schema: JsonSchema = { type: 'object', properties }\n\n // Add metadata hints for numeric keys\n if (hasNumericKeys) {\n schema._keysAreNumeric = true\n schema._accessPattern = 'Use .[\"0\"] not .[0]'\n }\n\n return schema\n } else if (type === 'array') {\n const arr = obj as unknown[]\n if (arr.length === 0) {\n return { type: 'array', items: { type: 'unknown' }, length: 0 }\n }\n\n // Analyze array items for mixed types and nulls\n const itemTypes = new Set<string>()\n let hasNulls = false\n\n // Sample first 10 items to detect type variance\n const sampled = arr.slice(0, Math.min(10, arr.length))\n for (const item of sampled) {\n if (item === null) {\n hasNulls = true\n itemTypes.add('null')\n } else {\n itemTypes.add(Array.isArray(item) ? 'array' : typeof item)\n }\n }\n\n const schema: JsonSchema = {\n type: 'array',\n items:\n itemTypes.size === 1 && !hasNulls\n ? analyzeJsonSchema(arr[0], `${path}[0]`)\n : { types: Array.from(itemTypes) },\n length: arr.length,\n }\n\n // Add hints for null handling\n if (hasNulls) {\n schema._hasNulls = true\n }\n\n return schema\n } else {\n return { type }\n }\n}\n\n/**\n * Extract nullable and always-null fields from schema\n * @param schema - The schema to analyze\n * @param basePath - Base path for field names\n * @returns Object containing arrays of always-null and nullable field paths\n */\nexport function extractNullableFields(\n schema: unknown,\n basePath: string = '',\n): NullableFields {\n const alwaysNull: string[] = []\n const nullable: string[] = []\n\n function traverse(s: unknown, path: string) {\n if (!s || typeof s !== 'object') return\n\n const schemaObj = s as Record<string, unknown>\n\n // Check if this field is always null\n if (schemaObj.type === 'null') {\n alwaysNull.push(path)\n return\n }\n\n // Check if this field can be null (mixed types)\n if (schemaObj.items && typeof schemaObj.items === 'object') {\n const items = schemaObj.items as Record<string, unknown>\n if (\n items.types &&\n Array.isArray(items.types) &&\n items.types.includes('null')\n ) {\n nullable.push(path)\n }\n }\n\n // Recurse into object properties\n if (schemaObj.type === 'object' && schemaObj.properties) {\n const props = schemaObj.properties as Record<string, unknown>\n for (const [key, value] of Object.entries(props)) {\n const newPath = path ? `${path}.${key}` : key\n traverse(value, newPath)\n }\n }\n\n // Recurse into array items\n if (\n schemaObj.type === 'array' &&\n schemaObj.items &&\n typeof schemaObj.items === 'object'\n ) {\n const items = schemaObj.items as Record<string, unknown>\n if (items.type === 'object' && items.properties) {\n const props = items.properties as Record<string, unknown>\n for (const [key, value] of Object.entries(props)) {\n const newPath = path ? `${path}[].${key}` : `[].${key}`\n traverse(value, newPath)\n }\n }\n }\n }\n\n traverse(schema, basePath)\n return { alwaysNull, nullable }\n}\n","import fs from 'fs/promises'\nimport path from 'path'\nimport { FileWriterConfig, FileWriterResult } from './types.js'\nimport { generateCompactFilename } from '../utils/filename.js'\nimport { analyzeJsonSchema, extractNullableFields } from './schema.js'\n\n// Default minimum character count to trigger file writing\nconst DEFAULT_MIN_CHARS = 1000\n\n/**\n * Helper function to detect if a response contains an error\n */\nconst isErrorResponse = (response: unknown): boolean => {\n if (!response || typeof response !== 'object') return false\n\n const obj = response as Record<string, unknown>\n\n // Check MCP-level error flags first\n if (obj.error || obj.isError) {\n return true\n }\n\n // For MCP responses, extract and parse the raw text to check for API-level errors\n const rawText = extractRawText(obj as { _rawText?: string; content?: unknown[] })\n if (rawText) {\n try {\n // Handle cases where text might contain \"Listed incidents: {...}\" or \"Queried metrics data: {...}\"\n let jsonText = rawText\n\n // Extract JSON from common response patterns\n const jsonMatch = rawText.match(/:\\s*(\\{.*\\}|\\[.*\\])$/s)\n if (jsonMatch) {\n jsonText = jsonMatch[1]\n }\n\n // Try to parse as JSON to check for status: \"error\"\n const parsed = JSON.parse(jsonText)\n return parsed.status === 'error'\n } catch {\n // If JSON parsing fails, fall back to string matching\n return (\n rawText.includes('\"status\":\"error\"') ||\n rawText.includes('\"status\": \"error\"')\n )\n }\n }\n\n // Fallback: check if the response object directly has status === 'error'\n return obj.status === 'error'\n}\n\n/**\n * Helper function to extract error message from API error responses\n */\nconst extractErrorMessage = (response: unknown): string => {\n if (!response || typeof response !== 'object') {\n return 'Unknown error occurred'\n }\n\n const obj = response as Record<string, unknown>\n\n // Check for direct error properties first\n if (obj.error && typeof obj.error === 'string') {\n return obj.error\n }\n\n // For MCP responses, extract error from parsed content\n const rawText = extractRawText(obj as { _rawText?: string; content?: unknown[] })\n if (rawText) {\n try {\n // Handle cases where text might contain \"Listed incidents: {...}\" or \"Queried metrics data: {...}\"\n let jsonText = rawText\n\n // Extract JSON from common response patterns\n const jsonMatch = rawText.match(/:\\s*(\\{.*\\}|\\[.*\\])$/s)\n if (jsonMatch) {\n jsonText = jsonMatch[1]\n }\n\n const parsed = JSON.parse(jsonText)\n\n // Try different error message fields\n if (parsed.error && typeof parsed.error === 'string') {\n return parsed.error\n }\n if (parsed.message && typeof parsed.message === 'string') {\n return parsed.message\n }\n if (parsed.status === 'error') {\n return 'API request failed with error status'\n }\n } catch {\n // If JSON parsing fails, look for error patterns in the raw text\n const errorMatch = rawText.match(/\"error\":\\s*\"([^\"]+)\"/)\n if (errorMatch && errorMatch[1]) {\n return errorMatch[1]\n }\n\n const messageMatch = rawText.match(/\"message\":\\s*\"([^\"]+)\"/)\n if (messageMatch && messageMatch[1]) {\n return messageMatch[1]\n }\n }\n }\n\n return 'API error occurred'\n}\n\n/**\n * Extract raw text from MCP response format\n */\nconst extractRawText = (\n response: { _rawText?: string; content?: unknown[] },\n): string | null => {\n if (response._rawText) {\n return response._rawText\n }\n\n if (response.content && Array.isArray(response.content)) {\n const textContent = response.content\n .filter((item: unknown) => (item as { type?: string }).type === 'text')\n .map((item: unknown) => (item as { text: string }).text)\n .join('\\n')\n return textContent || null\n }\n\n return null\n}\n\n/**\n * Centralized response handler with file writing capability\n * @param config - File writer configuration\n * @param toolName - Name of the tool that generated the response\n * @param args - Arguments passed to the tool\n * @param responseData - The response data to potentially write to file\n * @returns Either the original response or a file reference response\n */\nexport async function handleToolResponse(\n config: FileWriterConfig,\n toolName: string,\n args: Record<string, unknown>,\n responseData: unknown,\n): Promise<FileWriterResult | unknown> {\n // JQ query tool should always return directly to AI (never write to file)\n if (toolName === 'execute_jq_query') {\n return responseData\n }\n\n // If there's an error, return proper MCP error response (never write errors to file)\n if (isErrorResponse(responseData)) {\n const errorMessage = extractErrorMessage(responseData)\n return {\n content: [\n {\n type: 'text',\n text: `Error: ${errorMessage}`,\n },\n ],\n isError: true,\n }\n }\n\n // If file writing is disabled, just return the response\n if (!config.enabled || !config.outputPath) {\n return responseData\n }\n\n // Check character count threshold - if response is too short, return directly\n const rawText = extractRawText(\n responseData as { _rawText?: string; content?: unknown[] },\n )\n\n let contentLength = 0\n if (rawText) {\n contentLength = rawText.length\n } else if (\n responseData &&\n typeof responseData === 'object' &&\n 'content' in responseData &&\n Array.isArray((responseData as { content: unknown[] }).content)\n ) {\n const textContent = (responseData as { content: unknown[] }).content\n .filter((item: unknown) => (item as { type?: string }).type === 'text')\n .map((item: unknown) => (item as { text: string }).text)\n .join('\\n')\n contentLength = textContent.length\n } else {\n contentLength = JSON.stringify(responseData).length\n }\n\n // If content is shorter than threshold, return response directly instead of writing to file\n const minChars = config.minCharsForWrite ?? DEFAULT_MIN_CHARS\n if (contentLength < minChars) {\n return responseData\n }\n\n // Success case: write to file\n try {\n // Create compact, LLM-friendly filename\n const filename = generateCompactFilename(\n toolName,\n args,\n config.toolAbbreviations,\n )\n const filepath = path.join(config.outputPath, filename)\n\n // Ensure output directory exists\n await fs.mkdir(config.outputPath, { recursive: true })\n\n // Extract the actual data from MCP response format\n let contentToWrite: string\n let parsedForSchema: unknown\n\n if (rawText) {\n try {\n // Try to parse the raw text as JSON for prettier formatting\n let jsonText = rawText\n\n // Extract JSON from common response patterns\n const jsonMatch = rawText.match(/:\\s*(\\{.*\\}|\\[.*\\])$/s)\n if (jsonMatch) {\n jsonText = jsonMatch[1]\n }\n\n const parsed = JSON.parse(jsonText)\n parsedForSchema = parsed\n\n // Remove pagination-related fields before writing\n const { pagination, has_more, next_page, previous_page, page, page_size, total_pages, ...cleanData } = parsed as Record<string, unknown>\n\n contentToWrite = JSON.stringify(cleanData, null, 2)\n } catch {\n // If parsing fails, write the raw text directly\n contentToWrite = rawText\n }\n } else {\n // Fallback: extract from display content or stringify the entire response\n if (\n responseData &&\n typeof responseData === 'object' &&\n 'content' in responseData &&\n Array.isArray((responseData as { content: unknown[] }).content)\n ) {\n const textContent = (responseData as { content: unknown[] }).content\n .filter((item: unknown) => (item as { type?: string }).type === 'text')\n .map((item: unknown) => (item as { text: string }).text)\n .join('\\n')\n contentToWrite = textContent\n } else {\n contentToWrite = JSON.stringify(responseData, null, 2)\n }\n }\n\n await fs.writeFile(filepath, contentToWrite)\n\n // Try to generate schema if we have valid JSON\n let schemaInfo = ''\n let quickReference = ''\n if (parsedForSchema) {\n // Use the clean data (without pagination) for schema analysis\n const { pagination, has_more, next_page, previous_page, page, page_size, total_pages, ...cleanData } = parsedForSchema as Record<string, unknown>\n const schema = analyzeJsonSchema(cleanData)\n const nullFields = extractNullableFields(schema)\n const schemaObj = schema as unknown as Record<string, unknown>\n\n // Build quick reference section\n quickReference += `\\n\\nšŸ” UNDERSTAND THIS SCHEMA BEFORE WRITING JQ QUERIES:\\n`\n\n // Structure hints\n if (schemaObj._keysAreNumeric) {\n quickReference += ` • Structure: Object with numeric keys (\"0\", \"1\", ...) - use .[\"0\"]\\n`\n } else if (schemaObj.type === 'array') {\n quickReference += ` • Structure: Array with ${schemaObj.length} items\\n`\n } else if (schemaObj.type === 'object' && schemaObj.properties) {\n const props = schemaObj.properties as Record<string, unknown>\n const keys = Object.keys(props).slice(0, 5).join(', ')\n quickReference += ` • Structure: Object with keys: ${keys}\\n`\n }\n\n // Always null fields\n if (nullFields.alwaysNull.length > 0) {\n const fieldList = nullFields.alwaysNull.slice(0, 5).join(', ')\n const more =\n nullFields.alwaysNull.length > 5\n ? ` (+${nullFields.alwaysNull.length - 5} more)`\n : ''\n quickReference += ` • Always null: ${fieldList}${more}\\n`\n }\n\n // Nullable fields\n if (nullFields.nullable.length > 0) {\n const fieldList = nullFields.nullable.slice(0, 5).join(', ')\n const more =\n nullFields.nullable.length > 5\n ? ` (+${nullFields.nullable.length - 5} more)`\n : ''\n quickReference += ` • Sometimes null: ${fieldList}${more}\\n`\n }\n\n // Suggest exploratory queries\n if (schemaObj._keysAreNumeric) {\n quickReference += ` • Explore: keys, .[\"0\"] | keys, .[\"0\"]\\n`\n } else if (schemaObj.type === 'array' && (schemaObj.length as number) > 0) {\n quickReference += ` • Explore: length, .[0] | keys, .[0]\\n`\n } else {\n quickReference += ` • Explore: keys, type\\n`\n }\n\n // Full schema\n schemaInfo = `\\n\\nFull JSON Schema:\\n${JSON.stringify(schema, null, 2)}`\n }\n\n // Count lines in the content\n const lineCount = contentToWrite.split('\\n').length\n\n // Return success message with file path, size, lines, quick reference, and schema\n return {\n content: [\n {\n type: 'text',\n text: `šŸ“„ File: ${filepath}\\nSize: ${contentToWrite.length} characters | Lines: ${lineCount}${quickReference}${schemaInfo}`,\n },\n ],\n }\n } catch (error) {\n // If file writing fails, return the original response\n console.error(`[handleToolResponse] Error writing file:`, error)\n return responseData\n }\n}\n","import { FileWriterConfig, FileWriterResult } from './types.js'\nimport { handleToolResponse } from './writer.js'\n\n/**\n * Create a file writer instance with the given configuration\n * @param config - File writer configuration\n * @returns Object with handleResponse method\n */\nexport function createFileWriter(config: FileWriterConfig) {\n return {\n /**\n * Handle tool response - writes to file if conditions are met\n * @param toolName - Name of the tool that generated the response\n * @param args - Arguments passed to the tool\n * @param responseData - The response data to potentially write to file\n * @returns Either the original response or a file reference response\n */\n handleResponse: async (\n toolName: string,\n args: Record<string, unknown>,\n responseData: unknown,\n ): Promise<FileWriterResult | unknown> => {\n return handleToolResponse(config, toolName, args, responseData)\n },\n }\n}\n\n// Re-export types and utilities\nexport type { FileWriterConfig, FileWriterResult } from './types.js'\nexport { analyzeJsonSchema, extractNullableFields } from './schema.js'\n","import { existsSync, realpathSync } from 'fs'\nimport path from 'path'\n\n/**\n * Validate that a file path is within allowed directories\n * @param filePath - The file path to validate\n * @param allowedPaths - Array of allowed directory paths\n * @returns The validated real path (with symlinks resolved)\n * @throws Error if path is invalid, doesn't exist, or is outside allowed directories\n */\nexport const validatePathWithinAllowedDirs = (\n filePath: string,\n allowedPaths: string[],\n): string => {\n // Require absolute paths for security and clarity\n if (!path.isAbsolute(filePath)) {\n throw new Error(\n `Absolute path required. Received: ${filePath}. Paths must start with \"/\" to prevent ambiguity.`,\n )\n }\n\n // Resolve the absolute path (for normalization and symlink handling)\n const absolutePath = path.resolve(filePath)\n\n // Check if file exists before resolving real path (to handle symlinks)\n if (!existsSync(absolutePath)) {\n throw new Error(`File does not exist: ${filePath}`)\n }\n\n // Get the real path (resolves symlinks)\n let realPath: string\n try {\n realPath = realpathSync(absolutePath)\n } catch (error) {\n throw new Error(`Cannot resolve path: ${filePath}`)\n }\n\n // Check if path is within any of the allowed directories\n for (const allowedPath of allowedPaths) {\n // Resolve and normalize the allowed path\n const allowedPathReal = realpathSync(path.resolve(allowedPath))\n\n // Check if the real path is within this allowed directory\n if (realPath.startsWith(allowedPathReal + path.sep) || realPath === allowedPathReal) {\n console.error(\n `[validatePathWithinAllowedDirs] Path allowed (within ${allowedPathReal}): ${realPath}`,\n )\n return realPath\n }\n }\n\n // Path is not within any allowed directories\n const allowedPathsList = allowedPaths.join(', ')\n throw new Error(\n `Access denied: File path must be within allowed directories (${allowedPathsList}). Attempted path: ${realPath}`,\n )\n}\n","import { spawn } from 'child_process'\nimport { existsSync } from 'fs'\nimport path from 'path'\nimport { JqConfig } from './types.js'\nimport { validatePathWithinAllowedDirs } from '../utils/pathValidation.js'\n\n// Default timeout for JQ execution\nconst DEFAULT_TIMEOUT_MS = 30000\n\n/**\n * Execute a JQ query on a JSON file\n * @param config - JQ configuration\n * @param jqQuery - The JQ query to execute\n * @param filePath - Absolute path to the JSON file\n * @returns Promise with the query result\n */\nexport async function executeJqQuery(\n config: JqConfig,\n jqQuery: string,\n filePath: string,\n): Promise<{ content: Array<{ type: 'text'; text: string }> }> {\n // Input validation\n if (!jqQuery || !filePath) {\n throw new Error('jq_query and file_path are required')\n }\n\n // Sanitize jq query to prevent environment variable access\n const dangerousPatterns = [\n /\\$ENV/i, // $ENV variable access\n /env\\./i, // env.VARIABLE access\n /@env/i, // @env function\n /\\.env\\[/i, // .env[\"VARIABLE\"] access\n /getenv/i, // getenv function\n /\\$__loc__/i, // location info that might leak paths\n /input_filename/i, // input filename access\n ]\n\n const isDangerous = dangerousPatterns.some((pattern) =>\n pattern.test(jqQuery),\n )\n if (isDangerous) {\n throw new Error(\n 'The jq query contains patterns that could access environment variables or system information. Please use a different query.',\n )\n }\n\n // Validate file path\n if (!path.isAbsolute(filePath)) {\n throw new Error(\n `File path must be an absolute path starting with \"/\": ${filePath}`,\n )\n }\n\n if (!existsSync(filePath)) {\n throw new Error(`File not found: ${filePath}`)\n }\n\n // Validate file extension\n if (!filePath.toLowerCase().endsWith('.json')) {\n throw new Error(\n `Only JSON files (.json) are supported for jq processing: ${filePath}`,\n )\n }\n\n // Validate path is within allowed directories\n validatePathWithinAllowedDirs(filePath, config.allowedPaths)\n\n // Execute jq query\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS\n\n return new Promise((resolve, reject) => {\n const jqProcess = spawn('jq', [jqQuery, filePath], {\n stdio: ['pipe', 'pipe', 'pipe'],\n timeout: timeoutMs,\n })\n\n let stdout = ''\n let stderr = ''\n\n jqProcess.stdout.on('data', (data) => {\n stdout += data.toString()\n })\n\n jqProcess.stderr.on('data', (data) => {\n stderr += data.toString()\n })\n\n jqProcess.on('close', (code) => {\n if (code === 0) {\n // Success - return clean response directly to AI\n const responseText = stdout.trim()\n\n resolve({\n content: [\n {\n type: 'text' as const,\n text: responseText,\n },\n ],\n })\n } else {\n // Error\n reject(\n new Error(\n `jq command failed with exit code ${code}: ${stderr.trim()}`,\n ),\n )\n }\n })\n\n jqProcess.on('error', (error) => {\n reject(new Error(`Failed to execute jq command: ${error.message}`))\n })\n\n // Handle timeout\n setTimeout(() => {\n if (!jqProcess.killed) {\n jqProcess.kill('SIGTERM')\n reject(new Error(`jq command timed out after ${timeoutMs}ms`))\n }\n }, timeoutMs)\n })\n}\n","import { z } from 'zod'\n\n/**\n * Zod schema for JQ query execution\n */\nexport const ExecuteJqQuerySchema = z.object({\n jq_query: z\n .string()\n .describe(\n 'The jq query to execute on the JSON file. Query will be sanitized to prevent environment variable access.',\n ),\n file_path: z\n .string()\n .describe(\n 'Absolute path starting with \"/\" pointing to the JSON file to process. Must be a valid, existing file with .json extension. The file will be validated for existence and readability before processing.',\n ),\n description: z\n .string()\n .optional()\n .describe(\n 'Optional description; a short explanation of the purpose of the query',\n ),\n})\n\n/**\n * Tool definition for JQ query execution with enhanced prompts\n * This includes schema-first development hints for better LLM usage\n */\nexport const JQ_TOOL_DEFINITION = {\n name: 'execute_jq_query',\n description:\n 'Execute a jq query on a JSON file with comprehensive debugging and retry strategies.' +\n 'This tool processes JSON files using jq operations for data extraction, transformation, and filtering. ' +\n '\\n\\nāš ļø **CRITICAL SYNTAX RULE**: The jq_query parameter is a STRING. Use PLAIN quotes like .[\"0\"] - DO NOT ESCAPE them as .[\\\"0\\\"] or .[\\\\\"0\\\\\"]. The MCP framework handles escaping automatically.' +\n '\\n\\nšŸ“‹ **SCHEMA-FIRST WORKFLOW**: READ the schema from the file write response. For nullable fields use: select(.field != null) or .field // \"default\"' +\n '\\n\\nCRITICAL: When queries fail or return null/empty results, DO NOT abandon the jq approach immediately. Instead, follow the debugging workflow below.' +\n '\\n\\n## JQ SYNTAX REFERENCE (Fix Common Errors):' +\n '\\n**QUOTE SYNTAX (MOST COMMON ERROR):**' +\n '\\n- The jq_query is passed as a STRING to the jq binary' +\n '\\n- Use PLAIN quotes: .[\"key\"] NOT .[\\\"key\\\"] or .[\\\\\"key\\\\\"]' +\n '\\n- DO NOT escape quotes - the parameter is already a string' +\n '\\n- āœ… CORRECT: .[\"0\"], .[\"field\"], .field' +\n '\\n- āŒ WRONG: .[\\\"0\\\"], .[\\\\\"field\\\\\"], .\\\\\\\"field\\\\\\\"' +\n '\\n\\n**ARRAY SLICING (Not Shell Commands):**' +\n '\\n- First N items: .[:5] NOT head -5 or head(5)' +\n '\\n- Last N items: .[-5:] NOT tail -5' +\n '\\n- Skip first N: .[5:] NOT tail +6' +\n '\\n- With limit: limit(10; .) NOT head(10)' +\n '\\n- āœ… CORRECT: .[:10], limit(20; .), .[-5:]' +\n '\\n- āŒ WRONG: head -10, head(20), tail -5' +\n '\\n\\n**COMMON FUNCTION MISTAKES:**' +\n '\\n- āŒ head, tail, wc, cut, grep, awk, sed → These are SHELL commands, not jq!' +\n '\\n- āœ… .[:N] → Take first N (array slice)' +\n '\\n- āœ… limit(N; .) → Limit to N items' +\n '\\n- āœ… length → Count items' +\n '\\n- āœ… sort_by(.field) → Sort by field' +\n '\\n- āœ… group_by(.field) → Group by field' +\n '\\n\\n**STRING OPERATIONS:**' +\n '\\n- Regex: test(\"pattern\") NOT test(\\'pattern\\')' +\n '\\n- Contains: contains(\"text\") or test(\"text\")' +\n '\\n- Split: split(\",\")' +\n '\\n- Join: join(\",\")' +\n '\\n\\n**OBJECT CONSTRUCTION:** Arithmetic needs extra parens: {count: ((.items | length) + 1)} or use variables' +\n '\\n**TYPE SAFETY:** Check schema types. Error \"Cannot index X with Y\" = wrong type, use: type == \"object\"' +\n '\\n\\n## DEBUGGING WORKFLOW (Use when queries fail or return unexpected results):' +\n '\\n1. **Structure Inspection**: Start with `keys`, `type`, `length` to understand the data structure' +\n '\\n2. **Single Record Access**: Test `.[\"0\"]`, `.[\"1\"]` to access specific items (for object with numeric string keys)' +\n '\\n3. **Field Exploration**: Check `.[\"0\"].Values`, `.[\"0\"].Keys` to understand nested structures' +\n '\\n4. **Build Incrementally**: Start with simple queries, add complexity step by step' +\n '\\n5. **Test Without Filters**: Remove `select()` clauses to see if data exists' +\n '\\n\\n## CYPHER RESULT STRUCTURES (Common patterns from Neo4j/graph queries):' +\n '\\n- **Objects with numeric string keys**: {\"0\": {...}, \"1\": {...}, \"2\": {...}} - Use `.[\"0\"]`, NOT `.[0]`' +\n '\\n- **Values/Keys arrays**: Each result has `.Values` and `.Keys` arrays with corresponding data' +\n '\\n- **Null handling**: Many Values arrays contain null - always check for null before processing' +\n '\\n\\n## OBJECT vs ARRAY ACCESS PATTERNS:' +\n '\\nāœ… **For objects with numeric keys**: `.[\"0\"].Values`, `to_entries[] | .value`, `.[keys[0]]`' +\n '\\nāŒ **Wrong**: `.[0].Values` (treats object as array - will fail)' +\n '\\nāœ… **Iteration over objects**: `to_entries[] | .value | ...` or `.[] | ...`' +\n '\\nāœ… **Safe null checking**: `select(.Values[0] != null)` or `select(.Values // [] | length > 0)`' +\n '\\n\\n## RETRY STRATEGIES (Try multiple approaches):' +\n '\\n1. **Different iteration methods**: `.[]`, `to_entries[] | .value`, `.[keys[]]`' +\n '\\n2. **Incremental filtering**: Start with no filters, add conditions one by one' +\n '\\n3. **Alternative null handling**: Use `// empty`, `select(. != null)`, or `try ... catch`' +\n '\\n4. **Simplified queries**: Break complex queries into smaller, testable parts' +\n '\\n\\n## COMPREHENSIVE EXAMPLES:' +\n '\\n**Debugging sequence for Cypher results**:' +\n '\\n- `keys` → [\"0\", \"1\", \"2\", ...] (shows object structure)' +\n '\\n- `.[\"0\"]` → {\"Values\": [...], \"Keys\": [...]} (shows single result format)' +\n '\\n- `.[\"0\"].Values` → [value1, value2, null, ...] (shows actual data)' +\n '\\n- `to_entries[] | .value | select(.Values[0] != null)` → final query' +\n '\\n\\n**Common transformations**:' +\n '\\n- Extract non-null records: `to_entries[] | .value | select(.Values[0] != null)`' +\n '\\n- Build objects from Values/Keys: `.[\"0\"] | {(.Keys[0]): .Values[0], (.Keys[1]): .Values[1]}`' +\n '\\n- Count results: `to_entries | length` or `keys | length`' +\n '\\n- Filter by position: `to_entries[] | select(.key | tonumber < 5) | .value`' +\n '\\n\\n**IMPORTANT**: If a query returns null/empty, try simpler versions first to verify data exists before assuming the approach is wrong.',\n inputSchema: {\n type: 'object',\n properties: {\n jq_query: {\n type: 'string',\n description:\n 'The jq query to execute on the JSON file. Query will be sanitized to prevent environment variable access.',\n },\n file_path: {\n type: 'string',\n description:\n 'Absolute path starting with \"/\" pointing to the JSON file to process. Must be a valid, existing file with .json extension. The file will be validated for existence and readability before processing.',\n },\n description: {\n type: 'string',\n description:\n 'Optional description; a short explanation of the purpose of the query',\n },\n },\n required: ['jq_query', 'file_path'],\n },\n}\n","import { JqConfig } from './types.js'\nimport { executeJqQuery } from './handler.js'\nimport { ExecuteJqQuerySchema, JQ_TOOL_DEFINITION } from './tool.js'\n\n/**\n * Create a JQ tool instance with the given configuration\n * @param config - JQ configuration\n * @returns Object wi