MSSQL MCP Server について
MSSQL MCP Server は、公式 MCP Python SDK(FastMCP)上に構築された SQL Server 向け MCP サーバーで、データベース操作とビジネス分析を支援します。1 つのサーバーで複数の接続を扱え、接続ごとに読み取り専用、タイムアウト、行数上限、書き込み確認を個別に設定できます。
主な機能
- 01複数のデータベース接続を各ツールで選択
- 02構造化された列と行を返す読み取りクエリ
- 03ストアドプロシージャの一覧表示と複数結果セットの実行
- 04リソーステンプレートによるオンデマンドのテーブル構造提供
- 05SQL の静的検証、読み取り専用モード、行数制限
活用シーン
- 01AI アシスタントによる SQL Server データの照会とインサイトの作成
- 02本番データベースへの読み取り専用アクセスの提供
- 03SQL 作成時のテーブル構造の確認
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
MSSQL MCP サーバー
概要
MSSQL MCP サーバーは、データベースとのやり取りとビジネスインテリジェンス機能を提供します。このサーバーを使うと、SQL クエリの実行、ビジネスデータの分析、ビジネスインサイトメモの自動生成ができます。
MSSQL に適応させるための変更については、公式ウェブサイトの SQLite を参照してください。
公式 MCP Python SDK(FastMCP)を基盤とし、構造化ツール出力(structuredContent)、ツールアノテーション、リソーステンプレート、エリシテーションベースの書き込み確認に対応する MCP 2025-06-18 仕様をサポートしています。
主な機能:
- マルチデータベース — dev/staging/prod の接続を1つのサーバーにマウントできます。各ツールには省略可能な
databaseパラメーターがあり、各接続はそれぞれ独自のreadonly/query_timeout/max_rows/confirm_writes設定を持ちます - ストアドプロシージャ — シグネチャの一覧表示と、すべての複数結果セットを取得するプロシージャの実行に対応します
- リソーステンプレート —
schema://{database}/{schema}/{table}は必要に応じてテーブル構造を提供し、毎回のツールスキーマのトークン消費を抑えます - 安全対策 — SQL の許可リスト、読み取り専用モード、行数制限、クエリタイムアウト、書き込み前の任意のエリシテーション確認
コンポーネント
read_query- 構造化出力(列/行/行数/切り捨て)を伴う SELECT/WITH クエリを、
max_rowsの制限内で実行します
- 構造化出力(列/行/行数/切り捨て)を伴う SELECT/WITH クエリを、
write_query- INSERT、UPDATE、DELETE、または MERGE クエリを実行し、影響を受けた行数を返します
create_table- データベースに新しいテーブルを作成します
list_tables- データベース内のすべてのテーブル(スキーマ名+テーブル名)の一覧を取得します
list_views- データベース内のすべてのビューの一覧を取得します
describe_table- 特定のテーブルの完全なスキーマ(型、NULL 許容、デフォルト値、主キー、ID 列、外部キー、インデックス)を表示します
list_databases- 設定済みのデータベース接続(名前、読み取り専用、デフォルトかどうか)を一覧表示します
list_procedures- パラメーターのシグネチャとともにストアドプロシージャを一覧表示します
execute_procedure- ストアドプロシージャを実行します(複数の結果セットに対応)
append_insight- メモリソースに新しいビジネスインサイトを追加します
リソース
memo://insights—append_insightによってリアルタイムで更新される、継続的なビジネスインサイトメモschema://{schema}/{table}— デフォルトデータベースのテーブル構造(JSON:列/主キー/ID 列/外部キー/インデックス)schema://{database}/{schema}/{table}— 名前付きデータベース接続のテーブル構造
リソーステンプレートは必要に応じて取得されます。ツールスキーマとは異なり、毎回 LLM に再送信されないため、長い会話でも簡潔さを保てます。
セキュリティ
すべての SQL は、実行前に静的検証を通過します。
-
read_queryは単一の SELECT / WITH ステートメントのみを受け付け、書き込みや EXEC のキーワードを拒否します(例:WITH c AS (...) DELETE FROM tをブロックします) -
write_queryはホワイトリストを使用します(INSERT / UPDATE / DELETE / MERGE のみ)。EXEC、DROP、TRUNCATE、ALTERは拒否されます -
複数ステートメントを含むバッチ(
;で区切られたもの)は拒否されます -
trusted_connection: trueにすると、Windows 統合認証に切り替わります(接続文字列ではTrusted_Connection=yesが使用され、ユーザー名/パスワードは不要です)。falseの場合は、設定済みの SQL アカウントのログイン情報を使用します -
readonly: trueにすると、ストアドプロシージャを含むすべての書き込み操作が無効になります(ストアドプロシージャは書き込みを行う可能性のあるブラックボックスです) -
ストアドプロシージャ名は、
{CALL ...}に埋め込む前に、1~3 個のドット区切り識別子であることを厳密に検証します -
結果は
max_rows行で切り詰められます。クエリはquery_timeout秒経過後に中止されます -
confirm_writes: trueの場合、状態を変更するすべての操作(write_queryによる書き込み、create_table、execute_procedure)では、MCP エリシテーションを通じてユーザーに確認を求めます⚠️ 重要な制限:確認には、クライアントが MCP エリシテーションプロトコルを実装している必要があります。エリシテーションに対応していないクライアント(例:TraeWork / Cursor ...)では確認がスキップされ、書き込みが直接実行されます。つまり、そのようなクライアントでは
confirm_writes: trueによる保護は機能しません(スキップの警告はサーバー側でログに記録されます)。すべてのクライアントで確実に書き込みを保護するには、代わりにreadonly: trueを使用してください(クライアントの機能にかかわらず、すべての書き込みを確実にブロックします) -
コメントと文字列リテラルは検証前に取り除かれるため、チェックの回避には利用できません
デモ
データベースのテーブルは次のとおりです。列名は標準化されていませんが、AI が自動で対応付けます。SQL 実行中のエラーは自動的に修正されます。

