Skip to main content
Glama

SafeSelect MCP

에이전트는 조회할 수 있습니다. 변경할 수는 없습니다.

AI 코딩 에이전트를 위한 MCP 기반의 fail-closed, 읽기 전용 PostgreSQL 및 MongoDB 접근 도구입니다.

CI CRAP Security Rust Java MCP Homebrew asdf License

SafeSelect는 코딩 에이전트에게 제한된 데이터베이스 도구를 제공합니다: 구조 탐색, 프로덕션 형태의 데이터 검사, 쿼리 설명, 연결 진단, 그리고 오래된 연결 복구를 지원하되, 쓰기 가능한 도구나 데이터베이스 자격 증명에 대한 직접 접근은 절대 제공하지 않습니다.

대부분의 데이터베이스 MCP 서버는 에이전트를 데이터베이스에 쉽게 연결해 줍니다. SafeSelect는 더 어려운 문제를 해결하기 위해 만들어졌습니다: 데이터베이스를 무제한 도구 표면으로 바꾸지 않으면서 에이전트가 프로덕션 형태의 데이터를 검사할 수 있게 하는 것입니다.

[!NOTE] SafeSelect는 에이전트 접근을 위한 안전 경계이지, 데이터베이스 권한을 대체하는 것이 아닙니다. 가능하면 최소 권한 데이터베이스 사용자를 사용하세요. 에이전트가 SafeSelect를 통해 연결할 때에도 과도한 권한의 자격 증명을 제한하는 것은 SafeSelect의 역할입니다.

현재 지원 백엔드: PostgreSQL 및 MongoDB.

Related MCP server: databricks-mcp

활용 사례

  • 실제 데이터로 애플리케이션을 디버깅하되 변경 도구는 노출하지 않아야 할 때.

  • 개발 중 에이전트가 스키마, 인덱스, 쿼리 플랜, 제한된 행을 검사하도록 할 때.

  • 제한된 읽기와 샘플 기반 스키마 추론을 통해 MongoDB 컬렉션을 탐색할 때.

  • 기존 DBeaver, Docker Compose 또는 MongoDB Compass 연결을 재사용할 때.

  • 정책, 한도, 비밀, 감사를 통제하면서 코딩 에이전트에게 데이터베이스 컨텍스트를 제공할 때.

왜 SafeSelect인가?

SafeSelect는 의도적으로 범용 데이터베이스 MCP 서버보다 좁은 범위를 제공합니다. 도구 빌더, SQL 워크벤치, 원격 데이터베이스 게이트웨이가 아닙니다. 데이터베이스 권한이 아닌 데이터베이스 가시성이 필요한 에이전트를 위한 로컬 안전 경계입니다.

SafeSelect가 우선시하는 것

의미

로컬 stdio 전송

네트워크 리스너나 열린 MCP 포트 없음

읽기 전용 도구

에이전트는 쓰기 가능한 데이터베이스 도구를 받지 않음

자격 증명과 무관한 안전

DBA 자격 증명조차 SafeSelect의 읽기 전용 도구 표면으로 제한됨

Fail-closed 강제

정책 위반 시 프로세스 종료

비밀 격리

비밀번호는 Keychain 또는 환경 변수에만 저장

프로젝트 범위 정책

각 저장소가 자체 허용 데이터 표면을 정의

내장 사이드카

설치된 단일 바이너리가 Rust 정책 뒤에서 JDBC 및 MongoDB 드라이버에 도달

차별점

일반 데이터베이스 MCP 서버

SafeSelect

구성 가능한 도구를 노출하는 경우가 많음

고정된 읽기 전용 도구 표면을 노출

원격 HTTP 전송을 지원할 수 있음

기본적으로 로컬 MCP stdio 사용

일반적으로 광범위한 백엔드 지원에 최적화

강제 가능한 정책과 에이전트 안전에 최적화

최소 권한 데이터베이스 사용자에 의존하는 경우가 많음

자격 증명이 과도한 권한을 가져도 읽기 전용 동작을 강제

