🚀 MSSQL MCP Server
MSSQL MCP Serverは、Microsoft SQL Serverデータベースへの包括的なアクセスを提供するModel Context Protocol (MCP) サーバーです。この強化されたサーバーにより、言語モデルは、標準化されたインターフェイスを通じて、データベーススキーマの調査、クエリの実行、データベースオブジェクトの管理、および高度なデータベース操作を行うことができます。
🚀 クイックスタート
MSSQL MCP Serverを使用することで、Microsoft SQL Serverデータベースへの包括的なアクセスが可能になります。以下のセクションでは、サーバーの機能、インストール方法、使用方法などについて詳しく説明します。
✨ 主な機能
完全なデータベーススキーマトラバーサル
- 23の包括的なデータベース管理ツール (基本操作の5つから拡張)
- 完全なデータベースオブジェクト階層探索 - テーブル、ビュー、ストアドプロシージャ、インデックス、スキーマ
- 高度なデータベースオブジェクト管理 - 作成、変更、削除操作
- インテリジェントなリソースアクセス - すべてのテーブルとビューをMCPリソースとして利用可能
- 大規模コンテンツの処理 - 完全なストアドプロシージャ (1400行以上) を切り捨てることなく取得
コア機能
- データベース接続: 柔軟な認証を使用してMSSQL Serverインスタンスに接続
- スキーマ調査: 完全なデータベースオブジェクトの探索と管理
- クエリ実行: SELECT、INSERT、UPDATE、DELETE、およびDDLクエリの実行
- ストアドプロシージャ管理: ストアドプロシージャの作成、変更、実行、および管理
- ビュー管理: ビューの作成、変更、削除、および説明
- インデックス管理: インデックスの作成、削除、および分析
- リソースアクセス: MCPリソースとしてテーブルおよびビューのデータを閲覧
- セキュリティ: 読み取り専用と書き込み操作が適切に分離され、検証されます
⚠️ エンジニアリングチーム向けの重要な使用ガイドライン
データベース制限
🔴 重要: 各MCPサーバーインスタンスは1つのデータベースに限定してください
- この強化されたMCPサーバーは、データベースごとに23のツールを作成します
- カーソルは、すべてのMCPサーバーで40のツール制限があります
- 複数のデータベースインスタンスを使用すると、カーソルのツール制限を超えます
- 複数のデータベースを使用する場合は、異なるプロジェクトで個別のMCPサーバーインスタンスを使用してください
大規模コンテンツの制限
⚠️ 重要: チャットコンテキスト内でのファイル操作はサポートされていません
- 大規模なストアドプロシージャ (1400行以上) は、チャット内で取得および表示できます
- ただし、トークン制限のため、MCPツールを介して大規模なコンテンツをファイルに保存することは信頼性が低いです
- 大量データ抽出の場合は: 直接データベースに接続するスタンドアロンのPythonスクリプトを使用してください
- 推奨アプローチ: チャットから小さなプロシージャをコピーして貼り付け、大きなものには外部スクリプトを使用してください
ツールの配布
- コアツール: 5つ (read_query、write_query、list_tables、describe_table、create_table)
- ストアドプロシージャ: 6つのツール (create、modify、delete、list、describe、execute、get_parameters)
- ビュー: 5つのツール (create、modify、delete、list、describe)
- インデックス: 4つのツール (create、delete、list、describe)
- スキーマ管理: 2つのツール (list_schemas、list_all_objects)
- 合計: 23のツール + すべてのデータベースオブジェクト操作をサポートする強化されたwrite_query
📦 インストール
前提条件
- Python 3.10以上
- SQL Server用のODBC Driver 17
- MSSQL Serverインスタンスへのアクセス
クイックセットアップ
-
プロジェクトディレクトリをクローンまたは作成します:
mkdir mcp-sqlserver && cd mcp-sqlserver
-
インストールスクリプトを実行します:
chmod +x install.sh
./install.sh
-
データベース接続を構成します:
cp env.example .env
手動インストール
-
仮想環境を作成します:
python3 -m venv venv
source venv/bin/activate
-
依存関係をインストールします:
pip install -r requirements.txt
-
ODBCドライバをインストールします (macOS):
brew tap microsoft/mssql-release
brew install msodbcsql17 mssql-tools
設定
データベースの設定を含む .env
ファイルを作成します:
MSSQL_DRIVER={ODBC Driver 17 for SQL Server}
MSSQL_SERVER=your-server-address
MSSQL_DATABASE=your-database-name
MSSQL_USER=your-username
MSSQL_PASSWORD=your-password
MSSQL_PORT=1433
TrustServerCertificate=yes
設定オプション
MSSQL_SERVER
: サーバーのホスト名またはIPアドレス (必須)
MSSQL_DATABASE
: 接続するデータベース名 (必須)
MSSQL_USER
: 認証用のユーザー名
MSSQL_PASSWORD
: 認証用のパスワード
MSSQL_PORT
: ポート番号 (デフォルト: 1433)
MSSQL_DRIVER
: ODBCドライバ名 (デフォルト: {ODBC Driver 17 for SQL Server})
TrustServerCertificate
: サーバー証明書を信頼する (デフォルト: yes)
Trusted_Connection
: Windows認証を使用する (デフォルト: no)
💻 使用例
MCPサーバーの理解
MCP (Model Context Protocol) サーバーは、AIアシスタントや言語モデルと連携するように設計されています。これらは、従来のWebサービスではなく、JSON-RPCプロトコルを使用してstdin/stdoutを介して通信します。
サーバーの起動
AIアシスタントとの統合の場合:
python3 src/server.py
サーバーが起動し、stdinでMCPプロトコルメッセージを待機します。これが、Claude DesktopなどのAIアシスタントやその他のMCPクライアントがサーバーと通信する方法です。
テストと開発の場合:
-
データベース接続をテストします:
python3 test_connection.py
-
サーバーの状態を確認します:
./status.sh
-
利用可能なテーブルを表示します:
利用可能なツール (合計23個)
強化されたサーバーは、包括的なデータベース管理ツールを提供します:
コアデータベース操作 (5つのツール)
read_query
- SELECTクエリを実行してデータを読み取ります
write_query
- INSERT、UPDATE、DELETE、およびDDLクエリを実行します
list_tables
- データベース内のすべてのテーブルをリストします
describe_table
- 特定のテーブルのスキーマ情報を取得します
create_table
- 新しいテーブルを作成します
ストアドプロシージャ管理 (6つのツール)
create_procedure
- 新しいストアドプロシージャを作成します
modify_procedure
- 既存のストアドプロシージャを変更します
delete_procedure
- ストアドプロシージャを削除します
list_procedures
- メタデータ付きですべてのストアドプロシージャをリストします
describe_procedure
- 完全なプロシージャ定義を取得します
execute_procedure
- パラメーターを指定してプロシージャを実行します
get_procedure_parameters
- 詳細なパラメーター情報を取得します
ビュー管理 (5つのツール)
create_view
- 新しいビューを作成します
modify_view
- 既存のビューを変更します
delete_view
- ビューを削除します
list_views
- データベース内のすべてのビューをリストします
describe_view
- ビューの定義とスキーマを取得します
インデックス管理 (4つのツール)
create_index
- 新しいインデックスを作成します
delete_index
- インデックスを削除します
list_indexes
- すべてのインデックスをリストします (オプションでテーブル指定)
describe_index
- 詳細なインデックス情報を取得します
スキーマ探索 (2つのツール)
list_schemas
- データベース内のすべてのスキーマをリストします
list_all_objects
- スキーマ別に整理されたすべてのデータベースオブジェクトをリストします
利用可能なリソース
テーブルとビューは両方とも、次のようなURIを持つMCPリソースとして公開されます:
mssql://table_name/data
- CSV形式でテーブルデータにアクセスします
mssql://view_name/data
- CSV形式でビューデータにアクセスします
リソースは、データの最初の100行をCSV形式で提供し、迅速なデータ探索を可能にします。
データベーススキーマトラバーサルの例
1. データベース構造の探索
# スキーマから始めます
list_schemas
# 特定のスキーマ内のすべてのオブジェクトを取得します
list_all_objects(schema_name: "dbo")
# または、すべてのスキーマのすべてのオブジェクトを取得します
list_all_objects()
2. テーブルの探索
# すべてのテーブルをリストします
list_tables
# 詳細なテーブル情報を取得します
describe_table(table_name: "YourTableName")
# MCPリソースとしてテーブルデータにアクセスします
# URI: mssql://YourTableName/data
3. ビューの管理
# すべてのビューをリストします
list_views
# ビューの定義を取得します
describe_view(view_name: "YourViewName")
# 新しいビューを作成します
create_view(view_script: "CREATE VIEW MyView AS SELECT * FROM MyTable WHERE Active = 1")
# MCPリソースとしてビューデータにアクセスします
# URI: mssql://YourViewName/data
4. ストアドプロシージャの操作
# すべてのプロシージャをリストします
list_procedures
# 完全なプロシージャ定義を取得します (wmPostPurchaseなどの大規模なプロシージャを処理します)
describe_procedure(procedure_name: "YourProcedureName")
# 大規模なプロシージャを分析用にファイルに保存します
write_file(file_path: "procedure_name.sql", content: "procedure_definition")
# パラメーターの詳細を取得します
get_procedure_parameters(procedure_name: "YourProcedureName")
# プロシージャを実行します
execute_procedure(procedure_name: "YourProcedureName", parameters: ["param1", "param2"])
5. インデックスの管理
# すべてのインデックスをリストします
list_indexes()
# 特定のテーブルのインデックスをリストします
list_indexes(table_name: "YourTableName")
# インデックスの詳細を取得します
describe_index(index_name: "IX_YourIndex", table_name: "YourTableName")
# 新しいインデックスを作成します
create_index(index_script: "CREATE INDEX IX_NewIndex ON MyTable (Column1, Column2)")
ストアドプロシージャ管理の例
シンプルなストアドプロシージャの作成
CREATE PROCEDURE GetEmployeeCount
AS
BEGIN
SELECT COUNT(*) AS TotalEmployees FROM Employees
END
パラメーター付きのストアドプロシージャの作成
CREATE PROCEDURE GetEmployeesByDepartment
@DepartmentId INT,
@MinSalary DECIMAL(10,2) = 0
AS
BEGIN
SELECT
EmployeeId,
FirstName,
LastName,
Salary,
DepartmentId
FROM Employees
WHERE DepartmentId = @DepartmentId
AND Salary >= @MinSalary
ORDER BY LastName, FirstName
END
出力パラメーター付きのストアドプロシージャの作成
CREATE PROCEDURE GetDepartmentStats
@DepartmentId INT,
@EmployeeCount INT OUTPUT,
@AverageSalary DECIMAL(10,2) OUTPUT
AS
BEGIN
SELECT
@EmployeeCount = COUNT(*),
@AverageSalary = AVG(Salary)
FROM Employees
WHERE DepartmentId = @DepartmentId
END
既存のストアドプロシージャの変更
ALTER PROCEDURE GetEmployeesByDepartment
@DepartmentId INT,
@MinSalary DECIMAL(10,2) = 0,
@MaxSalary DECIMAL(10,2) = 999999.99
AS
BEGIN
SELECT
EmployeeId,
FirstName,
LastName,
Salary,
DepartmentId,
HireDate
FROM Employees
WHERE DepartmentId = @DepartmentId
AND Salary BETWEEN @MinSalary AND @MaxSalary
ORDER BY Salary DESC, LastName, FirstName
END
大規模コンテンツの処理
動作原理
サーバーは、ストアドプロシージャなどの大規模なデータベースオブジェクトを効率的に処理します:
- 直接取得: SQL Serverから直接完全なコンテンツを取得します
- 切り捨てなし: サイズに関係なく、完全なプロシージャ定義を返します
- チャット表示: 大規模なプロシージャをチャットインターフェイス内で完全に表示できます
- メモリ効率: データベース接続ストリームを通じてコンテンツを処理します
使用例
# 大規模なプロシージャを説明します (完全な定義を取得します)
describe_procedure(procedure_name: "wmPostPurchase")
# 任意のサイズのプロシージャで動作します (1400行以上のプロシージャでテスト済み)
# コンテンツはチャットに表示され、閲覧およびコピー&ペースト操作が可能です
ファイル操作の制限
⚠️ 重要: 大規模なプロシージャはチャットで取得および表示できますが、トークン制限のため、MCPツールを介してファイルに保存することは信頼性が低いです。大量データ抽出の場合は:
- 小さなプロシージャ: チャットインターフェイスからコピーして貼り付けます
- 大きなプロシージャ: 直接データベースに接続するスタンドアロンのPythonスクリプトを使用します
- 大量操作: MCPコンテキスト外で専用の抽出スクリプトを作成します
AIアシスタントとの統合
Claude Desktop
このサーバーをClaude Desktopの設定に追加します:
{
"mcpServers": {
"mssql": {
"command": "python3",
"args": ["/path/to/mcp-sqlserver/src/server.py"],
"cwd": "/path/to/mcp-sqlserver",
"env": {
"MSSQL_SERVER": "your-server",
"MSSQL_DATABASE": "your-database",
"MSSQL_USER": "your-username",
"MSSQL_PASSWORD": "your-password"
}
}
}
}
その他のMCPクライアント
サーバーは標準のMCPプロトコルに従っており、準拠する任意のMCPクライアントと動作するはずです。
開発
プロジェクト構造
mcp-sqlserver/
├── src/
│ └── server.py # チャンキングシステムを備えた主要なMCPサーバー実装
├── tests/
│ └── test_server.py # 単体テスト
├── requirements.txt # Pythonの依存関係
├── .env # データベースの設定 (env.exampleから作成)
├── env.example # 設定テンプレート
├── install.sh # インストールスクリプト
├── start.sh # サーバーの起動スクリプト (開発用)
├── stop.sh # サーバーのシャットダウンスクリプト
├── status.sh # サーバーの状態スクリプト
└── README.md # このファイル
テスト
テストスイートを実行します:
python -m pytest tests/
データベース接続をテストします:
python3 test_connection.py
ロギング
サーバーはPythonのloggingモジュールを使用しています。src/server.py
の logging.basicConfig()
呼び出しを変更することで、ログレベルを設定できます。
セキュリティに関する考慮事項
- 認証: 常に強力なパスワードと安全な認証を使用してください
- ネットワーク: データベースサーバーが適切に保護されていることを確認してください
- 権限: ユーザーアカウントに必要なデータベース権限のみを付与してください
- SSL/TLS: 可能な場合は、暗号化された接続を使用してください
- クエリ検証: サーバーはクエリタイプを検証し、不正な操作を防止します
- DDL操作: データベースオブジェクトの作成/変更/削除操作は適切に検証されます
- ストアドプロシージャの実行: パラメーターは安全に処理され、インジェクション攻撃を防止します
- 大規模コンテンツの処理: 大規模なプロシージャは切り捨てることなく効率的に取得されます
- ファイル操作: 書き込み操作は検証され、サンドボックス化されます
- 読み取り優先アプローチ: 探索ツールは、デフォルトで読み取り専用であり、本番環境での安全性を確保します
トラブルシューティング
一般的な問題
- 接続失敗: データベースサーバーのアドレス、資格情報、およびネットワーク接続を確認してください
- ODBCドライバが見つからない: SQL Server用のMicrosoft ODBC Driver 17をインストールしてください
- アクセス拒否: データベースユーザーが適切な権限を持っていることを確認してください
- ポートの問題: 正しいポート番号とファイアウォール設定を確認してください
- 大規模コンテンツの問題: 大規模なプロシージャはチャットで表示できますが、MCPツールを介してファイルに保存することはできません
- メモリの問題: 大規模なプロシージャはデータベース接続によって効率的に処理されます
デバッグモード
src/server.py
でログレベルをDEBUGに設定することで、デバッグロギングを有効にします:
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
大規模コンテンツのトラブルシューティング
大規模コンテンツに問題が発生した場合は:
- コピー&ペーストアプローチ: チャットインターフェイスを使用して、大規模なプロシージャを表示およびコピーします
- 外部スクリプト: 大量データ抽出用のスタンドアロンのPythonスクリプトを作成します
- メモリを確認する: 大規模なプロシージャはデータベース接続によって効率的に処理されます
- 権限を確認する: データベースユーザーがプロシージャ定義にアクセスできることを確認します
- 小さなプロシージャでテストする: 最初に基本的な機能を検証します
ヘルプの取得
- サーバーログを確認して、詳細なエラーメッセージを確認します
.env
設定を検証します
- データベース接続を個別にテストします
- すべての依存関係が正しくインストールされていることを確認します
- 大規模コンテンツの問題の場合は、チャットからコピー&ペーストするか、外部抽出スクリプトを作成します
最近の機能強化
大規模コンテンツの処理 (最新)
- 大規模なストアドプロシージャを切り捨てることなく完全に取得できることを検証しました
wmPostPurchase
などのプロシージャ (1400行以上、57KB) で正常にテストされました
- 大規模なプロシージャはチャットインターフェイス内で完全に表示され、閲覧およびコピー&ペーストが可能です
- データベース接続ストリームによる効率的なメモリ管理
- 注意: トークン制限のため、MCPツールを介した大規模コンテンツのファイル操作は信頼性が低いです
完全なデータベースオブジェクト管理
- 包括的なデータベース管理ツールを5つから23つに拡張しました
- すべての主要なデータベースオブジェクトに対する完全なCRUD操作を追加しました
- SSMSの機能に匹敵するスキーマトラバーサル機能を実装しました
- テーブルとビューのMCPリソースアクセスを追加しました
- 適切な操作検証による強化されたセキュリティ
📄 ライセンス
このプロジェクトはオープンソースです。詳細については、ライセンスファイルを参照してください。
コントリビューション
コントリビューションは大歓迎です!バグや機能要求については、プルリクエストを送信したり、問題を開いたりしてください。