5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

バイブコーディングでIBMiにあるRPGソースをWebアプリに移植してみた

5
Last updated at Posted at 2025-12-22

はじめに

最近「バイブコーディング」という言葉をよく見かけるようになりました。"vibe"(雰囲気)でコードを書く——つまり細かい実装はAIに任せて、人間は「こんな感じで」と指示を出すだけ、という開発スタイルです。

AS400の開発でもこの世界的なビッグウェーブに乗るために、今回は

IBM i(AS/400)で動いているRPGの業務プログラムを、どこまで現実的にWeb化できるか

を試してみることにしました。使ったのは Anthropic の Claude Code です。

AS400のモダナイゼーションって、仕様調査だけでもしんどいですよね。

  • RPGソースを読む
  • DDS画面定義を読む
  • 物理ファイルの構造を調べる

このあたりもできるだけAIに任せて、どこまで任せられるか というのが今回のテーマです。

今回の構成

使ったものはこんな感じです。

コンポーネント 説明
Claude Code Anthropic製のCLI型AIコーディングアシスタント(とても気に入っています)
as400-mcp AS400のメタデータやソースを取得するMCPサーバー(自作)
IBM i(AS/400) 既存の業務システム(RPG、DDS、物理ファイル)
as400-web-template React + FastAPI のWebアプリ用テンプレート(自作)

「プロジェクトをAIに全部丸投げ」というより、ある程度 下回りをちゃんと用意した上で、どこまで楽できるか を試しています。

AS400連携用のMCPを準備

Claude CodeからAS400の情報を直接取得するため、MCPサーバーを自作しました。

MCPとは

MCP(Model Context Protocol)は、AIが外部のツールやデータにアクセスするための仕組みです。MCPサーバーを用意することで、Claude Codeから

  • データベース
  • ソースファイル
  • システム情報

などにアクセスできるようになります。

既に IBM i MCP Server というIBM公式のMCPサーバーがありますが、運用・管理向けで開発には向かないと感じたので、今回は自分で作成しました。

as400-mcp

今回用意した as400-mcp は、ODBC経由でAS400に接続し、以下のような情報を取得できます。

ツール 内容
list_libraries ライブラリ一覧
list_tables テーブル(物理ファイル)一覧
get_columns カラム情報(日本語ラベル付き)
get_data サンプルデータ取得
list_source_files ソースファイル一覧
list_sources ソースメンバー一覧
get_source RPG / DDSソース取得
list_programs プログラム一覧
get_program_references 依存関係の取得
execute_sql SELECT文実行(読み取り専用)

すべて 読み取り専用 なので、AIが暴走してもデータが壊れることはありません。

ソースはGitHubで公開しています。汎用的に使えるよう設計しているので、他の用途にも使えるはずです

処理の流れ

図にすると単純ですが、実際には Claude Codeが裏で勝手にどんどん調べていく 感じです。

解析対象:部品マスタ保守

今回Web化するのは、GOMライブラリにある「部品マスタ保守」です。典型的なAS400業務画面で、検索・一覧(サブファイル)・登録・変更・削除が揃っています。

オブジェクト タイプ 説明
M@010 RPGLE プログラム本体
M@010D DSPF 画面定義(DDS)
M@BUHNM PF 部品マスタ(物理ファイル)

一覧画面
5250画面:一覧表示

登録画面
5250画面:登録

プログラム(M@010)

RPG ILEで書かれたプログラムです。主な処理は以下の通り。

  • 部品№での検索・位置づけ
  • サブファイルへの一覧表示
  • 登録・変更・削除処理

約500行程度の、よくあるマスタ保守プログラムです

画面定義(M@010D)

DDSで定義された5250画面です。構成は以下の通り。

レコード様式 用途
FMT01 ヘッダー(プログラムID、日時)
FMT02 部品№入力(検索用)
FMT03 登録・変更・削除フォーム
SFL01 / CTL01 一覧表示(サブファイル)
FMT09 メッセージ表示

5250に慣れている人にはおなじみの構成 ですね。

DDSを読むの、正直しんどいです……

テーブル(M@BUHNM)

部品マスタの物理ファイルです。

カラム 日本語名 備考
BUBUNO 部品№ NUMERIC(5,0) 主キー
BUBUNM 部品名 CHAR(50)

いわゆる「よくあるマスタ」です

実演:Claude Codeにやらせてみる

ステップ0:テンプレートプロジェクトを用意