연결 설정을 별도로 유지하는 경우가 많음

DBeaver, Docker Compose, MongoDB Compass에서 가져오기

디버깅을 위해 쿼리를 기록할 수 있음

감사 로깅 전에 쿼리 텍스트를 해시

보안 실패를 복구 가능한 오류로 처리

fail-closed 방식으로 MCP 프로세스 종료

제품의 약속은 간단합니다: 에이전트는 조회할 수 있지만 변경할 수 없습니다. 구성된 데이터베이스 사용자가 DBA라 할지라도 에이전트는 SafeSelect의 제한된 읽기 전용 작업만 받을 수 있습니다.

[!TIP] 팀에 이미 DBeaver, Docker Compose 또는 MongoDB Compass 연결이 있고, 데이터베이스 사용자를 재설계하지 않고 에이전트에 노출해야 할 때 유용합니다.

백엔드 지원

백엔드

상태

도구

PostgreSQL

지원

탐색, 인덱스/통계, select, explain

MongoDB

지원

탐색, find, aggregation, distinct/count, explain, profiling, 스키마 추론, 익명화된 픽스처

아키텍처

에이전트는 MCP stdio를 통해 SafeSelect와 통신합니다. SafeSelect는 Rust에서 정책을 강제하고, 프로젝트 파일 외부에 비밀을 저장하며, 내장 Java 사이드카를 통해 데이터베이스에 도달합니다: SQL 백엔드는 JDBC, MongoDB는 MongoDB 드라이버를 사용합니다. Rust와 Java 간 채널은 stdin/stdout을 통한 JSON-lines입니다: 소켓도, 열린 포트도 없습니다.

빠른 시작

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는 Homebrew의 openjdk@17 포뮬러를 특별히 요구하지 않고 사용 가능한 Java 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_databases, list_collections, 그 다음 discover_document_schema

  4. select / explain, 또는 작업에 맞는 제한된 MongoDB 읽기 도구

  5. 연결이 오래된 경우 check, connect 또는 reconnect

에이전트는 익숙하지 않은 데이터를 쿼리하기 전에 반드시 관계 또는 컬렉션 구조를 탐색해야 하며, 각 탐색 응답의 next_suggestion을 사용하여 열 또는 필드 이름을 추측하지 말아야 합니다. SQL 설명은 카탈로그 메타데이터이고, MongoDB 스키마는 제한된 비전체 샘플에서 추론됩니다.

MongoDB 쿼리 문서는 완전한 중첩 JSON 값으로 유지되어야 합니다. 중첩된 도구 인수를 평면화하는 클라이언트는 filter, projection, sort를 JSON 인코딩된 객체 문자열로, pipeline을 JSON 인코딩된 배열 문자열로 전달할 수 있습니다. redact_fields도 JSON 인코딩된 문자열 배열을 허용합니다. 평면화된 키는 거부되므로, 손실된 필터나 redaction이 덜 제한된 폴백이 될 수 없습니다.

MongoDB 서버 측 JavaScript는 절대 사용할 수 없습니다: $where, $function, $accumulator는 MongoDB 드라이버에 전달되기 전에 필터, 프로젝션, 정렬 및 집계 파이프라인에서 재귀적으로 거부됩니다. 거부된 경우 선언적 MQL 연산자로 요청을 재구성하세요. SafeSelect에는 JavaScript를 활성화하는 설정이 없습니다.

쿼리 응답에는 row_count, byte_count, elapsed_ms 및 사람이 읽을 수 있는 elapsed 값이 포함되어 에이전트가 결과 크기와 지연 시간을 판단할 수 있습니다.

모든 MCP 성공 및 오류에는 컨텍스트에 맞는 next_suggestion 하나가 포함됩니다. 에이전트는 그 단일 안전 조치를 따라야 하며, 잘못된 요청을 맹목적으로 반복하지 말고, 제안이 종결적일 때 중지해야 합니다. MCP 오류 요약만 표시하는 클라이언트를 위해 SafeSelect는 데이터베이스 파생 세부 정보를 노출하지 않고 신뢰할 수 있는 다음 제안도 해당 요약에 포함합니다.

