9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Oracle DB公式のMCPサーバ (SQLcl) をチャットアプリ (Chainlit) 経由で使ってみた

Posted at

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_MODELOPENAI_API_KEY をご自身の値に設定します。
以上でセットアップ作業は完了です。

動かしてみる

Chainlitを起動して http://<your public ip> にアクセスします。

chainlit run app.py

アクセスすると次の画面が表示されるので、赤枠のプラグボタンを選択します。

2025-08-29 092105.png

MCPサーバの情報を入力して「確認」を選択します。
Name は任意の名前とし、 Command には npx /home/oracle/sqlcl-mcp run-sqlcl-mcp と入力します。

2025-08-29 092126.png

問題なければ右上に MCP added! と表示され、 My MCPs に追加されます。

2025-08-29 092137.png

それでは実際に使ってみます。
使えるMCPサーバの一覧を表示させ、その中から接続するMCPサーバを指定します。

2025-08-27 014333.png

問題なくDB接続できたら、SHスキーマのテーブル情報を確認してみます。

2025-08-27 014348.png

PRODUCTS 表について聞いてみます。

2025-08-27 014357.png

2025-08-27 014405.png

最後の結果は「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がどれくらい便利なのか確認してみた

9
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?