Skip to main content
Glama

SafeSelect MCP

代理可以查看,但不能修改。

面向 AI 编码代理的、故障关闭、只读的 PostgreSQL 和 MongoDB 访问,基于 MCP。

CI CRAP Security Rust Java MCP Homebrew asdf License

SafeSelect 为编码代理提供了一个受限的数据库工具:发现结构、检查生产形态的数据、解释查询、诊断连接问题,并在不提供写能力工具或直接访问数据库凭据的情况下恢复过期的连接。

大多数数据库 MCP 服务器使得将代理连接到数据库变得容易。SafeSelect 则是为解决更困难的问题而构建:让代理检查生产形态的数据,而不会将数据库变成不受限制的工具面。

[!NOTE] SafeSelect 是代理访问的安全边界,而不是数据库权限的替代品。尽可能使用最小权限的数据库用户;当代理通过 SafeSelect 连接时,它仍然会约束过强的凭据。

当前后端支持:PostgreSQL 和 MongoDB。

Related MCP server: databricks-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

支持

发现、索引/统计、selectexplain

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 status

SafeSelect 使用任何可用的 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:

  1. database_info

  2. list_tables 然后 describe_table;在 SQL 中有用时检查 list_table_indexes 或有界统计

  3. 对于 NoSQL,使用 list_databaseslist_collections,然后 discover_document_schema

  4. select / explain,或与任务匹配的有界 MongoDB 读取工具

  5. 当连接过期时使用 checkconnectreconnect

代理在查询不熟悉的数据之前必须发现关系或集合结构,并使用每个发现响应的 next_suggestion,而不是猜测列或字段名。SQL 描述是目录元数据;MongoDB 模式是从有界、非穷尽的样本中推断出来的。

MongoDB 查询文档必须保持完整的嵌套 JSON 值。将嵌套工具参数展平的客户端可以将 filterprojectionsort 作为 JSON 编码的对象字符串传递,将 pipeline 作为 JSON 编码的数组字符串传递。 redact_fields 也接受 JSON 编码的字符串数组。展平的键会被拒绝,因此丢失的过滤器或编辑永远不会变成约束较少的回退。

MongoDB 服务器端 JavaScript 永远不可用:$where$function$accumulator 在 MongoDB 驱动程序收到之前,会在过滤器、投影、排序和聚合管道中被递归拒绝。被拒绝时,请使用声明式 MQL 运算符重建请求;SafeSelect 没有启用 JavaScript 的设置。

查询响应包括 row_countbyte_countelapsed_ms 和人类可读的 elapsed 值,以便代理推理结果大小和延迟。

每个 MCP 成功和错误都包含一个上下文相关的 next_suggestion。代理 应遵循该单一安全操作,绝不盲目重复无效请求,并在建议为终止性时停止。对于只显示 MCP 错误摘要的客户端,SafeSelect 也会在该摘要中包含可信的下一步建议,而不暴露数据库派生的细节。

安全模型

  • 故障关闭:安全违规会终止 MCP 进程。

  • 只读:SQL 允许 SELECTEXPLAINWITH;NoSQL 后端允许发现和只读文档读取。

  • 无服务器端 JavaScript:MongoDB 的 $where$function$accumulator 在 Rust 和 Java sidecar 中都会被拒绝。

  • 范围访问:可以允许或拒绝模式、关系、数据库和集合。

  • 硬限制:强制执行行数、结果字节数和超时;MongoDB 读取命令接收与 maxTimeMS 相同的超时。

  • 机密隔离:密码存储在 macOS Keychain 或环境变量中,绝不在项目配置中。

  • 驱动程序验证:JDBC 驱动程序在使用前通过 SHA-256 检查。

  • 审计跟踪:查询文本在记录前进行哈希;当前会话通过 audit_statusaudit_recent 暴露有界审计元数据。

刻意限制

  • SafeSelect 不暴露数据库写入、迁移、管理或任意命令执行。

  • 目前支持 PostgreSQL 和 MongoDB 后端;广泛的连接器数量不是目标。

  • MCP 传输是本地 stdio。SafeSelect 不是远程数据库网关。

  • MongoDB 模式发现是采样和有界的,不是穷尽的模式保证。

  • SafeSelect 补充数据库原生的最小权限;它不替代它。

