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サーバーのツール実行時にリソース・コンシューマ・グループを切り替えられることが確認できました。

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