Skip to main content
Glama

Status: experimentell. In Produktivsystemen mit Vorsicht einsetzen.

ABAP ADT MCP Server

Ein MCP-Server, der einem KI-Agenten vollständigen Lese- und Schreibzugriff auf ein SAP-ABAP-System über ADT (ABAP Development Tools) gibt, authentifiziert mit SPNEGO/Kerberos Single-Sign-on, einem X.509-Clientzertifikat oder einem OAuth-2.0-Bearer-Token — ohne Passwort irgendwo in der Konfiguration. Benutzer und Passwort sind weiterhin als Fallback verfügbar, aber nicht empfohlen!

Er kapselt abap-adt-api und ergänzt eine Sache, die ADT selbst nicht kann: RFC-fähige Funktionsbausteine aufrufen über den SAP-Gateway-JSON-RPC-2.0-Dienst.

128 Tools — Objekt-CRUD, Quellcode-Bearbeitung, Sperren, Transporte, Aktivierung, Syntaxprüfungen, Code- Vervollständigung, ABAP Unit, ATC, DDIC, abapGit, Refactoring, Traces, den Debugger und RFC-Aufrufe.

Wie viele Tools ein Client tatsächlich sieht, ist aus zwei Gründen kleiner. Profile (ABAP_MCP_PROFILE) tauschen Oberfläche gegen Kontext: core listet 9 Tools, während all 129 listet, was pro Interaktionsrunde ungefähr ~2.700 Token gegenüber ~17.800 Token für einen Client bedeutet, der Tool-Schemas nicht auf Abruf laden kann. Zudem fragt der Server das System ab, was es unterstützt, bevor er etwas listet — so wird einem Release ohne das abapGit-Plugin niemals die 10 Tools angebot, die andernfalls mit 400 antworten würden. Auf einem DEV-System bleiben dann 116 Tools.

Das ist der SSO-Fork von mcp-abap-abap-adt-api von mario-andreschak. Die Hauptunterschiede: Kerberos-SSO statt Basic Auth, die JSON-RPC-/RFC-Tool, ein Router, der aus den Tool-Definitionen abgeleitet ist, und eine dokumentierte Tool-Referenz.


Dokumentation

Dokument

Das wird abgedeckt

AGENTS.md

Arbeiten an diesem Repository: Aufbau, Konventionen, Testen. Vor Änderungen am Code lesen Sie dieses Dokument.

docs/Tool-Router.md

Was Sie tun möchten → das Tool, das es tut. Handgeschrieben, in den Worten, die Menschen verwenden. Sie starten hier, wenn Sie die Aufgabe kennen, aber nicht das Tool.

docs/Tool-Reference.md

Alle 128 Tools mit ihren Argumenten, gruppiert nach Familien. Aus den Tool-Definitionen generiert, es kann also nie vom Code abweichen.

docs/MCP-Tools.md

Wie sich der Server verhält. Die Profile, die Golden-Path-Workflows, die ADT-URI- und Lock-Semantik, das Antwort-/Fehlermodell sowie eine Fehlerbehebungsmatrix. Geschrieben für Menschen und für Agenten, die den Server steuern.

docs/ABAP-Skills.md

Die 20 SAP/ABAP-Skills und wie sie auf diese Tools abgebildet sind.

docs/Development-Skills.md

Die 35 im Paket enthaltenen allgemeinen Engineering-Skills.

docs/JSON-RPC.md

Design- und Protokollieren von Noten für die JSON-RPC-/RFC-Tools, gelesen aus dem ABAP-Quellcode von /IWBEP/CL_JSRPC_*: das Wire-Protokoll, die LUW-Garantie hinter Batches und die Fallstricke.

docs/Authentication.md

The two password-losen Anmeldemodi: Keerberos-SSO und X.509-Zertifikate für Service- und Technische Benutzer. Was SAP konfigurieren muss und warum es sich hierbei um Gegenseitiges TLS statt um SNC handelt.


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