以下はデモです。

動作環境
Python 3.10+パッケージ- pyodbc>=4.0.39
- pydantic>=2.0.0
- mcp>=1.9.0,<2.0.0
SQL Server 用 ODBC Driver 17 / 18
使用方法
パッケージのインストール
ソースから:
git clone <this repo>
CD /d ~/mssql-mcp
pip install -r requirements.txt
またはパッケージとして(pip >= 21.3):
pip install .
config
config.json を作成します。単一データベース形式:
{
"database": {
"driver": "ODBC Driver 17 for SQL Server",
"server": "server ip",
"database": "db name",
"username": "username",
"password": "password",
"trusted_connection": false,
"readonly": false,
"query_timeout": 30,
"max_rows": 200,
"confirm_writes": false
},
"server": {
"name": "mssql-manager",
"version": "0.2.0"
}
}
複数データベース形式(推奨 — 接続ごとに独立した設定を使用できます。たとえば、prod を読み取り専用にできます):
{
"databases": {
"default": { "server": "localhost", "database": "dev_db", "...": "..." },
"prod": { "server": "10.0.0.5", "database": "prod_db", "readonly": true, "...": "..." }
},
"default_database": "default",
"server": { "name": "mssql-manager", "version": "0.2.0" }
}
接続名とデフォルト接続:databases 内のキーが接続名です。LLM は接続を切り替える際に、いずれかのキーを database パラメーターとして渡します。キー名は任意です(いずれかを default とする必要はありません)。default_database は、database が渡されなかった場合に使用する接続を決定します。解決順序は次のとおりです。
default_database: "xxx"が明示的に設定されている場合は、xxxという名前の接続を使用します- それ以外の場合、
defaultという名前の接続が存在すれば、それを使用します - それ以外の場合は、辞書内の最初の接続を使用します
推奨:default_database を明示的に設定し、さらに default という名前の接続も用意して安全策とします。これにより、(反復順序で先頭になる可能性がある)新しい接続を追加しても、デフォルトが意図せず変わることはありません。
設定ファイルの検索順序:MSSQL_MCP_CONFIG 環境変数 → server.py と同じ場所の config.json → 作業ディレクトリ内の config.json。
任意のフィールド(接続ごと):
| フィールド | デフォルト | 説明 |
|---|---|---|
readonly | false | 読み取り専用モード:すべての書き込み操作(プロシージャを含む)をブロックします |
query_timeout | 30 | クエリのタイムアウト(秒) |
max_rows | 200 | 結果セットあたりの最大行数。超過分の行は切り捨てられます |
confirm_writes | false | すべての状態変更操作(書き込み/CREATE TABLE/プロシージャ)の前に、ユーザーの確認(エリシテーション)を求めます。クライアントが Elicitation に対応している必要があります。未対応のクライアント(例:TraeWork/Cursor)では直接実行されます。確実に保護するには readonly を使用してください |
encrypt | (なし) | Driver 18 用の ODBC 暗号化(true/false) |
trust_server_certificate | false | 自己署名証明書を信頼します。Driver 18 で役立ちます |
環境変数:
| 変数 | デフォルト | 説明 |
|---|---|---|
MSSQL_MCP_CONFIG | (なし) | 代替設定ファイルのパス |
MSSQL_MCP_LOG_LEVEL | INFO | ログレベル(DEBUG/INFO/WARNING/ERROR) |
クライアントの設定(Claude Desktop/Cursor/Windsurf など)
一般的な stdio クライアント(Claude Desktop、Cursor、Windsurf、Cline など)は、共通の mcpServers JSON 形式を使用します。Claude Desktop を例に説明します。他のクライアントでは、同じエントリーを各クライアントの MCP 設定ファイルに追加してください。
# add to claude_desktop_config.json. Note:use your path
{
"mcpServers": {
"mssql": {
"command": "python",
"args": [
# your path,e.g.:"C:\\mssql-mcp\\src\\server.py"
"~/server.py"
]
}
}
}
パッケージとしてインストールした場合、コマンドは引数なしの mssql-mcp だけで実行できます。
MCP Inspector
# Note:use your path
npx -y @modelcontextprotocol/inspector python C:\\mssql-mcp\\src\\server.py
テストの実行
pip install pytest
python -m pytest tests -q
tests/test_validation.py— SQL/プロシージャ名の検証(データベースは不要)tests/test_config.py— 設定の解析:従来の単一データベースとの互換性、複数データベース、エラーケース(データベースは不要)tests/test_integration.py—src/config.json内のデータベースに対するエンドツーエンドテスト(書き込みは専用のmcp_upgrade_*テストオブジェクトのみを対象とし、自動的にクリーンアップされます)
プロジェクト構成
mssql-mcp
├── .git
├── .gitignore
├── LICENSE
├── README.md
├── README_en.md
├── README_zh.md
├── imgs
│ ├── table.png
│ └── demo.gif
├── pyproject.toml (packaging: src/ is installed as the mssql_mcp package)
├── requirements.txt
├── src
│ ├── __init__.py
│ ├── config.json (gitignored, local database config)
│ └── server.py
└── tests
├── test_validation.py
├── test_config.py
└── test_integration.py
ライセンス
MIT ライセンス
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。