MCP serverMCP servertypeExposes tools to a coding agent over MCP.See every one →What this type is →independently maintainedindependently maintainedoriginPublished by one person or a small company outside SAP. Says nothing about quality; the readings say that.See every one →

LISA

An MCP server that lets an AI client read and write the translations of ABAP repository objects through three tools, backed by an ABAP HTTP service on SAP's XCO i18n APIs.

LISA puts the translation of ABAP repository objects behind three tools: list the languages installed on the system, read every translatable text of an object in one language with a flag on the slots still empty, and write translations into a transport request. It covers data elements, domain fixed values, CDS views and their metadata extensions, message classes, class and function-group text pools, application log objects, business configuration objects and text tables, and it probes the connected system at startup to state in each tool's description which of them that system supports. The work happens in ZCL_I18N_SERVICE, an ABAP handler class in three per-platform variants, imported into the system and exposed as an HTTP service on the XCO i18n APIs. It runs as its own Cloud Foundry app with its own XSUAA login, authenticating through @arc-mcp/xsuaa-auth, or as an extension loaded into a running arc-1.

Facts

Last pushLicenceMIT

Where it sits

Lives in
Provides
LocalizationABAPLocalizationcapabilityServing labels, messages and translated content per user locale, including translatable model elements and per-tenant text overrides.
Requires
@arc-mcp/xsuaa-auth@arc-mcp/xsuaa-authartifactthe XSUAA OAuth proxy and BTP principal-propagation layer the server authenticates callers with and reaches SAP through
Optional
arc-1arc-1artifactonly for the second distribution, @lisa-mcp/arc1-extension, which loads the three tools into a running arc-1 instead of a server of its ownSAP Authorization and Trust Management serviceSAP Authorization and Trust Management serviceartifactthe XSUAA login that proves the caller's identity before the JWT is propagated to SAPSAP Destination serviceSAP Destination serviceartifactthe destination that carries the principal propagation from the caller to the ABAP systemSAP Connectivity serviceSAP Connectivity serviceartifactthe connection to an on-premise ABAP system the destination points atSAP BTP ABAP environmentSAP BTP ABAP environmentartifactThe ABAP handler class (ZCL_I18N_SERVICE) runs on the SAP BTP ABAP environment when that variant is chosen.ABAP platformABAP platformoutside the atlasThe ABAP handler needs the XCO i18n APIs available on ABAP Platform 2022+ to run.DockerDockeroutside the atlasThe server is packaged and run as a container image for self-hosted deployment.abapGitabapGitartifactabapGit reassembles the handler's three source files into the single class object when used to install it.SAP BTP, Cloud Foundry RuntimeSAP BTP, Cloud Foundry RuntimeartifactThe standalone server deploys as an MTA onto the Cloud Foundry runtime for production use.SAP Application Logging service for SAP BTPSAP Application Logging service for SAP BTPartifactWhen reactivated, the lisa-logs resource binds the deployed application to the BTP logging service.SAP S/4HANA Cloud Public EditionSAP S/4HANA Cloud Public Editionoutside the atlasThe BTP destination authenticates per-user propagation calls to an S/4HANA Cloud public backend using SAMLAssertion.SAP S/4HANASAP S/4HANAoutside the atlasThe ABAP handler needs the XCO i18n APIs available on S/4HANA 2022+ to run.

Who is behind it

Clément RingotClément RingotPersonMaintains this
In the atlas: maintains 2, contributes to 3
@ClementRingot
maintainerMarian ZeisPersonContributes to this
In the atlas: maintains 35, contributes to 86, wrote 25
@marianfoo
1 contributor

Before choosing this

Conditions

PracticalFunctional boundary

LISA does the translation step only: it does not discover objects or manage transports, and its README pairs it with an ADT MCP server for those. Every write needs a transport request, and which object types it can write differs between public cloud or the SAP BTP ABAP environment and on-premise or private cloud, and by release. Running it locally is meant for development and testing, not production.

What it declares

Every artifact

Type
MCP server
Origin
Independently maintained
Runtime
Node.js

As an MCP server

Runs as
central serverlocal process
Transport
HTTPstdio
Authentication
OAuth / OIDCprincipal propagationAPI keyuser and password
Tools
3
Read-only
nostates it is not

Connections15

LISA connectionsLISAPROVIDES→ provides1provides stated Reads and writes the translations of ABAP repository objects from an AI client, through SAP's XCO i18n APIs in an ABAP HTTP service it ships. ClementRingot/LISA — repository description: https://github.com/ClementRingot/LISA ClementRingot/LISA — README, The 3 tools: https://raw.githubusercontent.com/ClementRingot/LISA/main/README.mdLocalizationUSED BY← optionally used by1optionally used by derived If: the three translation tools are used the ABAP ICF service `ZCL_I18N_SERVICE` the three translation tools post to, imported from LISA Through: inverted from its requires edge arc-mcp/arc-1-extension-sample — README, Integrating LISA: https://raw.githubusercontent.com/arc-mcp/arc-1-extension-sample/main/README.mdarc-1-extension-sampleifNEEDS→ needs1needs stated the XSUAA OAuth proxy and BTP principal-propagation layer the server authenticates callers with and reaches SAP through ClementRingot/LISA — README: https://raw.githubusercontent.com/ClementRingot/LISA/main/README.md@arc-mcp/xsuaa-auth→ optionally needs12optionally needs stated If: the on-premise/private-cloud ABAP Platform variant of the handler is installed The ABAP handler needs the XCO i18n APIs available on ABAP Platform 2022+ to run. lisa: docs_page/abap-service-setup.md: https://raw.githubusercontent.com/ClementRingot/LISA/main/docs_page/abap-service-setup.mdABAP platformifoptionally needs stated If: installing the ABAP handler via abapGit rather than pasting it manually in ADT/SE24 abapGit reassembles the handler's three source files into the single class object when used to install it. lisa README: https://github.com/clementringot/lisaabapGitifoptionally needs stated If: LISA is loaded as the ARC-1 extension rather than run as its own server only for the second distribution, `@lisa-mcp/arc1-extension`, which loads the three tools into a running [arc-1](artifact:arc-mcp-arc-1) instead of a server of its own ClementRingot/LISA — README: https://raw.githubusercontent.com/ClementRingot/LISA/main/README.mdarc-1ifoptionally needs stated If: running the self-hosted Docker path instead of BTP or the ARC-1 extension The server is packaged and run as a container image for self-hosted deployment. lisa README: https://github.com/clementringot/lisaDockerifoptionally needs declared If: the lisa-logs resource is reactivated in an mtaext override; it is inactive by default When reactivated, the lisa-logs resource binds the deployed application to the BTP logging service. lisa: mta.yaml: https://raw.githubusercontent.com/ClementRingot/LISA/main/mta.yamlSAP Application Logging service for SAPBTPifoptionally needs stated If: deployed to SAP BTP Cloud Foundry, the production path the XSUAA login that proves the caller's identity before the JWT is propagated to SAP ClementRingot/LISA — README, Prerequisites: https://raw.githubusercontent.com/ClementRingot/LISA/main/README.md ClementRingot/LISA — README, Part 2: https://raw.githubusercontent.com/ClementRingot/LISA/main/README.mdSAP Authorization and Trust Managementserviceifoptionally needs stated If: the CLOUD platform variant of the ABAP handler is deployed to the SAP BTP ABAP environment The ABAP handler class (ZCL_I18N_SERVICE) runs on the SAP BTP ABAP environment when that variant is chosen. lisa README: https://github.com/clementringot/lisaSAP BTP ABAP environmentifoptionally needs stated If: deploying the standalone MCP server to SAP BTP The standalone server deploys as an MTA onto the Cloud Foundry runtime for production use. lisa README: https://github.com/clementringot/lisaSAP BTP, Cloud Foundry Runtimeifoptionally needs stated If: deployed to SAP BTP Cloud Foundry, the production path the connection to an on-premise ABAP system the destination points at ClementRingot/LISA — README, Prerequisites: https://raw.githubusercontent.com/ClementRingot/LISA/main/README.md ClementRingot/LISA — README, Part 2: https://raw.githubusercontent.com/ClementRingot/LISA/main/README.mdSAP Connectivity serviceifoptionally needs stated If: deployed to SAP BTP Cloud Foundry, the production path the destination that carries the principal propagation from the caller to the ABAP system ClementRingot/LISA — README, Prerequisites: https://raw.githubusercontent.com/ClementRingot/LISA/main/README.md ClementRingot/LISA — README, Part 2: https://raw.githubusercontent.com/ClementRingot/LISA/main/README.mdSAP Destination serviceifoptionally needs stated If: the SAP system is S/4HANA on-premise or private cloud, 2022 or later The ABAP handler needs the XCO i18n APIs available on S/4HANA 2022+ to run. lisa: docs_page/abap-service-setup.md: https://raw.githubusercontent.com/ClementRingot/LISA/main/docs_page/abap-service-setup.mdSAP S/4HANAifoptionally needs stated If: the destination's backend is S/4HANA Cloud public The BTP destination authenticates per-user propagation calls to an S/4HANA Cloud public backend using SAMLAssertion. lisa: docs_page/btp-destination-setup.md: https://raw.githubusercontent.com/ClementRingot/LISA/main/docs_page/btp-destination-setup.mdSAP S/4HANA Cloud Public Editionif

