mcpField
S
sap-abap-sql

sap-abap-sql

ローカル
github.com/daslabhq開発ツール112 週間前に更新

sap-abap-sql について

sap-abap-sqlは、SAPのADTデータプレビューコンソール向けにABAP Open SQLを検査・修正するMCPサーバーです。設定したシステムへの読み取り専用クエリにも対応し、文の検査はシステム接続なしで使えます。

主な機能

  1. 01SQL文の検査と書き換え
  2. 02コンソールが拒否した文の説明
  3. 03方言ルールの一覧表示
  4. 04設定したシステムへの読み取り専用クエリ
  5. 05行数上限に達した結果の表示

活用シーン

  1. 01クエリ送信前の括弧間隔の修正
  2. 02ADTコンソールのSQLエラーの診断
  3. 03設定したSAPシステムからのテーブルデータ読み取り

MCP 対応

文の準備、エラー説明、方言ルール、クエリ実行のツールを提供します。最初の3種類はネットワーク接続なしで入力文を処理し、クエリツールは設定済みのSAPシステムに読み取り専用で接続します。

設定

ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。

mcp.json · 共通設定
{
"mcpServers": {
"run-daslab-sap-abap-sql": {
"command": "npx",
"args": [
"-y",
"sap-abap-sql-mcp"
]
}
}
}
起動コマンドnpx -y sap-abap-sql-mcp

ローカルサーバーにはマシン上の実行環境(Node.js 18 以上など)が必要です。設定ファイルの場所はクライアントごとに異なります。

パッケージ
npmsap-abap-sql-mcp0.3.0

ツール

4

掲載時のツール一覧 · 2 週間前に更新

パラメーター型必須説明
sqlstringはい単一の ABAP Open SQL SELECT ステートメント。

詳細

SAP ABAP SQL(MCP サーバー)

tests npm

ABAP Open SQL をチェックし、SAP の ADT データプレビューコンソールに送信する前に修正します。

オンプレミスの SAP システムを LLM に指定したことがある方なら、次のようなエラーを見たことがあるでしょう。

送信した内容SAP の応答
SELECT SUM(netwr) FROM vbap400 Unknown column name "SUM(NETWR)"
SELECT COUNT(DISTINCT kunnr) FROM vbak400 ")" is invalid here (due to grammar)
SELECT a FROM t WHERE (x = '1' OR y = '2')400 ") " was expected here.

エラーは3つ、ルールも3つあるように見えますが、原因は1つです。パーサーは、すべての括弧の内側にスペースを求めています。 3つ目のエラーでも、そのことが示されています。スペースを入れれば、3つとも通ります。

エラーメッセージには「スペースを追加」とは書かれていないため、モデルは推測します。記録されたあるセッションでは、同じ不正なステートメントが、リテラルだけを変えて10回連続で送信されました。2つのセッションでは、211回のツール呼び出しのうち57回が失敗し、その大半は方言に関するものでした。

このサーバーはルールを把握しているため、エージェントがルールを探り直す必要はありません。

この方言について

ADT データプレビューコンソール(/sap/bc/adt/datapreview/freestyle)は、エージェントや ADT クライアントが HTTP 経由でテーブルを読み取る場所です。ABAP プログラム内に記述する Open SQL は別の方言です。INTO TABLE、UP TO n ROWS、@host 変数が使え、文字数の上限もありません。プログラムのソースに対してこのツールを使っても、正しい結果が得られるとは限りません。

対象はオンプレミスシステム(ECC、S/4HANA オンプレミス、プライベートクラウド)です。適切な OData API を利用できる S/4HANA Cloud をお使いの場合、これは必要ありません。

システムにアクセスしますか?

アクセスするのは、指示した場合のみで、しかもお使いのマシンからだけです。

4つのツールのうち3つは、渡されたステートメントを処理する純粋関数です。接続、認証情報、ネットワーク呼び出しは不要です。これらがデフォルトのツールで、設定なしですぐに使えます。

残る abap_sql_query は、設定したシステムに対してステートメントを実行し、行を返します。認証情報は、お使いのマシン上にあるこのサーバーの環境に保存されます。他者を経由してプロキシされることも、保存されることもありません。

{
  "mcpServers": {
    "sap-abap-sql": {
      "command": "npx",
      "args": ["-y", "sap-abap-sql-mcp"],
      "env": {
        "SAP_URL": "https://your-system:44300",
        "SAP_USER": "...",
        "SAP_PASSWORD": "...",
        "SAP_HEADERS": "X-Your-Proxy-Token: ..."
      }
    }
  }
}

