Skip to main content
Glama

ステータス: 実験的。本番システムに対して使用する場合は注意してください。

ABAP ADT MCP サーバー

ADT(ABAP Development Tools)を介してSAP ABAPシステムへの完全な読み書きアクセスをAIエージェントに提供するMCPサーバーです。認証にはSPNEGO/KerberosシングルサインオンX.509クライアント証明書、またはOAuth 2.0ベアラートークンを使用し、設定にパスワードは一切含めません。ユーザー名とパスワードによるフォールバックも引き続き利用できますが、推奨されません。

abap-adt-apiをラップし、ADT自体にはないRFC対応ファンクションモジュールの呼び出しをSAP Gateway JSON-RPC 2.0サービス経由で追加します。

128のツール — オブジェクトCRUD、ソース編集、ロック、トランスポート、有効化、構文チェック、コード補完、ABAPユニット、ATC、DDIC、abapGit、リファクタリング、トレース、デバッガ、RFC呼び出し。

クライアントが実際に表示する数は、2つの点でより少なくなります。プロファイルABAP_MCP_PROFILE)は、コンテキストの代わりにサーフェスを提供します。coreは9ツール、allは129ツールを一覧表示します。これは、オンデマンドでツールスキーマを取得できないクライアントの場合、毎ターン約2,700トークンに対して約17,800トークンになります。また、サーバーは何かを一覧表示する前にシステムが何をサポートしているかを問い合わせるため、abapGitプラグインがないリリースでは、400を返す10のツールが提供されることはありません。DEVでは116が残ります。

これは、mario-andreschakによるmcp-abap-abap-adt-apiのSSOフォークです。主な違いは、Basic認証の代わりのKerberos SSO、JSON-RPC/RFCツール、ツール定義から派生したルーター、そして文書化されたツールリファレンスです。


ドキュメント

ドキュメント

内容

AGENTS.md

このリポジトリでの作業:レイアウト、規約、テスト方法。コードを変更する前にこれを読んでください。

docs/Tool-Router.md

やりたいこと → それを実行するツール。 手書きで、人々が使う言葉で書かれています。仕事はわかっているがツールがわからない場合は、ここから始めてください。

docs/Tool-Reference.md

全128ツールとその引数をファミリー別にグループ化して掲載。ツール定義から生成されるため、コードから逸脱することはありません。

docs/MCP-Tools.md

サーバーの動作方法。 プロファイル、ゴールデンパスワークフロー、ADT URIとロックセマンティクス、レスポンス/エラーモデル、トラブルシューティングマトリックス。人間サーバーを駆動するエージェントの両方のために書かれています。

docs/ABAP-Skills.md

20のSAP/ABAPスキルと、それらがこれらのツールにどのようにマッピングされるか。

docs/Development-Skills.md

同梱されている35の一般的なエンジニアリングスキル。

