sap-abap-mcp
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-apivon 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 |
Arbeiten an diesem Repository: Aufbau, Konventionen, Testen. Vor Änderungen am Code lesen Sie dieses Dokument. | |
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. | |
Alle 128 Tools mit ihren Argumenten, gruppiert nach Familien. Aus den Tool-Definitionen generiert, es kann also nie vom Code abweichen. | |
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. | |
Die 20 SAP/ABAP-Skills und wie sie auf diese Tools abgebildet sind. | |
Die 35 im Paket enthaltenen allgemeinen Engineering-Skills. | |
Design- und Protokollieren von Noten für die JSON-RPC-/RFC-Tools, gelesen aus dem ABAP-Quellcode von | |
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 lesen —
readAbapObjectlöst einen Namen in einem Aufruf in den zugehörigen Quellcode auf; keine ADT-URL zum Entdecken oder von-Hand-Zusammenbauen.Eine Tabelle beschreiben —
describeAbapTableliefert Informationen,DDIC-Typen, Schlüsselflags und Check-Tabellen.Objektverwaltung — ABAP-Objekte suchen, lesen, anlegen, ändern, löschen und aktivieren.
Nam Naturen-Konventionen erfassen —
searchPackagesfindet 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 aufrufen —
callFunctionViaJsonRpcfü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) —
callFunctionsViaJsonRpcsendet mehrere Funktionsbausteine in einer einzigen Anfrage;. Dadurch können ein Update-BAPI und seinBAPI_TRANSACTION_COMMITeiner LUW gemeinsam nutzen.Datenzugriff —
tableContentsund Ad-hoc-runQuery-SELECTs.Das laufende System ansehen —
listLoggedOnUsersbeantwortet "wer ist angemeldet" aus der Sicht auf die Daten der TabelleTH_USER_LISThinterSM04;readProfileParametersLese RZ11-Werte in einem order RTT; undcheckLogonConfigurationLogon 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 viareadSkill.Self-Documentieren — die folgenden Anleitungen werden vom Server selbst als MCP-Ressourcen (
abap-adt://-Leitfäden/…) und auch dem ToolreadServerGuide/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/adtmuss inSICFaktiv sein. Für die RFC-Tools muss zusätzlich/sap/gw/jsonrpcaktiv sein (SAP_GWFND), und dein Benutzer benötigtS_RFCfü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 ruftC:\Windows\System32/curl.exe --negotiateB auf, und das benötigt curl‑mit Schannel/SSPI-Backend. Auf anderen Plattformen setzen SieSSO_CURL_PATHauf 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 (
setupinicm/server_port_<n>, dasicm/HTTPS/verify_clientüberschreibt), die ausstellende von [zu verwendenden Zertifizierungsstelle] inSTRUSTals vertrauenswürdig eingetragen sein, and a mapping entry ("Einstellung") redirect to user. Full setup including including check. See the Schauen Sie indocs/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
SOAUTH2veröffentlicht. EIn BTP-Service-Schlüssel ist bereits ein solcher Schlüssel. Siehe §11.
Node.js (LTS) und npm — überprüfen mit
node -vundnpm -v.
Installation
git clone --recurse-submodules https://github.com/Ciltress/sap-abap-mcp.git
cd sap-abap-mcp
npm install
npm run build
--recurse-submodulesist wichtig: Die allgemeinen Engineering-Skills liegen in einem Submodule, and without it Verzeichnis leer and the server 500 skills less. Already geklont? Ausführengit submodule update --init --recursive.
Das npm-Paket
npx mcp-abap-abap-adt-apiist 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=ENSAP_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 |
| System-ID, wie in |
| Zertifikat aus einer internen/unbekannten CA zu akzeptieren. Nur für die Entwicklung. |
| Pfad zu einem curl-Binary mit SPNEGO-Unterstützung, falls das Windows-Systembinary nicht verwendet wird. |
| JSON-ICF-Pfad überschreiben, wenn der Knoten unter einem Aliasnamen veröffentlicht wurde. |
| Welche Tools dieser Server listet — und damit auch beantwortet. Siehe unten. |
| Obergrenze für eine den Corps ist deren, alle in Bytes. |
|
|
| Starten auch dann, wenn SAP diesem Benutzer den ADT-Knoten verweigert, und die RFC-Tools bleiben enthalten. Siehe docs/Authentication.md. |
| 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 |
| Kosten pro Turn | Zweck |
| 9 | ~2.737 Tokens | System lesen und eine Änderung abschließen |
| 18 | ~3.982 Tokens | Nur lesen: Wörterbuch, Tabellendaten, RFC-Aufrufe |
| 10 | ~2.900 Tokens | Ein Benutzer mit RFC-Rechten, aber ohne |
| 49 | ~8.034 Tokens | Der Änderungszyklus plus Tests, ATC, Transporte, Refactoring |
| 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 ersetzt —
status:"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 |
|
|
| Der private Schlüssel, wenn er nicht in |
| 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 dieSNC0-ACL spielt keine Rolle, und der ICM benötigticm/HTTPS/verify_client.docs/Authentication.mdbehandelt die Unterschiede, diesapgenpse 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 |
|
|
| Anzufragende Scopes. Ohne Angabe werden die Standard-Scopes des Clients angefragt, was meist richtig ist. |
| Für den |
| Ein anderswo erzeugtes Token, das unverändert verwendet wird. Nichts kann es erneuern. |
|
|
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
SU01ist: Ein falschesSAP_OAUTH_CLIENT_SECRETzählt gegenlogin/fails_to_user_lockwie 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_lockund 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-mcpKerberos-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-mcpOAuth-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-mcpPasswortmodus — letzte Option!
docker run -i --rm --env-file .env \
-e SAP_USER=YourUser \
-e SAP_PASSWORD=YourPassword \
abap-adt-mcpDrei 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_LOCALLYfehl. Mounten Sie die Root-CA und weisen SieSAP_CA_FILEdarauf. Eine Desktop-.envkomplett zu übernehmen, versteckt das stattdessen:NODE_TLS_REJECT_UNAUTHORIZED=0ist eine Entwicklungseinstellung und hat in einem deployed Image nichts zu suchen.Aus einem
--recurse-submodules-Clone bauen.skills/Developmentist 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 klistdocs/, 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` flagEin 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 |
|
Wie eine Tabelle, Struktur oder Sicht aussieht |
|
Alles, was hinter einer Namenskonvention steckt |
|
{"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
searchObject→objectStructure→getObjectSourcenur 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 einerWHERE-Klausel ein; verwenden SieSELECT SINGLE(alle Schlüsselfelder bekannt) oder sonstUP 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 andGetTypeInfonicht. Diese gehören zu dem separatenmcp-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 onlyDie 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 CAEr 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 |
| Kerberos-Modus: kein gültiges Ticket, oder das System akzeptiert SPNEGO nicht – |
| Das SSO-Bootstrap konnte sein können – stellen Sie |
| Das |
| Interne CA. Setzen Sie |
RFC-Werkzeuge liefern | Führen Sie eine |
| Er existiert nicht, ist nicht RFC-fähig, oder |
Client zeigt keine Werkzeuge | Stars-Absoluten Pfad zu |
Mehr dazu in docs/MCP-Tools.md §8.
Beitragen
Business Forken Sie das Repository.
git checkout -b feature/your-feature-nameMachen Sie Ihre Änderung und halten Sie
npm test/npx tsc --noEmitgrün.git commit -m "Add some feature"undgit push origin my-featureÖ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).This server cannot be installed
Maintenance
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
- AlicenseCqualityNot gradedmaintenanceAn 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
- AlicenseCqualityDmaintenanceAn 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.100MIT
- AlicenseNot gradedqualityBmaintenanceA 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
- AlicenseBqualityCmaintenanceMCP 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.1001,664MIT
Related MCP Connectors
2,000+ MCP servers read at source level. Know what one does before you connect. Free, no key.
A MCP server built for developers enabling Git based project management with project and personal…
MCP Server for JFrog, providing tools for development and artifact management.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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