Features

  • Zwei passwortlose Anmeldemodi — entweder SPNEGO/Kerberos mit dem Ticket des angemeldeten Windows-Benutzers oder ein X-509-Clientzertifikat für einen Service- oder technischen Benutzer ohne Kerberos-Identität. In beiden Fällen wird kein SAP-Passwort gespeichert oder gesendet, und beide heilen sich selbst, wenn die Sitzung abläuft.

  • Beliebiges Objekt über den Namen lesenreadAbapObject löst einen Namen in einem Aufruf in den zugehörigen Quellcode auf; keine ADT-URL zum Entdecken oder von-Hand-Zusammenbauen.

  • Eine Tabelle beschreibendescribeAbapTable liefert Informationen, DDIC-Typen, Schlüsselflags und Check-Tabellen.

  • Objektverwaltung — ABAP-Objekte suchen, lesen, anlegen, ändern, löschen und aktivieren.

  • Nam Naturen-Konventionen erfassensearchPackages findet Pakete per Namensmuster (["ZPP_*","Z_PP*"]) und jeder Paket direkt im one call seine Objekte, gruppiert nach Typ.

  • Quellcode-Workflow — Sperren → Bearbeiten → Syntaxprüfung → Aktivieren → Entsperren, inklusive Transporverwaltung.

  • Code-Intelligenz — Code-Vervollständigung, Definitionen, Verwendungsreferenzen, ABAP Doc, Pretty-Printer, ATC, ABAP Unit, Refactoring (Umbenennen, Methode extrahieren).

  • RFC-Funktionsbaustein aufrufencallFunctionViaJsonRpc führt einen RFC-fähigen Funktionsbaustein aus und validiert die Anfrage gegen die reale, aus dem System gelesene Signatur.

  • RFC-Aufrufe in einem LUW (Batch)callFunctionsViaJsonRpc sendet mehrere Funktionsbausteine in einer einzigen Anfrage;. Dadurch können ein Update-BAPI und sein BAPI_TRANSACTION_COMMIT einer LUW gemeinsam nutzen.

  • DatenzugrifftableContents und Ad-hoc-runQuery-SELECTs.

  • Das laufende System ansehenlistLoggedOnUsers beantwortet "wer ist angemeldet" aus der Sicht auf die Daten der Tabelle TH_USER_LIST hinter SM04; readProfileParameters Lese RZ11-Werte in einem order RTT; und checkLogonConfiguration Logon sagt, welche Authentifizierung das System system tatsächlich akzeptierte.

  • Gebündelte Agent Skills — 54 Skills unter skills/ für ABAP (Clean ABAP, ABAP, .S) und allgemeine Engineering (TDD, Code-Review, Fehlerdiagnose), veröffentlicht als Ressourcen und via readSkill.

  • Self-Documentieren — die folgenden Anleitungen werden vom Server selbst als MCP-Ressourcen (abap-adt://-Leitfäden/…) und auch dem Tool readServerGuide/ bereitgestellt, sodass ein Agent mitten in der Aufgabe einen Arbeitsablauf oder ein Argument nachschlagen kann.

Voraussetzungen

  • ative Familie | Enables Server must be wired:

  • Ein über ADT erreichbares SAP-ABAP-System. /sap/bc/adt muss in SICF aktiv sein. Für die RFC-Tools muss zusätzlich /sap/gw/jsonrpc aktiv sein (SAP_GWFND), und dein Benutzer benötigt S_RFC für die aufzurufenden Funktionsgruppen.

  • Eine passwortlose Anmeldemöglichkeit, eine der folgenden:

    • Ein funktionierender Kerberos-Login — das SAP-System muss SPNEGO absorbieren und es muss ein gültiges Ticket vorliegen (klist). Dies ist die Standardvariante und benötigt Windows in der Standardw verteiltung: die Bootstrapping-Ebene ruft C:\Windows\System32/curl.exe --negotiateB auf, und das benötigt curl‑mit Schannel/SSPI-Backend. Auf anderen Plattformen setzen Sie SSO_CURL_PATH auf ein curl-Binary mit GSS-API-Unterstützung.

    • Ein X.509-Clientzertifikat — für einen Service- oder technischen Benutzer ohne Kerberos-Identität. Benötigt weder curl noch Windows. Dafür ist SAP einzurichten: Die ICM-Port muss ein Zertifikat verlangen (setup in icm/server_port_<n>, das icm/HTTPS/verify_client überschreibt), die ausstellende von [zu verwendenden Zertifizierungsstelle] in STRUST als vertrauenswürdig eingetragen sein, and a mapping entry ("Einstellung") redirect to user. Full setup including including check. See the Schauen Sie in docs/Authentication.md.

    • Ein OAuth-2.0-Cient — für eine SAP-BTP-ABAP-Umgebung, in der es keinen Kerberos-Realm und kein ICM zu... Konfession gibt, oder besteht für ein On-Premises-System, das ADT über SOAUTH2 veröffentlicht. EIn BTP-Service-Schlüssel ist bereits ein solcher Schlüssel. Siehe §11.

  • Node.js (LTS) und npm — überprüfen mit node -v und npm -v.

Installation

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

--recurse-submodules ist wichtig: Die allgemeinen Engineering-Skills liegen in einem Submodule, and without it Verzeichnis leer and the server 500 skills less. Already geklont? Ausführen git submodule update --init --recursive.

Das npm-Paket npx mcp-abap-abap-adt-api ist der upstream-Server und enthält nicht die SSO-Bootstrap-Logik oder die RFC-Tools. Erstellen Sie dieses Repository stattdessen direkt aus dem Source.

Konfiguration

Copy .env.example zu .env und Füllen Sie die Systemdaten Ihres Systems aus:

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

SAP_URL and SAP_USER: Pflicht; SAP_CLIENT and SAP_LANGUAGE sind optional, but empfohlen. Drei der vier Anmeldemodi benötigen kein SAP_PASSWORD recht keine.

Committen Sie .env nie; Es steht bereits in .ignored.

Optionale Variable

Effekt

SAP_SYSTEM_ID

System-ID, wie in sy_sysid (z. B. DEV). Wird beim Verbindungsaufbau gemeldet, sodass ein Client zwischen mehreren Servern per Namen wählen kann. Siehe auch Mehrere Systeme.

NODE_TLS_REJECT_UNAUTHORIZED=0

Zertifikat aus einer internen/unbekannten CA zu akzeptieren. Nur für die Entwicklung.

SSO_CURL_PATH

Pfad zu einem curl-Binary mit SPNEGO-Unterstützung, falls das Windows-Systembinary nicht verwendet wird.

SAP_JSONRPC_PATH

JSON-ICF-Pfad überschreiben, wenn der Knoten unter einem Aliasnamen veröffentlicht wurde.

ABAP_MCP_PROFILE

Welche Tools dieser Server listet — und damit auch beantwortet. Siehe unten.

ABAP_MCP_MAX_RESPONSE_BYTES

Obergrenze für eine den Corps ist deren, alle in Bytes. 0 entfernt die Bindung.

ABAP_MCP_GATE

off liefert diese Startprüfunktion auf der Fähigkeit überspringen, die on ansonsten Tools zurückhält, dieselbe Release nicht bedienen kann.

ABAP_MCP_RFC_FALLBACK

Starten auch dann, wenn SAP diesem Benutzer den ADT-Knoten verweigert, und die RFC-Tools bleiben enthalten. Siehe docs/Authentication.md.

SAP_FALLBACK_BOOTSTRAP_PATH

Welcher ICF-Knoten dieses Fallback anmeldet. Er muss lediglich ein Session-Cookie und ein CSRF-Token ausgeben.

Server an den Client anpassen

Die drei ABAP_MCP_*-Variablen existieren aus einem Grund: Ein Client, die Tools-schemas nicht bei On Requirement festnehmen, muss full sized benefit computation: takes the full list of Tool-Lists with each interaction.** Claude Code postponed schemas on should default bleiben; ein 8B-Modell mit 128k-Fenster spends a sixth of its Context before the conversation starts — und daher kommt der Satz „Der gleiche Propmt funktioniert nur die Hälfte der Zeit".

ABAP_MCP_PROFILE — nicht gesetzt bedeutet all, demnach bleibt eine bestehende Einrichtung unverändert.

Profil

tools/list

Kosten pro Turn

Zweck

core

9

~2.737 Tokens

System lesen und eine Änderung abschließen

analyst

18

~3.982 Tokens

Nur lesen: Wörterbuch, Tabellendaten, RFC-Aufrufe

rfc

10

~2.900 Tokens

Ein Benutzer mit RFC-Rechten, aber ohne S_DEVELOP, wo ADT-Tools nicht funktionieren

dev

49

~8.034 Tokens

Der Änderungszyklus plus Tests, ATC, Transporte, Refactoring

all

129

~17.759 Tokens

Die Voreinstellung; richtig für Clients, die Schemata bei Bedarf abrufen

Die Zählungen enthalten healthcheck, das außerhalb jedes Profils liegt, weil es das Tool ist, das die Frage „Welches Profil läuft bei mir?" beantwortet.

Ein Profil ist kein Komfortfilter. Ein Tool außerhalb des aktiven Profils wird nicht gelistet und nicht geroutet, kann also nicht aufgerufen werden — genau das macht analyst zu einer Garantie, dass nichts Quellcode ändert, statt zu einem kleineren Menü. Aufrufe außerhalb des Profils erhalten einen Fehler, der das sagt, statt „unbekanntes Tool", daher lohnt kein erneuter Versuch. Ein unbekannter Profilname stoppt den Server beim Start, statt auf all zurückzufallen — stillschweigend 129 Tools für etwas auszuliefern, das 9 angefordert hat, ist genau der Fehler, den Profile verhindern sollen.

core ist klein, weil ein einziges Tool, editAbapSource, den Schreibzyklus darstellt: Sperren, Schreiben, Aktivieren, Entsperren — wobei die Sperre auch dann freigegeben wird, wenn ein Schritt fehlschlägt. Die vier getrennten Schritte bleiben in dev und all.

ABAP_MCP_MAX_RESPONSE_BYTES — die Toolliste ist eine feste Größe, die ein Profil verkleinern kann; eine Antwort ist unbegrenzt. Bei core ist die gesamte Toolliste ~11 KB, während ein einzelner adtDiscovery ~42 KB groß ist. Ohne Angabe folgt der Wert dem Profil (core 24.000 Bytes, analyst 32.000, dev 48.000, all ohne Obergrenze); 0 entfernt sie.

Eine Antwort über dem Budget wird zurückgehalten und durch gültiges JSON ersetztstatus:"truncated", die ursprünglichen bytes, das budget, eine 2.000-Byte-preview und ein nextStep — niemals durch ein abgeschnittenes Fragment, das nicht parsebar wäre und nur denselben Wiederholungsversuch provozieren würde.

ABAP_MCP_GATE — bevor der Server etwas auflistet, fragt er das System, was es unterstützt, und hält die Tools zurück, deren ADT-Sammlungen fehlen. Auf DEV sind das die 10 abapGit-Tools und die 3 Service-Binding-Tools, die sonst mit HTTP 400 antworten würden. Das kostet eine Discovery-Runde pro Prozess, kann die Liste nur verkürzen, und jeder Fehler lässt alle Tools gelistet. ABAP_MCP_GATE=off überspringt das.

healthcheck meldet alle drei: das aktive Profil, responseBudgetBytes und alles Zurückgehaltene.

Ein Zertifikat statt Kerberos

Für einen Service- oder technischen Benutzer ein Zertifikat hinzufügen — das allein schaltet den Modus um:

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>

Optionale Variable

Wirkung

SAP_AUTH_MODE

kerberos, certificate, oauth oder password. Nur nötig, um einen Modus zu erzwingen, während ein anderer konfiguriert ist.

SAP_CERT_KEY_FILE

Der private Schlüssel, wenn er nicht in SAP_CERT_FILE liegt.

SAP_CA_FILE

CA-Bundle zur Verifizierung von SAPs eigenem Zertifikat, statt TLS-Verifizierung zu deaktivieren.

Das ist gegenseitiges TLS, kein SNC — ADT ist HTTPS. Ein Zertifikat, das bereits für RFC/SNC funktioniert, kann wiederverwendet werden, und sein CERTRULE-Mapping überträgt sich, aber die SNC0-ACL spielt keine Rolle, und der ICM benötigt icm/HTTPS/verify_client. docs/Authentication.md behandelt die Unterschiede, die sapgenpse export_p12 / OpenSSL-3-Falle und das Lesen eines abgelehnten Zertifikats.

Ein OAuth-2.0-Client, für BTP und für SOAUTH2

Für eine SAP-BTP-ABAP-Umgebung oder ein On-Premise-System, das ADT hinter einem Autorisierungsserver veröffentlicht. Das Setzen der Client-ID schaltet den Modus um:

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'>

On-Premise liegt der Endpunkt auf dem SAP-Host selbst — https://<host>:<port>/sap/bc/sec/oauth2/token — und der Client ist der in SOAUTH2 registrierte.

Optionale Variable

Wirkung

SAP_OAUTH_GRANT

client_credentials (Standard), refresh_token, password oder static.

SAP_OAUTH_SCOPE

Anzufragende Scopes. Ohne Angabe werden die Standard-Scopes des Clients angefragt, was meist richtig ist.

SAP_OAUTH_REFRESH_TOKEN

Für den refresh_token-Grant; wählt ihn von selbst aus.

SAP_OAUTH_TOKEN

Ein anderswo erzeugtes Token, das unverändert verwendet wird. Nichts kann es erneuern.

SAP_OAUTH_CLIENT_AUTH

basic (Standard) oder post, wenn ein Server ein an sich richtiges Secret ablehnt.

Das Token meldet sich genau einmal an. Danach trägt das SAP-Sitzungscookie jede Anfrage, wie in den anderen Modi — ein Token, das in fünf Minuten abläuft, ist also kein Problem. Beachten Sie, dass ein OAuth-2.0-Client auf AS ABAP ein Benutzer in SU01 ist: Ein falsches SAP_OAUTH_CLIENT_SECRET zählt gegen login/fails_to_user_lock wie ein Passwort, daher wird eine abgelehnte Token-Anfrage nie wiederholt. Der Authorization-Code-Flow ist nicht implementiert — er benötigt einen Browser, den ein über stdio gestarteter Server nicht öffnen kann; führen Sie ihn einmal von Hand aus und übergeben Sie das Refresh-Token. docs/Authentication.md §11 enthält die Details, einschließlich welcher Fehler verriegelt werden und warum.

Ein Passwort, wenn es nichts anderes gibt

Für ein System ohne Kerberos und ohne Zertifikate — eine Sandbox, eine Trial-Umgebung, alles außerhalb der Domäne:

SAP_USER=CLAUDEAGENT
SAP_PASSWORD=<the password>

Die letzte Option und nicht mit den anderen beiden austauschbar. Ein fehlendes Ticket oder ein nicht zugeordnetes Zertifikat wird schlicht abgelehnt; ein falsches Passwort zählt gegen login/fails_to_user_lock und sperrt diesen Benutzer für alle Konsumenten, nicht nur für diesen Server. Die Implementierung weigert sich aus diesem Grund, ein abgelehntes Passwort zu wiederholen — ein fehlgeschlagener Logon, verriegelt, egal wie viele Tools aufgerufen werden. Für alles Unbeaufsichtigte ist ein Zertifikat vorzuziehen. docs/Authentication.md §10 enthält die Details.

Bei einem MCP-Client registrieren

Weisen Sie den Client mit absoluten Pfaden auf den gebauten Einstiegspunkt:

{
  "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"
      }
    }
  }
}