Install

npm add LISA

Derived from the package name. No recipe recorded; the README has the configuration.

Where LISA runsYour SAP BTP subaccountSAP cloudClementRingot/LISA — README, Configuration, checked 2026-10-04: “| `MCP_TRANSPORT` | `http-streamable` (default) or `stdio`. |”HTTP or stdiodocumentedrequiresdocumentedmay needif LISA is loaded as the ARC-1extension rather than run asits own serverdocumentedmay needif deployed to SAP BTP CloudFoundry, the production pathdocumentedmay needif deployed to SAP BTP CloudFoundry, the production pathdocumentedmay needif deployed to SAP BTP CloudFoundry, the production pathdocumentedmay needif the CLOUD platform variantof the ABAP handler isdeployed to the SAP BTP ABAP env…documentedmay needif theon-premise/private-cloud ABAPPlatform variant of the handler …documentedmay needif running the self-hostedDocker path instead of BTP orthe ARC-1 extensiondocumentedmay needif installing the ABAP handlervia abapGit rather thanpasting it manually in ADT/SE24documentedmay needif deploying the standaloneMCP server to SAP BTPdocumentedmay needif the lisa-logs resource isreactivated in an mtaextoverride; it is inactive by defa…documentedmay needif the destination's backendis S/4HANA Cloud publicdocumentedmay needif the SAP system is S/4HANAon-premise or private cloud,2022 or laterdocumentedHTTPoutbound, lands on ABAPDevelopment Tools (ADT) HTTP res…documentedoutboundif deployed as a Cloud Foundryapp on SAP BTPdocumentedoutboundif deployed as a Cloud Foundryapp on SAP BTPdocumentedoutboundYour MCP client, actorYour MCP clientABAP platform, SAP solutionABAP platformSAP solutionDocker, SoftwareDockerSoftwareSAP S/4HANA, SAP solutionSAP S/4HANASAP solutionLISA, moduleLISA@arc-mcp/xsuaa-auth, module@arc-mcp/xsuaa-autharc-1, modulearc-1abapGit, moduleabapGitSAP Authorization and Trust Management service, service instanceSAP Authorizationand TrustManagement serviceSAP Destination service, service instanceSAP DestinationserviceSAP Connectivity service, service instanceSAP ConnectivityserviceSAP BTP ABAP environment, service instanceSAP BTP ABAPenvironmentSAP BTP, Cloud Foundry Runtime, service instanceSAP BTP, CloudFoundry RuntimeSAP Application Logging service for SAP BTP, service instanceSAP ApplicationLogging servicefor SAP BTPSAP S/4HANA Cloud Public Edition, SAP solutionSAP S/4HANA Cloud PublicEditionSAP solution
SAPnot SAP's, or the project's ownauthenticationstated in the documentdocumented onlyunder a condition

README

quoted from ClementRingot/LISA under MIT, read
ClementRingot/LISA/README.mdOn GitHub

LISA — Localization & Internationalization Service for ABAP

npm npm ghcr.io CI Product release Publish extension node license MCP

Let AI assistants read, write and compare SAP object translations through a single, secure MCP server.

LISA (Localization & Internationalization Service for ABAP) is a Model Context Protocol (MCP) server that lets AI assistants (Claude, Cursor, VS Code, …) manage the translation of SAP repository objects — data elements, domains, CDS views, message classes, class/function-group text pools, and more — without leaving the chat.

For authentication and SAP BTP connectivity it builds on the same stack as ARC-1 — in fact it depends on the published @arc-mcp/xsuaa-auth package (the XSUAA OAuth proxy + BTP principal-propagation layer extracted from ARC-1) rather than re-implementing it, on the same Express / MCP-SDK transport. On top of that, instead of the full ADT toolset, it exposes 3 focused translation tools backed by a small ABAP HTTP service that wraps SAP's XCO i18n APIs.

LISA ships in two distributions from this one repo, sharing the same wire contract and ABAP handler — pick whichever fits how you already run things:

  • Standalone MCP server — its own Cloud Foundry app, its own XSUAA login. The primary, production-supported path. Published on npm as @lisa-mcp/server — consume it from npm (npx @lisa-mcp/server locally, or deploy to BTP via the bundled MTA template, no clone) or from a clone of this repo (develop / build from source). → Part 2.
  • ARC-1 extension — if you already run ARC-1, load LISA's 3 tools in-process instead: no second app, no second URL, no second XSUAA — you reuse ARC-1's authenticated SAP client and per-user principal propagation. Published on npm as @lisa-mcp/arc1-extension. → Part 3.

Running it locally (Part 4) is also fully supported, but meant for development and testing, not production.

No MCP client at all? A BTP runtime (Joule Studio action, CAP service, SAP Build) can call the underlying ABAP API (zi18n_service) directly — no LISA Node layer — through a BTP destination that carries the auth (per-user propagation or a shared user). You get the same 3 operations over plain JSON. See BTP destination setup, the OpenAPI spec (import as a Joule Studio action), and the API-usage skill.


How it works

┌──────────────┐   MCP/HTTP    ┌────────────────────┐   HTTPS (JSON)    ┌──────────────────────────┐
│  AI assistant│ ────────────> │  LISA MCP          │ ───────────────>  │  SAP ABAP system         │
│ (Claude/IDE) │   3 tools     │(Node.js, this repo)│  /zi18n_service   │  ZCL_I18N_SERVICE        │
└──────────────┘ <──────────── └────────────────────┘ <───────────────  │  → XCO i18n APIs         │
                                                                        └──────────────────────────┘

