Skip to main content

database

Multi-driver async SQL module. Named connections, query execution with safety LIMIT injection, full schema introspection, transactions, bulk insert, paginated row browsing, FK-aware relations, full-text search.

PropertyValue
Module iddatabase
Version1.0.0
Typeuser
Async driversaiosqlite, asyncpg, aiomysql, aioodbc, oracledb

Short LLM names: DbConnect, DbDisconnect, DbList, DbQuery, DbTransaction, DbBulkInsert, DbSchema, DbBrowse, DbRelations, DbSearch.

The 16 actions

Grouped by responsibility.

Connection management (3)

ToolSourcePurpose
database.connectOpen a named connection. Params: connection_id, driver, database, host, port, username, password_env, policy, role, group, persist, options.
database.disconnectClose one connection (connection_id="*" closes all).
database.list_connectionsActive connections + metadata.

Query execution (4)

ToolSourcePurpose
database.sqlRecommended universal query - auto-detects SELECT / INSERT / UPDATE / DELETE / DDL and injects a safety LIMIT on unbounded SELECTs.
database.execute_queryRaw SQL execution (DDL / DML). Parameterised binding.
database.fetch_resultsSELECT with explicit LIMIT.
database.transactionRun a list of queries atomically (begin / commit / rollback managed).

Schema introspection (5)

ToolSourcePurpose
database.schemaRecommended unified explorer - what: "tables" | "describe" | "all".
database.list_tablesList tables + columns + indexes.
database.describeFull table context - schema + sample rows.
database.introspectFull schema dump (every table).
database.relationsFK graph - which tables reference which.

Data inspection (2)

ToolSourcePurpose
database.browsePaginated row browse for a table.
database.search_dataFull-text / LIKE search across columns.

Bulk + indexing (2)

ToolSourcePurpose
database.bulk_insertInsert many rows in one call.
database.extract_for_indexExtract schema in the shape the index module expects.

For most apps, expose only the smart actions:

tools:
capabilities:
grant:
- {module: database, actions: [connect, sql, schema]}

sql auto-injects LIMIT on unbounded SELECTs and validates syntax before executing. schema dispatches tables / describe / all via its what param.

Read-replica routing

Connections sharing a group with different role values form a replica set:

tools:
modules:
database:
setup:
- action: connect
params:
connection_id: main_db
role: primary
group: main
driver: postgresql
host: db.internal
- action: connect
params:
connection_id: main_replica
role: replica
group: main
driver: postgresql
host: replica.internal

Read queries against the group are distributed across replicas (round-robin).

Per-connection security policies

Pass policy on connect:

PresetAllows
readonlySELECT only.
safe_writeSELECT + INSERT / UPDATE, no DDL.
unrestrictedEverything.
- action: connect
params:
connection_id: main
driver: postgresql
database: prod
host: db.internal
password_env: DB_PASSWORD
policy:
preset: safe_write
allowed_tables: [users, orders]
blocked_tables: [credentials]
blocked_keywords: [DROP, TRUNCATE, ALTER]
max_rows: 10000

Constraints

ConstraintTypeDescription
allowed_hostsstring_listAllowed DB hosts. By default only loopback.
allowed_actionsstring_listRestrict which DB actions are exposed.
blocked_actionsstring_listBlock specific actions.
tools:
modules:
database:
constraints:
allowed_hosts: [localhost, db.internal]
allowed_actions: [connect, sql, schema, browse]

SQL injection safety

All query actions use parameterised binding - never interpolate untrusted values into SQL strings. Use :p0, :p1 placeholders:

- action: sql
params:
connection_id: main
query: "SELECT * FROM users WHERE email = :p0"
params: ["alice@example.com"]

Configuration via setup steps

tools:
modules:
database:
setup: # run at module load
- action: connect
params:
connection_id: main
driver: sqlite
database: ./data.db
policy: { preset: safe_write }
constraints:
allowed_actions: [connect, fetch_results, list_tables, sql, schema]

Cross-references