IBM Bobを利用したモダナイゼーション実践①:資産棚卸し編
IBM Bobの機能を活用することで、既存のIBM i環境のモダナイゼーションをどこまで実施できるのか実践していきます。今回は、IBM Bob以外のツールを使用せず、無償で実施できるモダナイゼーション手法を紹介します。
まず最初のステップとして、現状のアプリケーション資産の分析を行います。
はじめに
IBM i環境には、多数のソースメンバーやプログラムなどのオブジェクトが存在しています。IBM Bobに全てのソースメンバーを読ませて仕様書の作成をすることは可能ですが、不要なソースを読ませた場合、Bobコインの消費量が増えてしまいます。そこで、モダナイゼーションを進める前に、現在使用しているオブジェクトの特定と、使用していない不要なオブジェクトの整理が必要です。
2026年4月時点では、IBM BobはIBM iに直接接続してオブジェクト情報を取得できないため、MCPサーバーを利用します。MCPサーバーの構築方法は複数ありますので、以下のリンクを参考にしてください。なお、構築方法や仕組みの詳細については本記事では割愛します。
アプリケーション資産棚卸しに必要な情報
IBM iには「IBM i Services」と呼ばれる、SQLを利用してさまざまな操作を実行できる機能が用意されています。今回の資産分析に活用できるIBM i ServicesをIBM Bobに選定してもらって実施していきます。
IBM i Servicesの詳細については、以下のドキュメントに記載されています:
今回、上記PDFの内容をIBM Bobに読み込ませるため、マークダウン形式に変換しました。変換後のファイルは以下のリンクから参照できます
上記のマークダウンファイルをIBM Bobに読んでもらって選定した、今回準備するIBM i Servicesは以下の通りです
1. オブジェクト情報
-
QSYS2.OBJECT_STATISTICS(テーブル関数) - 全オブジェクトの統計 -
QSYS2.PROGRAM_INFO(ビュー) - プログラム情報 -
QSYS2.SERVICE_PROGRAM_INFO(ビュー) - サービスプログラム情報 -
QSYS2.MODULE_INFO(ビュー) - モジュール情報 -
QSYS2.PROGRAM_REFERENCES(ビュー) - プログラム参照 -
QSYS2.OBJECT_DEPENDENCIES(ビュー) - 依存関係
2. データベース
-
QSYS2.SYSTABLES(ビュー) - テーブル定義 -
QSYS2.SYSTABLESTAT(ビュー) - テーブル統計 -
QSYS2.SYSCOLUMNS(ビュー) - カラム定義 -
QSYS2.SYSINDEXES(ビュー) - インデックス -
QSYS2.SYSVIEWS(ビュー) - ビュー定義 -
QSYS2.SYSKEYS(ビュー) - キー情報 -
QSYS2.SYSTRIGGERS(ビュー) - トリガー -
QSYS2.SYSCST(ビュー) - 制約 -
QSYS2.SYSPROCS(ビュー) - ストアドプロシージャ -
QSYS2.SYSFUNCS(ビュー) - 関数
3. ソース・構造
-
QSYS2.SYSPARTITIONSTAT(ビュー) - ソースメンバー -
QSYS2.BOUND_MODULE_INFO(ビュー) - バインドモジュール -
QSYS2.BOUND_SRVPGM_INFO(ビュー) - バインドサービスプログラム
4. 運用・ジョブ
-
QSYS2.SCHEDULED_JOB_INFO(ビュー) - スケジュールジョブ
5. セキュリティ
-
QSYS2.OBJECT_PRIVILEGES(テーブル関数) - オブジェクト権限
MCPサーバーのツール設定
上記のIBM i Servicesを利用して解析作業を実施します。まず、MCPサーバーにツールを設定していきます。
以下のYAMLファイルをIBM Bobに作成してもらいました
asset-inventory.yaml(クリックして展開)
# IBM i 資産棚卸しとモダナイゼーションツール
# プログラム資産の棚卸しとモダナイゼーション分析のためのツール
# Version 1.0.0
sources:
ibmi-system:
host: ${DB2i_HOST}
user: ${DB2i_USER}
password: ${DB2i_PASS}
port: 8076
ignore-unauthorized: true
tools:
# ===== 1. オブジェクト情報 =====
get_object_statistics:
source: ibmi-system
responseFormat: markdown
description: "QSYS2.OBJECT_STATISTICSを使用してライブラリ内のオブジェクトの包括的な統計情報を取得します。"
statement: |
SELECT
OBJNAME, OBJTYPE, OBJATTRIBUTE, OBJOWNER, OBJCREATED,
DAYS_USED_COUNT, OBJSIZE, OBJTEXT, SQL_OBJECT_TYPE
FROM TABLE(QSYS2.OBJECT_STATISTICS(
OBJECT_SCHEMA => :library_name,
OBJTYPELIST => :object_type_list,
OBJECT_NAME => :object_name
))
ORDER BY OBJTYPE, OBJNAME
FETCH FIRST 500 ROWS ONLY
parameters:
- name: library_name
type: string
description: "ライブラリ名"
required: true
- name: object_type_list
type: string
description: "オブジェクトタイプリスト"
default: "*ALL"
- name: object_name
type: string
description: "オブジェクト名"
default: "*ALL"
get_program_info:
source: ibmi-system
responseFormat: markdown
description: "QSYS2.PROGRAM_INFOから詳細なプログラム情報を取得します。"
statement: |
SELECT
PROGRAM_LIBRARY, PROGRAM_NAME, PROGRAM_TYPE, OBJECT_TYPE,
CREATE_TIMESTAMP, USER_PROFILE, ACTIVATION_GROUP, PROGRAM_SIZE,
SQL_STATEMENT_COUNT, PROGRAM_OWNER, TEXT_DESCRIPTION,
SOURCE_FILE, SOURCE_FILE_LIBRARY, SOURCE_FILE_MEMBER, PROGRAM_ATTRIBUTE
FROM QSYS2.PROGRAM_INFO
WHERE PROGRAM_LIBRARY = UPPER(:library_name)
AND (:program_filter = '*ALL' OR PROGRAM_NAME LIKE UPPER(:program_filter))
ORDER BY PROGRAM_TYPE, PROGRAM_NAME
FETCH FIRST 500 ROWS ONLY
parameters:
- name: library_name
type: string
description: "ライブラリ名"
required: true
- name: program_filter
type: string
description: "プログラム名フィルター"
default: "*ALL"
# ... その他のツール定義(get_service_program_info, get_module_info, など)
get_tables_info:
source: ibmi-system
responseFormat: markdown
description: "テーブル定義と統計情報を取得します。"
statement: |
SELECT
T.TABLE_SCHEMA, T.TABLE_NAME, T.TABLE_TYPE, T.TABLE_TEXT,
T.COLUMN_COUNT, T.LAST_ALTERED_TIMESTAMP,
COALESCE(S.NUMBER_ROWS, 0) AS NUMBER_ROWS, S.LAST_CHANGE_TIMESTAMP
FROM QSYS2.SYSTABLES T
LEFT JOIN QSYS2.SYSTABLESTAT S
ON T.TABLE_SCHEMA = S.TABLE_SCHEMA AND T.TABLE_NAME = S.TABLE_NAME
WHERE T.TABLE_SCHEMA = UPPER(:schema_name)
AND (:table_filter = '*ALL' OR T.TABLE_NAME LIKE UPPER(:table_filter))
ORDER BY T.TABLE_TYPE, T.TABLE_NAME
FETCH FIRST 500 ROWS ONLY
parameters:
- name: schema_name
type: string
description: "スキーマ名"
required: true
- name: table_filter
type: string
description: "テーブル名フィルター"
default: "*ALL"
# ... その他のデータベース関連ツール
get_source_members:
source: ibmi-system
responseFormat: markdown
description: "ソースファイルメンバー情報を取得します。"
statement: |
SELECT
TABLE_SCHEMA, TABLE_NAME, TABLE_PARTITION, NUMBER_ROWS,
DATA_SIZE, SOURCE_TYPE, LAST_CHANGE_TIMESTAMP,
LAST_SOURCE_UPDATE_TIMESTAMP
FROM QSYS2.SYSPARTITIONSTAT
WHERE TABLE_SCHEMA = UPPER(:library_name)
AND (:source_file_filter = '*ALL' OR TABLE_NAME LIKE UPPER(:source_file_filter))
ORDER BY TABLE_NAME, TABLE_PARTITION
FETCH FIRST 500 ROWS ONLY
parameters:
- name: library_name
type: string
description: "ライブラリ名"
required: true
- name: source_file_filter
type: string
description: "ソースファイル名フィルター"
default: "*ALL"
# ... その他のツール定義
toolsets:
asset_inventory_objects:
title: "資産棚卸し - オブジェクト"
description: "プログラム、サービスプログラム、モジュール、依存関係の棚卸しツール"
tools:
- get_object_statistics
- get_program_info
- get_service_program_info
- get_module_info
- get_program_references
- get_object_dependencies
asset_inventory_database:
title: "資産棚卸し - データベース"
description: "データベースオブジェクトの棚卸しツール"
tools:
- get_tables_info
- get_table_columns
- get_indexes_info
- get_views_info
- get_keys_info
- get_triggers_info
- get_constraints_info
- get_procedures_info
- get_functions_info
asset_inventory_source:
title: "資産棚卸し - ソース・構造"
description: "ソースメンバーとプログラムバインド構造を分析するツール"
tools:
- get_source_members
- get_bound_modules
- get_bound_service_programs
asset_inventory_operations:
title: "資産棚卸し - 運用"
description: "スケジュールジョブを含む運用情報のツール"
tools:
- get_scheduled_jobs
asset_inventory_security:
title: "資産棚卸し - セキュリティ"
description: "オブジェクト権限とセキュリティ設定を分析するツール"
tools:
- get_object_privileges
metadata:
version: "1.0.0"
description: "包括的なIBM i資産棚卸しとモダナイゼーション分析ツール"
domain: "development"
category: "asset-inventory"
# Made with Bob
このYAMLファイルを使用して、IBM iのライブラリーに含まれるオブジェクト情報を取得していきます。
MCPサーバーのツールを使用した棚卸しの結果
このツールを実際に使用して資産棚卸しを実施し、その結果を分析していきます。

