はじめに
MCPサーバーで、YAMLを使ってIBM iの情報を取得するツールを実装してみましたので、ご紹介させていただきます。
プログラミング不要で、SQLを書くだけで新しいツールを追加でき、IBM iから自然言語で様々な情報を引き出すことができます。
今回は、PC上にMCPサーバーを構成して、AIアシスタント(今回はリリース前のIBM Bob)経由でIBM iの情報を取りに行く構成となっています。
MCPサーバーはWindows、Mac、Linuxなどのプラットフォーム上に構成することができますし、IBM i上でも構成できるよう進められています。
🔗 IBM i 向け MCP サーバーの情報:
https://github.com/IBM/ibmi-mcp-server
🔗 IBM i 向け MCP サーバーの構成ガイド:
https://github.com/IBM/ibmi-mcp-server/blob/main/README.md
これらの情報を日本語でまとめた記事がありますのでぜひ参考にしてください。
本記事では、実際の業務で使える YAMLカスタマイズ例と、システム情報を取得するためのYAMLツール作成例を紹介します。
目次
YAMLファイルの基本構造
IBM iの情報をMCPサーバー経由で取得するためのYAMLファイルのフォーマットを紹介していきます。
各YAMLファイルには以下の2つのセクションが存在する必要があります:
sources: データベース接続を定義
tools: 個々のSQL操作を定義
各構成要素については後ほどご紹介しますが、IBM iから情報を取得するためのYAMLファイルの記述方法とサンプルについてはこちらの情報が参考になります。
🔗 IBM i 用YAMLファイルの書き方:
https://github.com/IBM/ibmi-mcp-server/blob/main/tools/README.md
最小構成
sources:
ibmi-system:
host: ${DB2i_HOST}
user: ${DB2i_USER}
password: ${DB2i_PASS}
port: ${DB2i_PORT:8076}
ignore-unauthorized: true
tools:
my_first_tool:
source: ibmi-system
description: "ツールの説明"
parameters: []
statement: |
SELECT * FROM QSYS2.SYSTABLES
FETCH FIRST 10 ROWS ONLY
構成要素の説明
1. sourcesセクション
データソース(IBM i システム)の接続情報を定義します。
sources:
ibmi-system: # データソース名(任意)
host: ${DB2i_HOST} # 環境変数から取得
user: ${DB2i_USER}
password: ${DB2i_PASS}
port: ${DB2i_PORT:8076} # デフォルト値付き
ignore-unauthorized: true # 自己署名証明書を許可
ポイント:
-
${変数名}: 環境変数を参照 -
${変数名:デフォルト値}: デフォルト値を指定可能 - 複数のデータソースを定義可能
2. toolsセクション
実際のツールを定義します。ここでは使用するデータソースや説明、実際に情報を取得するためのSQLに渡すパラメーター、実際に実行するSQL文を記述します。
tools:
tool_name: # ツール名(AIが呼び出す名前)
source: ibmi-system # 使用するデータソース
description: "ツールの説明" # AIがツールを選択する際の参考情報
parameters: # パラメーター定義
- name: param1
type: string
description: "パラメーターの説明"
required: true
statement: | # 実行するSQL
SELECT * FROM TABLE
WHERE COLUMN = {{param1}}
システム管理活用例
例1: ジョブ監視ツール
特定のユーザーやサブシステムのジョブを監視するツールです。IBM iサービスの1つであるQSYS2.ACTIVE_JOB_INFOを参照することでシステム活動ジョブの情報を参照するためのツールになります。
tools:
monitor_user_jobs:
source: ibmi-system
description: "Monitor jobs for a specific user with detailed information"
parameters:
- name: user_name
type: string
description: "User name to monitor (e.g., QSECOFR)"
required: true
- name: include_system_jobs
type: boolean
description: "Include system jobs (default: false)"
required: false
statement: |
SELECT
JOB_NAME,
JOB_USER,
JOB_TYPE,
JOB_STATUS,
SUBSYSTEM,
CPU_TIME,
TOTAL_DISK_IO_COUNT,
TEMPORARY_STORAGE,
FUNCTION,
FUNCTION_TYPE,
RUN_PRIORITY
FROM TABLE(QSYS2.ACTIVE_JOB_INFO())
WHERE JOB_USER = {{user_name}}
AND ({{include_system_jobs:false}} = true
OR JOB_TYPE NOT IN ('SYS', 'BCH'))
ORDER BY CPU_TIME DESC
使用例:
特定ユーザー QSECOFRのジョブを監視してください。
システムジョブも含めて表示してください。
例2: オブジェクトサイズの調査
オブジェクトサイズが設定値を超えているライブラリーを検出するためのツールになります。オブジェクトの情報を参照できるQSYS2.OBJECT_STATISTICSを使い、閾値を設定し、閾値を超えたものをアウトプットするようなツールになります。
tools:
disk_usage_alert:
source: ibmi-system
description: "Find libraries exceeding disk usage threshold"
parameters:
- name: threshold_gb
type: number
description: "Threshold in GB (default: 10)"
required: false
- name: top_n
type: integer
description: "Number of top consumers to return (default: 20)"
required: false
statement: |
SELECT
OBJLIB AS LIBRARY_NAME,
COUNT(*) AS OBJECT_COUNT,
SUM(OBJSIZE) AS TOTAL_SIZE_BYTES,
CASE
WHEN SUM(OBJSIZE) > {{threshold_gb:10}} * BIGINT(1073741824)
THEN 'CRITICAL'
WHEN SUM(OBJSIZE) > {{threshold_gb:10}} * BIGINT(1073741824) * 0.8
THEN 'WARNING'
ELSE 'OK'
END AS STATUS
FROM TABLE(QSYS2.OBJECT_STATISTICS('*ALLUSR', '*FILE'))
GROUP BY OBJLIB
HAVING SUM(OBJSIZE) > {{threshold_gb:10}} * BIGINT(1073741824) * 0.5
ORDER BY SUM(OBJSIZE) DESC
FETCH FIRST {{top_n:20}} ROWS ONLY
使用例:
10GB以上使用しているライブラリーを上位10件リストアップしてください。
カスタムツールの作成
ステップ1: 要件定義
ツールを作成する前に、以下を明確にします:
- 目的: 何を調査・監視するか
- 入力: どんなパラメーターが必要か
- 出力: どんな情報を返すか
- 頻度: どのくらいの頻度で使用するか
ステップ2: SQLの作成
IBM i上で直接SQLを実行してテストします。
-- テスト用SQL
SELECT
JOB_NAME,
CPU_TIME,
TOTAL_DISK_IO_COUNT
FROM TABLE(QSYS2.ACTIVE_JOB_INFO())
WHERE CPU_TIME > 10000
ORDER BY CPU_TIME DESC
FETCH FIRST 10 ROWS ONLY;
ステップ3: YAMLへの変換
テストしたSQLをYAMLファイルに追加します。YAMLファイルへの変換については、AIアシスタントを使用して作成してもらうこともできますね。
tools:
find_cpu_intensive_jobs:
source: ibmi-system
description: "Find jobs consuming high CPU time"
parameters:
- name: min_cpu_ms
type: number
description: "Minimum CPU time in milliseconds (default: 10000)"
required: false
- name: limit
type: integer
description: "Number of jobs to return (default: 10)"
required: false
statement: |
SELECT
JOB_NAME,
JOB_USER,
SUBSYSTEM,
CPU_TIME,
TOTAL_DISK_IO_COUNT,
TEMPORARY_STORAGE,
FUNCTION
FROM TABLE(QSYS2.ACTIVE_JOB_INFO())
WHERE CPU_TIME > {{min_cpu_ms:10000}}
ORDER BY CPU_TIME DESC
FETCH FIRST {{limit:10}} ROWS ONLY
ステップ4: テストと改善
- MCPサーバーを再起動
- AIアシスタントでツールを実行
- 結果を確認して改善
実行例:システム状況レポートの自動生成
実際にIBM iのシステム状況の調査とシステム資源やパフォーマンスについての懸案事項の洗い出しを行うような作業を依頼した例を紹介します。
プロンプト
IBM iのシステムのシステム状況を教えてください。
パフォーマンス面やリソース面で対応が必要な部分は、詳細に調査を行なってください、
結果はマークダウンファイルにまとめて出力をしてください。
実行フロー
AIアシスタントは以下の順序で自動的にツールを実行します:
1. system_status の実行
# quickstart.yaml で定義されたツール
tools:
system_status:
source: ibmi-system
description: "Overall system performance statistics with CPU, memory, and I/O metrics"
parameters: []
statement: |
SELECT * FROM TABLE(QSYS2.SYSTEM_STATUS(RESET_STATISTICS=>'YES',DETAILED_INFO=>'ALL'))
AIの判断: まずシステム全体の概要を把握する必要がある
実行結果の例:
{
"TOTAL_JOBS_IN_SYSTEM": 1111,
"ACTIVE_JOBS_IN_SYSTEM": 238,
"CONFIGURED_CPUS": 1,
"AVERAGE_CPU_UTILIZATION": 0.97,
"SYSTEM_ASP_USED": 74.55,
"MAIN_STORAGE_SIZE": 18874368
}
AIの分析: ディスク使用率74.55%が高い → 詳細調査が必要
2. disk_status の実行
# quickstart.yaml で定義されたツール
tools:
disk_status:
source: ibmi-system
description: "Disk storage information and ASP status"
parameters: []
statement: |
SELECT
ASP_NUMBER,
TOTAL_CAPACITY_AVAILABLE,
TOTAL_CAPACITY,
STORAGE_THRESHOLD_PERCENTAGE
FROM QSYS2.ASP_INFO
AIの判断: ディスク使用率が高いため、詳細を確認
実行結果の例:
{
"TOTAL_CAPACITY": 572699,
"TOTAL_CAPACITY_AVAILABLE": 145728,
"STORAGE_THRESHOLD_PERCENTAGE": 90
}
AIの分析:
- 総容量: 559 GB
- 使用済み: 417 GB (74.55%)
- 閾値90%まで残り15% → 🔴 重大な問題
3. memory_pools の実行
# performance.yaml で定義されたツール
tools:
memory_pools:
source: ibmi-system
description: "Information about memory pool sizes and thread utilization"
parameters: []
statement: |
SELECT POOL_NAME, CURRENT_SIZE, MAXIMUM_ACTIVE_THREADS,
CURRENT_THREADS, RESERVED_SIZE
FROM TABLE(QSYS2.MEMORY_POOL(RESET_STATISTICS=>'YES'))
AIの判断: メモリー状況も確認が必要
実行結果の例:
{
"POOL_NAME": "*BASE",
"MAXIMUM_ACTIVE_THREADS": 223,
"CURRENT_THREADS": 1010
}
AIの分析: スレッド数が最大値の4.5倍 → 🔴 重大な問題
4. library_sizes の実行
# storage-analysis.yaml で定義されたツール
tools:
library_sizes:
source: ibmi-system
description: "Get storage usage by library to identify largest consumers"
parameters: []
statement: |
SELECT
OBJLIB AS LIBRARY_NAME,
COUNT(*) AS OBJECT_COUNT,
SUM(OBJSIZE) AS TOTAL_SIZE_BYTES
FROM TABLE(QSYS2.OBJECT_STATISTICS('*ALLUSR', '*FILE'))
GROUP BY OBJLIB
ORDER BY SUM(OBJSIZE) DESC
FETCH FIRST 30 ROWS ONLY
AIの判断: ディスク容量の問題があるため、どのライブラリーが容量を消費しているか特定
実行結果の例:
[
{
"LIBRARY_NAME": "XXXXLIB",
"OBJECT_COUNT": 49,
"TOTAL_SIZE_BYTES": 52407857152
},
{
"LIBRARY_NAME": "YYYYLIB",
"OBJECT_COUNT": 44,
"TOTAL_SIZE_BYTES": 24646463488
}
]
AIの分析: 上位2ライブラリーで71.7 GBを消費
5. active_job_info の実行
# performance.yaml で定義されたツール
tools:
active_job_info:
source: ibmi-system
description: "Find the top CPU consumers"
parameters:
- name: limit
type: integer
default: 10
statement: |
SELECT CPU_TIME, A.* FROM
TABLE(QSYS2.ACTIVE_JOB_INFO(SUBSYSTEM_LIST_FILTER => 'QUSRWRK,QSYSWRK')) A
ORDER BY CPU_TIME DESC
FETCH FIRST {{limit:10}} ROWS ONLY
AIの判断: CPU消費の多いジョブを特定
6. temp_storage_usage の実行
# storage-analysis.yaml で定義されたツール
tools:
temp_storage_usage:
source: ibmi-system
description: "Get temporary storage usage information"
parameters: []
statement: |
SELECT
JOB_NAME,
TEMPORARY_STORAGE,
CPU_TIME
FROM TABLE(QSYS2.ACTIVE_JOB_INFO())
WHERE TEMPORARY_STORAGE > 0
ORDER BY TEMPORARY_STORAGE DESC
FETCH FIRST 50 ROWS ONLY
AIの判断: 一時ストレージの使用状況も確認
生成されるレポートの構成
AIは収集したデータを分析し、以下の構成でマークダウンレポートを自動生成します:
IBM iシステム状況レポート
📊 エグゼクティブサマリー
🔴 重大な問題
1. **ディスク使用率が74.55%** - 容量不足のリスクあり(閾値90%に接近中)
2. **メモリープールの過負荷** - 1,010スレッドが223の最大アクティブスレッドを大幅に超過
🟡 注意が必要な項目
1. バッチジョブキュー待機が354件
2. 印刷待機ジョブが468件
1. システム概要
[基本情報とハードウェア構成]
2. 🔴 重大な問題の詳細
2.1 ディスク容量不足のリスク
- 現在の使用率: 74.55%
- 閾値までの余裕: 15.45%
- リスクレベル: 高
ストレージ使用量トップ10ライブラリー
| ライブラリー名 | サイズ (GB) | オブジェクト数 |
|-------------|------------|--------------|
| XXXXLIB | 48.8 | 49 |
| YYYYLIB | 22.9 | 44 |
推奨対応策
1. 大容量ライブラリーの監査
2. パフォーマンスデータの整理
3. ジャーナルレシーバーの確認
2.2 メモリープールの過負荷
- 最大アクティブスレッド: 223
- 現在のスレッド数: 1,010
- 問題: スレッド数が最大値の4.5倍
推奨対応策
CHGSHRPOOL POOL(*BASE) MAXACT(500)
3. CPUとパフォーマンス
[CPU使用状況とトップ10ジョブ]
4. 推奨アクションプラン
🔴 緊急対応(24時間以内)
- [ ] XXXXLIB (48.8 GB) の内容監査
- [ ] 最大アクティブスレッド数を500に増加
🟡 短期対応(1週間以内)
- [ ] バッチジョブキューの最適化
- [ ] ストレージ使用状況の詳細分析
使用したMCPツール
1. system_status - システム全体の統計情報
2. disk_status - ディスクストレージ状態
3. memory_pools - メモリープール情報
4. library_sizes - ライブラリー別ストレージ使用量
5. active_job_info - CPU消費量上位ジョブ
6. temp_storage_usage - 一時ストレージ使用状況
ポイント
- 自動判断: AIが状況に応じて必要なツールを選択
- 段階的調査: 概要 → 詳細 → 原因特定の順で調査
- 問題の優先順位付け: 重大度に応じて分類
- 実行可能な推奨事項: 具体的なコマンドや手順を提示
- 透明性: 使用したツールをレポートに記載
この実行例から学べること
- YAMLツールの重要性: 適切に定義されたツールがあれば、AIが自動的に調査を実行
- パラメーターの柔軟性: デフォルト値により、パラメーターなしでも実行可能
- 説明文の重要性: AIがツールを選択する際の判断材料
- 段階的な調査: 1つのツールの結果が次のツール選択に影響
ベストプラクティス
1. 命名規則
# ✅ 良い例:動詞 + 名詞
tools:
find_slow_queries:
monitor_disk_usage:
analyze_job_performance:
# ❌ 悪い例:曖昧な名前
tools:
tool1:
check:
data:
2. 説明文の書き方
# ✅ 良い例:具体的で明確(もちろん日本語でも問題ありません。)
description: "Find jobs consuming more than specified CPU time in QUSRWRK and QSYSWRK subsystems"
description: "CPU、メモリー、I/O状況を含むシステム全体のパフォーマンス統計を取得"
# ❌ 悪い例:曖昧
description: "Get jobs"
3. パラメーターのデフォルト値
# ✅ 良い例:適切なデフォルト値
parameters:
- name: limit
type: integer
description: "Number of results to return (default: 20)"
default: 20
required: false
# ❌ 悪い例:デフォルト値なし
parameters:
- name: limit
type: integer
description: "Number of results"
required: true
4. パフォーマンスの考慮
# ✅ 良い例:FETCH FIRST で制限
statement: |
SELECT * FROM LARGE_TABLE
ORDER BY COLUMN DESC
FETCH FIRST 100 ROWS ONLY
# ❌ 悪い例:制限なし
statement: |
SELECT * FROM LARGE_TABLE
ORDER BY COLUMN DESC
5. エラーハンドリング
# ✅ 良い例:NULLチェック
statement: |
SELECT
COALESCE(COLUMN1, 'N/A') AS COLUMN1,
COALESCE(COLUMN2, 0) AS COLUMN2
FROM TABLE
WHERE COLUMN3 IS NOT NULL
# ❌ 悪い例:NULLチェックなし
statement: |
SELECT COLUMN1, COLUMN2
FROM TABLE
おわりに
いかがだったでしょうか?IBM iの情報を取得するMCPサーバーを使用して取得する際のツールをYAMLで定義する方法をまとめてみました。
IBM iではIBM iサービスというSQLによりIBM iの情報を取得することができるインターフェースを随時拡張しています。これを使うことでSQLを書くことでさまざまなシステムに関する情報を種畜することができます。IBM iサービスはかなり前のバージョンから実装されていますが、これからさらに活用する機会が増えそうですね。
🔗 IBM iサービス:
https://www.ibm.com/docs/ja/i/7.6.0?topic=optimization-i-services
これからはAIアシスタントとの組み合わせでIBM iサービスを活用したシステム管理の方法も増えてくると思います。ちょっと今までとは違ったアプローチでとても新鮮ですね。
まとめ
YAMLによるMCPツール実装の利点
- プログラミング不要: SQL が書ければツールを作成可能
- 即座に反映: ファイルを編集して再起動するだけ
- 柔軟性: パラメーターで動作をカスタマイズ
- 保守性: YAML ファイルで一元管理
- 共有可能: チーム内で簡単に共有
次のステップ
- 既存ツールの改善: パラメーターを追加して柔軟性を向上
- 新規ツールの作成: 業務固有のニーズに対応
- ベストプラクティスの適用: 命名規則とパフォーマンス最適化
- チーム共有: 有用なツールをチームで共有