sap-abap-mcp
A local Model Context Protocol (MCP) server enabling AI agents (e.g., Codex, Claude) to interact with SAP ABAP systems via ADT HTTP services — no VS Code, SAP GUI, or virtual workspace required.
Connect & Explore
List configured SAP connection profiles and credential status
Retrieve system info (client, release, timezone, software components)
Query per-connection capability evidence and export ADT discovery data
Monitor connections via heartbeat watchlists
Search & Read
Search ABAP objects by name/wildcard (classes, programs, tables, BDEFs, etc.)
Read source with pagination, optionally extracting a single method
Search literal text or regex within source files
Read object metadata, ADT structure, source URIs, and batch-read multiple objects
Download source objects or entire packages to local folders
Semantic Services
Code completion, definition lookup, inline documentation
Type hierarchy, component inspection, quick-fix discovery, SAP formatter preview
Edit, Create & Activate
Replace source fragments with syntax diagnostics and lock protection
Single or batch activation (up to 100 objects)
Manage text elements; create repository objects (classes, programs, BDEFs, etc.)
Refactoring
Preview/execute rename, package move, method extraction, quick-fixes, formatting, and guarded deletion
Quality & Testing
Run ABAP Unit tests with structured results
Run ATC checks on objects, packages, or transports; retrieve finding documentation
Run SAP ADT syntax diagnostics; create class test includes
Transport Management
List, inspect, create, release, delete, and compare transports
Reassign owners/users, add objects, resolve object-to-transport assignments
Version Control
View revision history, retrieve source at a specific revision
Compare revision snapshots (unified diff), restore historical revisions
abapGit
List, clone, pull, push, stage, unlink, and check repositories
Switch/create branches; manage per-repository Git credentials
RAP Generator
Check availability, page schema, get defaults, validate, preview, generate RAP artifacts
Manage service bindings: publish/unpublish
Debugging & Runtime Analysis
Start/stop debug sessions, set/remove breakpoints, step through code
Inspect call stack, variables, and evaluate expressions
List and analyze ABAP runtime dumps and trace runs
Execute guarded ABAP REPL (class-runner)
Cross-System Comparison
Compare the same ABAP object across two SAP systems with a bounded unified diff
Dependency Analysis
Build where-used dependency graphs up to depth 5
Data Queries
Run read-only SQL queries (SELECT/WITH); export results as CSV or XLSX
SAP GUI / WebGUI Integration
Generate validated WebGUI transaction URLs or launch them in a local browser
Artifacts & Documentation
Validate and render Mermaid diagrams (local HTML viewer with SVG export)
Generate styled Word (DOCX) test documentation reports
Access bundled ABAP FS compatibility and settings reference docs
Provides tools to connect to SAP ABAP systems via ADT HTTP API, enabling management of ABAP objects, searching, reading source code, and more.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@sap-abap-mcpSearch for ZCL_DEMO class in DEV100 and show its source."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
sap-abap-mcp
The headless, client-neutral, governance-first MCP server for SAP ABAP development across multiple systems.
SAP ABAP MCP lets Codex, Claude, and other local MCP hosts work with SAP ABAP through ABAP Development Tools (ADT) HTTP services. It can inspect and edit source, run quality checks, manage transports, use abapGit and the RAP generator, inspect runtime data, compare systems, and perform guarded refactorings without an IDE runtime, SAP GUI, or an ABAP FS virtual workspace.
Why this server
SAP now provides an official ADT MCP Server inside its ADT clients. This project serves a different operating model: headless automation from any supported local MCP host.
SAP ABAP MCP | SAP ADT MCP Server | |
Runtime | Independent Node.js process: local | Local HTTP server hosted by an ADT client |
Agent hosts | Codex, Claude, and other MCP clients, locally or over HTTP | MCP hosts configured against the running ADT server |
SAP sessions | Multiple named profiles in one process | SAP projects and sessions managed by ADT |
Guardrails | Production profiles are read-only; writes support package restrictions and explicit confirmations; HTTP mode adds API key roles, rate limits, and a structured audit log | Governed by the installed ADT version, SAP authorizations, and client configuration |
Assurance | Read-only transport assessment with JSON, SARIF, and JUnit evidence | SAP-provided in-IDE development workflows |
Verification | Separates implemented, discovered, authorized, and live-verified capabilities | SAP product support and release documentation |
This is a deployment-model comparison, not a capability benchmark or a claim of SAP endorsement. Official behavior varies by ADT and SAP backend release.
Related MCP server: dassian-adt
90-second workflow

