Oracle REST Data Services 26.2より、Streamable HTTPで通信するMCPサーバーが実装されました。ORDSのProduct ManagerのJeff Smithさんが、彼のブログで解説しています。
ORDS: now a streaming HTTP MCP Server for Oracle Database
現時点でこのMCPサーバーが提供するツールは、以下の3つです。
database_list、schema_information、sql_run
先ほど紹介したPMのブログに記載されていますが、ORDSをMCPサーバーとして構成するにあたって以下の条件があります。
- ORDSはスタンドアロンであること。WebLogicやTomcatへのデプロイは不可。
- データベースのスキーマに直接接続する。APEXやRESTサービスの呼び出しのように、プロキシ接続はしない。
- スキーマORDS_METADATAをデータベースにインストールしなくてもよい。
- 認可にOAuth 2.0を使用するため、OAuth 2.0/OIDC対応認可サーバーの構成が必要。
ORDSのMCPサーバーの接続先となるデータベースに対する要件はスキーマとパスワードが分かっていることで、構成作業はありません。どちらかというと、MCPクライアントからMCPサーバー、つまりORDSにStreamable HTTPで接続する際に使用する、ユーザー認証と認可を行なうOAuth 2.0/OIDC対応認可サーバーの構成が主要な作業になります。
ORDS 26.2のMCPサーバーの構成方法について、公式ドキュメントの以下に記載されています。
Oracle REST Data Services, Release 26.2
Installation and Configuration Guide3 Configuring Model Context Protocol (MCP)
本記事では、概ねJeff Smithさんの記事にそってORDSのMCPサーバーを構成してみます。IdPにはAuth0を使用します。確認作業に使用するMCPクライアントとして、MCPJamの代わりにMCP Inspectorを使います。また、mcp-remoteで認証を扱う代わりにOpenRestryでリバース・プロキシを構成し、MCP InspectorからStreamable HTTPでMCPサーバーに接続します。
作業はMacBook ProのDocker/Colimaの環境で実施します。接続先となるデータベースとして、Oracle AI Database 26ai Freeをコンテナで実行します。
Oracle Database Free
作業ディレクトリとしてords-mcp2を作成し、そこに移動します。
mkdir -p ords-mcp2
cd ords-mcp2
% mkdir -p ords-mcp2
% cd ords-mcp2
ords-mcp2 %
ホストがlocalhost、ポートが1521(デフォルト)、サービス名がfreepdb1のデータベースに、スキーマHRで接続できることが作業の前提になります。
ords-mcp2 % sql hr@localhost/freepdb1
SQLcl: 火 7月 07 10:36:36 2026のリリース26.1 Production
Copyright (c) 1982, 2026, Oracle. All rights reserved.
パスワード (**********?) ******
接続先:
Oracle AI Database 26ai Free Release 23.26.2.0.0 - Develop, Learn, and Run for Free
Version 23.26.2.0.0
SQL>
https://container-registry.oracle.com/ords/ocr/ba/java/jdk-no-fee-term
OAuth2による認可の際に発生する制限やプロトコル上の問題を回避するために、リバース・プロキシを構成します。リバース・プロキシにはOpenRestyを使用します。Nginxを使用する場合は、拡張機能のmore_set_headersを組み込む必要があります。
以下のDockerfileから、ORDSのMCPサーバーのコンテナ・イメージを作成します。
Dockerfileで行っていることは、AIが解説してくれます。確認のためにClaude Opus 4.8にDockerfileを貼り付けて解説してもらいましたが、問題なく解説してくれました。
Dockerfileをダウンロードし、コンテナ・イメージとしてords:26.2-jdk25を作成します。
docker buildx build --platform linux/arm64 --load -t ords:26.2-jdk25 .
ords-mcp2 % docker buildx build --platform linux/arm64 --load -t ords:26.2-jdk25 .
[+] Building 196.3s (15/15) FINISHED docker:colima
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 4.66kB 0.0s
=> [internal] load metadata for container-registry.oracle.com/java/jdk-n 2.6s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [ 1/11] FROM container-registry.oracle.com/java/jdk-no-fee-term:25.0 62.6s
=> => resolve container-registry.oracle.com/java/jdk-no-fee-term:25.0.3- 0.0s
=> => sha256:a87cab8ce0241264ec70ecd357271d16ce9d4b 215.41MB / 215.41MB 61.5s
=> => sha256:849b9039d2ad02b8dc03e66b9b808816d12d8cb8a 16.22kB / 16.22kB 0.4s
=> => sha256:a8a0fb099610f2281c99dee54da3dedcc313b1738 12.25MB / 12.25MB 3.8s
=> => sha256:312cc07da4b871d4fb2e1dc4aa27242f74100ced 92.42MB / 92.42MB 23.5s
=> => extracting sha256:312cc07da4b871d4fb2e1dc4aa27242f74100ced7570c762 0.9s
=> => extracting sha256:a8a0fb099610f2281c99dee54da3dedcc313b17385fa1661 0.1s
=> => extracting sha256:a87cab8ce0241264ec70ecd357271d16ce9d4be5168571d9 1.0s
=> => extracting sha256:849b9039d2ad02b8dc03e66b9b808816d12d8cb8a461238e 0.0s
=> [ 2/11] RUN dnf -y update && dnf -y install unzip curl sudo epel-re 68.9s
=> [ 3/11] RUN curl -o /etc/yum.repos.d/openresty2.repo https://openrest 0.9s
=> [ 4/11] RUN dnf -y -q install certbot openresty && dnf clean all & 16.4s
=> [ 5/11] RUN groupadd -g 54321 oinstall && useradd -u 54321 -g oinsta 0.1s
=> [ 6/11] RUN mkdir -p /opt/oracle/ords /etc/ords/config 0.1s
=> [ 7/11] RUN cat <<'EOF' > /usr/local/openresty/nginx/conf/nginx.conf 0.1s
=> [ 8/11] RUN chown -R oracle:oinstall /usr/local/openresty 0.2s
=> [ 9/11] RUN curl -o /tmp/ords.zip https://download.oracle.com/otn_so 33.5s
=> [10/11] WORKDIR /home/oracle 0.0s
=> [11/11] RUN cat <<'EOF' > /home/oracle/start.sh && chmod +x /home/ora 0.1s
=> exporting to image 10.7s
=> => exporting layers 8.4s
=> => exporting manifest sha256:91b60d9e3128b910d73f67df4c42fdab5372d981 0.0s
=> => exporting config sha256:062941d460df163aa6311c885ad93b3155d04028c5 0.0s
=> => exporting attestation manifest sha256:be2a5ef1192a9827c828f1f33a34 0.0s
=> => exporting manifest list sha256:f821fdf1a4b8dc84e7e89d9dbf762dbf0f7 0.0s
=> => naming to docker.io/library/ords:26.2-jdk25 0.0s
=> => unpacking to docker.io/library/ords:26.2-jdk25 2.3s
ords-mcp2 %
作成したコンテナ・イメージより、MCPサーバーをコンテナords-mcpとして実行します。
ORDSの構成ファイルは、ボリューム/etc/ords/configをローカルのフォルダにマウントして保存します。また、ポート8585をホスト・ポート8585に割り当てます。
構成ファイルを保存するフォルダを作成します。
mkdir ords-config
ords-mcp2 % mkdir ords-config
ords-mcp2 %
コンテナords-mcpを実行します。
docker run -d --rm --name ords-mcp -p 8585:8585 -v ${PWD}/ords-config:/etc/ords/config ords:26.2-jdk25リバース・プロキシを介さずORDS MCPサーバーに直結したい場合は、ホストの8585にコンテナ内の8080番ポートを割り当てます。(MCP InspectorとAuth0の組み合わせでは、うまく動作しません。)
docker run -d --rm --name ords-mcp -p 8585:8080 -v ${PWD}/ords-config:/etc/ords/config ords:26.2-jdk25
設定ファイルはすべてホストのディレクトリords-config以下に保存されるため、コンテナを再作成しても設定は維持されます。
ords-mcp2 % docker run -d --rm --name ords-mcp -p 8585:8585 -v ${PWD}/ords-config:/etc/ords/config ords:26.2-jdk25
18a6f514d0469bd8a1e60ec4cad621bcb8d74477fd74abf048d264ecfd72a8da
ords-mcp2 %
以上でORDSのMCPサーバーが起動しました。
Auth0のアプリケーション構成
MCPサーバーを構成する前にIdPを構成する必要があります。
Auth0のダッシュボードにサインインします。
アプリケーション・メニューのアプリケーションを開き、アプリケーションを作成します。
名前は
ORDS MCP2とし、アプリケーションの種類として
シングルページWebアプリケーションを選択します。
作成をクリックします。
設定タブを開きます。
基本情報の
ドメインと
クライアントIDは、MCPサーバーへのアクセスに使用するため、メモしておきます。クライアント・シークレットを参照することはありません。
基本情報の
ドメインの値より、以下のORDSのグローバル・プロパティの値が決まります。
mcp.security.jwt.profile.issuerについては、ドメインに後続の/(スラッシュ)が付きます。
mcp.security.jwt.profile.authorization.server.urlには後続の/(スラッシュ)は付きません。
mcp.security.jwt.profile.issuer: https://ドメイン/
mcp.security.jwt.profile.authorization.server.url: https://ドメイン
mcp.security.jwt.profile.jwk.urlは、https://ドメイン/.well-known/oauth-authorization-serverにアクセスして得られるJSONドキュメントに含まれる、jwks_uriの値です。通常、Auth0では認可サーバーの/.well-known/jwks.jsonに配置されています。
mcp.security.jwt.profile.jwk.url: https://ドメイン/.well-known/jwks.json
アプリケーション設定のアプリケーションURLに移動します。
本記事ではMCPサーバーを呼び出すクライアントとして、MCP Inspectorを使用します。
そのため、許可するCallback URLとして、以下を設定します。
http://localhost:6274/oauth/callback
http://localhost:6274/oauth/callback/debug
接続するMCPクライアント(Claude Desktopなど)を追加する場合は、それぞれのコールバックURLを追加します。
以上で設定を
保存します。
アプリケーションの
APIを開き、
APIの作成を実行します。
名前はORDSMCP2とします。識別子として、ORDSのMCPサーバーのエンドポイントURLを設定します。今回の作業では、http://localhost:8585/mcpです。
このエンドポイントURLはリバース・プロキシが受け付けるURLです。リバース・プロキシはポート番号を含めてORDSに伝えているため、ORDSもエンドポイントURLをhttp://localhost:8080/mcpではなく、http://localhost:8585/mcpとして認識しています。
この
識別子は、ORDSのグローバル・プロパティ
mcp.security.jwt.profile.audienceの値になります。
JSON Web Token (JWT) プロファイルおよび
JSON Web Token (JWT) の署名アルゴリズムはデフォルトをそのまま採用します。
以上で
作成します。
カスタムAPIとして
ORDSMCP2が作成されます。
設定タブを開きます。
どちらのアクセス制御でも、デフォルトのスコープ "urn:oracle:dbtools:ords:mcpserver:all" の許可が必要です。そのため、スコープによるアクセス制御では「デフォルトのスコープ+カスタム・スコープ」、ロールによるアクセス制御では「デフォルトのスコープ+カスタム・ロール」を許可します。
今回はJeff Smithさんの記事にそって、ロールによるアクセス制御を実装します。
設定をスクロールし、
RBACの設定に移動します。
RBACを有効化を
オン、
アクセストークンに権限を追加するを
オンに変更します。
必ずしも必要ではありませんが、
アクセスの設定のユーザー同意のスキップを許可するを
オフにしています。
以上で変更を
保存します。
パーミッション・タブを開きます。
パーミッションとしてデフォルトのスコープurn:oracle:dbtools:ords:mcpserver:allを追加します。説明にORDS MCP Serverと記述しています。
カスタムAPIの
ORDSMCP2に、
パーミッションとして
urn:oracle:dbtools:ords:mcpserver:allが追加されました。
アプリケーションアクセスを開き、アプリケーションORDS MCP2からカスタムAPIのORDSMCP2を呼び出せるように、権限を付与します。
アプリケーションORDS MCP2の編集を開きます。
ユーザー委任アクセスのタブを選択します。パーミッションとして表示されている
urn:oracle:dbtools:ords:mcpserver:allを選択し、
アクセスの付与をクリックします。
アクセスが付与されたら、
バッテンか
キャンセルをクリックしてドロワーを閉じます。
アプリケーション
ORDS MCP2に
ユーザー委任アクセスが与えられていることを確認します。
アクセス制御に使用するロールを作成します。
ユーザー管理のロールを開き、ロールを作成をクリックします。
新しいロールの名前はORDS_MCP_HRとします。(Jeff Smithさんの記事ではPOOL.HRですが、ORDSのInstallation and Configuration Guideの例を採用しました)。説明はAllow Access to HR Schemaとしています。
以上でロールを作成します。
ロール
ORDS_MCP_HRが作成されました。
パーミッション・タブを開き、urn:oracle:dbtools:ords:mcpserver:allをパーミッションとして追加します。
APIとしてORDSMCP2を選択します。パーミッションとして一覧されたurn:oracle:dbtools:ords:mcpserver:allをチェックします。
以上でパーミッションを追加します。
パーミッションurn:oracle:dbtools:ords:mcpserver:allが、ロールORDS_MCP_HRに追加されました。
ロール
ORDS_MCP_HRに
ユーザーを割り当てます。
ユーザー・タブを開き、ユーザーの追加をクリックします。
ロールORDS_MCP_HRに割り当てるユーザーを検索し、割り当てをクリックします。
ロール
ORDS_MCP_HRに選択したユーザーが割り当てられます。
ロールによるアクセス制御に必要な、アクセス・トークンにロールを含めるためのカスタム・クレームを作成します。カスタム・ロールの名前はroles2とします。
カスタム・クレームの追加は、アクションのトリガーで実施します。設定およびトリガーのコードは、Jeff Smithさんの記事で紹介されています。
アクションのトリガーを開き、post-loginを選択します。
アクションの追加をクリックし、
初めから構築するを実行します。
名前はadd-custom-claims、ランタイムにNode22を選択します。
作成をクリックします。
コード・エディタが開くので、Jeff Smithさんの記事に記載されているコードをそのまま転記します。
namespaceとなるMCPサーバーのエンドポイントURLはhttp://localhost:8585/mcp、カスタム・クレームの名前もroles2としているため問題ありません。
exports.onExecutePostLogin = async (event, api) => {
const namespace = 'http://localhost:8585/mcp';
if (event.authorization) {
api.idToken.setCustomClaim(`roles2`, event.authorization.roles);
api.accessToken.setCustomClaim(`roles2`, event.authorization.roles);
}
};
以上でデプロイします。
post-loginトリガーのページに戻り、作成したアクション
add-custom-claimsを
開始と
完了の間に
ドラッグ&ドロップします。
アクションadd-custom-claimsを開始と終了の間に配置し、適用をクリックします。
post-loginトリガーが更新されました。

