2025年8月8日金曜日

LM Studioでgpt-oss:120bを実行しSQLclのMCPサーバーを呼び出してデータベースに問い合わせる

人気のあるローカルLLMランタイムにOllamaLM Studioがあります。どちらもOpenAIが最近リリースしたオープンウェイトモデルgpt-oss:120bgpt-oss:20bに対応しています。

LM Studioでは、フロントエンドのアプリケーションにMCPサーバーを追加できます。本記事ではLM StudioにMCPサーバーとしてSQLclを追加し、ローカルLLMとしてgpt-oss:120bを実行して、データベースに自然言語で問い合わせを行ってみます。

作業環境はApple Macbook Pro(M4 128GB)です。LLMを動かすだけで70GB程度のメモリを使用します。gpt-oss:20bは20GB程度のメモリを使用します。双方ともMXFP4で量子化されたモデルが対象です。作業環境となるコンピュータにはあらかじめ、LM Studioとpodmanをインストールしておきます。

データベースについては、こちらの記事「Ollamaでgpt-oss:20bを実行しOpen WebUIからSQLclのMCPサーバーを呼び出す」のデータベースの準備で作成したコンテナsales-dbを使用します。Oracle Database 23ai Freeにsales_history(スキーマSH)のサンプル・データをインストールしています。また、サンプル・データにたいして読み込み権限しか持たないデータベース・ユーザーmcpuserが作成されています。

コンテナsales-dbを実行します。

podman start sales-db

% podman start sales-db

sales-db

% 


ローカルにインストールしているSQLclを使用してMCPサーバーを実行すると、VS Codeなどで使用しているデータベース接続もMCPサーバーから利用可能になります。

今回はMCPサーバー専用のSQLclをコンテナで実行します。Oracle Container RegistryよりSQLclのコンテナ・イメージを取得します。

podman pull container-registry.oracle.com/database/sqlcl:latest

% podman pull container-registry.oracle.com/database/sqlcl:latest                    

Trying to pull container-registry.oracle.com/database/sqlcl:latest...

Getting image source signatures

Copying blob sha256:868d7396c28bb01216fb0529ee04fa61b3f2d0abf397ccdb0a39acfb5ff45458

Copying blob sha256:698aee9470ef0d32633e2423dc3b5e16af1fbd10e5245a13145ece9984c96f26

Copying blob sha256:4bc021afff70ffc5b463d429bba763fc99220db548ac2cb8fba8d4df8c84a3c9

Copying blob sha256:806ed6d6ab84d056e19068db243c0cffdb0d9eae1c6f097e990f304ac1e7b55e

Copying blob sha256:22a33186b552e320dd6d69ee1c32b7cc24a0fb1fb0ca752b7a3af1f5c8af660f

Copying config sha256:e2b0fb8809c1033d352e2e6b484547e1766d7a59329b64a945cdaa112cf02feb

Writing manifest to image destination

e2b0fb8809c1033d352e2e6b484547e1766d7a59329b64a945cdaa112cf02feb

% 


SQLclを実行するコンテナを作成し実行します。コンテナを削除した後でも保存した接続を利用できるように、ボリュームとしてsqlcl-confを作成します。

podman volume create sqlcl-conf

% podman volume create sqlcl-conf

sqlcl-conf

% 


SQLclのコンテナを実行します。SQLclはrootで実行されているため、構成情報は/root以下に保存されます。そのため作成したボリュームsqlcl-conf/rootにマウントします。

podman run -it --rm -v sqlcl-conf:/root container-registry.oracle.com/database/sqlcl:latest

SQLclのプロンプトが返されます。

% podman run -it --rm -v sqlcl-conf:/root container-registry.oracle.com/database/sqlcl:latest



SQLcl: Release 25.2 Production on Thu Aug 14 00:19:39 2025


Copyright (c) 1982, 2025, Oracle.  All rights reserved.


SQL> 


コンテナsales-dbで実行されているデータベースへの接続を保存します。接続名はmydbとします。

conn -save mydb -savepwd mcpuser/mcpuser@host.containers.internal/freepdb1
exit


exitするとSQLclが終了するため、コンテナoracle-mcpも終了します。

SQL> conn -save mydb -savepwd mcpuser/mcpuser@host.containers.internal/freepdb1

Name: mydb

Connect String: host.containers.internal/freepdb1

User: mcpuser

Password: ******

Connected.

SQL> exit

Disconnected from Oracle Database 23ai Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.8.0.25.04

% 


SQLclのコンテナをMCPサーバーとして実行します。

podman run -it --rm -v sqlcl-conf:/root container-registry.oracle.com/database/sqlcl:latest \-mcp

% podman run -it --rm -v sqlcl-conf:/root container-registry.oracle.com/database/sqlcl:latest \-mcp

