mcpField
E
explain-abap-code

explain-abap-code

github.com/arc-mcp開発239274 回インストール2 日前に更新
リポジトリ

explain-abap-code について

explain-abap-codeは、ABAP開発者向けにソースコードと依存関係をもとにオブジェクトを説明するスキルです。必要に応じてATCの指摘を分析し、SAPドキュメントも参照します。

主な機能

  1. 01ABAPオブジェクト型の自動判定
  2. 02ソースと関連オブジェクトの読み取り
  3. 03依存グラフとAPI情報の取得
  4. 04必要に応じたATC指摘の分析
  5. 05SAPドキュメントとベストプラクティスの検索

活用シーン

  1. 01ABAPクラス、CDSエンティティ、プログラムの把握
  2. 02RAPビヘイビア定義とハンドラークラスの追跡
  3. 03依存関係と下流への影響の確認
  4. 04ATC指摘の解釈

MCP 対応

ARC-1でSAPシステムにアクセスし、mcp-sap-docsでドキュメントとベストプラクティスを調べます。MCPクライアント向けのサービス提供については記載されていません。

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/arc-mcp/arc-1 --skill explain-abap-code

インストール後、Claude Code で/explain-abap-codeを入力して読み込まれたか確認します。

詳細

ABAP コードを説明する

完全な依存関係のコンテキストと、オプションの ATC コード品質分析を含めて ABAP オブジェクトを説明します。

このスキルは、ARC-1(SAP システムへのアクセス)と mcp-sap-docs(ドキュメントとベストプラクティス)を組み合わせて、SAP Joule の「コードの説明」機能を再現します。SAPContext を使用して圧縮された依存関係グラフを提供することで、J4D を超える機能を実現します。

スマートなデフォルト設定(暗黙的に適用し、質問しない)

設定デフォルト理由
オブジェクトタイプSAPSearch で自動検出ユーザーがタイプを調べる必要がありません
深さ概要まずは概要を示し、必要に応じて詳細を求めてもらいます
ATCなしユーザーがコード品質について尋ねた場合にのみ実行します
依存関係SAPContext で取得常に依存関係グラフを取得します
BDEF ハンドラークラスimplementation in class 句から特定動作ロジックはバインドされたプールクラスにあります

入力

ユーザーは ABAP オブジェクト名(例:ZCL_TRAVEL_HANDLER、ZI_SALESORDER、Z_REPORT_POSTING)を指定します。

必要なのはオブジェクト名だけです。ユーザーがオブジェクト名のみを指定した場合は、タイプを自動検出し、すぐに概要を説明します。

ユーザーは任意で次の項目を指定できます。

  • オブジェクトタイプ(デフォルト:自動検出)
  • ATC の検出結果を説明しますか?(デフォルト:いいえ)
  • 深さ — 「概要」または「詳細」(デフォルト:概要)

ステップ 1:オブジェクトを読み取る

1a. タイプを特定する(指定されていない場合)

ユーザーがタイプを指定しなかった場合は、オブジェクトを検索します。

SAPSearch(query="<object_name>")

最初の結果のタイプを使用します。複数の候補があり曖昧な場合は、ユーザーに確認します。

1b. ソースコードを読み取る
SAPRead(type="<type>", name="<object_name>")
1c. クラスの場合 — メソッド一覧も取得する
SAPRead(type="CLAS", name="<class_name>", method="*")

これにより、シグネチャ、可視性(public/protected/private)、パラメータータイプを含むすべてのメソッドが返されます。クラスの API を理解するうえで不可欠です。

1d. CDS エンティティの場合 — 構造化されたフィールド一覧も取得する
SAPRead(type="DDLS", name="<entity_name>", include="elements")

キーのマーカー、エイリアス、アソシエーション、式のタイプを含む、すべてのフィールドの整形済み一覧が返されます。

1e. (オプション)関連する成果物を読み取る

タイプに応じて、関連オブジェクトも読み取ります。

  • CLAS:SAPRead(type="CLAS", name="<class>", include="testclasses") — テストが存在するか確認します
  • DDLS:SAPRead(type="BDEF", name="<entity>") — 動作定義が存在するか確認します。SAPRead(type="DCLS", name="<entity>_DCL") — CDS アクセス制御を確認します。SAPRead(type="DDLX", name="<entity>") — メタデータ拡張が存在するか確認します
  • BDEF:SAPRead(type="DDLS", name="<entity>") — 関連付けられた CDS ビューを読み取ります

関連する成果物が存在しない場合、これらの読み取りは失敗することがあります。その場合は問題ありません。スキップしてください。

