Oracle DB公式のMCPサーバ (SQLcl) をChainlitで作ったチャットアプリ経由で使ってみました。
VS Codeなどのクライアントアプリと連携させる内容はよく見かけるため、せっかくならWebアプリと連携させよう、ということで試した次第です。
検証環境
OCI上に構築したComputeインスタンスで動かしました。
接続先のDBですが、オンプレでの活用を想定し、OUIで手動インストールする19c (19.26) のSingle構成のDBを対象にしました。
Oracle DBとSQLclのMCPサーバ、Chainlitはすべて同じComputeインスタンス上で稼働させました。
SQLclインストール
MCPサーバ対応バージョンのSQLclをダウンロードします。
curl -OL https://download.oracle.com/otn_software/java/sqldeveloper/sqlcl-25.2.2.199.0918.zip
unzip sqlcl-25.2.2.199.0918.zip
SQLcl稼働要件としてJava 11以上が必要なため、今回はJava 17をインストールします。
## Java 17インストール
dnf install java-17-openjdk
## デフォルトをJava 17に切り替え
alternatives --config java
## JAVA_HOMEに設定するパスを確認
alternatives --display java | grep link | sed -E 's/^.+\s(\S+)\/bin\/java(\s.+)?$/\1/g'
## bashプロファイルに対してJAVA_HOMEを設定
サンプルスキーマのインストール
自然言語で問い合わせる対象データが必要ですので、今回はサンプルスキーマのSHを導入しました。
## 最新のサンプルスキーマをダウンロード
wget https://github.com/oracle-samples/db-sample-schemas/archive/refs/tags/v23.3.zip
unzip v23.3.zip
## SHスキーマをインストール
$ sql system/Ora_DB4U@orclpdb
SQL> @sh_install.sql
SQLclがMCPサーバモードで使う接続情報を保存
MCPサーバとして起動したSQLclはDBへ接続してNL2SQL処理を行いますが、DBへ接続するためには事前に接続情報を保存しておく必要があります。
## SQLcl起動
$ /home/oracle/sqlcl/bin/sql
## 19cのSingle DBに対する接続情報を保存
SQL> conn -save chainlit_mcp -savepwd SH/SH@//localhost:1521/orclpdb
Chainlitのセットアップ
ここからChainlitのセットアップ作業になります。
uvによるPython仮想環境の作成
今回はuvでPython仮想環境を構築しました。
まずはuvをインストールします。
curl -LsSf https://astral.sh/uv/install.sh | sh
Python仮想環境をつくります。
パッケージ管理に oramcp
ディレクトリを新規作成しています。
uv init oramcp -p 3.13
cd oramcp
## 仮想環境の初期化
uv venv
## oramcp仮想環境のアクティベート
source .venv/bin/activate
必要なPythonパッケージをインストールします。
uv add python-dotenv langchain langchain-community langchain_openai sentence-transformers
uv add "chainlit==2.7.1.1"
# インストールされたパッケージを確認
uv pip list
Chainlitへ外部接続するためのファイアウォール設定
Chainlitで起動したアプリに外部から接続できるよう、ファイアウォールを設定します。
sudo su -
# http通信を許可
firewall-cmd --add-service=http
# 80ポートへの通信を8000にフォワード
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8000
# 設定保存
firewall-cmd --runtime-to-permanent
# 設定リロード
firewall-cmd --reload
# 内容確認
firewall-cmd --list-all
ChainlitにMCPサーバを接続するための設定
ChainlitとMCPサーバを連携させるにあたり npx
もしくは uvx
が必要です。
今回は npx
を使いました。
なお本セクションの作業にあたり、下記サイトを参考にさせて頂きました。
まずは npx
をバンドルする npm
をインストールします。
dnf -y install npm
次に npx
からSQLclをMCPサーバとして起動するためのシェルスクリプトを用意します。
今回は ~/sqlcl-mcp
配下にスクリプトを配置しました。
cd
mkdir sqlcl-mcp
sqlcl-mcp.sh
というファイル名で以下スクリプトを保存します。
#!/bin/sh
/home/oracle/sqlcl/bin/sql -mcp
作成したシェルスクリプトに実行権限を付与します。
chmod 755 sqlcl-mcp.sh
このスクリプトを npx
経由で実行するために、 npx
用の package.json
というファイルを用意します。
以下内容を package.json
というファイル名で保存します。
{
"name": "sqlcl-mcp",
"version": "1.0.0",
"bin": {
"run-sqlcl-mcp": "./sqlcl-mcp.sh"
}
}
アプリ用コードの準備
Chainlitを使ったチャットアプリのコードは、以下にて公開されているサンプルコード app.py
を利用させて頂きました。
こちらのコードはAzure OpenAIを使っていますが、OpenAIを使うように修正しました。
まず openai
パッケージからimportするメソッドを以下の通り変更しました。
from openai import OpenAI, AsyncOpenAI
dotenv
で読み込む環境ファイル名を以下の通り変更しました。
load_dotenv("openai.env")
次に ChatClient
クラスのコンストラクタを以下のように修正しました。
class ChatClient:
def __init__(self) -> None:
self.deployment_name = os.environ["OPENAI_MODEL"]
self.client = AsyncOpenAI(
api_key=os.environ["OPENAI_API_KEY"],
)
self.messages = []
self.system_prompt = SYSTEM_PROMPT
self.active_streams = [] # Track active response streams
最後に openai.env
ファイルを作成し、OPENAI_MODEL
と OPENAI_API_KEY
をご自身の値に設定します。
以上でセットアップ作業は完了です。
動かしてみる
Chainlitを起動して http://<your public ip>
にアクセスします。
chainlit run app.py
アクセスすると次の画面が表示されるので、赤枠のプラグボタンを選択します。
MCPサーバの情報を入力して「確認」を選択します。
Name
は任意の名前とし、 Command
には npx /home/oracle/sqlcl-mcp run-sqlcl-mcp
と入力します。
問題なければ右上に MCP added!
と表示され、 My MCPs
に追加されます。
それでは実際に使ってみます。
使えるMCPサーバの一覧を表示させ、その中から接続するMCPサーバを指定します。
問題なくDB接続できたら、SHスキーマのテーブル情報を確認してみます。
PRODUCTS
表について聞いてみます。
最後の結果は「5件みせて」という依頼に対して、なぜか3件となっていました。。
まとめ
以上、Webアプリ経由でOracle DB公式MCPサーバを活用する簡単な動作検証でした。
SQLclのMCPサーバを使えば、オンプレのOracle DBもクラウド化せずにNL2SQL実装ができますね。
さらにオンプレで社内LLMを稼働させれば、データを一切外に出さずNL2SQLが使えます。
外に出せない機密データを対象として、普段SQLを書かないIT部門以外の方でも自然言語でデータ利活用できそうです。
データ民主化を実現する一つの方法として、検討してみてはいかがでしょうか。
ちなみにセルフで稼働させたローカルLLMとChainlitによるチャットアプリは、ご参考までに以下記事で試しています。
また今回はSQLclをほぼMCPサーバとしてのみ利用していますが、SQLcl自体もOracle DBクライアントとして優れたツールです。
具体的な便利機能を個人ブログの方で記事にしてますので、よければご参照ください。
Oracle Database向けクライアントの新しい定番?SQLclがどれくらい便利なのか確認してみた