mcp-sqlserv
mcp-sqlserv
SQL Server データベースへの読み取り専用アクセスを提供するMCPサーバー — SQLインジェクションを構造的に防止し、Web Admin UI から管理。
Zero raw SQL · Default deny · Bind parameter 100% · 完全な監査
概要
mcp-sqlserv は、AIエージェント(Claude、Cursor、Claude Code、その他あらゆるMCPクライアント)が SQL Server データベースを安全かつ制御された形で読み取ることを可能にします。
クエリはすべてサーバーが構造的に構築します — AI/イエントが生の SQL を書くことは一切ありません。
識別子(テーブル/カラム)は、データベースの実際のメタデータ(
sys.tables、sys.columns)に対して検証されます。値は常に bind parameter → SQLインジェクションは構造的に不可能です。
テーブル単位の権限は デフォルト拒否:明示的な権限がなければ、そのテーブルには触れられません。
すべてのリクエストは監査ログに記録され、キー、ツール、フィルタ、行数、所要時間、ステータスも残ります。
Related MCP server: SQL Server MCP
機能
機能 | 説明 |
MCP Streamable HTTP | エンドポイント |
マルチプロジェクト | プロジェクトごとの URL |
API キー | AI コンシューマーごとにキーを作成 / 失効可能 |
OAuth 2.1 | Authorization Code + PKCE、DCR(RFC 7591)、リフレッシュトークンのローテーション、失効 |
SQL Server 接続 | host/port/user/pass(AES-256-GCM で暗号化)、TLS はオプション |
詳細な権限 | テーブルごとに許可対象を設定:データの読み取り、または メタデータの参照。デフォルト = DENY |
監査ログ | 全AIリクエストを記録:キー、ツール、テーブル、フィルタ、行数、所要時間、ステータス |
レート制限 | 1 API キーにつき 60 リクエスト/分(設定可能) |
完全な読み取り専用 | ツールは |
Agent Test | Web UI から Gemini モデルと直接チャットして、エンドツーエンドのテストが可能 |
アーキテクチャ
┌──────────────┐ HTTPS ┌─────────────┐ ┌──────────────────────────────┐
│ AI Agent ├───────────►│ nginx ├─────────►│ mcp-sqlserv (Docker) │
│ (MCP client)│ Bearer │ reverse │ app-net │ Express + MCP + OAuth │
└──────────────┘ token │ proxy+SSL │ work │ │ │ │
└─────────────┘ │ ▼ ▼ │
┌──────────────┐ HTTPS │ SQLite mssql pool │
│ Web Admin UI ├─────────────────────────────────────►│ (data/, keys, │ │
│ (browser) │ REST /api/* │ audit, izin) ▼ │
└──────────────┘ │ ┌──────────┐ │
│ │ SQL Srvr │ │
└──────────────┴──────────┴────┘クイックスタート
# 1. Clone & siapkan environment
git clone https://github.com/<username>/mcp-sqlserv.git
cd mcp-sqlserv
cp .env.example .env # isi ADMIN_USER / ADMIN_PASSWORD (min 8 karakter)
# 2. Build & jalankan
docker compose up -d --build
# 3. Verifikasi
curl http://localhost:4000/healthzサーバーは http://localhost:4444 で実行です — Web Admin UI は /、MCP エンドポイントは /mcp にあります。
環境変数
変数 | デフォルト | 説明 |
|
| サーバーのポート |
|
| SQLite 用フォルダ(compose ではボリュームにマウント) |
|
| Web Admin UI のユーザー |
| 必須 | Web Admin UI のパスワード(8文字以上) |
| 自動 | JWT / 暗号化シークレット(空の場合は自動生成・保存) |
|
| SQL クエリのタイムアウト |
|
| API キーごとのレート制限 |
|
|
|
|
| 認可コードの有効期限(秒) |
|
| アクセスト-クンの有効期限(秒) |
|
| リフレッシューントークンの有効期限(秒、30日) |
利用フロー
Web UI にログイン → DB接続 メニュー → host/port/user/pass/database を入力し、接続テスト を実行します。
Docker コンテナの場合、ホスト上の SQL Server は
host.docker.internalから利用できます。API キー メニュー → キーを作成(表示は一度だけです。必ず保存してください)。
テーブル権限 メニュー → AI に読み取りを許可するテーブルにチェック → 権限を保存。デフォルトは拒否です。
AI エージェントを
https://<domain>/mcpとヘッダーAuthorization: Bearer <api-key>で接続します。
汎用 MCP クライアントの接続
{
"mcpServers": {
"sql-server": {
"url": "https://<domain>/mcp",
"headers": { "Authorization": "Bearer sk-xxxx" }
}
}
}速いテストは curl で:
curl -X POST https://<domain>/mcp \
-H "Authorization: Bearer sk-xxxx" \
-H "Content-Type: application/json" \
-H "Accept: application/json, text/event-stream" \
-d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"curl","version":"1.0"}}}'Claude Custom Connector(claude.ai / Desktop)
Customize → Connectors → Add custom connector を開きます。
Remote MCP server URL:
https://<domain>/mcpを設定します。Advanced settings → OAuth Client ID + Secret を、OAuth Clients メニューから入力します (リダイレクト URI:
https://claude.ai/api/mcp/auth_callback)。空のままでも構いません — Claude が Dynamic Client Registration(RFC 759120)により自動登録します。
Add → Connect をクリック → ブラウザでオペレーターのログインページが開きます → アクセスを許可 します。
Claude はリフレッシュトークンを保存し、bearer トークンで MCP ツールを呼び出します。
Claude Code(CLI):
claude mcp add mcp-sqlserv https://<domain>/mcp --transport http \
... # bila client pre-registered: --client-id <id> --client-secret --callback-portOAuth エンドポイント
エンドポイント | 標準 |
| RFC 9728 |
| RFC 8414 |
| RFC 7591(DCR、public + confidential) |
| RFC 6749 + PKCE S256 |
| RFC 6749 / 7636 |
| RFC 7009 |
OAuth のアイデンティティはオペレーターのセッションです。アクセストークンは内部 API キー oauth:<client_id> に対応します。アクセストークンは内部 API キー oauth:<client_id> に対応します。テーブル権限、レート制限、監査も Claude 経由の接続にすべて適用されます。クライアントを失効させると、そのクライアントの全トークンが直ちに無効になります。
MCP ツール
ツール | 機能 |
| 許可されたテーブルと推定行数を一覧表示 |
| カラム、型、 null値、identity、主キー、インデックスを取得 |
| 構造化フィルタ、並べ替え、ページネーションを使用して行を読み取る |
| オプションのフィルタで行数をカウント |
| 主キーで 1 行を取得 |
| サーバー / データベースの情報 |
テーブル名はスキーマプレフィックスなしで指定します(dbo.users ではなく users)。カラムは sys.columns に対して検証され、値は 100% バインドパラメータです。
サポートされる構造化フィルター:eq、neq、lt、lte、gt、gte、like、startsWith、endsWith、in、between、isNull、isNotNull。
セキュリティ
生の SQL はゼロ — AI は構造化クエリビルダーのみ
識別子の許可リスト — 正規表現+実データベース・メタデータの検証
デフォルト拒否 — 権限のないテーブルにはアクセス不可
ハードリミット — クエリあたり最大 1000 行、フィルター 20 個、IN 値 50 個、タイムアウト 30 秒
API キー+レート制限(キーごと)+全リクエストの監査ログ
読み取り専用 — 推奨:SQL Server のユーザーには
GRANT SELECTのみ付与DB パスワードは SQLite に AES-256-GCM 暗号化で保存
デプロイ
app-network ネットワーク上で、nginx をリバースプロキシ(ワイルドカード SSL、ノンバッファリング SSE、Web 向け MCP クライアントへの CORS)として併用し、Docker Compose でデプロイします。
VPS 間の移行
どの VPS でもコードと Docker はそのまま動作しますが、次の2点は Git に含まれません(.gitignore に記載済み)ので、手動で移行する必要があります。
移行対象 | 内容 | 手順 |
| 管理者の認証情報とシークレット | 旧VPSからファイルをコピーするか、 |
| SQLite(APIキー、権限、監査、DB接続情報) |
|
# Di VPS baru
git clone https://github.com/<username>/mcp-sqlserv.git && cd mcp-sqlserv
# Migrasi state dari VPS lama (opsional)
rsync -av vps-lama:/path/mcp-sqlserv/.env .env
rsync -av vps-lama:/path/mcp-sqlserv/data ./data
# Network eksternal harus ada dulu (dipakai docker-compose.yaml)
docker network create app-network # abaikan jika sudah ada
docker compose up -d --build
data/を移行しなくてもサーバーは動作します — Web UI から DB 接続、API キー、テーブル権限を再設定するだけです。
プロジェクト構成
mcp-sqlserv/
├── src/
│ ├── index.ts # Bootstrap Express + routing
│ ├── config.ts # Env config
│ ├── db/storage.ts # SQLite: api_keys, db_config, permissions, audit_log
│ ├── sqlserver/ # Connection pool, metadata (sys.tables), query builder
│ ├── mcp/ # MCP server (per-session) + tools
│ ├── oauth/ # OAuth 2.1: router, PKCE, discovery
│ ├── api/ # REST admin (auth, config, keys, permissions, audit)
│ └── ui/ # SPA vanilla JS (public/)
├── public/ # Web UI admin (tanpa build step)
├── test/ # Test suite keamanan + OAuth + smoke
├── Dockerfile # Multi-stage build (node:20-alpine)
├── docker-compose.yaml # Attach ke app-network, host.docker.internal
└── LICENSE # MIT管理用 REST API
Method | Path | 説明 |
POST |
| 管理者ログイン(httpOnly Cookie) |
GET |
| DB ・キー・権限のステータス |
GET/PUT |
| DB 設定の読み取り / 保存 |
POST |
| 接続テスト |
GET/POST |
| API キーの一覧 / 作成 |
PUT/DELETE |
| 名前変更 / 失効 |
GET/PUT |
| テーブル権限の一覧 / 保存 |
GET |
| 監査ログ |
GET |
| MCP URL の情報 + 設定例 |
GET |
| ヘルスチェック(認証不要) |
テスト
npm run test:smoke # smoke test dasar
npm run test:security # 29 test: injection, permission, limit, pagination, auth
npm run test:oauth # 46 test: discovery, DCR, PKCE, consent, token, refresh, revoketest/oauth.mjs は ポート4100 でサーバーを自ら起動します(データディレクトリは oauth-test-data/)。追加の設定は不要です。
コントリビューション
コントリビューション歓迎です! Issue または Pull Request を開いてください。大きな変更の場合は、まず Issue でご相談ください。このプロダクトの原則は security is the product です — すべてのインターフェース(MCP、UI、Agent テスト)で、読み取り専用、デフォルト拒否、パラメータ化という、同じ基準が維持 される必要があります。
ライセンス
このプロジェクトは MIT License の下で提供されています。
Related MCP Connectors
Guard AI agents' PostgreSQL/MySQL access via MCP: SQL audit, auth, masking, write approval
Safe, read-only Postgres and MySQL access for AI agents. Audit log + column-level controls.
Query your org's data in natural language — read-only MCP access to SQL, NoSQL, files & warehouses.
Query your warehouse or a CSV with Claude/ChatGPT over MCP, governed by table-level ACL + audit.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI agents to securely connect to and query Microsoft SQL Server databases with read-only access, schema discovery, and relationship mapping. Features advanced security protections, health monitoring, and bulk operations for production environments.963 npmMIT
- AlicenseBqualityDmaintenanceAn MCP server that connects AI assistants to Microsoft SQL Server databases, enabling schema exploration and read-only queries safely.4912 npm4MIT
- AlicenseNot gradedqualityCmaintenanceProvides read-only Microsoft SQL Server database access to AI agents with row-level security, enabling SELECT queries, table metadata, and schema introspection through MCP.15 npmMIT
- AlicenseNot gradedqualityCmaintenanceA read-only MCP server for Microsoft SQL Server that enables AI agents to safely explore and query SQL Server databases.804 npmMIT