2024年12月3日火曜日

Oracle Databaseに接続するMCPサーバーを作成しClaudeから問い合わせる

Oracle Databaseに接続するMCPサーバーを作ってみました。接続先はREST対応SQLを有効にした、Autonomous Databaseです。その他の環境でも、Oracle REST Data Servicesを構成することで、REST対応SQLを使用できるようになります。

REST対応SQLによるアクセスはHTTP/HTTPSなので、Oracle用のドライバおよびコード中ので接続の管理などは必要ありません。

MCPサーバーが接続するAutonomous Databaseの環境を準備する手順は記事「Oracle Autonomous DatabaseでREST対応SQLを基本認証で有効にする」にて紹介しています。

Claude Desktop appから、色々と問い合わせてみました。


言葉に出来ないくらいすごい。

Oracle Database向けのMCPサーバーは、Exampleとして提供されているPostgreSQLのコードを元に作成しています。


MCPサーバーの作成は、公式の以下の手順に沿って行います。作業はmacOSで行なっています。


Node.js 18以上をインストールしておきます。

Create a new projectの作業を行います。適当なディレクトリに移動し、以下のコマンドを実行します。作成するディレクトリの名前はoracle-serverとします。

npx @modelcontextprotocol/create-server oracle-server

What is the name of your MCP server? oracleと入力します。この名前でClaudeに参照先として指示を出すことができます。
What is the description of your server? にはMy first Oracle MCP Serverと入力しました。説明なので、自由に記述できます。
Would you like to install this server for Claude.app? と聞かれますが、Yesを入力するとclaude_desktop_config.jsonにエントリが追加されます。後でURL、ユーザー名、パスワードなどを追加する必要があるし、まだ出来ていないのにエントリが追加されても困るのでnを入力します。

以上でMCPサーバーの雛形が作成されます。

% npx @modelcontextprotocol/create-server oracle-server

(node:2763) ExperimentalWarning: CommonJS module /opt/homebrew/lib/node_modules/npm/node_modules/debug/src/node.js is loading ES Module /opt/homebrew/lib/node_modules/npm/node_modules/supports-color/index.js using require().

Support for loading ES Module in require() is an experimental feature and might change at any time

(Use `node --trace-warnings ...` to show where the warning was created)

? What is the name of your MCP server? oracle

? What is the description of your server? My first Oracle MCP Server

? Would you like to install this server for Claude.app? No

MCP server created successfully!


Next steps:

  cd oracle-server

  npm install

  npm run build  # or: npm run watch

  npm link       # optional, to make available globally


% 


cd oracle-serverを実行し、作成されたディレクトリに移動します。

cd oracle-server

このディレクトリのsrc以下に、index.tsを作成します。


MCPサーバーの本体であるindex.tsを作成したら、ビルドします。

npm install
npm run build
npm link

% npm install

(node:2127) ExperimentalWarning: CommonJS module /opt/homebrew/lib/node_modules/npm/node_modules/debug/src/node.js is loading ES Module /opt/homebrew/lib/node_modules/npm/node_modules/supports-color/index.js using require().

Support for loading ES Module in require() is an experimental feature and might change at any time

(Use `node --trace-warnings ...` to show where the warning was created)


> oracle-server@0.1.0 prepare

> npm run build



> oracle-server@0.1.0 build

> tsc && node -e "require('fs').chmodSync('build/index.js', '755')"



added 17 packages, and audited 18 packages in 1s


1 package is looking for funding

  run `npm fund` for details


found 0 vulnerabilities

% npm run build


> oracle-server@0.1.0 build

> tsc && node -e "require('fs').chmodSync('build/index.js', '755')"


npm link

(node:2373) ExperimentalWarning: CommonJS module /opt/homebrew/lib/node_modules/npm/node_modules/debug/src/node.js is loading ES Module /opt/homebrew/lib/node_modules/npm/node_modules/supports-color/index.js using require().

Support for loading ES Module in require() is an experimental feature and might change at any time

(Use `node --trace-warnings ...` to show where the warning was created)


added 1 package, and audited 3 packages in 673ms


found 0 vulnerabilities

% 


以上でOracle Databaseに接続するMCPサーバーは作成できました。

~Library/Application\ Support/Claudeに移動し、claude_desktop_config.jsにエントリを追加します。

第1引数は(index.tsからビルドされた)index.jsの位置を指定します。第2引数はREST対応SQLを呼び出すエンドポイントURL、第3引数は接続するスキーマ名、第4引数はスキーマのパスワードです。
{
  "mcpServers": {
    "oracle": {
      "command": "node",
      "args": [
        "/Users/username/Documents/oracle-server/build/index.js",
	"https://********-apexdev.adb.us-ashburn-1.oraclecloudapps.com/ords/mcp/_/sql",
	"スキーマ名",
	"パスワード"
      ]
    }
  }
}
以上の設定を行い、Claude Desktop appを起動します。

後は思いついたことをClaudeに聞きます。


OracleのMCPサーバーのログは~/Library/Logs/Claude以下にmcp-server-oracle.logとして出力されます。

今回の記事は以上です。

自分で書いたMCPサーバーのindex.tsのレビューをClaude 3.5 Sonnetにお願いしたら、丸ごと書き直されましたが、自分で書いたコードを掲載しています。