Skip to main content
Glama
Fattan-malva

mcp-sqlserv

by Fattan-malva

mcp-sqlserv

SQL Server データベースへの読み取り専用アクセスを提供するMCPサーバー — SQLインジェクションを構造的に防止し、Web Admin UI から管理。

License: MIT Node TypeScript Docker MCP Tests

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

エンドポイント /mcp、HTTP 経由で全ての MCP クライアントと互換

マルチプロジェクト

プロジェクトごとの URL /mcp/<projectId>、ストレージと権限は分離

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 リクエスト/分(設定可能)

完全な読み取り専用

ツールは SELECT を生成するのみ。書き込み経路は一切存在しない

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 にあります。

環境変数

変数

デフォルト

説明

PORT

4000

サーバーのポート

DATA_DIR

./data

SQLite 用フォルダ(compose ではボリュームにマウント)

ADMIN_USER

admin

Web Admin UI のユーザー

ADMIN_PASSWORD

必須

Web Admin UI のパスワード(8文字以上)

SESSION_SECRET

自動

JWT / 暗号化シークレット(空の場合は自動生成・保存)

QUERY_TIMEOUT_MS

30000

SQL クエリのタイムアウト

RATE_LIMIT_PER_MIN

60

API キーごとのレート制限

OAUTH_ENABLED

1

0 で OAuth を無効化

OAUTH_CODE_TTL_S

600

認可コードの有効期限(秒)

OAUTH_ACCESS_TTL_S

3600

アクセスト-クンの有効期限(秒)

OAUTH_REFRESH_TTL_S

2592000

リフレッシューントークンの有効期限(秒、30日)

利用フロー

  1. Web UI にログイン → DB接続 メニュー → host/port/user/pass/database を入力し、接続テスト を実行します。

    Docker コンテナの場合、ホスト上の SQL Server は host.docker.internal から利用できます。

  2. API キー メニュー → キーを作成(表示は一度だけです。必ず保存してください)。

  3. テーブル権限 メニュー → AI に読み取りを許可するテーブルにチェック → 権限を保存。デフォルトは拒否です。

  4. 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)

  1. Customize → Connectors → Add custom connector を開きます。

  2. Remote MCP server URL: https://<domain>/mcp を設定します。

  3. Advanced settings → OAuth Client ID + Secret を、OAuth Clients メニューから入力します (リダイレクト URI: https://claude.ai/api/mcp/auth_callback)。

    空のままでも構いません — Claude が Dynamic Client Registration(RFC 759120)により自動登録します。

  4. Add → Connect をクリック → ブラウザでオペレーターのログインページが開きます → アクセスを許可 します。

  5. 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-port

OAuth エンドポイント

エンドポイント

標準

GET /.well-known/resource

RFC 9728

GET /.well-known/oauth-authorization-server

RFC 8414

POST /oauth/register

RFC 7591(DCR、public + confidential)

GET /oauth/authorize(オペレーターログイン+同意)

RFC 6749 + PKCE S256

POST /oauth/tokenRequest(コード交換+リフレッシュローテーション)

RFC 6749 / 7636

POST /oauth/revoke

RFC 7009

OAuth のアイデンティティはオペレーターのセッションです。アクセストークンは内部 API キー oauth:<client_id> に対応します。アクセストークンは内部 API キー oauth:<client_id> に対応します。テーブル権限、レート制限、監査も Claude 経由の接続にすべて適用されます。クライアントを失効させると、そのクライアントの全トークンが直ちに無効になります。

MCP ツール

ツール

機能

list_tables

許可されたテーブルと推定行数を一覧表示

get_table_schema

カラム、型、 null値、identity、主キー、インデックスを取得

read_records

構造化フィルタ、並べ替え、ページネーションを使用して行を読み取る

count_records

オプションのフィルタで行数をカウント

get_record_by_pk

主キーで 1 行を取得

server_info

サーバー / データベースの情報

テーブル名はスキーマプレフィックスなしで指定します(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 に記載済み)ので、手動で移行する必要があります。

移行対象

内容

手順

.env

管理者の認証情報とシークレット

旧VPSからファイルをコピーするか、.env.example から新規作成

data/

SQLite(APIキー、権限、監査、DB接続情報)

rsync 等で旧 VPS のフォルダをコピー

# 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

/api/auth/login

管理者ログイン(httpOnly Cookie)

GET

/api/status

DB ・キー・権限のステータス

GET/PUT

/api/config

DB 設定の読み取り / 保存

POST

/api/config/test

接続テスト

GET/POST

/api/keys

API キーの一覧 / 作成

PUT/DELETE

/api/keys/:id

名前変更 / 失効

GET/PUT

/api/permissions

テーブル権限の一覧 / 保存

GET

/api/audit

監査ログ

GET

/api/connect

MCP URL の情報 + 設定例

GET

/healthz

ヘルスチェック(認証不要)

テスト

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, revoke

test/oauth.mjs は ポート4100 でサーバーを自ら起動します(データディレクトリは oauth-test-data/)。追加の設定は不要です。

コントリビューション

コントリビューション歓迎です! Issue または Pull Request を開いてください。大きな変更の場合は、まず Issue でご相談ください。このプロダクトの原則は security is the product です — すべてのインターフェース(MCP、UI、Agent テスト)で、読み取り専用、デフォルト拒否、パラメータ化という、同じ基準が維持 される必要があります。

ライセンス

このプロジェクトは MIT License の下で提供されています。

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    D
    maintenance
    Enables 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.
    9
    63 npm
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    An MCP server that connects AI assistants to Microsoft SQL Server databases, enabling schema exploration and read-only queries safely.
    49
    12 npm
    4
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides 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 npm
    MIT
  • A
    license
    Not graded
    quality
    C
    maintenance
    A read-only MCP server for Microsoft SQL Server that enables AI agents to safely explore and query SQL Server databases.
    804 npm
    MIT