mcpField
U
universal-db-mcp

universal-db-mcp

ローカル
github.com/Fashad-Ahmedデータベース120 週間前に更新

universal-db-mcp について

universal-db-mcpは、AIエージェント向けの安全なデータベースアクセスを提供するPython製MCPサーバーです。PostgreSQL、SQLite、MySQL、DuckDBに対応し、デフォルトの読み取り専用設定と多層のインジェクション対策を備えています。

主な機能

  1. 014種類のデータベースに対応
  2. 02デフォルトで読み取り専用
  3. 038層のSQLインジェクション対策
  4. 04クエリ、スキーマ、実行計画ツール
  5. 05スキーマのスナップショットと差分確認

活用シーン

  1. 01ローカルのSQLiteやDuckDBファイルの照会
  2. 02DuckDBでのParquet、CSV、JSON分析
  3. 03データベース構造やクエリ計画の安全な確認
  4. 04スキーマ変更の追跡とクエリ履歴の確認

MCP 対応

SQL照会、スキーマ確認、実行計画、ヘルスチェック、スキーマ比較のツールをMCPクライアントに公開し、実行前にクエリを検証します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"fashad-ahmed-universal-db": {
"command": "uvx",
"args": [
"universal-db-mcp"
],
"env": {
"POSTGRES_URI": "<POSTGRES_URI>",
"SQLITE_PATH": "<SQLITE_PATH>",
"MYSQL_URI": "<MYSQL_URI>",
"DUCKDB_PATH": "<DUCKDB_PATH>",
"ALLOW_DESTRUCTIVE": "<ALLOW_DESTRUCTIVE>",
"MAX_RESULT_ROWS": "<MAX_RESULT_ROWS>"
}
}
}
}
起動コマンドuvx universal-db-mcp
設定が必要な環境変数
POSTGRES_URIシークレットPostgreSQL connection string (read-only user recommended)
SQLITE_PATHPath to a SQLite database file
MYSQL_URIシークレットMySQL connection string (read-only user recommended)
DUCKDB_PATHPath to a DuckDB file, or :memory:
ALLOW_DESTRUCTIVESet to true to allow INSERT/UPDATE/DELETE/DDL (default: false)
MAX_RESULT_ROWSMaximum rows returned per query (default: 1000)

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
pypiuniversal-db-mcp1.1.2

ツール

8

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
sqlstringはい実行する SQL クエリ
paramsanyいいえパラメーター化クエリ用の任意のパラメーターリスト(文字列フォーマットの代わりに使用)
databaseanyいいえデータベースキー(形式:"type:name")。複数のデータベースが設定されている場合は必須です。

詳細

Universal Database MCP Server

AI エージェントからデータベースにアクセスするための、セキュリティを最優先した Python ネイティブの MCP サーバーです。

CI PyPI Python 3.10+ FastMCP License: MIT

デモ:スキーマの検出、実際のクエリ、ブロックされた DROP、ドライランモード


開発の背景

ほとんどのデータベース MCP サーバーは、AI エージェントに生の SQL アクセスを許可し、問題が起きないことを期待します。 このサーバーでは、LLM からの入力を信頼できないものとみなし、クエリがデータベースに到達する前に 8 層のインジェクション防止策を適用します。UNION 攻撃、ステートメントの連結、時間ベースのインジェクション、コメントによる回避もブロックします。

対応:PostgreSQL · SQLite · MySQL · DuckDB(カラム型分析)


セットアップ不要:今すぐお使いのノート PC で動作します

Docker もクラウドアカウントも、インストールするデータベースサーバーも不要です。DuckDB と SQLite はプロセス内で動作します。

# Query a local SQLite database — one command, zero infra
SQLITE_PATH=./myapp.db uvx universal-db-mcp

# Query a local DuckDB file or parquet files
DUCKDB_PATH=./analytics.duckdb uvx universal-db-mcp

# In-memory DuckDB for throwaway analysis
DUCKDB_PATH=:memory: uvx universal-db-mcp

Claude Code の ~/.claude/mcp_servers.json、または Claude Desktop の ~/Library/Application Support/Claude/claude_desktop_config.json(macOS)/ %APPDATA%\Claude\claude_desktop_config.json(Windows)に追加します。

