Sap Adt MCP server
Give Claude live access to SAP ABAP via ADT: read, search, check, test, and edit objects.
16 stars54 downloads/wk
Reviews
Write oneNobody has reviewed Sap Adt yet.
If you have run it, two minutes of your experience saves the next person an afternoon.
Sap Adt tools (58, 12 write)
write = sends, deletes, buys or postsRead from the package source without running it. The installed server may list more.
adt_activateActivate one or more ABAP objects. In multi-developer scenarios where the object's components are locked in a separate task under the same transport, set processRedoneOOSourceVersionOnly=true to ask SAP to re-activate only the redone OO source versions (bypasses the 'Object components locked in request and separate task' 403).
adt_browse_packageList the immediate contents (one level) of an ABAP package. Use adt_list_packages for recursive walks.
adt_cds_data_previewPreview the data exposed by a CDS view (DDL source) via the ADT CDS Data Preview endpoint. Read-only. Returns structured { columns, rows } just like adt_read_table, but you only pass the CDS entity / DDL source name — no SQL. Requires a system with CDS support (NetWeaver 7.5x+ / S/4HANA).
adt_cds_dependenciesReturn the dependency graph of a CDS view — the entities it consumes (and, where the system exposes it, related objects). Uses the ADT DDL dependency graphdata endpoint. Returns the parsed object references plus the raw graph payload. Requires CDS support.
adt_check_note_statusReport the implementation status of a SAP Note in the system (e.g. can be implemented / obsolete / fully implemented / partially implemented). EXPERIMENTAL — see adt_get_note for availability constraints.
adt_close_panelStop the local control panel started by adt_open_panel. (It also stops on its own when this MCP session ends.)
adt_compare_sourceCompare the source of the same object across two systems. Returns a unified-diff plus added/removed line counts.
adt_compare_versionsDiff two versions of the SAME object's source within one system. Defaults to active-vs-inactive (the daily 'what did I change but not yet activate' question). Pass from/to to compare specific version identifiers understood by the ADT ?version= query (e.g. 'active', 'inactive', or a numeric version number where supported). Returns a unified diff plus added/removed line counts, reusing the same diff
adt_create_objectwrite actionCreate a new ABAP object in a package. Supported types: program, class, interface, include, functiongroup, function, cds, accesscontrol, metadataext, behaviordef, messageclass. Refused under read-only mode.
adt_create_transportwrite actionCreate a new transport request. Returns the new TR number. Subject to read-only mode. Note: on some systems TR *creation* routes through a SAP GUI dialog and fails headless with a 500 (SAPLSTRD/SAPLSPO4 'No window system type'). Assigning changes to an EXISTING request works headless — pass that TR id as `transport` to adt_lock / adt_set_source instead.
adt_debug_delete_breakpointwrite actionDelete an external debugger breakpoint by its id (from adt_debug_set_breakpoint).
adt_debug_delete_watchpointwrite actionDelete a watchpoint by id (from adt_debug_set_watchpoint). Phase 3, WRITE — refused under read-only mode. Best-effort until validated live.
adt_debug_goto_stackMove the active stack frame of the attached debuggee (Phase 2). Pass either `stackUri` (a /sap/bc/adt/debugger/stack/type/<t>/position/<n> URI from adt_debug_stack) or a 0-based `position`. WRITE — refused under read-only mode.
adt_debug_listenWait (bounded long-poll) for a debuggee to hit a breakpoint set with adt_debug_set_breakpoint. Returns { caught: true, … } with a summary (and auto-attaches) when a session is trapped, or { caught: false } if none arrived within the timeout — in which case call it again. One listener per process; set breakpoints first.
adt_debug_set_breakpointSet an external ABAP debugger breakpoint at a line of an object. Pair with adt_debug_listen to catch a session that reaches it. Returns the breakpoint id (needed to delete it). Give either `uri` (a full ADT source URI) or `object`+`type` (+`include` for classes) with `line`.
adt_debug_set_variableSet a variable's value in the attached debuggee (Phase 3). WRITE — refused under read-only mode. Changes live session state; use with care on shared/production-adjacent systems.
adt_debug_set_watchpointSet a debugger watchpoint that breaks when a variable changes (or a condition holds). Phase 3, WRITE — refused under read-only mode. NOTE: the watchpoint request/response contract has no reference implementation and is best-effort until validated on a live system; check `raw`.
adt_debug_stackReturn the call stack of the currently attached debuggee (after adt_debug_listen caught one).
adt_debug_stepAdvance the attached debuggee (Phase 2, flow control). `kind`: into (step into), over (step over), return (step out), continue (resume until the next breakpoint), runToLine / jumpToLine (need `uri`), terminate (stop the debuggee). WRITE — refused under read-only mode. Returns the new state (position, reached breakpoints) plus raw XML. A `continue` that lets the run finish answers `status: "debugge
adt_debug_stopEnd the debug session: release the attached debuggee (stepContinue), then delete this process's listener and every breakpoint it set. Call when finished (or to reset after an error) so no dangling breakpoints/listeners are left on the system and no suspended request is left hanging.
adt_debug_variablesRead variable values from the currently attached debuggee. Pass `names` (variable names/ids in scope, e.g. ['sy-subrc','lv_total']); omit to read the top-level scope roots.
adt_delete_objectwrite actionDelete an ABAP object. Acquires a lock and issues DELETE. Refused under read-only mode.
adt_get_dumpFetch the full detail of one ABAP short dump by id. Performs two requests: a metadata XML lookup (runtime error, program, links to dump text) followed by a fetch of the formatted dump text from the link returned by SAP. Returns the metadata plus a chapter map (shortText, whatHappened, errorAnalysis, howToCorrect, whereTerminated, sourceCodeExtract, …). Pass chapters: ['key', …] to limit the respon
adt_get_noteFetch SAP Note metadata (title, component, version, type, implementation prerequisites) via the Note Assistant ADT API. EXPERIMENTAL — only available on systems shipping the SNOTE ADT plug-in (modern S/4HANA). On systems without it the response carries available:false and a hint to use GUI SNOTE.
adt_get_sourceFetch the ABAP source of an object (program, class, interface, function module, include, CDS, table). Returns plain text. DDIC primitives without plain-text source (data element, domain, message class) return their ADT XML metadata instead (format: 'xml'). For sources larger than the MCP per-call output cap (~64 KB), use firstLine/lastLine to paginate or onlyMethod to slice a single method body —
adt_get_transportFetch detail of a single transport request (header + included objects).
adt_grep_sourceFull-text regex search across ABAP source. Complements adt_search_objects (which only matches names). Scope the search to a package (optionally recursive), a transport request, or an explicit object list. Fetches /source/main for each source-bearing object (programs, classes, interfaces, includes, CDS/DDLS, DCLS, DDLX, behavior definitions) and returns matching lines as object + line + text. DDIC
adt_implement_noteImplement (download + apply) a SAP Note via the Note Assistant ADT API. WRITE operation — subject to read-only mode and requires a transport. EXPERIMENTAL and potentially disruptive: implementing a note changes system objects. Only available on systems shipping the SNOTE ADT plug-in. Prefer GUI SNOTE for anything non-trivial.
adt_list_dumpsList ABAP short dumps (ST22) from the runtime-dumps Atom feed. Each entry exposes id, runtime error name, terminated program, timestamp, user, and any release-specific rba:*/dump:* fields surfaced by the system. The server-side row cap is unreliable across releases (some ignore it) — adt_list_dumps trims to maxResults on the client too. Use adt_get_dump with an id for the full dump text.
adt_list_inactive_objectsList the inactive objects worklist for the connected user (the ADT 'Inactive Objects' view — what has been edited but not yet activated). Returns each object with its type and, where available, the transport it sits in. An empty list means everything is activated.
adt_list_locksList runtime enqueue locks (the SM12 analog). NOTE: most ABAP systems do NOT expose SM12 runtime enqueues over ADT REST — in that case the response carries available:false and a hint to use SM12. This is distinct from the editing lock acquired by adt_lock (a single object) and from DDIC lock-object definitions.
adt_list_packagesRecursively walk subpackages from a root package. Returns a flattened map of package → contents (counts and entries grouped by type).
adt_list_released_apisList the API release-state contracts the system defines — the catalog used to classify released objects (e.g. USE_IN_KEY_USER_APPS = C1, ADD_CUSTOM_FIELDS = C0), each with its compatibility-contract description. This is the released-API classification catalog, not a per-object enumeration (object-level released-API listing requires the release-dependent RIS search facet). Backed by repository/info
adt_list_systemsList configured SAP systems available for ADT calls, the default system, and read-only flags.
adt_list_transportsList transport requests visible to the configured user. Filter by user (requestor) and / or status (modifiable / released). Endpoint shape may vary across NetWeaver releases — falls back to adt_request if your system uses a different path.
adt_list_versionsList the version history of an object via the ADT versions sub-resource ({objectUri}/versions). NOTE: many on-prem NetWeaver releases do not expose a version-history REST endpoint and return 404 — in that case use adt_compare_versions to diff active vs inactive instead. The response carries available:false with a hint when the endpoint is absent.
adt_lockAcquire a stateful lock on an ABAP object. Returns a lockHandle to reuse across multiple adt_set_source calls. On CTS conflicts the error includes longText and t100 details (which TR is blocking, who owns it) so the caller can recover.
adt_open_panelOpen the local, read-only SAP control panel: an HTML page with buttons for the read-only tools (search, grep source, get source, read table, ATC, where-used, packages, transports, dumps, inactive objects). Returns the URL to open. The panel is served from inside THIS MCP process, so it works only while this session keeps the MCP connected and dies when the session ends. Bound to 127.0.0.1, gated b
adt_pingPing a configured SAP system by calling the ADT discovery endpoint. Use to verify credentials and network reachability.
adt_pretty_printwrite actionRun the ABAP pretty printer on supplied source code (stateless — no object lookup, no lock).
adt_rap_scaffoldGenerate a complete RAP stack from a short spec: CDS root view entity → behavior definition (managed) → behavior implementation class → service definition → service binding. DEFAULTS TO dryRun:true — returns the planned object names and generated source for review WITHOUT creating anything. Set dryRun:false to actually create them in dependency order (subject to read-only mode; requires a transpor
adt_read_spoolRead the output (spool list) of a background job / spool request (SP01 analog). EXPERIMENTAL — see adt_schedule_job for availability constraints; returns available:false on systems without an ADT spool service.
adt_read_tablewrite actionExecute an OpenSQL SELECT against the SAP database via the ADT Data Preview endpoint. Read-only by design (SELECT only — INSERT/UPDATE/DELETE rejected client- and server-side). Returns structured { columns, rows }. Use ABAP OpenSQL syntax: 'SELECT matnr matkl FROM mara WHERE matnr LIKE \'M%\''. Row count capped at maxRows (default 100, hard cap 5000). Requires NetWeaver 7.55+ or S/4HANA — older sy
adt_release_transportRelease a transport request. Subject to read-only mode.
adt_report_issueFile a bug or enhancement about a sap-adt-mcp TOOL back to the maintainer. The report is redacted (hosts, users, passwords, IPs, emails stripped), de-duplicated, and becomes a GitHub issue. Use this for defects the automatic crash reporter cannot see: wrong data in an otherwise-successful response, a parameter that is silently ignored, or a missing capability. Do NOT use it for problems in the use
adt_requestGeneric ADT REST call — escape hatch for endpoints not covered by a high-level tool. Handles Basic auth, sap-client, cookies, CSRF token automatically. Path is confined to the /sap/bc/adt/ namespace.
adt_run_atcwrite actionRun ABAP Test Cockpit (ATC) on one or more objects. ATC endpoint shape varies across NetWeaver releases.
adt_run_atc_packagewrite actionRun ABAP Test Cockpit (ATC) over an ENTIRE package via the full ADT worklist flow (create worklist → run → fetch results). Returns parsed findings (check, message, priority, location) plus a priority histogram and the worklist id. When checkVariant is omitted, the system default check variant from ATC customizing is used. This is the bulk counterpart to adt_run_atc (single object).
adt_run_atc_transportwrite actionRun ABAP Test Cockpit (ATC) over every object in a transport request via the full ADT worklist flow. Resolves the transport's object references, runs ATC against them, and returns parsed findings + priority histogram + worklist id. When checkVariant is omitted, the system default check variant is used.
adt_run_unit_testswrite actionRun ABAP Unit tests for one or more objects (typically test container classes).
adt_schedule_jobSchedule an ABAP background job (SM36 analog) that runs a report with a variant. WRITE operation — subject to read-only mode. EXPERIMENTAL: no standardized ADT job-scheduling API exists on classic NetWeaver; on systems without an extension service the response carries available:false. Prefer SM36 for anything important.
adt_search_objectsQuick-search the ABAP repository for objects whose name matches a pattern. Use '*' as wildcard.
adt_set_sourceReplace the ABAP source of an object. The new source is the FULL text of the include — it ATOMICALLY REPLACES the entire include on the server. Passing a partial chunk or diff will delete the rest of the include. Supply the source inline via `source`, OR — for a large object that would blow the per-call I/O cap — via `sourceFile` (a local path the MCP process reads itself). Orchestrates lock → PUT
adt_set_source_chunkedReplace ABAP source incrementally for files larger than the MCP per-call I/O cap. Caller acquires a lock with adt_lock, then sends the source in N chunks (chunkIndex 0..N-1) under a stable bufferId, and finally commits with commit=true to trigger the actual PUT. The chunks accumulate in server-side memory (10-minute TTL, 4 MB total cap per buffer). Same partial-source guard as adt_set_source appli
adt_syntax_checkwrite actionRun an ADT syntax check on an object. Returns the raw <chkrun:reports> XML. Includes only compile in the context of a main program: for type=include, pass `context` (the main program / function group), otherwise the check returns status='notProcessed'. When omitted for an include, the tool tries to auto-resolve the include's first main program.
adt_transport_diffDiff every object listed in a transport between two systems. Capped at maxObjects (default 50).
adt_unlockRelease a stateful lock previously acquired with adt_lock.
adt_where_usedWhere-used list for an object. Returns the references that point to it. Widely-used objects can have thousands of references, so the list is capped at `maxResults` (default 200) — `numberOfResults` always reports the backend's full count and `truncated` says whether the list was cut.
Public scan report
scanner v0.1.9 · 2026-09-24 · same rubric, same numbers if you re-run it
- Code scan40 source files scanned13/25
- –Live reliabilityno gateway calls yet and no remote to proben/a
- –Tool poisoningtools not inspected (local package is not executed); not countedn/a
- Auth qualitylocal package, no credentials required12/15
- Maintenancelast push 2 days ago15/15
- Maintainer identityregistry namespace matches repository owner; GitHub account older than a year8/10
Findings (1)
- highShell command built from a string (injection risk)
exec.shell-concatsrc/tools/panel.js: … Promise((resolve) => { try { exec(`${cmd} "${url}"`, (err) => resolve(!err)); } c…
What the publisher says
From the Sap Adt repository's README, as published. We do not edit it. Read it on GitHub
sap-adt-mcp
MCP server giving Claude (and any MCP-compatible client) live access to SAP systems via ADT.
Read source, search the repository, run syntax checks, run unit tests, run
ATC, diff the same object across landscapes, edit and activate ABAP — all
from a chat window or an autonomous agent. No add-on installation on the SAP
stack required.
Why
SAP development is full of repetitive read-the-source / check-the-callers / diff-the-system work. AI assistants are great at exactly that kind of task — but only if they can reach the system. ADT (ABAP Development Tools) is the HTTP API that Eclipse uses; it ships with every modern NetWeaver and S/4 system. This server speaks ADT on behalf of the agent so the agent can do real work against your real systems, with the same auth and scoping you'd give a developer in Eclipse.
What's in the box
27 high-level tools wrapped around the most common ADT endpoints, plus a generic escape hatch for anything else, plus 5 user-invokable Clean Core prompts that turn the tool surface into outcome-shaped slash commands (see Clean Core prompts below).
¹ Experimental tools target ADT endpoints (SNOTE, SM12 enqueues, SM36/SP01) that classic NetWeaver does not expose; on such systems they return available:false with a fall-back hint rather than failing. They work where the backing service exists (typically S/4HANA).
Multi-system aware. One config, many SAP systems (DEV / QAS / PRD or landscape-wide); switch with the system argument or compare across two with adtcomparesource / adttransportdiff.
Safe by default. A readOnly flag (global or per-system) blocks every write method. Read-only POST queries (search, where-used, package tree) remain allowed so agents can still discover.
Robust. Per-request timeout. CSRF token negotiation with auto-retry on
- Self-signed cert opt-out. Optional debug tracing to stderr.
Structured errors. ADT's envelopes are parsed into { type, message, namespace } so failed calls don't dump XML into the agent's context window.
Install
Shortened. The full README is on GitHub.
Nothing above is checked by us. What we check is on the safety report.
Install directly
Runs npx -y sap-adt-mcp on your machine. Read the scan report first; the gateway never runs local packages.
claude mcp add sap-adt-mcp -- npx -y sap-adt-mcp
Sap Adt: common questions
- Is Sap Adt MCP server safe?
- Mostly: it is graded B (74/100). Read the Sap Adt safety report
- How do I install Sap Adt?
- It runs on your machine. Copy the Claude Code, Claude Desktop or Cursor config from the install section.
- Does Sap Adt need an API key?
- No secret keys are declared. It reads 1 setting from the environment.
- Is Sap Adt maintained?
- The last commit was 2 days ago (2026-09-22). The latest release is v0.8.57.
- What can I use instead of Sap Adt?
- Servers from other publishers that do the same job: Domain Search MCP server, Cronus UI MCP server and Smithsonian MCP server. Compare all Sap Adt alternatives.
Alternatives to Sap Adt
Same job from other publishers: the closest match first, then the best rated.
- Domain SearchNaming engine with availability intelligence: score names, check domains, socials and registries.not reviewedGrowingB
- Cronus UISearch, install, compose, add-page, and theme Cronus UI from the live registry.not reviewedGrowingA
- SmithsonianSearch 14.5M Smithsonian Open Access objects, get CC0 images, find cross-collection connections.not reviewedGrowingA
- Paperless-ngxFull Paperless-ngx API for AI assistants: search, tag, edit and upload documents, workflows and morenot reviewedGrowingB