1f. 動作定義(BDEF)の場合 — RAP グラフをたどる

動作定義は、バインドされた CDS ルートエンティティおよび動作プール(ハンドラー)クラスと組み合わせて初めて意味を持ちます。対象オブジェクトが BDEF の場合は、上記の手順の代わりに(または追加で)次の操作を行います。

BDEF のソースを読み取ります。

SAPRead(type="BDEF", name="<bdef_name>")

ソースを読んで実装タイプとバインドされたプールクラスを特定します。

  • コメント以外で最初に現れるトークン:managed / unmanaged / projection / abstract / interface — これが実装の種類です
  • strict ( 2 ) → 最新の RAP 構文チェックが有効です。with draft / with collaborative draft → ドラフトが有効です
  • 句 ... implementation in class <ZBP_NAME> unique; で動作プールクラスを指定します。正規表現 implementation\s+in\s+class\s+(\S+) などを使って <ZBP_NAME> を抽出します。(projection; BDEF にはプールクラスがなく、use ... を介してベースの動作を再利用する場合があります。)

動作プールクラスを読み取ります(ハンドラーのロジックはローカルインクルード(通常は CCIMP)にあります)。

SAPRead(type="CLAS", name="<ZBP_NAME>", include="implementations")

結果が空の場合は、include="definitions"(CCDEF)とメインインクルードも試してください。ローカルハンドラークラスの名前は lhc_<alias> です。各 FOR DETERMINE / FOR VALIDATE / FOR MODIFY メソッドが、対応する BDEF 宣言を実装します。

バインドされた CDS ルートエンティティを読み取り、動作が対象とするデータモデルを把握します。

SAPRead(type="DDLS", name="<root_cds>", include="elements")

ルート CDS 名は define behavior for <root_cds> alias <alias> に記載されています。

projection BDEF の場合は、その基となる BDEF(投影元の BDEF)も読み取り、どの操作が再利用されるか(use create; use update; use action ...)を確認します。

アーティファクトが存在しない場合(純粋な abstract BDEF など)は、読み取りに失敗することがあります。その場合は適切にスキップしてください。

1g. 関数グループ(FUGR)の場合 — コードツリー全体を読み取る

関数グループのロジックは、ネストされたインクルードに分散しています。メインプログラムは TOP(グローバルデータ)および UXX(関数モジュールのディスパッチャー)インクルードを参照し、実際の FUNCTION … ENDFUNCTION 本体は、UXX から読み込まれるさらにネストされた LZ<grp>U01/U02… インクルードにあります(PBO/PAI サブルーチンは …O…/…I… インクルードにあります)。expand_includes を使い、1 回の呼び出しですべてのツリーを読み取ります。

SAPRead(type="FUGR", name="<group>", expand_includes=true)

メインソースに加え、ネストされたすべてのインクルードが(再帰的に、深さと件数に上限を設けて)返され、それぞれに === <name> === マーカーが付きます。これにより、すべての関数モジュール本体とフローロジックを一度に読み取れます。expand_includes を指定しない場合は、関数モジュールの一覧しか取得できません。

画面フローは利用できません。 Dynpro(画面)と GUI ステータス(CUA)は ADT over REST では公開されていません。これらは SAPGUI 専用(SE51/SE41)であり、エンドポイントは 404 を返します。そのため FUGR については、コードから業務上の目的、関数モジュールの役割、フローロジックを説明できますが、画面レイアウトや、PBO/PAI モジュールのコードから読み取れる範囲を超える PBO-PAI 画面シーケンスは説明できません。ユーザーから画面フローについて具体的に尋ねられた場合は、この制約を伝えてください。

Step 2: 依存関係のコンテキストを取得する

SAPContext(type="<type>", name="<object_name>")

これにより、すべての依存関係が自動的に抽出され、それぞれの圧縮された公開 API コントラクトが取得されます。以下の情報が得られます。

  • クラスの場合:使用されるインターフェース、スーパークラス、注入された依存関係、他のクラスに対して呼び出されるメソッド
  • CDS ビューの場合:データソース(FROM、JOIN)、アソシエーション、コンポジション、プロジェクションのベース
  • プログラムの場合:呼び出される汎用モジュール、使用されるクラス、インクルードプログラム

依存関係が深く複雑につながるオブジェクトの場合は、depth=2 を使用します。

SAPContext(type="<type>", name="<object_name>", depth=2)

SAPContext が失敗した場合(未対応のタイプなど)は、ソースコードから特定した主要な依存関係を手動で読み取ってください。

