tableski-core 0.2.0

The tableski engine: DataFusion tables over Excel, CSV, Parquet and NDJSON files, with the MCP tool dispatch — no transport, embed it anywhere
Documentation

tableski-core

The engine behind tableski: Excel (xlsx / xls / ods), CSV, Parquet and NDJSON files become Apache DataFusion tables, and five MCP tools (list_tables, query_sql, get_schema, export_result, column_statistics) query them with every result framed as data.

No transport in here. AppState implements emperor_mcp::McpHandler, so any emperor-mcp transport can serve it; call_tool runs a tool directly when you want no MCP at all.

use datafusion::prelude::SessionContext;
use std::sync::Arc;
use tableski_core::{AppState, IngestOptions, call_tool, register_path};

# async fn run() -> Result<(), String> {
let ctx = SessionContext::new();
let tables = register_path(&ctx, "orders.xlsx".as_ref(), &IngestOptions::default())
    .await
    .map_err(|e| e.to_string())?;           // one table per sheet
let state = AppState::new(Arc::new(ctx), tables).with_export_dir("exports");
let grid = call_tool(&state, "query_sql", serde_json::json!({
    "sql": "SELECT region, sum(amount) FROM orders GROUP BY region"
})).await?;
println!("{grid}");
# Ok(()) }

Features: clap derives clap::ValueEnum on HeaderMode for CLIs that expose --headers.

The CLI and HTTP server live in the tableski crate. Licence: MIT OR Apache-2.0.