Skip to main content

Database Interface Layer - Multi-database connectivity with SQLShield integration

Project description

TernoDBI: Database Interface Layer

License Python Django Coverage

TernoDBI is a database interface layer designed for Security and Accuracy, bridging the gap between AI Agents and Enterprise Data. It provides a unified, secure API for interacting with warehouse-scale databases while enforcing strict access controls and optimizing schema context for LLMs.


Key Features

  • Multi-Database Support: Unified connection handling for Postgres, MySQL, Snowflake, BigQuery, Databricks, Oracle, and SQLite.
  • Split MCP Architecture:
    • Query Server: Read-only operations (list tables, schema info, execute SELECT queries) optimized for agents.
    • Admin Server: Write/Management operations (rename tables, update metadata, manage descriptions) for human-in-the-loop workflows.
  • Enterprise Security:
    • Row Level Security (RLS): Define strict SQL-based filters (e.g., department_id = 5) automatically injected into every query.
    • Privacy-by-Default: Hide sensitive tables/columns from LLM context unless explicitly exposed to specific Roles.
    • SQLShield: Automatic AST-based SQL validation preventing injection and destructive operations.
  • LLM-Ready Schema Enrichment:
    • Semantic Metadata: Decouple physical DB names (t_users_v2) from user-facing semantic names (Customers).
    • Statistical Profiling: Automatic cardinality and distribution stats to help LLMs generate correct filters.
  • High-Performance Pagination:
    • Cursor-Based: O(1) performance (HMAC-signed). Benchmarks show ~28x speedup over offset pagination.
    • Streaming: Server-side cursor support for exporting millions of rows.

Documentation

Detailed guides for setting up and using TernoDBI:


Installation

pip install terno-dbi
# OR for local development
pip install -e .

Configuration

Copy the sample environment file to start:

cp server/env-sample.sh server/env.sh
source server/env.sh

Essential Variables

Variable Description Default
DBI_SECRET_KEY Cryptographic key for signing cursors/tokens. Unsafe Default
DBI_DEBUG Toggle debug mode. True
DATABASE_ENGINE MYSQL, POSTGRESQL, or empty for SQLite. SQLite

Database Setup Scenarios

  • Standalone SQLite: Set DATABASE_ENGINE= (empty). DB created in server/db.sqlite3.
  • Shared SQLite (Embedded): Set DJANGO_PROJECT_PATH=/path/to/other/django. TernoDBI will attach to that project's database.
  • Production (Postgres/MySQL): Set DATABASE_ENGINE=POSTGRESQL and provide POSTGRES_DB, POSTGRES_USER, etc.

Usage

1. Running the API Server

cd server
python manage.py migrate
python manage.py runserver 0.0.0.0:8000

2. Management Commands (CLI)

Use the built-in CLI to manage access tokens for your agents:

# General Query Token
python manage.py issue_token --name "Claude Agent" --type query --expires 30

# Admin Token (Full Access)
python manage.py issue_token --name "System Admin" --type admin

# Scoped Token (Specific Datasource)
python manage.py issue_token --name "Finance Data Only" --type query --datasource 1

3. Query API & Pagination

Offset Mode (Default) - Best for UI.

POST /api/query/datasources/1/query/
{
    "sql": "SELECT * FROM users",
    "pagination_mode": "offset",
    "page": 2,
    "per_page": 50
}

Cursor Mode (High Performance) - Best for Agents & Data Export.

POST /api/query/datasources/1/query/
{
    "sql": "SELECT * FROM users",
    "pagination_mode": "cursor",
    "per_page": 50,
    "cursor": "eyJ2IjoxLCJ2YWx..." 
}

MCP Server Integration

Claude Desktop Setup

Step 1: Download & Install Claude Desktop

Download Claude Desktop from https://claude.ai/download and install it on your machine.

Step 2: Open Configuration

  1. Launch Claude Desktop
  2. Go to AccountSettings
  3. Navigate to Developer section
  4. Click Edit Config to open claude_desktop_config.json Claude Desktop Settings

Step 3: Add MCP Server Configuration

Add the following configuration to your claude_desktop_config.json:

Local Development:

{
  "mcpServers": {
    "ternodbi-admin": {
      "command": "/path/to/your/venv/bin/dbi-mcp",
      "args": ["admin"],
      "env": {
        "TERNODBI_API_URL": "http://127.0.0.1:8000",
        "TERNODBI_API_KEY": "dbi_admin_..."
      }
    },
    "ternodbi-query": {
      "command": "/path/to/your/venv/bin/dbi-mcp",
      "args": ["query"],
      "env": {
        "TERNODBI_API_URL": "http://127.0.0.1:8000",
        "TERNODBI_API_KEY": "dbi_query_..."
      }
    }
  }
}

[!TIP] Run which dbi-mcp in your terminal to find the absolute path to use in the configuration above. Production (UVX):

{
  "mcpServers": {
    "ternodbi-query": {
      "command": "uvx",
      "args": ["--from", "terno-dbi", "dbi-mcp", "query"],
      "env": {
        "TERNODBI_API_URL": "https://dbi.yourdomain.com",
        "TERNODBI_API_KEY": "dbi_query_..."
      }
    }
  }
}

Step 4: Restart & Verify

  1. Save and close the claude_desktop_config.json file.
  2. Completely quit Claude Desktop (not just close the window).
  3. Reopen Claude Desktop.
  4. Ask Claude: "Show me all datasources".

Security Deep Dive

Row Level Security (RLS)

RLS filters (TableRowFilter) are injected into the AST of every query via sqlshield.

  • Logic: Global Filters AND (Role A Filter OR Role B Filter).
  • Example: region = 'US' is automatically appended if the user is in the "US Region" group.

Privacy & Column Hiding

  • PrivateColumnSelector: Columns marked as private (e.g., salary) are removed from the schema context sent to the LLM.
  • Access: Only roles explicitly granted permission in GroupColumnSelector will see these columns.

Testing & Quality

  • Coverage: 99% unit test coverage for core services.
  • Benchmarks: Validated performance gains (~28x) for large datasets.

To run tests:

pytest tests/unit/services/pagination/

License

Apache 2.0 - See LICENSE for details.

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

terno_dbi-0.1.0.tar.gz (1.4 MB view details)

Uploaded Source

Built Distribution

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

terno_dbi-0.1.0-py3-none-any.whl (1.4 MB view details)

Uploaded Python 3

File details

Details for the file terno_dbi-0.1.0.tar.gz.

File metadata

  • Download URL: terno_dbi-0.1.0.tar.gz
  • Upload date:
  • Size: 1.4 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.2

File hashes

Hashes for terno_dbi-0.1.0.tar.gz
Algorithm Hash digest
SHA256 2606164f92c873832f5ae1b7416947294de5d2522957775cde3ab8787b7ee78d
MD5 8b35b5261039929bb712a1eff118232e
BLAKE2b-256 ff18b8f22174e062aa2c1223ba2c6bab14a6b886f7c5623ef0b2fec515bec079

See more details on using hashes here.

File details

Details for the file terno_dbi-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: terno_dbi-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 1.4 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.2

File hashes

Hashes for terno_dbi-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 61b899bd6b06d094da2c4c05619af7e131707698c520e459e91ab79a057dbf12
MD5 67b135de9ba789cf9a9a9c2f612d2004
BLAKE2b-256 16b3dcb6239825cadfdb1c90062b72df68edb4e684aa4c6c1b99eb01be829c89

See more details on using hashes here.

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