MCP 工具

区域

工具

SQL

list_tablesdescribe_tablelist_table_indexesget_database_statsget_table_statsselectexplain

MongoDB 读取

list_databaseslist_collectionsfind_documentsaggregate_documentsdistinct_documentscount_documentsexplain_documents

MongoDB 分析

profile_document_fielddiscover_document_schemagenerate_document_fixturelist_collection_indexesget_database_statsget_collection_stats

连接

database_infocheckconnectdisconnectreconnect

审计

audit_statusaudit_recent

配置

config_validateconfig_showconfig_set_passwordconfig_rename_environmentconfig_delete_environmentconfig_reset

设置

import_composedriver_listdriver_adddriver_downloadagent_detectagent_installagent_statusagent_uninstall

当不存在 .safeselect/ 目录时,safeselect serve --environment <env> 会自动进入设置模式,并仅暴露设置安全的工具。

[!IMPORTANT] 设置模式不暴露查询工具。在数据库检查工具可用之前,代理可以帮助导入和验证配置。

CLI 要点

命令

用途

safeselect serve --environment <env>

启动 MCP 服务器

safeselect check --environment <env>

验证配置、密钥、隧道、sidecar 和后端连接

safeselect doctor --environment <env>

打印带有稳定代码的更深层诊断信息

safeselect import-dbeaver <zip>

导入 DBeaver 连接

safeselect import-compose [--path <path>]

从 docker-compose 导入

safeselect import-compass [--path <path>]

导入 MongoDB Compass 连接

safeselect agent install <client> --environment <env>

安装 MCP 条目

safeselect config set-password --environment <env>

存储数据库密码

safeselect config set-ssh-password --environment <env>

存储 SSH 密码

safeselect uninstall

移除已安装的二进制文件、全局状态、审计数据和 Keychain 条目

safeselect uninstall --binary-only

仅移除用户本地二进制文件并保留配置

使用 safeselect --help 或命令特定的 --help 获取完整 CLI 帮助。

卸载会检查 release-installer 和 Cargo 二进制文件位置。 MongoDB Compass 导入支持通过解析 SRV 目标并使用所需的 TLS 和直接连接选项重写本地端点,来支持 SSH 隧道的 mongodb+srv:// 连接。

配置

全局状态默认位于 ~/.config/safeselect/。项目策略位于仓库根目录的 .safeselect/

<repo-root>/
└── .safeselect/
    ├── project.toml
    └── environments/
        └── <env>.toml

SafeSelect 从当前目录向上查找 .safeselect/。当代理或脚本应针对特定仓库时,使用 --project <path>

支持的代理

客户端

用户级作用域

项目级作用域

集成

OpenCode

JSON/JSONC mcp

OpenAI Codex

lossless TOML mcp_servers

Claude Code

native claude mcp scopes

Cursor

.cursor/mcp.json

Windsurf

全局 Windsurf MCP 配置

GitHub Copilot

servers in MCP JSON

Gemini CLI

.gemini/settings.json

SafeSelect 从不静默回退到更广泛的作用域。特别是,Windsurf 的 --local 会因明确的修正而失败,因为 Windsurf 没有文档化的项目级 MCP 配置。

从源码构建

./install.sh
safeselect --version

要求:Rust 1.81+、Java 17+、Maven 3.8+。sshpass 对于基于密码的 SSH 隧道是可选的。

文档

发布说明由 CHANGELOG.md 生成。

许可证

MIT - 参见 LICENSE

A
license - permissive license
Not graded
quality - not tested
A
maintenance

Maintenance

Maintainers
Response time
4dRelease cycle
15Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Provides a read-only PostgreSQL SQL surface for LLM agents via MCP, with defense-in-depth security layers for safe database queries.
    3
    MIT
  • F
    license
    Not graded
    quality
    C
    maintenance
    Provides 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.
  • A
    license
    Not graded
    quality
    B
    maintenance
    Provides read-only access to databases for MCP-compatible AI tools, allowing schema exploration and SELECT queries without exposing credentials or risking data changes.
    92
    3
    MIT

View all related MCP servers

Related MCP Connectors

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/antonillos/safeselect'

If you have feedback or need assistance with the MCP directory API, please join our Discord server