ClaudeからOracle MCPサーバーを使う — DBとOCIの選び方
Oracleのoracle/mcpリポジトリには、Oracle DatabaseやOCI向けなど複数のMCPサーバーがあります。両者の違い、Claude Codeへの登録コマンド、認証と権限の注意点をまとめます。
Oracleが公開しているGitHubリポジトリoracle/mcpには、Oracle製品を操作するMCPサーバーの参照実装がまとまっています。src/配下の1ディレクトリが1サーバーで、Oracle Database向け、OCI(Oracle Cloud Infrastructure)向け、ドキュメント検索向けに分かれます。
どれをClaudeにつなぐかは、触りたい対象で決まります。表のデータを扱うならOracle Database向け、クラウドのリソースならOCI向けです。
どのサーバーを選ぶか
リポジトリは、OCIを使うならoci-cloud-mcp-serverから始めるよう案内しています。OCI CLI経由で動かしたいときだけoci-api-mcp-serverを選びます。
Oracle Databaseに直接SQLを投げたい場合の入口は別です。次の表が、この記事で扱うサーバーの対応です。
| やりたいこと | サーバー | 言語・起動 | 認証の拠り所 |
|---|---|---|---|
| OCIのリソース全般を操作 | サーバーoci-cloud-mcp-server | 言語・起動Python / uvx | 認証の拠り所OCI CLIのプロファイル |
| SQL実行・テーブル管理・実行計画 | サーバーoracle-db-mcp-java-toolkit | 言語・起動Java / jar | 認証の拠り所JDBC接続情報 |
| Autonomous DBやObject Storageを横断 | サーバーdbtools-mcp-server | 言語・起動Python | 認証の拠り所OCI設定ファイル |
| Oracle Databaseのドキュメント検索 | サーバーoracle-db-doc-mcp-server | 言語・起動Python | 認証の拠り所不要(ローカル索引) |
oracle-db-mcp-java-toolkitのREADMEは、Oracle SQLcl MCP Serverが「Oracle Database向けのMCP機能を持つ、正式にサポートされる製品」だと明記しています。リポジトリ側は参照実装です。本番に近い用途ではSQLcl側を先に検討する流れになります。
OCIをClaude Codeから操作する
まずoci-cloud-mcp-serverを登録します。このサーバーはOCI Python SDKを直接呼ぶ薄いラッパーで、OCI CLIのサブプロセスは使いません。
事前準備
必要なものは3つです。
uv(READMEのQuick Startはuv python install 3.13でPython 3.13を入れる手順)- OCI CLIのインストールと、プロファイルの作成
- セッション認証を使う場合は
oci session authenticateの実行
セッション認証の例は次のとおりです。
oci session authenticate \
--region=us-phoenix-1 \
--tenancy-name=<tenancy_name>セッションには有効期限があります。切れたらoci session authenticate --profile-name <profile_name> --region <region> --auth security_tokenで更新します。トークン認証だけでは動かないサーバーもあり、その場合はAPIキー方式の設定が必要です。
claude mcp addで登録する
READMEのJSON設定(commandがuvx、argsがoracle.oci-cloud-mcp-server@latest、envがOCI_CONFIG_PROFILEとFASTMCP_LOG_LEVEL)を、Claude Codeのコマンドに置き換えると次の形になります。
claude mcp add --transport stdio \
--env OCI_CONFIG_PROFILE=DEFAULT \
--env FASTMCP_LOG_LEVEL=ERROR \
oracle-oci-cloud \
-- uvx oracle.oci-cloud-mcp-server@latest--より前がClaude Codeのオプション、後ろがサーバーを起動するコマンドです。--envは複数指定できますが、サーバー名が--envの直後に来ると名前もKEY=valueとして読まれて拒否されます。上の例では--transport stdioを挟んで避けています。認証のやり直しや登録済みサーバーの扱いはclaude mcp login/logoutの記事にまとまっています。
このサーバーが公開するツール
ツールは5つで、OCIのサービスごとに別ツールがあるわけではありません。SDKのクライアントクラスとメソッド名を指定して呼ぶ設計です。
| ツール | 役割 |
|---|---|
list_oci_clients | 役割使えるSDKクライアントの一覧 |
find_oci_api | 役割短いキーワードでメソッドを検索 |
describe_oci_operation | 役割メソッドの必須パラメータなどを確認 |
invoke_oci_api | 役割client_fqnとoperationを指定して実行 |
list_client_operations | 役割指定クライアントの操作一覧 |
READMEは、トークンを節約する使い方として、クライアントとメソッドが分かっていればdescribe_oci_operationかinvoke_oci_apiを直接呼ぶ手順を勧めています。find_oci_apiは検索の逃げ道で、「list regions」「create vcn」のような短い語で使います。文章をそのまま渡す想定ではありません。
Claudeへの頼み方は、対象のクライアントまで書くと迷いが減ります。たとえば「oci.core.ComputeClientのlist_instancesで、このコンパートメントのインスタンスをIDと状態だけ一覧にして」のように指示します。invoke_oci_apiにはfieldsで返す項目を絞る引数があるため、表示したい列を先に伝えると応答が軽くなります。
Oracle Databaseにつなぐ
SQLを書かせる用途ではoracle-db-mcp-java-toolkitを使います。JDK 17以上とMaven 3.9以上が前提で、自分でjarをビルドします。
mvn clean package
# 生成物: target/oracle-db-mcp-toolkit-1.0.0.jar組み込みツールセット
-Dtoolsで有効にするツールセットを選びます。省略すると、保護されていないツールがすべて有効になります。
| ツールセット | 含まれるツール |
|---|---|
database-operator | 含まれるツールread-query、write-query、table、transaction、db-ping、db-metrics-range、explain-plan |
log-analyzer | 含まれるツールjdbc-analyzer、rdbms-analyzer(DB接続は不要) |
rag | 含まれるツールvector-model、vector-store、embed、task、oci-storage、similarity-search |
mcp-admin | 含まれるツールedit-tools、list-credentials(明示的に指定したときだけ有効) |
read-queryはSELECT専用、write-queryはINSERT・UPDATE・DELETE・CREATEなどを自動コミットで実行します。実行する前に確認したい場合は、write-queryを含むdatabase-operatorをそのまま有効にせず、用途に合わせて個別のツール名で絞る選択肢があります。READMEによると-Dtoolsには個別のツール名も渡せます。
Claude Codeに登録する
READMEのClaude Desktop向けJSON(commandがjava、argsに-Dのシステムプロパティとjarのパス)と同じ引数を、claude mcp addに移します。
claude mcp add --transport stdio oracle-db \
-- java \
-Ddb.url=jdbc:oracle:thin:@your-host:1521/your-service \
-Ddb.user=your_user \
-Ddb.password=your_password \
-Dtools=database-operator \
-jar /path/to/oracle-db-mcp-toolkit-1.0.0.jar最初は-Dtools=log-analyzerだけで試す手もあります。DBに接続しないので、JDBCのログやSQLNetのトレースファイルをClaudeに読ませて、エラーや実行時間を拾わせる用途に向きます。
接続情報をYAMLに分ける
パスワードをコマンドラインに直接書きたくない場合は、設定ファイルで接続とカスタムツールを定義できます。READMEの例を元にすると、次のような形です(READMEの例に沿った書き方で、実行結果ではありません)。
dataSources:
prod-db:
url: jdbc:oracle:thin:@prod-host:1521/ORCLPDB1
user: ${user}
password: ${password}
tools:
hotels-by-name:
dataSource: prod-db
description: ホテル名から詳細を返す
parameters:
- name: name
type: string
description: 検索するホテル名
required: false
statement: SELECT * FROM hotels WHERE name LIKE '%' || :name || '%'起動時に-DconfigFile=/path/to/config.yamlを付けます。SQLを固定したtoolsだけを公開すれば、Claudeに任意のSQLを書かせずに済みます。カスタムツールは-Dtoolsに列挙しなくても既定で有効なので、不要なものにはenabled: falseを付けます。読み取り専用の設計を複数製品で比べた内容はデータベースMCPサーバーの読み取り専用設定の比較にあります。
HTTPで公開するときの認証
stdioではClaude Codeがプロセスを起動するので、認証の話は出ません。サーバーを別ホストで動かすHTTP(streamable HTTP)モードでは、認証が必須になります。
-Dauth.enabled=trueで認証を有効にし、OAuth2を設定するか、開発用の生成トークンを使う- 認証なしで起動できるのは
-Dhttp.allowUnauthenticatedForDevelopment=trueを明示した場合だけで、警告が出る - HTTPSはPKCS12形式のキーストアを
-DcertificatePathと-DcertificatePasswordで渡す
Claude Desktopからは、READMEの例だとnpx -y mcp-remote https://localhost:45450/mcpを経由してつなぎます。ClineはstreamableHttpで直接つなげます。OCI側のHTTPサーバーも同様に、OCI IAMの機密アプリケーション(IDCS_CLIENT_IDなど)を用意し、${ORACLE_MCP_BASE_URL}/auth/callbackをリダイレクトURIに登録する必要があります。READMEは、コンテナ起動時にポート公開を-p 127.0.0.1:8888:8888のまま保つよう注意しています。-p 8888:8888にするとローカルホスト外に公開されます。
補助的な2つのサーバー
dbtools-mcp-server
OCIのDatabase Toolsの接続を経由して、Autonomous Databaseなどに対してSQLを実行します。コンパートメント一覧、データベース一覧、レポート定義の作成と実行、HeatWaveのRAG、Object Storageのバケット一覧といったツールが23個あります。READMEによると、新規のMySQL HeatWaveやMySQL AIの利用者にはmysql-mcp-serverの利用が勧められており、MySQL AIはこのサーバーと互換性がありません。
TENANCY_ID_OVERRIDEやPROFILE_NAMEといった環境変数で、使うテナンシーとプロファイルを切り替えます。
oracle-db-doc-mcp-server
Oracle Databaseのドキュメントをキーワード検索するサーバーです。ドキュメント本体はリポジトリに含まれないため、公開されているzipファイルを自分でダウンロードして索引を作ります。
python3 oracle-db-doc-mcp-server.py idx -path ~/Downloads/oracle-database_26.zip
python3 oracle-db-doc-mcp-server.py mcp索引の作成には数分かかり、クライアントによってはタイムアウトするため、idxとmcpは別々に実行する作りです。提供されるツールはsearch_oracle_database_documentationの1つです。SQLの構文やエラーの意味を、Claudeが手元の索引から引ける点が使いどころになります。
権限とデータの扱い
Oracleのドキュメントは、LLMにデータベースへのアクセスを与えると、意図しないテーブルや機微な情報を渡すリスクがあると警告しています。同じ警告が挙げる対策は次の3点です。
- LLMが使うDBユーザーに必要最小限の権限だけを与える
- 本番DBを直接つながず、匿名化した読み取り専用のレプリカかデータの一部を使う
- LLMが実行したクエリを定期的に監査する
SQLcl MCP Serverには、V$SESSION.MODULEにMCPクライアント名を入れる機能、実行履歴をDBTOOLS$MCP_LOGテーブルに記録する機能、生成クエリに/* LLM in use ... */コメントを付ける機能があります。参照実装のJavaツールキットにこれらがあるとはREADMEに書かれていないため、監査の仕組みが要る環境では、SQLcl側のほうが材料がそろっています。
OCI側のstdioサーバーは、設定したOCI CLIプロファイルの権限で動きます。READMEも最小権限のIAM設定を勧めているので、Claudeに渡すプロファイルは専用に作り、操作できるコンパートメントを絞っておくのが安全です。他のデータベース系MCPサーバーでの権限の分け方はDatabricks MCPサーバーの記事やRedis MCPサーバーの記事も参考になります。クラウド側の操作を任せる構成はAzure MCPサーバーの記事と同じ考え方です。
つまずきやすい点
| 症状 | 確認すること |
|---|---|
| OCIサーバーが認証エラーになる | 確認することセッションの有効期限切れ。oci session authenticateで更新する |
| トークン認証で動かないサーバーがある | 確認することAPIキー方式の設定に切り替える |
| Javaツールキットが起動しない | 確認することJDK 17以上か、jarのパスが絶対パスか |
| HTTPモードで起動を拒否される | 確認すること-Dauth.enabled=trueか開発用フラグが必要 |
| ドキュメント検索サーバーがすぐ終了する | 確認すること先にidxで索引を作ったか |
-Dtoolsに書いたのに足りない | 確認することmcp-adminは*でも有効にならない。明示する |
まとめ
Oracle製品をClaudeにつなぐ入口は、対象で3つに分かれます。OCIはoci-cloud-mcp-server、データベース内のSQLはoracle-db-mcp-java-toolkit、ドキュメントの参照はoracle-db-doc-mcp-serverです。いずれも参照実装なので、業務DBは検証環境で動作を見てから、専用ユーザーと最小権限を前提に広げます。
先に試すなら、DB接続のいらないlog-analyzerか、ドキュメント検索が低リスクです。次にread-queryだけで読み取りを試し、write-queryは必要になった時点で加えます。