Your bucket is already a warehouse.

Open source · Apache 2.0

Lens mounts your Parquet files as SQL tables and lets you query them from the terminal, from a notebook, in plain English, or from an AI agent — over the same files.

pip install dataspoc-lens

What Lens does:

One query layer, four ways in — and no copy of your data anywhere else.

Lens points DuckDB at the Parquet in your bucket and exposes it as tables. Engineers get a SQL shell, analysts get Jupyter or Marimo, everyone else asks in plain English, and agents connect over MCP. Every route reads the same files, so nobody argues about which number is right.

What you get

  • SQL shell

    DuckDB over your lake, with the catalog mounted. Joins across buckets you have access to, no warehouse in between.

  • Ask in plain English

    lens ask writes the SQL, runs it, and shows you both — so the query is auditable, not a black box.

  • Notebooks

    Jupyter and Marimo launch with every bucket already mounted.

  • Local cache

    Pull hot tables to disk, track staleness, refresh on demand. Repeat queries stop hitting object storage.

  • MCP server

    list_tables, query(sql) and ask(question) exposed to Claude, Cursor or any MCP client. Real SQL against real rows — no embeddings, no vector store.

  • Python SDK

    LensClient for CrewAI, LangGraph, AutoGen or your own agent loop.

In practice

Point it at a bucket. Start asking.

$ pip install dataspoc-lens
$ dataspoc-lens add-bucket s3://my-data
  3 buckets, 47 tables mounted
$ dataspoc-lens ask "top customers by revenue"
  SELECT customer, SUM(total) FROM ... GROUP BY 1
  Acme Corp leads with $247k, Initech at $189k

The query layer your lake was missing.

Read the docs