SAP_HEADERS は任意です。1行につき Name: value を指定します。オンプレミスシステムには、トンネルやプロキシを経由して接続することがよくあります。独自のヘッダーでアクセスを制御している場合、SAP に届く前にすべてのリクエストが拒否されます。その場合、「ADT が無効になっている」とまったく同じ内容の403エラーが表示されますが、実際にはそうではありません。

設計上、読み取り専用です。データプレビューコンソールから書き込みはできないため、書き込みに悪用される経路はありません。

インストール

{
  "mcpServers": {
    "sap-abap-sql": {
      "command": "npx",
      "args": ["-y", "sap-abap-sql-mcp"]
    }
  }
}

ツール

ツール説明
abap_sql_prepare送信するステートメントを返すか、拒否して修正内容を示します
abap_sql_explainコンソールが拒否したステートメントを、書き換えずに解析します
abap_sql_query準備したステートメントを設定済みシステムに対して実行し、行を返します
abap_sql_rulesこの方言と標準 SQL の違いを一覧表示します

すべて読み取り専用で、副作用はありません。

abap_sql_prepare  SELECT COUNT(DISTINCT kunnr) FROM vbak
→ { "ok": true, "statement": "SELECT COUNT( DISTINCT kunnr ) FROM vbak", "length": 40, "limit": 255 }

abap_sql_prepare  SELECT a FROM t LIMIT 10
→ { "ok": false, "rule": "no-limit",
    "fix": "ABAP Open SQL has no LIMIT. Cap the result with the reader's row limit instead." }

5つのルールは、接続時にサーバーの instructions にも含まれるため、クライアントは何かを記述する前にルールを確認できます。abap_sql_rules は、ルールを明示的に再確認したい場合に使います。

できること

必要な箇所すべてでの括弧のスペース調整:集計関数、DISTINCT、サブクエリ、ブール式のグループに対応します。COUNT(*) は簡潔なままです。パーサーはどちらの形式も受け付けますし、下記の上限に対して一文字も無駄にできないからです。

**255 文字の上限。**コンソールは255文字を受け付け、256文字は拒否します。文字数は空白を圧縮した状態で数えます。複数行に折り返しても変わりません。また、スペース調整によって文が長くなるため、チェックは書き換えの後に行われます。クエリの計画に影響するのはこの制約です。実用的なクエリはすべて分割し、クライアント側で結合する必要があります。

LIMIT、DESC/ASC、ドットで修飾されたフィールドは、対応する ABAP 形式を示して拒否します。p.vbeln はパーサーが見逃すタイプミスではなく、3つのトークンです。

リテラルの位置。'PUMP (SPARE)' 内の括弧はデータであり、二重スペースも同様です。ABAP の両方の文字列形式とコメント形式を認識するため、書き換えによって文の意図が変わることはありません。これは、正規表現ではエラーを大げさにではなく、気づかれないまま起こしてしまう部分です。

代わりに処理することはできない内容

2つの制限はコンソール側のもので、こちらで変更できません。どのような問い合わせができるかは、すべてこの制限に左右されます。

1文あたり255文字のため、実用的なクエリは複数の文に分割し、クライアント側で結合する必要があります。ウィンドウ関数、CTE、累計は使えません。

**上限は厳密に5,000行。**上限に達した結果は、完全な結果のように返すのではなく、truncated として報告します。黙って切り捨てられた結果に対してクライアント側で合計を計算すると、確信に満ちた誤答になるためです。この失敗の仕方は、エラーよりも深刻です。

1つの質問に答えるために4つの文をつなぎ合わせているなら、それはコンソール側の制約です。クライアントで解決することはできません。

対象範囲

文の準備を行い、必要に応じて実行します。オブジェクトの参照、ABAP の実行、書き込みは行わず、テーブルの意味も把握しません。

ライブラリをサーバーとして実行するのではなく直接呼び出したい場合は、方言ロジックを abap-sql で利用できます。トークン化には、TypeScript で唯一正しい ABAP トークナイザーである abaplint のレキサーを使用しています。

Daslab が開発しました。オンプレミスの ERP システムにエージェントを接続しています。ネットワーク外から接続するのはそれ自体が別の課題です。実際に有効な方法をまとめた記事を無料で公開しています:HTTP 経由でオンプレミスの S/4HANA に接続する。

リリース

git tag v0.3.0 && git push --tags。CI はタグと package.json の内容を照合し、テストを実行して、provenance 付きで npm に公開し、.mcpb バンドルをビルドして GitHub リリースに添付します。

公開には npm の信頼された公開機能を使用しているため、このリポジトリにトークンはなく、ローテーションも不要です。npm は OIDC を通じて、このリポジトリとワークフローを信頼します。

CI が保持していない認証情報が必要なため、手動のままにしている手順が2つあります。MCP Registry(mcp-publisher publish)と Smithery(smithery mcp publish)です。

ライセンス

MIT

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。