2025年4月1日火曜日

ChainlitのアプリケーションにOracle Databaseに問い合わせるMCPサーバーを組み込み質問する

Microsoftから公開されているMCPを扱うChainlitのサンプル・アプリケーションに(こちらの記事を参照のこと)、以前の記事「Oracle Databaseに接続するMCPサーバーを作成しClaudeから問い合わせる」で作成したOracle Databaseに問い合わせるMCPサーバーを組み込み、Chainlitのアプリから質問してみます。

Oracle DatabaseのMCPサーバーを組み込んで、問合せを行なっています。


ChainlitのアプリケーションにOracle Databaseに問い合わせるMCPサーバーを登録します。


Claude DesktopのときはMCPのcommandとしてnodeを指定しましたが、Chainlitのサンプル・アプリケーションで許可されているコマンドはnpxまたはuvxです。そのため、NameOracle Databaseとして、Commandに以下を指定します。index.jsへのパスやURLに含まれるAPEXワークスペース名(以下ではapexdev)、スキーマ名(wksp_apexdev)は環境に合わせて変更します。

npx node /Users/username/Documents/oracle-server/build/index.js http://localhost:8181/ords/apexdev/_/sql wksp_apexdev [パスワード]

確認をクリックして、MCPサーバーを追加します。


MCPサーバーとしてOracle Databaseが追加されます。


MCPサーバーが追加されたので、これからチャットを始めます。

(gpt-4o-miniは今ひとつだったので、環境変数OPENAI_MODELにgpt-4oを設定しています。)

「Oracle Databaseから参照できる表を一覧してください。」

ビューUSER_TABLESを検索し、接続先のスキーマにある表が一覧されます。


「EBAで始まる表の列情報を参照してください。」

ビューUSER_TAB_COLUMNSを検索して、それぞれの表の列を一覧します。


「これらの情報より、アジアで一番人口の少ない国を調べてください。」

生成されたSQLは以下です。
SELECT c.NAME, c.POPULATION FROM EBA_COUNTRIES c JOIN EBA_COUNTRY_REGIONS r ON c.REGION_ID = r.ID WHERE r.NAME = 'Asia' ORDER BY c.POPULATION ASC FETCH FIRST 1 ROW ONLY;


「アジアに含まれる国を、人口の多い順番でリストして。」
SELECT c.NAME, c.POPULATION FROM EBA_COUNTRIES c JOIN EBA_COUNTRY_REGIONS r ON c.REGION_ID = r.ID WHERE r.NAME = 'Asia' ORDER BY c.POPULATION DESC;

Claude DesktopにOracle DatabaseのMCPサーバーを組み込んだときは、Claudeが勝手にスキーマのメタデータやデータそのものを読み出して推論に使っていましたが、このサンプル・アプリケーションはそのようには動かず、チャットの最初に表や列情報を取り出しておく必要がありました。そのようにすれば、その情報を使ってSELECT文が生成されます。

とりあえず、OpenAIとOracle DatabaseのMCPサーバーの組み合わせで動作することが確認できました。