{
  "mcpServers": {
    "mydb": {
      "command": "uvx",
      "args": ["universal-db-mcp"],
      "env": {
        "SQLITE_PATH": "/Users/you/projects/myapp/db.sqlite3",
        "ALLOW_DESTRUCTIVE": "false"
      }
    }
  }
}

保存後に Claude Desktop/Claude Code を再起動すれば完了です。

これで完了です。Claude Code がツールを自動的に検出します。

その他のクライアント設定(Claude Desktop、Cursor、Windsurf、Docker)は examples/ にあります。


セキュリティモデル:8 層

デフォルトは読み取り専用です。多層防御を採用しています。すべてのクエリはドライバーに渡る前に検証されます。

層内容
1ドライバーレベルの読み取り専用 — PostgreSQL のセッションフラグ、SQLite の mode=ro URI、DuckDB の read_only=True。SQL の解析前に書き込みを拒否します。
2キーワードのブロック — 読み取り専用モードでは DROP、DELETE、TRUNCATE、ALTER、INSERT、UPDATE、GRANT、EXEC をブロックします
3インジェクションパターンの検出 — UNION SELECT、ステートメントの連結、SQL コメント(--、/*)、xp_、SLEEP()、WAITFOR、BENCHMARK()
4複数ステートメントの拒否 — ステートメントを区切る ; は常にブロックされます
5パラメーター型の強制 — パラメーターとして受け付けるのは str、int、float、bool、null のみです
6結果サイズの制限 — メモリ枯渇を防ぐため、MAX_RESULT_ROWS(デフォルトは 1000)で切り詰めます
7識別子のサニタイズ — 内部で生成される SQL では、テーブル名/カラム名からメタ文字を除去します
8DuckDB のファイルシステムブロックリスト — アダプター層で read_csv()、read_parquet()、glob()、LOAD、INSTALL、httpfs、COPY をブロックします。read_only=True でブロックされるのは書き込みのみで、ファイルの読み取りはブロックされません

脅威モデルの詳細:docs/SECURITY.md


DuckDB:インフラ不要の分析

DuckDB はプロセス内で動作し(サーバー不要)、Parquet、CSV、JSON をネイティブに読み取ります。 ウェアハウスを立ち上げずに、AI エージェントを分析データに接続できます。

# Query parquet files directly
DUCKDB_PATH=:memory: uvx universal-db-mcp

次に、Claude Code で次を実行します。

You: "Load sales.parquet and show me monthly revenue by region"
Claude: [uses query tool → SELECT region, strftime('%Y-%m', date) AS month, SUM(revenue) ...]

自然言語 → SQL

NL-to-SQL 専用ツールは不要です。Claude はすでにこれを実行できます。schema ツールを渡し、平易な英語で尋ねてください。

You: "Which customers placed more than 5 orders last month?"
Claude: [calls schema() to see table structure, then query() with the
         generated SQL — every query still passes through all 8 security
         layers before touching your database]

試作中は dry_run: true(DRYRUN=true)と組み合わせてください。Claude は何も実行せずにクエリプランを受け取れます。


Docker

docker build -t universal-db-mcp .
docker run -i --rm \
  -e POSTGRES_URI=postgresql://readonly:[email protected]:5432/mydb \
  -e ALLOW_DESTRUCTIVE=false \
  universal-db-mcp

MCP クライアントへの組み込み方法については、examples/docker_mcp_config.json をご覧ください。


すべてのデータベース

# PostgreSQL
POSTGRES_URI=postgresql://readonly:pass@localhost/mydb uvx universal-db-mcp

# SQLite (local file, zero infra)
SQLITE_PATH=./db.sqlite3 uvx universal-db-mcp

# MySQL
MYSQL_URI=mysql://readonly:pass@localhost/mydb uvx universal-db-mcp

# DuckDB (columnar, in-process analytics)
DUCKDB_PATH=./analytics.duckdb uvx universal-db-mcp

# Multiple databases simultaneously
POSTGRES_URI=... SQLITE_PATH=... uvx universal-db-mcp

MCP ツール

ツール説明
querySQL を実行します — デフォルトでは読み取り専用で、8 層すべてのセキュリティ対策が適用されます
schemaテーブルとカラムを確認します — 設定は不要です
explainクエリを実行せずに、クエリの実行計画を取得します
health接続状態、DB バージョン、接続プールのメトリクスを確認します
list_databases設定済みのすべてのデータベースと接続状態を表示します
query_history直近 100 件の実行済みクエリを確認します
snapshot_schemaスキーマの差分検出用に現在のスキーマを記録します
schema_diff現在のスキーマと直近のスナップショットを比較します

v1.1.0:ドライランモード(DRYRUN=true)、テーブルの許可リスト(WHITELISTED_TABLES)、クエリの複雑さに関する警告、構造化された監査ログ、接続検証用の --check CLI フラグに対応しました。CHANGELOG.md を参照してください。


設定

# ── PostgreSQL ─────────────────────────────────────
POSTGRES_URI=postgresql://user:pass@host:5432/db
POSTGRES_READONLY=true          # default: true

# ── SQLite ─────────────────────────────────────────
SQLITE_PATH=/path/to/database.db
SQLITE_READONLY=true            # default: true

# ── MySQL ──────────────────────────────────────────
MYSQL_URI=mysql://user:pass@host:3306/db
MYSQL_READONLY=true             # default: true

# ── DuckDB ─────────────────────────────────────────
DUCKDB_PATH=/path/to/analytics.duckdb   # or :memory:
DUCKDB_READONLY=true            # default: true

# ── Security ───────────────────────────────────────
ALLOW_DESTRUCTIVE=false         # default: false — blocks INSERT/UPDATE/DELETE/DROP
MAX_RESULT_ROWS=1000            # truncate large results
ENABLE_LOGGING=true             # log queries to stderr
QUERY_TIMEOUT=30                # seconds
RATE_LIMIT_RPM=60               # requests per minute

セキュアなデータベースユーザー

必ず読み取り専用の専用アカウントを使用してください。MCP サーバーに、データを変更できる認証情報を決して与えないでください。

PostgreSQL:

CREATE USER mcp_agent WITH PASSWORD 'strong_random_password';
GRANT CONNECT ON DATABASE mydb TO mcp_agent;
GRANT USAGE ON SCHEMA public TO mcp_agent;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO mcp_agent;

MySQL:

CREATE USER 'mcp_agent'@'localhost' IDENTIFIED BY 'strong_random_password';
GRANT SELECT ON mydb.* TO 'mcp_agent'@'localhost';
FLUSH PRIVILEGES;

開発

git clone <repo-url>
cd universal-db-mcp
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev]"

# Run tests (67+ passing, no external DB required for SQLite + DuckDB)
pytest

# Security tests only
pytest tests/test_security.py -v

# With coverage
pytest --cov=src/universal_db_mcp --cov-report=term-missing

アーキテクチャ

src/universal_db_mcp/
├── server.py          # FastMCP server — 5 tools
├── config.py          # Env-var config via Pydantic
├── adapters/
│   ├── base.py        # Abstract adapter + result dataclasses
│   ├── postgresql.py  # asyncpg, connection pool, read-only via init callback
│   ├── sqlite.py      # aiosqlite, read-only via file URI mode=ro
│   ├── mysql.py       # aiomysql, DictCursor
│   └── duckdb.py      # duckdb, thread-pool executor, lock-guarded
└── security/
    └── sanitizer.py   # SQLSanitizer — 8-layer injection prevention

docs/
└── SECURITY.md        # Full security architecture and threat model

Google MCP Toolbox との比較

このプロジェクトGoogle MCP Toolbox
ランタイムPython — pip install / uvxGo バイナリ / Docker
ローカル DBSQLite + DuckDB(インフラ不要)SQLite なし
分析DuckDB(プロセス内)列指向アダプターなし
認証モデルデフォルトで読み取り専用 + 環境変数IAM / GCP ネイティブ
SQL インジェクション8 層のサニタイザー + パラメーター化認証重視
拡張Python エコシステム、任意の pip パッケージGo プラグイン
ベンダー中立Google Cloud への誘導

ツールによって適した用途は異なります。クラウド依存なしで、Python ネイティブかつローカル優先の、セキュリティを強化したアクセスが必要な場合にご利用ください。


ライセンス

MIT — LICENSE


セキュリティに関する注意:このサーバーは AI エージェントにデータベースへのアクセスを提供します。必ず読み取り専用の認証情報を使用し、本番環境にデプロイする前に docs/SECURITY.md を確認してください。また、.env ファイルを決してコミットしないでください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。