対応タイプ: SAPContext は、(オンプレミスでは)CLAS、INTF、PROG、FUNC、DDLS、(BTP では)CLAS、INTF、DDLS を受け付けます。BDEF は受け付けません。そのため、BDEF を説明する際は、代わりにバインドされた CDS ルートエンティティに対して依存関係/影響分析を実行してください。

SAPContext(action="impact", name="<root_cds>")

action="impact"(DDLS のみ)は、下流への影響範囲、つまりその振る舞いを基に構築されるプロジェクションビュー、コンシュンプションビュー、サービスを返します。これは、振る舞い定義についての「依存関係/これを利用しているもの」の回答です。ハンドラークラスの内部については、SAPContext(type="CLAS", name="<ZBP_NAME>") を実行してください。

Step 3: (任意)ATC チェックを実行する

ユーザーがコード品質や ATC の指摘事項について説明を求めた場合:

SAPDiagnose(action="atc", type="<type>", name="<object_name>")

特定の ATC バリアントが必要な場合(例:S/4HANA 対応状況):

SAPDiagnose(action="atc", type="<type>", name="<object_name>", variant="<variant>")

指摘事項を優先度別に分類します。

  • 優先度 1(エラー):必ず修正すべき問題 — 非推奨 API、構文上の問題
  • 優先度 2(警告):修正が望ましい問題 — パフォーマンス、保守性
  • 優先度 3(情報):修正するとよい問題 — スタイル、規約
  • 各指摘事項の hasQuickfix フラグを確認します。true の場合、その箇所に SAP が機械適用可能なクイックフィックス案を提供していることを伝えてください。

Step 4: (任意)mcp-sap-docs で調査する

ソースコード内で見つかった、なじみのない SAP API について:

search("<class_or_function_name> ABAP documentation")

説明が必要な ATC の指摘事項について:

search("<checkTitle> simplification item S/4HANA")

利用可能な SAP Notes について:

sap_notes_search(q="<finding_or_api_name>")

ドキュメントの検索結果を使って、SAP の公式な情報を補足しながら説明を充実させます。

Step 5: 説明する

以下のセクションを含む、構造化された説明を提示します。ユーザーの希望(概要または詳細)に応じて説明の詳しさを調整してください。

概要
  • 目的:オブジェクトの機能を一文で説明
  • タイプ:オブジェクトのタイプと分類(例:「RAP ビヘイビアプール」、「インターフェース CDS ビュー」、「ALV レポート」)
  • 範囲:メソッド/フィールド/行の数、複雑さの評価
公開 API

クラスの場合:

  • 主な公開メソッドとそのシグネチャおよび目的
  • 実装されているインターフェース
  • コンストラクターのパラメーター(特に注入された依存関係)
  • 発生するイベント

CDS ビューの場合:

  • ビジネス上の意味を含む公開フィールド
  • パラメーター(ある場合)
  • ナビゲーションに使用できるアソシエーション
ビジネスロジック
  • 中核となる処理フロー(主要なメソッドが呼び出されたときの動作)
  • 重要なビジネスルールと条件
  • データ変換と計算
  • エラー処理の方法
動作定義(オブジェクトが BDEF の場合)

ステップ 1f で確認した RAP 動作グラフに沿って説明を構成します。

  • 実装の種類:managed/unmanaged/projection/abstract/interface のいずれかと、それが意味すること(フレームワークが提供する CRUD、カスタムハンドラー、再利用/型定義レイヤー)。strict(2) と with draft があれば記載します。
  • ビジネス上の目的:バインドされた CDS ルートエンティティと BDEF ヘッダーコメントから導きます。
  • エンティティごとのモデル:define behavior for <CDS> alias <alias> ごとに、永続テーブル、lock master/lock dependent、authorization master/authorization dependent、etag を示します。
  • 操作(CRUD グラフ):create/update/delete、関連付けによる作成(association _X { create; })、およびドラフトアクション(Edit、Activate、Discard、Resume、Prepare)の有無を示します。
  • 判定:determination <name> on save|on modify ごとに、何を導出するかをプールクラス内の対応する FOR DETERMINE メソッドから読み取ります。
  • 検証:validation <name> on save ごとに、何を強制するかを FOR VALIDATE メソッドから読み取ります。
  • アクション/関数:action <name>(static/factory/parameter/result を含む)を FOR MODIFY/FOR READ メソッドから示します。
  • 副作用:side effects { ... } の宣言と、それが引き起こす UI の更新/再計算を示します。
  • フィールド制御:field ( readonly | mandatory | numbering : managed )、mapping for <table> を示します。
  • projection BDEF の場合:use ... で再利用される基底の操作/アクションを示します。