`docs/JSON-RPC.md

JSON-RPC / RFCツールの設計とプロトコルに関するメモ。/IWBEP/CL_JSRPC_*のABAPソースから読み取った、ワイヤプロトコル、バッチの背後にあるLUW保証、そして落とし穴について。

docs/Authentication.md

2つのパスワードレスログオンモード:Kerberos SSO、およびサービスユーザーとテクニカルユーザー向けのX.509証明書。SAPで何を設定する必要があるか、そしてこれがSNCではなく相互TLSである理由。


Related MCP server: ABAP-ADT-API MCP-Server

機能

  • 2つのパスワードレスログオンモード — ログオン中のWindowsユーザーのチケットを使用したSPNEGO/Kerberos、またはKerberos IDを持たないサービスユーザーまたはテクニカルユーザー向けのX.509クライアント証明書。どちらの場合もSAPパスワードは保存も送信もされず、セッションの有効期限が切れると自動的に復旧します。

  • 名前によるオブジェクトの読み取りreadAbapObjectは、1回の呼び出しで名前をソースに解決します。ADT URLを検出したり手動で作成したりする必要はありません。

  • テーブルの説明describeAbapTableは、フィールド、DDICタイプ、キーフラグ、チェックテーブルを返します。

  • オブジェクト管理 — ABAPオブジェクトの検索、読み取り、作成、変更、削除、有効化。

  • 命名規則の調査searchPackagesは、パターン(["ZPP_*","Z_PP*"])でパッケージを検索し、各パッケージをタイプごとにグループ化されたオブジェクトに1回の呼び出しで展開します。

  • ソースワークフロー — ロック → 編集 → 構文チェック → 有効化 → ロック解除。トランスポート処理付き。

  • コードインテリジェンス — 補完、定義、使用箇所参照、ABAP Doc、プリティプリンター、ATC、ABAPユニット、リファクタリング(名前変更、メソッド抽出)。

  • RFCファンクションモジュールの呼び出しcallFunctionViaJsonRpcは、RFC対応ファンクションモジュールを実行し、システムから読み取った実際のシグネチャに対してリクエストを検証します。

  • 単一LUWでのRFCバッチ呼び出しcallFunctionsViaJsonRpcは、複数のファンクションモジュールを単一のリクエストで送信します。これにより、更新BAPIとそのBAPI_TRANSACTION_COMMITが1つのLUWを共有できます。

  • データアクセスtableContentsとアドホックなrunQuery SELECT。

  • 実行中システムの表示listLoggedOnUsersTH_USER_LISTSM04の背後にあるデータ)から「誰がログオンしているか」に応答し、readProfileParametersはRZ11値を1ラウンドトリップで読み取り、checkLogonConfigurationはシステムが実際に受け入れる認証を通知します。

  • バンドルされたエージェントスキルskills/の下にある54のスキル。ABAP(Clean ABAP、RAP、CDS、ATC、abapGit…)と一般的なエンジニアリング(TDD、コードレビュー、バグ診断)用で、リソースとして、またreadSkillを介して提供されます。

  • 自己文書化 — 以下のガイドは、MCPリソース(abap-adt://guides/…)およびreadServerGuideツールを介してサーバー自体によって提供されるため、エージェントはセッションを離れることなく、ワークフローや引数をタスクの途中で調べることができます。

前提条件

  • ADT経由で到達可能なSAP ABAPシステム。 /sap/bc/adtSICFでアクティブである必要があります。RFCツールの場合、/sap/gw/jsonrpcもアクティブである必要があり(SAP_GWFND)、ユーザーには呼び出すファンクショングループのS_RFCが必要です。

  • パスワードなしでログオンする方法。次のいずれか:

    • 動作するKerberosログイン — SAPシステムがSPNEGOを受け入れ、有効なチケット(klist)を保持している必要があります。これがデフォルトであり、出荷時の状態ではWindowsが必要です。ブートストラップはC:\Windows\System32\curl.exe --negotiateをシェルアウトします。これにはcurlのSchannel/SSPIバックエンドが必要です。他のプラットフォームでは、SSO_CURL_PATHをGSS-APIサポート付きでビルドされたcurlを指すように設定します。

    • X.509クライアント証明書 — Kerberos IDを持たないサービスユーザーまたはテクニカルユーザー向け。curlもWindowsも必要ありません。SAP側の設定が必要です:ICMポートが証明書を要求する必要があり(icm/server_port_<n>VCLIENT。これはicm/HTTPS/verify_clientをオーバーライドします)、発行元CAがSTRUSTで信頼され、CERTRULEがユーザーにマッピングされている必要があります。完全なセットアップ(このサーバーからそれらを確認する方法を含む)はdocs/Authentication.mdにあります。

    • OAuth 2.0クライアント — KerberosレルムもICMも設定する必要のないSAP BTP ABAP環境、またはSOAUTH2を介してADTを公開するオンプレミスシステム向け。BTPサービスキーはすでにその1つです。§11を参照してください。

  • Node.js(LTS)とnpm — node -vnpm -vで確認します。

インストール

git clone --recurse-submodules https://github.com/Ciltress/sap-abap-mcp.git
cd sap-abap-mcp
npm install
npm run build

--recurse-submodulesは重要です。一般的なエンジニアリングスキルはサブモジュールにあり、これがないとそのディレクトリは空になり、サーバーが提供するスキルが35つ少なくなります。すでにクローンしましたか? git submodule update --init --recursiveを実行してください。

npmのnpx mcp-abap-abap-adt-apiパッケージはアップストリームサーバーであり、SSOブートストラップやRFCツールは含まれません。代わりに、このリポジトリをソースからビルドしてください。

設定

.env.example.envにコピーし、システム情報を入力します:

SAP_URL=https://your-sap-server.example.com:44301
SAP_USER=YOUR_SAP_USER
SAP_CLIENT=100
SAP_LANGUAGE=EN

SAP_URLSAP_USERは必須です。SAP_CLIENTSAP_LANGUAGEはオプションですが推奨されます。4つのログオンモードのうち3つは、SAP_PASSWORD一切必要としません。

.envをコミットしないでください。すでに.gitignoreに含まれています。

オプション変数

効果

SAP_SYSTEM_ID

sy-sysid(例:DEV)などのシステムID。接続時に通知されるため、クライアントは名前で複数のサーバーから選択できます。複数システムを参照してください。

NODE_TLS_REJECT_UNAUTHORIZED=0

内部/不明なCAからの証明書を受け入れます。開発専用。

SSO_CURL_PATH

Windowsシステムのものではない場合、SPNEGOサポート付きのcurlバイナリへのパス。

SAP_JSONRPC_PATH

ノードがエイリアスで公開されている場合に、JSON-RPC ICFパスをオーバーライドします。

ABAP_MCP_PROFILE

このサーバーが一覧表示するツール、つまり応答するツール。以下を参照してください。

ABAP_MCP_MAX_RESPONSE_BYTES

単一の応答の上限(バイト単位)。0で無制限。

ABAP_MCP_GATE

offにすると、このリリースが提供できないツールを保留する起動時機能チェックをスキップします。

ABAP_MCP_RFC_FALLBACK

SAPがこのユーザーへのADTノードを拒否した場合でも、RFCツールを維持したまま起動します。docs/Authentication.mdを参照してください。

SAP_FALLBACK_BOOTSTRAP_PATH

フォールバックがログオンするICFノード。セッションCookieとCSRFトークンを発行するだけで済みます。

クライアントに合わせたサーバーのサイジング

3つのABAP_MCP_*変数が存在する理由は1つだけです:オンデマンドでツールスキーマを取得できないクライアントは、毎ターン、ツールリスト全体のコストを支払うことになります。 Claude Codeはスキーマを遅延取得するため、デフォルトのままにしておく必要があります。128kウィンドウの8Bモデルは、会話が始まる前にコンテキストの6分の1を消費しており、それが「同じプロンプトが半分しか機能しない」理由です。

ABAP_MCP_PROFILE — 未設定の場合はallと見なされるため、既存のセットアップは変更されません。

profile

tools/list

cost per turn

for

core

9

~2,737 tokens

システムを読み取り、1回の編集を完了する

analyst

18

~3,982 tokens

読み取り専用: 辞書、テーブルデータ、RFC呼び出し

rfc

10

~2,900 tokens

RFC権限はあるがS_DEVELOPがないユーザー。ADTツールが動作しない環境向け

dev

49

~8,034 tokens

編集サイクルに加えて、テスト、ATC、トランスポート、リファクタリング

all

129

~17,759 tokens

デフォルト。スキーマをオンデマンドで取得するクライアントに適している

件数にはhealthcheckが含まれます。healthcheckは「どのプロファイルで実行中か」に答えるツールであるため、すべてのプロファイルの外側にあります。

プロファイルは利便性のためのフィルタではありません。アクティブなプロファイルに含まれないツールはリストに表示されずかつルーティングもされないため、呼び出すことができません。つまりanalystは、メニューが小さいというだけでなく、ソースを編集するものが何もないことを保証するものです。プロファイル外の呼び出しは「不明なツール」ではなく、その旨を伝えるエラーになるため、再試行しても意味がありません。認識されないプロファイル名は、allにフォールバックするのではなく、起動時にサーバーを停止させます。9を要求したものに129のツールを黙って提供することは、プロファイルが存在するまさにその防止したい障害です。

coreが小さいのは、1つのツールeditAbapSourceが書き込みサイクルそのものです: ロック、書き込み、アクティベート、ロック解除。ステップが失敗してもロックは解放されます。4つの個別ステップはdevallに残ります。

ABAP_MCP_MAX_RESPONSE_BYTES — ツールリストはプロファイルが縮小できる固定コストですが、回答は無制限です。coreではツールリスト全体が約11KBであるのに対し、adtDiscovery1件は約42KBです。未設定の場合はプロファイルに従います(core 24,000バイト、analyst 32,000、dev 48,000、allは上限なし)。0で無効になります。

予算を超えた回答は保留され、有効なJSONに置き換えられますstatus:"truncated"、元のbytesbudget、2,000バイトのpreview、そしてnextStepです。解析できない切断された断片に置き換えられることは決してありません。そのような断片はパースできず、同じ再試行を招くだけだからです。

ABAP_MCP_GATE — サーバーは何かをリストする前に、システムが何をサポートしているかを問い合わせ、ADTコレクションが存在しないツールを除外します。DEVでは、それは10個のabapGitツールと3個のサービスバインディングツールで、これらはそうしないとHTTP 400を返すことになります。プロセスごとに1回のディスカバリの往復を要し、リストを短くすることしかできず、失敗した場合はすべてのツールがリストされたままになります。ABAP_MCP_GATE=offでスキップされます。

healthcheckは、アクティブなプロファイル、responseBudgetBytes、および除外されたものをすべて報告します。

Kerberosの代わりに証明書

サービスユーザーまたは技術ユーザーの場合は、証明書を追加します — それだけでモードが切り替わります:

SAP_USER=CLAUDEAGENT                                 # the user CERTRULE maps the certificate to
SAP_CERT_FILE=C:\Users\svc_agent\SNC\sec\claudeagent.p12
SAP_CERT_PASSPHRASE=<PKCS#12 password / PSE PIN>

Optional variable

Effect

SAP_AUTH_MODE

kerberoscertificateoauthpasswordのいずれか。別のモードが設定されている中で1つのモードを強制する場合にのみ必要。

SAP_CERT_KEY_FILE

SAP_CERT_FILEにない場合の秘密鍵。

SAP_CA_FILE

TLS検証を無効にする代わりに、SAP自身の証明書を検証するためのCAバンドル。

これは相互TLSであり、SNCではありません — ADTはHTTPSです。RFC/SNCですでに動作している証明書は再利用でき、そのCERTRULEマッピングも引き継がれますが、SNC0 ACLは関与せず、ICMにはicm/HTTPS/verify_clientが必要です。docs/Authentication.mdでは、その違い、sapgenpse export_p12 / OpenSSL 3の落とし穴、拒否された証明書の読み方について説明しています。

BTPおよびSOAUTH2向けのOAuth 2.0クライアント

SAP BTP ABAP環境、または認可サーバーの背後でADTを公開するオンプレミスシステム向けです。クライアントIDを設定するとモードが切り替わります:

SAP_OAUTH_TOKEN_URL=https://your-tenant.authentication.eu10.hana.ondemand.com/oauth/token
SAP_OAUTH_CLIENT_ID=sb-abap-agent!t1234              # 'clientid' in a BTP service key
SAP_OAUTH_CLIENT_SECRET=<'clientsecret'>

オンプレミスの場合、エンドポイントはSAPホスト自体にあります — https://<host>:<port>/sap/bc/sec/oauth2/token — そしてクライアントはSOAUTH2に登録されているものです。

Optional variable

Effect

SAP_OAUTH_GRANT

client_credentials(デフォルト)、refresh_tokenpasswordstaticのいずれか。

SAP_OAUTH_SCOPE

要求するスコープ。未設定の場合はクライアントのデフォルトを要求しますが、通常はそれが正しいです。

SAP_OAUTH_REFRESH_TOKEN

refresh_tokenグラント用。これ単体でそのグラントを選択します。

SAP_OAUTH_TOKEN

別の場所で発行されたトークンをそのまま使用します。これを更新できるものはありません。

SAP_OAUTH_CLIENT_AUTH

basic(デフォルト)またはpost。正しいシークレットをサーバーが拒否する場合に使用します。

トークンは一度だけログオンします。 その後は、他のモードと同様に、SAPセッションCookieがすべてのリクエストを運びます — つまり、5分で期限切れになるトークンでも問題ありません。AS ABAP上のOAuth 2.0クライアントはSU01のユーザーであることに注意してください: 誤ったSAP_OAUTH_CLIENT_SECRETはパスワードと同様にlogin/fails_to_user_lockにカウントされるため、拒否されたトークン要求は決して再試行されません。認可コードフローは実装されていません — ブラウザが必要であり、stdioで起動されたサーバーにはブラウザを開く方法がないためです。一度手動で完了させ、リフレッシュトークンを渡してください。docs/Authentication.md §11に詳細があります。どの失敗がラッチされ、その理由も含めて。

他に何もない場合のパスワード

Kerberosも証明書もないシステム向け — サンドボックス、トライアル、ドメイン外の何か:

SAP_USER=CLAUDEAGENT
SAP_PASSWORD=<the password>

最後の手段であり、他の2つと交換可能ではありません。 チケットがない、またはマッピングされていない証明書は単に拒否されます。誤ったパスワードlogin/fails_to_user_lockにカウントされ、このサーバーだけでなく、そのユーザーを使用するすべてのコンシューマーに対してユーザーをロックします。実装はそのため、拒否されたパスワードの再試行を拒否します — 呼び出されるツールがいくつであっても、1回の失敗したログオンがラッチされます。無人運転には証明書を推奨します。docs/Authentication.md §10に詳細があります。

MCPクライアントに登録する

クライアントにビルド済みエントリポイントを絶対パスで指定します:

{
  "mcpServers": {
    "sap-abap-dev-100": {
      "command": "node",
      "args": ["C:/path/to/sap-abap-mcp/dist/index.js"],
      "env": {
        "SAP_URL": "https://your-sap-server.example.com:44301",
        "SAP_USER": "YOUR_SAP_USER",
        "SAP_SYSTEM_ID": "DEV",
        "SAP_CLIENT": "100",
        "SAP_LANGUAGE": "EN"
      }
    }
  }
}

クライアントのenvブロックは.envより優先されます。npm run startを実行してサーバーを手動で起動するか、npm run devを実行してMCP Inspector経由で操作します。

毎ターンすべてのツールスキーマを運ぶクライアントの場合は、同じブロックにプロファイルを追加します:

"env": { "…": "…", "ABAP_MCP_PROFILE": "core" }

Dockerの場合

サーバーはstdioを介してMCPを話すため、公開するポートはありません — クライアントがコンテナを起動し、stdin/stdoutを介して通信します。

docker build -t abap-adt-mcp .
{
  "mcpServers": {
    "sap-abap-dev-100": {
      "command": "docker",
      "args": ["run", "-i", "--rm", "--env-file", "C:/path/to/.env", "abap-adt-mcp"]
    }
  }
}

4つのログオンモードはすべてここで動作しますが、資格情報はコンテナに与えられなければならないものであり、--env-fileはdotenvではありません — Dockerは引用符を削除せず、exportを読み取らず、末尾の# commentも削除しないため、dotenvなら除去していた値がそのまま届きます。.env内のWindowsパスは、マウントされたパスに置き換える必要があります。Kerberosはコンテナから最も多くのものを必要とするモードで、OAuthは最も少なくて済みます: トークンはネットワーク経由で取得されるため、何もマウントする必要がありません。

証明書モード — キーマテリアルを読み取り専用でマウントし、SAPの証明書に署名するCAも一緒にマウントします:

docker run -i --rm --env-file .env \
  -v /host/certs:/certs:ro \
  -e SAP_CERT_FILE=/certs/agent.p12 \
  -e SAP_CA_FILE=/certs/corporate-root.pem \
  abap-adt-mcp

Kerberosモード — イメージにはGSS-APIとkinitに対してビルドされたcurlが含まれているため、残るのはレルムと資格情報です:

docker run -i --rm --env-file .env \
  -v /etc/krb5.conf:/etc/krb5.conf:ro \
  -v /host/agent.keytab:/krb5/agent.keytab:ro \
  -e SAP_KRB_KEYTAB=/krb5/agent.keytab \
  -e SAP_KRB_PRINCIPAL=SVC_AGENT@CORP.EXAMPLE.COM \
  abap-adt-mcp

OAuth 2.0モード — マウントするものはありません。資格情報は取得されます:

docker run -i --rm --env-file .env \
  -e SAP_OAUTH_TOKEN_URL=https://your-tenant.authentication.eu10.hana.ondemand.com/oauth/token \
  -e SAP_OAUTH_CLIENT_ID='sb-abap-agent!t1234' \
  -e SAP_OAUTH_CLIENT_SECRET=<clientsecret> \
  abap-adt-mcp

パスワードモード — 最後の手段!

docker run -i --rm --env-file .env \
  -e SAP_USER=YourUser \
  -e SAP_PASSWORD=YourPassword \ 
  abap-adt-mcp

それに手を伸ばす前に知っておくべき3つのこと:

  • キータブであって、自分のチケットではない。 コンテナは、対話型ログオンが行うようにセッションの資格情報を借用できません。Linuxホストでは、すでに持っているチケットキャッシュをマウントできます(-v /tmp/krb5cc_1000:/krb5/ccache:ro -e KRB5CCNAME=FILE:/krb5/ccache)が、ホストのものと一緒に期限切れになります。Windowsホストからはどちらも機能しません: TGTはLSAキャッシュに存在し、ファイルに書き出すことができないためです — これが一切不要な証明書モードを使用してください。キータブは、無人で実行できる唯一の資格情報であり、チケットの有効期間を超えて存続する唯一のものです。

  • SAPの証明書を検証するか、検証していないことを認識してください。 イメージはパブリックCAバンドルのみを信頼するため、ホストが信頼する内部CAはここでは不明であり、ハンドシェイクはUNABLE_TO_GET_ISSUER_CERT_LOCALLYで失敗します。ルートCAをマウントし、SAP_CA_FILEをそれに向けてください。デスクトップの.envを丸ごと持ち込むと、代わりにこれを隠してしまいます: NODE_TLS_REJECT_UNAUTHORIZED=0は開発用設定であり、デプロイされたイメージにあるべきものではありません。

  • --recurse-submodulesクローンからビルドしてください。 skills/Developmentはサブモジュールです。これがないと、イメージには35個少ないスキルが同梱されます。

イメージがAlpineではなくDebianなのには1つの理由があります: AlpineのcurlはGSS-APIなしでビルドされており、そのようなcurlは失敗しません — 単にトークンを送信しないだけで、SAPは期限切れチケットと同じ401を返します。何が欠けているかは、セッションが試行される前に、起動時にstderrで示されます。コンテナに最終的にどの資格情報になったかを尋ねるには、サーバーの代わりにコマンドを与えます:

docker run --rm --env-file .env -v /host/agent.keytab:/krb5/agent.keytab:ro \
  -e SAP_KRB_KEYTAB=/krb5/agent.keytab abap-adt-mcp klist

docs/skills/AGENTS.mdは意図的にイメージにコピーされます — サーバーは実行時にこれらを読み取ってreadServerGuidereadSkillabap-adt://リソースを提供します。docs/Authentication.md §7に、モードごとの完全なコンテナ設定があります。

複数のシステム

サーバーはその生涯を通じて1つのシステムと1つのクライアントにバインドされます — どちらも実行時に切り替えることはできません。したがって、システム/クライアントごとに1つのエントリを登録し、それぞれにSAP_SYSTEM_IDを指定します:

"sap-abap-dev-100": { "env": { "SAP_SYSTEM_ID": "DEV", "SAP_CLIENT": "100", "…": "…" } },
"sap-abap-dev-200": { "env": { "SAP_SYSTEM_ID": "DEV", "SAP_CLIENT": "200", "…": "…" } },
"sap-abap-q01-100": { "env": { "SAP_SYSTEM_ID": "Q01", "SAP_CLIENT": "100", "…": "…" } }

各サーバーは、接続時に返すMCP instructionsで自身を宣言します:

このサーバーはSAPシステムDEV、クライアント100 (https://…:44301) にバインドされています。 実行時にシステムやクライアントを切り替えることはできません — どちらも起動時の環境によって固定されています。リクエストが別のシステムやクライアントを指定している場合は、そのために設定されたMCPサーバーを使用してください。登録されていない場合は、ここで動作するのではなく、その旨を伝えてください。

これにより、エージェントは「DEVクライアント200でこれを確認してください」というリクエストを、何も呼び出さずに正しいサーバーにルーティングできます。healthcheckは、直接問い合わせる必要があるサーバーに対して同じIDを報告します。

宣言はチェックされます。 SAPはログオン時に設定するセッションCookie (SAP_SESSIONID_DEV_100) にシステムとクライアントを指定するため、サーバーは実際に接続されている先を認識します。それがSAP_SYSTEM_IDと一致しない場合 — たとえば、間違ったホストを指すコピー&ペーストされたエントリ — healthcheckWARNINGを保持し、起動時に大声でログに記録されます。注意に値します。なぜなら、すべてのツールが引き続き完璧に動作するからです。ただ、間違ったシステム上で動作しているだけです。


クイックツアー

任意のオブジェクトを名前で読み取ります — URLディスカバリは不要です:

{"tool":"readAbapObject","args":{"objectName":"ZCL_MY_CLASS"}}
{"tool":"describeAbapTable","args":{"tableName":"T000"}}

命名規則全体を調査します — パターンは自動的に正規化されるため、zpp_labZPP_LAB*になります:

{"tool":"searchPackages","args":{"patterns":["ZPP_*","Z_PP*"]}}
// -> each package with its objects grouped by type, sub-packages, and a `truncated` flag

ファンクションモジュールを呼び出します — 最初にシグネチャが読み取られ、リクエストはそれに対して検証されます:

{"tool":"readAbapFunctionModule","args":{"functionModuleName":"STFC_CONNECTION"}}
{"tool":"callFunctionViaJsonRpc","args":{"functionModuleName":"STFC_CONNECTION",
                                         "inputParameters":{"REQUTEXT":"hello"}}}

BAPIとそのコミットは1つのバッチで移動する必要があります。そうしないと、コミットは独自のLUWに置かれ、BAPIの変更は失われます:

{"tool":"callFunctionsViaJsonRpc","args":{"calls":[
  {"functionModuleName":"BAPI_USER_LOCK","inputParameters":{"USERNAME":"DEVUSER"}},
  {"functionModuleName":"BAPI_TRANSACTION_COMMIT","inputParameters":{"WAIT":"X"}}
]}}

完全な書き込みサイクル(ロック → 変更 → チェック → アクティベート → ロック解除)、デバッガ、ATC、その他すべてのワークフローはdocs/MCP-Tools.md §4にあります。


ABAPオブジェクトを操作する

3つのツールで必要なもののほとんどをカバーでき、それぞれがADT URLではなく名前を受け取ります:

取得したいもの

ツール

クラス、プログラム、インクルード、関数グループ、モジュールのソース

readAbapObject

テーブル、構造、ビューの定義

describeAbapTable

命名規則の背後にあるものすべて

searchPackages

{"tool":"readAbapObject",   "args":{"objectName":"ZCL_MY_CLASS"}}
{"tool":"describeAbapTable","args":{"tableName":"T000"}}
{"tool":"searchPackages",   "args":{"patterns":["ZPP_*","Z_PP*"]}}

readAbapObject は、メタデータ ソースを一度の呼び出しで返します。名前が複数のオブジェクトに属する場合 — ZPP_EXT_LABEL_DATA は関数グループと関数モジュールの両方です — より具体的な方を選択し、ambiguous:truealternatives で通知します。objectType を渡すと選択肢を強制できます。ソースを持たないオブジェクトは、hasSource:false と適切なツールへのポインタを返します。

describeAbapTable は、フィールド名、DDIC型、長さ、キーフラグ、データ要素、ドメイン、チェックテーブルを返します。チェックテーブルは外部キー参照先であり、2つのテーブルがどのように結合するかを確認する最も手軽な方法です。objectStructure はテーブルに対してフィールドを返さず、tableContents は定義ではなく行を返すため、どちらも「このテーブルはどのような定義か」という問いに答えません。

クライアントのシステムプロンプトに入れておく価値のあるルール

  • 名前指定ツールを優先する。 中間結果が必要な場合のみ、searchObjectobjectStructuregetObjectSource にフォールバックする。/sap/bc/adt/... パスを手作りしてはならない。

  • 効率的に選択する。 SAP のテーブルは大きい。SELECT は常に WHERE 句で制約し、すべてのキーフィールドが既知の場合は SELECT SINGLE、それ以外の場合は UP TO n ROWS を使用する。

SELECT vgbel FROM vbrp WHERE vbeln = @lv_vbeln INTO @DATA(lv_vgbel) UP TO 1 ROWS.
  EXIT.
ENDSELECT.

SAP はファイルシステムから切り離されています。ソースを読み取っても、それはツール結果として返されるだけであり、ローカルファイルに書き込んでも SAP 側では何も変わりません。ローカルコピーは差分確認に役立つだけで、それ以上でもそれ以下でもありません。

以前の README には GetTable, GetStructureGetTypeInfo が列挙されていました。これらはこのサーバーではなく、別の mcp-abap-adt プロジェクトに属します。


開発

npm run build          # tsc -> dist/
npm test               # jest: parser, tool catalogue, JSON-RPC handler (no SAP system needed)
npx tsc --noEmit       # type check only

テストは src/__tests__ に置かれ、完全にオフラインで実行されます — JSON-RPCスイートは、疑似 SAP Gateway ノードに対してハンドラをエンドツーエンドでテストします。

実際のシステム(Kerberos チケットが必要)では、エンドツーエンドの確認は次のとおりです。

npm run build
node scripts/live-jsonrpc-check.mjs      # add NODE_TLS_REJECT_UNAUTHORIZED=0 for an internal CA

これは、クライアントとまったく同様に、ビルド済みサーバーを MCP stdio 経由で駆動し、読み取り専用のファンクションモジュールのみを呼び出します。

ツールの追加は1ファイルの変更だけで済みます。docs/MCP-Tools.md §10 を参照してください。

トラブルシューティング

症状

原因 / 対処

すべての呼び出しで HTTP 401

Kerberos モード: 有効なチケットがないか、システムが SPNEGO を受け付けていない。klist と VPN/ドメイン接続を確認する。証明書モード: docs/Authentication.md §6 を参照すること。

curl nicht gefunden

SSO ブートストラップが curl を見つけられなかった。SSO_CURL_PATH を設定すること。

SAP rejected the client certificate

CERTRULE マッピング、icm/HTTPS/verify_client、または STRUST の CA トラストが原因。エラーは提示されたサブジェクトを具体的に示すので、それを CERTRULE と比較すること。

unable to get local issuer certificate

内部 CA。NODE_TLS_REJECT_UNAUTHORIZED=0 を設定する(開発時のみ)。

RFC ツールが reachable:false を返す

checkJsonRpcEndpoint を実行する。これにより、非アクティブな /sap/gw/jsonrpc SICF ノードと、CSRF または承認の問題を切り分けできる。

関数モジュールから -32601 が返る

関数モジュールが存在しない、RFC 対応でない、または S_RFC がその関数グループを拒否している。

クライアントにツールが表示されない

dist/index.js の絶対パスを確認し、npm run build が実行済みであることを確認る。

詳細は docs/MCP-Tools.md §8 を参照してください。

コントリビューション

  1. リポジトリをフォークする

  2. git checkout -b feature/your-feature-name

  3. 変更を行い、npm testnpx tsc --noEmit を成功した状態に保つ

  4. git commit -m "Add some feature"git push origin feature/your-feature-name を実行する

  5. プルリクエストを開く

ライセンス

MIT ライセンスです。アップストリームプロジェクトと原作者: mario-andreschak

A
license - permissive license
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    C
    quality
    Not graded
    maintenance
    An MCP server that facilitates seamless interaction with SAP ABAP systems to manage development objects, transport requests, and source code. It provides a comprehensive suite of tools for performing syntax checks, object searches, and code modifications via the ADT API.
    100
  • A
    license
    C
    quality
    D
    maintenance
    An MCP server that enables seamless communication between ABAP systems and MCP clients using the ABAP Development Tools (ADT) API. It provides tools for managing ABAP objects, handling transport requests, and performing code analysis directly through MCP-compatible interfaces.
    100
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    A standalone MCP server for SAP ABAP development and customizing that connects directly to your SAP system via ADT REST API, enabling AI assistants to search, read, write, activate, transport, debug, and run quality checks on ABAP code, as well as manage customizing/IMG configurations with governed transport recording.
    MIT
  • A
    license
    B
    quality
    C
    maintenance
    MCP server for SAP ABAP development that enables AI assistants and code editors to interact with SAP systems via ABAP Developer Toolkit (ADT) APIs, supporting read, create, update, and delete of ABAP objects.
    100
    1,664
    MIT

View all related MCP servers

Related MCP Connectors

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/Ciltress/sap-abap-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server