{"ref":"artifact:maherd18-sap-mcp-server","page":"/artifacts/maherd18-sap-mcp-server","json":"/artifacts/maherd18-sap-mcp-server.json","generated":"2026-10-26","drafted_with_ai":true,"entity":{"id":"maherd18-sap-mcp-server","name":"Maherd18/sap-mcp-server","artifact_type":"mcp-server","ecosystem":"abap","domain":"ai-and-agents","secondary_domains":["security-and-compliance"],"origin_ring":"independent","description":{"one_line":"An MCP server for ABAP development over [the ADT resources](artifact:sap-adt): eight tools, each checked against a JSON policy file before the call reaches the system, with activation and transport release held for a person to approve.","short":"Policy-checked MCP server for ABAP development over ADT","what_it_solves":"Eight tools sit over [the ADT resources](artifact:sap-adt): `sap_test_connection`, `sap_search_objects`, `sap_read_metadata`, `sap_read_source` and `sap_list_transports` read, and `sap_write_source`, `sap_activate` and `sap_release_transport` change. Every one of them is checked against a JSON policy file first, which carries allow-lists for packages, namespaces and ADT object types, a `writeEnabled` switch that turns the whole server read-only, approval for activation and transport release, and a rule that keeps a developer off their own transport; anything not explicitly allowed is denied, an object the server cannot resolve included, and an object's real type, package and owner are read out of SAP rather than taken from the agent's arguments. A denied call comes back with the rule that denied it, from `package_not_allowed` to `self_approval`, and every decision and result is appended to a JSON Lines audit log that keeps `decision` and `effective` apart, so a policy can run in `dry-run` and be watched before it is enforced. It is plain Node.js with no dependencies, which the README says is on purpose for something that has write access to a development system, and runs from [Docker](external:docker), `npx` or a checkout, speaks stdio only, and reaches the system with basic credentials taken from the environment. Where [SuperClaude for SAP](artifact:babamba2-superclaude-for-sap) governs which system an agent is pointed at, the boundary here is drawn inside one system and around a package: the shipped policy allows writes in `ZMCP_SANDBOX` and nowhere else, and a setup script creates that package.","when_not_to_use":"Development and sandbox systems only: the README warns against pointing it at production. Transport release is never executed, since the tool exists to show the policy stopping it, and separation of duties is checked against the `identity.approvers` list in the policy file rather than against SAP authorisations, so it holds as far as that file does and no further. The write path has been tested with ABAP classes and other object types may need adjustments, there is deliberately no tool that creates or deletes an object, and one server instance serves one SAP system."},"links":{"repo":"https://github.com/Maherd18/sap-mcp-server"},"identity":{"license":"MIT"},"source_available":true,"compat":{"runtimes":["node"]},"agent":{"source":{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Quick start and Client setup","checked":"2026-10-03"},"install":"npx -y github:Maherd18/sap-mcp-server","config_snippet":"{\n  \"mcpServers\": {\n    \"sap-adt\": {\n      \"command\": \"docker\",\n      \"args\": [\n        \"run\", \"-i\", \"--rm\",\n        \"--env-file\", \"/absolute/path/to/.env\",\n        \"-v\", \"sap-mcp-audit:/data\",\n        \"ghcr.io/maherd18/sap-mcp-server:latest\"\n      ]\n    }\n  }\n}","pitfalls":["npx runs the server from the npm cache, so a `.env` file in the current directory is not read: the README says to pass the credentials as environment variables and to set `SAP_MCP_AUDIT_FILE` and `SAP_MCP_POLICY_FILE` to absolute paths.","The default policy allows writes in the package `ZMCP_SANDBOX` only, and `npm run setup:sandbox -- --create` is what creates it.","The ADT services have to be active on the system (`/sap/bc/adt` in transaction SICF), or `/sap/bc/adt/discovery` answers 404."]},"type_properties":{"runs":{"value":["local-process"],"sources":[{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README","checked":"2026-10-03","quote":"**Zero dependencies.** Plain Node.js, runs via Docker or `npx`."},{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Quick start","checked":"2026-10-03","quote":"**npx** (Node.js 22 or later, credentials as environment variables)"}]},"transports":{"value":["stdio"],"sources":[{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Quick start","checked":"2026-10-03","quote":"# run the server (MCP over stdio, so -i is required)"},{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Development","checked":"2026-10-03","quote":"server.mjs       MCP entry point (JSON-RPC over stdio)"}]},"auth":{"value":["basic"],"sources":[{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Security","checked":"2026-10-03","quote":"**Use HTTPS.** With plain HTTP, basic auth sends credentials only base64-encoded."}]},"read_only":{"value":false,"source":{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Tools","checked":"2026-10-03","quote":"| `sap_write_source` | write | Replaces the source of an existing object (lock, write, unlock) |"}},"guardrails":[{"source":{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README","checked":"2026-10-03","quote":"**Package, namespace and object type allow-lists.** `$TMP` and SAP standard objects are off-limits by default."}},{"source":{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README","checked":"2026-10-03","quote":"**Read-only switch.** One setting turns off all writes."}},{"source":{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README","checked":"2026-10-03","quote":"**Human approval** for activation and transport release. The agent gets an approval request, nothing is executed."}},{"source":{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README","checked":"2026-10-03","quote":"**Separation of duties.** The developer can't approve their own transport."}},{"source":{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README","checked":"2026-10-03","quote":"**Audit log** of every decision and result as JSON Lines."}},{"source":{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README","checked":"2026-10-03","quote":"**Dry-run mode** to try a new policy before enforcing it."}},{"source":{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README","checked":"2026-10-03","quote":"The agent can't talk its way around the policy, because the rules are read from a file it has no access to, and object details are looked up in SAP instead of trusted from the agent."}},{"source":{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Policy","checked":"2026-10-03","quote":"Anything not explicitly allowed is denied, including objects that can't be found."}},{"source":{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Policy","checked":"2026-10-03","quote":"The tool allow-list. A tool that isn't listed doesn't exist."}},{"source":{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Tools","checked":"2026-10-03","quote":"There is intentionally no tool to delete or create objects. People create objects, the agent changes existing ones."}},{"source":{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README","checked":"2026-10-03","quote":"Use this only against development or sandbox systems, never against production."}},{"source":{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Limitations","checked":"2026-10-03","quote":"Transport release is never executed; the tool exists to show that the policy stops it."}},{"source":{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Limitations","checked":"2026-10-03","quote":"Separation of duties checks against `identity.approvers` in the policy, not against SAP authorizations."}}]},"provides":[{"capability":"capability:agent-code-access","what_it_does":"Reads and changes ABAP development objects in a system over ADT for an agent, with reading confined to the allowed packages, namespaces and object types, writing confined further by one switch, and activation held for a person to approve.","sources":[{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README","checked":"2026-10-03","quote":"An [MCP](https://modelcontextprotocol.io) server that lets AI agents read and write SAP ABAP development objects through the ADT REST API, **with guardrails that live in the server**."},{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Tools","checked":"2026-10-03","quote":"| `sap_read_source` | read | Source code of an object |"}],"facets":[{"key":"read_source","value":true,"source":{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Tools","checked":"2026-10-03","quote":"| `sap_read_source` | read | Source code of an object |"}},{"key":"search_objects","value":true,"source":{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Tools","checked":"2026-10-03","quote":"| `sap_search_objects` | read | Searches repository objects by pattern |"}},{"key":"write_source","value":true,"source":{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Tools","checked":"2026-10-03","quote":"| `sap_write_source` | write | Replaces the source of an existing object (lock, write, unlock) |"}},{"key":"activate","value":true,"source":{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Tools","checked":"2026-10-03","quote":"| `sap_activate` | write | Activates an object, requires approval |"}},{"key":"transports","value":true,"source":{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Tools","checked":"2026-10-03","quote":"| `sap_list_transports` | read | Open transport requests of the user |"}},{"key":"create_objects","value":false,"source":{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Tools","checked":"2026-10-03","quote":"There is intentionally no tool to delete or create objects. People create objects, the agent changes existing ones."}}]},{"capability":"capability:tool-governance","what_it_does":"Decides what the agent may call before the call happens, out of a file the agent has no access to: allow-lists for packages, namespaces and ADT object types, one switch that turns off every write, approval required for activation and transport release, a separation-of-duties rule against a developer approving their own transport, a dry-run mode that records the decision without enforcing it, and a JSON Lines audit log of every decision and result.","sources":[{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README","checked":"2026-10-03","quote":"Every tool call is checked against a policy before anything reaches SAP: which packages, namespaces and object types the agent may touch, whether writes are enabled at all, and which actions need a human. Every decision is written to an audit log."},{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README","checked":"2026-10-03","quote":"The agent can't talk its way around the policy, because the rules are read from a file it has no access to, and object details are looked up in SAP instead of trusted from the agent."},{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Policy","checked":"2026-10-03","quote":"Anything not explicitly allowed is denied, including objects that can't be found."}]}],"requires":[{"ref":"artifact:sap-adt","requirement":"required","for":"the ADT services on the system every tool calls, which an administrator activates before the server can reach anything","sources":[{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Quick start","checked":"2026-10-03","quote":"You need an SAP system with the ADT services active (`/sap/bc/adt` in transaction SICF) and a development user."}]},{"ref":"external:docker","requirement":"conditional","condition":"the server is started from the published container image rather than with `npx` or from a checkout","for":"the container engine the published image runs in, which is the way the README recommends starting the server","sources":[{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Quick start","checked":"2026-10-03","quote":"**Docker (recommended)**"},{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README","checked":"2026-10-03","quote":"**Zero dependencies.** Plain Node.js, runs via Docker or `npx`."}]}],"connects":[{"ref":"external:abap-platform","interface":"adt","kind":"data","protocols":["http"],"direction":"outbound","style":"sync","for":"Reads and writes ABAP development objects in the system over its ADT resources, and looks an object's type, package and owner up there rather than trusting the agent's arguments.","sources":[{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README","checked":"2026-10-03","quote":"An [MCP](https://modelcontextprotocol.io) server that lets AI agents read and write SAP ABAP development objects through the ADT REST API, **with guardrails that live in the server**."},{"url":"https://raw.githubusercontent.com/Maherd18/sap-mcp-server/main/README.md","title":"Maherd18/sap-mcp-server — README, Configuration","checked":"2026-10-03","quote":"| `SAP_PROTOCOL` | `http` | `https` or `http` |"}]}],"maintainers":["actor:maherd18"],"provenance":{"discovered_via":[{"source":"source:curator"}],"first_seen":"2026-10-03"},"history":[{"date":"2026-10-03","field":"entry","from":null,"to":"created","reason":"Handed over as a URL. Behind the ABAP door because the objects it reads and changes are ABAP ones in a system reached over ADT. Two edges: [agent access to your code](capability:agent-code-access) for the eight tools over ADT, with `create_objects` entered as false because the README states that choice rather than leaving it out, and [tool governance](capability:tool-governance) for the policy file, the allow-lists, the read-only switch, the approval and separation-of-duties rules, the dry-run mode and the audit log, which the README's own opening makes the point of the server. [MCP servers](capability:mcp-servers) was considered and left off: that capability is a protocol adapter on a running application service, and this one helps somebody write code, which its own description sends here. No flavor is stated, since the README names no ABAP release or cloud edition; `tool_count` is left out because the README names no number, and the eight in the prose is a count of its own Tools table. The second [tool governance](capability:tool-governance) provider on the ABAP door, where the reading was community-only with one; the coverage note is left to revisit by hand."}],"drafted_with_ai":true,"contributors":["actor:maherd18"]},"effective_normative_relations":[],"readings":{"liveness":[{"label":"Maintenance","tier":"unknown","evidence":"no release data"},{"label":"Continuity","tier":"fair","evidence":"one contributor, personally owned"},{"label":"Repository","tier":"good","evidence":"pushed 2026-09, not archived"}],"compatibility":[{"label":"Declared for","tier":"fair","evidence":"nothing declared"},{"label":"Survived majors","tier":"unknown","evidence":"not read on ABAP: its lines run side by side"},{"label":"Maintainer's CI","tier":"good","evidence":"Docker image green, 2026-09-30"}],"practice":[{"label":"Tests","tier":"good","evidence":"3 test files"},{"label":"Docs","tier":"good","evidence":"README 12 KB"},{"label":"Changelog","tier":"good","evidence":"CHANGELOG in the repo"}],"reach":[{"value":null,"unit":"installs/week"},{"value":2,"unit":"watching"}]},"signals":{"crawled_at":"2026-10-25","npm":"not published under this name","stars":2,"forks":0,"open_issues":0,"archived":false,"pushed_at":"2026-09-30","license_spdx":"MIT","org_owned":false,"default_branch":"main","created_at":"2026-09-26T20:37:36Z","open_prs":0,"tree_truncated":false,"test_files":3,"workflows":2,"other_ci":false,"readme_bytes":12350,"docs_files":0,"changelog":true,"license_file":true,"dts_files":0,"first_commit":"2026-09-26","last_commit":"2026-09-30","commits":5,"contributors":1,"ci_status":"success","ci_run_at":"2026-09-30","ci_workflow":"Docker image","ci_event":"push","readme_path":"README.md","readme_sha":"556d477d173a115e81ef4dc0f496727051bdcda3","repo_read":"2026-10-25"},"release_notes":{"license":"MIT","quotable":true,"source":{"kind":"repo","path":"CHANGELOG.md","ref":"main","url":"https://github.com/Maherd18/sap-mcp-server/blob/main/CHANGELOG.md"},"format":"keep-a-changelog","releases":[{"version":"0.3.1","date":"2026-09-30","date_source":"heading","heading":"[0.3.1] - 2026-09-30","url":"https://github.com/Maherd18/sap-mcp-server/blob/main/CHANGELOG.md#031---2026-09-30","sections":[{"kind":"change","heading":"Changed","items":3},{"kind":"fix","heading":"Fixed","items":1}],"hash":"4d141fb6114fad92"},{"version":"0.3.0","date":"2026-09-26","date_source":"heading","heading":"[0.3.0] - 2026-09-26","url":"https://github.com/Maherd18/sap-mcp-server/blob/main/CHANGELOG.md#030---2026-09-26","sections":[{"kind":"feature","heading":"Added","items":7}],"hash":"3ffbba887f32dc38"}],"crawled_at":"2026-10-25"},"edges":{"maintainers":[{"ref":"actor:maherd18","name":"Maher Darweesh","json":"/actors/maherd18.json"}],"contributors":[{"ref":"actor:maherd18","name":"Maher Darweesh","json":"/actors/maherd18.json"}],"explained_by":[],"alternative_to_this":[],"needed_by":[],"available_via":[],"parts":[],"add_ons":[],"answered_through_parts":[]}}