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@arc-mcp/xsuaa-authThe client-to-server authentication stack for an MCP server on SAP BTP: an XSUAA OAuth proxy, dynamic client registration, a chained bearer verifier, and a separate entrypoint for per-user principal propagation.independent, btp, or as an extension loaded into a running arc-1arc-1An MCP server in front of the ADT REST API that runs locally and on Cloud Foundry with twelve tools that read, search, write, activate, lint and transport ABAP objects.independent, abap.
Facts
Where it sits
Who is behind it
In the atlas: maintains 2, contributes to 3@ClementRingotmaintainerMarian ZeisContributes to this
In the atlas: maintains 35, contributes to 86, wrote 25@marianfoo1 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 serverADT MCP ServerSAP's own ADT MCP server, and not a package: a preference inside ABAP Development Tools for VS Code that starts a local HTTP MCP server on a port you choose.sap official, abap for those. Every write needs a transport request, and which object types it can write differs between public cloud or the SAP BTP ABAP environmentSAP BTP ABAP environmentSAP's ABAP runtime on BTP: ABAP systems developed in the ABAP Cloud model on SAP HANA Cloud, for cloud apps, OData services and side-by-side extensions of SAP S/4HANA.sap official, btp 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
Connections
Serving labels, messages and content per user locale
XSUAA authentication stack for an MCP server on SAP BTP
SAP's application server and development platform for ABAP. For the things here it is the system a developer's editor or an agent's tool reaches over ADT, and a program calls over RFC; where it runs is the deployment's, as for SAP BW/4HANA.
Git client written in ABAP that runs inside the system
MCP server over the ADT REST API for ABAP objects
A container engine that packages software with the tools it needs and runs it isolated from the host. Things here that ship as an image need it installed, so the reader installs the engine rather than each of the command line tools inside the container.
Collects Cloud Foundry or Kyma logs into a searchable Kibana
OAuth server issuing JWTs and holding scopes for BTP apps
ABAP runtime on BTP for the ABAP Cloud model
Cloud Foundry runtime of SAP BTP for polyglot applications
Proxy from cloud apps to on-premise systems via Cloud Connector
Named, credentialed addresses of other systems resolved at runtime
SAP's ERP suite, run on-premise or as a private cloud edition, with its business data and processes reached over OData, RFC and the ABAP platform. For the things here it is the system a tool reads from or writes to. The public cloud edition is its own entry.
SAP's cloud ERP, run by SAP as software as a service. For the things here it is the business system a side-by-side application on BTP reads from and writes to over its published OData APIs.
Sample arc-1 extension in TypeScript with ten custom tools
Download
Install
npm add LISADerived from the package name. No recipe recorded; the README has the configuration.
Architecture
Download
MCP_TRANSPORT | http-streamable (default) or stdio. |”@lisa-mcp/arc1-extension, which loads the three tools into a running arc-1 instead of a server of its ownIf LISA is loaded as the ARC-1 extension rather than run as its own serverREADME
quoted from ClementRingot/LISA under MIT, readLISA — Localization & Internationalization Service for ABAP
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/serverlocally, 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:
- 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. → seeabap/and docs: ABAP service setup. - 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
| Tool | What it does |
|---|---|
TranslateListLanguages | List all languages installed on the SAP system. |
TranslateGetTexts | Read 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). |
TranslateSetTexts | Write/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 nolanguageto see the original-language slots, keeppopulated === trueto 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_type | SAP object | Typical attributes |
|---|---|---|
cds_entity | CDS entity — merged view + DDLX | everything below for both objects, each row tagged owner |
data_element | Data element (DTEL) | short_field_label, medium_field_label, long_field_label, heading_field_label |
domain | Domain fixed-value texts (DOMA) | fixed_value_description |
data_definition | CDS view (DDLS) entity/field labels | endusertext_label |
message_class | Message class (MSAG) | message_short_text |
text_pool | Class / function-group text symbols | text symbol values |
metadata_extension | CDS metadata extension (DDLX) UI labels | endusertext_label |
application_log_object | Application log object (APLO) | object / sub-object texts |
business_configuration_object | Business configuration object (SMBC) | description texts |
text_table | Text 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.LANDXonT005T) are the text attributes. Beyond the usual params it takeslanguage_key_field_name(the LANG key field, e.g.SPRAS) andmaster_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, eachtextsentry'sattributeis 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 singleTranslateGetTextsreturns the view (data_definition) and its DDLX (metadata_extension) together — the DDLX labels come back without a separatemetadata_extensioncall — and stamps every CDS row with anowner("data_definition"or"metadata_extension"). On write, pass each row'sownerback: 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); acds_entitywrite with any row missingowneris rejected. Positional UI labels round-trip as the bare attribute (e.g.ui_lineitem_label) plus a separateposition(1-based); the index is never renumbered. Writes are not atomic across the two objects, so the result reports per-owner outcomes. The single-objectdata_definitionandmetadata_extensiontargets remain available to address one object explicitly.
cds_entityis per-entity, not per-stack. It covers the named entity + its DDLX only — it does not reach the underlying/parent views of anas projection onchain (e.g. the interface viewZI_…behind a projectionZC_…, which carries its own@EndUserText.label). Translate a RAP stack with onecds_entitypass per distinct entity (one view = one call).cds_entityworks with or without a DDLX; for a single view with no DDLX,data_definitiondirect 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
TranslateSetTextsrequires; - 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):
| Folder | Object | Use when |
|---|---|---|
abap/ABAP_PLATFORM_2022/ | ZCL_I18N_SERVICE | On-premise / private cloud on ABAP Platform 2022 (7.57) — original XCO i18n surface. |
abap/ABAP_PLATFORM_2025/ | ZCL_I18N_SERVICE | On-premise / private cloud on ABAP Platform 2025 (newer releases) — newer XCO i18n surface (positional entity texts, Fiori launchpad targets). |
abap/CLOUD/ | ZCL_I18N_SERVICE | SAP 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.
Part 2 — Deploy to SAP BTP (recommended)
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 whosenodejsmodule justnpm 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 XSUAAclientsecret, whichcf deployrotates — invalidating all cached MCP client registrations on every deploy. It's a secret, so it lives incf set-env, notmta.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
| Variable | Purpose |
|---|---|
SAP_I18N_SERVICE_PATH | URL path of the ZCL_I18N_SERVICE HTTP service (default /sap/bc/http/sap/zi18n_service). |
SAP_URL / SAP_USERNAME / SAP_PASSWORD / SAP_CLIENT | Direct connection for local dev. |
SAP_BTP_DESTINATION | BasicAuth Destination — system-level calls / fallback (BTP). |
SAP_BTP_PP_DESTINATION | PrincipalPropagation Destination — per-user calls (BTP). |
MCP_TRANSPORT | http-streamable (default) or stdio. |
PORT | HTTP port (default 8080). |
LOG_LEVEL / LOG_FORMAT | debug|info|warn|error / text|json. |
SAP_API_KEYS | key:profile,… CSV API-key auth (viewer|developer|admin). |
OIDC_ISSUER / OIDC_AUDIENCE | OIDC/Entra ID token validation. |
VCAP_SERVICES | Injected by BTP; carries the XSUAA binding. |
LISA_DCR_SIGNING_SECRET | Stable signing secret for the OAuth DCR store (set via cf set-env). |
SAP_OAUTH_DCR_TTL_SECONDS | DCR registration TTL (0 = never expire). |
MCP_RATE_LIMIT / OAUTH_RATE_LIMIT | Per-minute rate limits (default 600 / 20). |
CORS_ORIGINS | Comma-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 | |
|---|---|
| Index | Documentation home. |
| Quickstart | Fastest path to a working setup. |
| ABAP service setup | Import the class & publish the HTTP service. |
| MCP tools usage | Every tool, with examples. |
| Text tables | Translating delivery-class C/S tables (text_table, e.g. T005T). |
| Configuration reference | All env vars in detail. |
| Authentication | Auth model & options. |
| BTP deployment | Cloud Foundry / MTA (standalone server). |
| ARC-1 extension deployment | Run LISA's tools in-process inside ARC-1. |
| Local development | Dev loop, lint, build. |
| Architecture | How the pieces fit together. |
| Wire-contract evolution | Growing the contract as XCO APIs diverge per platform. |
| Releasing | Changesets, tags, npm publication, which ref to deploy. |
| BTP destination setup | Create 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 API | How to drive zi18n_service — the six actions, wire contract, pitfalls. Auth-agnostic (a destination or the MCP server carries it). |
| OpenAPI spec | Import into Joule Studio / API tooling — the full zi18n_service contract. |
Roadmap
Larger structural work lives in roadmap/. Two tracks:
| Track | Doc | In one line |
|---|---|---|
| Distribute LISA as an ARC-1 extension | roadmap/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.
History
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.
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 containerSee the server CHANGELOG for details.
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 containerSee the server CHANGELOG for details.
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 containerSee the server CHANGELOG for details.
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.
Notes
📦 Published to npm as
@lisa-mcp/arc1-extension@0.3.2.npm install @lisa-mcp/arc1-extension@0.3.2See the extension CHANGELOG for details.
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.
Security 1, Changed 1
Notes
Changed
- OIDC audience validation is now mandatory. When
OIDC_ISSUERis set,OIDC_AUDIENCEmust 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 explicitOIDC_ALLOW_ANY_AUDIENCE=trueopt-out (logged loudly at every start). Action: OIDC deployments withoutOIDC_AUDIENCEmust add it (or the opt-out) before upgrading.
Security
- Bump
form-data4.0.5 → 4.0.6 to patch a HIGH-severity CRLF injection advisory (GHSA-hmw2-7cc7-3qxx), pulled in transitively viaarc-1 → @sap-cloud-sdk/connectivity → axios.npm auditnow reports 0 vulnerabilities.
- OIDC audience validation is now mandatory. When
Notes
📦 Published to npm as
@lisa-mcp/arc1-extension@0.3.1.npm install @lisa-mcp/arc1-extension@0.3.1See CHANGELOG.md for details.
Notes
Added
TranslateSetTextsper-entry selectors — eachtextsitem may now carry its ownfield_name/position, overriding the top-level selectors for that entry. All fields of onedata_definition/metadata_extension(e.g. everyui_lineitem_labelacross 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_serviceon-prem andzcl_i18n_service_cloud) are updated. Backward compatible: entries without their ownfield_name/positionfall back to the top-level selectors.Full changelog: https://github.com/ClementRingot/LISA/compare/v0.2.0...v0.3.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_AUDIENCEis unset (audience then not validated). - Centralised the server version; tool descriptions sourced from the
TOOLSregistry. - Corrected stale doc comments; lint is now clean.
Full changelog: https://github.com/ClementRingot/sap-translator/compare/v0.1.0...v0.2.0
Notes
Fixed
cds_entityis now advertised in the tool descriptions automatically.supportedTargetTypesNote()injects the syntheticcds_entitytarget into an action's advertisedtarget_typelist whenever both physical owners (data_definition+metadata_extension) are in the handler's allow-list for that action. Previously the backend allow-list never mentionedcds_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.
Notes
Added
SAP_BTP_PP_DESTINATIONalone is now a valid startup configuration. For a pure principal-propagation backend (S/4HANA Public Cloud, or the same-subaccount BTP ABAP path) the technicalSAP_BTP_DESTINATIONis no longer required —resolveConfig()acceptsSAP_BTP_DESTINATIONorSAP_BTP_PP_DESTINATIONorSAP_URL, and the BTP transport enters the per-user branch on either destination. Non-JWT (stdio / API-key / system-level) calls still needSAP_BTP_DESTINATIONand 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 newconfig.test.tscase.
Changed
- CLOUD ABAP handler renamed
ZCL_I18N_SERVICE_CLOUD→ZCL_I18N_SERVICE. All three platform variants now share the class nameZCL_I18N_SERVICEand are separated by folder only (abap/ABAP_PLATFORM_2022/,abap/ABAP_PLATFORM_2025/,abap/CLOUD/). Renamed theabap/CLOUD/source files to match and updated all docs. - BTP ABAP Environment docs: added the same-subaccount
OAuth2UserTokenExchangepath as the recommended option (XSUAA→XSUAA, no Communication Arrangement / SAML trust / OAuth client registration — values come from the ABAP service keyuaasection), withOAuth2SAMLBearerAssertionreframed as the different-subaccount / advanced case. Fixed the token-endpoint guidance (XSUAAuaa.url/oauth/tokenfor UserTokenExchange/ClientCredentials vs. the ABAP host only for SAML-bearer) and documented instance-level destinationinit_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_serviceHTTP 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-logsandlisa-connectivitynow shipactive: falseby 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=0for clients that don't auto-re-register (Eclipse Copilot, Cursor), matching ARC-1'sARC1_OAUTH_DCR_TTL_SECONDS=0guidance.
Features 2, Changed 1
Notes
Added
-
S/4HANA Public Cloud per-user auth (SAMLAssertion). When
SAP_BTP_PP_DESTINATIONpoints at aSAMLAssertion/ProxyType=Internetdestination, the BTP transport now detects thesamlAssertionAuthorizationtoken from the Destination Service and forwards it asAuthorization: SAML2.0 …withx-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
.mtaexttemplates per backend. Addedmta-overrides-onpremise,mta-overrides-btp-abapandmta-overrides-public-cloud.mtaext.examplefiles, plus a backend matrix inbtp-deployment.md. The SAP BTP ABAP Environment (Steampunk,OAuth2SAMLBearerAssertion→ Bearer token) was already supported by the existingbearerTokenpath — now documented.
Changed
- Bumped
@arc-mcp/xsuaa-authto^0.1.4.
— Full changes in CHANGELOG.md. Compare: https://github.com/ClementRingot/LISA/compare/v0.8.1...v0.8.2
-
Removed 1, Features 1, Changed 2
Notes
Added
text_tabletarget_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) andmaster_key_fields([{ name, value }]pinning one record). Eachtextsentry'sattributeis a text column name (e.g.LANDX). Served on all three stacks and advertised viacapabilities. Seedocs_page/text-table.md.
Changed
- ABAP handler split into per-platform folders.
abap/ABAP_PLATFORM_2022/andabap/ABAP_PLATFORM_2025/(bothZCL_I18N_SERVICE, on-premise / private cloud) andabap/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_entitydescription scoped to one entity. Clarified thatcds_entitycovers the named entity and its own DDLX only and does not reach the underlying/parent views of anas projection onchain (e.g. theZI_interface view behind aZC_projection) — a RAP stack needs onecds_entitypass per distinct entity. No behavior change.
Removed
- Dead
get_translation/compare_translationsactions. The ABAP handler no longer exposes them (the MCP surface stopped using them —list_textsis the whole-object reader); their mentions are dropped from the wire contract and docs.
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_definitionandmetadata_extension), concatenates them (view first), and returns each row carrying theownerthe 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 separateposition(1-based). If one sub-read fails, the successful rows are still returned with the failure attached undererrors(partial success).Write —
TranslateSetTexts(target_type: "cds_entity")groups rows byownerand writes each group to its physical object in one backend call (each locked/transported once). Every row must carryowner— a write with any row missing it is rejected (LISA never guesses). Entity-level texts go out with an emptyfield_name(fixes theENDUSERTEXT.LABELerror 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 returnssuccess: 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 stampsowneron every CDSlist_textsrow.Full changelog: https://github.com/ClementRingot/LISA/blob/v0.8.0/CHANGELOG.md
Fixes 1
Notes
Fixed
- Docs: ARC-1 extension marked as shipped. The roadmap index (
roadmap/README.md) and thearc1-extension.mdbanner/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 releasedpackages/arc1-extension.
- Docs: ARC-1 extension marked as shipped. The roadmap index (
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).Notes
Added
- LISA now probes the connected ABAP backend's per-action
capabilitiesallow-list once at startup (process-cached) and injects the concrete supportedtarget_typelist 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_typeenum 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
- LISA now probes the connected ABAP backend's per-action
Other 2
Notes
Wording follow-up to v0.5.0 (the per-stack capability guard).
- The
target_typetool 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
capabilitiesaction is imported.🤖 Generated with Claude Code
- The
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
capabilitiesaction (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 omitstext_poolfromlist_textsonly (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
capabilitiesonce (cached) and rejects an unsupportedtarget_typeup-front (isTargetTypeSupported). Older handlers without the action degrade gracefully to permissive — theCLOUD_UNSUPPORTEDbackstop still fires. - N2:
CLOUD_UNSUPPORTEDmapped to a clear message; stack/release differences documented in thetarget_typetool 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
- ABAP
Other 6
Notes
Adopt the shared
@arc-mcp/xsuaa-authpackage, 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/callbackhandler, 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. express4 -> 5; MCP SDK floor^1.18.2.- New per-landscape deploy tooling:
btp:deploy-dev/btp:deploy-sbx, gitignoredmta-overrides*.mtaext, per-subaccountxsappnameguidance.
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
- Auth + BTP connectivity now sourced from
Features 2
Notes
Added
TranslateSetTextsper-entry selectors — eachtextsitem may now carry its ownfield_name/position, overriding the top-level selectors for that entry. All fields of onedata_definition/metadata_extension(e.g. everyui_lineitem_labelacross 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_serviceon-prem andzcl_i18n_service_cloud) are updated. Backward compatible: entries without their ownfield_name/positionfall back to the top-level selectors.Full changelog: https://github.com/ClementRingot/LISA/compare/v0.2.0...v0.3.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_AUDIENCEis unset (audience then not validated). - Centralised the server version; tool descriptions sourced from the
TOOLSregistry. - Corrected stale doc comments; lint is now clean.
Full changelog: https://github.com/ClementRingot/sap-translator/compare/v0.1.0...v0.2.0
Features 3
Notes
Initial SAP Translation MCP server.
Added
- 5 MCP tools (
TranslateListLanguages,TranslateListTexts,TranslateGetTexts,TranslateSetTexts,TranslateCompare) over theZCL_I18N_SERVICEABAP HTTP service. - XSUAA OAuth proxy (stateless DCR + signed callback state), OIDC and API-key auth.
- BTP deployment (MTA), Destination + Connectivity (principal propagation).
- 5 MCP tools (
Others providing
Compare all 15 on the Localization page →- abap_btocs_deeplabap_btocs_deeplA plugin for the B-Tocs ABAP SDK that lets an SAP ABAP server translate with DeepL through an SM59 RFC destination, using a DeepL API key, with a demo program for the first call.independent, abapDeepL translation plugin for the B-Tocs ABAP SDKfrom ABAP
- abap_btocs_libtrlabap_btocs_libtrlA plugin for the B-Tocs ABAP SDK that lets an SAP ABAP server translate with LibreTranslate through an SM59 RFC destination, against an instance hosted on-premise, on a hyperscaler, on SAP BTP or as SaaS.independent, abapLibreTranslate plugin for the B-Tocs ABAP SDKfrom ABAP
- SAP Translation HubSAP Translation HubSAP's translation service for software texts and documents, drawing on repositories of verified and company translations and on machine translation by SAP's neural MT or large language models.sap official, btpTranslation service for software texts and documentsfrom BTP/BAIP
- com.sap.cds:cds-services-bomcom.sap.cds:cds-services-bomThe Maven bill of materials for CAP Java, pinning every com.sap.cds module in a release, from the API and core runtime to the Spring Boot starters and the CQN engine, to the same version.sap official, capMaven bill of materials pinning CAP Java module versionsfrom CAP
- ABAP_DeepL_clientABAP_DeepL_clientAn ABAP client for the DeepL translation service, so text can be sent for translation from inside the system rather than through a tool outside it.independent, abapABAP client for the DeepL translation servicefrom ABAP
- @concircle/i18n-ai-translator@concircle/i18n-ai-translatorA CLI that translates a UI5 app's i18n.properties with OpenAI and writes the language files back, masking placeholders, applying a glossary and caching what has been translated.independent, ui5CLI translating UI5 i18n.properties files with OpenAIfrom UI5
- ABAP_TRANSLATION_HUBABAP_TRANSLATION_HUBA report that pushes an ABAP object list to SAP Translation Hub and pulls the finished translations back, meant to run as a job after the evaluation job has finished.independent, abapReport pushing ABAP objects to SAP Translation Hub and backfrom ABAP
- abap-form-translatorabap-form-translatorA runtime translation layer for Smartform and Adobe form labels, matching structure fields against a table maintained in a RAP Fiori app, so a label changes without SE63 or a transport.independent, abapRuntime translation layer for SAP form labels, kept in a tablefrom ABAP
- ui5-i18n-excel-converterui5-i18n-excel-converterA command-line tool that exports a UI5 app's i18n properties files to an Excel sheet of keys and languages for translators and imports the translated sheet back into the files.independent, ui5CLI converting UI5 i18n properties files to Excel and backfrom UI5
- ZOTR_UTILITYZOTR_UTILITYA small ABAP framework that reads language-dependent texts from SAP's online text repository through inheritance and named constants rather than a direct API call with a string alias.independent, abapABAP framework reading texts from SAP's online text repositoryfrom ABAP
- ZABAP_TRANSLATIONSZABAP_TRANSLATIONSAn ABAP tool that exports the texts of a package or program to an Excel file and imports them back in bulk once translated, covering eight object types from programs and classes to domain values.independent, abapExcel export and import of ABAP package or program textsfrom ABAP
- @sap/cds@sap/cdsThe CAP Node.js runtime, which compiles the CDS model, serves the services declared in it, answers generic requests before any handler runs, and loads every cds-plugin.sap official, capCAP Node.js runtimefrom CAP
- @sap-ux/i18n@sap-ux/i18nA library that reads and writes the i18n bundles of a UI5 or CAP project from Node code, the i18n.properties file of a UI5 app and the i18n folder of a CAP project alike.sap official, ui5Reader and writer for i18n bundles of UI5 or CAP projectsfrom UI5
- XLF TranslatorXLF TranslatorTakes an uploaded XLIFF file and makes every entry that carries a translation element editable in the page, aimed mainly at the ABAP Cloud content the Maintain Translation app generates.independent, abapEditor for the translations in an uploaded XLIFF filefrom ABAP
Details
Sources
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
Flavors
“public cloud / BTP ABAP Environment and on-premise / private cloud support **different** types per operation” — ClementRingot/LISA — README, Supported object types
“public cloud / BTP ABAP Environment and on-premise / private cloud support **different** types per operation” — ClementRingot/LISA — README, Supported object types
Contributors
History in the atlas
- 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.
- First seen.
For your agent
- Ref
artifact:clementringot-lisa- JSON
- /artifacts/clementringot-lisa.json
- MCP
- Connecting an agent