Der env-Block des Clients gewinnt gegenüber .env. Führen Sie npm run start aus, um den Server von Hand zu starten, oder npm run dev, um ihn über den MCP Inspector zu steuern.

Für einen Client, der bei jedem Turn das vollständige Tool-Schema mitführt, fügen Sie demselben Block ein Profil hinzu:

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

In Docker

Der Server spricht MCP über stdio, es gibt also keinen Port zu veröffentlichen — der Client startet den Container und kommuniziert über stdin/stdout mit ihm.

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"]
    }
  }
}

Alle vier Logon-Modi funktionieren hier, aber eine Anmeldeinformation muss dem Container gegeben werden, und --env-file ist kein dotenv — Docker entfernt keine Anführungszeichen, liest kein export und verwirft keinen nachgestellten # comment, ein Wert, den dotenv bereinigt hätte, kommt also unverändert an. Windows-Pfade in .env müssen durch die gemounteten ersetzt werden. Kerberos ist der Modus, der am meisten vom Container verlangt, und OAuth am wenigsten: Ein Token wird über das Netzwerk geholt, es muss also gar nichts gemountet werden.

Zertifikatsmodus — Schlüsselmaterial schreibgeschützt mounten, und die CA, die SAPs Zertifikat signiert, dazu:

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-Modus — das Image enthält ein gegen GSS-API gebautes curl und kinit, es bleiben also nur eine Realm und eine Anmeldeinformation:

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-Modus — nichts zu mounten; die Anmeldeinformation wird geholt:

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

