jpx-engine
Protocol-agnostic JMESPath query engine with 400+ functions.
This crate provides the core "brain" of jpx - everything you can do with JMESPath
beyond basic compile and evaluate. It's designed to be transport-agnostic, allowing
the CLI (jpx), MCP server (jpx-mcp), or any future REST/gRPC adapters to be
thin wrappers over this engine.
Features
| Category | Description |
|---|---|
| Evaluation | Single, batch, and string-based evaluation with validation |
| Introspection | List functions, search by keyword, describe, find similar |
| Discovery | Cross-server tool discovery with BM25 search indexing |
| Query Store | Named queries for session-scoped reuse |
| JSON Utilities | Format, diff, patch, merge, stats, paths, keys |
| Arrow | Apache Arrow conversion (optional, via arrow feature) |
Cargo Features
arrow- Enables Apache Arrow support for columnar data conversion. This adds thearrowmodule with functions to convert between Arrow RecordBatches and JSON Values. Used by the CLI for Parquet I/O.
Quick Start
use JpxEngine;
use json;
let engine = new;
// Evaluate a JMESPath expression
let result = engine.evaluate.unwrap;
assert_eq!;
Evaluation
The engine supports multiple evaluation modes:
use JpxEngine;
use json;
let engine = new;
// From parsed JSON
let data = json!;
let result = engine.evaluate.unwrap;
assert_eq!;
// From JSON string
let result = engine.evaluate_str.unwrap;
assert_eq!;
// Batch evaluation (multiple expressions, same input)
let exprs = vec!;
let batch = engine.batch_evaluate;
assert_eq!;
// Validation without evaluation
let valid = engine.validate;
assert!;
Function Introspection
Discover and explore the 400+ available functions:
use JpxEngine;
let engine = new;
// List all categories
let categories = engine.categories;
assert!;
// List functions in a category
let string_funcs = engine.functions;
assert!;
// Search by keyword (fuzzy matching, synonyms)
let results = engine.search_functions;
assert!;
// Get detailed function info
let info = engine.describe_function.unwrap;
assert_eq!;
// Find similar functions
let similar = engine.similar_functions.unwrap;
assert!;
JSON Utilities
Beyond JMESPath evaluation, the engine provides JSON manipulation tools:
use JpxEngine;
let engine = new;
// Pretty-print JSON
let formatted = engine.format_json.unwrap;
assert!;
// Generate JSON Patch (RFC 6902)
let patch = engine.diff.unwrap;
// Apply JSON Patch
let result = engine.patch.unwrap;
// Apply JSON Merge Patch (RFC 7396)
let merged = engine.merge.unwrap;
// Analyze JSON structure
let stats = engine.stats.unwrap;
assert_eq!;
Query Store
Store and reuse named queries within a session:
use JpxEngine;
use json;
let engine = new;
// Define a reusable query
engine.define_query.unwrap;
// Run it by name
let data = json!;
let result = engine.run_query.unwrap;
assert_eq!;
// List all stored queries
let queries = engine.list_queries.unwrap;
assert_eq!;
Tool Discovery
Register and search tools across multiple servers (for MCP integration):
use ;
use json;
let engine = new;
// Register a server's tools
let spec: DiscoverySpec = from_value.unwrap;
let result = engine.register_discovery.unwrap;
assert!;
// Search across registered tools
let tools = engine.query_tools.unwrap;
assert!;
Strict Mode
For standard JMESPath compliance without extensions:
use JpxEngine;
use json;
let engine = strict;
assert!;
// Standard functions work
let result = engine.evaluate.unwrap;
assert_eq!;
// Extension functions are not available for evaluation
// (but introspection still works for documentation purposes)
Architecture
jmespath-extensions (400+ functions, registry)
|
jpx-engine (this crate - evaluation, search, discovery)
|
+----+----+
| |
jpx jpx-mcp (CLI and MCP transport)
Thread Safety
The engine uses interior mutability (Arc<RwLock<...>>) for the discovery
registry and query store, making it safe to share across threads. The function
registry is immutable after construction.