보안 모델

  • Fail closed: 보안 위반 시 MCP 프로세스가 종료됩니다.

  • 읽기 전용: SQL은 SELECT, EXPLAIN, WITH를 허용합니다. NoSQL 백엔드는 탐색 및 읽기 전용 문서 읽기를 허용합니다.

  • 서버 측 JavaScript 없음: MongoDB $where, $function, $accumulator는 Rust에서 거부되고 Java 사이드카에서 다시 거부됩니다.

  • 범위 제한 접근: 스키마, 관계, 데이터베이스 및 컬렉션을 허용하거나 거부할 수 있습니다.

  • 하드 한도: 행 수, 결과 바이트 및 타임아웃이 강제됩니다. MongoDB 읽기 명령은 maxTimeMS와 동일한 타임아웃을 받습니다.

  • 비밀 격리: 비밀번호는 macOS Keychain 또는 환경 변수에 저장되며 프로젝트 구성에는 절대 저장되지 않습니다.

  • 드라이버 검증: JDBC 드라이버는 사용 전에 SHA-256으로 검사됩니다.

  • 감사 추적: 쿼리 텍스트는 기록 전에 해시됩니다. 현재 세션은 audit_statusaudit_recent를 통해 제한된 감사 메타데이터를 노출합니다.

의도적 한계

  • SafeSelect는 데이터베이스 쓰기, 마이그레이션, 관리 또는 임의 명령 실행을 노출하지 않습니다.

  • 현재 지원 백엔드는 PostgreSQL과 MongoDB입니다. 광범위한 커넥터 수가 목표는 아닙니다.

  • MCP 전송은 로컬 stdio입니다. SafeSelect는 원격 데이터베이스 게이트웨이가 아닙니다.

  • MongoDB 스키마 탐색은 샘플 기반의 제한된 것이지, 완전한 스키마 보장이 아닙니다.

  • SafeSelect는 데이터베이스 네이티브 최소 권한을 보완할 뿐 대체하지 않습니다.

MCP 도구

영역

도구

SQL

list_tables, describe_table, list_table_indexes, get_database_stats, get_table_stats, select, explain

MongoDB 읽기

list_databases, list_collections, find_documents, aggregate_documents, distinct_documents, count_documents, explain_documents

MongoDB 분석

profile_document_field, discover_document_schema, generate_document_fixture, list_collection_indexes, get_database_stats, get_collection_stats

연결

database_info, check, connect, disconnect, reconnect

감사

audit_status, audit_recent

구성

config_validate, config_show, config_set_password, config_rename_environment, config_delete_environment, config_reset

설정

import_compose, driver_list, driver_add, driver_download, agent_detect, agent_install, agent_status, agent_uninstall

.safeselect/ 디렉터리가 없으면 safeselect serve --environment <env>가 자동으로 설정 모드로 진입하여 설정에 안전한 도구만 노출합니다.

[!IMPORTANT] 설정 모드에서는 쿼리 도구가 노출되지 않습니다. 에이전트는 데이터베이스 검사 도구를 사용할 수 있게 되기 전에 구성을 가져오고 검증하는 데 도움을 줄 수 있습니다.

CLI 필수 사항

명령

용도

safeselect serve --environment <env>

MCP 서버 시작

safeselect check --environment <env>

구성, 비밀번호, 터널, 사이드카, 백엔드 연결 확인

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

사용자 로컬 바이너리만 제거하고 구성은 유지

전체 CLI는 safeselect --help 또는 명령별 --help를 사용하세요.

제거는 릴리스 설치 프로그램과 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

무손실 TOML mcp_servers

Claude Code

네이티브 claude mcp 범위

Cursor

.cursor/mcp.json

Windsurf

아니요

전역 Windsurf MCP 구성

GitHub Copilot

MCP JSON의 servers

Gemini CLI

.gemini/settings.json

SafeSelect는 더 넓은 범위로 자동 대체(fallback)하지 않습니다. 특히 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