Passwortmodus — letzte Option!

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

Drei Dinge, die Sie wissen sollten, bevor Sie darauf zurückgreifen:

  • Ein Keytab, nicht Ihr eigenes Ticket. Ein Container kann die Sitzungsanmeldeinformation nicht so ausleihen wie ein interaktiver Logon. Auf einem Linux-Host können Sie den bereits vorhandenen Ticket-Cache mounten (-v /tmp/krb5cc_1000:/krb5/ccache:ro -e KRB5CCNAME=FILE:/krb5/ccache), aber er läuft mit dem des Hosts ab. Von einem Windows-Host funktioniert beides nicht: Das TGT liegt im LSA-Cache und kann nicht in eine Datei geschrieben werden — verwenden Sie den Zertifikatsmodus, der nichts davon benötigt. Der Keytab ist die einzige Anmeldeinformation, die unbeaufsichtigt läuft, und die einzige, die die Ticket-Lebensdauer überdauert.

  • SAPs Zertifikat verifizieren — oder wissen, dass Sie es nicht tun. Das Image vertraut nur dem öffentlichen CA-Bundle, daher ist eine interne CA, der der Host vertraut, hier unbekannt, und der Handshake schlägt mit UNABLE_TO_GET_ISSUER_CERT_LOCALLY fehl. Mounten Sie die Root-CA und weisen Sie SAP_CA_FILE darauf. Eine Desktop-.env komplett zu übernehmen, versteckt das stattdessen: NODE_TLS_REJECT_UNAUTHORIZED=0 ist eine Entwicklungseinstellung und hat in einem deployed Image nichts zu suchen.

  • Aus einem --recurse-submodules-Clone bauen. skills/Development ist ein Submodul; ohne es enthält das Image 35 Skills weniger.

