spences10/mcp-sqlite-tools

GitHub: spences10/mcp-sqlite-tools

一个为 LLM 提供全面 SQLite 数据库操作的 MCP 服务器,通过细粒度的安全分级和事务支持,让 AI 助手安全高效地管理与查询本地数据库。

Stars: 14 | Forks: 4

# mcp-sqlite-tools 一个模型上下文协议 (MCP) 服务器,为 LLM 提供全面的 SQLite 数据库操作功能。该服务器使 AI 助手能够安全高效地与本地 SQLite 数据库进行交互,具备内置安全功能、高级事务支持以及清晰的只读和破坏性操作分离机制。 ## 功能 ### 🗄️ 数据库管理 - **打开/创建数据库**:打开现有数据库或创建新数据库 - **关闭数据库**:正确关闭数据库连接 - **列出数据库**:发现目录中的数据库文件 - **数据库信息**:获取全面的数据库元数据和统计信息 ### 📊 表操作 - **列出表**:查看数据库中的所有表和视图 - **描述表**:获取表的详细 schema 信息 - **创建表**:使用自定义列定义创建新表 - **删除表**:移除表(带有安全警告) ### 🔍 查询操作 - **执行读取查询**:安全的 SELECT、PRAGMA 和 EXPLAIN 查询 - **执行写入查询**:INSERT、UPDATE、DELETE 操作 - **执行 Schema 查询**:DDL 操作 (CREATE, ALTER, DROP) - **批量插入**:高效批量插入多条记录 ### 💾 事务管理 - **开启事务**:启动支持 savepoint 的数据库事务 - **提交事务**:处理嵌套事务的提交更改 - **回滚事务**:安全地回滚更改和嵌套的 savepoint - **自动清理**:自动清理过期的事务 ### 📋 Schema 操作 - **导出 Schema**:将数据库 schema 导出为 SQL 或 JSON 格式 - **导入 Schema**:从 SQL 或 JSON 导入并执行 schema - **选择性导出**:导出特定表或整个数据库结构 ### 🛠️ 数据库维护 - **备份数据库**:创建带有时间戳的数据库备份 - **清理数据库**:优化数据库存储和性能 - **连接池**:带有健康监控的高级连接管理 ## ⚠️ 安全功能 该服务器实现了多层安全机制: - **查询分类**:自动分离只读、写入、schema 和事务操作 - **路径验证**:防止目录遍历攻击 - **可配置的路径限制**:控制对绝对路径的访问 - **输入验证**:使用 Valibot 进行全面的参数验证 - **高级连接池**:连接限制、健康监控和空闲超时 - **事务安全**:自动清理过期事务和嵌套 savepoint 支持 - **资源清理**:服务器关闭时的优雅清理与维护计划 ### 基于安全 Hook 的工具分离 这些工具被有意划分为不同的类别,以便在 Claude Code 等 MCP 客户端中实现细粒度的审批控制: **✓ 安全工具**(只读操作): - `execute_read_query` - SELECT、PRAGMA、EXPLAIN 查询 - `list_tables`、`describe_table`、`database_info` - `export_schema`、`backup_database` 这些工具可以被自动批准或仅批准一次,允许 AI 自由探索您的数据库结构并读取数据。 **⚠️ 破坏性工具**(数据修改): - `execute_write_query` - INSERT、UPDATE、DELETE - `bulk_insert` - 批量插入 - `import_csv` - CSV 数据导入 - `drop_table` - 永久删除表 这些工具应在每次操作时单独审批,让您能在数据被修改之前了解将要发生的更改。 **⚠️ SCHEMA 更改工具**(结构修改): - `execute_schema_query` - CREATE、ALTER、DROP 语句 - `create_table` - 创建表 - `import_schema` - 导入 schema - `import_csv` - 可以从 CSV 头创建缺失的表 这些工具会修改数据库结构,应要求单独批准以防止意外的 schema 更改。 **⚠️ 文件写入工具**: - `export_csv` - 写入 CSV 文件,包括绝对路径 **🔒 事务工具**: - `begin_transaction`、`commit_transaction`、`rollback_transaction` 可以根据您的工作流需求进行配置。 **Claude Code Hook 配置示例:** ``` // In your Claude Code hooks export function toolApproval(tool) { // Auto-approve safe read operations if ( tool.name.includes('read') || tool.name.includes('list') || tool.name.includes('describe') || tool.name.includes('export') || tool.name.includes('backup') || tool.name.includes('info') ) { return 'auto-approve'; } // Require approval for destructive operations if ( tool.name.includes('write') || tool.name.includes('delete') || tool.name.includes('drop') || tool.name.includes('insert') || tool.name.includes('schema') ) { return 'require-approval'; } return 'require-approval'; // Default to safe } ``` 这种分离确保您能保持对破坏性操作的控制,同时允许 AI 高效地执行只读查询。 ## 安装 ### 从 npm 安装(发布后) ``` npm install -g mcp-sqlite-tools ``` ### 从源码安装 ``` git clone cd mcp-sqlite-tools pnpm install pnpm run build ``` ## 配置 ### 环境变量 可以使用环境变量来配置服务器: ``` # SQLite 数据库的默认目录(相对于项目根目录) SQLITE_DEFAULT_PATH=. # 允许数据库文件的绝对路径(安全设置) SQLITE_ALLOW_ABSOLUTE_PATHS=true # SQLite 锁忙超时时间(以毫秒为单位,非挂钟查询运行时间) SQLITE_BUSY_TIMEOUT=30000 # 数据库备份的默认备份目录 SQLITE_BACKUP_PATH=./backups # 启用调试日志 DEBUG=false ``` ### MCP 客户端配置 #### 选项 1:全局用户配置(推荐) 在您的 VS Code 用户设置中配置一次,即可在所有工作区中使用。请将其添加到您的全局 `mcp.json` 文件中(Windows 上为 `%APPDATA%\Code\User\mcp.json`): 对于 VS Code 全局配置,请编辑 `~/.config/Code/User/mcp.json`(或 Windows 上的对应位置): ``` { "servers": { "sqlite-tools": { "command": "npx", "args": ["-y", "mcp-sqlite-tools"] } } } ``` **对于 WSL 用户**,请在您的全局配置中使用以下格式: ``` { "servers": { "sqlite-tools": { "command": "wsl.exe", "args": ["bash", "-c", "npx -y mcp-sqlite-tools"] } } } ``` **优点:** - ✅ **一次配置,到处适用** - 无需为每个项目单独设置 - 📁 **自动使用当前工作区** - 无论您打开哪个项目,都在其中创建数据库 - 🔄 **始终保持最新** - 通过 npx 使用最新发布的版本 #### 选项 2:工作区特定配置 对于希望通过版本控制共享数据库配置的团队,请在您的工作区中创建一个 `.vscode/mcp.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" } } } } ``` **优点:** - ✅ **团队共享** - 将配置提交到版本控制 - 📂 **有组织的结构** - 数据库位于专门的 `/databases` 文件夹中 - 🛡️ **项目隔离** - 每个项目都有自己的数据库配置 #### Claude Desktop / Cline 配置 将以下内容添加到您的 MCP 客户端配置中: ``` { "mcpServers": { "mcp-sqlite-tools": { "command": "npx", "args": ["-y", "mcp-sqlite-tools"], "env": { "SQLITE_DEFAULT_PATH": ".", "SQLITE_ALLOW_ABSOLUTE_PATHS": "true", "SQLITE_BUSY_TIMEOUT": "30000", "SQLITE_BACKUP_PATH": "./backups" } } } } ``` ### 环境变量 可以使用以下环境变量来配置 MCP 服务器: | 变量 | 描述 | 默认值 | 示例 | | ----------------------------- | ---------------------------------------- | ----------------------------- | ------------------------------ | | `SQLITE_DEFAULT_PATH` | 数据库文件的默认目录 | `.` | `${workspaceFolder}/databases` | | `SQLITE_ALLOW_ABSOLUTE_PATHS` | 在数据库操作中允许使用绝对路径 | `true` | `false` | | `SQLITE_BACKUP_PATH` | 数据库备份的默认目录 | 与 `SQLITE_DEFAULT_PATH` 相同 | `./backups` | | `SQLITE_BUSY_TIMEOUT` | SQLite 锁定忙碌超时时间(毫秒) | `30000` | `60000` | `SQLITE_MAX_QUERY_TIME` 仍作为 `SQLITE_BUSY_TIMEOUT` 的已弃用别名被接受;它并不是一个实际运行时间的查询限制。 **路径解析:** - 相对路径将从默认路径开始解析 - 在 VS Code 中使用 `${workspaceFolder}` 设置相对于工作区的路径 - 设置 `SQLITE_ALLOW_ABSOLUTE_PATHS=true` 以启用绝对路径操作 #### 开发配置 使用 MCP inspector 进行开发: ``` pnpm run build pnpm run dev ``` ## API 参考 ### 数据库管理工具 #### `open_database` 打开或创建一个 SQLite 数据库文件。 **参数:** - `path` (字符串,必填):数据库文件的路径 - `create` (布尔值,可选):如果不存在则创建(默认:true) **示例:** ``` { "path": "my-app.db", "create": true } ``` #### `close_database` 关闭数据库连接。 **参数:** - `database` (字符串,可选):要关闭的数据库路径 #### `list_databases` 列出目录中可用的数据库文件。 **参数:** - `directory` (字符串,可选):要搜索的目录 #### `database_info` 获取有关数据库的综合信息。 **参数:** - `database` (字符串,可选):数据库路径 ### 表操作 #### `list_tables` 列出数据库中的所有表和视图。 **参数:** - `database` (字符串,可选):数据库路径 #### `describe_table` 获取表的 schema 信息。 **参数:** - `table` (字符串,必填):表名 - `database` (字符串,可选):数据库路径 - `verbosity` (字符串,可选):'summary' 或 'detailed'(默认:'detailed') **请求示例:** ``` { "table": "users", "verbosity": "detailed" } ``` **响应示例:** ``` { "database": "/tmp/demo.db", "table": "users", "columns": [ { "name": "id", "type": "INTEGER", "nullable": true, "default_value": null, "primary_key": true }, { "name": "name", "type": "TEXT", "nullable": false, "default_value": null, "primary_key": false }, { "name": "email", "type": "TEXT", "nullable": true, "default_value": null, "primary_key": false }, { "name": "created_at", "type": "TIMESTAMP", "nullable": true, "default_value": "CURRENT_TIMESTAMP", "primary_key": false } ], "verbosity": "detailed", "column_count": 4 } ``` #### `create_table` 创建具有指定列的新表。 **参数:** - `name` (字符串,必填):表名 - `columns` (数组,必填):列定义 - `database` (字符串,可选):数据库路径 **列定义:** ``` { "name": "column_name", "type": "TEXT|INTEGER|REAL|BLOB", "nullable": true, "primary_key": false, "default_value": null } ``` **示例:** ``` { "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` 永久删除一个表及其所有数据。 **参数:** - `table` (字符串,必填):要删除的表名 - `database` (字符串,可选):数据库路径 ### 查询操作 #### `execute_read_query` 执行只读 SQL 查询(SELECT、PRAGMA、EXPLAIN)。 **参数:** - `query` (字符串,必填):SQL 查询 - `params` (对象,可选):查询参数 - `database` (字符串,可选):数据库路径 - `limit` (数字,可选):返回的最大行数(默认:10000) - `offset` (数字,可选):要跳过的行数(默认:0) - `verbosity` (字符串,可选):'summary' 或 'detailed'(默认:'detailed') **请求示例:** ``` { "query": "SELECT * FROM users ORDER BY id", "verbosity": "detailed" } ``` **响应示例:** ``` { "database": "/tmp/demo.db", "query": "SELECT * FROM users ORDER BY id LIMIT 10000", "result": { "rows": [ { "id": 1, "name": "Alice Johnson", "email": "alice@example.com", "created_at": "2025-10-03 09:42:04" }, { "id": 3, "name": "Carol White", "email": "carol@example.com", "created_at": "2025-10-03 09:42:10" } ], "changes": 0, "last_insert_rowid": 0 }, "row_count": 2, "pagination": { "limit": 10000, "offset": 0, "returned_count": 2, "has_more": false }, "verbosity": "detailed" } ``` #### `execute_write_query` 执行修改数据的 SQL (INSERT、UPDATE、DELETE)。 **参数:** - `query` (字符串,必填):SQL 查询 - `params` (对象,可选):查询参数 - `database` (字符串,可选):数据库路径 **请求示例:** ``` { "query": "INSERT INTO users (name, email) VALUES ('Alice Smith', 'alice@example.com')" } ``` **响应示例:** ``` { "database": "/tmp/demo.db", "query": "INSERT INTO users (name, email) VALUES ('Alice Smith', 'alice@example.com')", "result": { "rows": [], "changes": 1, "last_insert_rowid": 1 }, "message": "⚠️ DESTRUCTIVE OPERATION COMPLETED: Data modified in database '/tmp/demo.db'. Rows affected: 1" } ``` #### `execute_schema_query` 执行 DDL 查询(CREATE、ALTER、DROP)。 **参数:** - `query` (字符串,必填):DDL SQL 查询 - `params` (对象,可选):查询参数 - `database` (字符串,可选):数据库路径 **请求示例:** ``` { "query": "CREATE TABLE users (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL,\n email TEXT UNIQUE,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n)" } ``` **响应示例:** ``` { "database": "/tmp/demo.db", "query": "CREATE TABLE users (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n name TEXT NOT NULL,\n email TEXT UNIQUE,\n created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n)", "result": { "rows": [], "changes": 0, "last_insert_rowid": 0 }, "message": "⚠️ SCHEMA CHANGE COMPLETED: Database structure modified in '/tmp/demo.db'. Changes: 0" } ``` #### `bulk_insert` 批量插入多条记录。 **参数:** - `table` (字符串,必填):目标表名 - `data` (数组,必填):要插入的对象数组 - `batch_size` (数字,可选):每批记录数(默认:1000) - `database` (字符串,可选):数据库路径 **请求示例:** ``` { "table": "users", "data": [ { "name": "David Lee", "email": "david@example.com" }, { "name": "Emma Davis", "email": "emma@example.com" }, { "name": "Frank Miller", "email": "frank@example.com" } ] } ``` **响应示例:** ``` { "success": true, "database": "/tmp/demo.db", "table": "users", "inserted": 3, "batches": 1, "total_time": 0, "message": "⚠️ DESTRUCTIVE OPERATION COMPLETED: 3 records inserted into table 'users' in database '/tmp/demo.db'" } ``` ### CSV 操作 #### `import_csv` 将带有表头的 CSV 文件导入到表中。如果表不存在,将根据 CSV 头和推断出的 SQLite 列类型创建该表。默认情况下会对值进行强制转换(`""`/`null` 转换为 NULL,数字转换为数字,布尔值转换为 1/0)。除非 `fail_fast` 为 true,否则将报告行级插入错误并继续插入成功的行。 **参数:** - `table` (字符串,必填):目标表名 - `file_path` (字符串,必填):CSV 文件路径;允许绝对路径 - `database_name` (字符串,可选):数据库路径或当前上下文名称 - `create_table` (布尔值,可选):创建缺失的表(默认:true) - `batch_size` (数字,可选):每批的行数(默认:1000) - `fail_fast` (布尔值,可选):在遇到第一行错误时停止(默认:false) - `max_errors` (数字,可选):返回的最大行错误数(默认:100) - `coerce_types` (布尔值,可选):强制转换 CSV 字符串(默认:true) - `delimiter`、`quote`、`escape`、`encoding` (可选):CSV 解析选项 #### `export_csv` 将整个表或只读查询结果导出为 CSV。需提供 `table` 或 `query` 中的恰好一个。 **参数:** - `file_path` (字符串,必填):输出 CSV 路径;允许绝对路径 - `table` (字符串,可选):要导出的表 - `query` (字符串,可选):要导出的只读查询 - `database_name` (字符串,可选):数据库路径或当前上下文名称 - `delimiter`、`record_delimiter`、`encoding` (可选):CSV 输出选项 - `always_quote` (布尔值,可选):引用每个字段(默认:false) - `append` (布尔值,可选):追加到现有文件(默认:false) ### 事务管理 #### `begin_transaction` 启动支持可选 savepoint 的数据库事务。 **参数:** - `database` (字符串,可选):数据库路径 **返回:** 用于跟踪的事务 ID #### `commit_transaction` 提交当前事务或释放 savepoint**参数:** - `database` (字符串,可选):数据库路径 #### `rollback_transaction` 回滚当前事务或还原到 savepoint。 **参数:** - `database` (字符串,可选):数据库路径 ### Schema 操作 #### `export_schema` 将数据库 schema 导出为 SQL 或 JSON 格式。 **参数:** - `database` (字符串,可选):数据库路径 - `format` (字符串,可选):输出格式 - "sql" 或 "json"(默认:"sql") - `tables` (数组,可选):要导出的特定表 **示例:** ``` { "format": "json", "tables": ["users", "orders"] } ``` #### `import_schema` 从 SQL 或 JSON 导入并执行 schema。 **参数:** - `database` (字符串,可选):数据库路径 - `schema` (字符串,必填):要导入的 schema 内容 - `format` (字符串,可选):输入格式 - "sql" 或 "json"(默认:"sql") ### 数据库维护 #### `backup_database` 使用 SQLite 的在线备份 API 创建一致的 SQLite 备份,包括可能仍在 WAL 文件中的已提交数据。 **参数:** - `source_database` (字符串,可选):源数据库路径 - `backup_path` (字符串,可选):备份文件路径(如果未提供则自动生成) #### `vacuum_database` 通过回收未使用的空间来优化数据库存储。 **参数:** - `database` (字符串,可选):数据库路径 ## 安全准则 ### 工具分类 服务器会自动将工具划分为以下安全类别: 1. **✓ 安全**:只读操作(SELECT、PRAGMA、EXPLAIN、数据库信息、备份) 2. **⚠️ 破坏性**:数据修改(INSERT、UPDATE、DELETE、批量插入、CSV 导入) 3. **⚠️ SCHEMA 更改**:结构修改(CREATE、ALTER、DROP、schema 导入、CSV 表创建) 4. **⚠️ 文件写入**:写入文件的导出操作,包括绝对 CSV 路径 5. **⚠️ 事务**:事务控制(BEGIN、COMMIT、ROLLBACK) 6. **✓ 维护**:优化操作(VACUUM、连接管理) ### 最佳实践 1. **始终使用参数化查询**以防止 SQL 注入 2. **在多步操作中使用事务**以确保数据一致性 3. 在执行前**检查破坏性操作** 4. 在进行重大 schema 更改前**创建备份** 5. **使用 bulk_insert** 高效插入大型数据集 6. 在执行导入/导出文件操作前**检查 CSV 绝对路径** 7. 在进行重大结构更改前**导出 schema** 8. 为不同操作类型**使用合适的工具** 9. 在高流量场景中**监控连接池**使用情况 ## 开发 ### 构建 ``` pnpm run build ``` ### 开发模式 ``` pnpm run dev ``` ### 清理 ``` pnpm run clean ``` ## 架构 该服务器采用模块化架构构建: ### 核心模块 - **`src/index.ts`**:主服务器入口点 - **`src/config.ts`**:使用 Valibot 验证的配置管理 ### 数据库客户端 - **`src/clients/connection-manager.ts`**:带有健康监控的高级连接池 - **`src/clients/query-executor.ts`**:SQL 执行、批量操作和查询工具 - **`src/clients/transaction-manager.ts`**:带有 savepoint 的 ACID 事务管理 - **`src/clients/schema-manager.ts`**:Schema 导出/导入功能 - **`src/clients/sqlite.ts`**:主 SQLite 客户端接口和工具 ### 工具处理器 - **`src/tools/handler.ts`**:工具注册编排器 - **`src/tools/admin-tools.ts`**:数据库和表管理工具 - **`src/tools/query-tools.ts`**:查询执行和批量操作工具 - **`src/tools/transaction-tools.ts`**:事务管理工具 - **`src/tools/schema-tools.ts`**:Schema 导出/导入工具 - **`src/tools/csv-tools.ts`**:CSV 导入/导出工具 - **`src/tools/context.ts`**:数据库上下文管理 ### 通用工具 - **`src/common/types.ts`**:TypeScript 类型定义 - **`src/common/errors.ts`**:错误处理工具 - **`src/common/sql.ts`**:SQL 标识符和字面量辅助工具 - **`src/common/schema-sql.ts`**:SQLite schema 语句解析 这种模块化设计提供: - **关注点分离**:每个模块都有单一的职责 - **可维护性**:易于测试、调试和扩展单个组件 - **可扩展性**:可以在不影响现有代码的情况下添加新功能 - **类型安全**:全面的 TypeScript 覆盖 ## 依赖项 - **[tmcp](https://github.com/paoloricciuti/tmcp)**:现代 TypeScript MCP 框架 - **[better-sqlite3](https://github.com/WiseLibs/better-sqlite3)**:高性能 SQLite 驱动 - **[valibot](https://valibot.dev/)**:用于类型安全输入的轻量级验证库 - **[csv-parser](https://github.com/mafintosh/csv-parser)**:CSV 导入解析 - **[csv-writer](https://github.com/ryu1kn/csv-writer)**:CSV 导出写入 ### 依赖项提供的关键特性 - **tmcp**:简化的 MCP 服务器开发,提供出色的 TypeScript 支持 - **better-sqlite3**:同步的 SQLite 操作,具有卓越的性能 - **valibot**:对所有工具参数进行运行时类型验证 - **csv-\***:带有类型强制转换和行级导入错误报告的带表头 CSV 导入/导出功能 ## 贡献 欢迎贡献!请随时提交 Pull Request。 ## 许可证 MIT License - 详见 [LICENSE](LICENSE) 文件。 ## 致谢 - 基于模型上下文协议构建 - 灵感来源于 [mcp-turso-cloud](https://github.com/spences10/mcp-turso-cloud) - 使用 [better-sqlite3](https://github.com/WiseLibs/better-sqlite3) 进行高性能 SQLite 操作
标签:AI助手, DLL 劫持, LLM工具, MCP, MCP服务器, MITM代理, RAG, Schema管理, SOC Prime, SQLite, 事务管理, 只读操作, 大语言模型, 威胁情报, 开发工具, 开发者工具, 数据交互, 数据导入导出, 数据库备份, 数据库操作, 数据库管理, 数据库维护, 数据清洗, 本地数据库, 模型上下文协议, 自动化攻击, 连接池