2026年4月10日金曜日

Oracle Databaseに問い合わせるClaude Coworkのプラグインを作成する

以下の記事を元に作成したリモートMCPサーバーをClaude Coworkのカスタムコネクタとして作成し、そのコネクタを使ったプラグインを作成します。

実装要件を単純にするため、OpenID Connect(Microsoft Entra ID等)による認証やRAS、リソース・マネージャなどは利用しません。

リモートMCPサーバーはAlways FreeのAutonomous AI Lakehouseで実行します。Claude Coworkにカスタムコネクタとして作成するには、パブリックなホスト名でアクセスできる必要があります。リモートMCPサーバーのエンドポイントはOpenRestyがリバース・プロキシとして動作するコンピュート・インスタンスになります。

Autonomous AI Lakehouseには、サンプル・スキーマとしてSH(Sales History)があらかじめインストールされています。今回はその販売履歴にアクセスし、典型的な調査事項への回答を返すプラグインを作成します。

Coworkでの作業を実施する前にMCP Inspectorを使って、リモートMCPサーバーsampleserverにアクセスできることを確認します。

npx @modelcontextprotocol/inspector

Transport TypeStreamable HTTPを選択し、URLにリポジトリmcp-appに含まれるMCPサーバーsampleserverが動作しているURLを指定します。

https://リバース・プロキシのホスト名/ords/apexdev/sampleserver/mcp

Connectをクリックします。


リモートMCPサーバーsampleserverに接続できたら、Toolsタブを開きます。

List Toolsを実行し、ツールget_schemaを選択します。schemaSHを指定し、Run Toolをクリックして、スキーマSHに含まれる表およびカラムの情報がTool Resultに返されることを確認します。


ツールrun_sqlを選択し、表CUSTOMERSを検索します。

select * from sh.customers


基本的なツールの動作が確認できました。

Claude Coworkでの作業に移ります。

Coworkを使用するには、最低でもProプランの契約が必要です。本作業ではオラクル社が提供しているサンプル・データSales Historyを使用するためモデルに学習されても問題ありませんが、そうでない場合はTeamまたはEnterpriseプランが必要になるかと思います。

Coworkで新規にプロジェクトを作成して作業します。

Coworkを開き、新規プロジェクトを作成します。


続いて開かれるダイアログでは新規作成を選択します。


プロジェクトの名前手順を記述します。販売履歴のデータを見てできることが思いつかないので、手順は適当に記述しました。


プロジェクトが作成されます。カスタマイズを開きます。


コネクタを開き、カスタムコネクタを追加します。


コネクタの名前Connector for Oracle Databaseとします。リモートMCPサーバーsampleserverのエンドポイントURLを指定し、カスタムコネクタとして追加します。


カスタムコネクタConnector for Oracle Databaseが追加されます。


プラグインの作成に移ります。

個人用プラグインのプラス(+)をクリックし、プラグインを作成からClaudeでクリエイティブにを実行します。

メッセージとしてHelp me create a new Cowork pluginが設定されます。プロジェクトに先ほど作成した販売分析を選択し(最近の履歴に表示されていない場合は、プロジェクトから選択します)、始めましょうをクリックします。


あとは、Claudeから作成したいプラグインについて質問されるので、思うままに選択肢を選んだり、自分なりの興味に従って説明を記述します。


本記事はプラグインを作ることが目的で、販売分析のプラグインにどのような機能が必要かわからないので、Claudeの勧めるままにプラグインを作成しています。

Claudeが作成するプラグインがこれでいいのか確認を求めてくるので、OKを出します。


Claudeがツールrun_sqlを呼び出し、Oracle Databaseに保存されている情報を確認して、SKILL.mdやコマンドを実装してくれます。

プラグインが作成されると、プラグインを保存というボタンが表示されます。

プラグインを保存をクリックし、作成されたプラグインをインストールします。


プラグインを保存をクリックしたら「Plugin validation failed」とエラーが発生したのですが、Plugin validation failedが発生したと伝えたら、ClaudeがvalidationしてYAMLの記述エラーを見つけて自分で修正しました。

修正されたプラグインを保存しました。


以上で、プラグインとして作成されたスキルやコマンドを利用することができるようになりました。

作成されたプラグインは、カスタマイズから参照できます。また、スキルやコマンドの編集もできるようです。


個人用プラグインが作成されたディレクトリがよくわからなかった(macOSでは~/Library/Application Support/Claude/local-agent-mode-sessions以下にありそう)ため、プラグインを他の人と共有するために、ZIPで固めるように指示しました。

以下のプロンプトで指示しました。

「作成されたプラグインSales analyticsを他の人と共有できるように、ZIPに固めてください。」