There are two halves to a working setup:

  1. The ABAP service — a handler class (ZCL_I18N_SERVICE, three per-platform variants) that you import into your SAP system and expose as an ABAP HTTP service. It does the actual translation work using the XCO i18n APIs. → see abap/ and docs: ABAP service setup.
  2. The MCP server — this Node.js project. It authenticates the caller, propagates their identity to SAP, and translates MCP tool calls into HTTP calls to the ABAP service.

The 3 tools

ToolWhat it does
TranslateListLanguagesList all languages installed on the SAP system.
TranslateGetTextsRead all translatable texts of an object in a given language (or its original language when none is given). Each slot comes back with its full key (level, field_name, position, attribute), its value, and a populated flag (false = empty in this language = still to translate).
TranslateSetTextsWrite/update translations (requires a transport request). Each text entry may carry its own field_name/position, so all fields of one CDS view (e.g. every ui_lineitem_label) are written in a single call — locking the object only once.

Discover / list / compare all collapse into TranslateGetTexts: read with no language to see the original-language slots, keep populated === true to list only filled texts, and call it once per language and diff on (key, populated, value) to compare.

Supported object types (target_type)

This is the full catalog of object types LISA understands — XCO semantic literals, not DDIC short codes. Which of them are actually available depends on the target system: public cloud / BTP ABAP Environment and on-premise / private cloud support different types per operation, and the set can also differ by system version. LISA probes the connected backend at startup and states the concrete per-operation list in each tool's description (a target_type the system doesn't support is rejected up-front).

target_typeSAP objectTypical attributes
cds_entityCDS entity — merged view + DDLXeverything below for both objects, each row tagged owner
data_elementData element (DTEL)short_field_label, medium_field_label, long_field_label, heading_field_label
domainDomain fixed-value texts (DOMA)fixed_value_description
data_definitionCDS view (DDLS) entity/field labelsendusertext_label
message_classMessage class (MSAG)message_short_text
text_poolClass / function-group text symbolstext symbol values
metadata_extensionCDS metadata extension (DDLX) UI labelsendusertext_label
application_log_objectApplication log object (APLO)object / sub-object texts
business_configuration_objectBusiness configuration object (SMBC)description texts
text_tableText table (delivery class C/S DB table with one LANG key field, e.g. T005T)its non-key character columns, e.g. LANDX

Text tables (text_table): a database table whose delivery class is C or S and that has exactly one language key field (LANG, e.g. SPRAS) is a translatable text table — its non-key character columns (e.g. LANDX on T005T) are the text attributes. Beyond the usual params it takes language_key_field_name (the LANG key field, e.g. SPRAS) and master_key_fields ([{ name, value }] fixing all master keys — every key except the language field — so a single record is targeted, e.g. [{ "name": "LAND1", "value": "DE" }]). On write, each texts entry's attribute is a text column name (e.g. LANDX), not a UI label. A table with no language field (e.g. delivery class W) is rejected by XCO.

CDS views & metadata extensions: a CDS view's UI labels are frequently defined (or overridden) in a separate metadata extension (DDLX). Use cds_entity (a virtual, LISA-only target — not a backend type) to treat one named entity and its own DDLX as a single translation surface: a single TranslateGetTexts returns the view (data_definition) and its DDLX (metadata_extension) together — the DDLX labels come back without a separate metadata_extension call — and stamps every CDS row with an owner ("data_definition" or "metadata_extension"). On write, pass each row's owner back: LISA groups by it and writes each group to its physical object in one call (so the view and the DDLX are each locked/transported once); a cds_entity write with any row missing owner is rejected. Positional UI labels round-trip as the bare attribute (e.g. ui_lineitem_label) plus a separate position (1-based); the index is never renumbered. Writes are not atomic across the two objects, so the result reports per-owner outcomes. The single-object data_definition and metadata_extension targets remain available to address one object explicitly.

cds_entity is per-entity, not per-stack. It covers the named entity + its DDLX only — it does not reach the underlying/parent views of an as projection on chain (e.g. the interface view ZI_… behind a projection ZC_…, which carries its own @EndUserText.label). Translate a RAP stack with one cds_entity pass per distinct entity (one view = one call). cds_entity works with or without a DDLX; for a single view with no DDLX, data_definition direct is cleaner (it skips the empty DDLX sub-call).


Use it alongside an ADT MCP server

LISA is focused on the translation step — it deliberately does not discover objects or manage transports. For an interactive, AI-driven workflow it is designed to be used next to an ADT MCP server — SAP's own ABAP MCP Server shipped with ADT for VS Code, or ARC-1 — which provides the surrounding capabilities:

  • object discovery — find the data element / CDS view / message class to translate;
  • transport handling — locate or create the transport request that TranslateSetTexts requires;
  • inspection — read the object before translating it.

Typical division of labour: the ADT MCP finds the object and a transport → LISA reads, writes and compares its translations. On its own, LISA still works whenever the object name and transport are already known (e.g. batch or scripted translation).

This describes two separate MCP servers talking to the same AI assistant. If your "ADT MCP" is ARC-1, you can skip running LISA as a second server altogether and load its tools inside ARC-1 instead — see Part 3 — Use as an ARC-1 extension.


Prerequisites

  • An SAP system with the XCO i18n APIs available (S/4HANA 2022+ / ABAP Platform 2022+ / ABAP Cloud) and the new HTTP handler model (IF_HTTP_SERVICE_EXTENSION). XCO i18n docs per landscape: ABAP Platform (on-premise / private cloud) · S/4HANA Public Cloud · SAP BTP ABAP Environment.
  • Authorization to import a class and create an ABAP HTTP service (ADT). On-premise / private cloud also needs rights to enable it via UCON_HTTP_SERVICES; on BTP ABAP Environment / public cloud the endpoint activates automatically with the HTTP Service object — no communication scenario needed.
  • Node.js 22.x to run the MCP server.
  • For production: an SAP BTP subaccount (Cloud Foundry) with XSUAA, Destination and Connectivity services.

Part 1 — Install the ABAP service

The ABAP handler to copy into your target SAP system lives in abap/, in three platform folders — pick the one that matches your stack. Each class is fully self-contained (the JSON/parameter helpers are inlined, no external utility class to import alongside it), but spans three files — the global class plus two local-types includes that define lcl_slot_visitor (an XCO CDS-annotation visitor used for positional UI labels):

FolderObjectUse when
abap/ABAP_PLATFORM_2022/ZCL_I18N_SERVICEOn-premise / private cloud on ABAP Platform 2022 (7.57) — original XCO i18n surface.
abap/ABAP_PLATFORM_2025/ZCL_I18N_SERVICEOn-premise / private cloud on ABAP Platform 2025 (newer releases) — newer XCO i18n surface (positional entity texts, Fiori launchpad targets).
abap/CLOUD/ZCL_I18N_SERVICESAP BTP ABAP Environment / public cloud (Steampunk) — Cloud-API-compliant variant.

With abapGit the three files of the folder you pick reassemble into the single class object automatically — drop them into a linked package and pull. With ADT / SE24, paste the three parts into their respective tabs before activating: *.clas.abap → Global Class, *.clas.locals_def.abap → Class-relevant Local Types (CCDEF), *.clas.locals_imp.abap → Local Types (CCIMP). Skipping the local-types parts leaves lcl_slot_visitor undefined and the class won't activate.