一からプロジェクトを作成することも可能ですが、プロジェクト構成やAS400の接続を含めてすべてAIに説明して作らせるのはあまり建設的ではありません。以下の要件を満たすテンプレートを事前に作成しました。

  • フロントエンドはReact + Material UI(TypeScript)
  • バックエンドはPython + FastAPIで実装
  • AS400とのやりとりにODBCを使用
  • dotenvから設定ファイルを読み込める
  • データベース接続、テーブル一覧表示などのサンプル画面を用意

テンプレートの初期画面
テンプレートの初期画面

ソースはGitHubを参照してください

また上記のプロジェクトを作成したら、as400-mcpREADME.md をみながらプロジェクトに .mcp.json を配置してください。

ステップ1:仕様調査

まずは、かなり雑にこんな指示を出しました。

GOMライブラリのM@010(部品マスタ保守)をWeb画面にしたい。
まずはどのようになるのかレポートして

これだけでClaude Codeが

  • プログラムを探す
  • RPGソースを読む
  • DDSを読む
  • テーブル構造を確認する
  • サンプルデータを見る

を自動的に行い、現状のレポートとWeb画面の提案を出してくれました。

レポート1
Claude Codeの出力:テーブル構造・画面構成の解析

レポート2
Claude Codeの出力:Web画面への変換イメージ

出てきたレポートには、

  • 機能一覧(AS400側)
  • 画面構成の整理(AS400側)
  • Web画面への対応案
  • API構成案
  • バリデーション案

が含まれていました。解析された既存の仕様も正確でしたし、提案されたWeb画面もモダンな仕様になっていました。

正直、大きく訂正するところはありませんでした。細かい表現の調整は必要でしたが、仕様理解としては十分でした。もっと複雑なプログラムならわかりませんが、単純な画面であれば 仕様調査としてはかなり実用的 です。

ステップ2:実装

次に、実装をお願いしました。

部品マスタというWebページとして実装を進めてください。
既存の画面・APIと同じパターンで追加してください

React(TypeScript)+ FastAPI(Python)のテンプレートを事前に用意していたので、Claude Codeはそれを読み取り、同じ構成で実装してくれました。

ホーム画面
生成されたWeb画面:ダッシュボード

一覧画面
生成されたWeb画面:一覧表示

登録画面
生成されたWeb画面:登録ダイアログ

5250画面と比べると、「同じ業務だけど、ちゃんと今風」 という感じです。

実際に動くところまでのやりとりは、だいたいこんな感じでした。

  1. 「部品マスタというWebページとして実装を進めてください。既存の画面・APIと同じパターンで追加してください」
    → ページの表示はすべて成功。ただし部品マスタがホームのDashboardから飛べなかった

  2. 「ホームのダッシュボードにも追加してください」
    → Dashboardからの遷移も行えるようになった。部品マスタの新規登録でDBエラーが発生

  3. (画面に表示されたDBエラーの内容を貼る)
    → コミット制御(ジャーナリング)の問題と判断され自動修正。すべて動作するようになった

これだけのやりとりで動くようになりました。

やってみて思ったこと

RPGLEやDDSの処理を読み込み、意図通りに実装していると感じました。画面遷移や画面構成は、少なくとも今回の範囲では違和感がありませんでした。一番驚いたのは RPG ILEのソースをちゃんと正しく理解していたこと でした。

例えば、一覧画面にある検索フィールドの「部品№」検索は、入力されたコード以上のものを表示する仕様なのですが、

C     F2BUNO        SETLL     M@BUHNM                 ← 入力された部品№以上の位置にセット
C*
C                   DO        *HIVAL
C                   READ(N)   M@BUHNM                                99   ← 順次読み取り
C     *IN99         IFEQ      *ON
C                   LEAVE
C                   ENDIF

ちゃんとこのソースを理解し、Web画面で実装されたデータ抽出の部分が WHERE BUBUNO >= ? というSQL条件になっていました。これは正しくRPG ILEのソースを理解していないとできません。

業務ロジックが複雑だったりするとまだわかりませんが、今回試したような単純な画面の移行なら 実務でも十分試す価値がある と感じました。

まとめ

Claude Code と MCP を組み合わせることで、

  • AS400の既存資産を直接読ませる
  • 仕様整理を自動化する
  • Web実装の叩き台を作る

という流れが作れました。「AIが全部やってくれる魔法」ではありませんが、人間が一番つらいところを肩代わりしてくれる道具 としては、かなり優秀だと思います。

次はもう少し複雑な業務ロジックや、バッチ処理のWeb化に挑戦してみたいと思います。

リポジトリ

今回使用したMCPやテンプレートは以下で公開しています。導入方法などは各READMEを参照してください。

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?