前の記事では、Oracle社が提供しているコマンドラインクライアント SQLcl のMCPサーバー機能を利用してClaude Desktopから自然言語でOracle Databaseの中のデータにアクセスしました。
Autonomous Database には、Select AI という自然言語で問い合わせることができる機能が搭載されているので、Claude Desktopから自然言語でSelect AI経由のデータベースアクセスも試してみようと思います。
ですが、Claude Desktopなどから SELECT AI にアクセスするための公式ツールは提供されていません。
なので、FastMCP を使って、簡単な Claude Desktop用のMCPサーバーを作成してみます。
事前準備
まずはSelect AIを使えるようにするための準備をします。
HRユーザーへSELECT AIを使うための権限を追加
前の記事で、例として挙げられていた HR
ユーザーで SELECT AI を使えるようにします。
1 2 3 |
-- 権限追加 GRANT EXECUTE ON DBMS_CLOUD TO HR; GRANT EXECUTE ON DBMS_CLOUD_AI TO HR; |
HR ユーザーで SELECT AIを使うためのクレデンシャルとプロファイルの登録
これ以降からは HR
ユーザーで作業します。
まずは、クレデンシャルの登録をします。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
-- クレデンシャル登録 BEGIN DBMS_CLOUD.CREATE_CREDENTIAL( credential_name => 'OCI_HR_SAMPLE', user_ocid => 'ocid1.user.oc1..axxxxxxxxxxxxxxxxq', tenancy_ocid => 'ocid1.tenancy.oc1..aaxxxxxxxxxxxxa', private_key => '-----BEGIN PRIVATE KEY----- MIIEvAIBADANBgkqhkiGQEFA<中略>1D3iheu1ct50SB0aIQz9Ow== -----END PRIVATE KEY-----', fingerprint => 'xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx' ); END; / |
次に上記のクレデンシャルを利用して動くSELECT AI のプロファイルを作成します。
対象となるテーブル7個 をオブジェクトのリストに追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
-- Profile の作成 BEGIN DBMS_CLOUD_AI.CREATE_PROFILE( 'GENAI_COHERE_COMMAND_R', '{ "provider": "oci", "credential_name": "OCI_HR_SAMPLE", "model":"cohere.command-r-08-2024", "oci_apiformat":"COHERE", "region": "ap-osaka-1", "object_list": [ {"owner": "HR", "name": "DEPARTMENTS"}, {"owner": "HR", "name": "EMPLOYEES"}, {"owner": "HR", "name": "JOBS"}, {"owner": "HR", "name": "JOB_HISTORY"}, {"owner": "HR", "name": "LOCATIONS"}, {"owner": "HR", "name": "REGIONS"} ] }' ); END; / |
SELECT AI の 動作テスト
登録した Profile をSELECT AIで使用するようにセットします。
1 2 |
-- Profile の設定 EXEC DBMS_CLOUD_AI.SET_PROFILE('GENAI_COHERE_COMMAND_R'); |
これで、SELECT AI を利用する準備が整ったので、試しに sqlcl
で質問したのとほぼ同じ質問をしてみます。
1 |
SELECT AI スキーマにあるテーブルを教えて |
実行結果は以下の通りになりました
1 2 3 4 5 6 7 8 9 10 11 12 13 |
SQL> SELECT AI スキーマにあるテーブルを教えて; TABLE_NAME ______________ REGIONS COUNTRIES LOCATIONS DEPARTMENTS JOBS EMPLOYEES JOB_HISTORY 7行が選択されました。 |
SELECT AI の動作が確認できました。
MCP サーバーの作成
Windows 上でPythonを動かすのに便利な uv のインストール等については省略します。
MCPサーバープロジェクト作成
Oracle DBへの接続ドライバとFastMCPを加えます。
1 2 3 |
cd C:\WORK_DIR\select_ai_mcp uv init --app uv add oracledb fastmcp |
MCPサーバーのコードの作成
FastMCPを使うと簡単にMCPサーバーを作成できるので、MCPクライアントから渡された文字列をSELECT AIに渡すだけなら特に難しい部分はありません。
実際に使う場合には、Autonomous Database への接続部分などは適宜修正してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
import oracledb from fastmcp import FastMCP # FastMCPサーバーを初期化 mcp = FastMCP("Oracle SELECT AI Server") # Oracle接続の初期化 def get_oracle_connection(): """Oracle Autonomous Databaseに接続""" return oracledb.connect( config_dir="C:\\oracle\\network\\admin", user="HR", password="HR_PASSWORD", dsn="DSN_NAME", wallet_location="C:\\oracle\\wallets\\WALLET_NAME", wallet_password="WALLET_PASSWORD" ) @mcp.tool def hr_data_query(query: str) -> str: """ Oracle Human Resources Sample Schema から従業員・組織・勤務データを自然言語で検索 利用可能なデータ: - 従業員情報 (employees, names, contact info, hire dates) - 職種・役職 (jobs, job titles, salary ranges) - 部署・組織 (departments, managers, locations) - 勤務履歴 (job history, promotions, transfers) - 地域・拠点 (countries, regions, locations, addresses) - 給与情報 (salaries, salary ranges by job) クエリ例: - "どの職種の従業員が一番多い?" - "給与が最も高い従業員は誰?" - "各部署の従業員数を教えて" - "最近入社した従業員を5人表示して" - "マネージャー職の人を全員表示して" - "アメリカにある拠点を教えて" Args: query: 人事データに関する自然言語での質問(日本語・英語対応) Returns: 検索結果をテーブル形式で表示 """ try: with get_oracle_connection() as connection: # 利用するProfile設定 with connection.cursor() as cursor_set_profile: cursor_set_profile.callproc("DBMS_CLOUD_AI.SET_PROFILE", ["GENAI_COHERE_COMMAND_R"]) # SELECT AIクエリを実行 with connection.cursor() as cursor: select_ai_sql = f"SELECT AI {query}" cursor.execute(select_ai_sql) results = cursor.fetchall() if results: # カラム名を取得 columns = [desc[0] for desc in cursor.description] # 結果を整形 result_text = f"カラム: {', '.join(columns)}\n\n" for row in results: result_text += " | ".join(str(val) for val in row) + "\n" return result_text.strip() else: return "結果が見つかりませんでした" except Exception as e: return f"クエリ実行エラー: {str(e)}" if __name__ == "__main__": mcp.run() |
Claude DesktopへのMCPサーバーの設定
claude_desktop_config.json を編集して、MCPサーバーを追加してClaude Desktopを再起動します。
1 2 3 4 5 6 7 8 9 10 11 |
"select_ai_mcp" : { "command" : "uv", "args" : [ "run", "--directory", "C:\\WORK_DIR\\select_ai_mcp\\", "main.py" ] } |
SELECT AI MCPサーバーの動作確認
それでは、まずテーブル一覧を得るために Claudeに Select AIに「スキーマにあるテーブルを教えて」と聞いて
と入力してみます
MCPサーバーの応答に加えて、Claudeが知っているMCPサーバーのDiscriptionに書いた情報も付加して応答が返ってきています。
以前の記事と同じように Select AIに「どの職種の従業員が一番多い?」と聞いて
と質問をするとSelect AIの結果に対して、コメントをつけて回答してくれました。
まとめ
簡単なMCPサーバーを作成して、Claude DesktopとSelect AIをつないでみました。
自然言語で問い合わせるとSelect AIが結果を返してくれるので、利用するMCPクライアント側はデータベースの内部構造を知る必要が無くなります。
Claude Desktopがデータベースの内部構造を調べるための問い合わせをする必要がない分だけMCPサーバーを利用する回数が減るので、回答を作成するまでのトークンの消費量は減ると思います。
Select AIでRAG を組むこともできるようなので、適材適所で選択してみてはいかがでしょうか?