All three are named ZCL_I18N_SERVICE (separated by folder, not class name), implement IF_HTTP_SERVICE_EXTENSION, route actions from the URL path, and speak the same wire contract — they differ only in the XCO i18n API surface available on each release. Import the class from the folder for your platform, create an ABAP HTTP service whose handler class is that class, and enable it (UCON_HTTP_SERVICES on-premise / private cloud; on ABAP Environment the endpoint activates automatically with the HTTP Service object — no communication scenario). Point the MCP at its URL (default /sap/bc/http/sap/zi18n_service).

👉 Full step-by-step instructions: docs: ABAP service setup.


This is the main way to run LISA. It deploys to Cloud Foundry as an MTA and uses XSUAA for authentication only — there are no scopes, role templates or role collections. XSUAA proves the caller's identity; the JWT is propagated to SAP (principal propagation via the Destination + Connectivity services), and SAP's own authorization objects decide what each user may read, write or translate. Every authenticated user gets all 3 tools.

npm install
npm run build
mbt build           # produces mta_archives/lisa_<version>.mtar (version from mta.yaml)
cf deploy mta_archives/lisa_<version>.mtar
# or in one step, with your landscape overrides applied: npm run btp:build-deploy-dev

No clone needed — deploy from npm. The server is published as @lisa-mcp/server, which ships a ready-made MTA template (templates/mta/): a 3-file deploy project whose nodejs module just npm installs the published package — same XSUAA/Destination resources, and upgrading LISA is a version bump. See docs: BTP deployment — deploy from npm.

Then set the DCR signing secret (one-off) and point your MCP client at the deployed URL:

cf set-env lisa-mcp LISA_DCR_SIGNING_SECRET "$(openssl rand -base64 48)"
cf restage lisa-mcp
{
  "mcpServers": {
    "lisa": { "url": "https://lisa-<space>.<domain>/mcp" }
  }
}

The client is redirected through XSUAA login on first use; its identity is then propagated to SAP per call.

👉 Full guide: docs: BTP deployment · docs: authentication · the mta.yaml / xs-security.json.

Why LISA_DCR_SIGNING_SECRET? Without it the OAuth dynamic-client store signs with the XSUAA clientsecret, which cf deploy rotates — invalidating all cached MCP client registrations on every deploy. It's a secret, so it lives in cf set-env, not mta.yaml.


Part 3 — Use as an ARC-1 extension

Already run ARC-1? You don't need a second CF app for LISA. packages/arc1-extension packages the same 3 tools as Custom_TranslateListLanguages / Custom_TranslateGetTexts / Custom_TranslateSetTexts, loaded in-process by ARC-1 via ARC1_PLUGINS — they reach SAP through ARC-1's own gated ctx.http.post, so there is no second auth stack and no second URL to operate.

Pick the…when
Standalone server (Part 2)You want LISA reachable as its own MCP endpoint/URL, with its own XSUAA login, independent of any ARC-1 deployment.
ARC-1 extension (this Part)You already run ARC-1 and want LISA's tools to appear inside it — reusing ARC-1's authenticated SAP client, safety ceiling, scope policy, audit, and per-user principal propagation. Two CF apps (arc1 + lisa) become one.

Install it from npm, or build from source:

npm install @lisa-mcp/arc1-extension                    # → node_modules/@lisa-mcp/arc1-extension/dist/index.js
# — or build from source —
git clone https://github.com/ClementRingot/LISA.git && cd LISA
npm ci
npm run build --workspace packages/arc1-extension   # → packages/arc1-extension/dist/index.js

npm run build bundles the plugin into a single self-contained ESM file (packages/arc1-extension/dist/index.js, ~24 KB) via esbuild — @lisa-mcp/core is inlined and only arc-1/public and zod stay external (both provided by the host ARC-1 process). That file is ready to load as-is; no manual bundling step is needed.

Point an existing ARC-1 instance at the built plugin (env vars on the ARC-1 side):

ARC1_PLUGINS=/abs/path/to/lisa/dist/index.js
SAP_ALLOW_WRITES=true
SAP_ALLOW_PLUGIN_RAW_WRITES=true   # required even for the read-only tools — see the guide below

The ABAP service (Part 1) still installs the same way either distribution you pick — only who performs the HTTP call differs.

👉 Full guide (Docker/buildpack deploy, the SAP_ALLOW_PLUGIN_RAW_WRITES rationale, troubleshooting): docs: ARC-1 extension deployment.


Part 4 — Run locally (development & testing)

For local development you connect directly to SAP (BasicAuth) — no BTP services involved. This path is for trying things out and developing the server; production should run on BTP (Part 2) or inside ARC-1 (Part 3).

Fastest — straight from npm (no clone; a .env in the current directory is picked up):

npx @lisa-mcp/server

Or from source (for developing LISA itself):

git clone https://github.com/ClementRingot/LISA.git
cd LISA
npm install
cp packages/server/.env.example .env      # then edit .env
npm run dev               # tsx packages/server/src/index.ts  (hot dev)
# or
npm run build && npm start

Minimum local .env:

SAP_URL=https://your-abap-system.example.com
SAP_USERNAME=ABAP_USER
SAP_PASSWORD=secret
SAP_CLIENT=100
SAP_I18N_SERVICE_PATH=/sap/bc/http/sap/zi18n_service
MCP_TRANSPORT=http-streamable      # or "stdio"
PORT=8080

By default the server starts an HTTP-streamable MCP endpoint on http://localhost:8080/mcp with a /health probe.

Connect an MCP client over HTTP (Claude web/desktop, Cursor, VS Code):

{
  "mcpServers": {
    "lisa": { "url": "http://localhost:8080/mcp" }
  }
}

Or over stdio (local-only, no auth) — set MCP_TRANSPORT=stdio and launch the built server directly:

{
  "mcpServers": {
    "lisa": {
      "command": "node",
      "args": ["/absolute/path/to/LISA/packages/server/dist/index.js"],
      "env": { "MCP_TRANSPORT": "stdio", "SAP_URL": "…", "SAP_USERNAME": "…", "SAP_PASSWORD": "…" }
    }
  }
}

⚠️ Local mode has no XSUAA in front of it — with no auth vars set the HTTP transport is open, and SAP calls use a single technical user instead of per-user principal propagation. Keep it on your machine; don't expose it. For anything shared or production-grade, use BTP (Part 2).

Run in Docker (self-hosted)

A production-grade image (multi-stage, non-root, tini) is published to ghcr.io on every product release — or build it yourself from the repo's Dockerfile:

docker pull ghcr.io/clementringot/lisa-mcp:latest     # or :X.Y.Z to pin
# — or: git clone … && docker build -t lisa-mcp .

docker run -p 8080:8080 \
  -e SAP_URL=https://your-abap-system.example.com \
  -e SAP_USERNAME=ABAP_USER -e SAP_PASSWORD=secret -e SAP_CLIENT=100 \
  -e SAP_API_KEYS=mykey123:developer \
  ghcr.io/clementringot/lisa-mcp:latest
# MCP endpoint: http://localhost:8080/mcp   |   health: /health

This is the self-hosted path (Kubernetes, VM, on-prem): outside BTP there is no XSUAA and no Destination service, so SAP is reached directly (SAP_URL, technical user — no per-user principal propagation) and callers authenticate via API keys or OIDC/Entra (OIDC_ISSUER + OIDC_AUDIENCE) — set at least one, or the endpoint is open. For per-user SSO + principal propagation, deploy on BTP (Part 2).


Configuration reference

