Skip to main content

askql — governed natural-language data access, for humans and AI agents

Turn a plain-English question into a validated, read-only SQL answer against your real database — and get back not just rows, but proof the query was correct, authorized, and defensible. Self-hosted. Nothing leaves your perimeter. Any SQL engine.

Correct and defensible. Most tools optimize one: a raw LLM writes plausible SQL (often wrong, always ungoverned); a BI tool is governed but can't answer a novel question. askql does both — it grounds the question in your data's real meaning, and it can't be talked into running anything unsafe.

Ground · Govern · Prove

Three things happen on every request. All three ship today.

  • Groundunderstand what you're asking. A per-database graph of your schema with join paths proven against the data (not guessed from names), business-term glossary, and the real values your columns hold. This is what turns "how many active customers" into the right SQL instead of a confident wrong one.
  • Governguard the execution. Every query is parsed and checked by an AST validator (the single source of truth): read-only, no DDL/DML, no SELECT * on a bare table, sensitive columns blocked, a row cap and timeout enforced — then run through a least-privilege, rolled-back connection. The safety is structural: an agent can't prompt-inject its way past it.
  • Proverecord what happened. Every query returns a decision envelope — what was decided (allow / allow-with-masking / deny), which controls applied, which tables and sensitive columns were touched, and an evidence_id that matches the audit log. Every answer is auditable.

30 seconds

pip install "askql[postgres]"          # or [oracle] [mssql] [redshift] [jdbc] … + [mcp] [llm]

askql init --dialect postgres          # scaffold config/ + docs/ + .env (auto-discovered from here)
#   edit .env + config/databases.yaml  # credentials + host:port/db + schemas

askql doctor                            # 10-point connectivity/health check
askql test-db                           # per-dialect smoke battery (incl. read-only check)

# build the grounding — with join paths PROVEN against the data:
askql scrape --include-views --build-graph --infer-fks --verify-edges --sample-values
askql learn ./saved_sql --examples      # (optional) mine real SQL for join paths + examples
askql model validate                    # is the grounding internally consistent?

# ask — with the reasoning and the governance decision exposed:
askql ask "how many active customers are there" --explain

--explain shows the question coverage, the tables selected, which glossary terms / examples fired, and the governance decision + evidence_id. No LLM key? Generation falls back to your IDE agent (Copilot / Claude Code) — the safety pipeline is identical.

Windows / restricted networks: if the askql launcher errors (exit 126), use python -m askql … — shim-free and identical. Behind a corporate index, add --index-url <your-mirror>. If antivirus blocks a driver's binary wheel (e.g. psycopg2) on write into the venv, inherit the system driver instead: python -m venv .venv --system-site-packages then pip install "askql==X.Y.Z" --no-deps.


Your AI agent is the UI

askql ships an MCP server — seven governed, read-only tools an agent (Claude Desktop, Cursor, VS Code, or any MCP client) drives directly: list_tables, describe_table, compress_schema, validate_sql, query, check_freshness, ask.

pip install "askql[mcp]"
askql-mcp                                # stdio server; point your MCP client's command here
#   (bound to one database + identity via T2S_DATABASE / T2S_MCP_USER)

Every tool runs through the same validator + RBAC + read-only executor + audit as the CLI, and query/ask return the decision envelope. So an agent can explore the schema and run SQL — and cannot run a DELETE, exceed its row cap, or touch a schema its identity isn't scoped to. The mcp SDK is a lazily-imported opt-in extra: orgs that disallow MCP can ignore it entirely.


How it's different

raw LLM agent traditional BI tool bare semantic layer askql
Answers a novel NL question (often wrong) grounded
Knows your business definitions in-tool only schema only ✅ glossary + values + rules
Join paths proven against the data --verify-edges
Unsafe SQL blocked before execution n/a ✅ AST validator
Survives prompt injection n/a ✅ structural, not prompt-based
Every answer carries provable evidence ✅ decision envelope + audit
Works through your agents (MCP)
Runs on your real DB, real dialect definitions only ✅ Oracle/MSSQL/Redshift/PG/…
Open, reviewable, git-native context partial ✅ plain YAML/MD
Self-hosted; no data leaves your perimeter depends

The grounding is yours — reviewable, versioned, in git

Everything that makes answers accurate is plain files you own, not state locked in a UI: schema-graph.<db>.json, glossary.<db>.yaml, examples.<db>.yaml, corrections.<db>.yaml, docs/domain-rules.<db>.md, synonyms.yaml. Review changes in a PR; roll them back like code.

askql model                 # one summary of every grounding layer for a database
askql model validate        # catches silent accuracy-killers (0-edge graph, glossary→missing table…)
askql model explain "vip"   # how a term resolves — glossary hit? column? a real sampled value?

The grounding improves with use: askql feedback captures a confirmed example or a correction ("‘active’ means status='A', not 'ACTIVE'"), and askql learn turns your existing SQL into proven join paths and labelled examples.


Safety is measured, not asserted

