加密SQLite MCP服务器
用于加密SQLite数据库的MCP服务器
一种模型上下文协议(MCP)服务器,用于使用SQLCipher处理加密的SQLite数据库。该服务器提供工具来读取数据库结构、查询表,并对加密的SQLite数据库执行CRUD操作。
与所有MCP客户端兼容 (光标、克劳德桌面和其他)。
适用于以下来源的加密数据库: MoneyMoney、1Password、Signal、WhatsApp、Firefox、Telegram、KeePass和其他使用SQLCipher加密的应用程序。
特性
- 加密SQLite支持:适用于SQLCipher 4加密数据库-此MCP服务器的关键区别
- 加密密码:支持与macOS Keychain集成的AES-256-GCM加密密码
- 数据库探索:列出表、列、索引和架构元数据
- 查询支持:执行任意SQL查询(SELECT、INSERT、UPDATE、DELETE、DDL)
- CRUD操作:使用筛选插入、更新和删除行
- 可配置的密码配置文件:支持不同的SQLCipher配置
- MCP协议:通过STDIO实现完整的模型上下文协议
- 安全:SQL标识符验证以防止SQL注入
- 调试模式:可选的调试输出通过
MCP_DEBUG环境变量 - 输入验证:对限制、偏移和标识符进行全面验证
为什么加密SQLite?
许多流行的应用程序使用加密的SQLite数据库(SQLCipher)来保护敏感数据。此MCP服务器是专门为处理这些加密数据库而设计的。
使用加密SQLite数据库的应用程序
- MoneyMoney (macOS):带有加密本地数据库的财务管理应用程序
- 1密码:使用SQLCipher进行本地vault存储的密码管理器
- 信号:带有SQLCipher保护的消息数据库的加密消息应用程序
- WhatsApp:使用加密SQLite进行本地消息存储的消息应用程序
- 火狐:使用SQLCipher加密登录数据库的浏览器
- 电报:具有加密本地数据库存储的消息应用程序
- KeePass:支持加密SQLite数据库文件的密码管理器
如果您需要访问这些应用程序或其他SQLCipher加密数据库中的数据,此MCP服务器提供了您需要的工具。请注意,您需要加密数据库的密码。
需求
- Java 21 或更高版本(JDK)
- Gradle (包括包装)
- 支持加密的SQLite JDBC驱动程序(
sqlite-jdbc-3.50.1.0.jar从 sqlite-jdbc加密)
快速开始
光标(一键安装)
在Cursor中安装此MCP服务器的最简单方法是通过 光标MCP存储:
- 访问 cursor.store/mcp/rosch100/mcp-隐式sqlite
- 点击 “添加到光标”
- 按照提示配置数据库路径和密码
其他MCP客户端
此服务器可与任何兼容MCP的客户端配合使用。请参阅 配置 下面的部分了解设置说明。
安装
Docker(推荐)
使用GitHub容器注册表中的预构建Docker镜像:
docker pull ghcr.io/rosch100/mcp-encrypted-sqlite:latest
快速入门: 看 用于Docker桌面设置。
详细配置: 看 高级选项。
来源
- 克隆存储库:
git clone https://github.com/rosch100/mcp-encrypted-sqlite.git
cd mcp-encrypted-sqlite
- 构建项目:
./gradlew build installDist
构建过程将自动下载 sqlite-jdbc-3.50.1.0.jar 从 sqlite-jdbc-crypt发布 并将其放置在 libs/ 目录。
可执行文件将在以下网址提供 build/install/mcp-encrypted-sqlite/bin/mcp-encrypted-sqlite.
配置
此MCP服务器与 任何兼容MCP的客户端 (光标、克劳德桌面等)。配置格式如下 模型上下文协议规范.
服务器通过STDIO(标准输入/输出)进行通信。将以下配置添加到MCP客户端的配置文件中:
配置文件位置:
- 光标:
~/.cursor/mcp.json - 克劳德桌面版 (macOS):
~/Library/Application Support/Claude/claude_desktop_config.json - 克劳德桌面版 (Windows):
%APPDATA%\Claude\claude_desktop_config.json - 其他客户:请参阅客户的文件
{
"mcpServers": {
"encrypted-sqlite": {
"command": "/path/to/mcp-encrypted-sqlite/build/install/mcp-encrypted-sqlite/bin/mcp-encrypted-sqlite",
"args": [
"--args",
"{\"db_path\":\"/path/to/your/database.sqlite\",\"passphrase\":\"your-passphrase\"}"
]
}
}
}可选参数:
transport:默认为"stdio"(可省略)cwd:使用绝对路径时不需要(可以省略)env:仅当Java不在系统PATH中或用于自定义Java安装时才需要:
{
"mcpServers": {
"encrypted-sqlite": {
"command": "/path/to/mcp-encrypted-sqlite/build/install/mcp-encrypted-sqlite/bin/mcp-encrypted-sqlite",
"args": [
"--args",
"{\"db_path\":\"/path/to/your/database.sqlite\",\"passphrase\":\"your-passphrase\"}"
],
"env": {
"JAVA_HOME": "/path/to/java/home"
}
}
}
}Docker配置
普通短语
{
"mcpServers": {
"encrypted-sqlite": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-v", "/path/to/your/database.sqlite:/data/database.sqlite:ro",
"ghcr.io/rosch100/mcp-encrypted-sqlite:latest",
"--args",
"{\"db_path\":\"/data/database.sqlite\",\"passphrase\":\"your-passphrase\"}"
]
}
}
}加密密码短语(推荐)
使用加密密码时,您 必须 将加密密钥作为环境变量传递:
{
"mcpServers": {
"encrypted-sqlite": {
"command": "docker",
"args": [
"run", "--rm", "-i",
"-e", "MCP_SQLITE_ENCRYPTION_KEY=your-encryption-key",
"-v", "/path/to/your/database.sqlite:/data/database.sqlite:ro",
"ghcr.io/rosch100/mcp-encrypted-sqlite:latest",
"--args",
"{\"db_path\":\"/data/database.sqlite\",\"passphrase\":\"encrypted:your-encrypted-passphrase\"}"
]
}
}
}重要提示:
- 这
-e旗帜 必须 来之前-v旗帜 - macOS Keychain无法从Docker容器访问 -显式传递加密密钥
- 获取您的加密密钥:
security find-generic-password -s "mcp-encrypted-sqlite" -a "encryption-key" -w - 数据库文件以只读方式装载(
:ro)默认情况下。移除:ro如果您需要写访问权限
安全警告: 将加密密钥和加密密码以纯文本形式存储在配置文件中存在安全风险。看 安全的替代品。
自定义密码配置文件
通过包含以下内容来覆盖默认的SQLCipher 4设置 cipherProfile 在配置JSON中:
{
"mcpServers": {
"encrypted-sqlite": {
"command": "/path/to/mcp-encrypted-sqlite/build/install/mcp-encrypted-sqlite/bin/mcp-encrypted-sqlite",
"args": [
"--args",
"{\"db_path\":\"/path/to/your/database.sqlite\",\"passphrase\":\"your-passphrase\",\"cipherProfile\":{\"name\":\"SQLCipher 4 defaults\",\"pageSize\":4096,\"kdfIterations\":256000,\"hmacAlgorithm\":\"HMAC_SHA512\",\"kdfAlgorithm\":\"PBKDF2_HMAC_SHA512\"}}"
]
}
}
}注: 所有字段 cipherProfile 是可选的-仅指定要从默认值覆盖的选项。您还可以指定 cipherProfile 在单独的工具调用中,建议在MCP服务器配置中配置一次,以保持一致性。
加密密码
为了增强安全性,您可以以加密形式存储密码。服务器使用 AES-256-GCM 加密,它提供经过身份验证的加密,既安全又快速。
macOS钥匙串(建议用于macOS)
- 在Keychain中生成并存储密钥:
运行: ./store-key-in-keychain.sh --generate
- 加密您的密码:
运行: ./encrypt-passphrase.sh "your-plain-passphrase"
当没有设置环境变量时,密钥会自动从Keychain加载。
优点:
- 密钥由macOS安全加密和存储
- 不需要环境变量
- 使用macOS用户密码自动解锁
- 适用于所有应用程序的全系统
环境变量(跨平台)
- 生成加密密钥:
运行: java -cp build/libs/mcp-encrypted-sqlite-VERSION.jar com.example.mcp.sqlite.config.PassphraseEncryption
- 设置加密密钥:
运行: export MCP_SQLITE_ENCRYPTION_KEY=""
- 加密您的密码:
运行: java -cp build/libs/mcp-encrypted-sqlite-VERSION.jar com.example.mcp.sqlite.util.EncryptPassphrase "your-plain-passphrase"
用法
使用加密密码(带 encrypted: 前缀)在您的配置中:
在macOS上使用Keychain(推荐):
{
"mcpServers": {
"encrypted-sqlite": {
"command": "/path/to/mcp-encrypted-sqlite/build/install/mcp-encrypted-sqlite/bin/mcp-encrypted-sqlite",
"args": [
"--args",
"{\"db_path\":\"/path/to/your/database.sqlite\",\"passphrase\":\"encrypted:\"}"
]
}
}
}*注:否 env 需要部分-密钥会自动从macOS Keychain加载。*
具有环境变量(跨平台):
{
"mcpServers": {
"encrypted-sqlite": {
"command": "/path/to/mcp-encrypted-sqlite/build/install/mcp-encrypted-sqlite/bin/mcp-encrypted-sqlite",
"args": [
"--args",
"{\"db_path\":\"/path/to/your/database.sqlite\",\"passphrase\":\"encrypted:\"}"
],
"env": {
"MCP_SQLITE_ENCRYPTION_KEY": ""
}
}
}
}重要安全注意事项:
- 加密密钥 必须 可用(macOS钥匙扣或
MCP_SQLITE_ENCRYPTION_KEY环境变量) - 服务器会自动检测加密密码(以开头
encrypted:)并解密它们 - 使用
PassphraseEncryption.generateKey()生成强密钥(256位/32字节) - AES-256-GCM 提供经过身份验证的加密
- 弱密钥会被自动拒绝
可用工具
list_tables
列出数据库中的所有表。默认情况下,只有表名 include_columns=true 还有列详细信息。
参数:
db_path(如果已配置,则可选):数据库文件的路径passphrase(如果已配置,则可选):数据库密码include_columns(可选,默认值:false):如果为true,还将返回列详细信息
例子:
{
"name": "list_tables",
"arguments": {
"include_columns": true
}
}get_table_data
通过可选的筛选、列选择和分页从表中读取数据。
参数:
table(必填):表名columns(可选):要选择的列名数组filters(可选):具有用于筛选的列值对的对象limit(可选,默认值:200):最大行数offset(可选,默认值:0):分页偏移量
例子:
{
"name": "get_table_data",
"arguments": {
"table": "accounts",
"columns": ["id", "name", "balance"],
"filters": {"status": "active"},
"limit": 50,
"offset": 0
}
}execute_sql
执行任意SQL语句(SELECT、INSERT、UPDATE、DELETE、DDL)。
安全警告:此工具在不进行参数化的情况下执行原始SQL。仅与受信任的SQL一起使用,或在调用此工具之前确保执行了适当的验证和清理。为了更安全的操作,请使用其他工具(get_table_data, insert_or_update, delete_rows)其使用参数化查询。
参数:
sql(必需):要执行的SQL语句
例子:
{
"name": "execute_sql",
"arguments": {
"sql": "SELECT COUNT(*) FROM transactions WHERE amount > 1000"
}
}insert_or_update
执行UPSERT操作(冲突时执行INSERT或UPDATE)。
参数:
table(必填):表名primary_keys(必填):主键列名数组rows(必需):要插入/更新的行对象数组
例子:
{
"name": "insert_or_update",
"arguments": {
"table": "accounts",
"primary_keys": ["id"],
"rows": [
{"id": 1, "name": "Account 1", "balance": 1000.0},
{"id": 2, "name": "Account 2", "balance": 2000.0}
]
}
}delete_rows
根据筛选器从表中删除行。
参数:
table(必填):表名filters(必填):具有用于筛选的列值对的对象
例子:
{
"name": "delete_rows",
"arguments": {
"table": "transactions",
"filters": {"status": "cancelled"}
}
}get_table_schema
检索表的详细架构信息(列、索引、外键、约束)。
参数:
table(必填):表名
例子:
{
"name": "get_table_schema",
"arguments": {
"table": "accounts"
}
}list_indexes
列出表的所有索引。
参数:
table(必填):表名
例子:
{
"name": "list_indexes",
"arguments": {
"table": "accounts"
}
}调试模式
服务器支持通过以下方式进行可选的调试输出 MCP_DEBUG 环境变量。启用后,详细的调试信息将写入 stderr (不是 stdout,以符合MCP协议要求)。
启用调试模式:
{
"mcpServers": {
"encrypted-sqlite": {
"command": "/path/to/mcp-encrypted-sqlite/build/install/mcp-encrypted-sqlite/bin/mcp-encrypted-sqlite",
"args": [
"--args",
"{\"db_path\":\"/path/to/your/database.sqlite\",\"passphrase\":\"your-passphrase\"}"
],
"env": {
"MCP_DEBUG": "true"
}
}
}
}调试输出包括:
- 服务器启动信息(Java版本、操作系统、参数)
- 配置解析详细信息
- 请求处理信息
- 响应大小和结构
- 数据库连接详细信息
注: 默认情况下禁用调试输出以保持日志干净。仅在排除问题时启用它。
默认密码配置文件
服务器使用 SQLCipher 4默认值 默认情况下:
cipher_page_size: 4096kdf_iter: 256000cipher_hmac_algorithm:HMAC_SHA512cipher_kdf_algorithm:PBKDF2_HMAC_SHA512cipher_use_hmac:ONcipher_plaintext_header_size: 0
这些设置与SQLCipher 4中的“DB Browser for SQLite”等工具使用的默认值相匹配。
发展
看 Developpent.md 用于开发设置、构建、测试和项目结构。
安全考虑
一般安全
- 密码短语:密码只存储在内存中,从不记录
- 加密密码:使用AES-256-GCM加密的密码将密码存储在配置文件中(请参阅 加密密码 部分)
- 记忆:请注意,解密后的密码以Java字符串(不可变)的形式保留在内存中。为了获得最大的安全性,请考虑使用
char[]数组,尽管目前尚未实现。 - 运输:远程访问服务器时使用安全传输通道(例如加密会话)
- 文件权限:确保数据库文件具有适当的文件系统权限
安全最佳实践
- 使用加密密码 采用AES-256-GCM加密
- 生成强密钥 使用
PassphraseEncryption.generateKey()(256位/32字节) - 安全地存储加密密钥:使用macOS钥匙链(建议在macOS上使用)或安全的秘密存储
- 切勿将加密密钥和加密密码存储在同一配置文件中 -使用包装器脚本或环境变量安全地加载密钥(请参阅 详情)
- 定期旋转按键 -轮换时,使用新密钥重新加密所有密码
- 使用不同的按键 适用于不同的环境(开发、暂存、生产)
- 从不提交密钥或加密密码 到版本控制
- 限制文件权限 关于包含机密的配置文件(
chmod 600)
故障排除
调试MCP服务器通信问题
MCP服务器包括广泛的调试功能,以帮助诊断通信问题。
查看日志
在MCP客户端中:
- 检查客户的日志输出(例如,光标:输出面板→ “MCP日志”)
- 所有调试输出都写入
stderr
手动测试: 运行: ./build/install/mcp-encrypted-sqlite/bin/mcp-encrypted-sqlite --args '{"db_path":"/path/to/db.sqlite","passphrase":"secret"}' 2>&1 | tee mcp-debug.log
常见沟通问题
1.服务器未启动
- 症状:没有可见的日志,服务器没有响应
- 调试:检查启动日志:
- Java版本已记录 - 参数已记录 - 配置解析已记录
- 解决方案:
- 验证Java是否已正确安装 - 检查MCP配置(mcp.json) - 检查路径 command 和 args 字段
2.JSON解析错误
- 症状:日志中的“解析错误”
- 调试:服务器记录:
- 接收到的JSON的前500个字符 - 堆栈跟踪完全异常
- 解决方案:
- 检查MCP配置中的JSON结构 - 确保JSON正确转义 - 验证所有必填字段是否存在
3.答案缺失或不正确
- 症状:请求未得到答复或发生超时
- 调试:服务器记录:
- 每个收到的请求都有ID和方法 - 响应大小和状态 - 写入后刷新状态
- 解决方案:
- 检查是否 STDOUT 可用(启动时记录) - 检查响应大小(非常大的响应可能会导致问题) - 验证冲洗是否成功
4.无效请求
- 症状:“无效请求”错误
- 调试:服务器记录:
- 缺少字段(例如。, method, id) - JSON-RPC版本不匹配 - 无效参数
- 解决方案:
- 确保所有请求符合JSON-RPC 2.0标准 - 验证 method 和 id 字段存在 - 检查参数结构
5.数据库连接问题
- 症状:“数据库错误”错误
- 调试:服务器记录:
- 已使用的数据库路径(默认与覆盖) - 密码状态(加密/解密) - 密码配置文件配置
- 解决方案:
- 检查日志中的数据库路径 - 验证密码是否正确解密 - 检查密码配置文件设置
调试功能详解
服务器会自动记录:
- 启动信息:
- Java版本和Java主页 - 操作系统信息 - 论点的数量和内容 - 配置解析状态
- 请求处理:
- 每个收到的请求都有编号和长度 - JSON-RPC验证 - 带参数的方法调用 - 响应大小和状态
- 错误处理:
- 带有堆栈跟踪的详细异常信息 - JSON-RPC错误代码符合规范 - 带有额外调试数据的错误响应
- 数据库操作:
- 已使用的配置(默认与覆盖) - SQL查询(前100个字符) - 结果大小和受影响的行
无法打开数据库
- 验证密码是否正确
- 检查数据库是否使用SQLCipher 4默认值(或配置自定义密码配置文件)
- 确保数据库文件路径正确且可访问
- 检查日志:服务器记录有关密码解密和数据库路径的详细信息
连接问题
- 验证Java是否已安装:
java -version - 检查一下
JAVA_HOME在MCP配置中设置正确 - 查看MCP客户端日志以了解详细的错误消息
FTS(全文搜索)表
服务器自动处理可能没有可访问元数据的FTS虚拟表。这些表将显示空列列表。
许可证
根据Apache许可证2.0版授权。看 许可证 了解详情。
第三方许可证
- sqlite-jdbc加密 (Apache许可证2.0)-支持加密的SQLite JDBC驱动程序
- 来源:https://github.com/Willena/sqlite-jdbc-crypt
- Gson (Apache许可证2.0)-Java JSON库
- 来源:https://github.com/google/gson
- 朱庇特 (Eclipse公共许可证2.0)-测试框架
- 来源:https://junit.org/junit5/
看 通知 获取详细的归因信息。
致谢
- sqlite-jdbc加密 -支持加密的SQLite JDBC驱动程序
- 模型上下文协议 -MCP规范
贡献
欢迎投稿!请随时提交拉取请求。看 贡献.md 作为指导方针。
支持
对于问题、疑问或贡献,请在 .
给我买杯咖啡
像这样的整合?请给我买杯咖啡!你的支持帮助我继续开发很酷的功能。

