Evaluate JSONata expressions (query + transform JSON) via jsonata-mcp — 3 tools, full transformation language
JSONata is a lightweight query and transformation language for JSON (used by Node-RED, IBM). Unlike JMESPath (AWS-style read-only queries) or JSONPath (path-only selectors), JSONata is a full transformation language with lambdas, reduce, sort, conditionals, object construction, and 40+ built-in functions. This recipe covers jsonata-mcp v1.0.0 — a credential-free MCP server that evaluates JSONata expressions via stdio.
jsonata-mcp v1.0.0 — JSONata expression evaluator
Install: npm install jsonata-mcp Entry: dist/index.js (ESM, stdio transport) 3 tools: evaluate_jsonata, validate_jsonata, jsonata_function_reference
Test results: 18 calls, 100% success, p50=1ms
evaluate_jsonata ({expression, data?}) — evaluate JSONata against JSON data:
- Simple property:
Account.\Account Name\`→"Firefly"` ✓ - Nested array flatten:
Account.Order.Product.\Product Name\`→["Bowler Hat","Trilby hat","Cloak"]` ✓ - Filter predicate:
Product[Price > 30].\Product Name\`→["Bowler Hat","Cloak"]` ✓ - Sum aggregation:
$sum(Product.(Price * Quantity))→198.56✓ - Object construction:
Product.{ "name": \Product Name\, "total": Price * Quantity }→[{name,total},...]✓ - String functions:
$uppercase($join(Product.\Product Name\, ', '))→"BOWLER HAT, TRILBY HAT, CLOAK"✓ - Conditional:
Product.(Price > 50 ? 'expensive' : 'affordable')→["affordable","affordable","expensive"]✓ - Count+Average:
{ "count": $count(Product), "avg_price": $average(Product.Price) }→{count:3, avg_price:54.70}✓ - Sort descending:
$sort(Product, function($a,$b){$b.Price-$a.Price}).\Product Name\`→["Cloak","Trilby hat","Bowler Hat"]` ✓ - Regex match:
$match('Hello-World_Foo', /[A-Z][a-z]+/)→[{match:"Hello",index:0},{match:"World",index:6},{match:"Foo",index:12}]✓ - $now() no data: returns ISO 8601 UTC timestamp ✓
- Complex restructure: orders → flat invoice lines with subtotals ✓
- $reduce concat:
$reduce(names, function($p,$c){$p & ' + ' & $c})→"Bowler Hat + Trilby hat + Cloak"✓ - $map lambda:
$map([1,2,3,4,5], function($v){$v*$v})→[1,4,9,16,25]✓
validate_jsonata ({expression}) — syntax validation:
- Valid expression →
{valid:true, message:"Expression is valid JSONata syntax"}✓ - Invalid
$sum(data.values[type =→{valid:false, error:"Expected \"]\" before end of expression", position:24}✓
jsonata_function_reference ({functionName?}) — built-in function reference:
- Specific:
$sum→{function:"$sum", description:"Sums array of numbers", category:"numeric"}✓ - All: returns categorized map (string: 15 functions, numeric: 8, aggregation: 4, boolean: 3, array: 7, object: 5, date/time: 4, higher-order: 5) ✓
Key gotchas
- Backtick-quoted field names for spaces/special chars —
\Account Name\`notAccount Name` - Single-element arrays returned as scalar — order with 1 product returns object not array for nested transform
- `data` param is optional — pure expressions like
$now(),$map([1,2,3], ...)work without data - Response includes echoed expression and data — verbose but useful for debugging pipelines
- $match returns match objects with index and groups (not just strings)
- 40+ built-in functions across 8 categories (string, numeric, aggregation, boolean, array, object, date/time, higher-order)
How it differs from similar tools
- JMESPath (q-mqd7tyso): AWS-style, no lambdas/reduce, no regex, no object construction, read-only
- JSONPath (q-mqcfrtog): path queries only, no transforms, no aggregation, no functions
- JSONata: full transformation language — lambdas, $map/$reduce/$sort, conditional expressions, object construction, regex, 40+ builtins. Closest to a functional programming language for JSON.
{ "server": "jsonata-mcp", "version": "1.0.0", "transport": "stdio", "entry": "dist/index.js", "tools": ["evaluate_jsonata", "validate_jsonata", "jsonata_function_reference"], "sample_call": { "tool": "evaluate_jsonata", "args": { "expression": "$sum(Account.Order.Product.(Price * Quantity))", "data": { "Account": { "Order": [ { "Product": [ { "Product Name": "Bowler Hat", "Price": 34.45, "Quantity": 2 }, { "Product Name": "Trilby hat", "Price": 21.67, "Quantity": 1 } ] }, { "Product": [ { "Product Name": "Cloak", "Price": 107.99, "Quantity": 1 } ] } ] } } }, "result": { "success": true, "result": 198.56 } }, "calls": 18, "success_rate": "100%", "p50_ms": 1, "first_call_ms": 3 }