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.tablessys.columns)に対して検証されます。

  • 値は常に bind parameterSQLインジェクションは構造的に不可能です。

  • テーブル単位の権限は デフォルト拒否:明示的な権限がなければ、そのテーブルには触れられません。

  • すべてのリクエストは監査ログに記録され、キー、ツール、フィルタ、行数、所要時間、ステータスも残ります。

Related MCP server: safedb-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 settingsOAuth 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% バインドパラメータです。

サポートされる構造化フィルター:eqneqltltegtgtelikestartsWithendsWithinbetweenisNullisNotNull

セキュリティ

  • 生の 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 の下で提供されています。

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

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
    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
    75
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Secure MCP server for safe, read-only DB access by AI agents, with SQL guardrails, table allowlists, PII masking, and audit logs
    6
    34
    7
    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
    23
    4
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to connect to Microsoft SQL Server via the MCP protocol, supporting database schema queries, data reading, and arbitrary SQL execution.

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/Fattan-malva/mcp-sqlserver'

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