MCP server for abap2UI5: capability queries, view validation, deploy, headless run + screenshot — the AI agent dev loop, no SAP system needed.
Strong tool definitions with comprehensive descriptions and well-structured schemas. All 22 tools have clear, detailed descriptions (avg ~250 chars, well above 194-char baseline). Input schemas are present and properly typed for all tools. However, output schemas are not documented, LLMs cannot predict response structure. Tool names follow verb_noun convention (setup_status, read_example, deploy_app). Risk annotations (READ_ONLY, WRITE, DESTRUCTIVE) are present but not formalized as toolAnnotations in the MCP schema. Parameter descriptions are thorough and include constraints (enums, limits). Error handling guidance is implicit in descriptions but not explicit in schema. No security-sensitive parameters exposed. Composition is strong: tools chain well (examples → read_example → scaffold_app → deploy_app). Idempotency is clear for read tools; write tools lack explicit idempotency guidance.
The client API an app calls at runtime — z2ui5_if_client, parsed live from the framework checkout WITH its ABAP-Doc, so a signature is looked up instead of guessed from training data or fished out of the whole z2ui5_if_client source. Without arguments returns the compact surface: every method one line each (obsolete ones marked — they exist only so old apps keep compiling), the cs_* constant groups (cs_event, cs_view, cs_device, cs_nav_mode) and the named types. With `query` the matching entries come back WHOLE: a method with its full documentation and every parameter (type, default, per-parameter doc), a constant with its path (`cs_event-start_timer`) and value, a type with its fields. Ask it "toast", "follow_up_action", "prevent default", "timer". This answers what EXACTLY can be called and with which arguments; `app_guide` is the prose on how an app is built, and `examples` finds a whole app to read.
READ THIS BEFORE WRITING ABAP for an app of your own. The complete guide to BUILDING an abap2UI5 app, live from the framework checkout (abap2UI5 docs/agents/building-apps.md, written to be self-contained so no web access is needed): the app class template and its lifecycle (check_on_init / check_on_event / check_on_navigated), the z2ui5_cl_ui5_view_builder chain, data binding, events, popups, navigation, and the rules that keep an app portable to the oldest supported UI5. Without arguments the whole guide comes back, chapter by chapter — it is meant to be read once at the start of a task. `section` (a chapter number or a word from its heading) or `query` narrows it once you know what you are looking for. This is the BUILD rulebook; `generation_rules` is the different one for PORTING an existing UI5 demo-kit sample into the samples-controls corpus.
MANAGE the backend — start, stop, or query its status. Pass `action` ("start", "stop", or "status"). The backend is a Node.js server that serves the transpiled app classes. `start` boots it if it is not running; `stop` shuts it down; `status` returns whether it is running and what port it is on. Returns a summary.
Output schemas not documented. LLMs cannot predict response structure for any tool. Responses are described in prose but lack formal JSON Schema definitions. This forces LLMs to guess field names and types, increasing errors in downstream tool chaining.
Tool risk annotations (READ_ONLY, WRITE, DESTRUCTIVE) are present in comments but not formalized as MCP toolAnnotations (readOnlyHint, destructiveHint, idempotentHint). Clients cannot programmatically detect which tools are safe to retry or have side effects.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 65 | 2026-07-28+ | v2 |
BUILD the backend of an app in the dev sandbox — the class that the app's backend spec names. Pass `name` (the app's class name) and optionally `mode` ("auto" to build only if the source changed, "full" to build everything — defaults to "auto"). The app must have been created with `scaffold_app` first, so the spec file exists and names what to build. Returns the build log and a summary. This is a long operation; the client may send a progressToken to receive progress notifications.
Query what abap2UI5 can express, from the verified capability map (CAPABILITIES.md — every entry names a proving port). Call this BEFORE deciding a UI5 feature cannot be built. Without arguments returns a summary; with `query` returns matching entries (status: direct | workaround | needs-live-test | not-expressible).
DEPLOY an app from the dev sandbox into the corpus (or the framework checkout when there is no corpus) — the class, its backend if the spec names one, and its test class if it has one. Pass `name` (the app's class name). The app must have been created with `scaffold_app` first, so the spec file exists and names what to build. Returns the class name and path in the corpus, and the backend class name and path if one was deployed.
Search the abap2UI5 documentation site (abap2ui5.github.io/docs) — the cookbook, setup chapters, advanced guides — live from the docs checkout. Without arguments returns a summary; with `query` returns matching pages, ranked by relevance. Each hit names the page, the best-matching section, a snippet, and both the rendered and raw-markdown URLs.
Find a WORKING APP that already does what you are about to build, across ALL THREE sample repositories (live-read from their committed catalogues — catalogue.json, or SAMPLES.md on an older checkout): abap2UI5/samples (patterns — value help, navigation, trees, tables), abap2UI5/samples-controls (the UI5 demo kit rebuilt control by control — ask this for "how do I express sap.m.Wizard") and abap2UI5/samples-stack (apps that need an OData service, RAP, APC or the launchpad — only propose one when the user has that). This is the pattern question and it differs from `capabilities`, which answers whether a UI5 control can be expressed at all. Ask this before writing an app from scratch. What comes back is a repository, a class name and its path: READ that class. It is a whole app that compiles, renders and is downported to every release the ecosystem supports, which is worth more than any snippet. A repository that is not checked out is reported, not fatal — the others are still searched. Entries also carry `docs` (the cookbook pages that sample is the worked example of) and, where the catalogue says so: `status` for a control port — checked (a human watched it run in a real system) over reviewed over generated, which breaks ties in the ranking — plus its `deviations` from the original, `stage` (the learning-path stage in samples), and `technology`/`needs` (what a stack sample requires from the system). Without arguments returns a summary.
REPAIR the view of an app in the dev sandbox — apply the mechanical fixes that `validate_view` marked as fixable. Pass `name` (the app's class name). Returns the findings that remain after the fixes, the same way `validate_view` does. A finding that `validate_view` did not mark fixable is left alone.
The rulebook for PORTING one official UI5 demo-kit sample to abap2UI5 as a z2ui5_cl_smpc_app_<n> class in the samples-controls corpus: what to do with the original Component.js, the manifest, the view and controller, how to handle the data model, what the test harness does and what it does not, which UI5 features are not expressible and what to do instead. This is the PORT rulebook; `app_guide` is the different one for BUILDING an app from scratch.
INTERACT with a running app — click, type, select, scroll — and return a screenshot. Pass `name` (the app's class name), `action` (the interaction: "click", "type", "select", "scroll"), and the action's arguments (e.g. `selector` for click, `text` for type). The app must be running (start it with `run_app` first). Returns a PNG screenshot after the interaction.
LIST the apps in the dev sandbox — the class names and their paths. Reads only; changes nothing.
The MISTAKES an app can make — the things that compile and run but break portability, crash on older UI5, or silently do nothing. Read this when a tool says something is wrong, or when you are about to write something you are not sure about. Without arguments returns a summary; with `query` returns matching entries.
READ the source of an app in the dev sandbox — the whole class, without leaving the conversation. Pass `name` (the app's class name). Read live from the sandbox, so what you see is what `deploy_app` will deploy.
READ the source of a sample the `examples` tool pointed at — the whole class, from the repository the hit named — without leaving the conversation. Pass `class` (the entry's class name, looked up across the three catalogues) or `repo` + `path` (as the entry carries them). Read live from the local checkout when there is one, fetched from GitHub otherwise, so an `examples` hit is always one call away from its code. A sample is a complete, gated app: read it whole, then take the pattern, not the file.
REMOVE an app from the dev sandbox — the class, its backend if one was deployed, and its test class if it has one. Pass `name` (the app's class name). The app must have been created with `scaffold_app` first. Returns the names of the classes that were removed.
RUN an app in the dev sandbox — boot the REAL app against the transpiled backend, open it in a headless browser, and return a screenshot. Pass `name` (the app's class name) and optionally `sizes` (a list of viewport sizes to render, e.g. ["mobile", "tablet", "desktop"] — defaults to ["desktop"]). The app must have been deployed with `deploy_app` first, and the backend must be running (start it with `backend` action "start" if it is not). Returns a PNG screenshot for each size. This is the EXPENSIVE way to see a running app; `screenshot_view` photographs the view alone and costs seconds instead of minutes.
RUN the unit tests of an app in the dev sandbox — the test class that the app's spec names. Pass `name` (the app's class name). The app must have been created with `scaffold_app` first, so the spec file exists and names what to test. Returns the test log and a summary. This is a long operation; the client may send a progressToken to receive progress notifications.
Create a new abap2UI5 app project in the dev sandbox (the corpus' src/zz_dev, or the framework's node/zz_dev when there is no corpus): a class name, a folder, a spec file that names what the app needs (backend, OData, RAP, APC, launchpad), and a template class that compiles and runs. The spec is read by `deploy_app` and `build_backend`, so they know what to build. Pass `name` (the app's class name, validated against ABAP naming rules) and optionally `spec` (a JSON object naming what the app needs — defaults to a bare abap2UI5 app). The class is a gated template: read it whole, then edit it. Do not copy it piecemeal.
PHOTOGRAPH the view of an app in the dev sandbox — the XML that the app's `get_view` method returns — rendered in the linter's harness, without a backend or a transpile. Returns a PNG screenshot, seconds, no system. The view is reconstructed from the XML alone, so it is blind to everything that only exists at runtime (data from a SELECT, what an event does). Pass `name` (the app's class name) and optionally `sizes` (a list of viewport sizes to render, e.g. ["mobile", "tablet", "desktop"] — defaults to ["desktop"]). This is the CHEAP way to see a view while writing it; `run_app` boots the REAL app and costs a build first.
What this server can do RIGHT NOW, in one read - call it first, or whenever a tool says something is missing: per repository whether a local checkout, the read-only GitHub mirror or nothing resolves (and the env var or clone that fixes it), which dev sandbox deploy_app writes into (the corpus, or the framework checkout when there is no corpus) and what is deployed there, whether the backend is built, prebuilt and running, whether the unit-test runner exists, where a framework clone would land, and whether git, tar, npx and a Chromium are on this machine. Reads only; changes nothing.
LINT the view of an app in the dev sandbox — the XML that the app's `get_view` method returns — against the abap2UI5 rules. Returns findings (type, message, line, column) and a summary. Pass `name` (the app's class name). The linter is the framework's own, so a finding is a real defect, not a style opinion. Findings carry a `fixable` flag when `fix_view` can clear them mechanically.
Error handling is implicit in descriptions but not explicit in schema. No structured error response format defined. Tools like remove_app (DESTRUCTIVE) lack confirmation or dry-run patterns. Agents cannot distinguish retryable from fatal errors.
Pagination not explicitly supported. Tools like examples, docs_search, and list_dev_apps accept limit but no offset/cursor. Large result sets could exhaust context. No total_count or next_cursor in response schema.
Tool names 'backend' and 'interact_app' are generic. 'backend' conflates multiple concerns (start/stop/status). 'interact_app' does not clearly signal it requires a running app. More specific names like 'manage_backend' and 'interact_running_app' would improve clarity.