Install
$ agentstack add skill-matt1as-claude-abap-skills-rap-bo-design ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
abap-cloud-rap:rap-bo-design
Design a new RAP business object end-to-end and create it via the SAP ABAP MCP Server.
What this command does
You are designing a complete RAP business object from a short spec, then creating it in the connected ABAP system. The official ADT MCP Server (in SAPSE.adt-vscode) exposes three RAP generators that bootstrap a conformant stack in one call — that is the primary path. You then validate the generated stack against the rules in ../CLAUDE.md and refine it.
The "hand-crafted skeleton" path is a fallback for cases the generators do not fit.
Inputs to collect
Before doing anything, confirm or ask for each of the following. If anything is ambiguous, ask — do not silently pick a default. Bundle the questions in one short turn rather than multi-turn interrogation.
- Project name — short label that becomes the SAP Object Type / Service Definition / Service Binding name (max 24 chars). E.g.
Flight,Travel,WorkOrder. - Artifact prefix and suffix — used for the generated CDS / BDEF / table names. E.g. prefix
Z→ZR_Flight,ZI_Flight,ZFlighttable. - Application type —
readOnly,withDraft, orwithoutDraft(transactional).withDraftis the default for editable BOs. - Entities — for each entity:
- Entity alias (e.g.
Flight) - Composition parent (if a child entity) and cardinality (
toOne/toMany) - Field list with:
- field name
- data type (
uuid,char,numc,integer,decimal,date,timestamp,amount,currencyCode,quantity,unitOfMeasure,string,boolean) - whether it is a semantic key (the human-readable business identifier — required per
semantic-key-alongside-technical-uuid) - length / decimals where relevant
- linked currency / unit field for amounts and quantities
- Package —
$TMPfor trial / throwaway work, or a realZ*package. Real packages need a transport request. - Target system — BTP ABAP Environment, or S/4HANA on-prem in ABAP Cloud development model. Released-API sets differ.
Procedure
Step 1 — pick the generation path
Decision tree, in order:
| Situation | Path | |-------------------------------------------------|-------------------------------------------------------------------------------| | New BO, no existing persistent table | x-ui-service generator — creates persistent table, draft table, CDS interface, projection, BDEF, projection BDEF, behavior pool, access control, service definition, service binding, metadata extension | | New BO, persistent table already exists | ui-service generator — reuses the table, generates the rest of the UI stack | | New BO, Web API only (no Fiori UI) | webapi-service generator — reuses table, generates Web API stack only | | Pattern outside the generators (e.g. heterogeneous compositions, non-CDS sources, abstract entities) | Hand-crafted fallback — see Step 5 |
Call mcp__abap-adt__abap_generators-list_generators once if you want to confirm the available IDs in this system.
Step 2 — fetch the schema and build the spec
Call mcp__abap-adt__abap_generators-get_schema for the chosen generator. The schema returns a referenceContent block with a sessionId — use that sessionId verbatim in the spec you submit. Then build the JSON spec:
metadata.package— the chosen packageserviceConfiguration.serviceNaming.projectName— the project nameserviceConfiguration.objectsNaming.prefix/.suffix— for generated artifact namesserviceConfiguration.applicationType—readOnly/withDraft/withoutDraftbusinessEntities— one entry per entity, withentityName,compositionParent(if a child),compositionCardinalitybusinessEntitiesFields— one entry per entity, with the field list
Apply the rules in CLAUDE.md while building the spec:
semantic-key-alongside-technical-uuid— at least one field per entity must haveisSemanticKey: true. The generator adds the technical UUID key automatically.composition-for-children-association-for-references— declare child entities withcompositionCardinalitytoOneortoMany; reference data goes via associations in the post-generation refinement, not as composition.- For amounts and quantities — link
currencyCode/unitOfMeasureto the appropriate currency or UoM field on the same entity.
Step 3 — request a transport (if needed)
If the package is not $TMP, call mcp__abap-adt__abap_transport-get for the package (objectType DEVC/K, isCreation: true). Ask the user to pick an existing transport or create a new one — never auto-select.
Step 4 — generate, activate, verify
Precondition — MCP client timeout. Claude Code's default MCP tool timeout (~30 s) is shorter than a full x-ui-service run, which routinely takes 60–180 s for a multi-entity BO. The tool call will return "operation timed out" while the MCP server keeps generating in the background. Before running this step, ask the user to launch Claude Code with MCP_TIMEOUT=600000 (10 min). If they cannot restart, proceed anyway — the server will finish — and use the recovery path below to discover what was created.
- Call
mcp__abap-adt__abap_generators-generate_objectswith the spec from Step 2 and the transport from Step 3. - Collect the URIs and names of the generated objects from the response. The response is the only authoritative source for actual names — see naming caveat below.
- Call
mcp__abap-adt__abap_activate_objectswith those URIs. - Run the post-generation review below.
Naming caveat — names are not deterministic from the spec. The generator inserts auto-namespace fragments that are not present in the input spec. Observed pattern: with prefix: "Z" and projectName: "Flight", the consumption entity surfaced as ZC_01FLIGHT (note the _01), the service binding as ZUI_FLIGHT_O4. Do not predict names from the spec — use the response. If the response was lost (e.g. client-side timeout), recover by calling mcp__abap-adt__abap_business_services-fetch_services with the most likely service binding name (ZUI__O4 for V4 UI services); a successful response confirms generation succeeded and surfaces the entity-set names.
Step 5 — fallback (hand-crafted skeletons)
Only when no generator fits. Emit:
- Interface entity (
ZI_) —define view entity, every annotation perinterface-entity-required-annotations - Projection entity (
ZR_) —provider contract transactional_query, redirected compositions only, no business logic - Consumption entity (
ZC_) — UI annotations live here - BDEF —
managed implementation in class zbp_ unique; strict ( 2 ); with draft;if drafts - Behavior pool class — one per entity,
FINAL,PRIVATE-constructor, local handler classes for validations / determinations / actions
Each is then created via mcp__abap-adt__abap_creation-create_object after abap_creation-run_validation.
Post-generation review
Apply the rules from CLAUDE.md to whatever the generator produced. The generator emits a conformant skeleton, but the rules are stricter than the defaults.
Check, in order:
- BDEF
strict ( 2 );— required for new behaviors. Add if missing. @AccessControl.authorizationCheck: #CHECKon every interface entity. Add if missing.- Semantic key fields — confirm the right fields are marked as semantic keys; technical UUID is not the semantic key.
- Composition vs association — confirm compositions are used for parent-owned children only; references to other BOs (e.g. Customer, Product) should be associations to released CDS view entities, not compositions or direct table joins.
- No business logic in the projection layer — projections should be pure structural mapping per
projection-views-contain-no-business-logic. - Determinations / validations / side effects separation — the generator does not add these; you do, per
separate-determinations-validations-and-side-effects. - Test class missing — the generator does not create ABAP Unit tests. Add a local test class per behavior implementation, using
cl_cds_test_environment, perevery-behavior-class-has-abap-unit-with-cds-test-doubles.
Flag every gap in the output report. Do not silently fix issues that change semantics.
Output format
# RAP Business Object Design —
## Decision summary
- Generator: x-ui-service | ui-service | webapi-service | hand-crafted
- Application type: readOnly | withDraft | withoutDraft —
- Target system: BTP | S/4HANA on-prem
- Package: —
## Generated spec
` ` `json
` ` `
## Generated objects
| Type | Name | URI |
|-------------------------------|-----------------------------|----------------------------------|
| Persistent table | | |
| Draft table | | |
| CDS interface view | ZI_ | |
| CDS projection view | ZR_ | |
| Metadata extension | ZR_ | |
| BDEF | ZI_ | |
| Projection BDEF | ZR_ | |
| Behavior pool class | zbp_ | |
| Service definition | | |
| Service binding | | |
| Access control | | |
| Node type / object type | | |
## Activation
## Post-generation review
| Check | Status | Note |
|-------------------------------------------------------------------------|--------|-----------------------------|
| BDEF has `strict ( 2 );` | ✓ / ✗ | |
| Every interface entity has `@AccessControl.authorizationCheck: #CHECK` | ✓ / ✗ | |
| Semantic key fields correctly marked | ✓ / ✗ | |
| Composition only for parent-owned children | ✓ / ✗ | |
| Projection layer has no business logic | ✓ / ✗ | |
| Determinations / validations / side effects in place (or noted as TODO) | ✓ / ✗ | |
| ABAP Unit test class with CDS test doubles present | ✗ | always TODO — generator does not create |
## Next steps
1. Address any ✗ from post-generation review.
2. Add ABAP Unit tests in the behavior pool include (always required, never generated).
3. Preview the service binding to confirm the UI renders.
Hard rules for this command
- Use the generator when one fits. A hand-crafted skeleton is the fallback, not the default.
- Always include
sessionIdfrom the schema response in the generation spec — verbatim. - Set
MCP_TIMEOUT=600000(10 min) before launching Claude Code when generation is on the plan. A 30 s client timeout against a 2 min server operation looks like a failure but is not. - Names come from the generation response, not the spec. The generator adds suffixes (
_01) and infixes (UI) that are not in the input. If the response is missing, recover viafetch_serviceswith the conventional binding name pattern, never invent names downstream. - Apply every rule from this plugin's
CLAUDE.mdin the post-generation review. - Always emit a semantic key field for every entity, regardless of whether the spec explicitly mentioned it.
- Always include
strict ( 2 );in the BDEF — add it post-generation if missing. - Never propose
unmanagedfor a new BO on new tables. The generators do not even offer it. - Ask before requesting a transport. Never auto-select an existing TR; never auto-create one.
- Call out BTP vs S/4HANA on-prem differences wherever they affect the design (released APIs, annotations).
- Tests are always TODO. The generator never emits them; the post-generation review always flags this.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: matt1as
- Source: matt1as/claude-abap-skills
- License: Apache-2.0
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.