sap-adt-mcp について
sap-adt-mcpはADT経由でMCP対応クライアントをSAPシステムに接続し、単一または複数の環境で作業するABAP開発者を支援します。開発ツールに加え、読み取り専用の制御と書き込みのローカル記録を備えています。
主な機能
- 01ABAPソースの取得と編集
- 02構文チェック、テスト、ATCの実行
- 03オブジェクト検索とパッケージ閲覧
- 04バージョンとSAPシステム間の比較
- 05移送とデバッグの管理
- 06読み取り専用制御とローカル監査ログ
活用シーン
- 01ABAPオブジェクトの確認と更新
- 02コード品質の確認と単体テスト
- 03SAPシステム間のソース比較
- 04変更内容と移送キューの確認
MCP 対応
MCPサーバーは50以上の高水準ツールに加え、汎用リクエストツールと5つのClean Coreプロンプトを通じてADT操作を公開します。クライアントは設定済みのSAPシステムを選択でき、読み取り専用モードで書き込みを禁止できます。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
npx -y sap-adt-mcpSAP_ADT_MCP_CONFIGAbsolute path to your config.json (host/client/user/password per SAP system). Defaults to ~/.sap-adt-mcp/config.json. See config.example.json in the repo.ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。
ツール
ローカルサーバーのツールはマシン上で起動して初めて取得できます。メンテナーはまだツール一覧を提供していません。
詳細
sap-adt-mcp
Claude(およびMCP互換クライアント)に、ADT経由でSAPシステムへのライブアクセスを提供するMCPサーバーです。
ソースの閲覧、リポジトリ内の検索、構文チェック、ユニットテストの実行、 ATCの実行、ランドスケープ間での同一オブジェクトの差分確認、ABAPの編集と有効化まで、すべて チャットウィンドウや自律型エージェントから行えます。SAP スタックへのアドオンインストールは不要です。
このサーバーが必要な理由
SAP開発では、ソースの確認、呼び出し元の調査、システム間の差分確認といった、繰り返しの多い作業がたくさんあります。AIアシスタントは、まさにこうした作業を得意としています。ただし、システムにアクセスできることが条件です。ADT(ABAP Development Tools)はEclipseが使用するHTTP APIで、最新のNetWeaverおよびS/4システムにはすべて搭載されています。このサーバーはエージェントに代わってADTと通信するため、Eclipseを使う開発者に付与するのと同じ認証情報とアクセス範囲で、エージェントが実際のシステム上で実作業を行えます。
同梱内容
一般的な ADT エンドポイントをラップした50 個以上の高レベルツールに加え、その他のあらゆる操作に対応する汎用の抜け道、さらにツール群を成果に直結するスラッシュコマンドに変える、ユーザーが呼び出せる5 つの Clean Core プロンプトが含まれています(下記のClean Core プロンプトを参照)。
| カテゴリ | ツール |
|---|---|
| 接続 | adt_list_systems, adt_ping, adt_system_info |
| ソースの CRUD | adt_get_source, adt_set_source |
| 品質 | adt_syntax_check, adt_pretty_print, adt_run_unit_tests, adt_run_atc, adt_run_atc_package, adt_run_atc_transport |
| ライフサイクル | adt_create_object, adt_delete_object, adt_activate, adt_lock, adt_unlock, adt_list_inactive_objects |
| バージョン | adt_list_versions, adt_compare_versions |
| 検索と確認 | adt_browse_package, adt_list_packages, adt_search_objects, adt_grep_source, adt_where_used |
| CDS | adt_cds_data_preview, adt_cds_dependencies, adt_list_released_apis |
| システム間 | adt_compare_source, adt_transport_diff |
| トランスポート | adt_list_transports, adt_get_transport, adt_create_transport, adt_release_transport, adt_transport_queue |
| 実行時エラー | adt_list_dumps, adt_get_dump |
| デバッガー | adt_debug_set_breakpoint, adt_debug_delete_breakpoint, adt_debug_listen, adt_debug_stack, adt_debug_variables, adt_debug_step, adt_debug_goto_stack, adt_debug_set_variable, adt_debug_set_watchpoint, adt_debug_delete_watchpoint, adt_debug_stop |
| データ | adt_read_table, adt_value_help |
| 生成 | adt_rap_scaffold |
| 実験的機能¹ | adt_get_note, adt_check_note_status, adt_implement_note, adt_list_locks, adt_schedule_job, adt_read_spool |
| 抜け道 | adt_request |
¹ 実験的なツールは、従来の NetWeaver では公開されていない ADT エンドポイント(SNOTE、SM12 のエンキュー、SM36/SP01)を対象としています。このようなシステムでは失敗する代わりに、フォールバックのヒントとともにavailable:falseを返します。バックエンドサービスが存在する環境(通常は S/4HANA)では動作します。
マルチシステム対応。 1 つの設定で複数の SAP システム(DEV / QAS / PRD またはランドスケープ全体)を扱えます。system引数で切り替えるか、adt_compare_source / adt_transport_diffを使って 2 つのシステム間で比較できます。
デフォルトで安全。 グローバルまたはシステムごとのreadOnlyフラグにより、すべての書き込みメソッドがブロックされます。読み取り専用の POST クエリ(検索、使用箇所、パッケージツリー)は引き続き許可されるため、エージェントは検索や確認を行えます。
堅牢。 リクエストごとにタイムアウトを設定できます。403 の場合は CSRF トークンのネゴシエーションを再試行します。自己署名証明書の検証を無効化できます。オプションで stderr へのデバッグトレース出力にも対応しています。
構造化されたエラー。 ADT の<exc:exception>エンベロープを{ type, message, namespace }に解析するため、呼び出しに失敗しても XML がエージェントのコンテキストウィンドウに出力されません。
インストール
以前は
claude-for-abapとして公開されていました。このパッケージも引き続き動作しますが、非推奨です。新規インストールではsap-adt-mcpを使用してください。
# global
npm install -g sap-adt-mcp
# or run without installing
npx sap-adt-mcp
Node.js 22.19 以降が必要です(HTTP クライアントとして使用される undici v8 がこのバージョン以上を必要とします)。
設定
設定を作成します。
mkdir -p ~/.sap-adt-mcp
cp config.example.json ~/.sap-adt-mcp/config.json
$EDITOR ~/.sap-adt-mcp/config.json
サーバーは次の順序で設定を検索します。
$SAP_ADT_MCP_CONFIG(絶対パス)~/.sap-adt-mcp/config.json./config.json(サーバー起動時の cwd)
設定例
{
"defaultSystem": "DEV",
"readOnly": false,
"systems": {
"DEV": {
"host": "https://sap-dev.example.com:44300",
"client": "100",
"language": "EN",
"user": "DEVELOPER",
"password": "env:SAP_DEV_PASSWORD",
"rejectUnauthorized": false
},
"QAS": {
"host": "https://sap-qas.example.com:44300",
"client": "200",
"user": "DEVELOPER",
"password": "env:SAP_QAS_PASSWORD"
},
"PRD": {
"host": "https://sap-prd.example.com:44300",
"client": "300",
"user": "READONLY",
"password": "env:SAP_PRD_PASSWORD",
"readOnly": true
}
}
}
システムごとのオプション
| フィールド | 説明 |
|---|---|
host | スキームと ICM HTTPS ポートを含むベース URL(例:https://...:44300)。 |
client | SAP クライアント(sap-clientクエリパラメーターを設定します)。 |
language | 任意のログオン言語(sap-languageを設定します)。 |
user | RFC ユーザー。 |
password | 文字列を直接指定するか、環境変数から読み込む場合はenv:VAR_NAMEを指定します。 |
rejectUnauthorized | 自己署名証明書の TLS 検証をスキップするにはfalseに設定します。デフォルトはtrueです。 |
readOnly | このシステムへの POST / PUT / DELETE / PATCH をブロックします(読み取り専用の POST クエリは引き続き使用できます)。 |
timeoutMs | デフォルトの 30 秒のリクエストタイムアウトを上書きします。 |
読み取り専用モード
readOnly: true(トップレベルまたはシステムごとに設定)を指定すると、安全でない HTTP メソッドが拒否されます。
ホワイトリストに登録された読み取り専用の POST エンドポイント(nodestructure、search、
usagereferences、parsers、checkruns)は引き続き利用できるため、エージェントは変更を加えることなく、
検出や分析を行えます。
推奨:QAS および PRD プロファイルには readOnly: true を設定してください。DEV は書き込み可能な状態にしてください。
自己署名証明書
多くの内部 SAP システムでは自己署名証明書を使用しています。"rejectUnauthorized": false
を設定すると、そのプロファイルのみ TLS 検証が無効になります。PRD では設定しないでください。
監査ログ
サーバーが SAP に対して実行するすべての書き込み(POST/PUT/DELETE/PATCH — ロック、 ソースの更新、アクティベーション、移送操作)は、どの MCP ツールが実行したかを含めてローカルの JSONL ファイルに追記されます。読み取り専用モードでブロックされた試行については、その違反内容も記録されます。 読み取りと読み取り専用のクエリは記録されません。データがマシンの外部に送信されることはありません。これは「AI は具体的に 何を変更したのか?」を確認するためのローカルな記録です。
デフォルトの場所:~/.sap-adt-mcp/audit.log。1 行につき 1 つの JSON オブジェクトです。
{"ts":"2026-06-11T12:00:00.000Z","tool":"adt_set_source","host":"https://...","sapUser":"DEVELOPER","method":"PUT","path":"/sap/bc/adt/programs/programs/ztest/source/main","status":200,"ok":true,"transport":"E4DK900123"}
設定または無効化:
{ "audit": { "enabled": false, "path": "/var/log/sap-adt-mcp/audit.log" } }
…または SAP_ADT_MCP_AUDIT=0 を設定します(false/no/off も使用できます)。
結果キャッシュ
エージェントは、推論中に同じ検出呼び出しを繰り返します。読み取り専用ツール
adt_search_objects、adt_browse_package、adt_list_packages、
adt_where_used、adt_system_info、adt_value_help の結果は、システムと引数の組み合わせごとに
60 秒間メモリ内にキャッシュされます。このサーバーが書き込みを行うとキャッシュ全体が破棄されるため、自分の変更による古い結果を
読み直すことはありません。別の場所(SAP GUI、Eclipse)で行われた変更は、最大で TTL 期間分だけ古い可能性があります。キャッシュされた
結果には _meta["sap-adt-mcp/cache"] = { hit: true, ageMs } が付与されます。
{ "cache": { "ttlMs": 120000 } }
"ttlMs": 0(または SAP_ADT_MCP_CACHE_TTL_MS=0)を設定すると無効になります。
自動エラー報告
サーバーは、欠陥の発見と修正に役立てるため、メンテナーに少量の機密情報を除去したレポートを送信します。 これはデフォルトで有効になっており、起動時にその旨が通知されます。チャンネルは 3 つあります。
- クラッシュ — ツールハンドラーが予期しないエラーをスローした場合。
- ADT エラー — 分類器がツールのバグである可能性が高いと判定した、非 2xx の ADT 応答をツールが返した場合 (406/415 のコンテントネゴシエーション、形式不正なリクエスト、サーバーのディスパッチャーのクラッシュなど)。ユーザー/業務側の応答(401/403/404、ロックやエンキューの競合、データプレビューの SQL エラー)は 報告されません。
- エージェントによる報告 — 成功した応答に誤ったデータが含まれる、パラメーターが無視される、機能が不足しているといった、他の 2 つのチャンネルでは検出できない欠陥を、呼び出し元のエージェントが**
adt_report_issue**ツールを使って報告した場合。
送信される情報:sap-adt-mcp のバージョン、Node のバージョン、OS、ツール名、重複排除用フィンガープリント付きのエラー/報告内容に加え、同じインストールからの繰り返し報告をトリアージ用にまとめる匿名インストール ID(ランダムなバイト列で、~/.sap-adt-mcp/install-id にキャッシュされます)。これはあなたやシステムを特定するものではありません。マシンの外部に送信される前に、ホスト名、ユーザー名、パスワード、トークン、IP アドレス、メールアドレスが削除されます。ツールの引数と自由記述フィールドも同様に機密情報が削除されます。レポートはメンテナーが所有するリレーに送られ、そこで GitHub の issue の作成と重複排除が行われます。GitHub の認証情報はリレーが保持し、このパッケージが保持することはありません。
すべて無効にするには:
{ "reporting": { "enabled": false } }
…または SAP_ADT_MCP_REPORT=0 を設定します(false/no/off も使用できます)。詳細な設定:
| キー | デフォルト | 効果 |
|---|---|---|
reporting.enabled | true | 3 つすべてのチャンネルのマスタースイッチです。 |
reporting.adtErrors | true | チャンネル 2(フラグが付いた ADT エラーの自動報告)です。 |
reporting.allowManual | true | チャンネル 3(adt_report_issue ツール)です。 |
reporting.includeArgs | true | 機密情報を削除したツール引数/再現用引数を含めます。注:オブジェクト名が含まれる場合があります。 |
reporting.endpoint | リレー URL | 独自のリレーを指定します(worker/ を参照)。 |
クライアントを接続する
Claude Code(CLI)
claude mcp add sap-adt -- npx sap-adt-mcp
登録時にシークレットを渡します:
claude mcp add sap-adt \
--env SAP_DEV_PASSWORD=... \
--env SAP_PRD_PASSWORD=... \
-- npx sap-adt-mcp
Claude Desktop
claude_desktop_config.json を編集します(Settings → Developer → Edit Config):
{
"mcpServers": {
"sap-adt": {
"command": "npx",
"args": ["-y", "sap-adt-mcp"],
"env": {
"SAP_DEV_PASSWORD": "..."
}
}
}
}
変更を適用するには、Claude Desktop を完全に終了(システムトレイ → Quit)してから再起動します。
接続前の検証
npx sap-adt-mcp --validate-config
設定を読み込み、すべてのシステムに ping を送信します。到達できないシステムや認証情報を拒否するシステムがある場合は、ゼロ以外の値で終了します。トラブルシューティングの際は、まずこれを実行してください。
ツール
オブジェクトソースの CRUD
| ツール | 目的 | 備考 |
|---|---|---|
adt_get_source | オブジェクト名とタイプを指定して ABAP ソースを取得します。 | プレーンテキストを返します。クラスの場合は、include でインクルードを選択します:main(デフォルト)、definitions、implementations、macros、testclasses。関数モジュールには group が必要です。大きなオブジェクトの場合は、outputFile を指定するとソースを直接ディスクに書き込みます(レスポンスにはインラインの source は含まれません)。 |
adt_set_source | ソースを置き換えます。ロック → PUT → ロック解除を実行します。 | 新しいソースは source でインライン指定するか、または1回の呼び出しあたりの I/O 上限を超える大きなオブジェクトの場合は sourceFile(MCP が読み込むローカルパス)で指定します。省略可能な transport は変更を TR(corrNr)に割り当てます。省略可能な lockHandle は、外部で取得したロックを再利用します。readOnly: true の場合は拒否されます。 |
adt_create_object | パッケージに新しい ABAP オブジェクトを作成します。 | 対応タイプ:program、class、interface、include、functiongroup、function、cds、accesscontrol、metadataext、behaviordef、messageclass。作成後、adt_set_source でソース本文を設定し、有効化します。readOnly: true の場合は拒否されます。 |
adt_delete_object | オブジェクトを削除します。 | ロックを取得して DELETE を実行します。readOnly: true の場合は拒否されます。 |
adt_activate | 1つ以上のオブジェクトを有効化します。 | objects: [{ name, type, group? }] を渡します。 |
adt_pretty_print | SAP 側の ABAP フォーマッターを実行します。 | ステートレスです。ソースを渡すと、フォーマット済みソースが返されます。 |
adt_lock / adt_unlock | 複数手順の編集用にロックを取得/解除します。 | 1回限りの編集では、ロックを自動管理する adt_set_source を優先してください。単一のエージェントターン内で複数回書き込む間、オブジェクトのロックを維持する必要がある場合に使用します。 |
品質
| ツール | 目的 | 備考 |
|---|---|---|
adt_syntax_check | オブジェクトの ADT 構文チェックを実行します。 | <chkrun:reports> XML を返します。エージェントは重要度と行番号を読み取ります。 |
adt_run_unit_tests | ABAP Unit を実行します。 | テストコンテナーオブジェクト(通常はクラス)を渡します。 |
adt_run_atc | ABAP Test Cockpit を実行します。 | API の仕様は NW のリリースによって異なります。Caveats を参照してください。 |
検索
| ツール | 目的 | 備考 |
|---|---|---|
adt_browse_package | パッケージの内容を1階層分表示します。 | タイプ別の counts を返します。オブジェクトが500件を超える場合、最初の500件のみが返されます(truncated: true)。full: true を指定するとすべて返されます。 |
adt_list_packages | ルートから再帰的にたどります。 | prefix(一致するサブパッケージのみをたどる)と、安全上限の maxPackages(デフォルトは200)を指定できます。常にタイプ別の totals を返します。ツリー内のオブジェクトが500件を超える場合、full: true を指定しない限り、パッケージごとの entries は省略されます(件数は表示されます)。 |
adt_search_objects | 名前パターンでクイック検索します。 | * ワイルドカードを使用します。解析済みの { name, type, description, packageName, uri } レコードを返します。 |
adt_where_used | 使用箇所一覧を表示します。 | 同じ形式の解析済みレコードを返します。maxResults(デフォルトは200)で上限が設定されます。一覧が途中で切られた場合、レスポンスにはバックエンド独自の numberOfResults と truncated が含まれます。 |
システム間
| ツール | 目的 | 備考 |
|---|---|---|
adt_compare_source | 2つのシステム間で1つのオブジェクトを比較します。 | 統合 diff と { added, removed } の統計情報を返します。 |
adt_transport_diff | 2つのシステム間で TR 内のすべてのオブジェクトを比較します。 | maxObjects(デフォルトは50)で上限が設定されます。 |
ランタイムエラー
| ツール | 目的 | 備考 |
|---|---|---|
adt_list_dumps | ST22 のショートダンプを一覧表示します。 | オプションのフィルター:user、host、from/to(YYYYMMDD)、maxResults(デフォルトは 20)。Atom フィードを解析して、runtimeError、program、user、updated と、リリース固有の rba:*/dump:* フィールドをマップとして含む構造化エントリを返します。一部のリリースではサーバー側の上限が無視されるため、クライアント側で件数を制限します。 |
adt_get_dump | ID を指定して単一のダンプを取得します。 | 2 段階で取得します。メタデータ XML(ランタイムエラー、プログラム、リンク)を取得した後、dump:link relation="contents" サブリソースから整形済みのダンプテキストを取得します。chapters マップ(shortText、whatHappened、errorAnalysis、howToCorrect、whereTerminated、sourceCodeExtract、…)を返します。chapters: [...] を指定すると対象を限定でき、full: true を指定すると未加工のテキストが含まれます。 |
デバッガー
ADT の /sap/bc/adt/debugger/* API を使用する外部 ABAP デバッガーです。ブレークポイントを設定し、セッションがそこで停止するまで待ってから、スタックや変数を調べ、ステップ実行し、(ガード付きで)値を変更します。バックエンドでデバッグ権限が必要です。最低要件は NW 7.31 SP04 + Kernel 7.21 です(S/4 では問題なく動作します)。
| ツール | 目的 | 備考 |
|---|---|---|
adt_debug_set_breakpoint | 外部ブレークポイントを設定します。 | uri、または object+type(+include)+line を指定します。condition は任意です。ブレークポイントの id を返します。 |
adt_debug_delete_breakpoint | id でブレークポイントを削除します。 | |
adt_debug_listen | デバッグ対象がブレークポイントに到達するまで、指定時間待機します。 | { caught: true, debuggee, … } を返して自動的にアタッチします。タイムアウト時は { caught: false } を返します(デフォルトは 30 s、上限は 55 s)。そのまま再度呼び出してください。プロセスごとにリスナーは 1 つです。 |
adt_debug_stack | アタッチ済みのデバッグ対象のコールスタックを取得します。 | |
adt_debug_variables | 変数の値を読み取ります。 | names: ['sy-subrc','lv_total'] のように指定します。スコープのルートを取得する場合は省略します。 |
adt_debug_step | 実行を進めます。書き込み操作です。 | kind:into / over / return / continue / runToLine / jumpToLine(uri が必要)/ terminate。実行を完了させる continue は status: "debuggeeEnded" を返します。これは成功です。 |
adt_debug_goto_stack | アクティブなスタックフレームを切り替えます。書き込み操作です。 | スタックから取得した stackUri、または 0 始まりの position を指定します。 |
adt_debug_set_variable | 変数の値を設定します。書き込み操作です。 | name + value を指定します。実行中のセッション状態が変更されます。 |
adt_debug_set_watchpoint / adt_debug_delete_watchpoint | 変数が変更されたときに停止します。書き込み操作です。 | ベストエフォートです。ウォッチポイントの仕様には参照実装がないため、実行中に raw を確認してください。 |
adt_debug_stop | セッションを終了します。デバッグ対象を再開してから、リスナーと設定したすべてのブレークポイントを削除します。 | 終了時に呼び出し、後処理漏れやリクエストの中断状態が残らないようにしてください。release: false を指定すると再開を省略します。 |
一般的な流れ:
1. adt_debug_set_breakpoint { object: "ZREPORT", type: "program", line: 42 } → id
2. adt_debug_listen {} → ARM IT FIRST, then trigger the run
3. (trigger: a Fiori/OData call, an ADT classrun, an RFC, a job)
4. listen returns caught:true → already attached (or caught:false → call again)
5. adt_debug_stack {} → where execution paused
6. adt_debug_variables { names: ["sy-subrc", "lv_total"] }
7. adt_debug_step { kind: "over" } → advance; or set_variable / continue
8. adt_debug_stop {} → resume the debuggee + cleanup
外部ブレークポイントが停止させる対象: HTTP/ICF(Fiori、OData、ADT)、RFC、バックグラウンドの各セッションです。自分自身の SAP GUI ダイアログセッションは対象外です。 SE38 から F8 でレポートを実行しても何も停止せず、デバッガーも起動しません。機能が壊れているように見えますが、そうではありません。ダイアログ専用コードをデバッグするには、一時的な IF_OO_ADT_CLASSRUN ラッパーを使って ICF セッション内で実行し、次をトリガーします。
METHOD if_oo_adt_classrun~main.
DATA lt_list TYPE TABLE OF abaplist.
" There is no screen in an ICF session, so list output must go to memory.
SUBMIT zoy_dbg_target EXPORTING LIST TO MEMORY AND RETURN.
ENDMETHOD.
SUBMIT は新しいプログラムコンテキストを開くため、対象レポートを単独でデバッグできます。
タイミング: 実行をトリガーする前に adt_debug_listen を開始してください。Fiori/OData のようにリクエストが速い場合、クリックしてから開始したのではすでに手遅れです。停止したデバッグ対象は、再開するまでアタッチを待つ時間が約 15~20 s しかないため、listen は途中でラウンドトリップを挟まず、すぐにアタッチします。そのため、caught: false は次の 3 つの可能性を示します。実行がまだ行われていない、リスナーの開始が遅すぎた、またはこのフローではその行が実行されない、のいずれかです。ブレークポイントの誤りとセットアップの問題を見分けられるよう、動作確認済みのコントロール用ブレークポイントを用意してください。
読み取り専用モード: 検査(ブレークポイント、listen、スタック、変数)は許可されますが、上記の書き込み操作ツール(step、goto-stack、set-variable、watchpoints)は readOnly: true の場合に拒否されます。別のユーザーのセッションのデバッグ(requestUser)はデフォルトで無効です。システムごとに "debug": { "allowRequestUser": true } を設定すると有効になります(バックエンドのデバッグ権限が必要です)。
データ
| ツール | 目的 | 備考 |
|---|---|---|
adt_read_table | ADT Data Preview API 経由で OpenSQL の SELECT を実行します。 | SE16 形式のテーブル読み取りです。SELECT のみ対応しており、INSERT/UPDATE/DELETE はクライアント側で拒否されます。SAP エンドポイントでもサーバー側で拒否されます。maxRows の上限は 5000 です(デフォルトは 100)。NetWeaver 7.55 以降/S/4HANA が必要です。 |
adt_system_info | このシステムは何ですか? | CVERS テーブルから読み取った製品(S/4HANA のバージョン、ECC または通常の NetWeaver)、SAP_BASIS のリリースと SP レベル、ABAP Cloud が利用可能かどうか(SAP_BASIS ≥ 7.57)を返します。includeComponents: true を指定すると、インストール済みのすべてのコンポーネントが一覧表示されます。adt_read_table と同じ Data Preview の前提条件が適用されます。 |
adt_value_help | ドメイン、データエレメント、または table と field に対する F4 形式の入力候補を表示します。 | テキスト付きのドメイン固定値(DD07L/DD07T)、または要求された言語で結合したチェックテーブル/値テーブルとそのテキストテーブルを返します(language:ISO EN/TR または SAP キー。デフォルトはプロファイルの言語です)。固定値がある場合でも includeCheckTable を指定するとチェックテーブルを読み取ります。検索ヘルプは評価されません。adt_read_table と同じ Data Preview の前提条件が適用されます。 |
移送
| ツール | 目的 | 備考 |
|---|---|---|
adt_list_transports | ユーザー/ステータス別に TR を一覧表示します。 | デフォルトのユーザーは設定ユーザー、デフォルトのステータスは modifiable です。 |
adt_get_transport | TR ヘッダーとオブジェクトを取得します。 | |
adt_create_transport | 新しい TR を作成します。 | readOnly: true の場合は拒否されます。エンドポイントの形式は環境によって異なります。Caveats を参照してください。 |
adt_release_transport | TR をリリースします。 | readOnly: true の場合は拒否されます。 |
adt_transport_queue | TR は現在どこにありますか? | systems(例:["DEV","QAS","PRD"])の各システムで E070(ステータス、所有者、ターゲット)と TPALOG(TP ステップとリターンコード)を読み取り、ターゲットごとに exported、in-import-queue、imported、imported-with-errors、import-aborted を報告します。タスクはその依頼に解決されます。到達不能なシステムがあってもエラーにはならず、そのシステムについて報告されます。TMS バッファーファイルには ADT 経由でアクセスできないため、in-import-queue は記録された転送ステップから判断されます。 |
直接呼び出し
adt_request — ADT REST を直接呼び出します。上位レベルのツールで対応していない特殊なエンドポイントを使う場合に使用します。認証/CSRF/Cookie/sap-client を自動的に処理します。
オブジェクトの種類
別名(どちらの列も使用できます):
| 別名 | TADIR コード |
|---|---|
| プログラム/レポート | PROG |
| インクルード | INCL |
| クラス | CLAS |
| インターフェース | INTF |
| 関数/fm | FUGR/FF(group が必要です) |
| 関数グループ | FUGR |
| テーブル/構造 | TABL |
| データエレメント | DTEL |
| ドメイン | DOMA |
| cds/ddls | DDLS |
| アクセス制御/dcls | DCLS |
| メタデータ拡張/ddlx | DDLX |
| ビヘイビア定義/bdef | BDEF |
| メッセージクラス/msag | MSAG |
スキル(パッケージ化されたワークフロー)
生のツールは構成要素です。skills/ は、これらを連携させる Claude Code 用のすぐに使えるワークフローを提供します。各 SKILL.md には、独自の前提条件(NetWeaver の最低リリース、必要な権限、読み取り専用での互換性)が記載されています。
| スキル | 機能 | 読み取り専用で使用可能? | 最低システム要件 |
|---|---|---|---|
transport-release-gate | TR に対するリリース前の品質ゲートです。非アクティブなオブジェクト、ロック、構文、ATC、単体テストを確認し、リリース可否レポートを作成します。リリースの決定は人が行います。 | ほぼ可能(単体テストとリリースには書き込みが必要) | NW 7.50 以降、ATC の設定済み |
dump-triage | ST22 のトリアージです。ダンプを原因別に分類し、主な問題を詳しく調査して、原因別に根本原因と修正方法を特定します。 | はい — PRD でも安全です | NW 7.50 以降(ダンプフィード) |
legacy-code-doc | レガシー Z コードをリバースドキュメント化します。構造、DB へのアクセス箇所、呼び出し元、リスク、S/4 移行に関する注意点を記載します。 | はい — PRD でも安全です | NW 7.4x 以降(データサンプルは 7.55 以降) |
abap-clean-core | SAP Clean Core のフレームワークに関する知識です。レベル、意思決定フレームワーク、ガバナンスを扱います。 | はい(知識のみ) | なし |
使用するには、スキルのフォルダーをプロジェクトの .claude/skills/(すべてのプロジェクトで使う場合は ~/.claude/skills/)にコピーします。
cp -r node_modules/sap-adt-mcp/skills/dump-triage .claude/skills/
# or from a clone: cp -r sap-adt-mcp/skills/dump-triage .claude/skills/
Claude Code はスキルを自動的に読み込み、会話の内容が一致すると起動します(例:「E4DK900123 は安全にリリースできますか?」→ transport-release-gate)。
Clean Core:プロンプトとリファレンス
このサーバーには、SAP S/4HANA の作業向けにオプトインで利用できる Clean Core レイヤーが含まれています。構成要素は 2 つあり、意図的に分けられています。
- 5 つの MCP プロンプト(
src/prompts.js) — 運用に使う機能です。ユーザーはスラッシュコマンドとして実行します。それぞれが Clean Core フレームワークの一部と関連するadt_*ツールを組み合わせており、モデルがレベルについて説明するだけでなく、実際のシステムで動作できるようになっています。 - 詳細なリファレンス(
skills/abap-clean-core/) — フレームワークの全内容です。Stay Clean / Get Clean プレイブック、A/B/C/D レベルの詳細、Cloudification Repository の状態の意味、ABAP Cloud で許可・禁止されている項目の一覧、SAP Application Extension Methodology(3 フェーズ)、ガバナンスの実践、KPI の計算方法、ATC 免除プロセスを含みます。一度読んで、プルリクエストからリンクしたり、新しいチームメンバーに渡したりできます。上記のプロンプトでは必要な内容を引用し、それ以外はすべてこのリファレンスに記載されています。
設計上の選択
- オプトインであり、自動起動しません。 Clean Core は S/4HANA の開発規律です。ECC の開発者に押し付けるべきではありません。ユーザーがスラッシュコマンドを入力しない限り、何も起動しません。
- すべてのプロンプトに ECC の適用可否チェックを組み込んでいます。 各プロンプトの本文では、最初に対象システムが S/4HANA であることを確認するようモデルに求めます。ECC の場合は処理を中断し、レベルのラベルを使わずに、従来の ABAP の表現で支援します。
- 評価ではなく、説明する語調です。 「Level D だと分かっているが、とにかくリリースしてくれ」と言われた場合は、その指示に従います。エージェントはリリースを行い、レベルを記録し、後から実施する Level A へのリファクタリング案を簡潔に示して、次に進みます。
プロンプト
Claude Code で(サーバーを sap-adt として登録した場合)、正確なコマンドは次のとおりです。
| コマンド | 引数 | 機能 |
|---|---|---|
/mcp__sap-adt__clean_core_grade | object (req), type (req), system | 1 つのオブジェクトを A/B/C/D で評価します。ソースと ATC を取得し、分類して理由を引用し、Level C/D の場合は Level A へのリファクタリング案を示します。 |
/mcp__sap-adt__clean_core_review | package (req), system, maxObjects (default 50) | パッケージを調査し、Clean Core Share %、Tech Debt Score、主な Level D 該当箇所を算出します。 |
/mcp__sap-adt__clean_core_refactor | object, type, system (all optional) | リファクタリングモードに入ります。BAPI ラッパー/MARA→released-CDS/modification→BAdI のパターンを読み込みます。object を指定すると初期設定され、指定しない場合は指示を待ちます。 |
/mcp__sap-adt__clean_core_create | requirement, package, system (all optional) | デフォルトで Level A の作成モードに入ります。ABAP Cloud 構文、released CDS ビュー、RAP、ビジネスオブジェクトインターフェースを使用します。create_object → set_source → syntax_check → activate のパイプラインを実行します。 |
/mcp__sap-adt__clean_core_design | use_case (optional) | アーキテクチャモードです。fit-to-standard、3 フェーズの方法論、オンスタックかサイドバイサイドか、ハイブリッドを扱います。コードの書き込みは行いません。ターゲットソリューションのメモを作成します。 |
スラッシュコマンドの名前の構造は MCP クライアントによって決まります。サーバー登録時に使用したエイリアスに基づいて、mcp__<server-alias>__ のプレフィックスが自動的に追加されます。別のエイリアス(例:claude mcp add cc -- npx sap-adt-mcp)でサーバーを登録した場合は、プレフィックスもそれに応じて変わります(/mcp__cc__clean_core_grade)。
Claude Desktop では、プロンプトはスラッシュコマンドのピッカーに表示されます。名前は同じです。
引数の流れの例
アトミックなプロンプト(grade、review)は、すべての引数をインラインで受け取り、構造化された分析を返します。
You: /mcp__sap-adt__clean_core_grade object:ZCL_PRICING type:class system:DEV
Agent: → adt_get_source { ... }
→ adt_run_atc { ... }
Verdict: Level C. Two SELECTs from MARA without using the released
I_Product view; one CALL FUNCTION to internal FM RV_PRICE_PRINT.
Refactor sketch: replace SELECT with `from I_Product`; encapsulate
the RV_PRICE_PRINT call in a Z-class so the dependency is localised.
モード読み込み型のプロンプト(refactor、create、design)は、任意で初期値を受け取ります。初期値がない場合は、ユーザーから自然言語での追加指示があるまで待機します。
You: /mcp__sap-adt__clean_core_create
Agent: I'm in Clean Core CREATE mode (Level A by default). What do you
want to build, on which package and system?
You: A small Fiori list-report of overdue invoices, package ZFIN_REPORTS,
system DEV.
Agent: Plan: a CDS view projecting I_OperationalAcctgDocItemCube for items
with NetDueDate < today; a behavior definition; a service binding
exposing it to Fiori Elements list-report. Three objects. Confirm?
または、初期値を引数として指定すると、リクエストを一度で完了できます。
You: /mcp__sap-adt__clean_core_create requirement:"Fiori list-report of
overdue invoices" package:ZFIN_REPORTS system:DEV
詳細なリファレンスを読む
skills/abap-clean-core/ は、プロンプトで引用される内容とそれ以上のすべてを網羅した正式な情報源です。実際のプログラムで Clean Core ガバナンスを設定する場合(KPI のベースライン、ATC 免除の規律、成熟度評価、アーキテクチャレベルでのオンスタックとサイドバイサイドのトレードオフなど)は、ここに詳しい情報があります。
ディレクトリは、1 つのエントリーポイント(SKILL.md)と、references/ 内の 4 つの詳細ファイルで構成されています。
references/levels-detailed.md— Cloudification Repository の状態値、リリース済みローカル API とリリース済みリモート API、再分類の動き、アンチパターンごとの修正方法references/decision-framework.md— fit-to-standard、SAP Application Extension Methodology の詳細、オンスタックかサイドバイサイドかを判断する条件、ハイブリッドパターン、具体的なシナリオreferences/governance.md— Stay Clean / Get Clean のプレイブック、4 つの KPI とその算出方法、ATC 免除プロセス、成熟度評価、複数年のロードマップreferences/abap-cloud-rules.md— 許可/禁止事項の全リスト、RAP/CDS/ビジネスオブジェクトインターフェース/Custom Fields、事前構築済みサービス、クラシックからクラウドへの移行パターン
skills/abap-clean-core/ を ~/.claude/skills/ にコピーまたはシンボリックリンクすれば、このリファレンスを実際に自動読み込みされる Claude スキルとしてインストールできます。ただし、これは明示的に選択する必要があります。このリポジトリのデフォルトの動作は、オプトイン方式のプロンプトのみです。
例
エンドツーエンドのエージェントワークフロー(プロジェクトの調査、クラス監査、システム横断のリリース検証、where-used に基づくリファクタリング、テストのトリアージ)については、examples/ を参照してください。
簡単な例:
You: "Compare class ZCL_PRICING between DEV and PRD on the live systems."
Agent: → adt_compare_source { systemA: "DEV", systemB: "PRD",
object: "ZCL_PRICING", type: "class" }
Returns: { identical: false, stats: { added: 14, removed: 9 },
diff: "..." }
Then narrates the meaningful changes.
アーキテクチャ
MCP client (Claude Desktop / Claude Code / custom)
│ stdio (JSON-RPC)
▼
┌──────────────────────────────────┐
│ src/server.js │ CLI + MCP dispatch (thin)
│ ├─ src/tools/*.js │ one module per category:
│ │ │ connection, source, quality,
│ │ │ lifecycle, discovery,
│ │ │ cross-system, transports,
│ │ │ runtime, data, request
│ ├─ src/object-uris.js │ type alias → ADT URI map
│ ├─ src/node-structure.js │ package tree XML parser
│ ├─ src/object-references.js │ <objectReference> parser
│ ├─ src/dump-feed.js │ runtime-dumps Atom parser
│ ├─ src/data-preview.js │ Data Preview XML parser + SELECT guard
│ ├─ src/diff.js │ unified diff (LCS)
│ ├─ src/adt-error.js │ <exc:exception> parser
│ ├─ src/lock.js │ ADT lock acquire / release
│ └─ src/adt-client.js │ HTTP client: auth / CSRF / cookies / timeout
└──────────────────────────────────┘
│ HTTPS
▼
SAP system (ADT REST: /sap/bc/adt/...)
ランタイム依存関係は 2 つです。@modelcontextprotocol/sdk(MCP ワイヤープロトコル)と undici(カスタム TLS ディスパッチャーを使用する HTTP)です。それ以外はすべて標準ライブラリです。
複数ステップの編集パターン
ほとんどの編集では、adt_set_source だけで十分です。ロックを取得し、書き込み、ロックを解除します。同じターン内に同じオブジェクトを複数回操作するワークフロー(例:メソッド単位のパッチを N 件適用してから有効化する場合)では、スティッキーロックパターンを使用します。
1. adt_lock { object: "ZCL_X", type: "class" } → returns lockHandle
2. adt_set_source { object: "ZCL_X", type: "class", (repeat as needed)
source: "...", lockHandle: "<handle>" }
3. adt_activate { objects: [{ name: "ZCL_X", type: "class" }] }
4. adt_unlock { object: "ZCL_X", type: "class",
lockHandle: "<handle>" }
adt_set_source の lockHandle パラメーターが指定されている場合、内部でのロック/ロック解除をスキップします。
大きなオブジェクト(数千行)
数千行に及ぶクラスやプログラムは、1 回の呼び出しあたりの I/O 上限を超えることがあり、ソースをインラインで渡せません。代わりに、内容はディスク上に保持してください。エージェントのコンテキストに入ることはありません。
1. adt_get_source { object: "ZCL_BIG", type: "class",
outputFile: "/tmp/zcl_big.abap" } → writes the file, no inline source
2. (edit /tmp/zcl_big.abap locally)
3. adt_set_source { object: "ZCL_BIG", type: "class",
sourceFile: "/tmp/zcl_big.abap",
transport: "E4DK900123" } → MCP reads the file and PUTs it
注:トランスポートへの割り当てはヘッドレスで動作しますが、TR の 作成(adt_create_transport)は一部のシステムで GUI ダイアログを経由するため、500 エラーで失敗することがあります。代わりに既存の TR ID を渡してください。
注意事項
- NetWeaver のリリースによる違い。 一部の ADT エンドポイント(特にトランスポートリクエスト、ATC、オブジェクト作成 XML の形式)は、NW 7.5x、S/4 オンプレミス、Steampunk の間で形式に多少の違いがあります。高レベルのツールが HTTP 4xx エラーで失敗した場合は、ツールの説明に呼び出すエンドポイントが記載されています。お使いのリリースに適したパス/コンテンツタイプで
adt_requestに切り替えてください。 - ABAP Cloud(BTP/Steampunk)。 積極的に動作確認されているのはオンプレミスの ADT 7.5x 以降のみです。Steampunk ではオブジェクトタイプの許可リストがより厳格で(リリース済み/パブリック API のみ)、一部のコレクションエンドポイントも異なります。Steampunk をお使いの方は、違いのあるエンドポイントを添えて issue を作成してください。PR も歓迎します。
- オブジェクト作成 XML の形式。 本文テンプレートは最新のオンプレミスリリースを対象としています。古いシステムでは追加の属性(
adtcore:masterLanguageなど)が必要な場合があります。お使いのシステムで作成ペイロードが拒否された場合は、レスポンス本文を添えて issue を作成してください。 - DDIC のプリミティブ(テーブル、データエレメント、ドメイン)は
adt_create_objectでは作成できません。これらには、まだ汎用化していない、より充実した DDIC 固有のペイロードが必要です。現時点ではadt_requestを使用してください。
トラブルシューティング
Claude Desktop の MCP サーバー一覧で「failed」と表示される。 ターミナルから sap-adt-mcp --validate-config を実行してください。OK と表示される場合、サーバーは正常で、問題は claude_desktop_config.json(パスまたは環境変数の誤り)にあります。
x-csrf-token: required を伴う 403。 通常は自動的に解消されます。クライアントがトークンを再取得して再試行します。問題が続く場合は、ADT の前段にある SSO/フロントエンド認証が Basic 認証を妨げている可能性があります。ICM と SAP Web Dispatcher のルールを確認してください。
明らかに読み取り用のエンドポイントなのに読み取り専用モードで拒否される。 おそらく、許可リストにない POST エンドポイントです。パスを添えて PR または issue を作成してください。こちらで追加します。または、一時的にシステムを readOnly: false に切り替えてください。
SAP_ADT_MCP_DEBUG=1 を設定すると、すべてのリクエストとレスポンス(ステータス、レイテンシ、URL、Authorization を除くリクエストヘッダー)が stderr に記録されます。MCP クライアントではサーバーログに stderr が表示されるため、そちらを確認してください。
貢献
CONTRIBUTING.md をご覧ください。バグ報告、新しいツールの対応範囲、NetWeaver 互換性に関する情報、ドキュメント、例を歓迎します。
ライセンス
MIT — LICENSE をご覧ください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。