依存関係

SAPContext の結果から、以下を示します。

  • 直接的な依存関係とその役割(データソース、ヘルパー、フレームワーク)
  • 使用されている主要なインターフェイス/クラスとその理由
  • 外部システム呼び出し(RFC、HTTP など)があれば、その内容
  • アクセスされるデータベーステーブル
セキュリティ/認可
  • CDS アクセス制御(DCLS)ルールがあれば、その内容(行レベルの制限、ロールのマッピング)
  • BDEF に authorization master、authorization dependent by があれば、動作レベルの認可に関するヒントを示します。
  • 実際の影響:実行時に制限される可能性のあるデータ/操作を示します。
コード品質(ATC が実行されている場合)

ATC の結果から、以下を示します。

  • 概要:優先度別の指摘件数
  • 主な指摘とその影響の説明
  • 改善の推奨事項
次のステップ

ユーザーに次のステップを提案します。

  • 「特定のメソッドについて詳しく説明しましょうか?」
  • 「ATC の指摘に対する SAP のクイックフィックス案を取得しましょうか?」(→ SAPDiagnose(action="quickfix"))
  • 「 に対する SAP のクイックフィックスを適用しましょうか?」(SAP が検証した修正案と apply_quickfix を使用)
  • 「ATC の指摘を分析して、修正案を提案しましょうか?」(→ migrate-custom-code スキル)
  • 「このクラスの単体テストを生成しましょうか?」(→ generate-abap-unit-test スキル)
  • 「依存関係グラフ全体を表示しましょうか?」(→ depth=2 の SAPContext)
  • BDEF の場合:「不足している判定/検証/アクションの本体を実装しましょうか?」(→ generate-rap-logic スキル)、または「動作プールのハンドラーをスキャフォールドしましょうか?」(→ SAPWrite(action="scaffold_rap_handlers"))

エラー処理

よくある問題と対処方法
エラー原因対処方法
オブジェクトが見つからない名前のスペルミス、またはオブジェクトが存在しないSAPSearch を使って類似した名前を探します
SAPContext が失敗するオブジェクトの種類が依存関係の分析に対応していないソース内で見つかった主要な依存関係を手動で読み取ります
ATC チェックで検出事項がないATC の設定がない、またはコードに問題がない検出事項がないのは良い知らせだとユーザーに伝えます
ATC バリアントが見つからない指定されたバリアントがシステムに存在しないデフォルトの ATC を実行し、利用可能なバリアントを一覧表示します
メソッド一覧が空オブジェクトがクラスではない、またはメソッドがないメソッド一覧の取得を省略し、ソースのみをもとに説明します
ソースが空オブジェクトは存在するもののソースがない(生成されたプロキシなど)ユーザーに伝え、代わりに関連オブジェクトを読み取ります
SAPContext が BDEF 型を拒否するBDEF はサポート対象の SAPContext 型ではない代わりに、バインドされた CDS ルートで SAPContext(action="impact", name="<root_cds>") を実行します
BDEF のプールクラスが見つからないprojection; BDEF(独自のプールがない)、またはクラス名の解析ミスクラスの読み取りを省略し、プロジェクションの use 句とベース BDEF に基づいて説明します

注意事項

BTP とオンプレミスの違い
  • BTP:利用できるオブジェクトの種類が少なく、PROG、INCL、FUGR はありません。リリース済み API と ABAP Cloud オブジェクトに重点を置きます。主な種類は DDLS、DCLS、CLAS、INTF、BDEF、DDLX、SRVD です。ATC バリアントはクラウド対応チェックに限られます。
  • オンプレミス:すべての種類のオブジェクトを利用できます。すべての ATC バリアントを利用できます。レガシーオブジェクト(FORM ルーチン、汎用モジュール、従来型レポート)について説明できます。
このスキルで行わないこと
  • コードの変更なし:このスキルは読み取りと説明のみを行い、コードの書き込みや変更は行いません
  • リファクタリングの提案なし:改善案については、ATC 分析または移行スキルを使用してください
  • テストの生成なし:テストの生成には、generate-abap-unit-test または generate-cds-unit-test スキルを使用してください
  • システム間の比較なし:一度に 1 つのシステム上のオブジェクトについて説明します
このスキルを使用するタイミング
  • 不慣れなコードベースのオンボーディング時
  • バグを調査するとき、または既存の動作を理解するとき
  • 移行前にコード品質を確認するとき
  • ドキュメントのないオブジェクトを文書化するとき
  • 共有クラスや CDS ビューの変更による影響を理解するとき

コメント