Das Image ist Debian statt Alpine aus einem einzigen Grund: Alpines curl ist ohne GSS-API gebaut, und ein solches curl schlägt nicht fehl — es sendet schlicht nie ein Token, und SAP antwortet mit demselben 401, das ein abgelaufenes Ticket erzeugt. Was fehlt, wird beim Start auf stderr genannt, bevor eine Sitzung versucht wird. Um den Container zu fragen, welche Anmeldeinformation er am Ende verwendet hat, geben Sie ihm einen Befehl statt des Servers:

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/ und AGENTS.md werden absichtlich in das Image kopiert — der Server liest sie zur Laufzeit, um readServerGuide, readSkill und die abap-adt://-Ressourcen zu bedienen. docs/Authentication.md §7 enthält die vollständige Container-Einrichtung, Modus für Modus.

Mehr als ein System

Ein Server ist für seine gesamte Lebensdauer an ein System und einen Client gebunden — keines von beiden kann zur Laufzeit gewechselt werden. Registrieren Sie also einen Eintrag pro System/Client und geben Sie jedem seine 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", "…": "…" } }

Jeder Server kündigt sich dann in den MCP-instructions an, die er beim Verbindungsaufbau zurückgibt:

Dieser Server ist an SAP-System DEV, Client 100 gebunden (https://…:44301). Er kann System oder Client zur Laufzeit nicht wechseln — beide sind durch die Umgebung festgelegt, mit der er gestartet wurde. Wenn eine Anfrage ein anderes System oder einen anderen Client nennt, verwenden Sie den für dieses konfigurierten MCP-Server; wenn keiner registriert ist, sagen Sie das, statt hier zu handeln.

Genau das ermöglicht es einem Agenten, „bitte prüfen Sie das in DEV, Client 200" an den richtigen Server zu leiten, ohne etwas aufzurufen. healthcheck meldet dieselbe Identität für einen Server, den man direkt fragen muss.

Die Deklaration wird geprüft. SAP nennt System und Client im Sitzungscookie, das es beim Logon setzt (SAP_SESSIONID_DEV_100), der Server weiß also, womit er wirklich verbunden ist. Wenn das mit SAP_SYSTEM_ID nicht übereinstimmt — etwa ein kopierter Eintrag, der auf den falschen Host zeigt — trägt healthcheck eine WARNING, und es wird beim Start laut protokolliert. Das zu beobachten lohnt sich, denn jedes Tool funktioniert weiterhin einwandfrei; nur eben auf dem falschen System.


Kurzer Rundgang

Beliebiges Objekt nach Namen lesen — keine URL-Ermittlung nötig:

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

Eine ganze Namenskonvention überblicken — Muster werden für Sie normalisiert, so wird zpp_lab zu ZPP_LAB*:

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

Ein Funktionsbaustein aufrufen — die Signatur wird zuerst gelesen und die Anfrage dagegen validiert:

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

Ein BAPI und sein Commit müssen in einem Batch reisen, sonst landet der Commit in seiner eigenen LUW und die Änderungen des BAPI gehen verloren:

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

Der vollständige Schreibzyklus (Sperren → Ändern → Prüfen → Aktivieren → Entsperren), der Debugger, ATC und alle anderen Workflows finden sich in docs/MCP-Tools.md §4.


Mit ABAP-Objekten arbeiten

Drei Tools decken das meiste ab, was Sie brauchen, und jedes nimmt einen Namen statt einer ADT-URL:

Gewünscht

Werkzeug

Der Quellcode einer Klasse, eines Programms, eines Include, einer Funktionsgruppe oder eines Funktionsbausteins

readAbapObject

Wie eine Tabelle, Struktur oder Sicht aussieht

describeAbapTable

Alles, was hinter einer Namenskonvention steckt

searchPackages

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

readAbapObject liefert die Metadaten und den Quellcode in einem Aufruf. Gehört ein Name zu mehreren Objekten — ZPP_EXT_LABEL_DATA ist sowohl eine Funktionsgruppe als auch ein Funktionsbaustein — wird das spezifischere Objekt gewählt und über ambiguous:true und alternatives mitgeteilt. Mit objectType lässt sich die Auswahl erzwingen. Objekte ohne Quellcode werden mit hasSource:false und einem Hinweis auf das richtige Werkzeug zurückgegeben.

describeAbapTable liefert Feldnamen, DDIC-Typen, Längen, Schlüsselflags, Datenelemente, Domänen und Tabellen. Die Check-Tabelle ist das Fremdschlüssel-Ziel und der schnellste Weg, zu sehen, wie zwei Tabellen verknüpft sind. objectStructure liefert für eine Tabelle keine Felder, und tableContents liefert Zeilen statt einer Definition; beides beantwortet also wann „Wie sieht diese Tabelle aus?“ nicht.

Regeln, die Sie in den System-Prompt Ihres Clients übernehmen sollten

  • Erhalten Sie die Werkzeuge mit Namen.** Verwenden Sie searchObjectobjectStructuregetObjectSource nur als Rückfallebene, wenn Sie die Zwischenergebnisse brauchen. Erstellen Sie /sap/bc/adt/...- nicht niemals von Hand.

  • Effizient mit SELECT umgehen. SAP-Tabellen sind groß. Schränken Sie SELECTs immer mit einer WHERE-Klausel ein; verwenden Sie SELECT SINGLE (alle Schlüsselfelder bekannt) oder sonst UP TO n ROWS.

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

SAP ist von Ihrem Dateisystem entkoppelt: Das Lesen von Quellcode gibt ihn ausschließlich als Werkzeug-Ergebnis ab. Das Schreiben einer lokalen Datei ändert nichts in SAP. Lokale Kopien sind nützlich zum Vergleichen – mehr nicht.

Frühere README-Dateien enthielten GetTable, kitchensinkGetStructure and GetTypeInfo nicht. Diese gehören zu dem separaten mcp-abap-adt-Project, nicht zum diesem Server.


Entwicklung

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

Die Tests liegen in src/__tests__ und laufen vollständig offline – die JSON-RPC-Suite testet den Handler Ende-zu-Ende gegen einen simulierten SAP-Gateway-Knoten.

Für ein echtes System (benötigt ein Kerberos-Ticket) lautet der End-to-End-Check:

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

Er steuert den gebauten Server über MCP stdio genau so, wie es ein Client tun würde, und ruft nur lesende Funktionsbausteine auf.

Ein Werkzeug hinzuzufügen ist eine Änderung, die in einer Datei gemacht wird – siehe docs/MCP-Tools.md §10.

troubleshooting

Symptom

Ursache/Behebung

HTTP 401 bei jedem Aufruf

Kerberos-Modus: kein gültiges Ticket, oder das System akzeptiert SPNEGO nicht – klint und VPN-/DOM-Verbindung prüfen . Zertifikats-Modus: siehe docs/Authentication.md §6.

curl nicht gefunden

Das SSO-Bootstrap konnte sein können – stellen Sie SSO_String_CUR.

SAP rejected the client certificate

Das CERTRULE-Mapping, icm/HTTPS/verify_client oder das CA-Vertrauen in STRUST. Der Fehler nennt das Subjekt, das präsentiert wurde – vergleichen Sie es mit CERTRULE.

unable to get local issuer certificate

Interne CA. Setzen Sie NODE_TLS_REJECT_UNAUTHORIZED=0 (nur Entwicklungszwecke).

RFC-Werkzeuge liefern reachable:false zurück

Führen Sie eine checkJsonRpcEndpoint aus. Es unterscheidet einen inaktiven /sap/gw/jsonrpc-SICF-Knoten von einem CSRF- oder Autorisierungsproblem.

-32601 von einem Funktionsbaustein

Er existiert nicht, ist nicht RFC-fähig, oder S_RFC verweigert den Zugriff auf seine Funktionsgruppe.

Client zeigt keine Werkzeuge

Stars-Absoluten Pfad zu dist/index.js und npm run build muss ausgeführt worden sein.

Mehr dazu in docs/MCP-Tools.md §8.

Beitragen

  1. Business Forken Sie das Repository.

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

  3. Machen Sie Ihre Änderung und halten Sie npm test/npx tsc --noEmit grün.

  4. git commit -m "Add some feature" und git push origin my-feature

  5. Öffnen Sie einen Pull-Request.

Lizenz

MIT. Upstream-Projekt und Original-Feature: mario-andreschak.


Hmm I realize some accidental errors in the final draft due to typos. Must correct final.

Let's write final with precision.

Let's output the| Gewünscht | Werkzeug |
|---|---|
| Der Quellcode einer Klasse, eines Programms, eines Include, einer Funktionsgruppe oder eines Funktionsbausteins | `readAbapObject` |
| Wie eine Tabelle, Struktur oder Sicht aussieht | `describeAbapTable` |
| Alles, was hinter einer Namenskonvention steckt | `searchPackages` |

GXP20

`readAbapObject` liefert die Metadaten *und* den Quellcode in einem Aufruf. Gehört ein Name zu mehreren Objekten – `ZPP_EXT_LABEL_DATA` ist sowohl eine Funktionsgruppe als auch ein Funktionsbaustein –, wird das spezifischere Objekt gewählt und über `ambiguous:true` und `alternatives` mitgeteilt. Mit `objectType` lässt sich die Auswahl erzwingen. Objekte ohne Quellcode werden mit `hasSource:false` und einem Hinweis auf das richtige Werkzeug zurückgegeben.

`describeAbapTable` liefert Feldnamen, DDIC-Typen, Längen, Schlüsselflags, Datenelemente, Domänen und **Check-Tabellen** – die Check-Tabelle ist das Fremdschlüssel-Ziel und der schnellste Weg zu sehen, wie zwei Tabellen verknüpft sind. `objectStructure` liefert für eine Tabelle keine Felder, und `tableContents` liefert Zeilen statt einer Definition; beides beantwortet also nicht „Wie sieht diese Tabelle aus?“.

### Regeln, die man in den System-Prompt des Clients aufnehmen sollte

* **Bevorzugen Sie die Werkzeuge mit Namensbezug.** Verwenden Sie `searchObject` → `objectStructure` → `getObjectSource` nur als Rückfallebene, wenn Sie die Zwischenergebnisse benötigen. Erstellen Sie `/sap/bc/adt/...`-Pfae nie von Hand.
* **Wählen Sie effizient.** SAP-Tabellen sind groß. Schränken Sie `SELECT`s immer mit einer `WHERE`-Klausel ein; verwenden Sie `SELECT SINGLE` (alle Schlüsselfelder bekannt) oder sonst `UP TO n ROWS`.

GXP21

SAP ist von Ihrem Dateisystem entkoppelt: Das Lesen von Quellcode gibt ihn nur als Werkzeug-Ergebnis zurück, und das Schreiben einer lokalen Datei ändert nichts in SAP. Lokale Kopien sind nur für Vergleiche nützlich, mehr nicht.

> Frühere READMEs listeten `GetTable`, `GetStructure` und `GetTypeInfo`. Diese gehören zum separaten [`mcp-abap-adt`](https://github.com/mario-andreschak/mcp-abap-adt)-Projekt, nicht zu diesem Server.

***

## Entwicklung

GXP22

Die Tests liegen in [`src/__tests__`](src/__tests__) und laufen vollständig offline – die JSON-RPC-Suite testet den Handler Ende-zu-Ende gegen einen simulierten SAP-Gateway-Knoten.

Gegen ein **echtes** System (dafür wird ein Kerberos-Ticket benötigt) lautet die End-to-End-Prüfung:

GXP23

Diese steuert den gebauten Server über MCP stdio genau so, wie ein Client es tun würde, und ruft nur lesende Funktionsbausteine auf.

Ein Werkzeug hinzuzufügen ist eine Änderung an genau einer Datei – siehe [`docs/MCP-Tools.md` §10](docs/MCP-Tools.md#10-extending-the-server).

## Fehlerbehebung

| Symptom | Ursache / Behebung |
|---|---|
| `HTTP 401` bei jedem Aufruf | Kerberos-Modus: kein gültiges Ticket oder das System akzeptiert SPNEGO nicht – prüfen Sie `klist` und Ihre VPN-/Domänenverbindung. Zertifikatsmodus: siehe [`docs/Authentication.md` §6](docs/Authentication.md). |
| `curl nicht gefunden` | Das SSO-Bootstrap konnte curl nicht finden – setzen Sie `SSO_CURL_PATH`. |
| `SAP rejected the client certificate` | Das `Zertrule`-Mapping, `icm/HTTPS/verify_client` oder das von `STRUST`. Der Fehler nennt den präsentierten Zertifikatsbetreff – vergleichen Sie ihn mit `CERTRULE`. |
| `unable to get local issuer certificate` | Interne Zertifizierung. Verwenden Sie `NODE_TLS_REJECT_UNAUTHORIZED=0` (nur für Entwicklung). |
| RFC-Werkzeuge liefern `reachable:false` | Sie `checkJsonRpcEndpoint` aus. Es unterscheidet einen inaktiven `/sap/gw/jsonrpc`-SICF-Knoten von einem CSRF- oder Autorisierungsproblem. |
| `-32601` von einem Funktionsbaustein | Der Funktionsbaustein existiert nicht, ist nicht RFC-fähig oder `S_RFC` verweigert den Zugriff auf seine Funktionsgruppe. |
| Client zeigt keine Werkzeuge | Prüfen Sie den absoluten Pfad zu `dist/index.js` und stellen Sie sicher, dass `npm run build` ausgeführt wurde. |

Mehr in [`docs/MCP-Tools.md` §8](docs/MCP-Tools.md#8-troubleshooting-matrix).

## Mitwirken

1. Forken Sie das Repository.
2. `git checkout -b feature/your-feature-name`
3. Machen Sie Ihre Änderung und halten Sie `npm test` und und `npx tsc --noEmit` grün.
4. `git commit -m "Add some feature"` und `git push origin feature/your-feature-name`
5. Open Sie einen Pull-Request.

## Lizenz

[MIT](LICENSE). Upstream-Projekt und ursprünglicher Autor: [mario-andreschak](https://github.com/mario-andreschak/mcp-abap-abap-adt-api).
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