The animation contains synthetic object and transport names and no live SAP data. See the accessible transcript and exact workflow.
Quick start
Detailed references: profiles and authentication, HTTP deployment, and CLI commands.
You need Node.js 20 or later, network or VPN access to SAP, and an SAP HTTPS URL, three-digit client number, username, and ADT Basic Auth permission.
Recommended: guided onboarding
Run one command and follow the local browser wizard. It checks npm, Claude Code,
Codex, existing .claude and .codex settings, and saved SAP profiles. It then
verifies the SAP login before saving it and registers the MCP server through the
installed client's official CLI. Existing steps are detected and skipped.
Windows:
npx.cmd -y @coaspe/sap-abap-mcp@latest onboardmacOS:
npx -y @coaspe/sap-abap-mcp@latest onboardThe wizard runs only on 127.0.0.1; SAP credentials do not pass through a
publisher-operated service. Passwords are protected with Windows DPAPI or macOS
Keychain. Linux users should use the manual setup because the browser wizard
does not store Linux credentials.
Manual setup
1. Configure SAP
Windows:
npx.cmd @coaspe/sap-abap-mcp@latest setupmacOS or Linux:
npx @coaspe/sap-abap-mcp@latest setupThe wizard calls the local connection alias Server name and the endpoint SAP URL. Windows and macOS validate SAP before saving and protect the password with DPAPI or Keychain. Linux saves only non-secret settings and prints the password environment-variable commands to run before starting the MCP client.
2. Register the MCP server
After setup, run only the command for your client. On Windows, use npx.cmd.
Codex CLI:
codex mcp add sap-abap -- npx.cmd -y @coaspe/sap-abap-mcp@latest serveClaude Code:
claude mcp add --transport stdio --scope user sap-abap -- npx.cmd -y @coaspe/sap-abap-mcp@latest serveOn macOS or Linux, use npx.
Codex CLI:
codex mcp add sap-abap -- npx -y @coaspe/sap-abap-mcp@latest serveClaude Code:
claude mcp add --transport stdio --scope user sap-abap -- npx -y @coaspe/sap-abap-mcp@latest serveThis registration exposes all saved SAP profiles; every SAP-facing tool still requires an explicit connectionId. Restart the client, then use codex mcp list, claude mcp get sap-abap, or /mcp to confirm that the process starts. The completed wizard already performs live SAP verification; /mcp alone does not prove that SAP authentication succeeded.
Prefer a plugin install? Follow Claude Code and Codex plugin marketplaces; the included setup skill guides the same local wizard without putting the SAP password in chat. See the detailed Windows, macOS, and Linux sections for platform-specific behavior and server management.
Community and adoption
Read the public roadmap.
Run or implement the open SAP ABAP MCP compatibility profile.
Add an opt-in, sanitized entry to ADOPTERS.md.
Use GitHub Discussions for implementation questions, compatibility evidence, and RFCs.
Need a transport-specific release decision and CI evidence from existing ATC and ABAP Unit checks? Review the fixed-scope paid diagnostic and three-day pilot. If your current workflow already preserves the check results, release decision, and evidence together, the service is not a fit. Never include SAP credentials, source code, hosts, transport numbers, logs, tokens, or other confidential information in a public issue or discussion.
Current v1 surface
The v1 catalog contains 120 action-specific tools and seven Resources.
Unreleased local CLI builds default to the minimal preset: five discovery/invocation tools. Other capabilities are loaded on demand.
Use --toolsets all to advertise the complete catalog directly. Use --api-version v0 only for legacy
client compatibility, or select toolsets explicitly when a host should
advertise fewer schemas.
Normal clients should omit both --api-version and --toolsets.
Invocation | Advertised surface |
| Minimal v1: 5 gateways, all 120 capabilities reachable, seven Resources |
| Full direct v1: 120 tools and seven Resources |
| Token-efficient v1, 12 everyday read/inspect tools |
| Selected v1 toolsets only |
| Legacy 53-tool compatibility surface |
See the v1 migration guide for contracts, Resources, and the separate live-SAP verification boundary.
Built-in workflow prompts (unreleased)
MCP hosts supporting prompts/list and prompts/get can select these workflows:
Prompt | Outcome |
| Explain current source and callers with source-line evidence |
| Guide a scoped edit through diagnostics, activation, ABAP Unit and ATC |
| Assess readiness and incomplete evidence without releasing a transport |
| Discover backend schema, validate inputs and preview RAP generation |
Each prompt accepts systemId, target, and optional goal in your preferred
language. Prompts appear only when their required tools are enabled; viewer
sessions never expose the source-change workflow. The legacy v0 API is unchanged.
Fetching a prompt performs no SAP calls. These are agent instructions, not an
automatic transaction or an additional authorization grant.
For local usage and verification, see workflow prompts. The September 2026 competitive assessment separates implemented improvements from remaining live-SAP and release gaps.
Live SAP evidence
Capabilities are reported as unverified until they succeed against a live
connection. docs/live-sap-evidence.md records the
current sanitized results — no credentials, no customer source, no host names.
Area | ECC 758 | S/4HANA 758 |
| 87 passed, 11 unsupported, 0 failed | 93 passed, 2 unsupported, 0 failed |
Self-hosted HTTP mode, roles, and audit | 13 of 13 passed | not run |
CI assurance gate and its artifacts | 7 of 7 passed | not run |
200 live checks in total: 180 tool-surface checks across two systems, plus 20 transport and CI checks on one. The tool-surface count counts each capability once per system, because release coverage is the claim; it is not 180 distinct capabilities.
On S/4HANA this includes the complete class-runner and debugger chain: a $TMP
class runner executed, a breakpoint on its own source suspended it, and the
attached debugger returned a 13-frame stack, variables, an evaluated expression,
and a completed step. On ECC the ADT class-run endpoint rejects the same class, so
the attached debugger is unreachable there; that difference accounts for the nine
extra unsupported results and is documented with its exact SAP message.
Reproduce the tool-surface run against your own development system:
npm run evidence:live -- DEV100The harness creates exactly one class in the local package $TMP under a
run-unique name, treats it as owned only after a create receipt and an immediate
exact read-back agree, refuses in code to mutate anything else, and deletes it
again. Existing objects are only ever read. The two unsupported results are
missing SAP-side prerequisites — the ABAP REPL and the abapGit ADT backend — not
defects.
ABAP FS parity status
The pinned ABAP FS 2.6.5 source exposes 43 MCP tools. This server provides a strict-compatible subset of 42; the omitted tool is manage_subagents, which depends on the VS Code agent host. With 10 headless feature extensions and read_deferred_result, this server advertises 53 tools in total.
The development surface supports create-time source for BDEFs, classes, interfaces, programs/includes, CDS/DCL/metadata extensions, and service definitions, plus structured DDIC reads/writes, one-request batch activation, class and executable-program profiling, the ABAP FS REPL contract, detailed semantic and enhancement inspection, paged repository-child discovery, bounded runtime feeds, and an opt-in classic-object bridge. SAP-dependent capabilities remain unverified until they succeed against the selected live connection; call get_sap_capabilities for per-connection evidence.
Snippet execution requires ZCL_ABAP_REPL and an active SICF service at /sap/bc/z_abap_repl. Executable programs use the ADT program-run endpoint through a confirmed one-use plan and request only a bounded server-time profile.
What it supports
The server provides all 42 strict-compatible headless tools from the pinned ABAP FS baseline, ten grouped feature extensions, and one infrastructure tool for continuing oversized results.
Area | Capabilities |
Connections | Multiple SAP profiles, Basic Auth, OAuth client credentials, browser OAuth Authorization Code with PKCE, request-scoped bearer passthrough, lazy login, system metadata, ADT discovery export |
Repository reads | Search, metadata, structured DDIC properties, paged package/program/function-group children, source ranges, batch reads, URI reads, source search, enhancement implementations and elements |
Semantic services | Completion details, definition lookup, documentation, type hierarchy, components, quick-fix discovery, SAP formatter preview |
Source writes | Exact source replacement, typed DDIC updates, create-time source for textual ADT object types, syntax diagnostics, single- and one-request batch activation, text elements |
Refactoring | Rename, package move, extract method, quick-fix application, formatting, deletion |
Quality | ABAP Unit, ATC, diagnostics, test-include creation |
Transports | List, details, objects, read-only release assessment, JSON/SARIF/JUnit evidence, compare, create, release, delete, owner/user management, object resolution |
Versions | Active revision history, revision comparison, inactive source, guarded revision restore |
abapGit | Repository list, remote information, create, pull, unlink, stage, push, check, branch switch (requires the abapGit ADT backend on the SAP system) |
RAP | Availability, paged schema, defaults, validation, preview, generation, service binding details, and OData V2/V4 publication and unpublication |
Runtime | Guarded class/program execution with bounded aggregate profiling, fixed-contract ABAP REPL execution, debugger, breakpoints, stack, variables, dumps, traces, Gateway/system feeds, heartbeat checks |
Cross-system | Source comparison across configured SAP systems |
Dependency analysis | Bounded where-used dependency graph |
SAP GUI integration | Validated WebGUI transaction URL generation and optional local launch |
Classic objects | Opt-in, same-origin Screen/Dynpro and full GUI Status bridge with confirmed writes |
Data | Read-only ADT SQL queries with bounded or file-based output |
Artifacts | Mermaid validation/viewer and DOCX test documentation |
The ten grouped extension tools are:
inspect_abap_coderefactor_abap_codemanage_abapgitmanage_rap_generatormanage_abap_versionscompare_abap_systemsget_abap_dependency_graphrun_sap_transactionget_sap_capabilitiesrun_abap_application
Grouping related actions keeps the tool-schema footprint lower than exposing every operation as a separate MCP tool.
read_deferred_result is the additional infrastructure tool; it reads the remaining UTF-8 chunks of a large result without repeating the SAP operation.
See advanced ABAP workflows for enhancement, behavior implementation, CDS Unit, local test include, and program profiling recipes. See the classic-object bridge guide before enabling Screen/Dynpro or GUI Status access.
Transport change assurance
manage_transport_requests keeps transport review inside the existing grouped tool. Its read-only assess_transport action can run ATC and ABAP Unit for each supported transport object, optionally compare the same objects with a target connection, and emit JSON, SARIF 2.1.0, and JUnit XML reports.
The returned gate is passed, failed, or incomplete. Truncated object coverage, truncated ATC findings, failed check execution, empty transports, and classes without discoverable tests prevent a pass. A target-system difference is recorded as landscape evidence rather than automatically treated as a failure. Assessment never releases the transport; release_transport remains a separate confirmed mutation.
The plugin includes sap-abap-change-assurance for this workflow. In Claude Code run /sap-abap-mcp:sap-abap-change-assurance; in Codex ask to use $sap-abap-change-assurance.
Gate a pipeline without an MCP host
Change assurance does not require an AI agent. The assure command runs the same
read-only assessment directly and turns the gate into an exit code:
npx @coaspe/sap-abap-mcp@latest assure DEV100 --transport DEVK900123 \
--checks atc,unit_tests --formats json,sarif,junit \
--report-directory ./reportsExit code | Gate | Meaning |
0 |
| Every assessed object passed every requested check |
1 |
| A check produced a definite failure |
2 |
| Safety could not be proven — truncated coverage, a check that could not run, an empty transport, or a class with no discoverable tests |
incomplete blocks by default. Pass --fail-on failed when only definite
failures should stop a build. assure never releases or modifies the transport.
GitHub Action
action.yml wraps the same command and uploads SARIF to GitHub code
scanning, so ABAP findings appear next to the rest of a repository's security
results:
- uses: Coaspe/sap-abap-mcp@v1
id: assurance
with:
sap-url: ${{ secrets.SAP_URL }}
sap-client: "100"
sap-username: ${{ secrets.SAP_USERNAME }}
sap-password: ${{ secrets.SAP_PASSWORD }}
transport: ${{ inputs.transport }}
checks: atc,unit_tests
- uses: github/codeql-action/upload-sarif@v3
if: always()
with:
sarif_file: ${{ steps.assurance.outputs.report-sarif }}The action outputs gate, report-json, report-sarif, and report-junit, and
writes a job summary. The SAP password is passed only through a
profile-specific environment variable, never as a command argument, so it does
not appear in a process list or a command echo. The runner needs network or VPN
access to SAP.
MCP directories and registries
The canonical registry identity is io.github.Coaspe/sap-abap-mcp, defined in server.json. Directory installs must run this package as a local stdio server; SAP profiles and credentials stay on the user's machine and are never hosted by a registry.
Before the first SAP-facing request, create and verify at least one local SAP profile using the commands in Quick start or llms-install.md. The Claude plugin may start successfully without a profile; after installation, run /sap-abap-mcp:sap-abap-setup to complete local SAP setup. A generic registry launch runs @coaspe/sap-abap-mcp with the serve argument and exposes all locally configured profiles; every SAP-facing tool still requires an explicit connectionId.
Registry publication does not change the live-evidence boundary. SAP-dependent development-parity capabilities remain unverified until they succeed against the selected live connection.
The public Smithery listing installs the validated local MCPB bundle. Its current catalog contains 120 tools and seven Resources and is synchronized from the runtime before publication.
The public LobeHub listing
uses the owner-validated lhm.plugin.json manifest. The
current listing advertises the same default 120 tools and seven Resources.
Privacy Policy
SAP ABAP MCP runs locally and does not send SAP profiles, credentials, source code, or tool results to a publisher-operated service. It communicates only with destinations selected by the user, including the configured SAP system and the user's MCP host. See the complete PRIVACY.md and TERMS.md.
Claude Code and Codex plugin marketplaces
This repository is also a dual-compatible plugin marketplace. The plugin starts the same npm latest package as a local stdio process, so SAP profiles, credentials, and ADT traffic stay on the user's computer. Profiles are user-scoped outside the plugin cache and survive plugin updates.
Claude Code:
/plugin marketplace add Coaspe/sap-abap-mcp
/plugin install sap-abap-mcp@coaspe-sap
/reload-pluginsRun the namespaced setup skill after reloading:
/sap-abap-mcp:sap-abap-setupThe skill reuses an existing profile or guides profile creation, local password entry, and live ADT verification. Use /mcp to confirm that the sap-abap process is connected, but do not treat that status as proof that an SAP profile is authenticated; the setup skill verifies SAP with doctor.
Codex:
codex plugin marketplace add Coaspe/sap-abap-mcpThen install SAP ABAP MCP from the Coaspe SAP Developer Tools marketplace in the Codex app and start a new task. Ask Codex to set up SAP ABAP MCP; the included sap-abap-setup skill keeps passwords out of chat and guides profile creation, authentication, and live ADT verification.
The plugin also includes sap-abap-change-assurance, which assesses an existing transport without releasing it and returns CI-native evidence paths.
OAuth client credentials
The interactive setup wizard remains the Basic Auth path. OAuth client credentials are an explicit advanced profile type and do not change the defaults for newly created profiles. Create and verify one on Windows or macOS with:
npx @coaspe/sap-abap-mcp@latest profile add BTP100 \
--url https://abap.example.com --client 100 \
--auth-type oauth-client-credentials \
--token-url https://auth.example.com/oauth/token \
--client-id mcp-client --scope "abap.read abap.write" --loginThe hidden prompt requests the OAuth client secret. The profile file stores the token URL, client ID, and optional scope, but never the client secret or access token. The token endpoint must use HTTPS and must not contain embedded credentials, query parameters, or a fragment. The client uses HTTP Basic client authentication, requires a Bearer token with a positive expires_in, and recreates the ADT client before the cached token expires because abap-adt-api 8.4.1 memoizes a bearer fetch.
For automation, pipe the client secret and add --password-stdin. On Linux, create the profile without --login, place the client secret in the printed profile-specific SAP_ABAP_MCP_PASSWORD_<PROFILE> environment variable, and start the MCP process from that environment. The variable name is retained for backward compatibility even when its value is an OAuth client secret.
Browser OAuth Authorization Code profiles are also available for identity providers that support a loopback redirect URI and S256 PKCE:
npx @coaspe/sap-abap-mcp@latest profile add DEV100 \
--url https://sap.example.com --client 100 \
--auth-type oauth-authorization-code \
--authorization-url https://login.example.com/oauth2/authorize \
--token-url https://login.example.com/oauth2/token \
--client-id mcp-public-client --scope "openid abap" --loginThe command opens the system browser, listens only on a random loopback port,
validates OAuth state, exchanges the code with PKCE, and stores the resulting
credential in Keychain or DPAPI. Refresh-token rotation is persisted. Browser
OAuth login is therefore available on macOS and Windows; Linux's environment-
only secret store cannot safely persist or rotate this credential.
Client certificates, Kerberos, and user/password OAuth grants remain
unsupported. OAuth behavior is still live-unverified for a particular SAP
system until doctor succeeds there.
SAP BTP ABAP environment service keys
A service key downloaded from an ABAP environment service instance already contains the endpoint, client id, and client secret, so it can be imported directly:
npx @coaspe/sap-abap-mcp@latest profile add BTP100 --service-key ./service-key.jsonThe command reads url for the ABAP endpoint, composes the token endpoint from
uaa.url (or uses an explicit uaa.tokenurl when the key provides one), sets SAP
client 100, verifies the credentials against SAP, and stores the client secret
in the protected credential store. The secret is never typed into a terminal or
passed as a command argument.
Delete the service key file afterwards. BTP delivers it with the client secret in plain text, and importing it does not remove that copy.
Service keys that use X.509 client certificates instead of a client secret are
rejected with SERVICE_KEY_CERTIFICATE_UNSUPPORTED rather than producing a
profile that could never authenticate.
SAP data-query policy
Direct SAP table queries are disabled for every new profile. Enable them only on a reviewed development or quality profile:
npx @coaspe/sap-abap-mcp@latest profile add DEV100 \
--url https://sap.example.com --client 100 --username DEVELOPER \
--environment development --allow-data-queriesProduction profiles cannot enable the capability. As in published 1.6.0, an opted-in development or quality profile permits queries that pass read-only SQL validation and SAP authorization; there is no MCP table denylist or per-call risk acknowledgement. Row limits remain enforced and SQL text is redacted even when audit argument capture is enabled.
This policy applies only to caller-supplied SQL sent to SAP. Processing caller-supplied structured data, reading a cached data view, and bounded internal metadata checks used by connection diagnostics do not require the opt-in.
Prerequisites
Ask your SAP administrator for:
The SAP HTTPS base URL, for example
https://sap-dev.company.comThe three-digit SAP client number
Your SAP user name
ADT development permissions required by the operations you intend to use
Confirmation that
/sap/bc/adtand Basic Auth are enabled
Your machine needs:
Node.js 20 or later
Codex or Claude Code
Network or VPN access to SAP
npm registry access to install the public package
Verify Node.js first:
node --versionDetailed setup on Windows
1. Run interactive setup
npx.cmd @coaspe/sap-abap-mcp@latest setupThe first run may ask whether npm may download the package; enter y to continue. The setup wizard collects the SAP URL, client, username, environment, and optional writable-package restriction. Server name is the local name used later as connectionId, for example DEV100. Keep production servers classified as production; they are read-only even if the package restriction is empty.
When SAP password: appears, enter the password and press Enter; the input remains hidden. The server configuration and password are stored only after the MCP validates the credentials against SAP. Windows protects the password with DPAPI and never writes it to the profile file.
The setup command is one line in both PowerShell and Command Prompt. For advanced multiline commands, PowerShell continues a line with a backtick (`), while Command Prompt (cmd.exe) uses a caret (^); do not mix them.
2. Verify ADT connectivity
npx.cmd --yes --prefer-online @coaspe/sap-abap-mcp@latest doctor DEV100A completed setup already performs this live check. Run doctor again whenever you want to recheck ADT connectivity; a successful response contains "ok": true.
3. Register the MCP server
Codex CLI:
codex mcp add sap-abap -- npx.cmd --yes --prefer-online @coaspe/sap-abap-mcp@latest serve --profile DEV100Claude Code:
claude mcp add --transport stdio --scope user sap-abap -- npx.cmd --yes --prefer-online @coaspe/sap-abap-mcp@latest serve --profile DEV100Restart the client after registration. Use codex mcp list, claude mcp get sap-abap, or the client's /mcp command to verify the connection.
The registration deliberately uses the moving npm tag @latest together with --prefer-online. Whenever Codex or Claude starts a new MCP process, npm checks which published version latest points to and runs that version. For example, a user who originally ran 0.4.7 will automatically run 0.4.8 after 0.4.8 is promoted to latest and the client is restarted. An already-running MCP process is not replaced in place. Maintainers should promote only tested releases to latest.
4. Change or remove a saved server
Edit a server with its current values as defaults. The wizard tests the updated settings and password before replacing the saved configuration:
npx.cmd @coaspe/sap-abap-mcp@latest setup edit DEV100Remove a server and its stored SAP and abapGit credentials:
npx.cmd @coaspe/sap-abap-mcp@latest setup remove DEV100Omit DEV100 to choose from the saved servers. Removal always shows the selected server and asks for confirmation; the default answer is No.
5. Start with read-only requests
List the configured SAP systems and verify DEV100.
Find class ZCL_DEMO in DEV100 and read its RUN method.
Run syntax diagnostics and show a formatter preview without changing the source.
Build a depth-1 dependency graph for ZCL_DEMO.Detailed setup on macOS
Use npx instead of npx.cmd:
npx @coaspe/sap-abap-mcp@latest setup
npx @coaspe/sap-abap-mcp@latest setup edit DEV100
npx @coaspe/sap-abap-mcp@latest setup remove DEV100
codex mcp add sap-abap -- npx --yes --prefer-online @coaspe/sap-abap-mcp@latest serve --profile DEV100The wizard tests the SAP connection and stores the password in macOS Keychain.
Linux and containers
Linux runs the same interactive setup, but it does not persist credentials:
npx @coaspe/sap-abap-mcp@latest setupThe wizard saves the non-secret server configuration and prints the exact hidden-input and export commands for its profile-specific password variable. Run those commands in the same shell that starts the MCP client, then run the printed doctor command. For example, server name DEV-100 uses SAP_ABAP_MCP_PASSWORD_DEV_100. The Linux environment store is read-only, so auth login and auth logout are unavailable and no plaintext credential file is created.
Codex desktop setup
If the codex command is not available, add a stdio MCP server in Codex settings:
Name:
sap-abapCommand on Windows:
npx.cmdCommand on macOS:
npxArguments:
--yes
--prefer-online
@coaspe/sap-abap-mcp@latest
serve
--profile
DEV100Multiple SAP systems
Create one profile per SAP client, for example DEV100, QAS200, and PRD100. To expose all profiles through one MCP server, register serve without --profile:
codex mcp add sap-abap -- npx.cmd --yes --prefer-online @coaspe/sap-abap-mcp@latest serveEvery SAP-facing tool requires an explicit connectionId, which prevents accidental cross-system routing. Cross-system comparison requires the same object to exist in both selected profiles.
abapGit credentials
Public repositories require no additional setup. Store credentials for each private repository URL separately:
npx.cmd --yes --prefer-online @coaspe/sap-abap-mcp@latest abapgit auth login DEV100 `
--repository-url "https://github.example.com/team/repo.git" `
--username "GIT_USER"Status and removal:
npx.cmd --yes --prefer-online @coaspe/sap-abap-mcp@latest abapgit auth status DEV100 `
--repository-url "https://github.example.com/team/repo.git"
npx.cmd --yes --prefer-online @coaspe/sap-abap-mcp@latest abapgit auth logout DEV100 `
--repository-url "https://github.example.com/team/repo.git"Credentials are selected by canonical repository URL so credentials for one remote cannot be sent to another. Passwords and tokens are not accepted as MCP tool arguments, and credentials embedded in a repository URL are rejected.
Write-safety model
Repository-changing operations enforce these rules:
Profiles marked
productionreject writes.A non-empty
allowedPackageslist restricts writes to those packages; an empty list allows all packages.Packages other than
$TMPrequire a transport request.Exact source replacement reads the current source, obtains an SAP lock, rechecks it under the lock, writes, runs syntax diagnostics, optionally activates, and unlocks.
Rename, package move, method extraction, quick-fix application, formatting, deletion, and revision restore use a preview plan.
Preview plans expire after ten minutes and require the exact returned confirmation value.
Execution re-runs the SAP preview or source-state check and rejects stale plans.
Multi-object quick-fixes perform syntax preflight and attempt rollback if a later write fails.
RAP generation performs initial validation, content validation, and dry-run preview immediately before generation.
abapGit push accepts only a fresh SAP staging snapshot and requires explicit object selection or
stageAll=true.SAP transaction parameters use a restricted character set and are passed to the OS launcher as argument-array values rather than shell text.
ADT SQL accepts only
SELECTandWITHstatements.
Transport release and deletion can be irreversible. Use a dedicated transport and verify the exact confirmation value before executing either action.
Audit log
Auditing is off by default and is enabled per server process. When enabled, every tool call and Resource read emits exactly one JSON Lines record:
npx.cmd @coaspe/sap-abap-mcp@latest serve --profile DEV100 `
--audit-log file --audit-log-file C:\ProgramData\sap-abap-mcp\audit.jsonlUse --audit-log stderr to send the same records to the MCP host's server log
instead of a file. The equivalent environment variables are
SAP_ABAP_MCP_AUDIT_LOG, SAP_ABAP_MCP_AUDIT_LOG_FILE, and
SAP_ABAP_MCP_AUDIT_INCLUDE_ARGUMENTS=1, so a managed launcher can enable
auditing without changing the registered MCP command.
Each record carries the sap-abap-mcp.audit/v1 schema:
Field | Meaning |
| Actor identity; |
|
|
| True when the capability is not advertised with |
| True when the capability advertises |
|
|
| Machine-readable code for a |
| Selected SAP profile and scalar object identity only |
| Timing and correlation |
| SHA-256 prefix of the redacted arguments |
outcome: "denied" separates policy refusals such as
PRODUCTION_WRITE_BLOCKED, PACKAGE_NOT_ALLOWED, TRANSPORT_REQUIRED, and
QUERY_NOT_READ_ONLY from technical failures, so blocked attempts can be
counted independently.
Arguments are excluded unless --audit-include-arguments is set. Even then,
credential-shaped keys are replaced with [redacted], strings are truncated at
512 bytes so an ABAP source body is never written whole, arrays and recursion
depth are capped, and an oversized argument object is reduced to a byte count.
argumentsDigest is computed from the redacted arguments, so it correlates
repeated calls without recording their content.
A file sink creates its parent directory and the log file with owner-only permissions, and degrades to a single stderr warning rather than failing a tool call if the file becomes unwritable.
Two boundaries are deliberate. A request rejected by MCP input-schema
validation never reaches the capability and is not audited, because it never
reached SAP. In stdio mode the principal is the local process identity, not
the SAP user; the SAP user is determined by the profile named in systemId. In
HTTP mode the principal is the authenticated API key id.
Self-hosted HTTP mode
The default runtime is a local stdio process. serve --http runs the same
server over MCP Streamable HTTP so that one team can operate a single instance
per SAP system with central configuration, central API keys, and one audit
stream, instead of every developer holding SAP credentials on a laptop.
The HTTP listener is built directly on node:http. This mode adds no new
runtime dependency, so the supply chain and audited attack surface are the
same as the stdio runtime.
1. Create API keys
npx @coaspe/sap-abap-mcp@latest apikey new alice --role developerThe command prints the key once together with a record object. Add the record
to the keys array of a key file; the file stores only the SHA-256 digest, so a
disclosed key file contains no usable credential.
Keys must come from apikey new or an equivalent CSPRNG. A generated key is 32
random bytes, which encode to 43 base64url characters, and the server rejects any
credential shorter than that or outside that alphabet. SHA-256 is the right
primitive for a 256-bit random token: iteration hardening does not change the
feasibility of searching that space, and deriving a key on every request would
let an unauthenticated caller consume CPU at will, because rate limiting applies
per principal and a caller has none until its credential is resolved.
Binding the key file to a server secret
A validator cannot measure entropy, so the rules above raise the floor rather than proving strength — a long but non-random key would still be attackable from a disclosed key file. Binding the digest to a server-side secret removes that residual risk entirely, and stays fast, so it does not reintroduce the denial-of-service concern a slow key-derivation function would:
npx @coaspe/sap-abap-mcp@latest apikey pepper > /etc/sap-abap-mcp/pepper
npx @coaspe/sap-abap-mcp@latest apikey new alice --role developer \
--pepper-file /etc/sap-abap-mcp/pepperThat emits keyHmacSha256 instead of keySha256, and the server needs the same
secret:
npx @coaspe/sap-abap-mcp@latest serve --http \
--api-keys-file /etc/sap-abap-mcp/api-keys.json \
--api-key-pepper-file /etc/sap-abap-mcp/pepperEach record names its own algorithm, so a key file is never ambiguous about what
verifies it, and the two kinds may coexist during a migration. A keyHmacSha256
record without the secret is refused rather than downgraded to a plain hash, so a
missing secret denies access instead of weakening verification — and serve
refuses to start if the key file needs a secret that was not supplied.
Store the secret outside the key file's directory. Keeping them together
defeats the purpose, because one disclosure would yield both. The equivalent
environment variable is SAP_ABAP_MCP_API_KEY_PEPPER_FILE.
{
"keys": [
{ "id": "alice", "role": "developer", "keySha256": "…" },
{ "id": "audit-bot", "role": "viewer", "keySha256": "…" }
]
}2. Start the server
npx @coaspe/sap-abap-mcp@latest serve --http \
--api-keys-file /etc/sap-abap-mcp/api-keys.json \
--host 0.0.0.0 --port 3000 --allowed-host mcp.internal.example.com--api-keys-file is mandatory: this mode never starts unauthenticated. Clients
connect with Authorization: Bearer <key>. GET /healthz needs no credential
and performs no SAP call. Auditing defaults to the stderr sink in HTTP mode
because a shared server should not run unaudited.
3. Roles
A role is bound to an API key and restricts the surface a session can even see; a hidden tool cannot be called by guessing its name.
Role | Advertised surface |
| Only tools advertised with |
| Everything except the admin-only list below |
| The complete selected surface |
Admin-only tools are the irreversible or landscape-wide ones:
sap.transport.release, sap.transport.delete, sap.transport.owner.set,
sap.transport.user.add, sap.repository.delete.execute,
sap.version.restore.execute, sap.git.push, sap.git.unlink,
sap.git.branch.switch, sap.rap.binding.publish,
sap.rap.binding.unpublish, and sap.ui.transaction_launch.
Legacy --api-version v0 groups many actions behind one tool name, so on that
surface only the viewer restriction is meaningful. Use the default v1 surface
when roles matter.
4. OIDC/JWT instead of static keys
An existing identity provider can issue MCP credentials, so keys do not have to be distributed and rotated by hand:
npx @coaspe/sap-abap-mcp@latest serve --http \
--oidc-issuer https://login.example.com/oauth2/v2.0 \
--oidc-audience sap-abap-mcp \
--oidc-role-map "sap.developer=developer,sap.admin=admin" \
--host 0.0.0.0 --port 3000Clients then present the provider's access token as Authorization: Bearer <jwt>.
API keys and OIDC can be enabled together; at least one is required.
Control | Behaviour |
Algorithms |
|
Keys | Fetched from |
Claims |
|
Identity |
|
Role | Read from |
Verification uses node:crypto only, so enabling OIDC still adds no dependency.
The equivalent environment variables are SAP_ABAP_MCP_OIDC_ISSUER,
SAP_ABAP_MCP_OIDC_AUDIENCE, SAP_ABAP_MCP_OIDC_JWKS_URI, and
SAP_ABAP_MCP_OIDC_ROLE_MAP.
5. Per-user SAP identity
By default every session reaches SAP through whichever profile it names. Assigning profiles per person makes SAP-side attribution per person too:
{
"keys": [
{ "id": "alice", "role": "developer", "keySha256": "…", "systemIds": ["DEV100_ALICE"] },
{ "id": "bob", "role": "developer", "keySha256": "…", "systemIds": ["DEV100_BOB"] }
]
}Register one SAP profile per developer, each with that person's own SAP user, and
list it in their systemIds. Then:
SAP change documents attribute the work to that person's SAP user, not to one shared technical account.
SAP authorization objects apply per person, so the SAP system itself becomes an enforcement layer rather than only this server.
sap.system.listshows a principal only its own systems, and naming another system returnsPROFILE_NOT_ALLOWEDwithout disclosing which systems others may use.
Omitting systemIds keeps every configured profile reachable, which is the
single-identity default. SAP logins stay pooled across sessions.
For an OIDC token that SAP accepts directly, create an explicit passthrough profile instead of storing a SAP credential:
npx @coaspe/sap-abap-mcp@latest profile add DEV100_SSO \
--url https://sap.example.com --client 100 \
--auth-type bearer-passthroughOnly an OIDC-authenticated HTTP session can use this profile. Its incoming JWT is forwarded to SAP within a request-scoped client, never for static API-key sessions, never for a non-passthrough profile, and never through the shared SAP connection cache. The identity provider token must already be valid for the SAP audience; this mode does not perform a BTP token exchange.
6. Transport security
Control | Behaviour |
Bind address | Defaults to |
TLS | Terminate TLS at a reverse proxy; this server speaks plain HTTP |
Origin | A request carrying |
Host |
|
Session binding | A session is bound to the API key that opened it; replaying its id under another key returns 403 |
Rate limit |
|
Concurrency |
|
Sessions |
|
Body size | Requests above 4 MiB are rejected with 413 |
Headers | HSTS, |
CORS | Off unless |
Each session gets its own tool service, so preview plans, staged abapGit snapshots, and execution plans are never shared between principals. SAP logins stay pooled across sessions.
7. Container deployment
docker build -t sap-abap-mcp .
docker run --rm -p 3000:3000 \
-v /etc/sap-abap-mcp/api-keys.json:/run/secrets/sap-abap-mcp-api-keys.json:ro \
-e SAP_ABAP_MCP_PASSWORD_DEV100="$SAP_PASSWORD" \
sap-abap-mcpThe image contains no SAP credentials and no API keys. It runs as a non-root user, and the Linux secret store is read-only, so SAP passwords are supplied only through profile-specific environment variables.
Current limitation: token exchange
Per-person SAP profiles give per-person attribution, and bearer-passthrough
can forward an OIDC user's token when SAP accepts that same token. This checkout
also implements an experimental btp-destination profile using the SAP Cloud
SDK for user-token exchange or principal propagation. Its integration is tested
locally; live BTP exchange, Cloud Connector and SAP authorization are unverified.
See experimental setup and evidence.
The HTTP listener speaks plain HTTP; terminate TLS at a reverse proxy.
Embed in another Node.js application
The npm package root is a side-effect-free library entry; importing it does not
start the CLI. Supply an application-owned ConnectionProvider, then connect
the returned server to any MCP transport supported by the SDK:
import { createEmbeddedMcpServer } from "@coaspe/sap-abap-mcp"
const runtime = createEmbeddedMcpServer({
connectionProvider,
serverOptions: { apiVersion: "v1" }
})
await runtime.server.connect(transport)
// On application shutdown:
await runtime.close()The host retains ownership of SAP credentials and connection lifecycle. For
lower-level composition, the same entry exports createMcpServer,
AbapToolService, and the relevant provider/client types. The executable remains
sap-abap-mcp serve; embedding does not change local CLI or registry launches.
Token-efficient operation
The server is designed to keep model context usage bounded without removing useful data:
The local CLI now defaults to 5 gateway tools with on-demand access to the complete 120-capability catalog.
--toolsets allretains the full direct surface;createMcpServer(service)keeps its existing embedding default.Adaptive discovery uses 26,821 minified schema bytes versus 168,227 for the full catalog in this checkout (84.1% less). This measures fixed schema bytes, not actual model tokens or total task cost. See adaptive mode.
The legacy v0 complete 53-tool schema remains below a 64 KiB automated guardrail.
--preset compactadvertises 12 everyday read/inspect tools at about 22.4 KiB (about 5.6k tokens), below the compared package's measured compact surface.--preset developmentadvertises 34 read, edit, quality, Git, and transport tools at about 50.6 KiB (about 12.7k tokens).--preset assuranceadvertises 15 read-only review and transport-assurance tools at about 24.8 KiB (about 6.2k tokens).Source, search, SQL, ATC, dump, trace, transport, version, Git, and RAP schema responses are paged or summarized.
Unified diffs are limited by both line count and byte size.
Large source responses are bounded by an inline byte budget.
Discovery data and large download manifests can be exported to local files.
Compact JSON is returned without pretty-print whitespace.
Connection discovery returns only the profile ID, environment, and credential availability. Object-info reads normalize useful scalar metadata and return the raw ADT structure only when
includeStructure=true.Source reads identify the resolved object by name and type without repeating its search description, package, and object URI;
sourceUriremains available for follow-up operations.search_abap_object_linesalways merges overlapping source windows intocontextBlocksand reports matches once inmatchLineNumbers, including enhancement source groups.get_sap_capabilitiesomits evidence by default; requestincludeEvidence=trueonly when auditing discovery or execution observations.Semantic, refactoring, ATC, version, activation, navigation, and download responses reuse the same compact object identity policy. Batch reads omit the parent
connectionIdfrom each nested result.ATC findings reference one response-level object catalog. Dump, trace, and heartbeat list/mutation responses omit raw details that are available through explicit detail actions or options.
Compact JSON through 16 KiB is normally returned unchanged. Larger results return a bounded structural summary, an exact UTF-8 preview, and an in-memory
resultIdin acompact-v1envelope no larger than 12 KiB.search_abap_object_linesswitches to its bounded summary at 16 KiB and keeps the exact compact result behind the sameresultId.
The complete 53-tool, 150-variant review and fixture measurements are in docs/response-token-audit.md. Re-run npm run benchmark:surface for a machine-readable schema-cost report and npm run benchmark:workflow for complete synthetic workflow payload costs; see docs/compatibility-matrix.md for the live-evidence boundary.
Continue paged responses with fields such as nextStartIndex, nextLine, nextRowStart, and nextContentOffset.
For a response with format: "compact-v1", use summary first. Call read_deferred_result with its resultId and nextOffset only when omitted exact data is needed. A request may ask for up to 24 KiB, while the serialized chunk response remains within the 16 KiB inline budget; continue until done is true. Deferred results expire after ten minutes, are never written to disk, and reading them does not repeat the SAP request.
Hosts without automatic tool search can register only selected toolsets:
sap-abap-mcp serve --profile DEV100 --preset compactPresets are minimal, single, adaptive, compact, development, and assurance. For custom composition, use --toolsets core,write,analysis; available toolsets are core, write, analysis, debug, operations, artifacts, and all. --preset and --toolsets are mutually exclusive. The local CLI default is minimal; use --toolsets all for direct compatibility.
Real SAP acceptance testing
Run acceptance tests first against a development system.
Existing SAP objects may be used for reads, searches, and analysis.
Creation, modification, activation, execution, restore, debugging mutation,
and deletion must target only objects created by the current test run in SAP
local package $TMP.
A name, prefix, search result, or $TMP package membership is not ownership
evidence. A candidate becomes RUN_OWNED only after both a successful create receipt and an immediate exact read-back confirm the same system, package,
object type, name, and canonical URI. Every subsequent mutation requires an
exact ledger match and another read-back. Cleanup may delete only those
RUN_OWNED entries, using a fresh preview and exact confirmation.
The strict B4D campaign records transport, abapGit remote, and RAP publication
mutations as SKIP-SCOPE: $TMP object ownership does not establish ownership
of those external or system-wide targets. It never converts a skipped mutation
into a pass.
For BDEF creation, batch activation, class execution, the fixed ABAP REPL contract, and detailed semantic inspection, follow the evidence and cleanup procedure in docs/live-sap-acceptance.md. Until those checks succeed on a selected connection, the capabilities remain unverified.
For the complete Windows B4D campaign, use the
120-tool v1 $TMP acceptance prompt
and the Windows clone and connection guide.
Recommended order:
Connection, discovery, repository reads, semantic reads, versions, transports, and URL-only transaction generation.
Create a dedicated test class and verify source write, diagnostics, activation, formatter, quick-fix, rename, extract method, inactive source, restore, package move, and guarded deletion.
Test transport mutations only with a disposable transport.
Test abapGit only with a disposable remote repository.
Run RAP validation and preview before approving generation or service publication.
When reporting a failure, preserve the MCP error code, HTTP status, ADT endpoint, and SAP response text. Do not retry failed ADT operations with guessed parameter variants.
CLI reference
setup
setup edit [<server-name>]
setup remove [<server-name>]
profile add <id> --url <url> --client <nnn> [--language EN]
[--environment development|quality|production]
[--username <user>] [--packages ZPKG1,ZPKG2]
[--allow-data-queries]
[--classic-bridge-path /sap/<path>]
[--auth-type basic|oauth-client-credentials|oauth-authorization-code|bearer-passthrough]
[--authorization-url <url>]
[--token-url <url> --client-id <id> [--scope <scope>]]
[--login [--password-stdin]]
profile add <id> --service-key <path> [--language EN]
[--environment development|quality|production]
[--scope <scope>] [--packages ZPKG1,ZPKG2]
[--allow-data-queries]
profile list
profile remove <id>
auth login <id> [--username <user>] [--password-stdin]
auth status <id>
auth logout <id>
abapgit auth login <id> --repository-url <url> --username <user> [--password-stdin]
abapgit auth status <id> --repository-url <url>
abapgit auth logout <id> --repository-url <url>
apikey new <id> [--role viewer|developer|admin] [--pepper-file <path>]
apikey pepper
assure <id> --transport <trkorr> [--checks atc,unit_tests,target_compare]
[--target-system <id>] [--fail-on-atc-warnings] [--max-objects <n>]
[--formats json,sarif,junit] [--report-directory <path>]
[--fail-on incomplete|failed]
doctor <id> [--include-components]
serve [--profile <id>] [--api-version v0|v1]
[--preset minimal|single|adaptive|compact|development|assurance]
[--toolsets core,write,analysis,debug,operations,artifacts|all]
[--audit-log none|stderr|file] [--audit-log-file <path>]
[--audit-include-arguments]
[--http --api-keys-file <path> [--host <host>] [--port <n>]
[--allowed-origin <origin,...>] [--allowed-host <host,...>]
[--api-key-pepper-file <path>]
[--rate-limit <requests-per-minute>] [--max-concurrent <n>]
[--max-sessions <n>] [--session-timeout <seconds>]]Removing a profile also removes its SAP password or OAuth client secret and stored abapGit credential vault.
Troubleshooting
Problem | Check |
| Install Node.js 20 or later and reopen the terminal. |
npm cannot download the package | Check internet access, proxy configuration, and npm registry policy. |
| Run |
SAP login fails | For Basic Auth, verify URL, client, username, password, VPN, and ADT activation. For OAuth, verify the token URL, client ID, client secret, scope, Bearer response, and ADT authorization. |
Certificate or connection error | Check the corporate CA, proxy, VPN, and SAP HTTPS endpoint. |
MCP | The stdio process closed during initialization; this is not an SAP API status. Run |
Tools are missing | Confirm that the MCP command contains |
Writes return | The profile has a non-empty |
Writes return | Supply an open transport for non-local packages. |
RAP generator is unavailable | The SAP release or installed components may not expose the RAP generator endpoints. |
Private Git access fails | Store credentials for the exact canonical repository URL. |
Browser SSO-only, MFA-only, certificate-only, and Kerberos-only SAP systems are not supported by this release. Use Basic Auth or an explicitly configured OAuth client-credentials client accepted by the ADT endpoint.
Local development
npm install
npm run check
npm audit --omit=dev
npm pack --dry-runRegister the current local build for pre-release testing:
npm run build
codex mcp add sap-abap-local -- node "/absolute/path/to/sap-abap-mcp/dist/src/index.js" serve --profile DEV100The compatibility and toolset manifest is maintained in src/compat/abap-fs-tools.ts. ADT wrapper contract tests are in test/sap-client-contract.test.ts, and end-to-end in-memory MCP tests are in test/integration.test.ts.
Release status
Package:
@coaspe/sap-abap-mcpCheckout manifest version:
1.7.0Install:
npx @coaspe/sap-abap-mcp@1.7.0Source lineage and company acceptance scope: release record. Default CLI startup exposes five gateways; all 120 capabilities remain discoverable.
Runtime: Node.js 20 or later
Transport: local MCP over stdio by default; opt-in self-hosted Streamable HTTP
SAP authentication: SAP Basic Auth by default; opt-in OAuth client credentials, browser Authorization Code with PKCE, or request-scoped OIDC bearer passthrough
HTTP client authentication: mandatory Bearer API keys with viewer/developer/admin roles
Secret storage: macOS Keychain, Windows DPAPI, or read-only environment variables on Linux
SAP API client:
abap-adt-api8.4.1ABAP FS compatibility baseline: 2.6.5, commit
3041418d35558e043993a4d7f9fa6b727fcf9cf1
The automated suite validates the MCP contract, ADT argument ordering, safety policies, stale-preview protection, output bounds, all 120 v1 capabilities, the adaptive gateway, all seven v1 Resources, and the legacy 53-tool v0 surface with an in-memory SAP implementation. Live SAP acceptance testing is still required because endpoint availability and authorization vary by SAP release and system configuration.
Known limitations
These reflect ADT behaviour that varies by SAP system. The tools fail safely and report an actionable message when a system does not support the operation.
Transport release of requests/tasks that contain objects: some systems reject the synchronous ADT release endpoint for object-bearing transports and only run release as a background job from the GUI. In that case
release_transportreturnsTRANSPORT_RELEASE_UNSUPPORTEDwith guidance to release from SE10/SE09, and the error details carry the ADT endpoint, HTTP status, ADT error type, and the exact SAP response text. The asynchronous background-run path is not implemented because its ADT wire protocol is not publicly documented and is not exposed byabap-adt-api; implementing it by guessing endpoints is explicitly out of scope. If you can reproduce this, attach those preserved error details to an issue — they are the evidence the implementation needs. Empty and request-only transports release normally.abapGit tools require the abapGit ADT backend: the git tools call
/sap/bc/adt/abapgit/*. Systems that only have the standalone abapGit report (SE38) do not expose these endpoints, and the tools returnABAPGIT_BACKEND_UNAVAILABLE. Install the abapGitADT_Backendto enable them.Cross-system compare needs two configured systems:
compare_abap_systemsrequires two distinct registered connections.RAP generation creates a full artifact set and requires a suitable reference object (for example a root CDS entity with a behavior definition).
Classic-object access requires an optional SAP-side bridge: Screen/Dynpro and GUI Status tools require a reviewed, activated same-origin bridge and suitable SAP authorizations. The bridge extends an ADT-capable system; it does not make a pre-ADT system generally compatible.
Detailed Windows guide
See docs/localhost-mcp-end-to-end.md for the multi-system Windows setup, lifecycle, security model, and operational checklist.
Available Tools
5 toolssap.capability.describeDescribe SAP CapabilityARead-onlyIdempotent
Return the exact input schema and schema hash for one capability before invoking it.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| includeOutputSchema | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so the safety profile is covered. The description adds the workflow context (use before invoking), but does not disclose error behavior, auth requirements, or rate limits. With annotations doing the heavy lifting, this is adequate but not rich.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence that is front-loaded with the tool's action and output. Every word earns its place with no redundancy or fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple introspection tool with rich annotations and no output schema, the description tells what is returned (input schema and hash) and when to use it. However, it leaves the includeOutputSchema parameter unexplained and does not clarify the purpose of the returned hash, leaving a gap for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate for both parameters. It implies a 'name' parameter via 'for one capability', but completely omits any explanation of includeOutputSchema or its default behavior. The description fails to add meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (Return) and resource (exact input schema and schema hash for one capability). The phrase 'for one capability' and 'before invoking it' distinguishes it from sibling tools that search for capabilities or invoke them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states when to use: 'before invoking it', implying this is a pre-invocation validation step. However, it does not explicitly name alternatives like sap.capability.search or explain when not to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap.capability.invoke_destructiveInvoke Destructive SAP CapabilityBDestructive
Invoke a destructive capability after sap.capability.describe. The original tool validation and result are preserved.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| arguments | No | ||
| schemaHash | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, readOnlyHint=false, idempotentHint=false, and openWorldHint=true, so safety behavior is covered structurally. The description adds that the original tool validation and result are preserved, which is useful behavioral context. It still does not describe what gets destroyed, auth needs, or rate limits, so with annotations present this is a 3.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and prerequisite. It is efficient and free of filler. The only weakness is that its brevity contributes to the parameter documentation gap.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The safety profile is covered by annotations, and the description adds the describe-first prerequisite and result preservation. But for a destructive invocation wrapper with required schemaHash and arguments, the lack of any parameter explanation leaves an agent under-informed about how to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The description mentions no parameter semantics at all. With three parameters, required name and schemaHash, an arguments object, and 0% schema description coverage, the description must compensate and does not explain any parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'Invoke a destructive capability.' It also names the prerequisite sibling sap.capability.describe and distinguishes itself from invoke_read/invoke_write through the word 'destructive.' It falls short of a 5 because it does not explicitly state when this differs from invoke_write beyond the destructive label.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear prerequisite: invoke after sap.capability.describe. That is actionable context for selecting the tool. However, it does not explicitly compare this to invoke_write or state when-not to use it, so it stops short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap.capability.invoke_readInvoke Read SAP CapabilityBRead-onlyIdempotent
Invoke a read capability after sap.capability.describe. The original tool validation and result are preserved.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| arguments | No | ||
| schemaHash | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so safety is covered. The description adds that the original tool's validation and result are preserved, which tells the agent responses are not transformed, but it doesn't explain failure modes, auth requirements, or what 'preserved' means operationally.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the precondition front-loaded and no filler. Nothing is wasted, though it is arguably under-specified rather than concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists and parameters are wholly undocumented, so the description carries the full burden — yet it explains neither the required schemaHash/arguments contract nor what a returned result looks like. For a generic capability dispatcher with nested free-form arguments, this leaves major gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for 3 parameters, and the description does not compensate. The critical link between 'schemaHash' (a required 64-hex value) and the output of sap.capability.describe is only obliquely implied, and 'arguments' (free-form nested object) is never explained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (invoke) and resource (read capability), and the 'read' qualifier distinguishes it from the invoke_write and invoke_destructive siblings by intent. It stops short of explaining what a capability invocation actually entails, but an agent can route to it correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit sequencing guidance: invoke only after sap.capability.describe. It does not state when to choose this over invoke_write/invoke_destructive beyond the obvious read/read-only distinction, or what to do if the capability turns out to be a write.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap.capability.invoke_writeInvoke Write SAP CapabilityC
Invoke a write capability after sap.capability.describe. The original tool validation and result are preserved.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| arguments | No | ||
| schemaHash | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=false, openWorldHint=true and destructiveHint=false, so the safety profile is largely covered structurally. The description adds one genuinely useful behavioral fact — that the underlying tool's validation and result semantics are preserved through the wrapper — but says nothing about auth requirements, failure modes, or the non-idempotent retry hazard.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action and immediately followed by the sequencing constraint. No filler, though the second sentence about preserved validation reads as a vague reassurance rather than concrete information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a generic invocation proxy with a nested free-form arguments object, an unexplained hash parameter, no output schema — and the description omits the parameter contract entirely. Given that an agent must construct arguments blindly and source the hash externally, the definition is under-specified for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% for all three parameters, so the description must carry the burden and does not. It never explains that name identifies the capability, that arguments is the free-form payload forwarded to it, or that the 64-hex schemaHash must be obtained from sap.capability.describe — the most opaque and error-prone field in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The verb 'invoke' plus the qualifier 'write capability' tells the agent this is a mutating proxy call, and the name pairs it against the sibling verbs invoke_read and invoke_destructive. However, 'write capability' is a generic abstraction that never says what class of operations it covers or how it differs from the destructive sibling, so differentiation rests almost entirely on the tool name itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description imposes a clear prerequisite sequence — call it 'after sap.capability.describe' — which is real, actionable routing guidance. It stops short of saying when to prefer this over sap.capability.invoke_destructive or how to decide a capability is a 'write' rather than a 'read', so usage is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
sap.capability.searchSearch SAP CapabilitiesBRead-onlyIdempotent
Search or page through the complete SAP tool catalog. Use category browsing when keyword search misses.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| risk | No | ||
| limit | No | ||
| query | No | ||
| cursor | No | ||
| category | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is fully covered by structured data. The description contributes only the notion of paging through a full catalog, and omits return format, page-size behavior or what the cursor represents, so it adds little beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the core capability and followed by the fallback hint. No filler, though it is arguably too terse for a six-parameter discovery tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With six parameters at 0% schema description coverage and no output schema, the description carries the full burden and does not meet it. It omits pagination mechanics, filter semantics and what the search returns, leaving an agent to guess at most inputs.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across six parameters, and the description names only two implied inputs (keyword query and category). The meaning of name, risk, limit and cursor — especially the cursor's numeric pagination token and the risk enum — is left entirely unexplained.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search/page) and resource (the complete SAP tool catalog), which is enough to tell it apart from the invoke_* and describe siblings that act on individual capabilities. It is clear but does not explicitly contrast itself with those siblings, which would push it to a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use category browsing when keyword search misses" gives a concrete fallback for one alternative input within the same tool, which is real guidance. It says nothing, however, about when to reach for this tool rather than sap.capability.describe or the invoke_* siblings, so usage is only partially implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
125 tool updates
v1.7.0- Removed
sap.artifact.mermaid.create - Removed
sap.artifact.mermaid.detect - Removed
sap.artifact.mermaid.validate - Removed
sap.artifact.test_document.create - Added
sap.capability.describe - Added
sap.capability.invoke_destructive - Added
sap.capability.invoke_read - Added
sap.capability.invoke_write - Added
sap.capability.search - Removed
sap.classic.read - Removed
sap.classic.write - Removed
sap.data.export - Removed
sap.data.query - Removed
sap.ddic.read - Removed
sap.ddic.update - Removed
sap.debug.breakpoint.remove - Removed
sap.debug.breakpoint.set - Removed
sap.debug.evaluate - Removed
sap.debug.session.inspect - Removed
sap.debug.session.start - Removed
sap.debug.session.stop - Removed
sap.debug.stack - Removed
sap.debug.status - Removed
sap.debug.step - Removed
sap.debug.variables - Removed
sap.execution.execute - Removed
sap.execution.health - Removed
sap.execution.preview - Removed
sap.git.branch.switch - Removed
sap.git.check - Removed
sap.git.create - Removed
sap.git.inspect - Removed
sap.git.list - Removed
sap.git.pull - Removed
sap.git.push - Removed
sap.git.stage - Removed
sap.git.unlink - Removed
sap.ops.watch.history - Removed
sap.ops.watch.start - Removed
sap.ops.watch.status - Removed
sap.ops.watch.stop - Removed
sap.ops.watch.task.add - Removed
sap.ops.watch.task.disable - Removed
sap.ops.watch.task.enable - Removed
sap.ops.watch.task.list - Removed
sap.ops.watch.task.remove - Removed
sap.ops.watch.task.update - Removed
sap.ops.watch.trigger - Removed
sap.ops.watch.watchlist.read - Removed
sap.quality.atc.cached - Removed
sap.quality.atc.documentation - Removed
sap.quality.atc.run - Removed
sap.quality.test_include.create - Removed
sap.quality.unit_test - Removed
sap.rap.availability - Removed
sap.rap.binding.inspect - Removed
sap.rap.binding.publish - Removed
sap.rap.binding.unpublish - Removed
sap.rap.defaults - Removed
sap.rap.generate - Removed
sap.rap.preview - Removed
sap.rap.schema - Removed
sap.rap.validate - Removed
sap.refactor.execute - Removed
sap.refactor.preview - Removed
sap.repository.compare - Removed
sap.repository.create - Removed
sap.repository.delete.execute - Removed
sap.repository.delete.preview - Removed
sap.repository.dependency_graph - Removed
sap.repository.inspect - Removed
sap.repository.resolve - Removed
sap.repository.search - Removed
sap.repository.where_used - Removed
sap.runtime.dump.inspect - Removed
sap.runtime.dump.list - Removed
sap.runtime.feed.read - Removed
sap.runtime.trace.configuration - Removed
sap.runtime.trace.hit_list - Removed
sap.runtime.trace.inspect - Removed
sap.runtime.trace.list - Removed
sap.runtime.trace.statements - Removed
sap.semantic.complete - Removed
sap.semantic.components - Removed
sap.semantic.definition - Removed
sap.semantic.documentation - Removed
sap.semantic.format_preview - Removed
sap.semantic.hierarchy - Removed
sap.semantic.quick_fixes - Removed
sap.source.activate - Removed
sap.source.diagnose - Removed
sap.source.export - Removed
sap.source.patch - Removed
sap.source.read - Removed
sap.source.read_batch - Removed
sap.source.search - Removed
sap.system.capabilities - Removed
sap.system.discovery - Removed
sap.system.discovery.export - Removed
sap.system.inspect - Removed
sap.system.list - Removed
sap.text_elements.read - Removed
sap.text_elements.write - Removed
sap.transport.assess - Removed
sap.transport.compare - Removed
sap.transport.create - Removed
sap.transport.delete - Removed
sap.transport.inspect - Removed
sap.transport.list - Removed
sap.transport.object.add - Removed
sap.transport.object.resolve - Removed
sap.transport.owner.set - Removed
sap.transport.release - Removed
sap.transport.user.add - Removed
sap.transport.user.list - Removed
sap.ui.object_url - Removed
sap.ui.transaction_launch - Removed
sap.ui.transaction_url - Removed
sap.version.history.compare - Removed
sap.version.history.list - Removed
sap.version.history.read - Removed
sap.version.inactive.list - Removed
sap.version.inactive.read - Removed
sap.version.restore.execute - Removed
sap.version.restore.preview
9 tool updates
v1.4.0- Added
sap.classic.read - Added
sap.classic.write - Added
sap.ddic.read - Added
sap.ddic.update - Changed
sap.repository.create2 fields changed- added
Input schema / properties / activate / descriptionAdded value: +"Activate after writing create-time source" - added
Input schema / properties / source / descriptionAdded value: +"Create-time source for textual ADT object types"
- Changed
sap.repository.inspect5 fields changed- added
Input schema / properties / childLimitAdded value: +{ + "default": 50, + "maximum": 500, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / childStartIndexAdded value: +{ + "default": 0, + "maximum": 9007199254740991, + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / includeChildrenAdded value: +{ + "default": false, + "type": "boolean" +} - added
Input schema / properties / includeEnhancementSourceAdded value: +{ + "default": false, + "type": "boolean" +} - added
Input schema / properties / includeEnhancementsAdded value: +{ + "default": false, + "type": "boolean" +}
- Changed
sap.repository.search1 field changed- changed
Input schema / properties / objectTypes / items / enumPrevious value: -[ - "FUNC", - "CLAS", - "TABL", - "PROG", - "INTF", - "DTEL", - "DDLS", - "DOMA", - "TTYP", - "ENQU", - "MSAG", - "FUGR", - "DEVC", - "TRAN", - "VIEW", - "SICF", - "WDYN", - "SPRX", - "XSLT", - "TRANSFORMATIONS", - "SUSH", - "SUSC", - "PINF", - "ENHC", - "ENHS", - "BADI", - "BADII", - "SAMC", - "SAPC", - "SFSW", - "SFBF", - "SFBS", - "JOBD", - "NROB", - "ENHO", - "SUSO", - "BDEF", - "SRVB" -]New value: +[ + "FUNC", + "CLAS", + "TABL", + "PROG", + "INTF", + "DTEL", + "DDLS", + "DCLS", + "DDLX", + "DDLA", + "DOMA", + "TTYP", + "ENQU", + "MSAG", + "FUGR", + "DEVC", + "TRAN", + "VIEW", + "SICF", + "WDYN", + "SPRX", + "XSLT", + "TRANSFORMATIONS", + "SUSH", + "SUSC", + "PINF", + "ENHC", + "ENHS", + "BADI", + "BADII", + "SAMC", + "SAPC", + "SFSW", + "SFBF", + "SFBS", + "JOBD", + "NROB", + "ENHO", + "SUSO", + "BDEF", + "SRVD", + "SRVB" +]
- Added
sap.runtime.feed.read - Changed
sap.source.read1 field changed- changed
Input schema / properties / objectType / enumPrevious value: -[ - "FUNC", - "CLAS", - "TABL", - "PROG", - "INTF", - "DTEL", - "DDLS", - "DOMA", - "TTYP", - "ENQU", - "MSAG", - "FUGR", - "DEVC", - "TRAN", - "VIEW", - "SICF", - "WDYN", - "SPRX", - "XSLT", - "TRANSFORMATIONS", - "SUSH", - "SUSC", - "PINF", - "ENHC", - "ENHS", - "BADI", - "BADII", - "SAMC", - "SAPC", - "SFSW", - "SFBF", - "SFBS", - "JOBD", - "NROB", - "ENHO", - "SUSO", - "BDEF", - "SRVB" -]New value: +[ + "FUNC", + "CLAS", + "TABL", + "PROG", + "INTF", + "DTEL", + "DDLS", + "DCLS", + "DDLX", + "DDLA", + "DOMA", + "TTYP", + "ENQU", + "MSAG", + "FUGR", + "DEVC", + "TRAN", + "VIEW", + "SICF", + "WDYN", + "SPRX", + "XSLT", + "TRANSFORMATIONS", + "SUSH", + "SUSC", + "PINF", + "ENHC", + "ENHS", + "BADI", + "BADII", + "SAMC", + "SAPC", + "SFSW", + "SFBF", + "SFBS", + "JOBD", + "NROB", + "ENHO", + "SUSO", + "BDEF", + "SRVD", + "SRVB" +]
47 tool updates
v1.0.1- Added
sap.artifact.mermaid.detect - Added
sap.artifact.mermaid.validate - Added
sap.data.export - Added
sap.debug.breakpoint.remove - Added
sap.debug.breakpoint.set - Added
sap.debug.evaluate - Added
sap.debug.session.inspect - Added
sap.debug.session.start - Added
sap.debug.session.stop - Added
sap.debug.stack - Added
sap.debug.step - Added
sap.debug.variables - Added
sap.git.unlink - Added
sap.ops.watch.start - Added
sap.quality.atc.documentation - Added
sap.quality.atc.run - Added
sap.quality.unit_test - Added
sap.rap.availability - Added
sap.rap.binding.inspect - Added
sap.rap.defaults - Added
sap.rap.generate - Added
sap.rap.preview - Added
sap.rap.schema - Added
sap.rap.validate - Added
sap.repository.search - Added
sap.runtime.dump.inspect - Added
sap.runtime.dump.list - Added
sap.runtime.trace.inspect - Added
sap.runtime.trace.list - Added
sap.runtime.trace.statements - Added
sap.semantic.quick_fixes - Added
sap.source.export - Added
sap.source.read - Added
sap.source.search - Added
sap.system.capabilities - Added
sap.system.discovery - Added
sap.transport.assess - Added
sap.transport.object.resolve - Added
sap.transport.user.list - Added
sap.ui.transaction_launch - Added
sap.ui.transaction_url - Added
sap.version.history.compare - Added
sap.version.history.list - Added
sap.version.history.read - Added
sap.version.inactive.list - Added
sap.version.inactive.read - Added
sap.version.restore.preview
114 tool updates
v1.0.0- Removed
abap_activate - Removed
abap_debug_breakpoint - Removed
abap_debug_session - Removed
abap_debug_stack - Removed
abap_debug_status - Removed
abap_debug_step - Removed
abap_debug_variable - Removed
abap_download - Removed
abap_fs_documentation - Removed
adt_discovery_export - Removed
analyze_abap_dumps - Removed
analyze_abap_traces - Removed
compare_abap_systems - Removed
create_mermaid_diagram - Removed
create_object_programmatically - Removed
create_test_documentation - Removed
create_test_include - Removed
detect_mermaid_diagram_type - Removed
execute_data_query - Removed
find_where_used - Removed
get_abap_dependency_graph - Removed
get_abap_diagnostics - Removed
get_abap_object_info - Removed
get_abap_object_lines - Removed
get_abap_object_workspace_uri - Removed
get_abap_sql_syntax - Removed
get_atc_decorations - Removed
get_batch_lines - Removed
get_mermaid_documentation - Removed
get_object_by_uri - Removed
get_version_history - Removed
inspect_abap_code - Removed
manage_abap_versions - Removed
manage_abapgit - Removed
manage_heartbeat - Removed
manage_rap_generator - Removed
manage_transport_requests - Removed
open_object - Removed
refactor_abap_code - Removed
replace_string_in_abap_object - Removed
run_abap_application - Removed
run_atc_analysis - Removed
run_sap_transaction - Removed
run_unit_tests - Added
sap.artifact.mermaid.create - Added
sap.artifact.test_document.create - Added
sap.data.query - Added
sap.debug.status - Added
sap.execution.execute - Added
sap.execution.health - Added
sap.execution.preview - Added
sap.git.branch.switch - Added
sap.git.check - Added
sap.git.create - Added
sap.git.inspect - Added
sap.git.list - Added
sap.git.pull - Added
sap.git.push - Added
sap.git.stage - Added
sap.ops.watch.history - Added
sap.ops.watch.status - Added
sap.ops.watch.stop - Added
sap.ops.watch.task.add - Added
sap.ops.watch.task.disable - Added
sap.ops.watch.task.enable - Added
sap.ops.watch.task.list - Added
sap.ops.watch.task.remove - Added
sap.ops.watch.task.update - Added
sap.ops.watch.trigger - Added
sap.ops.watch.watchlist.read - Added
sap.quality.atc.cached - Added
sap.quality.test_include.create - Added
sap.rap.binding.publish - Added
sap.rap.binding.unpublish - Added
sap.refactor.execute - Added
sap.refactor.preview - Added
sap.repository.compare - Added
sap.repository.create - Added
sap.repository.delete.execute - Added
sap.repository.delete.preview - Added
sap.repository.dependency_graph - Added
sap.repository.inspect - Added
sap.repository.resolve - Added
sap.repository.where_used - Added
sap.runtime.trace.configuration - Added
sap.runtime.trace.hit_list - Added
sap.semantic.complete - Added
sap.semantic.components - Added
sap.semantic.definition - Added
sap.semantic.documentation - Added
sap.semantic.format_preview - Added
sap.semantic.hierarchy - Added
sap.source.activate - Added
sap.source.diagnose - Added
sap.source.patch - Added
sap.source.read_batch - Added
sap.system.discovery.export - Added
sap.system.inspect - Added
sap.system.list - Added
sap.text_elements.read - Added
sap.text_elements.write - Added
sap.transport.compare - Added
sap.transport.create - Added
sap.transport.delete - Added
sap.transport.inspect - Added
sap.transport.list - Added
sap.transport.object.add - Added
sap.transport.owner.set - Added
sap.transport.release - Added
sap.transport.user.add - Added
sap.ui.object_url - Added
sap.version.restore.execute - Removed
search_abap_object_lines - Removed
validate_mermaid_syntax
9 tool updates
v0.4.15- Changed
abap_activate5 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / connectionIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / urlAdded value: +{ + "description": "One ABAP workspace URI to activate", + "minLength": 1, + "type": "string" +} - added
Input schema / properties / urlsAdded value: +{ + "description": "One through 100 same-connection ABAP workspace URIs to activate in one batch", + "items": { + "minLength": 1, + "type": "string" + }, + "maxItems": 100, + "minItems": 1, + "type": "array" +}
- Changed
create_object_programmatically2 fields changed- added
Input schema / properties / activate / descriptionAdded value: +"Activate after create-time source writing; currently supported only for BDEF/BDO" - added
Input schema / properties / source / descriptionAdded value: +"Create-time source; currently supported only for BDEF/BDO"
- Removed
get_abap_object_url - Removed
get_connected_systems - Removed
get_sap_capabilities - Removed
get_sap_system_info - Removed
manage_text_elements - Changed
manage_transport_requests7 fields changed- changed
Input schema / properties / action / enumPrevious value: -[ - "get_user_transports", - "get_transport_details", - "get_transport_objects", - "compare_transports", - "create_transport", - "release_transport", - "delete_transport", - "set_owner", - "add_user", - "add_object", - "list_system_users", - "resolve_object" -]New value: +[ + "get_user_transports", + "get_transport_details", + "get_transport_objects", + "assess_transport", + "compare_transports", + "create_transport", + "release_transport", + "delete_transport", + "set_owner", + "add_user", + "add_object", + "list_system_users", + "resolve_object" +] - added
Input schema / properties / checksAdded value: +{ + "default": [ + "atc", + "unit_tests" + ], + "items": { + "enum": [ + "atc", + "unit_tests", + "target_compare" + ], + "type": "string" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / failOnAtcWarningsAdded value: +{ + "default": false, + "type": "boolean" +} - added
Input schema / properties / maxObjectsAdded value: +{ + "default": 20, + "maximum": 200, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / reportDirectoryAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / reportFormatsAdded value: +{ + "default": [ + "json" + ], + "items": { + "enum": [ + "json", + "sarif", + "junit" + ], + "type": "string" + }, + "maxItems": 3, + "minItems": 1, + "type": "array" +} - added
Input schema / properties / targetConnectionIdAdded value: +{ + "minLength": 1, + "type": "string" +}
- Removed
search_abap_objects
1 tool update
v0.4.6- Changed
run_abap_application8 fields changed- added
Input schema / $schemaAdded value: +"http://json-schema.org/draft-07/schema#" - added
Input schema / properties / actionAdded value: +{ + "enum": [ + "repl_health", + "preview_class", + "preview_snippet", + "execute" + ], + "type": "string" +} - added
Input schema / properties / classNameAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / codeAdded value: +{ + "maxLength": 98304, + "minLength": 1, + "type": "string" +} - added
Input schema / properties / confirmationAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / connectionIdAdded value: +{ + "minLength": 1, + "type": "string" +} - added
Input schema / properties / planIdAdded value: +{ + "format": "uuid", + "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$", + "type": "string" +} - added
Input schema / requiredAdded value: +[ + "action", + "connectionId" +]
52 tool updates
v0.4.5- First observed
abap_activate - First observed
abap_debug_breakpoint - First observed
abap_debug_session - First observed
abap_debug_stack - First observed
abap_debug_status - First observed
abap_debug_step - First observed
abap_debug_variable - First observed
abap_download - First observed
abap_fs_documentation - First observed
adt_discovery_export - First observed
analyze_abap_dumps - First observed
analyze_abap_traces - First observed
compare_abap_systems - First observed
create_mermaid_diagram - First observed
create_object_programmatically - First observed
create_test_documentation - First observed
create_test_include - First observed
detect_mermaid_diagram_type - First observed
execute_data_query - First observed
find_where_used - First observed
get_abap_dependency_graph - First observed
get_abap_diagnostics - First observed
get_abap_object_info - First observed
get_abap_object_lines - First observed
get_abap_object_url - First observed
get_abap_object_workspace_uri - First observed
get_abap_sql_syntax - First observed
get_atc_decorations - First observed
get_batch_lines - First observed
get_connected_systems - First observed
get_mermaid_documentation - First observed
get_object_by_uri - First observed
get_sap_capabilities - First observed
get_sap_system_info - First observed
get_version_history - First observed
inspect_abap_code - First observed
manage_abap_versions - First observed
manage_abapgit - First observed
manage_heartbeat - First observed
manage_rap_generator - First observed
manage_text_elements - First observed
manage_transport_requests - First observed
open_object - First observed
refactor_abap_code - First observed
replace_string_in_abap_object - First observed
run_abap_application - First observed
run_atc_analysis - First observed
run_sap_transaction - First observed
run_unit_tests - First observed
search_abap_object_lines - First observed
search_abap_objects - First observed
validate_mermaid_syntax
TDQS
Scored across 5 tools
Each tool occupies a distinct phase: discovery (search), introspection (describe), and execution split by risk class (read/write/destructive). The three invoke tools share a description template and differ only by side-effect profile, so an agent could occasionally confuse write vs destructive if capability metadata is unclear.
All tool names use the same sap.capability.<action> dot-delimited convention, with snake_case for multiword actions. The pattern is predictable and consistent throughout.
Five tools are well-scoped for a capability broker: one search, one describe, and three execution variants by risk category. No tool feels redundant or missing.
The surface covers discovery, schema introspection, and invocation for read, write, and destructive operations, which is full lifecycle for a capability gateway. No obvious capability-broker operation is absent.
Maintenance
Related MCP Connectors
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Cloud-hosted MCP server for secure AI access to enterprise data sources via CData Connect AI.
Self-hosted MCP gateway: turn any API, database or MCP server into AI connectors — no code.
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
Related MCP Servers
- FlicenseBqualityNot gradedmaintenanceAn MCP server that enables AI assistants to interact with SAP systems via the ABAP Development Tools (ADT) REST API. It allows users to read ABAP source code, inspect DDIC objects, and execute SQL queries directly.66-

dassian-adtofficial
AlicenseNot gradedqualityDmaintenanceMCP server for SAP ABAP development via the ADT API. Connect AI assistants to your SAP system — read, write, test, and deploy ABAP code without SAP GUI.9MIT- AlicenseNot gradedqualityDmaintenanceA 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
- AlicenseNot gradedqualityCmaintenanceAn MCP server that connects AI assistants to SAP systems via the ADT REST API, enabling read, write, syntax-check, and activation of ABAP code directly from the chat.3MIT