---------- MCP SERVER STARTUP ----------

MCP Server started successfully on Thu Aug 14 00:21:18 UTC 2025

Press Ctrl+C to stop the server

----------------------------------------

^C%                                                                             % 


MCPサーバーの起動を確認した後、CTRL+Cを入力してMCPサーバーを停止します。

LM Studioを起動し、Model SearchからOpenAI's gpt-oss 120BまたはOpenAI's gpt-oss 20Bをダウンロードします。


モデルのダウンドードが完了したらロードします。Context lengthはできるだけ大きい値にします。


チャットの入力フィールドの下にアイコンがプラグのボタンがあります。これをクリックしてツールの構成画面を開きます。


Installをクリックし、Edit mcp.jsonを実行します。


「MCPサーバーは便利だけど危険だよ、信頼できるMCPサーバーだけを追加してね」といった警告が表示されます。Got itをクリックします。


mcp.jsonとして以下を記述します。他のMCPサーバーが登録済みの場合は、sqlclの部分を追加します。
{
  "mcpServers": {
    "sqlcl": {
      "command": "podman",
      "args": [
        "run",
        "-i",
        "--rm",
        "-v",
        "sqlcl-conf:/root",
        "container-registry.oracle.com/database/sqlcl:latest",
        "-mcp"
      ]
    }
  }
}
ボタンSaveをクリックし、mcp.jsonを保存します。右側のパネルにSQLclのMCPサーバーが提供しているツールが一覧されます。


以上でLM StudioにOracle DatabaseのMCPサーバーが組み込まれました。

この後はLM Studioで新規にチャットを開始して、自由に質問します。

接続できるデータベースや接続できるユーザーは制限されています。データベースに対して可能な操作も、ほとんどSELECTのみになっています。また、ユーザーMCPUSERは表領域USERSに対してクオータを10Mバイトしか割り当てていないため、大量のデータをアップロードする、といったこともできません。

今回は適用していませんが、Oracle Databaseが持つResource Managerの機能を使うとCPUリソースなども制限できます。


保存した接続mydbでデータベースに接続して、sales_historyのサンプル・データに問い合わせを行いました。ツール呼び出しでできることを制限しているので、確認せずに実行しています。


原因は分かりませんが、同一のチャット・セッションで複数のMCPサーバーを起動することがあります。podman psで確認すると複数のコンテナが起動していることが確認できます。

% podman ps

CONTAINER ID  IMAGE                                                COMMAND               CREATED             STATUS                        PORTS                   NAMES

bcb0a1128f1c  container-registry.oracle.com/database/free:latest   /bin/bash -c $ORA...  6 days ago          Up 53 minutes (starting)      0.0.0.0:1521->1521/tcp  sales-db

daed7448bd6e  container-registry.oracle.com/database/sqlcl:latest  -mcp                  5 minutes ago       Up 5 minutes (starting)                               recursing_merkle

c0906bc6e011  container-registry.oracle.com/database/sqlcl:latest  -mcp                  About a minute ago  Up About a minute (starting)                          jolly_wilbur

6af5fa922d4d  container-registry.oracle.com/database/sqlcl:latest  -mcp                  About a minute ago  Up About a minute (starting)                          eloquent_hermann

0d60beb81ecc  container-registry.oracle.com/database/sqlcl:latest  -mcp                  27 seconds ago      Up 28 seconds (starting)                              infallible_newton

5d06b37f7675  container-registry.oracle.com/database/sqlcl:latest  -mcp                  6 seconds ago       Up 7 seconds (starting)                               serene_bassi

90c5a4b64fe0  container-registry.oracle.com/database/sqlcl:latest  -mcp                  5 seconds ago       Up 6 seconds (starting)                               boring_brahmagupta

% 


同じMCPサーバーをClaude Desktopに登録して実行すると、Claude Desktopでは同一チャットであれば、一旦起動したMCPサーバーは再利用するようで、MCPサーバーが増える事象は発生しません。その点ではLM Studioに問題があるようですが、Claude Desktopでも新しいチャットを開始するとMCPサーバーは増えるし、Claude Desktopを終了しても、SQLclのMCPサーバーは終了しないように見えます。

LM StudioとSQLclのどちらにも問題がありそうで、まだまだ実装に改善の余地があるように思います。

podmanであれば以下のスクリプトで、実行中のコンテナをすべて停止できます。--rmオプションが付けられているので、コンテナは停止すると削除されます。
#!/bin/sh

podman ps --format "{{.ID}}" --filter ancestor=container-registry.oracle.com/database/sqlcl:latest > stop-sqlcl-list
while read i
do
    podman stop $i
done < stop-sqlcl-list
今回の記事は以上になります。