{"ref":"artifact:clementringot-adam","page":"/artifacts/clementringot-adam","json":"/artifacts/clementringot-adam.json","generated":"2026-10-27","drafted_with_ai":true,"entity":{"id":"clementringot-adam","name":"ADAM","artifact_type":"mcp-server","ecosystem":"abap","serves_ecosystems":["btp"],"domain":"ai-and-agents","secondary_domains":["developer-experience"],"origin_ring":"independent","use_as":"dependency","flavors":[{"key":"standard-abap","source":{"url":"https://github.com/clementringot/adam","title":"ClementRingot/ADAM — README, Requirements","checked":"2026-10-26","quote":"- An SAP system reachable over HTTP(S) with ADT enabled: SAP NetWeaver / S/4HANA on-premise (SAP_BASIS\n  7.50 or later), or the SAP BTP ABAP Environment."}},{"key":"abap-cloud","source":{"url":"https://github.com/clementringot/adam","title":"ClementRingot/ADAM — README, Requirements","checked":"2026-10-26","quote":"- An SAP system reachable over HTTP(S) with ADT enabled: SAP NetWeaver / S/4HANA on-premise (SAP_BASIS\n  7.50 or later), or the SAP BTP ABAP Environment."}}],"description":{"one_line":"An MCP server that debugs ABAP on a connected system over ADT, as one-shot captures or an interactive session, over stdio next to the assistant or as a shared server on SAP BTP Cloud Foundry.","short":"MCP server driving SAP's ABAP debugger over ADT for an agent","what_it_solves":"An agent can read ABAP source and still not know why a value came out wrong. ADAM gives it SAP's own debugger over [the ADT resources](artifact:sap-adt): one `abap_debug` call resolves the breakpoints against the active source, arms them for the session's own SAP user, triggers the run with the object's harmless ABAP Unit tests or an OData `GET`, and records every stop of that single run with the position, the call stack, the variables it was asked for and the steps after each stop, compacted into a line trace past twenty. A breakpoint addresses a line, a method, a `MESSAGE` statement, a statement kind such as `COMMIT WORK` or an exception class, and carries a hit count and an ABAP condition SAP evaluates there, so one stop can be the 500th pass of a loop. With `interactive: true` the program stays stopped and `abap_debug_session` drives it one move per call: a step (`into`, `over` or `out`), a continue to a line, an inspection of any variable, an end that lets the program run on or aborts it where it stands. `abap_source` returns the active source numbered the way breakpoints address it and `abap_search` finds objects by name or pattern; nothing is installed on the SAP system, the capture writes nothing there, and it refuses when Eclipse, VS Code or another capture already listens for that SAP user.","when_not_to_use":"A stopped program holds an SAP work process and its caller's request, so an interactive session is the wrong shape wherever that matters: one runs per SAP user at a time, other captures for that user are refused while it is open, and a Cloud Foundry deployment stays at one instance because the next call must reach the same process. Breakpoints in report and function-group includes are not accepted, and a message breakpoint catches `MESSAGE` statements only, so RAP messages from `new_message( … )` and BAPI return tables never stop a run. On SAP_BASIS 7.50 and older the system cannot name the session's debug user, so there `SAP_USER` is used behind Basic or cookie authentication only.","to_build_on_it":"The capture logic was built and live-tested inside [arc-1](artifact:arc-mcp-arc-1) on the [SAP BTP ABAP environment](artifact:btp-abap-environment) and ported here over a minimal HTTP client, so this build's tests run the whole capture against a simulated SAP and its own live runs are still ahead of it; the BTP mode is tested with XSUAA and the Destination service simulated, and a first deployment on a real subaccount is still to come. The ADT debugger contract the server rests on was corroborated against [abap-adt-api](artifact:abap-adt-api), [vscode_abap_remote_fs](artifact:marcellourbani-vscode-abap-remote-fs) and [vibing-steampunk](artifact:oisee-vibing-steampunk), and the roadmap keeps three ideas it has not built, each with the [ADT resources](artifact:sap-adt) it would use: breakpoints in report and function-group includes, watchpoints that stop where a variable changes, and SAP's dynamic logpoints for observing a line across many runs without holding anything."},"links":{"repo":"https://github.com/ClementRingot/ADAM"},"maintainers":["actor:clementringot"],"compat":{"runtimes":["node"],"deployment":["cf","local"],"abap":{"floor":{"value":"750","sources":[{"url":"https://github.com/clementringot/adam","title":"ClementRingot/ADAM — README, Requirements","checked":"2026-10-26","quote":"- An SAP system reachable over HTTP(S) with ADT enabled: SAP NetWeaver / S/4HANA on-premise (SAP_BASIS\n  7.50 or later), or the SAP BTP ABAP Environment."}]}}},"type_properties":{"transports":{"value":["stdio","http"],"sources":[{"url":"https://github.com/clementringot/adam","title":"ClementRingot/ADAM — README, Development","checked":"2026-10-26","quote":"`src/http-server.ts`\n(Streamable HTTP with XSUAA/API-key auth), `src/server.ts` (MCP), `src/config.ts`, `src/index.ts`\n(entry point, stdio or `--http`)."}]}},"provides":[{"capability":"capability:debugging","what_it_does":"Drives SAP's own ABAP debugger from outside the system over ADT: it resolves and arms external breakpoints for the session's own SAP user, triggers the run, and at every stop of that one run records where the program stands, the call stack, the variables asked for and the steps taken after the stop, then releases the program and removes what it set. An interactive mode keeps the program waiting at a stop and takes one move per call.","sources":[{"url":"https://github.com/clementringot/adam","title":"ClementRingot/ADAM — README, one-shot mode","checked":"2026-10-26","quote":"- **One-shot** (default): in **one tool call** it arms breakpoints, runs the code, and at every stop\n  of that run records where the program stands, the call stack, the variables and as many steps as\n  the call's time and size budgets allow — then lets the program finish and removes everything it set."},{"url":"https://github.com/clementringot/adam","title":"ClementRingot/ADAM — README, interactive mode","checked":"2026-10-26","quote":"- **Interactive** (`interactive: true`): it stops at the first breakpoint and keeps the program\n  waiting there; the assistant then drives it one move per call — step in, over or out, continue,\n  inspect any variable — deciding each move from what it sees, until it ends the session."},{"url":"https://github.com/clementringot/adam","title":"ClementRingot/ADAM — README, Guarantees and limits","checked":"2026-10-26","quote":"- **Observes, never changes.** No variable writes, no jumps, no system debugging; the program's flow\n  is the one it would have taken anyway — unless an interactive session is ended with\n  `terminate: true`, which aborts the program on request. Frames of SAP system programs are skipped."}]},{"capability":"capability:agent-code-access","what_it_does":"Hands a coding agent the debugger of the connected system and the two reads around it, as the caller's own SAP user: the active source numbered the way breakpoints address it, the repository quick search, a run triggered by the object's harmless ABAP Unit tests or an OData `GET`, and what the program did at each stop of that run.","sources":[{"url":"https://github.com/clementringot/adam","title":"ClementRingot/ADAM — README","checked":"2026-10-26","quote":"An [MCP](https://modelcontextprotocol.io) server that lets an AI assistant debug ABAP code on an SAP\nsystem, in two modes:"},{"url":"https://github.com/clementringot/adam","title":"ClementRingot/ADAM — README, Guarantees and limits","checked":"2026-10-26","quote":"- **Only the session's own user.** The debug user is the one SAP itself names for the session\n  (`/sap/bc/adt/core/http/systeminformation`), never a name passed in a call."}],"facets":[{"key":"read_source","value":true,"source":{"url":"https://github.com/clementringot/adam","title":"ClementRingot/ADAM — README, abap_source","checked":"2026-10-26","quote":"The source of a class (`main`, or a local-class include: `implementations`, `testclasses`,\n`definitions`), a program or a function module, numbered exactly as `abap_debug` breakpoints address\nit."}},{"key":"search_objects","value":true,"source":{"url":"https://github.com/clementringot/adam","title":"ClementRingot/ADAM — README, abap_search","checked":"2026-10-26","quote":"The repository quick search: exact name, type, package and description for a name or pattern\n(`ZCL_ORDER*`, `*TRAVEL*`), optionally of one `objectType`."}},{"key":"run_code","value":true,"source":{"url":"https://github.com/clementringot/adam","title":"ClementRingot/ADAM — README, How a capture works","checked":"2026-10-26","quote":"3. **Run.** The trigger runs the code: the object's harmless ABAP Unit tests, an OData `GET`, or\n   nothing (`trigger: \"none\"`) while you run it yourself — a Fiori app, a report — as the same SAP user."}},{"key":"unit_tests","value":true,"source":{"url":"https://github.com/clementringot/adam","title":"ClementRingot/ADAM — README, Guarantees and limits","checked":"2026-10-26","quote":"- **Harmless triggers.** ABAP Unit runs harmless tests only; the HTTP trigger only `GET`s an OData\n  path on the connected system."}}]}],"requires":[{"ref":"artifact:sap-adt","requirement":"required","basis":"binding","role":"system-interface","for":"the ADT resources the server calls on the connected system: it needs a system reachable over HTTP(S) with ADT enabled, and a user with ADT access and debug authorization","sources":[{"url":"https://github.com/clementringot/adam","title":"ClementRingot/ADAM — README, Requirements","checked":"2026-10-26","quote":"- An SAP system reachable over HTTP(S) with ADT enabled: SAP NetWeaver / S/4HANA on-premise (SAP_BASIS\n  7.50 or later), or the SAP BTP ABAP Environment."},{"url":"https://github.com/clementringot/adam","title":"ClementRingot/ADAM — README, Requirements","checked":"2026-10-26","quote":"- An SAP user with ADT access (`S_ADT_RES`) and debug authorization (`S_DEVELOP` with\n  `OBJTYPE = DEBUG`, `ACTVT = 03`)."}]},{"ref":"artifact:btp-abap-environment","requirement":"conditional","condition":"the SAP system debugged is the SAP BTP ABAP environment, reached with a service key instead of a URL and credentials","basis":"binding","role":"target-system","for":"the ABAP instance whose service key the server logs on with, opening the browser for the SAP login on the first call","sources":[{"url":"https://github.com/clementringot/adam","title":"ClementRingot/ADAM — README, Installation","checked":"2026-10-26","quote":"**SAP BTP ABAP Environment.** Create a service key for the ABAP instance in the BTP cockpit, save it\nas a file, and set `SAP_BTP_SERVICE_KEY_FILE` instead of URL and credentials. On the first call the\nserver opens your browser for the SAP login (the flow Eclipse ADT uses); the token is then refreshed\nautomatically."}]},{"ref":"artifact:arc-mcp-xsuaa-auth","requirement":"conditional","condition":"the server runs in HTTP mode on SAP BTP Cloud Foundry","basis":"binding","role":"authentication","for":"the authentication stack in front of the `/mcp` route and the destination lookups behind it","sources":[{"url":"https://raw.githubusercontent.com/ClementRingot/ADAM/main/docs/btp-deployment.md","title":"ADAM — docs/btp-deployment.md","checked":"2026-10-26","quote":"The authentication stack and the destination lookups come from\n[`@arc-mcp/xsuaa-auth`](https://www.npmjs.com/package/@arc-mcp/xsuaa-auth), extracted from ARC-1's\nproduction deployment."}]},{"ref":"artifact:btp-authorization-and-trust-management","requirement":"conditional","condition":"the server is deployed as a shared server on SAP BTP Cloud Foundry","basis":"binding","role":"authentication","for":"the sign-in of the MCP clients, with dynamic client registration and the `debug` scope every tool call needs; the MTA creates the instance from `xs-security.json`","sources":[{"url":"https://raw.githubusercontent.com/ClementRingot/ADAM/main/docs/btp-deployment.md","title":"ADAM — docs/btp-deployment.md","checked":"2026-10-26","quote":"The server runs on SAP BTP the way [ARC-1](https://github.com/arc-mcp/arc-1) does: an MTA with XSUAA\nfor the MCP clients' sign-in, the Destination service for the SAP system, and the Connectivity service\nfor an on-premise system behind the Cloud Connector."},{"url":"https://raw.githubusercontent.com/ClementRingot/ADAM/main/docs/btp-deployment.md","title":"ADAM — docs/btp-deployment.md, Give users the role","checked":"2026-10-26","quote":"The role collection carries the scope `debug`, which every tool call needs."}]},{"ref":"artifact:btp-destination","requirement":"conditional","condition":"the server is deployed as a shared server on SAP BTP Cloud Foundry","basis":"binding","role":"per-user-connection","for":"the destination that names the SAP system and how each user logs on to it: `PrincipalPropagation` for an on-premise system or `OAuth2UserTokenExchange` for the BTP ABAP environment","sources":[{"url":"https://github.com/clementringot/adam","title":"ClementRingot/ADAM — README, Configuration","checked":"2026-10-26","quote":"BTP destination of the SAP system: `PrincipalPropagation` (on-premise, Cloud Connector) or `OAuth2UserTokenExchange` (BTP ABAP Environment) — each user as themselves"},{"url":"https://raw.githubusercontent.com/ClementRingot/ADAM/main/docs/btp-deployment.md","title":"ADAM — docs/btp-deployment.md","checked":"2026-10-26","quote":"The server runs on SAP BTP the way [ARC-1](https://github.com/arc-mcp/arc-1) does: an MTA with XSUAA\nfor the MCP clients' sign-in, the Destination service for the SAP system, and the Connectivity service\nfor an on-premise system behind the Cloud Connector."}]},{"ref":"artifact:btp-connectivity","requirement":"conditional","condition":"the deployed server reaches an on-premise SAP system behind the Cloud Connector","basis":"binding","role":"connectivity-proxy","for":"the forward proxy the ADT calls leave through on their way into the customer's network","sources":[{"url":"https://raw.githubusercontent.com/ClementRingot/ADAM/main/mta.yaml","title":"ADAM — mta.yaml","checked":"2026-10-26","quote":"the Connectivity service reaches an on-premise system through the Cloud Connector"},{"url":"https://raw.githubusercontent.com/ClementRingot/ADAM/main/docs/btp-deployment.md","title":"ADAM — docs/btp-deployment.md, Before you start","checked":"2026-10-26","quote":"A Cloud Foundry space with entitlements for XSUAA (`application`), Destination (`lite`) and Connectivity (`lite`)"}]},{"ref":"artifact:sap-cloud-connector","requirement":"conditional","condition":"the deployed server reaches an on-premise SAP system","basis":"binding","role":"tunnel","for":"the tunnel into the customer's network and the certificate mapping that turns the propagated user into an SAP logon name; its access control has to expose `/sap/bc/adt` with all sub-paths","sources":[{"url":"https://raw.githubusercontent.com/ClementRingot/ADAM/main/docs/btp-deployment.md","title":"ADAM — docs/btp-deployment.md, Before you start","checked":"2026-10-26","quote":"On-premise: the Cloud Connector connected to the subaccount, with principal propagation configured (system certificate, CA, subject pattern) and a mapping to the SAP system exposing `/sap/bc/adt` with all sub-paths"}]},{"ref":"artifact:btp-cloud-foundry-runtime","requirement":"conditional","condition":"the server is deployed as a shared server on SAP BTP instead of run locally over stdio","basis":"binding","role":"runtime-platform","for":"the runtime the MTA is deployed to, at one instance because an interactive session holds the program and its debugger session in the process","sources":[{"url":"https://github.com/clementringot/adam","title":"ClementRingot/ADAM — README, Installation","checked":"2026-10-26","quote":"**As a shared server on SAP BTP.** Deploy the MTA to Cloud Foundry (`mbt build`, `cf deploy`), point it\nat a principal-propagation destination, assign the role collection, and connect the clients to\n`https://<route>/mcp` — they sign in through XSUAA in the browser, and each user debugs as their own\nSAP user."},{"url":"https://raw.githubusercontent.com/ClementRingot/ADAM/main/docs/btp-deployment.md","title":"ADAM — docs/btp-deployment.md, Configure and deploy","checked":"2026-10-26","quote":"The deployment creates the XSUAA, Destination and Connectivity instances, binds them, and starts **one**\ninstance (256 MB). Keep it at one: an interactive session holds the program and its debugger session in\nthe process, and the next call must reach the same process."}]}],"connects":[{"ref":"external:abap-platform","kind":"data","protocols":["http"],"direction":"outbound","for":"arms the external breakpoints, starts the debugger listener, attaches from the application server the program stopped on and reads the position, call stack and variables, all through the ADT REST API that Eclipse ADT uses","sources":[{"url":"https://github.com/clementringot/adam","title":"ClementRingot/ADAM — README","checked":"2026-10-26","quote":"It talks to SAP through the ABAP Development Tools (ADT) REST API — the same resources Eclipse ADT\nuses — so nothing has to be installed on the SAP system."},{"url":"https://github.com/clementringot/adam","title":"ClementRingot/ADAM — README, How a capture works","checked":"2026-10-26","quote":"2. **Arm.** External breakpoints are set for the session's own SAP user, and SAP's debugger listener\n   starts (a long poll)."}]},{"ref":"artifact:btp-destination","kind":"authentication","direction":"outbound","condition":"the server is deployed as a shared server on SAP BTP Cloud Foundry","for":"exchanges the signed-in MCP user's token at the Destination service for the per-user credentials the ADT calls then carry, so the debugger reaches SAP as that person's own SAP user","sources":[{"url":"https://raw.githubusercontent.com/ClementRingot/ADAM/main/docs/btp-deployment.md","title":"ADAM — docs/btp-deployment.md, the call path","checked":"2026-10-26","quote":"user token → Destination service (PrincipalPropagation)"},{"url":"https://raw.githubusercontent.com/ClementRingot/ADAM/main/docs/btp-deployment.md","title":"ADAM — docs/btp-deployment.md, Create the destination","checked":"2026-10-26","quote":"The server checks the destination at its first call: an identity per user, an `http://` URL behind the\nConnectivity proxy."}]}],"provenance":{"discovered_via":[{"source":"source:github"}],"first_seen":"2026-10-26"},"drafted_with_ai":true},"effective_normative_relations":[],"readings":{"liveness":[{"label":"Maintenance","tier":"unknown","evidence":"no release data"},{"label":"Continuity","tier":"fair","evidence":"2 contributors"},{"label":"Repository","tier":"good","evidence":"pushed 2026-10, not archived"}],"compatibility":[{"label":"Declared for","tier":"good","evidence":"SAP_BASIS 750 and up, stated: includes every maintained line to 816"},{"label":"Survived majors","tier":"unknown","evidence":"not read on ABAP: its lines run side by side"},{"label":"Maintainer's CI","tier":"good","evidence":"CI green, 2026-10-27"}],"practice":[{"label":"Tests","tier":"good","evidence":"18 test files"},{"label":"Docs","tier":"good","evidence":"docs/ with 6 pages, README 11 KB"},{"label":"Changelog","tier":"fair","evidence":"none in the repo"}],"reach":[{"value":null,"unit":"installs/week"},{"value":0,"unit":"watching"}]},"signals":{"crawled_at":"2026-10-27","npm":"not published under this name","stars":0,"forks":0,"open_issues":0,"archived":false,"pushed_at":"2026-10-27","license_spdx":null,"org_owned":false,"default_branch":"main","created_at":"2026-10-26T10:08:20Z","open_prs":0,"tree_truncated":false,"test_files":18,"workflows":1,"other_ci":false,"readme_bytes":11466,"docs_files":6,"changelog":false,"license_file":true,"dts_files":0,"first_commit":"2026-10-26","last_commit":"2026-10-27","commits":21,"contributors":2,"ci_status":"success","ci_run_at":"2026-10-27","ci_workflow":"CI","ci_event":"push","readme_path":"README.md","readme_sha":"412bbdec377fed63d214b4ad0947370825224eec","repo_read":"2026-10-27"},"edges":{"maintainers":[{"ref":"actor:clementringot","name":"Clément Ringot","json":"/actors/clementringot.json"}],"contributors":[],"explained_by":[],"alternative_to_this":[],"needed_by":[],"available_via":[],"parts":[],"add_ons":[],"answered_through_parts":[]}}