VariablePurpose
SAP_I18N_SERVICE_PATHURL path of the ZCL_I18N_SERVICE HTTP service (default /sap/bc/http/sap/zi18n_service).
SAP_URL / SAP_USERNAME / SAP_PASSWORD / SAP_CLIENTDirect connection for local dev.
SAP_BTP_DESTINATIONBasicAuth Destination — system-level calls / fallback (BTP).
SAP_BTP_PP_DESTINATIONPrincipalPropagation Destination — per-user calls (BTP).
MCP_TRANSPORThttp-streamable (default) or stdio.
PORTHTTP port (default 8080).
LOG_LEVEL / LOG_FORMATdebug|info|warn|error / text|json.
SAP_API_KEYSkey:profile,… CSV API-key auth (viewer|developer|admin).
OIDC_ISSUER / OIDC_AUDIENCEOIDC/Entra ID token validation.
VCAP_SERVICESInjected by BTP; carries the XSUAA binding.
LISA_DCR_SIGNING_SECRETStable signing secret for the OAuth DCR store (set via cf set-env).
SAP_OAUTH_DCR_TTL_SECONDSDCR registration TTL (0 = never expire).
MCP_RATE_LIMIT / OAUTH_RATE_LIMITPer-minute rate limits (default 600 / 20).
CORS_ORIGINSComma-separated allowed CORS origins.

The full commented template lives at packages/server/.env.example (also shipped inside the npm package).


Documentation

The docs_page/ folder holds the long-form guides:

Guide
IndexDocumentation home.
QuickstartFastest path to a working setup.
ABAP service setupImport the class & publish the HTTP service.
MCP tools usageEvery tool, with examples.
Text tablesTranslating delivery-class C/S tables (text_table, e.g. T005T).
Configuration referenceAll env vars in detail.
AuthenticationAuth model & options.
BTP deploymentCloud Foundry / MTA (standalone server).
ARC-1 extension deploymentRun LISA's tools in-process inside ARC-1.
Local developmentDev loop, lint, build.
ArchitectureHow the pieces fit together.
Wire-contract evolutionGrowing the contract as XCO APIs diverge per platform.
ReleasingChangesets, tags, npm publication, which ref to deploy.
BTP destination setupCreate the destination that authenticates zi18n_service calls (per-user propagation or shared Basic-auth user), for the MCP server or a Joule Studio / CAP action.
Agent skill: using the ABAP APIHow to drive zi18n_service — the six actions, wire contract, pitfalls. Auth-agnostic (a destination or the MCP server carries it).
OpenAPI specImport into Joule Studio / API tooling — the full zi18n_service contract.

Roadmap

Larger structural work lives in roadmap/. Two tracks:

TrackDocIn one line
Distribute LISA as an ARC-1 extensionroadmap/arc1-extension.md✅ Shipped in v0.7.0 — packages/arc1-extension packages the 3 tools as in-process Custom_* tools loaded via ARC1_PLUGINS. See docs: ARC-1 extension deployment.
Share the auth layer (standalone)roadmap/shared-auth-module.md✅ Shipped in v0.4.0 — LISA's in-tree XSUAA/BTP auth was replaced by a dependency on @arc-mcp/xsuaa-auth.

Project structure

LISA/
├── abap/                 # ⬅ ABAP handler to import (pick one folder for your platform; 3 files each)
│   ├── ABAP_PLATFORM_2022/   # ZCL_I18N_SERVICE — on-premise / private cloud (ABAP Platform 2022 / 7.57)
│   ├── ABAP_PLATFORM_2025/   # ZCL_I18N_SERVICE — on-premise / private cloud (ABAP Platform 2025+)
│   └── CLOUD/                # ZCL_I18N_SERVICE — BTP ABAP Environment / public cloud
├── docs_page/            # long-form documentation
├── roadmap/              # forward-looking design docs (planned, not implemented)
├── packages/
│   ├── core/             # @lisa-mcp/core — transport-agnostic wire contract (Zod schemas + ZCL_I18N_SERVICE wire logic)
│   │   └── src/          # wire.ts, schemas.ts, index.ts
│   ├── server/           # @lisa-mcp/server — standalone MCP server (published to npm, deployable on BTP)
│   │   ├── src/
│   │   │   ├── index.ts  # entry point
│   │   │   ├── handlers/ # tool registration (intent.ts), built on @lisa-mcp/core
│   │   │   ├── sap/      # transport.ts (HTTP to ABAP; BTP via @arc-mcp/xsuaa-auth/btp)
│   │   │   └── server/   # transport, config, logging (XSUAA OAuth via @arc-mcp/xsuaa-auth)
│   │   ├── templates/mta/    # deploy-from-npm MTA project + mta-overrides-*.mtaext.example landscape templates
│   │   └── .env.example      # local-dev config template (shipped in the npm package)
│   └── arc1-extension/   # @lisa-mcp/arc1-extension — the same 3 tools as an in-process ARC-1 plugin (published to npm)
│       └── src/          # Custom_* tool defs + index.ts (loaded via ARC1_PLUGINS)
├── mta.yaml              # BTP MTA descriptor (source-build path)
└── xs-security.json      # XSUAA config (authentication only)

Credits

LISA's authentication and BTP connectivity layer is provided by @arc-mcp/xsuaa-auth — the XSUAA/OAuth proxy + principal-propagation package extracted from ARC-1 by marianfoo; LISA's transport and overall architecture follow ARC-1's patterns. The translation service itself is built on SAP's XCO i18n generation APIs.

License

MIT © 2026 Clément Ringot.

LISA's XSUAA OAuth + BTP connectivity layer is provided by the MIT-licensed @arc-mcp/xsuaa-auth dependency (authored by the ARC-1 maintainers). A small remaining portion (the OAuth callback-proxy handler) is derived from ARC-1 and used under its MIT License — see the NOTICE file for the preserved upstream copyright and third-party attributions.

MIT, read

History

Latest

v0.9.5

Notes

📦 Published to npm as @lisa-mcp/server@0.9.5.

npx @lisa-mcp/server            # run locally
npm install @lisa-mcp/server    # or deploy to BTP from npm (templates/mta)
docker pull ghcr.io/clementringot/lisa-mcp:0.9.5   # self-hosted container

