Skip to main content

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

Project description

qcp — Query Companion

PyPI Downloads Downloads PyPI Downloads PyPI Version License CI Release

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 is private, secure, safe and runs locally.

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 -L https://github.com/Moduna-AI/qcp-cli/releases/latest/download/qcp-linux-x86_64 -o qcp
chmod +x qcp
sudo mv qcp /usr/local/bin/

macOS (Homebrew)

brew tap moduna-ai/qcp
brew install moduna-ai/qcp/qcp

Windows (PowerShell)

Invoke-WebRequest -Uri "https://github.com/Moduna-AI/qcp-cli/releases/latest/download/qcp-windows-x86_64.exe" -OutFile "qcp.exe"
Move-Item qcp.exe "$env:LOCALAPPDATA\Microsoft\WindowsApps\qcp.exe"

Via pip (any platform)

pip install qcp-cli

Via uv

uv tool install qcp-cli

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.12a2.tar.gz (116.2 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.12a2-py3-none-any.whl (24.6 kB view details)

Uploaded Python 3

File details

Details for the file qcp_cli-0.1.12a2.tar.gz.

File metadata

  • Download URL: qcp_cli-0.1.12a2.tar.gz
  • Upload date:
  • Size: 116.2 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.12a2.tar.gz
Algorithm Hash digest
SHA256 5deca4fd92eb7f8a6c5a7a93a8fe082724ccd9865df81e90a3b0fefb9ae60a50
MD5 db182f097d7e54d0ce8a14b8ef9c8011
BLAKE2b-256 f1f5ee8822c674c90ccc0dd6ac79a6dcea57e9fe1a5f19abf5eed88f37b86361

See more details on using hashes here.

Provenance

The following attestation bundles were made for qcp_cli-0.1.12a2.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.12a2-py3-none-any.whl.

File metadata

  • Download URL: qcp_cli-0.1.12a2-py3-none-any.whl
  • Upload date:
  • Size: 24.6 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.12a2-py3-none-any.whl
Algorithm Hash digest
SHA256 6071a04a66e6feec7d8d9986b2571053134333cc81ab1e5b1c1a9819f84ce13b
MD5 ffe0526f13b83e249304db9f3622e54e
BLAKE2b-256 d5f39d76d765c935e967db04d99616eb0d1a5b9111efb8ff391e039ac0948582

See more details on using hashes here.

Provenance

The following attestation bundles were made for qcp_cli-0.1.12a2-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