最終的にプラグインをZIPに固めてくれます。プロジェクトのフォルダ以下であればファイルを作成できるため、その下にファイルが作成されるようです。


作成したプラグインはOracle Databaseに接続するコネクタConnector for Oracle Databaseに依存していますが、プロンプトで指定しないとプラグインには含まれないようです。カスタムコネクタはファイル.mcp.jsonに設定を記述して、プラグインのZIPに含めることができます。

ZIPで固めたプラグインはCoworkのカスタマイズからアップロードできます。


個人用を選択し、ローカルアップロードプラグインをアップロードを実行し、プラグインのZIPファイルを読み込みます。


GitHubのリポジトリをマーケットプレースとして登録し、登録したリポジトリからプラグインをインストールすることもできるようです。

今回の記事は以上になります。

2026年4月9日木曜日

環境構築関連資料まとめ

環境構築関連資料まとめ - 2026年4月9日時点

今までに記述した、Oracle Databaseを使用する開発環境の構築手順に関する記事をまとめてみました。

UC Local APEX DevによるOracle APEX環境の作成
コンテナ・イメージを利用したローカル開発環境の作成
ローカル環境はUC Local APEX Devの使用を推奨します。以下の記事ははあくまで参考です。

    ちょっとした設定。UC Local APEX Devにはスクリプトとして含まれているものも多い。

    VirtualBoxを利用したローカルでのOracle APEX環境の作成
    Oracle CloudでのCustomer Managed ORDSの構成
    Oracle AI Database 26ai Free Virtual Appliance
    Autonomous Database Free Container Image
    SQLclのMCPサーバーに関する設定
    ORDS JWT認証 - Oracle APEXアプリケーションとの連携
    Oracle Cloudでのコンテナを利用したOracle APEX環境の作成
    ORDS RESTサービスで実装するリモートMCPサーバー
    リモートMCPサーバーの保護
    OML4Py
    OML4R
    Property Graph
    Spatial
    ロード・バランサ
    アップグレード

    2026年4月8日水曜日

    リモートMCPサーバーのツール実行をリソース・マネージャーで制御する - オンプレミス19c編

    記事「MCPを話すOracle Databaseを作成する - オンプレミス19c編」にそって作成した環境で、リモートMCPサーバーのツール実行をリソース・マネージャで制御します。

    リソース・マネージャのコンシューマ・グループの作成までは、以下の記事の作業と同じです。

    MCPサーバーのツールに作成したコンシューマ・グループを紐づける作業は、Autonomous AI Databaseでの作業と同じです。
    相互参照を避けるためと手順自体の確認のために、以下より実施した作業を記録します。


    CDBの構成



    最初にCDBに接続して作業します。

    sql sys@orcl_tls as sysdba

    apex-arm % sql sys@orcl_tls as sysdba


    SQLcl: 水 4月 08 13:13:20 2026のリリース25.4 Production


    Copyright (c) 1982, 2026, Oracle.  All rights reserved.


    パスワード (**********?) ******

    接続先:

    Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

    Version 19.19.0.0.0


    SQL> 


    CDBに設定されているリソース・マネージャ・プランを確認します。

    show parameter resource_manager_plan

    VALUEは空白なので、リソース・マネージャ・プランは未適用です。

    SQL> show parameter resource_manager_plan

    NAME                  TYPE   VALUE 

    --------------------- ------ ----- 

    resource_manager_plan string       

    SQL> 


    念の為、V$RSRC_PLANビューも確認します。

    select name, is_top_plan, cpu_managed from v$rsrc_plan where is_top_plan = 'TRUE';

    SQL> select name, is_top_plan, cpu_managed from v$rsrc_plan where is_top_plan = 'TRUE';


    NAME                     IS_TOP_PLAN    CPU_MANAGED    

    ________________________ ______________ ______________ 

    ORA$INTERNAL_CDB_PLAN    TRUE           OFF            

    INTERNAL_PLAN            TRUE           OFF            

    INTERNAL_PLAN            TRUE           OFF            


    SQL> 


    CDBについてはリソース・マネージャ・プランが設定されていればよいので、デフォルトで作成されているDEFAULT_CDB_PLANを、リソース・マネージャ・プランとして設定します。

    DEFAULT_CDB_PLANの有無を確認します。

    select * from dba_cdb_rsrc_plans where plan = 'DEFAULT_CDB_PLAN';

    SQL> select * from dba_cdb_rsrc_plans where plan = 'DEFAULT_CDB_PLAN';


       PLAN_ID PLAN                COMMENTS            STATUS    MANDATORY    

    __________ ___________________ ___________________ _________ ____________ 

         20248 DEFAULT_CDB_PLAN    Default CDB plan              YES          


    SQL> 


    CDBのリソース・マネージャ・プランとして、DEFAULT_CDB_PLANを設定します。

    alter system set resource_manager_plan = 'DEFAULT_CDB_PLAN' scope=both;

    SQL> alter system set resource_manager_plan = 'DEFAULT_CDB_PLAN' scope=both;


    Systemが変更されました。


    SQL> 


    再度、リソース・マネージャ・プランを表示し、CDBにリソース・マネージャ・プランが設定されたことを確認します。

    SQL> show parameter resource_manager_plan

    NAME                  TYPE   VALUE            

    --------------------- ------ ---------------- 

    resource_manager_plan string DEFAULT_CDB_PLAN 

    SQL> select name, is_top_plan, cpu_managed from v$rsrc_plan where is_top_plan = 'TRUE';


    NAME                IS_TOP_PLAN    CPU_MANAGED    

    ___________________ ______________ ______________ 

    DEFAULT_CDB_PLAN    TRUE           ON             

    INTERNAL_PLAN       TRUE           ON             

    INTERNAL_PLAN       TRUE           ON             


    SQL> 


    CDBのリソース・マネージャ・プランとして、DEFAULT_CDB_PLANが設定されました。


    PDBの構成



    続いて、PDBのリソース・マネージャ・プランを構成します。

    ORCLPDB1に接続して作業します。

    sql sys@orclpdb1_tls as sysdba

    apex-arm % sql sys@orclpdb1_tls as sysdba


    SQLcl: 水 4月 08 13:19:10 2026のリリース25.4 Production


    Copyright (c) 1982, 2026, Oracle.  All rights reserved.


    パスワード (**********?) ******

    接続先:

    Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

    Version 19.19.0.0.0


    SQL> 


    PDBに設定されているリソース・マネージャ・プランを確認します。

    show parameter resource_manager_plan

    VALUEは空白なので、リソース・マネージャ・プランは未適用です。

    SQL> show parameter resource_manager_plan

    NAME                  TYPE   VALUE 

    --------------------- ------ ----- 

    resource_manager_plan string       

    SQL> 


    コンシューマ・グループとしてRESTRICT_RUNAWAY、リソース・マネージャ・プランとしてMY_PDB_PLANを作成し、経過時間の上限を20秒CPU時間の上限を10秒として、SQLを中断するプラン・ディレクティブを作成します。

    クローンしたリポジトリmcp-appに含まれるcreate_RESTRICT_RUNAWAY.sqlを実行します。

    @mcp-app/rm-setup/create_RESTRICT_RUNAWAY.sql

    リソース・マネージャー・プランMY_PDB_PLANとコンシューマ・グループRESTRICT_RUNAWAYが作成されます。

    SQL> @mcp-app/rm-setup/create_RESTRICT_RUNAWAY.sql 

    resource consumer group created RESTRICT_RUNAWAY

    resource manager plan created MY_PDB_PLAN

    plan directives created RESTRICT_RUNAWAY for MY_PDB_PLAN

    default plan directive created OTHER_GROUPS for MY_PDB_PLAN

    pending area submitted successfully.



    PL/SQLプロシージャが正常に完了しました。


    SQL> 


    作成したコンシューマ・グループRESTRICT_RUNAWAYを、MCPサーバーの実行ユーザーAPEXDEVが使用できるように権限を与えます。
    begin
      dbms_resource_manager_privs.grant_switch_consumer_group ( 
        grantee_name => 'APEXDEV', 
        consumer_group => 'RESTRICT_RUNAWAY', 
        grant_option => FALSE
      );
    end;
    /

    SQL> begin

      2    dbms_resource_manager_privs.grant_switch_consumer_group ( 

      3      grantee_name => 'APEXDEV', 

      4      consumer_group => 'RESTRICT_RUNAWAY', 

      5      grant_option => FALSE

      6    );

      7  end;

      8* /


    PL/SQLプロシージャが正常に完了しました。


    SQL> 


    ビューを検索して設定を確認します。

    プランMY_PDB_PLANの存在を確認します。

    select * from dba_rsrc_plans where plan = 'MY_PDB_PLAN';

    SQL> select * from dba_rsrc_plans where plan = 'MY_PDB_PLAN';


       PLAN_ID PLAN              NUM_PLAN_DIRECTIVES CPU_METHOD    MGMT_METHOD    ACTIVE_SESS_POOL_MTH         PARALLEL_DEGREE_LIMIT_MTH         QUEUEING_MTH    SUB_PLAN    COMMENTS    STATUS    MANDATORY    

    __________ ______________ ______________________ _____________ ______________ ____________________________ _________________________________ _______________ ___________ ___________ _________ ____________ 

         79741 MY_PDB_PLAN                         2 EMPHASIS      EMPHASIS       ACTIVE_SESS_POOL_ABSOLUTE    PARALLEL_DEGREE_LIMIT_ABSOLUTE    FIFO_TIMEOUT    NO                                NO           


    SQL> 


    コンシューマ・グループRESTRICT_RUNAWAYの存在を確認します。

    select * from dba_rsrc_consumer_groups where consumer_group = 'RESTRICT_RUNAWAY';

    SQL> select * from dba_rsrc_consumer_groups where consumer_group = 'RESTRICT_RUNAWAY';


       CONSUMER_GROUP_ID CONSUMER_GROUP      CPU_METHOD     MGMT_METHOD    INTERNAL_USE    COMMENTS    CATEGORY    STATUS    MANDATORY    

    ____________________ ___________________ ______________ ______________ _______________ ___________ ___________ _________ ____________ 

                   79742 RESTRICT_RUNAWAY    ROUND-ROBIN    ROUND-ROBIN    NO                          OTHER                 NO           


    SQL> 


    設定されているプラン・ディレクティブを確認します。

    select plan, group_or_subplan, switch_group, switch_for_call, switch_time_in_call, switch_elapsed_time
    from dba_rsrc_plan_directives
    where plan = 'MY_PDB_PLAN' and group_or_subplan = 'RESTRICT_RUNAWAY';


    SQL> select plan, group_or_subplan, switch_group, switch_for_call, switch_time_in_call, switch_elapsed_time

      2  from dba_rsrc_plan_directives

      3* where plan = 'MY_PDB_PLAN' and group_or_subplan = 'RESTRICT_RUNAWAY';


    PLAN           GROUP_OR_SUBPLAN    SWITCH_GROUP    SWITCH_FOR_CALL       SWITCH_TIME_IN_CALL    SWITCH_ELAPSED_TIME 

    ______________ ___________________ _______________ __________________ ______________________ ______________________ 

    MY_PDB_PLAN    RESTRICT_RUNAWAY    CANCEL_SQL      TRUE                                   10                     20 


    SQL> 


    以上で、リソース・マネージャ・プランの構成は完了です。

    リソース・マネージャ・プランの有効化し、確認します。

    alter system set resource_manager_plan = 'MY_PDB_PLAN' scope=both;
    select name, is_top_plan, cpu_managed from v$rsrc_plan where is_top_plan = 'TRUE';

    SQL> alter system set resource_manager_plan = 'MY_PDB_PLAN' scope=both;


    Systemが変更されました。


    SQL> select name, is_top_plan, cpu_managed from v$rsrc_plan where is_top_plan = 'TRUE';


    NAME           IS_TOP_PLAN    CPU_MANAGED    

    ______________ ______________ ______________ 

    MY_PDB_PLAN    TRUE           ON             


    SQL> 




    ツールへのコンシューマ・グループの適用



    MCP App HelperのAPEXアプリケーションを実行し、ナビゲーション・メニューのToolsを開きます。

    一覧にあるrun_sqlを編集します。


    Resource Consumer GroupRESTRICT_RUNAWAYを設定し、変更の適用をクリックします。


    以上でツールrun_sqlの実行時にコンシューマ・グループがRESTRICT_RUNAWAYに切り替わり、SELECT文のCPU時間が10秒、経過時間が20秒に達すると切断されるように設定されました。


    動作確認



    MCP Inspectorを起動します。

    npx @modelcontextprotocol/inspector

    リモートMCPサーバーsampleserverに接続し、ツールrun_sqlを呼び出します。


    sqlとして以下を記述し、Run Toolを実行します。

    select count(*) from all_objects, all_objects

    コンシューマ・グループRESTRICT_RUNAWAYが割当たっているため、処理時間が10秒を超えたところで以下のエラーが発生します。CPU時間の上限が10秒、経過時間が20秒の設定なので、先にCPU時間の上限が適用されているようです。

    "ORA-00040: アクティブな時間制限を超えました - コールは異常終了しました"


    SELECT文実行時に割り当てられているリソース・コンシューマー・グループを、以下のSELECT文を実行して確認します。

    select resource_consumer_group from v$session where audsid = sys_context('USERENV','SESSIONID')

    Tool Resultから、ツールrun_sqlの実行時にコンシューマ・グループとしてRESTRICT_RUNAWAYが割り当たっていることが確認できます。


    以上のように、リモートMCPサーバーのツール実行時にリソース・コンシューマ・グループを切り替えられることが確認できました。

    今回の記事は以上になります。