askql eval                                  # 32-case adversarial red-team; exits non-zero on any escape
askql eval --accuracy --cases cases.json    # score generated SQL by result-match against gold answers
  • Only SELECT (+ UNION/INTERSECT/EXCEPT). No DDL/DML or procedural code — even hidden in a CTE.
  • No SELECT * on a bare table/view; explicit columns (COUNT(*) is fine). Row limit required + capped.
  • No system schemas, no sensitive columns (SSN, PASSWORD, …), no dangerous functions.
  • Read-only session, rollback, timeout, and an audit record — on every query.

The red-team is a CI gate (safety is a test that fails the build on a regression). The accuracy harness gives you a number for your own question set. A full evaluation protocol you can hand to a reviewer is in docs/partner-verification.md.


Bring your own model — any provider

Generation is pluggable; the safety pipeline is identical regardless. Set T2S_LLM_PROVIDER: anthropic · bedrock (Claude on AWS) · vertex (Claude on GCP) · openai · azure-openai · openai-compatible (vLLM / Ollama / LM Studio / any self-hosted, works air-gapped) · custom (your gateway) · unsetBYO-LLM (your IDE agent generates; no backend key). Nothing is locked to one vendor, and no question or schema is sent anywhere you didn't configure.


Also available

  • REST API (askql-api) — run askql as a service so clients hold no drivers, JVM, or credentials; they call HTTP and get the same validator + RBAC + audit. /validate, /compress, /query, /ask.
  • Docker image — bundles a JRE so the universal JDBC transport works with no local Java/native drivers. Mount config/, .env, and vendor jars at runtime.
  • Python libraryfrom askql import validate, compress, execute_sql_text, ask — typed (py.typed), optional deps imported lazily, everything config-injectable.
from askql import validate, ask, Settings
r = validate("SELECT id, name FROM app.users LIMIT 10", settings=Settings(dialect="postgres"))
assert r.ok, r.errors
result = ask("how many active users this week")   # needs an LLM provider configured
print(result["sql"], result["decision"]["evidence_id"])

Access control (optional)

With an identity present ($T2S_USER / --user) and config/access-control.yaml, a role decides which environments, schemas, PII mode (blocked / masked / full), row cap, and rate limit apply — enforced by the executor and surfaced in the decision envelope. With no identity it's single-user read-only mode. pii=masked redacts sensitive values (***) at the executor — the model can't reveal what it never receives.


Docs

docs/partner-verification.md Reproducible evaluation: connect → safe → correct → defensible
ARCHITECTURE.md Design + the security hardenings over the source playbook
CLAUDE.md Operating instructions for the AI agent driving askql
SHIPPING.md Package / ship / install (wheel · internal index · Docker)
CHANGELOG.md Release history

Read-only by construction. askql executes only read-only SELECT through a least-privilege connection; point it at whatever environment your access policy permits. MIT licensed.

Download files

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

Source Distribution

askql-0.22.0.tar.gz (125.1 kB view details)

Uploaded Source

Built Distribution

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

askql-0.22.0-py3-none-any.whl (146.0 kB view details)

Uploaded Python 3

File details

Details for the file askql-0.22.0.tar.gz.

File metadata

  • Download URL: askql-0.22.0.tar.gz
  • Upload date:
  • Size: 125.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for askql-0.22.0.tar.gz
Algorithm Hash digest
SHA256 d746f99052d73426b121d15c4b7b90a687b46abc80f1a0aa8be5b576a09cfa68
MD5 20acc7deb284d1320426f409934352d2
BLAKE2b-256 8150375f2dc2166c4305d4c0a2a4571cb61851844810a2628b05139787f675ce

See more details on using hashes here.

Provenance

The following attestation bundles were made for askql-0.22.0.tar.gz:

Publisher: release.yml on TestAutomationArchitect/askql

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

File details

Details for the file askql-0.22.0-py3-none-any.whl.

File metadata

  • Download URL: askql-0.22.0-py3-none-any.whl
  • Upload date:
  • Size: 146.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.14

File hashes

Hashes for askql-0.22.0-py3-none-any.whl
Algorithm Hash digest
SHA256 978ce00f5662e117029e2d037395a76140863aa65bfe512a34a984e7342c65df
MD5 a727ab60a8e7cef1f36d32cd5f02fd88
BLAKE2b-256 88b5105276cd7fc9444dbe452ee1c65561f6544f6302d0549f13b757c5277760

See more details on using hashes here.

Provenance

The following attestation bundles were made for askql-0.22.0-py3-none-any.whl:

Publisher: release.yml on TestAutomationArchitect/askql

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

Release history Release notifications | RSS feed

0.23.0

2 files

This release

0.22.0 This release

2 files

0.21.0

2 files

0.20.1

2 files

0.20.0

2 files

0.19.0

2 files

0.18.0

2 files

0.17.0

2 files

0.16.0

2 files

0.15.0

2 files

0.14.0

2 files

0.13.0

2 files

0.12.0

2 files

0.11.1

2 files

0.11.0

2 files

0.10.0

2 files

0.9.0

2 files

0.8.1

2 files

0.8.0

2 files

0.7.1

2 files

0.7.0

2 files

0.6.0

2 files

0.5.1

2 files

0.5.0

2 files

0.4.0

2 files

0.3.1

2 files

0.3.0

2 files

0.2.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page