MCP server for advanced JSON parsing — load, query, aggregate, transform any JSON file from GitHub Copilot, Claude, Cursor, or any MCP client.
Strong tool coverage with 26 well-named, verb-prefixed tools (load_, get_, filter_, search_, etc.). All tools have descriptions (avg ~120 chars, within baseline 34-392 range). Input schemas are present and properly typed using Pydantic. However, output schemas are not documented, LLMs cannot predict return structure. Error handling is generic ('Error: {exc}') with no recovery guidance. Parameter descriptions are adequate but lack format constraints (e.g., JSONPath syntax rules, regex pattern requirements). No tool annotations (readOnlyHint, destructiveHint) despite clear risk stratification (READ_ONLY vs WRITE). Missing idempotency guarantees and confirmation patterns for destructive ops (export_csv, export_json).
Compare two JSON values and report their differences. Can compare two paths within the same document or across two documents. Reports added keys, removed keys, type changes, and value changes.
Count items in an array or keys in an object at a given path.
Get a full statistical summary of numeric values matched by a JSONPath. Returns count, mean, median, standard deviation, min, max, 25th/75th percentiles, and sum — like pandas .describe() for JSON.
List every unique leaf path in a JSON document. Essential for understanding the shape of an unknown JSON file. For arrays, only the first N items are sampled to discover paths efficiently without scanning thousands of identical objects.
Export an array of objects to a CSV file. If fields is omitted, all keys found across all objects are used as columns. Nested values (dicts, arrays) are serialized as JSON strings in the CSV.
Export a value at a path to a new JSON file. Useful for saving a filtered subset or nested section of a large document.
Output schemas not documented. LLMs cannot predict return structure (fields, types, pagination). Tools return unstructured text via _safe() wrapper, forcing LLMs to parse free-form responses.
Error handling is generic ('Error: {exc}'). No recovery guidance, error classification, or actionable messages. LLMs cannot determine if errors are retryable or user-fixable.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools are marked READ_ONLY or WRITE in metadata but not exposed to LLM via MCP annotations. Agents cannot reason about side effects.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | <=2025-11-25 | v2 |
Filter an array of objects by a field condition. Operators: eq, neq, gt, gte, lt, lte, contains, regex.
Flatten a nested JSON object into dot-notation key-value pairs. Converts nested structures like {"a": {"b": 1}} into {"a.b": 1}.
Get all keys at a given path in a loaded JSON document. Works on objects (returns key names) and arrays (returns index count).
Return a schema-like skeleton of a JSON document showing keys and types. Useful for understanding the shape of deeply nested JSON without viewing all the actual data.
Return the JSON type of the value at a given path. Possible types: object, array, string, number, boolean, null. For objects and arrays, also includes the count of keys/items.
Retrieve the value at an exact path in a loaded JSON document. The output is automatically truncated if it exceeds 10KB to prevent overwhelming the context window.
Group an array of objects by a field value.
Execute a JSONPath expression against a loaded JSON document. Use standard JSONPath syntax to extract data. Examples: $.users[*].email — all user emails, $.orders[[email protected]>100] — orders over 100, $.config.database.host — specific nested value
List all currently loaded JSON documents with their metadata.
Load a JSON file from disk into memory. Returns a summary with alias, type, size, and item count. You MUST call this first before using any other tool.
Get the minimum and maximum of numeric values matched by a JSONPath expression.
Filter an array of objects with multiple conditions combined by AND/OR. Each condition is a dict with keys: field, operator, value. Operators: eq, neq, gt, gte, lt, lte, contains, regex.
Extract specific fields from each object in an array (projection). Like SQL SELECT — picks only the columns you care about.
Return N random items from an array. Useful for previewing large datasets without loading everything.
Recursively search all string values for a substring or regex pattern. Returns the paths and values of every match found. Useful for finding where a specific term appears anywhere in a large JSON document.
Sort an array of objects by a field.
Sum numeric values matched by a JSONPath expression.
Get distinct values matched by a JSONPath expression.
Remove a loaded JSON document from memory to free resources.
Count occurrences of each distinct value matched by a JSONPath expression. Like a frequency table: shows each unique value and how many times it appears. Results are sorted by count (most common first).
JSONPath parameter (jsonpath_query, sum_values, min_max, unique_values, value_counts, describe) lacks syntax constraints. Description says 'must start with $' but no validation or format specification. LLMs may pass invalid expressions.
Operator parameter (filter_objects, multi_filter) accepts free-form string. Should be enum: [eq, neq, gt, gte, lt, lte, contains, regex]. Current design invites hallucinated operators.