mcp-sqlite-tools
Version:
MCP server for local SQLite database operations
646 lines (457 loc) • 15.7 kB
Markdown
# mcp-sqlite-tools
A Model Context Protocol (MCP) server that provides comprehensive
SQLite database operations for LLMs. This server enables AI assistants
to interact with local SQLite databases safely and efficiently, with
built-in security features, advanced transaction support, and clear
separation between read-only and destructive operations.
## Features
### 🗄️ Database Management
- **Open/Create Database**: Open existing databases or create new ones
- **Close Database**: Properly close database connections
- **List Databases**: Discover database files in directories
- **Database Info**: Get comprehensive database metadata and
statistics
### 📊 Table Operations
- **List Tables**: View all tables and views in a database
- **Describe Table**: Get detailed schema information for tables
- **Create Table**: Create new tables with custom column definitions
- **Drop Table**: Remove tables (with safety warnings)
### 🔍 Query Operations
- **Execute Read Query**: Safe SELECT, PRAGMA, and EXPLAIN queries
- **Execute Write Query**: INSERT, UPDATE, DELETE operations
- **Execute Schema Query**: DDL operations (CREATE, ALTER, DROP)
- **Bulk Insert**: Efficient batch insertion of multiple records
### 💾 Transaction Management
- **Begin Transaction**: Start database transactions with savepoint
support
- **Commit Transaction**: Commit changes with nested transaction
handling
- **Rollback Transaction**: Safely rollback changes and nested
savepoints
- **Auto-cleanup**: Automatic cleanup of stale transactions
### 📋 Schema Operations
- **Export Schema**: Export database schema to SQL or JSON format
- **Import Schema**: Import and execute schema from SQL or JSON
- **Selective Export**: Export specific tables or entire database
structure
### 🛠️ Database Maintenance
- **Backup Database**: Create database backups with timestamps
- **Vacuum Database**: Optimize database storage and performance
- **Connection Pooling**: Advanced connection management with health
monitoring
## ⚠️ Security Features
This server implements multiple layers of security:
- **Query Classification**: Automatic separation of read-only, write,
schema, and transaction operations
- **Path Validation**: Prevents directory traversal attacks
- **Configurable Path Restrictions**: Control access to absolute paths
- **Input Validation**: Comprehensive parameter validation using
Valibot
- **Advanced Connection Pooling**: Connection limits, health
monitoring, and idle timeout
- **Transaction Safety**: Automatic stale transaction cleanup and
nested savepoint support
- **Resource Cleanup**: Graceful cleanup on server shutdown with
maintenance scheduling
## Installation
### From npm (when published)
```bash
npm install -g mcp-sqlite-tools
```
### From source
```bash
git clone <repository-url>
cd mcp-sqlite-tools
pnpm install
pnpm run build
```
## Configuration
### Environment Variables
The server can be configured using environment variables:
```bash
# Default directory for SQLite databases (relative to project root)
SQLITE_DEFAULT_PATH=.
# Allow absolute paths for database files (security setting)
SQLITE_ALLOW_ABSOLUTE_PATHS=true
# Maximum query execution time in milliseconds
SQLITE_MAX_QUERY_TIME=30000
# Default backup directory for database backups
SQLITE_BACKUP_PATH=./backups
# Enable debug logging
DEBUG=false
```
### MCP Client Configuration
#### Option 1: Global User Configuration (Recommended)
Configure once in your VS Code user settings to work across all
workspaces. Add this to your global `mcp.json` file
(`%APPDATA%\Code\User\mcp.json` on Windows):
For VS Code global configuration, edit `~/.config/Code/User/mcp.json`
(or equivalent Windows location):
```json
{
"servers": {
"sqlite-tools": {
"command": "npx",
"args": ["-y", "mcp-sqlite-tools"]
}
}
}
```
**For WSL users**, use this format in your global config:
```json
{
"servers": {
"sqlite-tools": {
"command": "wsl.exe",
"args": ["bash", "-c", "npx -y mcp-sqlite-tools"]
}
}
}
```
**Benefits:**
- ✅ **One configuration works everywhere** - no per-project setup
needed
- 📁 **Automatically uses current workspace** - databases created in
whatever project you have open
- 🔄 **Always up to date** - uses latest published version via npx
#### Option 2: Workspace-Specific Configuration
For teams that want to share database configuration via version
control, create a `.vscode/mcp.json` file in your workspace:
```json
{
"servers": {
"sqlite-tools": {
"command": "npx",
"args": ["-y", "mcp-sqlite-tools"],
"env": {
"SQLITE_DEFAULT_PATH": "${workspaceFolder}/databases",
"SQLITE_ALLOW_ABSOLUTE_PATHS": "true",
"SQLITE_BACKUP_PATH": "${workspaceFolder}/backups"
}
}
}
}
```
**Benefits:**
- � **Team sharing** - configuration committed to version control
- 📂 **Organized structure** - databases in dedicated `/databases`
folder
- �️ **Project isolation** - each project has its own database
configuration
#### Claude Desktop / Cline Configuration
Add this to your MCP client configuration:
```json
{
"mcpServers": {
"mcp-sqlite-tools": {
"command": "npx",
"args": ["-y", "mcp-sqlite-tools"],
"env": {
"SQLITE_DEFAULT_PATH": ".",
"SQLITE_ALLOW_ABSOLUTE_PATHS": "true",
"SQLITE_MAX_QUERY_TIME": "30000",
"SQLITE_BACKUP_PATH": "./backups"
}
}
}
}
```
### Environment Variables
The following environment variables can be used to configure the MCP
server:
| Variable | Description | Default | Example |
| ----------------------------- | ------------------------------------------- | ----------------------------- | ------------------------------ |
| `SQLITE_DEFAULT_PATH` | Default directory for database files | `.` | `${workspaceFolder}/databases` |
| `SQLITE_ALLOW_ABSOLUTE_PATHS` | Allow absolute paths in database operations | `true` | `false` |
| `SQLITE_BACKUP_PATH` | Default directory for database backups | Same as `SQLITE_DEFAULT_PATH` | `./backups` |
| `SQLITE_MAX_QUERY_TIME` | Maximum query execution time (ms) | `30000` | `60000` |
**Path Resolution:**
- Relative paths are resolved from the default path
- Use `${workspaceFolder}` in VS Code for workspace-relative paths
- Set `SQLITE_ALLOW_ABSOLUTE_PATHS=true` to enable absolute path
operations
#### Development Configuration
For development with the MCP inspector:
```bash
pnpm run build
pnpm run dev
```
## API Reference
### Database Management Tools
#### `open_database`
Opens or creates a SQLite database file.
**Parameters:**
- `path` (string, required): Path to the database file
- `create` (boolean, optional): Create if doesn't exist (default:
true)
**Example:**
```json
{
"path": "my-app.db",
"create": true
}
```
#### `close_database`
Closes a database connection.
**Parameters:**
- `database` (string, optional): Database path to close
#### `list_databases`
Lists available database files in a directory.
**Parameters:**
- `directory` (string, optional): Directory to search
#### `database_info`
Gets comprehensive information about a database.
**Parameters:**
- `database` (string, optional): Database path
### Table Operations
#### `list_tables`
Lists all tables and views in a database.
**Parameters:**
- `database` (string, optional): Database path
#### `describe_table`
Gets schema information for a table.
**Parameters:**
- `table` (string, required): Table name
- `database` (string, optional): Database path
#### `create_table`
Creates a new table with specified columns.
**Parameters:**
- `name` (string, required): Table name
- `columns` (array, required): Column definitions
- `database` (string, optional): Database path
**Column Definition:**
```json
{
"name": "column_name",
"type": "TEXT|INTEGER|REAL|BLOB",
"nullable": true,
"primary_key": false,
"default_value": null
}
```
**Example:**
```json
{
"name": "users",
"columns": [
{
"name": "id",
"type": "INTEGER",
"primary_key": true,
"nullable": false
},
{
"name": "name",
"type": "TEXT",
"nullable": false
},
{
"name": "email",
"type": "TEXT",
"nullable": true
}
]
}
```
#### `drop_table`
Permanently deletes a table and all its data.
**Parameters:**
- `table` (string, required): Table name to delete
- `database` (string, optional): Database path
### Query Operations
#### `execute_read_query`
Executes read-only SQL queries (SELECT, PRAGMA, EXPLAIN).
**Parameters:**
- `query` (string, required): SQL query
- `params` (object, optional): Query parameters
- `database` (string, optional): Database path
**Example:**
```json
{
"query": "SELECT * FROM users WHERE age > ?",
"params": { "1": 21 }
}
```
#### `execute_write_query`
Executes SQL that modifies data (INSERT, UPDATE, DELETE).
**Parameters:**
- `query` (string, required): SQL query
- `params` (object, optional): Query parameters
- `database` (string, optional): Database path
**Example:**
```json
{
"query": "INSERT INTO users (name, email) VALUES (?, ?)",
"params": { "1": "John Doe", "2": "john@example.com" }
}
```
#### `execute_schema_query`
Executes DDL queries (CREATE, ALTER, DROP).
**Parameters:**
- `query` (string, required): DDL SQL query
- `params` (object, optional): Query parameters
- `database` (string, optional): Database path
#### `bulk_insert`
Insert multiple records in batches.
**Parameters:**
- `table` (string, required): Target table name
- `data` (array, required): Array of objects to insert
- `batch_size` (number, optional): Records per batch (default: 1000)
- `database` (string, optional): Database path
**Example:**
```json
{
"table": "users",
"data": [
{ "name": "John Doe", "email": "john@example.com" },
{ "name": "Jane Smith", "email": "jane@example.com" }
],
"batch_size": 500
}
```
### Transaction Management
#### `begin_transaction`
Start a database transaction with optional savepoint support.
**Parameters:**
- `database` (string, optional): Database path
**Returns:** Transaction ID for tracking
#### `commit_transaction`
Commit the current transaction or release a savepoint.
**Parameters:**
- `database` (string, optional): Database path
#### `rollback_transaction`
Rollback the current transaction or revert to a savepoint.
**Parameters:**
- `database` (string, optional): Database path
### Schema Operations
#### `export_schema`
Export database schema to SQL or JSON format.
**Parameters:**
- `database` (string, optional): Database path
- `format` (string, optional): Output format - "sql" or "json"
(default: "sql")
- `tables` (array, optional): Specific tables to export
**Example:**
```json
{
"format": "json",
"tables": ["users", "orders"]
}
```
#### `import_schema`
Import and execute schema from SQL or JSON.
**Parameters:**
- `database` (string, optional): Database path
- `schema` (string, required): Schema content to import
- `format` (string, optional): Input format - "sql" or "json"
(default: "sql")
### Database Maintenance
#### `backup_database`
Creates a backup copy of a database.
**Parameters:**
- `source_database` (string, optional): Source database path
- `backup_path` (string, optional): Backup file path (auto-generated
if not provided)
#### `vacuum_database`
Optimizes database storage by reclaiming unused space.
**Parameters:**
- `database` (string, optional): Database path
## Safety Guidelines
### Tool Classification
The server automatically classifies tools into safety categories:
1. **✓ SAFE**: Read-only operations (SELECT, PRAGMA, EXPLAIN, database
info, backups)
2. **⚠️ DESTRUCTIVE**: Data modification (INSERT, UPDATE, DELETE, bulk
insert)
3. **⚠️ SCHEMA CHANGE**: Structure modification (CREATE, ALTER, DROP,
schema import)
4. **⚠️ TRANSACTION**: Transaction control (BEGIN, COMMIT, ROLLBACK)
5. **✓ MAINTENANCE**: Optimization operations (VACUUM, connection
management)
### Best Practices
1. **Always use parameterized queries** to prevent SQL injection
2. **Use transactions** for multi-step operations to ensure data
consistency
3. **Review destructive operations** before execution
4. **Create backups** before major schema changes
5. **Use bulk_insert** for inserting large datasets efficiently
6. **Export schemas** before major structural changes
7. **Use appropriate tools** for different operation types
8. **Monitor connection pool** usage in high-traffic scenarios
## Development
### Building
```bash
pnpm run build
```
### Development Mode
```bash
pnpm run dev
```
### Cleaning
```bash
pnpm run clean
```
## Architecture
The server is built with a modular architecture:
### Core Modules
- **`src/index.ts`**: Main server entry point
- **`src/config.ts`**: Configuration management with Valibot
validation
### Database Clients
- **`src/clients/connection-manager.ts`**: Advanced connection pooling
with health monitoring
- **`src/clients/query-executor.ts`**: SQL execution, bulk operations,
and query utilities
- **`src/clients/transaction-manager.ts`**: ACID transaction
management with savepoints
- **`src/clients/schema-manager.ts`**: Schema export/import
functionality
- **`src/clients/sqlite.ts`**: Main SQLite client interface and
utilities
### Tool Handlers
- **`src/tools/handler.ts`**: Tool registration orchestrator
- **`src/tools/admin-tools.ts`**: Database and table management tools
- **`src/tools/query-tools.ts`**: Query execution and bulk operation
tools
- **`src/tools/transaction-tools.ts`**: Transaction management tools
- **`src/tools/schema-tools.ts`**: Schema export/import tools
- **`src/tools/context.ts`**: Database context management
### Common Utilities
- **`src/common/types.ts`**: TypeScript type definitions
- **`src/common/errors.ts`**: Error handling utilities
This modular design provides:
- **Separation of Concerns**: Each module has a single responsibility
- **Maintainability**: Easy to test, debug, and extend individual
components
- **Scalability**: New features can be added without affecting
existing code
- **Type Safety**: Comprehensive TypeScript coverage throughout
## Dependencies
- **[tmcp](https://github.com/modelcontextprotocol/typescript-sdk)**:
Modern TypeScript MCP framework
- **[better-sqlite3](https://github.com/WiseLibs/better-sqlite3)**:
High-performance SQLite driver
- **[valibot](https://valibot.dev/)**: Lightweight validation library
for type-safe inputs
- **[csv-parser](https://github.com/mafintosh/csv-parser)**: CSV
parsing capabilities
- **[csv-writer](https://github.com/ryu1kn/csv-writer)**: CSV export
functionality
### Key Features Provided by Dependencies
- **tmcp**: Streamlined MCP server development with excellent
TypeScript support
- **better-sqlite3**: Synchronous SQLite operations with superior
performance
- **valibot**: Runtime type validation for all tool parameters
- **csv-\***: Future-ready for CSV import/export capabilities
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
## License
MIT License - see the [LICENSE](LICENSE) file for details.
## Acknowledgments
- Built on the
[Model Context Protocol](https://github.com/modelcontextprotocol)
- Inspired by
[mcp-turso-cloud](https://github.com/spences10/mcp-turso-cloud)
- Uses [better-sqlite3](https://github.com/WiseLibs/better-sqlite3)
for high-performance SQLite operations