上記のように既存のオブジェクトの情報も取得できました。

また最近使用していないプログラムオブジェクトや、ソースの存在しないプログラム情報なども取得できました。
ソースは存在するがコンパイル後のPGMが存在しないものも確認できました。

最後に
IBM i のオブジェクトの情報をもとに現在使用していないソースやプログラムを確認することができました。
次回は現在使用しているオブジェクト情報をもとに仕様書の作成や資産の分析を行なっていきます。
(参考)ツールの詳細説明
IBM Bobに作成したyamlファイルについてどのようなツールを使用しているのか説明してもらいました。
作成したYAMLファイルには、5つのカテゴリに分類された合計20個のツールが定義されています。
1. オブジェクト情報ツール(6個)
IBM i上のプログラムやオブジェクトの詳細情報を取得するツール群です。
| ツール名 | 説明 | 主な用途 |
|---|---|---|
get_object_statistics |
オブジェクトの統計情報を取得 | オブジェクトの使用状況、サイズ、作成日の確認 |
get_program_info |
プログラムの詳細情報を取得 | ILE/OPMの判別、ソースファイル情報の確認 |
get_service_program_info |
サービスプログラム情報を取得 | サービスプログラムの活動化グループ、サイズの確認 |
get_module_info |
モジュール情報を取得 | モジュールの言語、最適化レベルの確認 |
get_program_references |
プログラム参照関係を取得 | プログラム間の呼び出し関係の把握 |
get_object_dependencies |
オブジェクト依存関係を取得 | オブジェクト間の依存関係の可視化 |
2. データベースツール(9個)
データベースオブジェクトの構造と内容を分析するツール群です。
| ツール名 | 説明 | 主な用途 |
|---|---|---|
get_tables_info |
テーブル定義と統計を取得 | テーブル一覧、レコード数の確認 |
get_table_columns |
カラム定義を取得 | テーブル構造の詳細確認 |
get_indexes_info |
インデックス情報を取得 | インデックスの有無、ユニーク制約の確認 |
get_views_info |
ビュー定義を取得 | ビューの定義内容、更新可否の確認 |
get_keys_info |
キー情報を取得 | 主キー、外部キーの確認 |
get_triggers_info |
トリガー情報を取得 | トリガーの実行タイミング、対象テーブルの確認 |
get_constraints_info |
制約情報を取得 | テーブル制約の確認 |
get_procedures_info |
ストアドプロシージャ情報を取得 | プロシージャの定義、言語の確認 |
get_functions_info |
関数情報を取得 | ユーザー定義関数の確認 |
3. ソース・構造ツール(3個)
ソースコードとプログラム構造を分析するツール群です。
| ツール名 | 説明 | 主な用途 |
|---|---|---|
get_source_members |
ソースメンバー情報を取得 | ソースファイルの内容、更新日時の確認 |
get_bound_modules |
バインドモジュール情報を取得 | プログラムにバインドされたモジュールの確認 |
get_bound_service_programs |
バインドサービスプログラム情報を取得 | プログラムにバインドされたサービスプログラムの確認 |
4. 運用ツール(1個)
システム運用に関する情報を取得するツールです。
| ツール名 | 説明 | 主な用途 |
|---|---|---|
get_scheduled_jobs |
スケジュールジョブ情報を取得 | 定期実行ジョブの確認、ステータスの把握 |
5. セキュリティツール(1個)
オブジェクトのセキュリティ設定を確認するツールです。
| ツール名 | 説明 | 主な用途 |
|---|---|---|
get_object_privileges |
オブジェクト権限を取得 | ユーザー/グループの権限設定の確認 |
ツールセットの活用
これらのツールは、5つのツールセットにグループ化されており、目的に応じて効率的に使用できます
- asset_inventory_objects: オブジェクト全般の棚卸し
- asset_inventory_database: データベース構造の分析
- asset_inventory_source: ソースコードの追跡
- asset_inventory_operations: 運用状況の確認
- asset_inventory_security: セキュリティ設定の監査
パラメータの使い方
各ツールには柔軟なフィルタリング機能が用意されています
-
library_name/schema_name: 対象ライブラリの指定(必須) -
*_filter: オブジェクト名のフィルタリング(ワイルドカード使用可能)-
'*ALL': すべてのオブジェクトを対象 -
'CUST*': CUSTで始まるオブジェクトのみ -
'*ORDER': ORDERで終わるオブジェクトのみ
-