See the server CHANGELOG for details.

  1. v0.9.4

    Notes

    📦 Published to npm as @lisa-mcp/server@0.9.4.

    npx @lisa-mcp/server            # run locally
    npm install @lisa-mcp/server    # or deploy to BTP from npm (templates/mta)
    docker pull ghcr.io/clementringot/lisa-mcp:0.9.4   # self-hosted container

    See the server CHANGELOG for details.

  2. v0.9.3

    Notes

    📦 Published to npm as @lisa-mcp/server@0.9.3.

    npx @lisa-mcp/server            # run locally
    npm install @lisa-mcp/server    # or deploy to BTP from npm (templates/mta)
    docker pull ghcr.io/clementringot/lisa-mcp:0.9.3   # self-hosted container

    See the server CHANGELOG for details.

  3. v0.9.2

    Notes

    📦 Published to npm as @lisa-mcp/server@0.9.2.

    npx @lisa-mcp/server            # run locally
    npm install @lisa-mcp/server    # or deploy to BTP from npm (templates/mta)
    docker pull ghcr.io/clementringot/lisa-mcp:0.9.2   # self-hosted container

    See the server CHANGELOG for details.

  4. v0.9.1

    Notes

    📦 Published to npm as @lisa-mcp/server@0.9.1.

    npx @lisa-mcp/server            # run locally
    npm install @lisa-mcp/server    # or deploy to BTP from npm (templates/mta)

    See the server CHANGELOG for details.

  5. v0.3.2

    Notes

    📦 Published to npm as @lisa-mcp/arc1-extension@0.3.2.

    npm install @lisa-mcp/arc1-extension@0.3.2

    See the extension CHANGELOG for details.

  6. v0.9.0

    Notes

    📦 Published to npm as @lisa-mcp/server@0.9.0.

    npx @lisa-mcp/server            # run locally
    npm install @lisa-mcp/server    # or deploy to BTP from npm (templates/mta)

    See CHANGELOG.md for details.

  7. v0.8.5

    Security 1, Changed 1

    Notes

    Changed

    • OIDC audience validation is now mandatory. When OIDC_ISSUER is set, OIDC_AUDIENCE must also be set or the server refuses to start (it previously warned and accepted any audience). Without an audience check the verifier accepts any token signed by the issuer — including one minted for a different app on a shared issuer (e.g. another Entra application in the same tenant), a token-confusion / confused-deputy risk (RFC 9700). The prior permissive behavior is still reachable, but only via the new explicit OIDC_ALLOW_ANY_AUDIENCE=true opt-out (logged loudly at every start). Action: OIDC deployments without OIDC_AUDIENCE must add it (or the opt-out) before upgrading.

    Security

    • Bump form-data 4.0.5 → 4.0.6 to patch a HIGH-severity CRLF injection advisory (GHSA-hmw2-7cc7-3qxx), pulled in transitively via arc-1 → @sap-cloud-sdk/connectivity → axios. npm audit now reports 0 vulnerabilities.
  8. v0.3.1

    Notes

    📦 Published to npm as @lisa-mcp/arc1-extension@0.3.1.

    npm install @lisa-mcp/arc1-extension@0.3.1

    See CHANGELOG.md for details.

  9. v0.3.0

    Notes

    Added

    • TranslateSetTexts per-entry selectors — each texts item may now carry its own field_name/position, overriding the top-level selectors for that entry. All fields of one data_definition/metadata_extension (e.g. every ui_lineitem_label across fields) can be written in a single call.
    • The ABAP handler groups entries by field and writes each group under one transport change scenario, so the object is enqueued/locked only once per request instead of once per field — fixing the lock collisions seen when translating field-by-field.

    Both handler variants (zcl_i18n_service on-prem and zcl_i18n_service_cloud) are updated. Backward compatible: entries without their own field_name/position fall back to the top-level selectors.

    Full changelog: https://github.com/ClementRingot/LISA/compare/v0.2.0...v0.3.0

  10. v0.2.0

    Notes
    Added
    • Unit test suite (Vitest, 68 tests) over the security-critical pure modules: OAuth state codec, stateless DCR store, redirect-URI allowlist/validation, tool schemas, config parsing, chained token verifier.
    • npm test / npm run test:watch + vitest.config.ts.
    • CI workflow (lint + test + build) on push/PR.
    • ABAP service sources (abap/) and long-form docs (docs_page/).
    Changed
    • API-key auth now uses constant-time comparison (hash + timingSafeEqual) instead of ===.
    • OIDC verifier warns when OIDC_AUDIENCE is unset (audience then not validated).
    • Centralised the server version; tool descriptions sourced from the TOOLS registry.
    • Corrected stale doc comments; lint is now clean.

    Full changelog: https://github.com/ClementRingot/sap-translator/compare/v0.1.0...v0.2.0

  11. v0.8.4

    Notes
    Fixed
    • cds_entity is now advertised in the tool descriptions automatically. supportedTargetTypesNote() injects the synthetic cds_entity target into an action's advertised target_type list whenever both physical owners (data_definition + metadata_extension) are in the handler's allow-list for that action. Previously the backend allow-list never mentioned cds_entity (it's a LISA-only virtual target the MCP fans out before reaching SAP), so an agent could wrongly conclude it was unsupported. This is read/write-symmetric and works on any handler without each ABAP variant hardcoding the virtual type.
  12. v0.8.3

    Notes
    Added
    • SAP_BTP_PP_DESTINATION alone is now a valid startup configuration. For a pure principal-propagation backend (S/4HANA Public Cloud, or the same-subaccount BTP ABAP path) the technical SAP_BTP_DESTINATION is no longer required — resolveConfig() accepts SAP_BTP_DESTINATION or SAP_BTP_PP_DESTINATION or SAP_URL, and the BTP transport enters the per-user branch on either destination. Non-JWT (stdio / API-key / system-level) calls still need SAP_BTP_DESTINATION and now fail with an explicit message when it's absent. Matches ARC-1, which needs only its PP destination for this case. Covered by a new config.test.ts case.
    Changed
    • CLOUD ABAP handler renamed ZCL_I18N_SERVICE_CLOUD → ZCL_I18N_SERVICE. All three platform variants now share the class name ZCL_I18N_SERVICE and are separated by folder only (abap/ABAP_PLATFORM_2022/, abap/ABAP_PLATFORM_2025/, abap/CLOUD/). Renamed the abap/CLOUD/ source files to match and updated all docs.
    • BTP ABAP Environment docs: added the same-subaccount OAuth2UserTokenExchange path as the recommended option (XSUAA→XSUAA, no Communication Arrangement / SAML trust / OAuth client registration — values come from the ABAP service key uaa section), with OAuth2SAMLBearerAssertion reframed as the different-subaccount / advanced case. Fixed the token-endpoint guidance (XSUAA uaa.url/oauth/token for UserTokenExchange/ClientCredentials vs. the ABAP host only for SAML-bearer) and documented instance-level destination init_data.
    • S/4HANA Cloud Public Edition docs: stated SAMLAssertion principal propagation is the only supported developer path, added the SAML trust setup steps, BAS destination reuse, the full destination property set (default JDK truststore, BAS hint properties), and a verification/troubleshooting block.
    • Clarified ABAP Cloud service exposure: on ABAP Environment the zi18n_service HTTP endpoint activates automatically when the HTTP Service object is activated — no communication scenario/arrangement is needed (corrected across the ABAP setup docs).
    • mta.yaml: lisa-logs and lisa-connectivity now ship active: false by default. Application Logging hard-fails deploys where SAP retired the service (Note 3557260; LISA logs to stderr regardless), and Connectivity is only needed for the on-premise Cloud Connector path (the on-premise template re-activates it).
    • DCR: documented SAP_OAUTH_DCR_TTL_SECONDS=0 for clients that don't auto-re-register (Eclipse Copilot, Cursor), matching ARC-1's ARC1_OAUTH_DCR_TTL_SECONDS=0 guidance.
  13. v0.8.2

    Features 2, Changed 1

    Notes
    Added
    • S/4HANA Public Cloud per-user auth (SAMLAssertion). When SAP_BTP_PP_DESTINATION points at a SAMLAssertion / ProxyType=Internet destination, the BTP transport now detects the samlAssertionAuthorization token from the Destination Service and forwards it as Authorization: SAML2.0 … with x-sap-security-session: create, routing directly over the internet (no Cloud Connector). Reuses the existing PP env var — no new configuration. Mirrors ARC-1 (arc-mcp/arc-1#524). Requires @arc-mcp/xsuaa-auth ≥ 0.1.4.

    • Per-landscape .mtaext templates per backend. Added mta-overrides-onpremise, mta-overrides-btp-abap and mta-overrides-public-cloud .mtaext.example files, plus a backend matrix in btp-deployment.md. The SAP BTP ABAP Environment (Steampunk, OAuth2SAMLBearerAssertion → Bearer token) was already supported by the existing bearerToken path — now documented.

    Changed
    • Bumped @arc-mcp/xsuaa-auth to ^0.1.4.

    — Full changes in CHANGELOG.md. Compare: https://github.com/ClementRingot/LISA/compare/v0.8.1...v0.8.2

  14. v0.8.1dated in the atlas

    Removed 1, Features 1, Changed 2

    Notes
    Added
    • text_table target_type. Translate text tables (delivery-class C/S DB tables with one LANG key field, e.g. T005T) through the existing three tools. Adds two params: language_key_field_name (the LANG key field, e.g. SPRAS) and master_key_fields ([{ name, value }] pinning one record). Each texts entry's attribute is a text column name (e.g. LANDX). Served on all three stacks and advertised via capabilities. See docs_page/text-table.md.
    Changed
    • ABAP handler split into per-platform folders. abap/ABAP_PLATFORM_2022/ and abap/ABAP_PLATFORM_2025/ (both ZCL_I18N_SERVICE, on-premise / private cloud) and abap/CLOUD/ (ZCL_I18N_SERVICE_CLOUD, BTP ABAP Environment) — pick the folder for your platform. Same wire contract; they differ only in the XCO i18n API surface available on each release.
    • cds_entity description scoped to one entity. Clarified that cds_entity covers the named entity and its own DDLX only and does not reach the underlying/parent views of an as projection on chain (e.g. the ZI_ interface view behind a ZC_ projection) — a RAP stack needs one cds_entity pass per distinct entity. No behavior change.
    Removed
    • Dead get_translation / compare_translations actions. The ABAP handler no longer exposes them (the MCP surface stopped using them — list_texts is the whole-object reader); their mentions are dropped from the wire contract and docs.
  15. v0.8.0

    Features

    Notes

    Added — Merged CDS entity translation surface (cds_entity)

    A new virtual, LISA-only target_type (not a backend type) that treats a CDS view and its metadata extension (DDLX) as one translation surface, fanned out to the two real backend targets.

    Read — TranslateGetTexts(target_type: "cds_entity") issues both backend reads (data_definition and metadata_extension), concatenates them (view first), and returns each row carrying the owner the ABAP backend stamps ("data_definition" / "metadata_extension") — read from the row, never derived. DDLX labels are included automatically (no second call). Rows are not deduplicated across owners. Positional UI labels stay as the bare attribute plus a separate position (1-based). If one sub-read fails, the successful rows are still returned with the failure attached under errors (partial success).

    Write — TranslateSetTexts(target_type: "cds_entity") groups rows by owner and writes each group to its physical object in one backend call (each locked/transported once). Every row must carry owner — a write with any row missing it is rejected (LISA never guesses). Entity-level texts go out with an empty field_name (fixes the ENDUSERTEXT.LABEL error from an inherited field_name). Writes are not atomic across the two objects: the result reports per-owner { written, success, error? }, and a partial write returns success: false.

    The single-object data_definition / metadata_extension (and all non-CDS) targets are unchanged — one 1:1 backend call. Logic is shared in @lisa/core, so the standalone MCP server and the ARC-1 extension behave identically. Includes the coupled ABAP backend change (classic + cloud) that stamps owner on every CDS list_texts row.

    Full changelog: https://github.com/ClementRingot/LISA/blob/v0.8.0/CHANGELOG.md

  16. v0.7.1

    Fixes 1

    Notes
    Fixed
    • Docs: ARC-1 extension marked as shipped. The roadmap index (roadmap/README.md) and the arc1-extension.md banner/title still said "Planned" / "waiting for v2", and the main README's roadmap row said "Shipped" without a version. All now read ✅ Shipped in v0.7.0, matching the released packages/arc1-extension.
  17. v0.7.0

    Notes

    Added

    LISA as an ARC-1 extension — a second distribution (lisa-arc1-extension) packages the same three tools as in-process ARC-1 plugins (Custom_TranslateListLanguages, Custom_TranslateGetTexts, Custom_TranslateSetTexts) loaded via ARC1_PLUGINS. It reuses the host ARC-1's authenticated SAP client, safety ceiling, scope policy, audit, and per-user principal propagation — no second auth stack and no second URL. The standalone server and the extension share one wire contract (@lisa/core) and one ABAP handler. See docs: ARC-1 extension deployment.
    Startup warning when LISA_DCR_SIGNING_SECRET is set but no XSUAA binding is present — the secret is only consumed by the XSUAA OAuth proxy, so this surfaces a dead-config misconfig instead of ignoring it silently (parity with ARC-1's set-but-unused signing-secret warn).
    Reproducible release tooling: npm run release <version> (scripts/release.sh) bumps the synced version fields, rolls the CHANGELOG, build/lint/tests, and stages a commit + annotated tag; a version-sync guard (scripts/check-version-sync.mjs, wired into CI as check:version) fails the build if the product version or the extension version drifts across the files that carry it. Documented in docs: releasing.
    Dependabot for the npm workspaces, the Docker base image, and the GitHub Actions, with grouped weekly PRs (arc-1/@arc-mcp/* kept in their own group).
    

    Changed

    Restructured into an npm-workspaces monorepo: @lisa/core (the transport-agnostic wire contract + Zod schemas shared by both consumers), packages/server (the existing standalone BTP server, now consuming @lisa/core and bundled with esbuild so the deploy artifact carries no workspace symlinks), and packages/arc1-extension. No behavior change to the standalone server; the deployable surface and the 3 tools are unchanged.
    README now presents the standalone server and the ARC-1 extension as two first-class deployment paths (Part 2 / Part 3) instead of mentioning the extension only in passing.
    arc-1 extension: pin the arc-1 dependency to >=0.9.20 — the version that ships the gated ctx.http.post (raw write surface) the extension's transport calls (dev floor ^0.9.20, peer floor >=0.9.20, so an older host is flagged rather than failing at runtime on a missing post).
    DCR client_id prefix changed sapt- → lisa- (the prior prefix was an undocumented acronym; lisa- is self-documenting and traceable in XSUAA/logs). Changing the prefix re-issues DCR client_ids: already-registered MCP clients re-register automatically on their next sign-in — one-time, transparent, no migration needed since the DCR store is stateless/HMAC.
    Bumped zod to v4 across all packages (arc-1 peer-depends on zod ^4; the MCP SDK supports both 3.25+ and 4 — usage was already a compatible subset).
    Docs: aligned the LISA_DCR_SIGNING_SECRET generation command across README / BTP deployment / mtaext template on openssl rand -base64 48 (the value @arc-mcp/xsuaa-auth recommends).
    
  18. v0.6.2

  19. v0.6.1

  20. v0.6.0

    Notes
    Added
    • LISA now probes the connected ABAP backend's per-action capabilities allow-list once at startup (process-cached) and injects the concrete supported target_type list into the TranslateGetTexts (list_texts) and TranslateSetTexts (set_translation) tool descriptions. The assistant knows up-front which object types the target system accepts, instead of only learning reactively on rejection.
    • I18nClient.getCapabilities() exposes the allow-list to the tool layer.
    Changed
    • The generic stack-differences caveat is now a fallback only (older handler / SAP unreachable); when the live list is available it is replaced by the concrete per-operation set.
    • target_type enum description trimmed (stack prose moved to the per-tool, per-system note).
    • README: clarifies the object-types table is the full catalog; the real set is per-system and stated in each tool description.

    Also includes: fix(abap) — ISO language codes converted to SAP SPRAS (no more RO→RU).

    🤖 Generated with Claude Code

  21. v0.5.1

    Other 2

    Notes

    Wording follow-up to v0.5.0 (the per-stack capability guard).

    • The target_type tool description now also notes that supported object types can differ between on-premise / private cloud systems depending on the system version (not only between cloud and on-prem).
    • Removed speculative "future per-release class (zcl_i18n_service_2022 / _2025)" wording from the tool description, i18n-client, abap/README, and both ABAP handlers.

    No behaviour change; capability guard still degrades to permissive until the ABAP capabilities action is imported.

    🤖 Generated with Claude Code

  22. v0.5.0

    Other 4

    Notes

    Each ABAP handler now declares the object types it can translate (an editable allow-list), and the MCP server enforces it up-front — instead of surfacing a raw error after the call.

    Highlights
    • ABAP capabilities action (both handlers) returns { list_texts: [target_type…], set_translation: [target_type…] }. One object type per line → removing a possibility is a one-line edit. Cloud omits text_pool from list_texts only (writable but not listable with the released APIs).
    • Capabilities differ by stack (public cloud / BTP ABAP Environment vs on-premise / private cloud) and by system release — a future per-release class (e.g. zcl_i18n_service_2022 / _2025) just declares its own list, no server change.
    • LISA probes capabilities once (cached) and rejects an unsupported target_type up-front (isTargetTypeSupported). Older handlers without the action degrade gracefully to permissive — the CLOUD_UNSUPPORTED backstop still fires.
    • N2: CLOUD_UNSUPPORTED mapped to a clear message; stack/release differences documented in the target_type tool description.
    Validation / caveats

    build / lint / 30 tests green; deployed to BTP DEV + SANDBOX (permissive). ⚠️ The ABAP changes need import into the target system(s) and live testing — they could not be compiled in this environment; until re-imported the server stays permissive.

    🤖 Generated with Claude Code

  23. v0.4.0

    Other 6

    Notes

    Adopt the shared @arc-mcp/xsuaa-auth package, retiring LISA's in-tree XSUAA OAuth + DCR + OAuth-state + BTP modules (mirrors arc-1 #456). Net ~-2,100 LOC, behaviour preserved.

    Highlights
    • Auth + BTP connectivity now sourced from @arc-mcp/xsuaa-auth (incl. the public-PKCE fix, 0.1.2+).
    • LISA keeps its own transport wiring, /oauth/callback handler, DCR signing secret, and 3-tool surface.
    • Shared toPackageLogger() routes package auth + principal-propagation diagnostics into LISA's (redacted) log stream.
    • Preserves LISA's redirect-uri allowlist, api-key:<profile> identity (timing-safe), optional OIDC audience, authenticate-only model.
    • express 4 -> 5; MCP SDK floor ^1.18.2.
    • New per-landscape deploy tooling: btp:deploy-dev / btp:deploy-sbx, gitignored mta-overrides*.mtaext, per-subaccount xsappname guidance.
    Validation

    build / lint / 26 tests green, plus a live BTP sandbox deploy (XSUAA OAuth + public-PKCE end-to-end). Code + security reviews clean.

    PR: #2

    🤖 Generated with Claude Code

  24. v0.3.0

    Features 2

    Notes

    Added

    • TranslateSetTexts per-entry selectors — each texts item may now carry its own field_name/position, overriding the top-level selectors for that entry. All fields of one data_definition/metadata_extension (e.g. every ui_lineitem_label across fields) can be written in a single call.
    • The ABAP handler groups entries by field and writes each group under one transport change scenario, so the object is enqueued/locked only once per request instead of once per field — fixing the lock collisions seen when translating field-by-field.

    Both handler variants (zcl_i18n_service on-prem and zcl_i18n_service_cloud) are updated. Backward compatible: entries without their own field_name/position fall back to the top-level selectors.

    Full changelog: https://github.com/ClementRingot/LISA/compare/v0.2.0...v0.3.0

  25. v0.2.0

    Features 4, Changed 4

    Notes
    Added
    • Unit test suite (Vitest, 68 tests) over the security-critical pure modules: OAuth state codec, stateless DCR store, redirect-URI allowlist/validation, tool schemas, config parsing, chained token verifier.
    • npm test / npm run test:watch + vitest.config.ts.
    • CI workflow (lint + test + build) on push/PR.
    • ABAP service sources (abap/) and long-form docs (docs_page/).
    Changed
    • API-key auth now uses constant-time comparison (hash + timingSafeEqual) instead of ===.
    • OIDC verifier warns when OIDC_AUDIENCE is unset (audience then not validated).
    • Centralised the server version; tool descriptions sourced from the TOOLS registry.
    • Corrected stale doc comments; lint is now clean.

    Full changelog: https://github.com/ClementRingot/sap-translator/compare/v0.1.0...v0.2.0

  26. v0.1.0

    Features 3

    Notes

    Initial SAP Translation MCP server.

    Added
    • 5 MCP tools (TranslateListLanguages, TranslateListTexts, TranslateGetTexts, TranslateSetTexts, TranslateCompare) over the ZCL_I18N_SERVICE ABAP HTTP service.
    • XSUAA OAuth proxy (stateless DCR + signed callback state), OIDC and API-key auth.
    • BTP deployment (MTA), Destination + Connectivity (principal propagation).
Localization
  1. abap_btocs_deeplDeepL translation plugin for the B-Tocs ABAP SDK
  2. abap_btocs_libtrlLibreTranslate plugin for the B-Tocs ABAP SDK
  3. SAP Translation HubTranslation service for software texts and documents
  4. ABAP_DeepL_clientABAP client for the DeepL translation service
  5. ABAP_TRANSLATION_HUBReport pushing ABAP objects to SAP Translation Hub and back
  6. abap-form-translatorRuntime translation layer for SAP form labels, kept in a table
  7. ZOTR_UTILITYABAP framework reading texts from SAP's online text repository
  8. ZABAP_TRANSLATIONSExcel export and import of ABAP package or program texts
  9. XLF TranslatorEditor for the translations in an uploaded XLIFF file

Details

Sources4
Added by handdiscovered herechecked
npm registry, LISAversion, releases, installschecked
github.com/ClementRingot/LISAtree, pushes, contributors, CIchecked
README.mdquoted, and what the entry declareschecked

Sources are graph entities: the same page may back several entries, and an unreachable source flags every row that rests on it.

Compatibility and provenance
runtimesnode
discovered viaAdded by hand
first seen in the atlas
ecosystem and domainabap, ai-and-agents
Flavors2
Standard ABAP
“public cloud / BTP ABAP Environment and on-premise / private cloud support **different** types per operation” — ClementRingot/LISA — README, Supported object typeschecked
ABAP Cloud
“public cloud / BTP ABAP Environment and on-premise / private cloud support **different** types per operation” — ClementRingot/LISA — README, Supported object typeschecked
Contributors1

From the repository’s contributor list, .

History in the atlas2
  1. Entered by intake from the README, found through ARC-1's extensions page, which names it in its example of driving a custom ABAP HTTP service.
  2. First seen.
For your agent
Ref
artifact:clementringot-lisa
JSON
/artifacts/clementringot-lisa.json
MCP
Connecting an agent