Skip to main content

Query Companion: a CLI to query Postgres databases in natural language.

Project description

qcp — Query Companion

Query your Postgres database in plain English, right from the terminal.

$ qcp query "what were the top 5 customers by revenue last month?"
Reading schema...
Generating SQL...

SELECT customer_name, SUM(amount) AS revenue
FROM orders
WHERE order_date >= date_trunc('month', now()) - interval '1 month'
  AND order_date < date_trunc('month', now())
GROUP BY customer_name
ORDER BY revenue DESC
LIMIT 5

customer_name   revenue
--------------  -------
Acme Corp       48210.50
Globex Inc      39120.00
...

(5 rows)

qcp uses a LangChain database agent powered by Google Gemini 2.5 Flash to translate your question into a read-only SQL query, run it, print the exact results, and explain the answer in plain language.

Features

  • 🗣️ Ask questions in natural language, get SQL + results
  • 🔒 Read-only by default — only SELECT/WITH statements are executed
  • 💡 qcp insights — AI-generated analytics suggestions for your schema
  • 🧠 Local schema memory with automatic 24-hour refresh
  • 🔑 Bring your own Gemini API key (free tier available)
  • 🪶 Minimal footprint — single CLI, no servers or daemons

Install

QCP requires Python 3.14 or newer.

macOS / Linux (curl)

curl -fsSL https://raw.githubusercontent.com/Moduna-AI/qcp-cli/main/scripts/install.sh | bash

macOS (Homebrew)

brew tap Moduna-AI/qcp-cli
brew install qcp

Windows (PowerShell)

irm https://raw.githubusercontent.com/Moduna-AI/qcp-cli/main/scripts/install.ps1 | iex

Via pip (any platform)

pip install qcp

Quickstart

# 1. Connect a Postgres database
qcp init

# 2. Add your Gemini API key (https://aistudio.google.com/apikey)
qcp auth

# 3. Ask away
qcp query "how many new signups did we get this week?"

# Or get general insights about your data
qcp insights

Running qcp query or qcp insights without a configured database raises a clear error and tells you to run qcp init first.

Configuration

qcp stores config at ~/.qcp/config.json (override with QCP_HOME). Validated schema metadata is cached separately at ~/.qcp/schema.json; it never contains credentials or query result rows. You can also use environment variables instead of (or to override) the config file:

Variable Purpose
QCP_DATABASE_URL Postgres connection string
GEMINI_API_KEY Gemini API key

Check current configuration any time with:

qcp status

Commands

Command Description
qcp init Connect a Postgres database
qcp auth Add/remove your Gemini API key
qcp query "<question>" Ask a question, get SQL + results
qcp insights Get AI-generated analytics suggestions
qcp status Show current configuration

Useful flags on qcp query:

  • --dry-run — print the generated SQL without executing it
  • --no-show-sql — only print results, hide the SQL

Safety

qcp only executes one SELECT/WITH statement. Validation is backed by a PostgreSQL read-only transaction, and there is no write override. Always review generated SQL (shown by default), especially on production databases. A read-only database role remains recommended as an additional boundary.

Agent tools

The LangChain agent has four narrow tools: lookup_schema, schema_memory, execute_read_query, and analyze_insights. Schema data is reused for 24 hours, then refreshed automatically. An undefined table, column, or schema invalidates the cache and permits one refresh-and-retry cycle.

Development

git clone https://github.com/Moduna-AI/qcp-cli
cd qcp
uv sync --extra dev
uv run pytest

Install the Git hook once with uv run pre-commit install. Use uv run <command> for project commands; uvx creates an isolated environment without QCP installed.

Clean install / clean build

A Makefile (plus equivalent standalone shell scripts) is included so you never get bitten by stale venvs or cached build artifacts:

Task Make Script
Wipe venv/dist/caches make clean ./scripts/clean.sh
Fresh editable install make install
Fresh install + test deps make dev
Clean build (sdist + wheel) make build ./scripts/build.sh
Clean install, then build make rebuild
Run tests make test
Run the CLI from venv make run ARGS="status"
Run Ruff checks make lint

make build / ./scripts/build.sh always wipe the tree first, so dist/ is never tainted by a previous build. Both are safe to re-run anytime.

Roadmap (post-MVP)

  • Additional LLM providers (OpenAI, Claude, local models)
  • MySQL / SQLite support
  • Query history and caching
  • Saved queries / scheduled reports

License

MIT — see LICENSE.

Contributions welcome! Please open an issue or PR.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

qcp_cli-0.1.10.tar.gz (113.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

qcp_cli-0.1.10-py3-none-any.whl (21.8 kB view details)

Uploaded Python 3

File details

Details for the file qcp_cli-0.1.10.tar.gz.

File metadata

  • Download URL: qcp_cli-0.1.10.tar.gz
  • Upload date:
  • Size: 113.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for qcp_cli-0.1.10.tar.gz
Algorithm Hash digest
SHA256 0a6758a4127bf44f1cd77169aecdac43c40afa8deb93cbb723523987bc75b432
MD5 32e43bc65bef125fe4d3ddf68fa0ab53
BLAKE2b-256 d9675dc013917808f74048c438fef55a4f0479987d4c182deef22fa3ab153373

See more details on using hashes here.

Provenance

The following attestation bundles were made for qcp_cli-0.1.10.tar.gz:

Publisher: release.yml on Moduna-AI/qcp-cli

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file qcp_cli-0.1.10-py3-none-any.whl.

File metadata

  • Download URL: qcp_cli-0.1.10-py3-none-any.whl
  • Upload date:
  • Size: 21.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for qcp_cli-0.1.10-py3-none-any.whl
Algorithm Hash digest
SHA256 3a681e52df7950dca9865255512519eee82033c5f061cc64aa90cc4aecd1c8ac
MD5 39e2f27d36c8688fab09a2238f7f4ef1
BLAKE2b-256 ee5d575dbeb14fb352f0e0c06353822914e17baeaeb09236ddcd30e157738d73

See more details on using hashes here.

Provenance

The following attestation bundles were made for qcp_cli-0.1.10-py3-none-any.whl:

Publisher: release.yml on Moduna-AI/qcp-cli

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page