safeselect
SafeSelect MCP
代理可以查看,但不能修改。
面向 AI 编码代理的、故障关闭、只读的 PostgreSQL 和 MongoDB 访问,基于 MCP。
SafeSelect 为编码代理提供了一个受限的数据库工具:发现结构、检查生产形态的数据、解释查询、诊断连接问题,并在不提供写能力工具或直接访问数据库凭据的情况下恢复过期的连接。
大多数数据库 MCP 服务器使得将代理连接到数据库变得容易。SafeSelect 则是为解决更困难的问题而构建:让代理检查生产形态的数据,而不会将数据库变成不受限制的工具面。
[!NOTE] SafeSelect 是代理访问的安全边界,而不是数据库权限的替代品。尽可能使用最小权限的数据库用户;当代理通过 SafeSelect 连接时,它仍然会约束过强的凭据。
当前后端支持:PostgreSQL 和 MongoDB。
Related MCP server: db-mcp
适用场景
在不对真实数据暴露修改工具的情况下调试应用程序。
在开发期间让代理检查模式、索引、查询计划和有界行。
通过有界读取和采样模式推断来探索 MongoDB 集合。
复用现有的 DBeaver、Docker Compose 或 MongoDB Compass 连接。
为编码代理提供数据库上下文,同时将策略、限制、机密和审计置于你的控制之下。
为什么选择 SafeSelect?
SafeSelect 刻意比通用数据库 MCP 服务器更窄。它不是工具构建器、SQL 工作台或远程数据库网关。它是为需要数据库可见性而非数据库权力的代理提供的本地安全边界。
SafeSelect 优先考虑 | 这意味着 |
本地 stdio 传输 | 没有网络监听器或开放的 MCP 端口 |
只读工具 | 代理不会收到具有写能力的数据库工具 |
与凭据无关的安全 | 即使是 DBA 凭据也被限制在 SafeSelect 的只读工具面内 |
故障关闭强制 | 策略违规会终止进程 |
机密隔离 | 密码保留在 Keychain 或环境变量中 |
项目范围策略 | 每个仓库定义自己的允许数据面 |
嵌入式 sidecar | 一个安装的二进制文件在 Rust 策略之后到达 JDBC 和 MongoDB 驱动程序 |
有何不同?
通用数据库 MCP 服务器 | SafeSelect |
通常暴露可配置工具 | 暴露固定的只读工具面 |
可能支持远程 HTTP 传输 | 默认使用本地 MCP stdio |
通常优化广泛的后端覆盖 | 优化可强制策略和代理安全 |
通常依赖最小权限数据库用户 | 即使凭据过强也强制只读行为 |
通常将连接设置分开 | 从 DBeaver、Docker Compose 和 MongoDB Compass 导入 |
可能记录查询用于调试 | 在审计日志之前对查询文本进行哈希 |
将安全故障视为可恢复错误 | 故障关闭并终止 MCP 进程 |
产品承诺很简单:代理可以查看,但不能修改。即使配置的数据库用户是 DBA,代理仍然只能获得 SafeSelect 的受限只读操作。
[!TIP] 当团队已经拥有 DBeaver、Docker Compose 或 MongoDB Compass 连接,并且需要在不重新设计数据库用户的情况下将其暴露给代理时,这很有用。
后端支持
后端 | 状态 | 工具 |
PostgreSQL | 支持 | 发现、索引/统计、 |
MongoDB | 支持 | 发现、find、聚合、distinct/count、explain、性能分析、模式推断和匿名化夹具 |
架构
代理通过 MCP stdio 与 SafeSelect 通信。SafeSelect 在 Rust 中强制策略,将机密存储在项目文件之外,并通过嵌入式 Java sidecar 访问数据库:JDBC 用于 SQL 后端,MongoDB 驱动程序用于 MongoDB。Rust 到 Java 的通道是 stdin/stdout 上的 JSON 行:没有套接字,没有开放端口。
快速开始
brew install antonillos/tap/safeselect
# Import a project database
safeselect import-dbeaver ~/Downloads/dbeaver-export.zip
# or:
# safeselect import-compose
# safeselect import-compass --path "$HOME/.config/MongoDB Compass"
# Verify the environment
safeselect check --environment testing
# Install the MCP entry. If this is the only environment, its name is inferred.
safeselect agent install opencode
# Verify exactly what was installed and where.
safeselect agent statusSafeSelect 使用任何可用的 Java 17+ 运行时,而不是特别要求 Homebrew 的
openjdk@17 公式。如果 Java 缺失或太旧,请在运行数据库命令之前安装或选择 Java 17+ 运行时。
生成的 MCP 名称默认为 safeselect-<project>-<environment>。
生成的 MCP 条目是一个 stdio 服务器,限定于一个项目和环境:
{
"mcpServers": {
"safeselect-myapp-testing": {
"command": "safeselect",
"args": ["serve", "--project", "/path/to/myapp", "--environment", "testing"]
}
}
}SafeSelect 使用每个客户端的官方 MCP 配置契约,固定绝对仓库路径,并默认使用用户范围。如果客户端支持,添加 --local 以获取项目范围的条目。有关确切路径、范围及手动配置,请参阅
AI 代理集成。
代理工作流
代理应按以下顺序使用 SafeSelect:
database_infolist_tables然后describe_table;在 SQL 中有用时检查list_table_indexes或有界统计对于 NoSQL,使用
list_databases、list_collections,然后discover_document_schemaselect/explain,或与任务匹配的有界 MongoDB 读取工具当连接过期时使用
check、connect或reconnect
代理在查询不熟悉的数据之前必须发现关系或集合结构,并使用每个发现响应的 next_suggestion,而不是猜测列或字段名。SQL 描述是目录元数据;MongoDB 模式是从有界、非穷尽的样本中推断出来的。
MongoDB 查询文档必须保持完整的嵌套 JSON 值。将嵌套工具参数展平的客户端可以将 filter、projection 和 sort 作为 JSON 编码的对象字符串传递,将 pipeline 作为 JSON 编码的数组字符串传递。
redact_fields 也接受 JSON 编码的字符串数组。展平的键会被拒绝,因此丢失的过滤器或编辑永远不会变成约束较少的回退。
MongoDB 服务器端 JavaScript 永远不可用:$where、$function 和
$accumulator 在 MongoDB 驱动程序收到之前,会在过滤器、投影、排序和聚合管道中被递归拒绝。被拒绝时,请使用声明式 MQL 运算符重建请求;SafeSelect 没有启用 JavaScript 的设置。
查询响应包括 row_count、byte_count、elapsed_ms 和人类可读的 elapsed 值,以便代理推理结果大小和延迟。
每个 MCP 成功和错误都包含一个上下文相关的 next_suggestion。代理
应遵循该单一安全操作,绝不盲目重复无效请求,并在建议为终止性时停止。对于只显示 MCP 错误摘要的客户端,SafeSelect 也会在该摘要中包含可信的下一步建议,而不暴露数据库派生的细节。
安全模型
故障关闭:安全违规会终止 MCP 进程。
只读:SQL 允许
SELECT、EXPLAIN和WITH;NoSQL 后端允许发现和只读文档读取。无服务器端 JavaScript:MongoDB 的
$where、$function和$accumulator在 Rust 和 Java sidecar 中都会被拒绝。范围访问:可以允许或拒绝模式、关系、数据库和集合。
硬限制:强制执行行数、结果字节数和超时;MongoDB 读取命令接收与
maxTimeMS相同的超时。机密隔离:密码存储在 macOS Keychain 或环境变量中,绝不在项目配置中。
驱动程序验证:JDBC 驱动程序在使用前通过 SHA-256 检查。
审计跟踪:查询文本在记录前进行哈希;当前会话通过
audit_status和audit_recent暴露有界审计元数据。
刻意限制
SafeSelect 不暴露数据库写入、迁移、管理或任意命令执行。
目前支持 PostgreSQL 和 MongoDB 后端;广泛的连接器数量不是目标。
MCP 传输是本地 stdio。SafeSelect 不是远程数据库网关。
MongoDB 模式发现是采样和有界的,不是穷尽的模式保证。
SafeSelect 补充数据库原生的最小权限;它不替代它。
MCP 工具
区域 | 工具 |
SQL |
|
MongoDB 读取 |
|
MongoDB 分析 |
|
连接 |
|
审计 |
|
配置 |
|
设置 |
|
当不存在 .safeselect/ 目录时,safeselect serve --environment <env> 会自动进入设置模式,并仅暴露设置安全的工具。
[!IMPORTANT] 设置模式不暴露查询工具。在数据库检查工具可用之前,代理可以帮助导入和验证配置。
CLI 要点
命令 | 用途 |
| 启动 MCP 服务器 |
| 验证配置、密钥、隧道、sidecar 和后端连接 |
| 打印带有稳定代码的更深层诊断信息 |
| 导入 DBeaver 连接 |
| 从 docker-compose 导入 |
| 导入 MongoDB Compass 连接 |
| 安装 MCP 条目 |
| 存储数据库密码 |
| 存储 SSH 密码 |
| 移除已安装的二进制文件、全局状态、审计数据和 Keychain 条目 |
| 仅移除用户本地二进制文件并保留配置 |
使用 safeselect --help 或命令特定的 --help 获取完整 CLI 帮助。
卸载会检查 release-installer 和 Cargo 二进制文件位置。
MongoDB Compass 导入支持通过解析 SRV 目标并使用所需的 TLS 和直接连接选项重写本地端点,来支持 SSH 隧道的 mongodb+srv:// 连接。
配置
全局状态默认位于 ~/.config/safeselect/。项目策略位于仓库根目录的 .safeselect/:
<repo-root>/
└── .safeselect/
├── project.toml
└── environments/
└── <env>.tomlSafeSelect 从当前目录向上查找 .safeselect/。当代理或脚本应针对特定仓库时,使用 --project <path>。
支持的代理
客户端 | 用户级作用域 | 项目级作用域 | 集成 |
OpenCode | 是 | 是 | JSON/JSONC |
OpenAI Codex | 是 | 是 | lossless TOML |
Claude Code | 是 | 是 | native |
Cursor | 是 | 是 |
|
Windsurf | 是 | 否 | 全局 Windsurf MCP 配置 |
GitHub Copilot | 是 | 是 |
|
Gemini CLI | 是 | 是 |
|
SafeSelect 从不静默回退到更广泛的作用域。特别是,Windsurf 的 --local 会因明确的修正而失败,因为 Windsurf 没有文档化的项目级 MCP 配置。
从源码构建
./install.sh
safeselect --version要求:Rust 1.81+、Java 17+、Maven 3.8+。sshpass 对于基于密码的 SSH 隧道是可选的。
文档
发布说明由 CHANGELOG.md 生成。
许可证
MIT - 参见 LICENSE。
This server cannot be deployed
Maintenance
Related MCP Connectors
Query your org's data in natural language — read-only MCP access to SQL, NoSQL, files & warehouses.
Safe, read-only Postgres and MySQL access for AI agents. Audit log + column-level controls.
- dataOAuthco.thinair
PostgreSQL, MySQL, and SQL Server in one session. 26 read-only MCP tools for AI agents.
Guard AI agents' PostgreSQL/MySQL access via MCP: SQL audit, auth, masking, write approval
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceProvides a read-only PostgreSQL SQL surface for LLM agents via MCP, with defense-in-depth security layers for safe database queries.166 PyPI4MIT
- FlicenseNot gradedqualityCmaintenanceProvides read-only database access for AI agents across multiple databases (Postgres, MySQL, MongoDB, Elasticsearch) with enforced read-only guarantees and separate tools for prod and non-prod environments.-
- AlicenseNot gradedqualityBmaintenanceProvides read-only access to databases for MCP-compatible AI tools, allowing schema exploration and SELECT queries without exposing credentials or risking data changes.145 npm3MIT
- AlicenseNot gradedqualityBmaintenanceProvides read-only access to PostgreSQL databases via MCP, enforcing least-privilege roles, row-level security, masked views, and SQL AST guardrails to prevent data leakage and unauthorized operations, enabling AI agents to safely query sensitive production data.MIT