{"_id":"@abapify/adt-mcp","_rev":"3-88ccde405b713b33bb91fdb803bd1959","name":"@abapify/adt-mcp","dist-tags":{"latest":"0.3.6"},"versions":{"0.0.0":{"name":"@abapify/adt-mcp","version":"0.0.0","_id":"@abapify/adt-mcp@0.0.0","maintainers":[{"name":"theplenkov-npm","email":"petr.plenkov@gmail.com"}],"dist":{"shasum":"2fecaf6c7c388d757d2609a5655b5dbae02cc952","tarball":"https://registry.npmjs.org/@abapify/adt-mcp/-/adt-mcp-0.0.0.tgz","fileCount":2,"integrity":"sha512-ObZ5DiU+DG1GMOWK6KI2VQ4XNI88qYoTnBxfTGSKyDWE5aKcGZAYGtSzTQ2/yVdNeunkAvMvGKhBbzKPy0QvfA==","signatures":[{"sig":"MEUCIQD8lurQOjSJPGFRwlhvvCTKcAbPjU3eZhQb4CVFnWvihQIgaZwDrWjQqNlTa5KHuN/y9D9MQ2kMQy5JtR3TmuIlOLI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":222},"_npmUser":{"name":"theplenkov-npm","email":"petr.plenkov@gmail.com"},"_npmVersion":"11.12.1","description":"Placeholder — real package is published via CI/CD (trusted publishing).","directories":{},"_nodeVersion":"24.10.0","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/adt-mcp_0.0.0_1776719602368_0.5442508918421751","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"name":"@abapify/adt-mcp","version":"0.3.5","keywords":["sap","adt","abap","mcp","model-context-protocol"],"license":"MIT","_id":"@abapify/adt-mcp@0.3.5","maintainers":[{"name":"theplenkov-npm","email":"petr.plenkov@gmail.com"}],"homepage":"https://github.com/abapify/adt-cli/tree/main/packages/adt-mcp#readme","bugs":{"url":"https://github.com/abapify/adt-cli/issues"},"bin":{"adt-mcp":"dist/bin/adt-mcp.mjs","adt-mcp-http":"dist/bin/adt-mcp-http.mjs"},"dist":{"shasum":"5e8fdf407e9e5a6a629279fced054c11ab92a887","tarball":"https://registry.npmjs.org/@abapify/adt-mcp/-/adt-mcp-0.3.5.tgz","fileCount":2,"integrity":"sha512-A37fkH8sLrydGEJNQyp/32+E7tbqKjIPkXq8dR4JNAuH0XtIZ4uuy0pXOo70ubMYpX6JRQ9ufZoqffGzchtIlg==","signatures":[{"sig":"MEUCIQD/g+Obu11BTHgIlYZ4rUeWgtNuiOL8DW0PQOAeHOPDpQIgKnTOV61heeweRbSdj1NH91uqqM/+Of+cmoUekALFfbo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abapify%2fadt-mcp@0.3.5","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":22390},"type":"module","types":"./dist/index.d.mts","exports":{".":"./dist/index.mjs","./mock":"./dist/mock.mjs","./bin/adt-mcp":"./dist/bin/adt-mcp.mjs","./package.json":"./package.json","./bin/adt-mcp-http":"./dist/bin/adt-mcp-http.mjs"},"gitHead":"185666fe6ccb304e7b08529eb376ec2493131a7a","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c000a7b5-9476-4c40-8072-91e39ad089ce"}},"repository":{"url":"git+https://github.com/abapify/adt-cli.git","type":"git","directory":"packages/adt-mcp"},"_npmVersion":"11.12.1","description":"MCP server for SAP ADT operations – exposes adt-cli features as MCP tools","directories":{},"_nodeVersion":"24.14.1","dependencies":{"zod":"^3.24.0","jose":"^6.2.1","@abapify/adk":"0.3.5","@xmldom/xmldom":"^0.9.9","@abapify/adt-cli":"0.3.5","@abapify/adt-rfc":"0.3.5","@abapify/adt-aunit":"0.3.5","@abapify/adt-locks":"0.3.5","@abapify/adt-client":"0.3.5","@abapify/adt-schemas":"0.3.5","@abapify/adt-fixtures":"0.3.5","@abapify/adt-contracts":"0.3.5","@modelcontextprotocol/sdk":"^1.27.0","@abapify/adt-plugin-abapgit":"0.3.5"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/adt-mcp_0.3.5_1776723694488_0.8601337844739239","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"name":"@abapify/adt-mcp","version":"0.3.6","description":"MCP server for SAP ADT operations – exposes adt-cli features as MCP tools","license":"MIT","publishConfig":{"access":"public"},"type":"module","types":"./dist/index.d.mts","bin":{"adt-mcp":"dist/bin/adt-mcp.mjs","adt-mcp-http":"dist/bin/adt-mcp-http.mjs"},"exports":{".":"./dist/index.mjs","./bin/adt-mcp":"./dist/bin/adt-mcp.mjs","./bin/adt-mcp-http":"./dist/bin/adt-mcp-http.mjs","./mock":"./dist/mock.mjs","./package.json":"./package.json"},"keywords":["sap","adt","abap","mcp","model-context-protocol"],"dependencies":{"@modelcontextprotocol/sdk":"^1.27.0","@abapify/adt-cli":"0.3.6","@abapify/adt-client":"0.3.6","@abapify/adt-contracts":"0.3.6","@abapify/adt-fixtures":"0.3.6","@abapify/adt-locks":"0.3.6","@abapify/adt-schemas":"0.3.6","@abapify/adk":"0.3.6","@abapify/adt-aunit":"0.3.6","@abapify/adt-plugin-abapgit":"0.3.6","@abapify/adt-rfc":"0.3.6","@xmldom/xmldom":"^0.9.9","jose":"^6.2.1","zod":"^3.24.0"},"repository":{"type":"git","url":"git+https://github.com/abapify/adt-cli.git","directory":"packages/adt-mcp"},"homepage":"https://github.com/abapify/adt-cli/tree/main/packages/adt-mcp#readme","bugs":{"url":"https://github.com/abapify/adt-cli/issues"},"gitHead":"489b2b4ad7c2ea972f323d4c356997ac5962ba9e","_id":"@abapify/adt-mcp@0.3.6","_nodeVersion":"24.14.1","_npmVersion":"11.11.0","dist":{"integrity":"sha512-mLbgAUHmE6n9Q0MyczSl2MS/mm+ZGOIeVcvUgpbN5Zdq7UA+zvXhKzYRLFeuSyJV3LMcFsvgi0qsR/LNM1Ya6A==","shasum":"48ad411f221e1ff0a1a348cf3aa2fd4956dd9537","tarball":"https://registry.npmjs.org/@abapify/adt-mcp/-/adt-mcp-0.3.6.tgz","fileCount":2,"unpackedSize":22390,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@abapify%2fadt-mcp@0.3.6","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDiVLplwqpNCdixGv8hcFGUucB7vFXJ8J4Naa/1dXbCpgIhAIIfwI5fQ3e9Jn9/lJ+IPik5s7Zspn+VriJUkg1t5VGL"}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:c000a7b5-9476-4c40-8072-91e39ad089ce"}},"directories":{},"maintainers":[{"name":"theplenkov-npm","email":"petr.plenkov@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/adt-mcp_0.3.6_1776744838352_0.8701425001025445"},"_hasShrinkwrap":false}},"time":{"created":"2026-04-20T21:13:22.291Z","modified":"2026-04-21T04:13:58.786Z","0.0.0":"2026-04-20T21:13:22.482Z","0.3.5":"2026-04-20T22:21:34.614Z","0.3.6":"2026-04-21T04:13:58.495Z"},"bugs":{"url":"https://github.com/abapify/adt-cli/issues"},"license":"MIT","homepage":"https://github.com/abapify/adt-cli/tree/main/packages/adt-mcp#readme","keywords":["sap","adt","abap","mcp","model-context-protocol"],"repository":{"type":"git","url":"git+https://github.com/abapify/adt-cli.git","directory":"packages/adt-mcp"},"description":"MCP server for SAP ADT operations – exposes adt-cli features as MCP tools","maintainers":[{"name":"theplenkov-npm","email":"petr.plenkov@gmail.com"}],"readme":"# @abapify/adt-mcp\n\nMCP (Model Context Protocol) server that exposes SAP ADT operations as structured tools for AI assistants, IDE integrations, and automation pipelines.\n\nThis package ships **two transports**:\n\n| Binary         | Transport                   | State model                                               |\n| -------------- | --------------------------- | --------------------------------------------------------- |\n| `adt-mcp`      | stdio (JSON-RPC over pipes) | Stateless — connection-per-call.                          |\n| `adt-mcp-http` | Streamable HTTP             | Session-scoped cached `AdtClient`, locks, and changesets. |\n\nSee [`docs/deployment/mcp-http.md`](../../docs/deployment/mcp-http.md) for the complete HTTP deployment guide (Docker, Okta, multi-system, troubleshooting). The rest of this README focuses on stdio.\n\n## Quick Start (stdio)\n\n```bash\n# Run via npx (no install required)\nnpx @abapify/adt-mcp\n```\n\n### Configure in Claude Desktop\n\nAdd to `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) or the equivalent path on your OS:\n\n```json\n{\n  \"mcpServers\": {\n    \"adt\": {\n      \"command\": \"npx\",\n      \"args\": [\"@abapify/adt-mcp\"]\n    }\n  }\n}\n```\n\n### Configure in VS Code (GitHub Copilot agent mode)\n\nAdd to `.vscode/mcp.json` in your workspace, or to your user settings under `\"mcp\"`:\n\n```json\n{\n  \"servers\": {\n    \"adt\": {\n      \"type\": \"stdio\",\n      \"command\": \"npx\",\n      \"args\": [\"@abapify/adt-mcp\"]\n    }\n  }\n}\n```\n\n### Configure in Cursor / Windsurf\n\nAdd to your MCP server list:\n\n```json\n{\n  \"mcpServers\": {\n    \"adt\": {\n      \"command\": \"npx\",\n      \"args\": [\"@abapify/adt-mcp\"]\n    }\n  }\n}\n```\n\n---\n\n## HTTP transport (since Wave 1)\n\n`adt-mcp-http` is the Streamable HTTP entry-point. It targets shared / remote deployments (Docker, Kubernetes, Kiro, teams).\n\nMinimal run:\n\n```bash\nbunx nx build adt-mcp\nnode packages/adt-mcp/dist/bin/adt-mcp-http.mjs --port 3000 --auth-token \"$(openssl rand -hex 32)\"\n```\n\nMinimal smoke test:\n\n```bash\nTOKEN=<your token>\ncurl -sf http://127.0.0.1:3000/healthz\ncurl -H \"Authorization: Bearer $TOKEN\" \\\n     -H 'Content-Type: application/json' \\\n     -X POST http://127.0.0.1:3000/mcp \\\n     -d '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"demo\",\"version\":\"0\"}}}'\n```\n\nCapture the `Mcp-Session-Id` response header, then call `sap_connect`, the tools you need, and finally `sap_disconnect` — or close the transport to trigger cleanup automatically.\n\n**Auth modes:** `none` (dev / loopback), `bearer` (shared secret), `proxy` (trust `x-forwarded-user` from an upstream proxy), `oauth` (OIDC JWT validation against Okta / Entra ID / Cognito). Full flag + env matrix in [`docs/deployment/mcp-http.md`](../../docs/deployment/mcp-http.md#cli-reference).\n\n### Session lifecycle tools\n\nOnly available on the HTTP transport:\n\n| Tool             | Purpose                                                                                                                                                               |\n| ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| `sap_connect`    | Perform the SAP security-session handshake once per MCP session. Accepts inline credentials or a `systemId` resolved against `SAP_SYSTEMS_JSON` / `SAP_SYSTEMS_FILE`. |\n| `sap_disconnect` | Release locks, DELETE the SAP security session, and drop the cached client.                                                                                           |\n\n### Transactional changesets (since Wave 3)\n\nBundle multiple ADT writes into a single atomic unit:\n\n| Tool                 | Purpose                                                                                                                      |\n| -------------------- | ---------------------------------------------------------------------------------------------------------------------------- |\n| `changeset_begin`    | Open a transactional unit-of-work bound to the current MCP session (one at a time).                                          |\n| `changeset_add`      | Stage an object write — acquires a lock and PUTs the supplied source. Defers activate.                                       |\n| `changeset_commit`   | Batch-activate every staged object in a single call, then release all locks.                                                 |\n| `changeset_rollback` | Release every held lock and mark the changeset rolled back. Source PUTs are not reverted (SAP has no transactional discard). |\n\nSee [`docs/deployment/mcp-http.md#transactional-changesets`](../../docs/deployment/mcp-http.md#transactional-changesets) for a worked example.\n\n---\n\n## Connection Parameters\n\nEvery tool requires these connection parameters (passed per-call, never stored):\n\n| Parameter  | Type   | Required | Description                                                    |\n| ---------- | ------ | -------- | -------------------------------------------------------------- |\n| `baseUrl`  | string | ✅       | SAP system base URL, e.g. `https://my-system.example.com:8000` |\n| `client`   | string | —        | SAP client number, e.g. `100`                                  |\n| `username` | string | —        | Username for basic auth                                        |\n| `password` | string | —        | Password for basic auth                                        |\n\n> **Security note:** credentials are forwarded directly to the SAP system per request. The MCP server holds no state and persists no credentials.\n\n---\n\n## Tools Reference\n\n### Discovery & System\n\n#### `discovery`\n\nDiscover available ADT services on the SAP system. Useful for checking what endpoints the system supports before using other tools.\n\n**Parameters:** connection only\n\n**Returns:** JSON object with available service collections and their links.\n\n---\n\n#### `system_info`\n\nGet SAP system and/or session information.\n\n**Parameters:**\n\n| Parameter | Type                                  | Default  | Description                  |\n| --------- | ------------------------------------- | -------- | ---------------------------- |\n| `scope`   | `\"session\"` \\| `\"system\"` \\| `\"both\"` | `\"both\"` | What information to retrieve |\n\n**Returns:**\n\n```json\n{\n  \"session\": { \"user\": \"DEVELOPER\", \"client\": \"100\", \"language\": \"EN\", ... },\n  \"system\": { \"systemId\": \"DEV\", \"release\": \"757\", ... }\n}\n```\n\n---\n\n### Object Repository\n\n#### `search_objects`\n\nSearch for ABAP objects in the repository. Supports wildcards.\n\n**Parameters:**\n\n| Parameter    | Type   | Default | Description                             |\n| ------------ | ------ | ------- | --------------------------------------- |\n| `query`      | string | ✅      | Search term, e.g. `ZCL_*` or `MY_CLASS` |\n| `maxResults` | number | `50`    | Maximum number of results               |\n\n**Returns:**\n\n```json\n{\n  \"count\": 3,\n  \"objects\": [\n    { \"name\": \"ZCL_MY_CLASS\", \"type\": \"CLAS/OC\", \"uri\": \"/sap/bc/adt/oo/classes/zcl_my_class\", ... }\n  ]\n}\n```\n\n---\n\n#### `get_object`\n\nGet details about a specific ABAP object by name. Performs an exact-match search and returns the object metadata plus a list of similar objects if no exact match is found.\n\n**Parameters:**\n\n| Parameter    | Type   | Description                 |\n| ------------ | ------ | --------------------------- |\n| `objectName` | string | ABAP object name to look up |\n\n**Returns:**\n\n```json\n{ \"found\": true, \"object\": { \"name\": \"ZCL_MY_CLASS\", \"type\": \"CLAS/OC\", \"uri\": \"...\", ... } }\n```\n\nor, when not found:\n\n```json\n{ \"found\": false, \"message\": \"Object 'FOO' not found\", \"similar\": [...] }\n```\n\n---\n\n### Source Code\n\n#### `get_source`\n\nFetch the raw ABAP source code for a program, class, interface, or function group.\n\n**Parameters:**\n\n| Parameter    | Type    | Description                                                                              |\n| ------------ | ------- | ---------------------------------------------------------------------------------------- |\n| `objectName` | string  | ABAP object name                                                                         |\n| `objectType` | string? | Object type hint (`PROG`, `CLAS`, `INTF`, …). Skips the search round-trip when provided. |\n\n**Returns:** Plain ABAP source text.\n\n**Tip:** Always pass `objectType` when you already know it — it saves one network round-trip.\n\n---\n\n#### `update_source`\n\nWrite new ABAP source code to an existing object. Internally performs the full SAP ADT lock→PUT→unlock cycle.\n\n**Parameters:**\n\n| Parameter    | Type    | Description                                                   |\n| ------------ | ------- | ------------------------------------------------------------- |\n| `objectName` | string  | ABAP object name                                              |\n| `objectType` | string? | Object type hint                                              |\n| `sourceCode` | string  | New ABAP source code                                          |\n| `transport`  | string? | Transport request number (required for transportable objects) |\n\n**Returns:**\n\n```json\n{ \"status\": \"updated\", \"object\": \"ZCL_MY_CLASS\" }\n```\n\n> ⚠️ **Always activate after updating** — inactive source is not compiled and cannot be executed.\n\n---\n\n#### `get_test_classes`\n\nRetrieve the test class definitions (`FOR TESTING`) embedded in an ABAP class. Returns the raw source of the testclasses include.\n\n**Parameters:**\n\n| Parameter   | Type   | Description                          |\n| ----------- | ------ | ------------------------------------ |\n| `className` | string | ABAP class name, e.g. `ZCL_MY_CLASS` |\n\n**Returns:** Plain ABAP source of the local test class include.\n\n---\n\n### Activation & Syntax\n\n#### `activate_object`\n\nActivate one or more ABAP objects. Supports single-object and batch modes.\n\n**Single object mode:**\n\n| Parameter    | Type   | Description                             |\n| ------------ | ------ | --------------------------------------- |\n| `objectName` | string | ABAP object name                        |\n| `objectType` | string | Object type (`PROG`, `CLAS`, `INTF`, …) |\n\n**Batch mode:**\n\n| Parameter | Type                              | Description                        |\n| --------- | --------------------------------- | ---------------------------------- |\n| `objects` | `Array<{objectName, objectType}>` | Objects to activate in one request |\n\n**Returns:**\n\n```json\n{ \"status\": \"activated\", \"count\": 2, \"objects\": [{ \"name\": \"ZCL_FOO\", \"type\": \"CLAS\" }, ...] }\n```\n\n---\n\n#### `check_syntax`\n\nRun an ABAP syntax check on an object and return structured check messages. Uses the `checkrun` schema — no XML parsing in tool code.\n\n**Parameters:**\n\n| Parameter    | Type                                  | Default    | Description                            |\n| ------------ | ------------------------------------- | ---------- | -------------------------------------- |\n| `objectName` | string                                | ✅         | ABAP object name                       |\n| `objectType` | string?                               | —          | Object type hint for faster resolution |\n| `version`    | `\"active\"` \\| `\"inactive\"` \\| `\"new\"` | `\"active\"` | Version to check                       |\n\n**Returns:**\n\n```json\n{\n  \"hasErrors\": false,\n  \"hasWarnings\": true,\n  \"reports\": [\n    {\n      \"reporter\": \"syntax\",\n      \"triggeringUri\": \"/sap/bc/adt/oo/classes/zcl_foo\",\n      \"checkMessageList\": {\n        \"checkMessage\": [{ \"type\": \"W\", \"shortText\": \"Variable X is unused\", ... }]\n      }\n    }\n  ]\n}\n```\n\n---\n\n### Unit Testing\n\n#### `run_unit_tests`\n\nRun ABAP Unit tests on an object or package and receive pass/fail counts broken down by test method.\n\n**Parameters:**\n\n| Parameter      | Type    | Default | Description                              |\n| -------------- | ------- | ------- | ---------------------------------------- |\n| `objectName`   | string  | ✅      | Object name (class, program, or package) |\n| `objectType`   | string? | —       | Type hint (`CLAS`, `PROG`, `DEVC`, …)    |\n| `withCoverage` | boolean | `false` | Whether to collect code coverage data    |\n\n**Returns:**\n\n```json\n{\n  \"totalTests\": 5,\n  \"passCount\": 4,\n  \"failCount\": 1,\n  \"errorCount\": 0,\n  \"programs\": [ ... ]\n}\n```\n\n---\n\n### Package Management\n\n#### `list_package_objects`\n\nList ABAP objects contained in a package. Uses `quickSearch` with a `packageName` filter.\n\n**Parameters:**\n\n| Parameter     | Type    | Default | Description                        |\n| ------------- | ------- | ------- | ---------------------------------- |\n| `packageName` | string  | ✅      | Package name, e.g. `ZPACKAGE`      |\n| `objectType`  | string? | —       | Filter by type (`CLAS`, `PROG`, …) |\n| `maxResults`  | number  | `200`   | Maximum result count               |\n\n**Returns:**\n\n```json\n{\n  \"packageName\": \"ZPACKAGE\",\n  \"count\": 12,\n  \"objects\": [{ \"name\": \"ZCL_FOO\", \"type\": \"CLAS/OC\", ... }]\n}\n```\n\n---\n\n### Change & Transport System (CTS)\n\n#### `cts_list_transports`\n\nList transport requests from the CTS.\n\n**Parameters:**\n\n| Parameter    | Type   | Default |\n| ------------ | ------ | ------- |\n| `maxResults` | number | `50`    |\n\n**Returns:** Array of transport request descriptors.\n\n---\n\n#### `cts_get_transport`\n\nGet details for a specific transport request.\n\n**Parameters:**\n\n| Parameter     | Type   | Description                         |\n| ------------- | ------ | ----------------------------------- |\n| `transportId` | string | Transport number, e.g. `DEVK900001` |\n\n**Returns:** Full transport descriptor including tasks and objects.\n\n---\n\n#### `cts_create_transport`\n\nCreate a new transport request.\n\n**Parameters:**\n\n| Parameter     | Type           | Default | Description                          |\n| ------------- | -------------- | ------- | ------------------------------------ |\n| `description` | string         | ✅      | Transport description                |\n| `type`        | `\"K\"` \\| `\"W\"` | `\"K\"`   | Workbench (`K`) or Customizing (`W`) |\n\n> 🚧 Not yet implemented — returns a clear error until the underlying client method is available.\n\n---\n\n#### `cts_release_transport`\n\nRelease a transport request.\n\n**Parameters:**\n\n| Parameter     | Type   | Description      |\n| ------------- | ------ | ---------------- |\n| `transportId` | string | Transport number |\n\n> 🚧 Not yet implemented.\n\n---\n\n#### `cts_delete_transport`\n\nDelete a transport request.\n\n**Parameters:**\n\n| Parameter     | Type   | Description      |\n| ------------- | ------ | ---------------- |\n| `transportId` | string | Transport number |\n\n---\n\n### ABAP Test Cockpit (ATC)\n\n#### `atc_run`\n\nRun ABAP Test Cockpit checks on an object or package and return the resulting findings worklist.\n\n**Parameters:**\n\n| Parameter   | Type   | Description                                                 |\n| ----------- | ------ | ----------------------------------------------------------- |\n| `objectUri` | string | ADT URI of the target, e.g. `/sap/bc/adt/packages/ZPACKAGE` |\n\n**Returns:**\n\n```json\n{ \"status\": \"completed\", \"worklist\": { ... } }\n```\n\n---\n\n## Common Workflows\n\n### Read → Edit → Save → Activate\n\n```\n1. get_source      objectName=ZCL_FOO objectType=CLAS\n2. update_source   objectName=ZCL_FOO objectType=CLAS sourceCode=\"...\" transport=DEVK900001\n3. check_syntax    objectName=ZCL_FOO objectType=CLAS version=inactive\n4. activate_object objectName=ZCL_FOO objectType=CLAS\n5. run_unit_tests  objectName=ZCL_FOO objectType=CLAS\n```\n\n### Explore a Package\n\n```\n1. list_package_objects packageName=ZPACKAGE\n2. get_object      objectName=ZCL_FOO\n3. get_source      objectName=ZCL_FOO objectType=CLAS\n```\n\n### Quality Gate\n\n```\n1. check_syntax objectName=ZCL_FOO objectType=CLAS\n2. atc_run      objectUri=/sap/bc/adt/oo/classes/zcl_foo\n3. run_unit_tests objectName=ZCL_FOO objectType=CLAS\n```\n\n---\n\n## Architecture\n\n```\n┌──────────────┐    stdio (JSON-RPC)   ┌──────────────────────────────┐\n│  MCP Client  │ ◄───────────────────► │  @abapify/adt-mcp            │\n│ (AI / IDE)   │                       │  McpServer (17 tools)        │\n└──────────────┘                       └──────────────┬───────────────┘\n                                                      │ calls\n                                       ┌──────────────▼───────────────┐\n                                       │  @abapify/adt-client         │\n                                       │  (typed contracts via speci) │\n                                       └──────────────┬───────────────┘\n                                                      │ HTTP/HTTPS\n                                       ┌──────────────▼───────────────┐\n                                       │  SAP System (ADT REST)       │\n                                       └──────────────────────────────┘\n```\n\n**Design principles:**\n\n- **No logic duplication** – tools delegate to `@abapify/adt-client` services.\n- **Schema-based serialisation** – request/response XML is handled via typed schemas from `@abapify/adt-schemas`. No manual XML building, no third-party XML parser.\n- **Structured JSON** – every tool returns JSON, never raw console output.\n- **Zod validation** – all tool inputs are validated before reaching the SAP system.\n- **Connection-per-call** – each tool call creates its own ADT client; the server is stateless.\n\n---\n\n## Programmatic Usage\n\n```typescript\nimport { createMcpServer } from '@abapify/adt-mcp';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\nconst server = createMcpServer();\nconst transport = new StdioServerTransport();\nawait server.connect(transport);\n```\n\n### Custom client factory (e.g. for testing or SSO)\n\n```typescript\nimport { createMcpServer } from '@abapify/adt-mcp';\n\nconst server = createMcpServer({\n  clientFactory: (params) =>\n    createAdtClient({\n      baseUrl: params.baseUrl,\n      username: params.username ?? '',\n      password: params.password ?? '',\n      client: params.client,\n    }),\n});\n```\n\n---\n\n## Testing\n\nIntegration tests use Node.js native test runner (`node:test`) and a built-in mock ADT server that needs no SAP system.\n\n```bash\n# Run all integration tests\ncd packages/adt-mcp\nnode --test --import tsx tests/integration.test.ts\n```\n\n### Using the mock server in your own tests\n\n```typescript\nimport { createMockAdtServer } from '@abapify/adt-mcp/mock';\n\nconst mock = createMockAdtServer();\nconst { port } = await mock.start();\n// ... test against http://localhost:${port}\nawait mock.stop();\n```\n\n---\n\n## Development\n\n```bash\nbunx nx build adt-mcp      # build\nbunx nx typecheck adt-mcp  # type check\nbunx nx lint adt-mcp       # lint\nbunx nx test adt-mcp       # tests (runs integration suite)\n```\n\n---\n\n## Feature Parity Map\n\n| CLI Command            | MCP Tool                | Status     |\n| ---------------------- | ----------------------- | ---------- |\n| `adt discovery`        | `discovery`             | ✅         |\n| `adt info`             | `system_info`           | ✅         |\n| `adt search`           | `search_objects`        | ✅         |\n| `adt get`              | `get_object`            | ✅         |\n| `adt source get`       | `get_source`            | ✅         |\n| `adt source put`       | `update_source`         | ✅         |\n| `adt activate`         | `activate_object`       | ✅         |\n| `adt check`            | `check_syntax`          | ✅         |\n| `adt aunit run`        | `run_unit_tests`        | ✅         |\n| `adt atc run`          | `atc_run`               | ✅         |\n| `adt cts tr list`      | `cts_list_transports`   | ✅         |\n| `adt cts tr get`       | `cts_get_transport`     | ✅         |\n| `adt cts tr delete`    | `cts_delete_transport`  | ✅         |\n| `adt cts tr create`    | `cts_create_transport`  | 🚧 Not yet |\n| `adt cts tr release`   | `cts_release_transport` | 🚧 Not yet |\n| `adt ls`               | —                       | 🔜 Future  |\n| `adt cts search`       | —                       | 🔜 Future  |\n| `adt import package`   | —                       | 🔜 Future  |\n| `adt import transport` | —                       | 🔜 Future  |\n","readmeFilename":"README.md"}