以上でAuth0の設定は完了です。
ORDSの構成に移ります。
コンテナに接続して、ORDSの構成コマンドを実行します。
docker exec -it ords-mcp bash
ords-mcp2 % docker exec -it ords-mcp bash
[oracle@c68b1bf8aa17 ~]$
ORDSのグローバル・プロパティを設定します。[Domain]の部分は、Auth0に作成したアプリケーションORDS MCP2のドメインの値に置き換えます。
ロールによるアクセス制御を行うため、mcp.security.jwt.profile.role.claim.nameに/roles2を設定しています。
ords --config /etc/ords/config config set --global feature.mcp true
ords --config /etc/ords/config config set --global mcp.security.jwt.profile.issuer https://[Domain]/
ords --config /etc/ords/config config set --global mcp.security.jwt.profile.audience http://localhost:8585/mcp
ords --config /etc/ords/config config set --global mcp.security.jwt.profile.jwk.url https://[Domain]/.well-known/jwks.json
ords --config /etc/ords/config config set --global mcp.security.jwt.profile.authorization.server.url https://[Domain]
ords --config /etc/ords/config config set --global mcp.security.jwt.profile.role.claim.name /roles2
続いて、スキーマHRに接続するコネクション・プールとしてmcp-hrを構成します。ORDS MCPサーバーはコンテナ内で実行されているため、コンテナ外にあるデータベースの接続先としてhost.docker.internalを設定しています。
ロールによるアクセス制御を行うため、mcp.roleにORDS_MCP_HRを設定しています。
ords --config /etc/ords/config config --db-pool mcp-hr set db.connectionType basic
ords --config /etc/ords/config config --db-pool mcp-hr set db.hostname host.docker.internal
ords --config /etc/ords/config config --db-pool mcp-hr set db.port 1521
ords --config /etc/ords/config config --db-pool mcp-hr set db.servicename freepdb1
ords --config /etc/ords/config config --db-pool mcp-hr set db.username HR
ords --config /etc/ords/config config --db-pool mcp-hr set db.description "Sample Schema Human Resources"
ords --config /etc/ords/config config --db-pool mcp-hr set mcp.role ORDS_MCP_HR
コネクション・プールmcp-hrがデータベースに接続する際に使用するパスワードを設定します。スキーマHRに設定したパスワードです。
ords --config /etc/ords/config config --db-pool mcp-hr secret db.password
[oracle@c68b1bf8aa17 ~]$ ords --config /etc/ords/config config --db-pool mcp-hr secret db.password
ORDS: Release 26.2 Production on Tue Jul 07 05:44:58 2026
Copyright (c) 2010, 2026, Oracle.
Configuration:
/etc/ords/config
Enter the database password: ********
Confirm password: ********
The setting named: db.password was set to: ****** in configuration: mcp-hr
[oracle@c68b1bf8aa17 ~]$
コンテナから抜けて再起動します。
exit
docker restart ords-mcp
[oracle@c68b1bf8aa17 ~]$ exit
exit
ords-mcp2 % docker restart ords-mcp
ords-mcp
ords-mcp2 %
MCP Inspectorによる接続確認
MCP Inspectorを起動し、MCPサーバーに接続します。
npx @modelcontextprotocol/inspector
ORDS MCPサーバーに接続するにあたって、以下を設定します。
Transport Type: Streamable HTTP
URL; http://localhost:8585/mcp
Connection Type: Via Proxy
OAuth2 2.0 Flow Client ID: アプリケーションORDS MCP2のクライアントID
Scope: urn:oracle:dbtools:ords:mcpserver:all
以上でConnectをクリックします。
アプリケーションへの接続の許可を求められます。Acceptをクリックします。
MCPサーバーに接続されます。
Toolsタブを開き、List Toolsを実行します。
呼び出し可能なツールとしてdatabase_list、schema_information、sql_runがリストされます。
以降はORDS MCPサーバーの使い方になります。
MCPサーバーの使い方は認可サーバーの種類に依存しないので、別の記事でまとめようと思います。
今回の記事は以上になります。
完