<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Ai-Abap-Development-Series on Marian Zeis Blog</title>
    <link>https://blog.zeis.de/tags/ai-abap-development-series/</link>
    <description>Recent content in Ai-Abap-Development-Series on Marian Zeis Blog</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 03 Aug 2026 07:00:00 +0200</lastBuildDate>
    <atom:link href="https://blog.zeis.de/tags/ai-abap-development-series/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>ARC-1 1.0: One Deployment, Multiple SAP Systems</title>
      <link>https://blog.zeis.de/posts/2026-08-03-arc-1-update/</link>
      <pubDate>Mon, 03 Aug 2026 07:00:00 +0200</pubDate>
      <guid>https://blog.zeis.de/posts/2026-08-03-arc-1-update/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1/releases/tag/v1.0.0&#34;&gt;ARC-1 1.0 is here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;When I published the &lt;a href=&#34;https://blog.zeis.de/posts/2026-04-27-arc-1/&#34;&gt;first ARC-1 post&lt;/a&gt;, I explained why I built an MCP server for ABAP development and why security has to be part of it from the beginning. This post is not another deep dive into every tool. The &lt;a href=&#34;https://docs.arc-1-mcp.com/release-notes/&#34;&gt;release notes&lt;/a&gt; already do that.&lt;/p&gt;&#xA;&lt;p&gt;For version 1.0 I want to focus on what really changed: ARC-1 became more stable, it can serve multiple SAP systems from one BTP deployment, the BTP and security setup is much better documented, and the project is no longer only one repository.&lt;/p&gt;&#xA;&lt;p&gt;Most of this happened because people used ARC-1, asked difficult questions, reported problems, opened issues and pull requests, sent me private messages, and invited me to Teams meetings about their plans and experiences. That is the most important part of this release.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-version-10-means&#34;&gt;What version 1.0 means&lt;/h2&gt;&#xA;&lt;p&gt;Version 1.0 does not mean ARC-1 is finished. It means there is now a stable base.&lt;/p&gt;&#xA;&lt;p&gt;ARC-1 now has a clearer scope. It is a controlled connection between AI assistants and ABAP systems. It can run locally for one developer or centrally on SAP BTP for a team. It supports classic on-premise ABAP, S/4HANA, BTP ABAP Environment, and S/4HANA Cloud Public Edition.&lt;/p&gt;&#xA;&lt;p&gt;It stays read-only by default. Changing code, reading business data, running SQL, changing transports, or using Git has to be enabled separately. This makes it possible to start small and only allow more when a team is ready.&lt;/p&gt;&#xA;&lt;p&gt;The new multi-system mode is still marked as experimental because parts of the setup and behavior may change. But it can already be used and is running in productive BTP environments, not only in my own setup.&lt;/p&gt;&#xA;&lt;p&gt;That is what 1.0 means to me: not that every possible ADT feature exists, but that the foundation, operating model, and safety boundaries are clear enough to build on.&lt;/p&gt;&#xA;&lt;h2 id=&#34;this-release-was-built-through-feedback&#34;&gt;This release was built through feedback&lt;/h2&gt;&#xA;&lt;p&gt;The first versions were mostly based on my own systems and workflows. That changed quickly. SAP systems, releases, login setups, networks, and transport processes are too different to understand from one landscape.&lt;/p&gt;&#xA;&lt;p&gt;Public issues and pull requests brought real system shapes into the project. A few examples:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1/pull/97&#34;&gt;Wouter Lemaire added the first BTP Cloud Foundry deployment&lt;/a&gt;, followed it with &lt;a href=&#34;https://github.com/arc-mcp/arc-1/pull/107&#34;&gt;deployment and write fixes&lt;/a&gt;, and continued to give very practical guidance on BTP, destinations, and how a shared ARC-1 service should be operated.&lt;/li&gt;&#xA;&lt;li&gt;Sami Bouguerra contributed &lt;a href=&#34;https://github.com/arc-mcp/arc-1/pull/170&#34;&gt;NetWeaver 7.50 probe fixtures and cookie handling&lt;/a&gt;, then fixed cases where activation looked successful although SAP had not activated the object in &lt;a href=&#34;https://github.com/arc-mcp/arc-1/pull/179&#34;&gt;PR #179&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Clément Ringot made BTP login more reliable across deployments in &lt;a href=&#34;https://github.com/arc-mcp/arc-1/pull/212&#34;&gt;PR #212&lt;/a&gt; and &lt;a href=&#34;https://github.com/arc-mcp/arc-1/pull/267&#34;&gt;PR #267&lt;/a&gt;, and fixed Cloud Connector response handling in &lt;a href=&#34;https://github.com/arc-mcp/arc-1/pull/440&#34;&gt;PR #440&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1/pull/524&#34;&gt;Geert-Jan Klaps added S/4HANA Public Cloud support&lt;/a&gt;. I do not have access to such a system myself, so his contribution made it possible to add and verify this landscape in ARC-1.&lt;/li&gt;&#xA;&lt;li&gt;Community pull requests added table queries, newer package creation, safer transport handling, better BTP login, configurable server names, and cookie rotation. You can find them in the repository&amp;rsquo;s &lt;a href=&#34;https://github.com/arc-mcp/arc-1/pulls?q=is%3Apr+is%3Amerged&#34;&gt;pull requests&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Not every useful contribution was code. Issues such as &lt;a href=&#34;https://github.com/arc-mcp/arc-1/issues/531&#34;&gt;multi-system connections&lt;/a&gt; and &lt;a href=&#34;https://github.com/arc-mcp/arc-1/issues/377&#34;&gt;how to structure several systems on BTP&lt;/a&gt; changed the architecture and documentation. Reports from older systems improved release detection and fallbacks. Questions from Basis and security people forced me to make assumptions explicit instead of hiding them in configuration examples.&lt;/p&gt;&#xA;&lt;p&gt;I also received many private messages and joined Teams meetings about ARC-1. Some people explained how their teams want to deploy it on BTP and walked me through their real landscape and requirements. Others pointed out security issues, unclear documentation, or places where the safety boundaries were not strong enough. These conversations directly improved login, error handling, audit information, package restrictions, user identity, and the deployment guides.&lt;/p&gt;&#xA;&lt;p&gt;Thank you especially to everyone who reported a security concern privately. That is exactly how an open-source security process should work. ARC-1 now has a public &lt;a href=&#34;https://github.com/arc-mcp/arc-1/blob/main/SECURITY.md&#34;&gt;security policy&lt;/a&gt;, private vulnerability reporting, automated checks for code and dependencies, container checks, and an inventory of the software included in each release.&lt;/p&gt;&#xA;&lt;h2 id=&#34;one-arc-1-instance-multiple-sap-systems&#34;&gt;One ARC-1 instance, multiple SAP systems&lt;/h2&gt;&#xA;&lt;p&gt;The biggest addition in version 1.0 is the experimental &lt;a href=&#34;https://docs.arc-1-mcp.com/multi-target-setup/&#34;&gt;multi-system mode&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;You can now deploy one ARC-1 application on SAP BTP Cloud Foundry and attach several SAP systems or clients through destinations in the same subaccount. An administrator chooses which destinations belong to ARC-1. It does not connect to every destination by accident.&lt;/p&gt;&#xA;&lt;p&gt;This is already used in productive BTP environments. Experimental in this case means that configuration and behavior can still change as more landscapes use it. It does not mean that the feature is only a local proof of concept or that people cannot use it today.&lt;/p&gt;&#xA;&lt;p&gt;Each system and client gets its own MCP address. There is also an optional combined connection for tasks that really need several systems. A system-specific address is the safer choice for normal work because the conversation is already connected to the correct target.&lt;/p&gt;&#xA;&lt;p&gt;Keeping the real user identity is the recommended setup. A user logs in on BTP and the identity is forwarded to SAP. SAP then checks the same authorizations the person already has. A shared technical user is possible for special cases, but it gives less clear responsibility and needs more care.&lt;/p&gt;&#xA;&lt;p&gt;This feature started with community requests and Wouter&amp;rsquo;s &lt;a href=&#34;https://github.com/arc-mcp/arc-1/pull/543&#34;&gt;first multi-backend implementation&lt;/a&gt;. His code and BTP experience gave the final design important groundwork. The production-focused design, security review, tests, and administrator documentation then landed in &lt;a href=&#34;https://github.com/arc-mcp/arc-1/pull/579&#34;&gt;PR #579&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-biggest-changes-in-short&#34;&gt;The biggest changes in short&lt;/h2&gt;&#xA;&lt;p&gt;I do not want to explain every feature here. These are the areas that matter most for 1.0:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Safer operation:&lt;/strong&gt; ARC-1 starts read-only. Higher-risk actions are separate choices, SAP still decides what the user may do, and teams get limits and audit information for shared use.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;More SAP compatibility:&lt;/strong&gt; testing and fixes now cover older NetWeaver systems, several S/4HANA releases, ABAP Platform 2025, BTP ABAP Environment, and S/4HANA Cloud Public Edition.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Better BTP guidance:&lt;/strong&gt; the &lt;a href=&#34;https://docs.arc-1-mcp.com/btp-overview/&#34;&gt;BTP overview&lt;/a&gt;, &lt;a href=&#34;https://docs.arc-1-mcp.com/btp-cloud-foundry-deployment/&#34;&gt;Cloud Foundry guide&lt;/a&gt;, &lt;a href=&#34;https://docs.arc-1-mcp.com/principal-propagation-setup/&#34;&gt;user identity guide&lt;/a&gt;, updates, rollback, destinations, roles, and multi-system operation are now documented as one path.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Reusable workflows:&lt;/strong&gt; 22 included skills cover RAP, tests, migrations, Clean Core analysis, transport reviews, system documentation, and more.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;More checks before a release:&lt;/strong&gt; ARC-1 runs automated tests against the code and real SAP systems, checks dependencies and containers, and publishes information about what is included in a release.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;For the exact technical list, including fixes for transport state, ABAP object types, BTP token exchange, tracing, and protocol compatibility, use the &lt;a href=&#34;https://docs.arc-1-mcp.com/release-notes/&#34;&gt;release notes&lt;/a&gt; and the &lt;a href=&#34;https://github.com/arc-mcp/arc-1/releases/tag/v1.0.0&#34;&gt;GitHub v1.0.0 release&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;skills-for-complete-sap-tasks&#34;&gt;Skills for complete SAP tasks&lt;/h2&gt;&#xA;&lt;p&gt;ARC-1 1.0 includes 22 skills. A skill is a reusable workflow for an AI assistant. It gives the assistant a tested way to approach a larger task instead of relying on one large prompt.&lt;/p&gt;&#xA;&lt;p&gt;The included skills cover creating RAP services and logic, ABAP and CDS tests, analytical models and queries, explaining and documenting existing code, finding slow SQL, Clean Core and S/4HANA migration work, unused-code checks, transport overviews and reviews, and modernizing legacy UI5 applications. There are also helpers to understand a system first, create a local ABAP mirror, and review an AI session. The &lt;a href=&#34;https://docs.arc-1-mcp.com/skills/&#34;&gt;full skills catalog&lt;/a&gt; has the complete list and installation options for Claude Code, GitHub Copilot, Cursor, Codex, and other assistants.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://github.com/arc-mcp/arc-1/tree/main/skills/migrate-segw-to-rap&#34;&gt;SEGW-to-RAP skill&lt;/a&gt; deserves a special mention. It reads an existing SEGW OData V2 service, including its model and custom code, and guides the move to a modern RAP V4 service. My &lt;a href=&#34;https://blog.zeis.de/posts/2026-05-11-segw-to-rap/&#34;&gt;SEGW-to-RAP post&lt;/a&gt; got one of the biggest responses of the whole ARC-1 series. That was a clear signal that many teams are not only interested in creating something new. They also need practical help to modernize the large amount of existing SAP applications.&lt;/p&gt;&#xA;&lt;h2 id=&#34;extensions-for-your-own-sap-apis&#34;&gt;Extensions for your own SAP APIs&lt;/h2&gt;&#xA;&lt;p&gt;ARC-1 will never include every custom API or company-specific endpoint. Forking the complete server for one internal tool is also difficult to maintain.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://docs.arc-1-mcp.com/extensions/&#34;&gt;extension framework&lt;/a&gt; gives you another option. It lets you add your own tools and reuse the SAP connection, safety checks, and audit path of the ARC-1 instance. This can be useful for an internal service or any API that is not part of the standard ARC-1 tools.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://github.com/arc-mcp/arc-1-extension-sample&#34;&gt;extension sample&lt;/a&gt; shows a simple configuration option and a code option. It also shows the safety limits. An extension cannot give itself more access than the ARC-1 instance already has, and changes still need to be enabled explicitly. Code extensions run inside ARC-1, so they should be reviewed like any other dependency.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/ClementRingot/LISA&#34;&gt;LISA&lt;/a&gt; is already a useful real example. It provides SAP translation tools as a standalone MCP server and as an ARC-1 extension. This proves both paths can work: build a separate focused service, or attach the capability to an existing ARC-1 deployment.&lt;/p&gt;&#xA;&lt;h2 id=&#34;reusing-the-btp-authentication-stack&#34;&gt;Reusing the BTP authentication stack&lt;/h2&gt;&#xA;&lt;p&gt;Login and keeping the correct SAP user were some of the hardest parts of ARC-1. Other SAP MCP servers need the same foundations, so this code is now available as the separate &lt;a href=&#34;https://www.npmjs.com/package/@arc-mcp/xsuaa-auth&#34;&gt;@arc-mcp/xsuaa-auth&lt;/a&gt; package.&lt;/p&gt;&#xA;&lt;p&gt;It provides the core pieces for deploying an MCP server to SAP BTP Cloud Foundry: login through XSUAA, reuse of BTP destinations, connections through Cloud Connector, and forwarding the real user to SAP. A project can reuse this setup and keep its own focused SAP API instead of copying the full ARC-1 server.&lt;/p&gt;&#xA;&lt;p&gt;ARC-1 uses the package itself. &lt;a href=&#34;https://github.com/ClementRingot/LISA&#34;&gt;LISA&lt;/a&gt; and &lt;a href=&#34;https://github.com/ClementRingot/ROSA&#34;&gt;ROSA&lt;/a&gt; use it as well, and &lt;a href=&#34;https://github.com/dnic-dev/bw-modeling-mcp&#34;&gt;BW Modeling MCP&lt;/a&gt; now uses it for its central SAP BTP Cloud Foundry setup. For me this is an important part of the release. The value of ARC-1 is not only the number of ABAP tools. The deployment and security principles can now help other projects too.&lt;/p&gt;&#xA;&lt;h2 id=&#34;a-new-home-for-the-project&#34;&gt;A new home for the project&lt;/h2&gt;&#xA;&lt;p&gt;ARC-1 moved from my personal GitHub account to the &lt;a href=&#34;https://github.com/arc-mcp&#34;&gt;arc-mcp organization&lt;/a&gt;. There is also a dedicated &lt;a href=&#34;https://arc-1-mcp.com/&#34;&gt;landing page&lt;/a&gt;, full documentation at &lt;a href=&#34;https://docs.arc-1-mcp.com/&#34;&gt;docs.arc-1-mcp.com&lt;/a&gt;, and a &lt;a href=&#34;https://live-arc-1.arc-1-mcp.com/&#34;&gt;live replay demo&lt;/a&gt; that works without a SAP system, credentials, or a live LLM.&lt;/p&gt;&#xA;&lt;p&gt;The organization now contains the main product, reusable components, experiments, and demos that are still active:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;arc-1&lt;/a&gt;: the main SAP ADT MCP server.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/xsuaa-auth&#34;&gt;xsuaa-auth&lt;/a&gt;: reusable XSUAA, OAuth, and BTP Principal Propagation.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-extension-sample&#34;&gt;arc-1-extension-sample&lt;/a&gt;: examples for custom ARC-1 tools.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/adt-ls&#34;&gt;adt-ls&lt;/a&gt;: a TypeScript SDK for SAP&amp;rsquo;s headless ADT language server.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-lsp&#34;&gt;arc-1-lsp&lt;/a&gt;: an experimental MCP server built on that language-server path.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc1-adt-abap-mcp-ext&#34;&gt;arc1-adt-abap-mcp-ext&lt;/a&gt;: an Eclipse extension adding read-only tools to SAP&amp;rsquo;s ADT MCP server.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review&#34;&gt;arc-1-abap-cicd-review&lt;/a&gt;: an ABAP review workflow with GitHub Actions, abaplint, AI review, and live SAP checks.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc1-transport-review-poc&#34;&gt;arc1-transport-review-poc&lt;/a&gt;: a proof of concept for reviewing SAP transports through pull requests.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap&#34;&gt;arc-1-segw-to-rap&lt;/a&gt;: the SEGW, RAP, UI5, and Fiori elements modernization demo.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-mcp.com&#34;&gt;arc-1-mcp.com&lt;/a&gt;: the source of the landing page.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/live-arc-1&#34;&gt;live-arc-1&lt;/a&gt;: the source of the interactive replay demo.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Not every repository has the same maturity. ARC-1 is the stable core. Some projects are reusable packages, some are beta, and some are intentionally proofs of concept. Keeping them separate makes this more visible and lets each idea develop without making the main server bigger.&lt;/p&gt;&#xA;&lt;h2 id=&#34;where-to-start&#34;&gt;Where to start&lt;/h2&gt;&#xA;&lt;p&gt;If you are new to ARC-1, use the &lt;a href=&#34;https://docs.arc-1-mcp.com/quickstart/&#34;&gt;quickstart&lt;/a&gt; with a development or sandbox system and start read-only. The live demo is useful if you first want to see how the workflows and tool calls look.&lt;/p&gt;&#xA;&lt;p&gt;For a team deployment, start with the &lt;a href=&#34;https://docs.arc-1-mcp.com/btp-overview/&#34;&gt;BTP overview&lt;/a&gt;. Decide the topology, identity model, destinations, and responsibilities before enabling more capabilities. Principal Propagation should be the normal choice when SAP needs to see the human user.&lt;/p&gt;&#xA;&lt;p&gt;If you already run ARC-1, follow the &lt;a href=&#34;https://docs.arc-1-mcp.com/updating/&#34;&gt;update guide&lt;/a&gt; and review the &lt;a href=&#34;https://docs.arc-1-mcp.com/release-notes/&#34;&gt;release notes&lt;/a&gt;. For production, pin a version instead of using &lt;code&gt;latest&lt;/code&gt;, keep the first acceptance test read-only, and review the current SAP API policy and your own agreements before enabling data preview or free SQL.&lt;/p&gt;&#xA;&lt;h2 id=&#34;arc-1-saps-mcp-server-and-the-api-policy&#34;&gt;ARC-1, SAP&amp;rsquo;s MCP server, and the API policy&lt;/h2&gt;&#xA;&lt;p&gt;SAP now also provides its own ABAP MCP server as part of the ABAP Development Tools. I do not see this as an either-or decision.&lt;/p&gt;&#xA;&lt;p&gt;SAP&amp;rsquo;s server is the natural choice for a developer who works inside VS Code or Eclipse and wants to reuse the existing IDE connection. ARC-1 has a different focus. It can run as a shared service on BTP, serve different AI clients and team workflows, cover classic and modern ABAP use cases, and give administrators one place for access rules and audit information. Many teams can use both.&lt;/p&gt;&#xA;&lt;p&gt;The detailed &lt;a href=&#34;https://docs.arc-1-mcp.com/arc-1-vs-sap-abap-mcp-server/&#34;&gt;ARC-1 and SAP ABAP MCP Server comparison&lt;/a&gt; explains where each option fits, where each one is stronger, and where each one has limits. It is meant as a decision guide, not as a sales comparison.&lt;/p&gt;&#xA;&lt;p&gt;More important for a wider rollout is the &lt;a href=&#34;https://docs.arc-1-mcp.com/sap-api-policy-and-architecture/&#34;&gt;SAP API Policy and architecture guide&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;ARC-1 uses the ADT interfaces behind SAP&amp;rsquo;s ABAP development tools. These interfaces have been used by SAP and third-party developer tools for many years, but the ADT web endpoints are not listed as published APIs in the SAP Business Accelerator Hub. SAP&amp;rsquo;s current API policy also talks directly about access by generative AI and autonomous agents.&lt;/p&gt;&#xA;&lt;p&gt;At the same time, SAP has published an architecture for third-party MCP servers. ARC-1 is close to this architecture, especially when it runs on SAP BTP Cloud Foundry with BTP login, destinations, Cloud Connector, the real SAP user identity, traffic limits, and audit logging. This is a good technical fit, but it is not by itself a legal approval for every customer and every landscape.&lt;/p&gt;&#xA;&lt;p&gt;My recommendation is simple. Start in development or test, start read-only, and keep SAP authorizations in control. Before a broader or production rollout, ask your SAP contact whether your agreement allows third-party tools to use the ADT endpoints in this way. The policy and SAP guidance can change, so check the current documents instead of relying only on this post.&lt;/p&gt;&#xA;&lt;h2 id=&#34;thank-you&#34;&gt;Thank you&lt;/h2&gt;&#xA;&lt;p&gt;ARC-1 1.0 is not the result of one large feature. It is the result of many small reports, tests, discussions, fixes, and reviews.&lt;/p&gt;&#xA;&lt;p&gt;Thank you to everyone who opened an issue or pull request, tested another SAP release, shared a BTP setup, challenged a security decision, built an extension, tried the documentation, or sent a private message. Even when I could not implement an idea directly, the feedback helped make the project clearer and safer.&lt;/p&gt;&#xA;&lt;p&gt;Feedback is still greatly appreciated. Open an &lt;a href=&#34;https://github.com/arc-mcp/arc-1/issues&#34;&gt;issue&lt;/a&gt; when something does not work or the documentation is unclear. Send a pull request when you have a fix or improvement. A private message is also welcome, especially when you want to share details about a real landscape or raise a security concern.&lt;/p&gt;&#xA;&lt;p&gt;Version 1.0 is a milestone, not the end. Now there is a stable base, public documentation, a clearer security process, and a growing set of reusable projects around it.&lt;/p&gt;&#xA;</description>
    </item>
    <item>
      <title>Before You Upgrade S/4HANA: Static UI5 Checks with MCP</title>
      <link>https://blog.zeis.de/posts/2026-05-20-ui5-upgrade-mcp/</link>
      <pubDate>Wed, 20 May 2026 23:00:00 +0200</pubDate>
      <guid>https://blog.zeis.de/posts/2026-05-20-ui5-upgrade-mcp/</guid>
      <description>&lt;p&gt;Series note: This post is part of my &lt;a href=&#34;https://blog.zeis.de/tags/ai-abap-development-series/&#34;&gt;AI ABAP development series&lt;/a&gt;. It reuses the legacy UI5 app from the &lt;a href=&#34;https://blog.zeis.de/posts/2026-05-11-segw-to-rap/&#34;&gt;SEGW to RAP migration demo&lt;/a&gt;, but this time the focus is only on the UI5 version upgrade problem.&lt;/p&gt;&#xA;&lt;p&gt;In the SEGW to RAP post I used a deliberately old freestyle UI5 app as migration material. It runs on SAPUI5 1.84.59 and contains many patterns that were normal in older projects: &lt;code&gt;jQuery.sap.require&lt;/code&gt;, global formatters, synchronous bootstrap, Belize theme, older manifest versions, and a few small controller workarounds.&lt;/p&gt;&#xA;&lt;p&gt;That is a useful demo app because it is close to the kind of thing you find during S/4HANA upgrades. The backend migration is one problem, but the UI5 version jump is another one.&lt;/p&gt;&#xA;&lt;p&gt;The process should look something like this: First, you identify the old and new UI5 versions. Then you read through the changelogs and What&amp;rsquo;s New pages to see what has changed. Next check which APIs have been deprecated or which themes have been removed, and search the documentation for possible replacements. Then you apply those findings to the app and start the app to see if the fixes work.&lt;br&gt;&#xA;But usually you start the app with the new version and hope for the best and fix things you find there.&lt;/p&gt;&#xA;&lt;p&gt;That works, but it is a lot of manual context switching. The release notes are broad, the app only uses a small part of UI5, and the important question is not &amp;ldquo;what changed in UI5?&amp;rdquo;. The useful question is:&lt;/p&gt;&#xA;&lt;p&gt;What changed in UI5 that matters for this app?&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Before You Upgrade S/4HANA static UI5 checks with MCP.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-20-ui5-upgrade-mcp/images/linkedin-post.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-changed&#34;&gt;What Changed&lt;/h2&gt;&#xA;&lt;p&gt;I added a new &lt;code&gt;ui5_version_diff&lt;/code&gt; tool to my &lt;a href=&#34;https://github.com/marianfoo/mcp-sap-docs&#34;&gt;SAP Docs MCP server&lt;/a&gt; in &lt;a href=&#34;https://github.com/marianfoo/mcp-sap-docs/pull/47&#34;&gt;mcp-sap-docs PR #47&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The tool is backed by &lt;a href=&#34;https://github.com/marianfoo/ui5-lib-diff&#34;&gt;ui5-lib-diff&lt;/a&gt;. A small change in &lt;a href=&#34;https://github.com/marianfoo/ui5-lib-diff/pull/11&#34;&gt;ui5-lib-diff PR #11&lt;/a&gt; now publishes a static JSON API for tools.&lt;/p&gt;&#xA;&lt;p&gt;The important part is that the MCP server does not send HTTP requests at runtime. During setup it downloads the &lt;code&gt;all-changes.json&lt;/code&gt; bundle once. At runtime the tool reads the local bundle and filters it by version range, change type, UI5 library, or query text.&lt;/p&gt;&#xA;&lt;p&gt;That makes it much more useful for agents. The UI5 Lib Diff app is still great for humans, because you can visually compare versions at &lt;a href=&#34;https://ui5-lib-diff.marianzeis.de/&#34;&gt;ui5-lib-diff.marianzeis.de&lt;/a&gt;. But an agent needs structured data it can filter without opening a client-rendered UI route.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;UI5 version diff, project info, and version info tool calls in the upgrade run.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-20-ui5-upgrade-mcp/images/tool-calls-project-info.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;The second part is the official &lt;a href=&#34;https://github.com/UI5/mcp-server&#34;&gt;UI5 MCP server&lt;/a&gt; from SAP. That server can inspect a local UI5 project and run UI5-specific checks.&lt;/p&gt;&#xA;&lt;p&gt;This is important: these checks run against the app source code in a local checkout, for example the version cloned from your Git server. They are not executed against the deployed app in the SAP system or against a running launchpad tile. The deployed app still needs runtime testing later, but the first evidence can come from the local project before that.&lt;/p&gt;&#xA;&lt;p&gt;In this run the useful tools were:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;get_project_info&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;get_version_info&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;run_ui5_linter&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;run_manifest_validation&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;optionally &lt;code&gt;get_api_reference&lt;/code&gt; and &lt;code&gt;get_guidelines&lt;/code&gt; for follow-up details&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;So the split is clear:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;SAP Docs MCP says what changed between UI5 versions.&lt;/li&gt;&#xA;&lt;li&gt;UI5 MCP says what the local app actually uses and what fails.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;That combination is the interesting part.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-run&#34;&gt;The Run&lt;/h2&gt;&#xA;&lt;p&gt;For the showcase I used a local clone of the same &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/legacy-ui5-app&#34;&gt;legacy UI5 app&lt;/a&gt; from the &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap&#34;&gt;arc-1-segw-to-rap repo&lt;/a&gt;. I also used the workflow in &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/skills/ui5-versions-upgrade.md&#34;&gt;&lt;code&gt;ui5-versions-upgrade.md&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The prompt was basically:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;i want to upgrade the legacy-ui5-app from version&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;use ui5-versions-upgrade.md to produce a good markdown&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The skill tells the agent to first establish the scope, then inspect the project, then cross-check deprecations with the linter and code, then look for fixes and relevant features. It also tells the agent not to dump the full changelog into the report.&lt;/p&gt;&#xA;&lt;p&gt;For the demo app the report found:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;current version: SAPUI5 1.84.59&lt;/li&gt;&#xA;&lt;li&gt;target version: SAPUI5 1.147.2&lt;/li&gt;&#xA;&lt;li&gt;resolved diff range in the local bundle: 1.84.56 to 1.147.0&lt;/li&gt;&#xA;&lt;li&gt;339 versions in range&lt;/li&gt;&#xA;&lt;li&gt;3,540 features&lt;/li&gt;&#xA;&lt;li&gt;15,249 fixes&lt;/li&gt;&#xA;&lt;li&gt;985 deprecations&lt;/li&gt;&#xA;&lt;li&gt;961 SAPUI5 What&amp;rsquo;s New entries&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;That sounds like too much information, and it is. The point of the workflow is to reduce it.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;UI5 linter and manifest validation results from the upgrade run.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-20-ui5-upgrade-mcp/images/linter-manifest-validation.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;The UI5 linter and manifest validation made the report concrete. It did not just say that some API somewhere is deprecated. It found issues in this app:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;jQuery.sap.require&lt;/code&gt; and &lt;code&gt;jQuery.sap.declare&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;global &lt;code&gt;sap.*&lt;/code&gt; usage&lt;/li&gt;&#xA;&lt;li&gt;synchronous bootstrap&lt;/li&gt;&#xA;&lt;li&gt;missing async component configuration&lt;/li&gt;&#xA;&lt;li&gt;old &lt;code&gt;sap_belize&lt;/code&gt; theme and &lt;code&gt;themelib_sap_belize&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;sap.m.MessagePage&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;manifest &lt;code&gt;_version&lt;/code&gt; 1.40.0&lt;/li&gt;&#xA;&lt;li&gt;old &lt;code&gt;minUI5Version&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;ambiguous XML event handlers&lt;/li&gt;&#xA;&lt;li&gt;old UI5 Tooling setup&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;That is exactly the kind of list I want before I start the live browser test. It does not replace testing the deployed app, but it removes a lot of blind work before testers touch the running application.&lt;/p&gt;&#xA;&lt;h2 id=&#34;narrowing-the-changelog&#34;&gt;Narrowing the Changelog&lt;/h2&gt;&#xA;&lt;p&gt;The broad range query is only the starting point. After that the agent used narrower calls:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;types=[&amp;quot;DEPRECATED&amp;quot;]&lt;/code&gt; to focus on migration blockers&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;types=[&amp;quot;FEATURE&amp;quot;]&lt;/code&gt; with &lt;code&gt;ui5_library=&amp;quot;sap.m&amp;quot;&lt;/code&gt; or &lt;code&gt;sap.f&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;query=&amp;quot;jQuery.sap&amp;quot;&lt;/code&gt; to inspect relevant deprecations&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;query=&amp;quot;setTimeout&amp;quot;&lt;/code&gt; to see if a local workaround matches a framework fix&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Filtered UI5 version diff calls for features and deprecations.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-20-ui5-upgrade-mcp/images/filtered-version-diff.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;That last point is the more interesting long-term use case. During upgrades we often carry workarounds forward because nobody knows if the original UI5 bug still exists. With a searchable version diff, an agent can look for a symptom or API and then check whether a fix landed between the old and new version.&lt;/p&gt;&#xA;&lt;p&gt;It still has to verify the local code. A changelog entry is not proof that a workaround can be deleted. But it gives the agent a much better starting point than asking it to guess from memory.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;UI5 version info and a filtered fix query for the legacy app upgrade.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-20-ui5-upgrade-mcp/images/version-info-and-fix-query.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;The generated report is here:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/legacy-ui5-app-upgrade.md&#34;&gt;legacy-ui5-app-upgrade.md&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;The report is not a replacement for a real migration. It is the first step: concrete evidence for what may need to change. For this demo it already produced a useful edit plan: update tooling, switch theme, migrate the manifest, enable async loading, clean module usage, replace deprecated controls, then rerun linter and manifest validation.&lt;/p&gt;&#xA;&lt;p&gt;The next step can use the same MCP tools again, but now for implementation. You do not have to apply every finding at once. You can ask the agent to fix only the theme and manifest issues, only the &lt;code&gt;jQuery.sap.*&lt;/code&gt; usage, or the full list. That is basically the same pattern I showed in the SEGW to RAP post when the legacy freestyle UI5 app was converted into a &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/modern-ui5-ts-app&#34;&gt;modern UI5 TypeScript app&lt;/a&gt;: inspect first, use UI5-specific tools, implement, then rerun linting, manifest validation, type checks, and browser checks.&lt;/p&gt;&#xA;&lt;p&gt;If a finding needs more explanation, the same SAP Docs MCP server can still search SAPUI5 documentation and fetch more detail. For API-level replacement details, the UI5 MCP server can also use &lt;code&gt;get_api_reference&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-i-like-this-pattern&#34;&gt;Why I Like This Pattern&lt;/h2&gt;&#xA;&lt;p&gt;The useful shift is that the model is no longer asked to &amp;ldquo;know UI5 upgrades&amp;rdquo;. It is given tools that expose the right context:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;the version diff tells it what changed&lt;/li&gt;&#xA;&lt;li&gt;the project info tells it what the app uses&lt;/li&gt;&#xA;&lt;li&gt;the linter tells it what is actually wrong&lt;/li&gt;&#xA;&lt;li&gt;the manifest validator tells it what the framework accepts&lt;/li&gt;&#xA;&lt;li&gt;the docs tools can fill gaps when a finding needs detail&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;That is a much better workflow than manually reading release notes until you hope you found everything.&lt;/p&gt;&#xA;&lt;p&gt;It is especially useful for larger version jumps, for example during S/4HANA upgrades where the UI5 version changes a lot. But I think it also helps for smaller minor upgrades. Even then, you want to know if a workaround is still needed, if a deprecation starts to matter, or if a newer UI5 feature lets you simplify code.&lt;/p&gt;&#xA;&lt;p&gt;The important boundary is still the same: the report is a first pass, not the final migration. You still need to edit, run the app, test the flows, and check the actual behavior. But the first pass can now be app-specific evidence instead of a generic changelog review, and the same tools can then help with the actual changes.&lt;/p&gt;&#xA;&lt;p&gt;For me that is the real value of MCP in SAP development. Not magic. Better context at the point where the model needs to reason.&lt;/p&gt;&#xA;&lt;h2 id=&#34;references-and-links&#34;&gt;References and Links&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.zeis.de/posts/2026-05-11-segw-to-rap/&#34;&gt;From SEGW and Legacy UI5 to RAP with ARC-1&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap&#34;&gt;arc-1-segw-to-rap repo&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/legacy-ui5-app&#34;&gt;legacy UI5 app&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/skills/ui5-versions-upgrade.md&#34;&gt;ui5-versions-upgrade.md skill&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/legacy-ui5-app-upgrade.md&#34;&gt;generated legacy UI5 upgrade report&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/marianfoo/mcp-sap-docs&#34;&gt;mcp-sap-docs repo&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/marianfoo/mcp-sap-docs/pull/47&#34;&gt;mcp-sap-docs PR #47: load UI5 diffs from local bundle&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/marianfoo/ui5-lib-diff&#34;&gt;ui5-lib-diff repo&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/marianfoo/ui5-lib-diff/pull/11&#34;&gt;ui5-lib-diff PR #11: publish static UI5 diff bundle&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://ui5-lib-diff.marianzeis.de/&#34;&gt;UI5 Lib Diff app&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://ui5-lib-diff.marianzeis.de/api/v1/manifest.json&#34;&gt;UI5 Lib Diff static API manifest&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/UI5/mcp-server&#34;&gt;UI5 MCP server GitHub repo&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.npmjs.com/package/%40ui5/mcp-server&#34;&gt;@ui5/mcp-server on npm&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://community.sap.com/t5/technology-blog-posts-by-sap/give-your-ai-agent-some-tools-introducing-the-ui5-mcp-server/ba-p/14200825&#34;&gt;SAP Community: Introducing the UI5 MCP Server&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://ui5.sap.com/#/releasenotes.html&#34;&gt;SAPUI5 release notes&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/whats-new/67f60363b57f4ac0b23efd17fa192d60?locale=en-US&#34;&gt;SAPUI5 What&amp;rsquo;s New Viewer&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>ABAP Development Automation with ARC-1 and GitHub Workflows</title>
      <link>https://blog.zeis.de/posts/2026-05-12-arc-1-abap-cicd-review/</link>
      <pubDate>Tue, 12 May 2026 09:00:00 +0200</pubDate>
      <guid>https://blog.zeis.de/posts/2026-05-12-arc-1-abap-cicd-review/</guid>
      <description>&lt;p&gt;Series note: This post is part of my &lt;a href=&#34;https://blog.zeis.de/tags/ai-abap-development-series/&#34;&gt;AI ABAP development series&lt;/a&gt;. In the previous posts I introduced &lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1&lt;/a&gt;, then used it from BTP, Copilot Studio, Joule Studio, and a SEGW to RAP migration.&lt;/p&gt;&#xA;&lt;p&gt;This post is about GitHub workflows as an ARC-1 development automation surface.&lt;/p&gt;&#xA;&lt;p&gt;ABAP teams already have strong SAP-side tooling: ATC, Code Inspector, ST22, ADT, and the activated source in the SAP system. GitHub has a different strength: pull requests, review comments, checks, labels, issues, and automation.&lt;/p&gt;&#xA;&lt;p&gt;The problem is that those worlds usually do not meet cleanly. &lt;a href=&#34;https://abapgit.org/&#34;&gt;abapGit&lt;/a&gt; can push ABAP source to GitHub, &lt;a href=&#34;https://abaplint.org/&#34;&gt;abaplint&lt;/a&gt; can run static checks, and Copilot or Claude can review a diff. But without access to the SAP system, the automation only sees text. It cannot run ABAP Unit, call ATC, compare against the activated object, inspect ST22, or verify what the SAP system actually knows.&lt;/p&gt;&#xA;&lt;p&gt;The underlying idea comes from the &lt;a href=&#34;https://docs.heliconialabs.com/patterns-for-using-llms-in-abap-development.pdf&#34;&gt;Patterns for using LLMs in ABAP development&lt;/a&gt; document by Lars Hvam from Heliconia Labs. The relevant pattern is section 2.7, Git / Off-Stack with read-only MCP. ABAP source lives in Git. Pull requests, CI/CD, static analysis, and human review stay in the Git workflow. The MCP server gives the LLM read-only context from the SAP system, but does not let it write directly into the system.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Heliconia Labs Git / Off-Stack with read-only MCP pattern showing Git, CI/CD, SAP, and a read-only ADT MCP server.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-12-arc-1-abap-cicd-review/patterns-git-offstack-mcp.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;So I created a small sample repository for this pattern: &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review&#34;&gt;github.com/arc-mcp/arc-1-abap-cicd-review&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This is my ARC-1 implementation of the idea. GitHub is the workflow surface. abapGit connects the repository and the SAP system. ARC-1 is the SAP automation gateway that lets GitHub workflows execute SAP-side checks and gives AI reviewers read-only SAP context through MCP.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-the-sample-shows&#34;&gt;What The Sample Shows&lt;/h2&gt;&#xA;&lt;p&gt;The sample repository contains a small ABAP package &lt;code&gt;ZARC1_DEMO&lt;/code&gt; in abapGit format. The package is deliberately small. The interesting part is what can be automated around it when GitHub can reach SAP through ARC-1.&lt;/p&gt;&#xA;&lt;p&gt;It covers three development automation scenarios:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;PR checks for ABAP code: abaplint, ABAP Unit, and ATC.&lt;/li&gt;&#xA;&lt;li&gt;PR review with SAP context: Copilot and Claude can review with live SAP reads instead of only the diff.&lt;/li&gt;&#xA;&lt;li&gt;Operational follow-up: ARC-1 can check ST22 dumps on a schedule, create GitHub issues for new dumps, and trigger a deeper investigation from a label.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The repo has six small workflow files: &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/blob/main/.github/workflows/pr.yml&#34;&gt;&lt;code&gt;pr.yml&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/blob/main/.github/workflows/sap-tests.yml&#34;&gt;&lt;code&gt;sap-tests.yml&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/blob/main/.github/workflows/copilot-review-trigger.yml&#34;&gt;&lt;code&gt;copilot-review-trigger.yml&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/blob/main/.github/workflows/claude-review-trigger.yml&#34;&gt;&lt;code&gt;claude-review-trigger.yml&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/blob/main/.github/workflows/sap-dump-triage.yml&#34;&gt;&lt;code&gt;sap-dump-triage.yml&lt;/code&gt;&lt;/a&gt;, and &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/blob/main/.github/workflows/sap-dump-deep-dive.yml&#34;&gt;&lt;code&gt;sap-dump-deep-dive.yml&lt;/code&gt;&lt;/a&gt;. ARC-1 is the common backend. GitHub Actions is only the automation surface.&lt;/p&gt;&#xA;&lt;h2 id=&#34;architecture-and-setup&#34;&gt;Architecture And Setup&lt;/h2&gt;&#xA;&lt;p&gt;The architecture follows the Git / Off-Stack with read-only MCP pattern:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Developer / IDE / LLM&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; local ABAP files&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; GitHub repository&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; pull requests, code reviews, CI/CD&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; abapGit&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; SAP system&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;GitHub Actions / review automation&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; ARC-1 MCP endpoint on SAP BTP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; read-only ADT context from the SAP system&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The Git repository is the collaboration surface. It contains source files, pull requests, review comments, labels, and CI/CD checks. That is where the AI can propose changes and where a human keeps the gate.&lt;/p&gt;&#xA;&lt;p&gt;The SAP system remains the source of truth for activated ABAP source, syntax checks, dumps, package content, and system-specific context. GitHub has the PR diff, but GitHub is not the runtime.&lt;/p&gt;&#xA;&lt;p&gt;ARC-1 sits between GitHub and SAP. In my setup it runs on SAP BTP Cloud Foundry. GitHub Actions calls the ARC-1 &lt;code&gt;/mcp&lt;/code&gt; endpoint over HTTPS with an API key. ARC-1 validates the key profile and then connects to the SAP system through the BTP destination. The technical SAP user is configured in that destination, not in GitHub.&lt;/p&gt;&#xA;&lt;p&gt;GitHub runners and AI tools do not get SAP credentials. They only get the ARC-1 URL and a scoped API key. The SAP system itself is not exposed to GitHub runners.&lt;/p&gt;&#xA;&lt;p&gt;The API key used in the demo has a &lt;code&gt;viewer-sql&lt;/code&gt; profile. That means read access, SQL/table preview where needed, diagnostics, navigation, and linting. It does not expose write tools like &lt;code&gt;SAPWrite&lt;/code&gt;, &lt;code&gt;SAPActivate&lt;/code&gt;, &lt;code&gt;SAPManage&lt;/code&gt;, &lt;code&gt;SAPTransport&lt;/code&gt;, or &lt;code&gt;SAPGit&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;That last point matters. I do not want the first version of this pattern to be &amp;ldquo;AI writes ABAP from a PR comment&amp;rdquo;. The safer and more useful first version is:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;AI can read the real SAP system.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;AI can explain what it found.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;AI can propose changes in a PR review.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Humans still decide what gets applied.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The setup has five parts.&lt;/p&gt;&#xA;&lt;p&gt;First, get the ABAP source into GitHub with abapGit. The exact setup depends on the system and repository authentication. The important point is that ABAP objects are available as normal files in GitHub, and approved changes can later be pulled back into SAP through the normal abapGit process.&lt;/p&gt;&#xA;&lt;p&gt;Second, deploy ARC-1. For this sample I use the BTP Cloud Foundry deployment because it gives GitHub Actions a public HTTPS endpoint while the SAP backend remains behind BTP connectivity. ARC-1 needs a destination to the ABAP system. The technical user is configured there and should only have the permissions needed for the checks you want to run. ARC-1 then adds the API key profile on top.&lt;/p&gt;&#xA;&lt;p&gt;Third, configure GitHub Actions secrets and variables:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ARC1_URL&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ARC1_API_KEY&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ANTHROPIC_API_KEY&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;COPILOT_TRIGGER_PAT&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;ARC1_URL&lt;/code&gt; points to the ARC-1 endpoint. &lt;code&gt;ARC1_API_KEY&lt;/code&gt; is used by the SAP test gate and the Claude workflows. &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; is needed for Claude Code Action. &lt;code&gt;COPILOT_TRIGGER_PAT&lt;/code&gt; is needed for the Copilot trigger workflow because comments posted by the default &lt;code&gt;GITHUB_TOKEN&lt;/code&gt; do not trigger &lt;code&gt;@copilot&lt;/code&gt; mentions.&lt;/p&gt;&#xA;&lt;p&gt;Fourth, configure Copilot Coding Agent. In the repository settings, the Copilot Cloud Agent gets an MCP configuration for ARC-1. The important detail is the tool allowlist: Copilot should see the read-side tools it needs for review, not the write-side tools.&lt;/p&gt;&#xA;&lt;p&gt;Fifth, decide which workflows you actually want. For a first rollout I would start with abaplint, the SAP test gate, and one AI review path. The scheduled dump check is useful because it helps you see new runtime problems before someone reports them manually, but it is a separate operational pattern. You do not need to enable everything on day one.&lt;/p&gt;&#xA;&lt;h2 id=&#34;pr-automation-layers&#34;&gt;PR Automation Layers&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Layer 1: abaplint&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The static layer is intentionally boring.&lt;/p&gt;&#xA;&lt;p&gt;Every pull request runs &lt;a href=&#34;https://abaplint.org/&#34;&gt;abaplint&lt;/a&gt; through &lt;a href=&#34;https://github.com/reviewdog/reviewdog&#34;&gt;reviewdog&lt;/a&gt;. Findings appear as check annotations, inline comments where GitHub allows it, and a sticky summary comment. The workflow gates only on findings introduced by the PR diff. Existing findings stay visible, but they do not block a PR that did not create them.&lt;/p&gt;&#xA;&lt;p&gt;If abaplint can catch it, abaplint should catch it. It is fast, deterministic, and basically free apart from GitHub Actions minutes.&lt;/p&gt;&#xA;&lt;p&gt;In the sample PR, abaplint found existing issues in the class and test class. That is useful, but it did not catch the main semantic issue in the PR: a direct &lt;code&gt;SELECT&lt;/code&gt; from &lt;code&gt;MARA&lt;/code&gt; added inside a task service method. The code is syntactically valid. The problem is architectural and Clean Core related.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Layer 2: ABAP Unit and ATC&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The next layer is still not AI. Here ARC-1 is simply the gateway connector from GitHub Actions into SAP.&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/blob/main/.github/workflows/sap-tests.yml&#34;&gt;&lt;code&gt;sap-tests.yml&lt;/code&gt;&lt;/a&gt; runs on every PR that touches &lt;code&gt;src/&lt;/code&gt;. It parses the abapGit filenames, maps them back to ABAP object types, and then calls ARC-1 directly from Bash. There is no model involved in this part.&lt;/p&gt;&#xA;&lt;p&gt;For changed classes it runs ABAP Unit through &lt;a href=&#34;https://docs.arc-1-mcp.com/tools/#sapdiagnose&#34;&gt;&lt;code&gt;SAPDiagnose&lt;/code&gt;&lt;/a&gt; with &lt;code&gt;action=&amp;quot;unittest&amp;quot;&lt;/code&gt;. For changed classes, interfaces, programs, and function groups it runs ATC through &lt;a href=&#34;https://docs.arc-1-mcp.com/tools/#sapdiagnose&#34;&gt;&lt;code&gt;SAPDiagnose&lt;/code&gt;&lt;/a&gt; with &lt;code&gt;action=&amp;quot;atc&amp;quot;&lt;/code&gt;. The result is posted as a sticky PR comment, and line-specific ATC findings are posted inline on the Files Changed tab when GitHub can attach them to the diff.&lt;/p&gt;&#xA;&lt;p&gt;The gate is simple: failing or erroring unit tests fail the job, and P1/P2 ATC findings fail the job. P3 findings are visible but do not block.&lt;/p&gt;&#xA;&lt;p&gt;The clean demo is &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/pull/20&#34;&gt;PR #20&lt;/a&gt;. It adds one more unit test to &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/blob/main/src/zcl_arc1_test_helpers.clas.abap&#34;&gt;&lt;code&gt;ZCL_ARC1_TEST_HELPERS&lt;/code&gt;&lt;/a&gt;. The workflow &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/pull/20#issuecomment-4432679538&#34;&gt;reports 7 of 7 ABAP Unit tests passing&lt;/a&gt; and one non-blocking P3 ATC warning.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;GitHub PR comment showing the SAP test gate with 7 of 7 ABAP Unit tests passing and one non-blocking ATC P3 finding.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-12-arc-1-abap-cicd-review/untitest-atc-report.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;There is one important assumption here. The test workflow runs against activated objects in SAP. That matches the normal abapGit loop I use: edit, activate, push. If your team pushes before activation, you need a PR sandbox system or a pre-step that pulls and activates before this workflow runs.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Layer 3: AI review without MCP&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;GitHub&amp;rsquo;s built-in Copilot Code Review can be assigned from the PR sidebar. That is already useful. It reads the diff and can catch common problems from the text alone.&lt;/p&gt;&#xA;&lt;p&gt;In the sample &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/pull/14&#34;&gt;PR #14&lt;/a&gt;, Copilot Code Review did catch the &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/pull/14#discussion_r3226642123&#34;&gt;direct &lt;code&gt;SELECT&lt;/code&gt; from &lt;code&gt;MARA&lt;/code&gt;&lt;/a&gt; as a Clean Core hotspot. That is a good result.&lt;/p&gt;&#xA;&lt;p&gt;But this review has an important limitation: it is still a diff-only review. It cannot know whether the object is already activated in SAP. It cannot ask the system for callers. It cannot inspect ST22. It cannot prove that a claim is backed by the current SAP system.&lt;/p&gt;&#xA;&lt;p&gt;That does not make it useless. It just means it is one layer.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Layer 4: AI review with ARC-1&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The MCP-backed review is the more interesting part.&lt;/p&gt;&#xA;&lt;p&gt;In the repo, applying the &lt;code&gt;copilot:review&lt;/code&gt; label posts a canonical &lt;code&gt;@copilot review ...&lt;/code&gt; prompt to the PR. Copilot Coding Agent then uses the ARC-1 MCP server configured in the repository settings.&lt;/p&gt;&#xA;&lt;p&gt;Applying the &lt;code&gt;claude:review&lt;/code&gt; label starts &lt;a href=&#34;https://github.com/anthropics/claude-code-action&#34;&gt;&lt;code&gt;anthropics/claude-code-action&lt;/code&gt;&lt;/a&gt; in GitHub Actions. The workflow writes an MCP config file, allows only selected ARC-1 tools, loads the prompt from &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/blob/main/.github/claude-review-prompt.md&#34;&gt;&lt;code&gt;claude-review-prompt.md&lt;/code&gt;&lt;/a&gt;, and asks Claude to post one pull request review.&lt;/p&gt;&#xA;&lt;p&gt;The prompt is deliberately concrete:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Use 2 to 5 ARC-1 tool calls.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Read the changed ABAP object from SAP.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Check for GitHub to SAP drift.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Only navigate references when the public contract changed.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Do not repeat abaplint or SAP test gate findings.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Post inline comments on changed lines.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Use GitHub suggestion blocks when the fix is concrete.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This makes the review auditable. The model still reasons, but important claims can point back to tool results.&lt;/p&gt;&#xA;&lt;p&gt;In PR #14, the decisive ARC-1 call was a &lt;a href=&#34;https://docs.arc-1-mcp.com/tools/#sapread&#34;&gt;&lt;code&gt;SAPRead&lt;/code&gt;&lt;/a&gt; of the activated &lt;code&gt;ZCL_ARC1_TASK_SERVICE~LIST_TASKS&lt;/code&gt; method from SAP. Claude then posted the &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/pull/14#discussion_r3228270334&#34;&gt;key finding&lt;/a&gt;: the &lt;code&gt;MARA&lt;/code&gt; block is not only a direct SAP table access, it also changes the meaning of &lt;code&gt;list_tasks&lt;/code&gt;. A task service should not silently return no tasks because the material master has no finished product.&lt;/p&gt;&#xA;&lt;p&gt;It also did the useful drift check:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;The activated ZCL_ARC1_TASK_SERVICE~LIST_TASKS in SAP matches the pre-PR source.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;The MARA block is not yet activated, as expected for an open PR.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;No unexpected drift.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That is the small sentence that justifies the whole architecture. A diff-only reviewer cannot know that. ARC-1 can.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Claude review on PR #14 showing SAPRead-backed drift information and the MARA finding on the changed ABAP method.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-12-arc-1-abap-cicd-review/claude-review-pr14.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;demo-prs&#34;&gt;Demo PRs&lt;/h2&gt;&#xA;&lt;p&gt;The main demo is &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/pull/14&#34;&gt;PR #14&lt;/a&gt;. It contains one harmless refactoring and one deliberately bad preflight inside &lt;code&gt;ZCL_ARC1_TASK_SERVICE~LIST_TASKS&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-abap&#34; data-lang=&#34;abap&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;select&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;single&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;matnr&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mara&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;into&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;@&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;data&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;lv_dummy_matnr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;where&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;mtart&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;s1&#34;&gt;&amp;#39;FERT&amp;#39;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;sy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;subrc&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;endif&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is deliberately wrong for the demo. It creates a hard dependency from a task service to the MM material master and reads a SAP-standard table directly. If product validation is needed, it should go through a released API or CDS view, and the service should not hide the reason by returning an empty list.&lt;/p&gt;&#xA;&lt;p&gt;That PR is useful because it shows several review surfaces on the same diff:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;abaplint finds static issues, but not the &lt;code&gt;MARA&lt;/code&gt; problem.&lt;/li&gt;&#xA;&lt;li&gt;the SAP test gate adds live ABAP Unit and ATC results for changed objects.&lt;/li&gt;&#xA;&lt;li&gt;Copilot Code Review sees the diff and flags the &lt;code&gt;MARA&lt;/code&gt; access, but cannot verify SAP state.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/pull/14#issuecomment-4430841521&#34;&gt;Copilot Coding Agent with ARC-1&lt;/a&gt; can combine diff review with live SAP reads, syntax, navigation, and release checks.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/pull/14#discussion_r3228270334&#34;&gt;Claude with ARC-1&lt;/a&gt; posts a focused review with inline comments, suggestion blocks, and the SAP drift check.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The separate SAP test gate example is &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/pull/20&#34;&gt;PR #20&lt;/a&gt;: one extra test method, 7 of 7 ABAP Unit tests green, and a single non-blocking P3 ATC finding.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;One-click suggestions&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Both Copilot and Claude can post GitHub review comments with suggestion blocks. That means the PR shows the same &amp;ldquo;Apply suggestion&amp;rdquo; button a human reviewer would get.&lt;/p&gt;&#xA;&lt;p&gt;This is now verified in PR #14. &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/pull/14#discussion_r3226642123&#34;&gt;Copilot Code Review&lt;/a&gt; and &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/pull/14#discussion_r3228270334&#34;&gt;Claude&lt;/a&gt; both suggested deleting the &lt;code&gt;MARA&lt;/code&gt; preflight block. Claude&amp;rsquo;s version adds the SAP-side evidence on top: &lt;a href=&#34;https://docs.arc-1-mcp.com/tools/#sapread&#34;&gt;&lt;code&gt;SAPRead&lt;/code&gt;&lt;/a&gt; confirmed that this block is not part of the currently activated method, so the review can separate &amp;ldquo;new in this PR&amp;rdquo; from &amp;ldquo;already active in SAP&amp;rdquo;.&lt;/p&gt;&#xA;&lt;p&gt;The two screenshots below are from the same lines in PR #14. Copilot shows the diff-only version of the review. Claude shows the same GitHub suggestion UX, but with the SAP-side drift evidence from ARC-1.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Claude review comment on PR #14 showing the MARA preflight deletion suggestion with SAPRead drift evidence and an Apply suggestion button.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-12-arc-1-abap-cicd-review/pr14-mara-claude.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Copilot Code Review comment on PR #14 showing the MARA preflight deletion suggestion with an Apply suggestion button.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-12-arc-1-abap-cicd-review/pr14-mara-copilot.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;The prompt asks for suggestion blocks only when the fix is concrete. A wrong suggestion block is worse than a normal comment because it invites the reviewer to apply it without thinking.&lt;/p&gt;&#xA;&lt;p&gt;This is not a replacement for a proper feature branch. It is just a good review UX for small, local fixes.&lt;/p&gt;&#xA;&lt;h2 id=&#34;operations-automation&#34;&gt;Operations Automation&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Autonomous dump triage&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The repo also has an operations pattern for staying ahead of runtime issues.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/blob/main/.github/workflows/sap-dump-triage.yml&#34;&gt;&lt;code&gt;sap-dump-triage.yml&lt;/code&gt;&lt;/a&gt; workflow asks ARC-1 for recent ST22 dumps through &lt;a href=&#34;https://docs.arc-1-mcp.com/tools/#sapdiagnose&#34;&gt;&lt;code&gt;SAPDiagnose&lt;/code&gt;&lt;/a&gt;. It can run on a schedule, deduplicates dumps against existing GitHub issues by storing the dump ID in an HTML comment marker, and creates one issue for each new dump with metadata, a short Claude triage, and an urgency label.&lt;/p&gt;&#xA;&lt;p&gt;For the sample repo, the cron is disabled so the issue list stays stable. In a real setup, I would turn it on so GitHub becomes a lightweight watch list for new dumps instead of waiting until someone reports the same runtime error again. The current examples are visible through the &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/issues?q=is%3Aissue+label%3Asap%3Adump&#34;&gt;&lt;code&gt;sap:dump&lt;/code&gt; label&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;This is the part I like most conceptually:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cheap shallow triage for everything&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;expensive deep investigation only when needed&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That is a much better cost model than asking the LLM to deeply inspect every dump forever.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Deep dive on demand&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;The second stage is the &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/blob/main/.github/workflows/sap-dump-deep-dive.yml&#34;&gt;&lt;code&gt;sap-dump-deep-dive.yml&lt;/code&gt;&lt;/a&gt; workflow. A human applies the &lt;code&gt;dump:investigate&lt;/code&gt; label to a dump issue. The workflow extracts the dump ID, reads the full dump through ARC-1, reads the failing ABAP source, and posts one investigation comment.&lt;/p&gt;&#xA;&lt;p&gt;The best demo is &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/issues/15&#34;&gt;issue #15&lt;/a&gt;, an &lt;code&gt;OBJECTS_OBJREF_NOT_ASSIGNED_NO&lt;/code&gt; dump in &lt;code&gt;CL_ENH_ADT_ENHO_OBJ_PERSIST&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Claude found a very concrete root cause. In &lt;code&gt;GET_DATA_FROM_TOOL&lt;/code&gt;, the first &lt;code&gt;CASE l_enhtooltype&lt;/code&gt; block creates &lt;code&gt;r_object_data&lt;/code&gt;, but it handles only BAdI and hook enhancement tool types. The dump variables showed &lt;code&gt;I_ENHO_TOOL&lt;/code&gt; as &lt;code&gt;CL_ENH_TOOL_WDY&lt;/code&gt;, a Web Dynpro enhancement tool. Because that tool type is not handled, &lt;code&gt;r_object_data&lt;/code&gt; stays initial. The next dereference at line 30 raises &lt;code&gt;CX_SY_REF_IS_INITIAL&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The interesting detail is that there is a second &lt;code&gt;CASE&lt;/code&gt; block later in the same method with a &lt;code&gt;WHEN OTHERS&lt;/code&gt; guard, but execution never reaches it because the null dereference happens earlier.&lt;/p&gt;&#xA;&lt;p&gt;That is the kind of analysis I want from this setup. It used the dump, selected variables, call stack, and source code. It did not just say &amp;ldquo;probably a null reference&amp;rdquo;. It explained why the reference was null and where the missing guard belongs.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/issues/15#issuecomment-4431477985&#34;&gt;deep-dive comment&lt;/a&gt; then updates the labels from &lt;code&gt;needs-triage&lt;/code&gt; to &lt;code&gt;dump:investigated&lt;/code&gt;. So GitHub becomes the lightweight operations board, while SAP remains the source of truth.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;GitHub issue #15 showing a Claude deep-dive analysis for an SAP short dump with root cause and labels.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-12-arc-1-abap-cicd-review/issue-15-claude.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;how-i-would-use-this&#34;&gt;How I Would Use This&lt;/h2&gt;&#xA;&lt;p&gt;For a small ABAP team, I would start with this sequence:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Push ABAP source to GitHub with abapGit.&lt;/li&gt;&#xA;&lt;li&gt;Run abaplint on every PR.&lt;/li&gt;&#xA;&lt;li&gt;Run ABAP Unit and ATC through ARC-1 on every PR.&lt;/li&gt;&#xA;&lt;li&gt;Use Copilot Code Review as a cheap, generic first AI review if you already have Copilot.&lt;/li&gt;&#xA;&lt;li&gt;Add &lt;code&gt;claude:review&lt;/code&gt; or &lt;code&gt;copilot:review&lt;/code&gt; only when the PR needs deeper SAP context.&lt;/li&gt;&#xA;&lt;li&gt;Enable dump triage manually first.&lt;/li&gt;&#xA;&lt;li&gt;Turn on the scheduled dump check once the issue noise level is understood.&lt;/li&gt;&#xA;&lt;li&gt;Use &lt;code&gt;dump:investigate&lt;/code&gt; only for dumps that are recurring, high urgency, or unclear.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;This keeps the workflow understandable. Not every PR needs a deep AI review, and not every dump needs full investigation. Static and deterministic checks should do the boring work first.&lt;/p&gt;&#xA;&lt;p&gt;The label interface is intentionally simple:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;copilot:review&lt;/code&gt; triggers Copilot Coding Agent with ARC-1.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;claude:review&lt;/code&gt; triggers Claude Code Action with ARC-1.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;sap:dump&lt;/code&gt; marks a dump tracker issue.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;needs-triage&lt;/code&gt; means the shallow workflow created the issue.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;dump:investigate&lt;/code&gt; triggers the deep-dive workflow.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;dump:investigated&lt;/code&gt; means the deep dive has already posted its analysis.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;urgency:high&lt;/code&gt;, &lt;code&gt;urgency:medium&lt;/code&gt;, and &lt;code&gt;urgency:low&lt;/code&gt; make the issue list sortable.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The labels are the UI. That keeps the pattern easy to teach and easy to extend.&lt;/p&gt;&#xA;&lt;h2 id=&#34;boundaries-and-next-steps&#34;&gt;Boundaries And Next Steps&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;Limitations&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Copilot Code Review and Copilot Coding Agent are not the same thing. The sidebar review is useful, but it does not use the MCP server. For MCP context, this repo uses label-triggered workflows.&lt;/p&gt;&#xA;&lt;p&gt;GitHub-hosted runners must reach the ARC-1 endpoint. That is why BTP Cloud Foundry is a good demo topology. If ARC-1 is only available inside a private network, use self-hosted runners or another controlled network path.&lt;/p&gt;&#xA;&lt;p&gt;The SAP user behind the BTP destination still matters. Even with a read-only ARC-1 key, the workflow can read what that technical user can read. In a real setup, scope both the SAP user and the ARC-1 API key deliberately.&lt;/p&gt;&#xA;&lt;p&gt;The SAP test gate runs against activated objects in SAP. That fits the edit, activate, push flow. If your team pushes before activation, use a PR sandbox system or add a controlled pull and activate step before the checks run.&lt;/p&gt;&#xA;&lt;p&gt;And AI review is still review. The goal is not to replace an ABAP developer. The goal is to catch useful things earlier, with enough evidence that a developer can decide quickly.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;What else this pattern can do&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;Once the plumbing exists, the same pattern can be used for more than PR review.&lt;/p&gt;&#xA;&lt;p&gt;A scheduled Clean Core audit could read a package through ARC-1, check released API usage, and open GitHub issues. A multi-system setup could expose &lt;code&gt;arc-1-dev&lt;/code&gt;, &lt;code&gt;arc-1-qa&lt;/code&gt;, and &lt;code&gt;arc-1-prod&lt;/code&gt; as separate MCP servers and compare what is active in each system.&lt;/p&gt;&#xA;&lt;p&gt;The SAP test gate can also grow beyond this small demo. Full ATC variants, Code Inspector checks, transport checks, and package-level baselines can all surface in the same PR interface developers already use.&lt;/p&gt;&#xA;&lt;p&gt;The next obvious step is the post-merge path. After a PR is merged to &lt;code&gt;main&lt;/code&gt;, a GitHub workflow could call ARC-1 with a separate git-scoped key and run an abapGit pull through &lt;a href=&#34;https://docs.arc-1-mcp.com/tools/#sapgit&#34;&gt;&lt;code&gt;SAPGit&lt;/code&gt;&lt;/a&gt; for the package in the SAP system.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SAP -&amp;gt; abapGit -&amp;gt; GitHub -&amp;gt; AI review -&amp;gt; merge -&amp;gt; ARC-1 pull -&amp;gt; SAP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I would keep that write path separate from the review key, gated by branch, labels, or environment approvals. If the pull has conflicts or activation problems, the workflow should report that back and stop.&lt;/p&gt;&#xA;&lt;p&gt;That is also where the operations loop becomes interesting: detect a dump, investigate it, propose a fix PR, review it, merge it, and pull it back into SAP. The client can change. The governed SAP access layer stays the same.&lt;/p&gt;&#xA;&lt;h2 id=&#34;takeaway&#34;&gt;Takeaway&lt;/h2&gt;&#xA;&lt;p&gt;This is the direction I find practical for ABAP development automation.&lt;/p&gt;&#xA;&lt;p&gt;Do not start with &amp;ldquo;AI should write all ABAP&amp;rdquo;. Start with a safer and more useful question:&lt;/p&gt;&#xA;&lt;p&gt;Can the development workflow become better if GitHub automation can safely use the actual SAP system?&lt;/p&gt;&#xA;&lt;p&gt;For me, the answer is clearly yes. Not because the model magically understands ABAP, but because ARC-1 brings missing SAP context into the workflow: activated source, ABAP Unit, ATC, references, dumps, syntax checks, and system-specific evidence.&lt;/p&gt;&#xA;&lt;p&gt;abapGit gets the code into GitHub. abaplint covers the static layer. ARC-1 runs ABAP Unit and ATC from GitHub Actions, and gives AI a read-only window into SAP. Copilot and Claude become more useful reviewers because they can stop guessing and start checking.&lt;/p&gt;&#xA;&lt;p&gt;That is the main thread of this sample: GitHub is the automation surface, ARC-1 is the SAP gateway, and humans still decide what gets merged.&lt;/p&gt;&#xA;&lt;h2 id=&#34;references-and-links&#34;&gt;References And Links&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review&#34;&gt;Sample repository: arc-1-abap-cicd-review&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/pull/14&#34;&gt;Demo PR #14: multi-engine review with suggestion blocks&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/pull/20&#34;&gt;Demo PR #20: SAP Unit and ATC gate&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/issues/15&#34;&gt;Dump issue #15: deep-dive investigation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-abap-cicd-review/issues?q=is%3Aissue+label%3Asap%3Adump&#34;&gt;Dump tracker issues&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1 on GitHub&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/&#34;&gt;ARC-1 Documentation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.heliconialabs.com/patterns-for-using-llms-in-abap-development.pdf&#34;&gt;Patterns for using LLMs in ABAP development&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://abapgit.org/&#34;&gt;abapGit&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://abaplint.org/&#34;&gt;abaplint&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/reviewdog/reviewdog&#34;&gt;reviewdog&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/anthropics/claude-code-action&#34;&gt;Claude Code Action&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.github.com/en/copilot/concepts/agents/coding-agent/about-coding-agent&#34;&gt;GitHub Copilot cloud agent&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://modelcontextprotocol.io/&#34;&gt;Model Context Protocol&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.zeis.de/posts/2026-05-08-arc-1-joule-studio-clean-core/&#34;&gt;Joule Studio and ARC-1 Clean Core post&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>From SEGW and Legacy UI5 to RAP with ARC-1</title>
      <link>https://blog.zeis.de/posts/2026-05-11-segw-to-rap/</link>
      <pubDate>Mon, 11 May 2026 09:00:00 +0200</pubDate>
      <guid>https://blog.zeis.de/posts/2026-05-11-segw-to-rap/</guid>
      <description>&lt;p&gt;Series note: This post is part of my &lt;a href=&#34;https://blog.zeis.de/tags/ai-abap-development-series/&#34;&gt;AI ABAP development series&lt;/a&gt;, where I go from AI development in general, to ABAP-specific problems, and then to ARC-1.&lt;/p&gt;&#xA;&lt;p&gt;In the last posts I introduced &lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1&lt;/a&gt;, explained why I built it, showed the BTP architecture, and then used it from Copilot Studio and Joule Studio. Those posts were mostly about architecture and possible use cases.&lt;/p&gt;&#xA;&lt;p&gt;This one is different. This is the use case ARC-1 was originally built for: making real SAP development easier.&lt;/p&gt;&#xA;&lt;p&gt;A lot of SAP customers are still somewhere between old ECC-style custom development and the S/4HANA world they actually want to reach. The uncomfortable part is that &amp;ldquo;moving to S/4&amp;rdquo; can easily become a technical lift and shift. The old custom code moves, the old OData services move, the old UI patterns move, and after the migration the landscape is still not really modern. It just runs somewhere newer.&lt;/p&gt;&#xA;&lt;p&gt;That is not the direction I find interesting. If we already touch those applications, then we should also ask where it makes sense to move them toward RAP, OData V4, Fiori elements, cleaner APIs, and a development model that fits the Clean Core direction much better.&lt;/p&gt;&#xA;&lt;p&gt;So I built a small but complete demo for that:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;a legacy SEGW OData V2 service&lt;/li&gt;&#xA;&lt;li&gt;a legacy freestyle UI5 JavaScript app&lt;/li&gt;&#xA;&lt;li&gt;a new RAP OData V4 service&lt;/li&gt;&#xA;&lt;li&gt;a modern UI5 TypeScript app&lt;/li&gt;&#xA;&lt;li&gt;a Fiori elements app on top of the RAP service&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The full workspace, generated code, ABAP sources, screenshots, and chat logs are published here:&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap&#34;&gt;github.com/arc-mcp/arc-1-segw-to-rap&lt;/a&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-starting-point&#34;&gt;The Starting Point&lt;/h2&gt;&#xA;&lt;p&gt;The demo starts with a small project management application on an S/4HANA 2023 trial system, ABAP Platform 7.58. The legacy backend sits in package &lt;code&gt;ZDEMO_MIG&lt;/code&gt; and uses three custom tables: &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/zdm_project.tabl.xml&#34;&gt;&lt;code&gt;ZDM_PROJECT&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/zdm_task.tabl.xml&#34;&gt;&lt;code&gt;ZDM_TASK&lt;/code&gt;&lt;/a&gt;, and &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/zdm_timeentry.tabl.xml&#34;&gt;&lt;code&gt;ZDM_TIMEENTRY&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;On top of that sits the SEGW service &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/zdemo_mig_projects_srv_0001.iwsg.xml&#34;&gt;&lt;code&gt;ZDEMO_MIG_PROJECTS_SRV&lt;/code&gt;&lt;/a&gt;. It exposes &lt;code&gt;ProjectSet&lt;/code&gt;, &lt;code&gt;TaskSet&lt;/code&gt;, and &lt;code&gt;TimeEntrySet&lt;/code&gt;, with navigation from projects to tasks and from tasks to time entries. The one bit of behavior is the &lt;code&gt;ApproveProject&lt;/code&gt; function import, which changes the project status.&lt;/p&gt;&#xA;&lt;p&gt;This is the old service in SAP Gateway Service Builder. You can see the classic SEGW shape directly: entity types, properties, navigation associations, entity sets, and the function import sitting next to the data model.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;SAP Gateway Service Builder showing the legacy SEGW project service with Project properties, entity sets, associations, and the ApproveProject function import.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-11-segw-to-rap/images/segw-screenshot.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;The old UI is a classic master/detail app. The left side shows projects, the right side shows the selected project with tasks and time entries. It works, but it also contains the kind of patterns many SAP teams know too well: manual OData V2 model creation, global formatters, synchronous bootstrap, path string parsing, &lt;code&gt;jQuery.sap.require&lt;/code&gt;, manual function import calls, and UI state that is partly stitched together in controller code.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Legacy UI5 freestyle app showing the old project master/detail application.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-11-segw-to-rap/images/ui5-legacy-app-screenshot.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;The backend is similar. The generated &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/zcl_zdemo_mig_projects_mpc.clas.abap&#34;&gt;MPC class&lt;/a&gt; describes the model, and the &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/zcl_zdemo_mig_projects_dpc_ext.clas.abap&#34;&gt;DPC_EXT class&lt;/a&gt; contains the custom logic. For the demo I made the legacy code deliberately rough: manual reads, ignored filters in some places, no authority checks, manual navigation handling, and an &lt;code&gt;ApproveProject&lt;/code&gt; function import that updates the project status directly.&lt;/p&gt;&#xA;&lt;p&gt;That is a good migration target because the interesting question is not &amp;ldquo;can an AI write a RAP sample from scratch?&amp;rdquo;. The more useful question is:&lt;/p&gt;&#xA;&lt;p&gt;Can it inspect the old service, understand the contract, and create a modern replacement that keeps the functional shape?&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-skills&#34;&gt;The Skills&lt;/h2&gt;&#xA;&lt;p&gt;For this run I did not just write one big prompt. I used three ARC-1 skills from the maintained &lt;a href=&#34;https://github.com/arc-mcp/arc-1/tree/main/skills&#34;&gt;&lt;code&gt;arc-1/skills&lt;/code&gt;&lt;/a&gt; folder: &lt;a href=&#34;https://github.com/arc-mcp/arc-1/tree/main/skills/migrate-segw-to-rap&#34;&gt;&lt;code&gt;migrate-segw-to-rap&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://github.com/arc-mcp/arc-1/tree/main/skills/modernize-ui5-app&#34;&gt;&lt;code&gt;modernize-ui5-app&lt;/code&gt;&lt;/a&gt;, and &lt;a href=&#34;https://github.com/arc-mcp/arc-1/tree/main/skills/convert-ui5-to-fiori-elements&#34;&gt;&lt;code&gt;convert-ui5-to-fiori-elements&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The folder is worth looking at beyond this demo. It also contains skills for RAP service generation, ABAP test generation, code explanation, custom-code migration, Clean Core checks, documentation, and system-context setup. The idea is that ARC-1 does not only provide tools, but repeatable workflows around those tools.&lt;/p&gt;&#xA;&lt;p&gt;The point of these skills is not that they are perfect generic migration products. They are templates for a process.&lt;/p&gt;&#xA;&lt;p&gt;That distinction matters. The real value is that the skill forces the agent into a structured workflow:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Read the instructions first.&lt;/li&gt;&#xA;&lt;li&gt;Inspect the old system and source code before designing anything.&lt;/li&gt;&#xA;&lt;li&gt;Print the extracted model and plan.&lt;/li&gt;&#xA;&lt;li&gt;Stop for confirmation before writes.&lt;/li&gt;&#xA;&lt;li&gt;Create the new artifacts.&lt;/li&gt;&#xA;&lt;li&gt;Activate, publish, lint, typecheck, and smoke test.&lt;/li&gt;&#xA;&lt;li&gt;Use the feedback from those gates before calling the run done.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;This is much closer to how I want agentic SAP development to work. Not &amp;ldquo;please convert my system&amp;rdquo; and hope for the best, but a guided workflow with discovery, constraints, acceptance gates, and real SAP system access.&lt;/p&gt;&#xA;&lt;p&gt;For the run, I used Cursor with Composer-2. I did that intentionally. This was not meant to be a best-case frontier-model demo. It should be closer to what people might actually try in an IDE with a good but not magical model.&lt;/p&gt;&#xA;&lt;p&gt;That is also why the skills matter so much. A detailed skill moves part of the intelligence out of the model and into the workflow: what to read first, when to stop, which tools to use, which checks must pass, and what the target shape should look like. The model still has to reason, but it does not have to invent the whole process from scratch.&lt;/p&gt;&#xA;&lt;p&gt;The MCP setup was split by responsibility. &lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1&lt;/a&gt; handled the SAP system side: object reads, writes, activation, transports, and service binding work. &lt;a href=&#34;https://github.com/marianfoo/mcp-sap-docs&#34;&gt;SAP Docs MCP Server&lt;/a&gt; gave RAP and CDS documentation context. &lt;a href=&#34;https://github.com/UI5/mcp-server&#34;&gt;UI5 MCP Server&lt;/a&gt; and &lt;a href=&#34;https://github.com/SAP/open-ux-tools/tree/main/packages/fiori-mcp-server&#34;&gt;SAP Fiori MCP Server&lt;/a&gt; were used for the frontend conversion and validation steps.&lt;/p&gt;&#xA;&lt;p&gt;The net execution time for the three guided runs was below 20 minutes. That does not include the time I spent before the final run building the demo, improving the skills, and learning from earlier failed attempts. But for the final guided process itself, this was comfortably under 20 minutes.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prompt-1-segw-to-rap&#34;&gt;Prompt 1: SEGW to RAP&lt;/h2&gt;&#xA;&lt;p&gt;The first prompt asked the agent to run the &lt;code&gt;migrate-segw-to-rap&lt;/code&gt; skill against &lt;code&gt;ZDEMO_MIG_PROJECTS_SRV&lt;/code&gt;. The full transcript is in &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/llm-chat-history/prompt-1-segw-to-rap&#34;&gt;&lt;code&gt;llm-chat-history/prompt-1-segw-to-rap&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Cursor prompt for the SEGW to RAP run showing ARC-1 reading the legacy service.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-11-segw-to-rap/images/starting-prompt-1-segw-to-rap.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;The important part is what happened before the agent wrote anything. ARC-1 first probed the system and confirmed the real constraints: ABAP 7.58, RAP availability, transport access, search access, and write access. The agent then tried the obvious generated MPC naming, discovered that this SEGW service used the generated &lt;code&gt;ZCL_ZDEMO_MIG_PROJECTS_*&lt;/code&gt; class names, and read the &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/zcl_zdemo_mig_projects_mpc.clas.abap&#34;&gt;MPC class&lt;/a&gt; as the source of the OData model. After that it read the &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/zcl_zdemo_mig_projects_dpc_ext.clas.abap&#34;&gt;DPC_EXT class&lt;/a&gt;, because the interesting behavior was not in the metadata. It was in the custom code, especially the &lt;code&gt;ApproveProject&lt;/code&gt; function import.&lt;/p&gt;&#xA;&lt;p&gt;Only after that discovery step did it print the extracted model and stop for &lt;code&gt;ok&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Project&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  key ProjectId&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  navigation Tasks&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Task&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  key TaskId&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  foreign key ProjectId&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  navigation TimeEntries&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;TimeEntry&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  key EntryId&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  foreign keys TaskId, ProjectId&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Function import&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  ApproveProject(ProjectId) -&amp;gt; Project&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After confirmation, ARC-1 created the &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/ABAP_SRC/src/dm&#34;&gt;RAP stack under &lt;code&gt;ABAP_SRC/src/dm&lt;/code&gt;&lt;/a&gt;. This is where the migration becomes interesting on the ABAP side.&lt;/p&gt;&#xA;&lt;p&gt;The root interface view &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zi_dm_project.ddls.asddls&#34;&gt;&lt;code&gt;ZI_DM_PROJECT&lt;/code&gt;&lt;/a&gt; selects from &lt;code&gt;ZDM_PROJECT&lt;/code&gt; and models tasks as a RAP composition child. The same pattern continues with &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zi_dm_task.ddls.asddls&#34;&gt;&lt;code&gt;ZI_DM_TASK&lt;/code&gt;&lt;/a&gt; and &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zi_dm_timeentry.ddls.asddls&#34;&gt;&lt;code&gt;ZI_DM_TIMEENTRY&lt;/code&gt;&lt;/a&gt;. So the old OData navigation model becomes a RAP business object structure instead of staying as manual navigation handling in DPC_EXT.&lt;/p&gt;&#xA;&lt;p&gt;The interface behavior definition &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zi_dm_project.bdef.asbdef&#34;&gt;&lt;code&gt;ZI_DM_PROJECT&lt;/code&gt;&lt;/a&gt; is managed, uses &lt;code&gt;strict ( 2 )&lt;/code&gt;, and enables draft. It maps the nicer RAP field names like &lt;code&gt;ProjectId&lt;/code&gt;, &lt;code&gt;StartDate&lt;/code&gt;, and &lt;code&gt;EstimatedHours&lt;/code&gt; back to the old table fields like &lt;code&gt;project_id&lt;/code&gt;, &lt;code&gt;start_date&lt;/code&gt;, and &lt;code&gt;estimated_hours&lt;/code&gt;. It also defines the project as the lock master and the child entities as dependent by project. The draft tables &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/rap/zdm_project_d.tabl.xml&#34;&gt;&lt;code&gt;ZDM_PROJECT_D&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/rap/zdm_task_d.tabl.xml&#34;&gt;&lt;code&gt;ZDM_TASK_D&lt;/code&gt;&lt;/a&gt;, and &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/rap/zdm_timeentry_d.tabl.xml&#34;&gt;&lt;code&gt;ZDM_TIMEENTRY_D&lt;/code&gt;&lt;/a&gt; are part of that generated target shape.&lt;/p&gt;&#xA;&lt;p&gt;The projection layer then exposes the service-facing model. &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zc_dm_project.ddls.asddls&#34;&gt;&lt;code&gt;ZC_DM_PROJECT&lt;/code&gt;&lt;/a&gt; is a transactional query projection on the interface view, redirects &lt;code&gt;_Tasks&lt;/code&gt; to &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zc_dm_task.ddls.asddls&#34;&gt;&lt;code&gt;ZC_DM_TASK&lt;/code&gt;&lt;/a&gt;, and carries metadata extension support. The projection behavior &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zc_dm_project.bdef.asbdef&#34;&gt;&lt;code&gt;ZC_DM_PROJECT&lt;/code&gt;&lt;/a&gt; reuses create, update, delete, draft actions, and the new approve action from the interface behavior.&lt;/p&gt;&#xA;&lt;p&gt;Finally, the service definition &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zui_dm_projects.srvd.srvdsrv&#34;&gt;&lt;code&gt;ZUI_DM_PROJECTS&lt;/code&gt;&lt;/a&gt; exposes the projection entities as &lt;code&gt;Project&lt;/code&gt;, &lt;code&gt;Task&lt;/code&gt;, and &lt;code&gt;TimeEntry&lt;/code&gt;, and the service binding &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zui_dm_projects_o4.srvb.xml&#34;&gt;&lt;code&gt;ZUI_DM_PROJECTS_O4&lt;/code&gt;&lt;/a&gt; publishes them as OData V4.&lt;/p&gt;&#xA;&lt;p&gt;The new service is OData V4 and published through the service binding:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/sap/opu/odata4/sap/zui_dm_projects_o4/srvd/sap/zui_dm_projects_o4/0001/&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The old &lt;code&gt;ApproveProject&lt;/code&gt; function import became a RAP action:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-abap&#34; data-lang=&#34;abap&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;action&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;approve_project&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;result&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;$&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;self&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zbp_dm_project.clas.locals_imp.abap&#34;&gt;behavior implementation&lt;/a&gt; no longer does a direct &lt;code&gt;UPDATE ... COMMIT WORK&lt;/code&gt; in the old DPC_EXT style. It uses RAP EML in local mode, updates the project status, and lets the RAP runtime handle the transactional context.&lt;/p&gt;&#xA;&lt;p&gt;The logs also show why this is not just text generation. The agent had to deal with real ABAP Platform 7.58 details: where the provider contract belongs, how draft table fields need to be named, which timestamp annotations are available, and how the projection behavior should reuse the interface behavior. These are exactly the details that make a generated RAP example look easy and a real migration annoying.&lt;/p&gt;&#xA;&lt;p&gt;That is the first Clean Core angle of the demo. It does not magically make every old custom object clean. But it moves the service shape away from a SEGW/DPC_EXT implementation and toward a RAP business object, CDS projections, behavior definitions, OData V4, draft support, and metadata-driven UI consumption.&lt;/p&gt;&#xA;&lt;p&gt;For an ECC to S/4HANA journey, this is the kind of direction I would rather see than only lifting old custom services into the new system.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prompt-2-ui5-javascript-to-ui5-typescript&#34;&gt;Prompt 2: UI5 JavaScript to UI5 TypeScript&lt;/h2&gt;&#xA;&lt;p&gt;The second prompt converted the &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/legacy-ui5-app&#34;&gt;legacy freestyle UI5 JavaScript app&lt;/a&gt; into a &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/modern-ui5-ts-app&#34;&gt;modern UI5 TypeScript app&lt;/a&gt;. The transcript is in &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/llm-chat-history/prompt-2-js-to-ts&#34;&gt;&lt;code&gt;llm-chat-history/prompt-2-js-to-ts&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Cursor prompt for converting the legacy UI5 JavaScript app into UI5 TypeScript.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-11-segw-to-rap/images/starting-prompt-2-ui5-ts.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Here the agent did not just rewrite files. The skill forced it to understand the old component setup, manifest, controllers, XML views, formatter logic, model setup, bootstrap, package scripts, and UI5 tooling config before writing the new app.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://github.com/UI5/mcp-server&#34;&gt;UI5 MCP Server&lt;/a&gt; was the guardrail around that work. Before writing code, the agent used it for TypeScript conversion guidance and general UI5 guidelines. That shaped the target app: a real TypeScript scaffold, &lt;code&gt;@sapui5/types&lt;/code&gt;, typed controller events, async loading, manifest-driven models, and no old &lt;code&gt;jQuery.sap.*&lt;/code&gt; patterns. It also created the modern UI5 app scaffold and later ran the UI5 linter and manifest validation. Those checks are important because plain TypeScript compilation does not understand UI5-specific conventions, XML event-handler rules, or manifest schema details.&lt;/p&gt;&#xA;&lt;p&gt;The UI result is mostly relevant here because it proves that the RAP service was usable from a real consumer. The old app talked to &lt;code&gt;/ProjectSet&lt;/code&gt;, followed &lt;code&gt;Tasks&lt;/code&gt;, and called &lt;code&gt;ApproveProject&lt;/code&gt; as an OData V2 function import. The new freestyle app talks to the RAP V4 entity set &lt;code&gt;/Project&lt;/code&gt;, follows &lt;code&gt;_Tasks&lt;/code&gt;, and calls &lt;code&gt;approve_project&lt;/code&gt; as a bound OData V4 operation. The app itself also moved from JavaScript controllers and a manual OData V2 model to TypeScript controllers, manifest-driven OData V4, FlexibleColumnLayout routing, imported formatter modules, and real lint/typecheck gates.&lt;/p&gt;&#xA;&lt;p&gt;The new app consumes the RAP V4 service directly from its &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/modern-ui5-ts-app/webapp/manifest.json&#34;&gt;manifest&lt;/a&gt;:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;dataSources&amp;#34;&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;mainService&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;uri&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;/sap/opu/odata4/sap/zui_dm_projects_o4/srvd/sap/zui_dm_projects_o4/0001/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;OData&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;settings&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;odataVersion&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;4.0&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The action call in the &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/modern-ui5-ts-app/webapp/controller/Detail.controller.ts&#34;&gt;detail controller&lt;/a&gt; also changed from the old OData V2 function import style to a bound OData V4 operation:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ts&#34; data-lang=&#34;ts&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kr&#34;&gt;const&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;operation&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;bindContext&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;s2&#34;&gt;&amp;#34;com.sap.gateway.srvd.zui_dm_projects.v0001.approve_project()&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nx&#34;&gt;ctx&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;await&lt;/span&gt; &lt;span class=&#34;nx&#34;&gt;operation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;nx&#34;&gt;invoke&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;$auto&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;);&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The UI is still recognizable, but the app is now using a modern runtime and tooling setup.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Modern UI5 TypeScript app consuming the new RAP OData V4 service.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-11-segw-to-rap/images/ui5-modern-ts-app-screenshot.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;This part is important because many real SAP teams cannot immediately replace every freestyle UI5 app with Fiori elements. Sometimes a freestyle app is still the right target. But even then, there is a big difference between old UI5 JavaScript glued to a SEGW V2 service and a modern TypeScript app consuming a RAP V4 service.&lt;/p&gt;&#xA;&lt;p&gt;The run ended with the important gates green: ESLint, UI5 linter, manifest validation, TypeScript typecheck, and a browser render check.&lt;/p&gt;&#xA;&lt;p&gt;That is the second lesson from the logs: the model needed tooling feedback. It was not enough to let it generate code once. The loop with UI5 MCP, linting, manifest validation, and browser verification made the result useful.&lt;/p&gt;&#xA;&lt;h2 id=&#34;prompt-3-legacy-ui5-to-fiori-elements&#34;&gt;Prompt 3: Legacy UI5 to Fiori Elements&lt;/h2&gt;&#xA;&lt;p&gt;The third prompt took a different path. Instead of converting the old freestyle app to another freestyle app, it rebuilt the user-facing contract as a &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/modern-fe-app/dm-projects-fe&#34;&gt;Fiori elements V4 list report and object page&lt;/a&gt;. The transcript is in &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/llm-chat-history/prompt-3-js-to-fiori-elements&#34;&gt;&lt;code&gt;llm-chat-history/prompt-3-js-to-fiori-elements&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Cursor prompt for converting the legacy UI5 app into a Fiori elements V4 app.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-11-segw-to-rap/images/starting-prompt-3-fiori-elements.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is the more interesting Clean Core direction for many S/4HANA projects. A lot of old UI5 code exists because the backend metadata did not carry enough UI intent, or because the old stack made custom frontend code feel like the default. With RAP and Fiori elements, more of the application can move into CDS annotations and behavior.&lt;/p&gt;&#xA;&lt;p&gt;The agent mined the legacy UI for the actual user contract: the columns from the old master list, search behavior, project header fields from the detail view, task table columns, time entry navigation from a selected task, &lt;code&gt;Approve&lt;/code&gt; as a project action, and the status, priority, and date semantics that used to live in the formatter.&lt;/p&gt;&#xA;&lt;p&gt;Then it moved that contract into RAP UI metadata, mainly through the &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zme_dm_project.ddlx.asddlxs&#34;&gt;&lt;code&gt;ZME_DM_PROJECT&lt;/code&gt;&lt;/a&gt;, &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zme_dm_task.ddlx.asddlxs&#34;&gt;&lt;code&gt;ZME_DM_TASK&lt;/code&gt;&lt;/a&gt;, and &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/ABAP_SRC/src/dm/zme_dm_timeentry.ddlx.asddlxs&#34;&gt;&lt;code&gt;ZME_DM_TIMEENTRY&lt;/code&gt;&lt;/a&gt; metadata extensions. That is where the old UI intent becomes &lt;code&gt;@UI.headerInfo&lt;/code&gt;, line items, selection fields, facets, field groups, presentation variants, search metadata, and semantic keys.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://github.com/SAP/open-ux-tools/tree/main/packages/fiori-mcp-server&#34;&gt;SAP Fiori MCP Server&lt;/a&gt; had a different role than the UI5 MCP Server. It did not translate freestyle controller code into another set of controllers. It exposed the Fiori tools workflow for an external OData V4 list report and object page: discover the available generation capabilities, inspect the required generator configuration, and shape the app around a project name, target folder, UI5 version, service URL or metadata file, and main entity &lt;code&gt;Project&lt;/code&gt;. In other words, it kept the frontend target inside the standard Fiori elements model instead of letting the conversion drift back into custom page wiring.&lt;/p&gt;&#xA;&lt;p&gt;That also makes the split of responsibility clearer. ARC-1 and SAP Docs MCP helped create and correct the RAP annotations in the ABAP backend. Fiori MCP helped define and generate the Fiori elements application that consumes those annotations through &lt;code&gt;$metadata&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The result is a Fiori elements list report on the RAP &lt;code&gt;Project&lt;/code&gt; entity. The generated app manifest is also in the repo, under &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/blob/main/modern-fe-app/dm-projects-fe/webapp/manifest.json&#34;&gt;&lt;code&gt;modern-fe-app/dm-projects-fe/webapp/manifest.json&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Fiori elements list report generated from the RAP OData V4 service.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-11-segw-to-rap/images/fe-screenshot-1.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;And the object page uses the RAP annotations and navigation model, including general data, audit data, and a tasks table.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Fiori elements object page generated from the RAP OData V4 service.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-11-segw-to-rap/images/fe-screenshot-2.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is the third lesson from the logs: Fiori elements migration is not mainly a JavaScript conversion. It is a relocation of intent.&lt;/p&gt;&#xA;&lt;p&gt;Old freestyle UI5 had the intent spread across controllers, XML views, formatters, routing, and manual binding code. The Fiori elements version moves much of that intent into the RAP service metadata. That is not always the right answer for every app, but when it fits, it is exactly the direction I would prefer for S/4HANA custom apps.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-the-logs-show&#34;&gt;What The Logs Show&lt;/h2&gt;&#xA;&lt;p&gt;I included the &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/llm-chat-history&#34;&gt;Cursor chat exports&lt;/a&gt; in the repository because I think the transcript is more useful than a polished final result alone.&lt;/p&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/llm-chat-history/prompt-1-segw-to-rap&#34;&gt;SEGW to RAP run&lt;/a&gt; has 140 tool records. That is the most important transcript for this post because it shows ARC-1 reading the legacy service, extracting the model from the generated classes, creating the RAP artifacts, activating them, and publishing the service binding. The &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/llm-chat-history/prompt-2-js-to-ts&#34;&gt;UI5 TypeScript run&lt;/a&gt; has 142 tool records and is mostly about making the new V4 service usable from a freestyle app. The &lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap/tree/main/llm-chat-history/prompt-3-js-to-fiori-elements&#34;&gt;Fiori elements run&lt;/a&gt; has 230 tool records because it had to mine the old UI and move more intent into annotations.&lt;/p&gt;&#xA;&lt;p&gt;There are a few patterns that stand out.&lt;/p&gt;&#xA;&lt;p&gt;First, the model needed real SAP context. It did not know the generated class names until ARC-1 searched the system. It did not know the exact service binding shape until ARC-1 read it. It did not know the old &lt;code&gt;ApproveProject&lt;/code&gt; behavior until it inspected the DPC_EXT source.&lt;/p&gt;&#xA;&lt;p&gt;Second, the skills mattered. Without the skills, the model would probably start writing too early. With the skills, it had to read, extract, summarize, stop, then write.&lt;/p&gt;&#xA;&lt;p&gt;Third, the MCP servers had different jobs. &lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1&lt;/a&gt; was the SAP system bridge. &lt;a href=&#34;https://github.com/marianfoo/mcp-sap-docs&#34;&gt;SAP Docs MCP Server&lt;/a&gt; gave release and documentation context. &lt;a href=&#34;https://github.com/UI5/mcp-server&#34;&gt;UI5 MCP Server&lt;/a&gt; and &lt;a href=&#34;https://github.com/SAP/open-ux-tools/tree/main/packages/fiori-mcp-server&#34;&gt;SAP Fiori MCP Server&lt;/a&gt; grounded the frontend work in current UI5 and Fiori conventions.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-this-is-more-than-a-conversion-demo&#34;&gt;Why This Is More Than A Conversion Demo&lt;/h2&gt;&#xA;&lt;p&gt;The obvious reading of this demo is &amp;ldquo;AI converted old code to new code&amp;rdquo;. That is true, but it is not the main point for me.&lt;/p&gt;&#xA;&lt;p&gt;There are now companies like &lt;a href=&#34;https://www.novaintelligence.com/&#34;&gt;Nova Intelligence&lt;/a&gt; and &lt;a href=&#34;https://www.conduct.ai/&#34;&gt;Conduct&lt;/a&gt; working on SAP custom-code understanding and modernization. I think that is a good signal for the space. My angle here is different: how far can you get with open-source tools, your own AI setup, and MCP servers whose code you can actually inspect?&lt;/p&gt;&#xA;&lt;p&gt;This kind of setup is not as polished as a full commercial SAP modernization platform. But the tradeoff is interesting. ARC-1 is open source, the SAP Docs MCP server is open source, and the UI5 and Fiori MCP servers are open-source SAP tooling. You can see what the tools do, adapt the skills, run the workflow against your own system, and understand why the agent made a decision. For many teams, that transparency matters as much as the raw automation.&lt;/p&gt;&#xA;&lt;p&gt;The more important point is that this is the kind of workflow SAP teams need when they want to move away from lift and shift.&lt;/p&gt;&#xA;&lt;p&gt;In a pure lift-and-shift migration, the old application survives almost unchanged:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SEGW service stays SEGW&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;DPC_EXT logic stays DPC_EXT logic&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;UI5 JavaScript stays UI5 JavaScript&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;OData V2 stays OData V2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;custom UI logic stays custom UI logic&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That may be necessary in some places. But if you do that everywhere, the new S/4HANA system inherits most of the old custom development model.&lt;/p&gt;&#xA;&lt;p&gt;In this demo, the target shape is different:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SEGW contract -&amp;gt; RAP business object&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;OData V2 -&amp;gt; OData V4&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;DPC_EXT function import -&amp;gt; RAP action&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;manual UI wiring -&amp;gt; typed UI5 or Fiori elements metadata&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;frontend-only intent -&amp;gt; CDS annotations where possible&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That is much closer to the Clean Core direction. Not because custom code disappears. It does not. But because the custom code is expressed in newer, more structured extension technologies that fit S/4HANA better.&lt;/p&gt;&#xA;&lt;p&gt;For real projects I would still be careful. A large productive SEGW service can contain much more complex behavior than this demo. It may call BAPIs, use conversion exits, have custom authorization logic, support deep inserts, or depend on UI assumptions that are not visible in the service metadata. You do not solve that with one prompt.&lt;/p&gt;&#xA;&lt;p&gt;But that is also why ARC-1 matters. It gives the agent a way to inspect the real objects, not only files copied into a prompt. And with good skills, the agent can be forced to build a migration plan before touching the system.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-i-would-take-from-this&#34;&gt;What I Would Take From This&lt;/h2&gt;&#xA;&lt;p&gt;For me the practical takeaway is:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;ARC-1 is strongest when the task needs real ABAP system context.&lt;/li&gt;&#xA;&lt;li&gt;Skills are the right abstraction for repeatable SAP modernization workflows.&lt;/li&gt;&#xA;&lt;li&gt;MCP servers should be combined by responsibility, not treated as one magic tool.&lt;/li&gt;&#xA;&lt;li&gt;RAP and Fiori elements are not just &amp;ldquo;newer tech&amp;rdquo;, they give the AI a more structured target model.&lt;/li&gt;&#xA;&lt;li&gt;Clean Core migration is not only about deleting custom code. It is also about moving useful custom functionality into cleaner extension patterns.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The demo is intentionally small, but the pattern is the part I care about. If an agent can read an old SEGW service, understand a legacy UI5 app, create a RAP V4 service, modernize the freestyle UI, and generate a Fiori elements app in one guided run, then this is a useful direction for real SAP modernization work.&lt;/p&gt;&#xA;&lt;p&gt;Not as an autopilot that blindly rewrites landscapes, but as a controlled development workflow with real SAP context, clear boundaries, and human review.&lt;/p&gt;&#xA;&lt;p&gt;That is exactly where I want ARC-1 to go.&lt;/p&gt;&#xA;&lt;h2 id=&#34;references--links&#34;&gt;References &amp;amp; Links&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1-segw-to-rap&#34;&gt;Demo repository: arc-1-segw-to-rap&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1 on GitHub&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/&#34;&gt;ARC-1 Documentation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1/tree/main/skills&#34;&gt;ARC-1 Skills&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/marianfoo/mcp-sap-docs&#34;&gt;SAP Docs MCP Server&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://pages.community.sap.com/topics/abap/rap&#34;&gt;ABAP RESTful Application Programming Model&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://ui5.github.io/typescript/&#34;&gt;UI5 TypeScript&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/UI5/mcp-server&#34;&gt;UI5 MCP Server&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/SAP/open-ux-tools/tree/main/packages/fiori-mcp-server&#34;&gt;SAP Fiori MCP Server&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/SAP-samples/abap-platform-fiori-feature-showcase&#34;&gt;ABAP Platform Fiori Feature Showcase&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.novaintelligence.com/&#34;&gt;Nova Intelligence&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.conduct.ai/&#34;&gt;Conduct&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;discuss-this-post&#34;&gt;Discuss this post&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/posts/marianzeis_i-converted-a-legacy-segw-odata-service-to-activity-7459822169758326786-LagF&#34;&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://saptodon.org/@Mianbsp/116558132953167166&#34;&gt;Saptodon&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://bsky.app/profile/marian.zeis.de/post/3mlmapv4vu22d&#34;&gt;Bluesky&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>ARC-1 with Joule Studio: Bringing Real ABAP System Context into Joule</title>
      <link>https://blog.zeis.de/posts/2026-05-08-arc-1-joule-studio-clean-core/</link>
      <pubDate>Wed, 06 May 2026 09:00:00 +0200</pubDate>
      <guid>https://blog.zeis.de/posts/2026-05-08-arc-1-joule-studio-clean-core/</guid>
      <description>&lt;p&gt;Series note: This post is part of my &lt;a href=&#34;https://blog.zeis.de/tags/ai-abap-development-series/&#34;&gt;AI ABAP development series&lt;/a&gt;, where I go from AI development in general, to ABAP-specific problems, and then to ARC-1.&lt;/p&gt;&#xA;&lt;p&gt;In the &lt;a href=&#34;https://blog.zeis.de/posts/2026-05-05-arc-1-copilot-studio/&#34;&gt;previous post&lt;/a&gt;, I showed &lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1&lt;/a&gt; with Microsoft Copilot Studio. The idea was that SAP system context should not be locked inside a local IDE. If ARC-1 runs centrally on SAP BTP, it can also be used from Teams, Microsoft 365 Copilot, SharePoint, Jira, and other places where functional consultants, architects, support teams, and project leads already work.&lt;/p&gt;&#xA;&lt;p&gt;This post is the SAP-native version of that idea. If Microsoft Copilot Studio is close to the Microsoft workday, then &lt;a href=&#34;https://help.sap.com/docs/JOULE/3fdd7b321eb24d1b9d40605dce822e84&#34;&gt;Joule&lt;/a&gt; is close to the SAP workday. SAP describes Joule as the unified assistant experience across SAP&amp;rsquo;s solution portfolio, and &lt;a href=&#34;https://help.sap.com/docs/Joule_Studio/45f9d2b8914b4f0ba731570ff9a85313/4444cd1ce4cd471bbe127ea2e4735b40.html&#34;&gt;Joule Studio&lt;/a&gt; as the place to build custom Joule agents with SAP and non-SAP integrations.&lt;/p&gt;&#xA;&lt;p&gt;So the question is not only: can Joule call another MCP server? The better question is: can the ARC-1 capabilities be brought to the place where SAP users already ask questions?&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-carries-over-from-earlier-posts&#34;&gt;What Carries Over From Earlier Posts&lt;/h2&gt;&#xA;&lt;p&gt;ARC-1 is a secure ADT MCP server for ABAP systems. It connects AI clients to SAP systems through &lt;a href=&#34;https://help.sap.com/docs/btp/sap-business-technology-platform/abap-development-user-guides&#34;&gt;ABAP Development Tools&lt;/a&gt; APIs and exposes this through tools like &lt;a href=&#34;https://docs.arc-1-mcp.com/tools/&#34;&gt;SAPRead, SAPSearch, SAPWrite, SAPActivate, SAPContext, SAPDiagnose, SAPTransport, and SAPManage&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;For this post, the important part is not the full tool list. It is the operating model from the earlier BTP post:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;central server instead of every user laptop&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;safe by default instead of allow all by default&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;server ceiling + user permission + SAP authorization&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;audit logging instead of invisible local tool calls&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In the &lt;a href=&#34;https://blog.zeis.de/posts/2026-04-29-arc-1-btp/&#34;&gt;BTP post&lt;/a&gt;, I described how ARC-1 can run as a central Cloud Foundry application with &lt;a href=&#34;https://docs.arc-1-mcp.com/xsuaa-setup/&#34;&gt;XSUAA&lt;/a&gt;, &lt;a href=&#34;https://docs.arc-1-mcp.com/btp-destination-setup/&#34;&gt;BTP destinations&lt;/a&gt;, &lt;a href=&#34;https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/cloud-connector&#34;&gt;Cloud Connector&lt;/a&gt;, &lt;a href=&#34;https://docs.arc-1-mcp.com/principal-propagation-setup/&#34;&gt;Principal Propagation&lt;/a&gt;, roles, and BTP audit logging. For Joule Studio, I would not create a second SAP access architecture. I would reuse that controlled endpoint.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-arc-1-adds-to-joule&#34;&gt;What ARC-1 Adds To Joule&lt;/h2&gt;&#xA;&lt;p&gt;Joule already has useful SAP context. SAP has &lt;a href=&#34;https://help.sap.com/docs/btp/btp-developers-guide/use-joule-for-developers-generative-ai-in-abap-cloud&#34;&gt;Joule for Developers&lt;/a&gt;, &lt;a href=&#34;https://help.sap.com/docs/abap-ai/generative-ai-in-abap-cloud/joule-for-developers-abap-ai-capabilities-5f175c94900741d6af3dbb23ce37e81a&#34;&gt;Joule for Developers, ABAP AI capabilities&lt;/a&gt;, and &lt;a href=&#34;https://help.sap.com/docs/joule/serviceguide/sap-consulting-capability-for-joule&#34;&gt;Joule for Consultants&lt;/a&gt;. So this is not about pretending Joule cannot help with ABAP at all.&lt;/p&gt;&#xA;&lt;p&gt;But there is a difference between a useful standard assistant and a tool that can query my actual ABAP system through ADT, read my custom code, inspect dependencies, run diagnostics, check release state, read ATC findings, and create a system-specific proposal.&lt;/p&gt;&#xA;&lt;p&gt;That workflow is not something I get just by opening standard Joule. If SAP does not expose this level of ABAP system access in Joule today, a custom MCP server can still bring it there. With ARC-1, Joule is no longer limited to general SAP knowledge or predefined product capabilities. It can ask the real ABAP system.&lt;/p&gt;&#xA;&lt;p&gt;Not because the model became smarter. Because the tool access became better.&lt;/p&gt;&#xA;&lt;p&gt;That matters beyond pure development. The same ADT-backed context can help architects with Clean Core planning, functional consultants with impact analysis, support teams with dumps and bug analysis, quality leads with ATC reporting, and developers with implementation proposals.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-architecture-i-would-show&#34;&gt;The Architecture I Would Show&lt;/h2&gt;&#xA;&lt;p&gt;SAP&amp;rsquo;s Architecture Center describes &lt;a href=&#34;https://architecture.learning.sap.com/docs/ref-arch/ca1d2a3e/1&#34;&gt;A2A and MCP for interoperability&lt;/a&gt;. The important part for this post is the direction: Joule as the user-facing assistant, A2A for agent-to-agent collaboration, and MCP for tool access. SAP also describes an &lt;a href=&#34;https://architecture.learning.sap.com/docs/ref-arch/ca1d2a3e/1#mcp-gateway-in-integration-suite&#34;&gt;MCP Gateway in SAP Integration Suite&lt;/a&gt; as a governed way to expose SAP and non-SAP APIs, integrations, data sources, and external MCP servers as tools for AI agents.&lt;/p&gt;&#xA;&lt;p&gt;ARC-1 fits that pattern as the ADT development-tooling adapter:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;User in Joule&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; Joule Studio Agent&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; SAP Integration Suite API Management / future MCP Gateway&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; ARC-1 on SAP BTP Cloud Foundry&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; Destination Service + Connectivity Service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; SAP Cloud Connector&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; SAP S/4HANA or ABAP system&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; ADT development APIs&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;ARC-1 can fit the architecture pattern SAP describes. Joule is the user-facing AI entry point, Integration Suite is the governed access layer, ARC-1 is the ADT adapter, and the SAP system stays protected behind BTP connectivity and SAP authorizations.&lt;/p&gt;&#xA;&lt;p&gt;There are still open points. &lt;a href=&#34;https://help.sap.com/docs/Joule_Studio/45f9d2b8914b4f0ba731570ff9a85313/3d9dfad0bc39468292d508f0808a12fe.html&#34;&gt;Joule Studio already supports adding MCP servers&lt;/a&gt; through BTP destinations, but the documentation also lists restrictions: the destination must be streamable HTTP and MCP servers requiring interactive OAuth user authorization are not supported. SAP also shows MCP hub capabilities on the roadmap, but from what I can see this is still a future SAP Build capability and not the fully available enterprise MCP hub today.&lt;/p&gt;&#xA;&lt;p&gt;So I would present this as a target architecture and showcase, not as a final productive setup guide yet.&lt;/p&gt;&#xA;&lt;p&gt;For the showcase, I configured a Joule Studio agent with a small instruction set, Anthropic Claude Sonnet 4 as model, and two MCP servers: &lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1&lt;/a&gt; for the ABAP system and the &lt;a href=&#34;https://github.com/marianfoo/mcp-sap-docs&#34;&gt;SAP Docs MCP Server&lt;/a&gt; for official SAP documentation context. I condensed the screenshots here to show only the relevant configuration parts:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Condensed Joule Studio agent configuration showing the agent basics, instructions, model settings, execution steps, and MCP servers for ARC-1 and SAP_DOCS.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-08-arc-1-joule-studio-clean-core/joule-studio-agent-configuration.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;use-cases-i-would-show-in-this-post&#34;&gt;Use Cases I Would Show In This Post&lt;/h2&gt;&#xA;&lt;p&gt;I would not repeat all Copilot Studio examples. The Joule post should show scenarios that make sense because the user starts inside the SAP world, not in Teams or SharePoint.&lt;/p&gt;&#xA;&lt;p&gt;One note before the screenshots: I was not able to change the language in this Joule setup, so the screenshots are in German. I describe the important parts in English below each screenshot.&lt;/p&gt;&#xA;&lt;p&gt;The first task for the agent is a Clean Core readiness check for one object. It is narrow enough to be understandable and safe enough because it can be read-only:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Check whether ZCL_ARC1_DEMO_CCORE is clean-core ready.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Use the real SAP system, ATC where possible, API release state, and SAP documentation.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Do not change anything. Return risks, evidence, and suggested next steps.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is a good first agent task because it shows the difference between &amp;ldquo;Joule explains Clean Core&amp;rdquo; and &amp;ldquo;Joule analyzes this class in this SAP system for Clean Core risk&amp;rdquo;. ARC-1 reads the ABAP source, dependencies, ATC findings, and &lt;code&gt;API_STATE&lt;/code&gt;. &lt;a href=&#34;https://mcp-sap-docs.marianzeis.de/&#34;&gt;mcp-sap-docs&lt;/a&gt; adds SAP guidance and released API context. Joule returns a short assessment with evidence.&lt;/p&gt;&#xA;&lt;p&gt;This is the kind of result I mean:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Joule showing a Clean Core readiness analysis for ZCL_ARC1_DEMO_CCORE with API release state, used SAP tables, and ATC result.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-08-arc-1-joule-studio-clean-core/joule-clean-core-object-analysis.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;The screenshot is still a rough showcase, but it already shows the value. Joule is not only giving generic Clean Core advice. It can show that the class is not released for the relevant contracts, that it uses &lt;code&gt;USR02&lt;/code&gt; and &lt;code&gt;BUT000&lt;/code&gt;, and that there are no ATC findings in this small example. That is a much better starting point for an architect or developer than a general explanation of what Clean Core means.&lt;/p&gt;&#xA;&lt;p&gt;I also asked a follow-up prompt for a dependency diagram. The result was almost the answer I wanted: not perfect, but useful because it returned a Mermaid diagram and an evidence table instead of only prose. You can open the &lt;a href=&#34;https://blog.zeis.de/posts/2026-05-08-arc-1-joule-studio-clean-core/full-reply/&#34;&gt;translated and rendered full Joule reply here&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The second use case is package-level modernization planning. This is where an agent is useful because it needs multiple tool calls, grouping, prioritization, and a bit more reasoning:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Analyze package ZSD_LEGACY for Clean Core and ABAP Cloud risks.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Group the findings and create a modernization backlog.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Do not change code.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The same agent can combine ARC-1 for package content, dependencies, ATC, release state, and where-used information with SAP documentation for official guidance. The output should be a backlog, not a &amp;ldquo;fixed everything&amp;rdquo; claim:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Priority 1: direct SAP table usage with released successors&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Priority 2: ATC findings with clear fix direction&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Priority 3: objects that need architecture discussion&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Priority 4: probably dead or low-value code to review later&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This screenshot shows another interesting part of Joule. The response is not only a long text answer. Joule created a left-side list with grouped findings and backlog items, and the selected item is shown with details on the right side:&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Joule showing an interactive package modernization backlog with grouped Clean Core and ABAP Cloud risk categories on the left and details on the right.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-08-arc-1-joule-studio-clean-core/joule-package-modernization-backlog.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;In this run, the package &lt;code&gt;ZSD_LEGACY&lt;/code&gt; did not exist. Joule still searched the system and found 28 &lt;code&gt;ZSD*&lt;/code&gt; objects that may represent legacy risks. It grouped them into high, medium, and low risk buckets, and then created a modernization backlog. The selected high-risk card shows temporary &lt;code&gt;$TMP&lt;/code&gt; package objects, split into service definitions, tables, and message classes. That is not a final assessment, but it is a useful interactive starting point.&lt;/p&gt;&#xA;&lt;p&gt;These examples have a better through line for this post than repeating the Copilot Studio demos. Copilot Studio is good when the work starts in Microsoft 365. Joule Studio is good when the work starts in SAP, but still needs real ABAP system context.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-i-use-an-agent-here&#34;&gt;Why I Use An Agent Here&lt;/h2&gt;&#xA;&lt;p&gt;For this showcase an agent is perfectly fine. The interesting part is not the packaging. The interesting part is that Joule can call &lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1&lt;/a&gt; and the &lt;a href=&#34;https://github.com/marianfoo/mcp-sap-docs&#34;&gt;SAP Docs MCP Server&lt;/a&gt;, collect system evidence, and turn that into something useful for the user.&lt;/p&gt;&#xA;&lt;p&gt;For ARC-1 I would still keep the first Joule Studio agent conservative: one object or one package, read-only by default, no automatic rewrite. I would not start with a big automation story. I would start with analysis, evidence, and a proposal.&lt;/p&gt;&#xA;&lt;p&gt;And yes, you can also vibe code with this. If write access is enabled for a development or sandbox system, a Joule Studio agent can propose changes and call ARC-1 to apply them. I just do not want this to be the main story here, because the more important point is the architecture: first give Joule controlled access to real ABAP system context, then decide which write actions are safe enough.&lt;/p&gt;&#xA;&lt;h2 id=&#34;open-points&#34;&gt;Open Points&lt;/h2&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://help.sap.com/doc/sap-api-policy/latest/en-US/API_Policy_latest.pdf&#34;&gt;SAP API Policy&lt;/a&gt; also matters here, but it should not become the whole post. ARC-1 should be positioned as ADT development tooling, not as a generic business-data extraction layer. Clean Core checks, ATC, code inspection, syntax checks, ABAP Unit, activation, and development support are the story. Data extraction is not the story.&lt;/p&gt;&#xA;&lt;p&gt;This is also why the Joule Studio architecture is interesting. SAP&amp;rsquo;s architecture guidance describes SAP Integration Suite and API Management as part of a governed pathway for AI agents, including a governance layer like an MCP gateway in front of APIs. That is much closer to the setup in this post than a local MCP server on a developer laptop. It gives the agent a controlled entry point, central configuration, identity, monitoring, and auditability. It does not mean every possible ADT usage is automatically fine, but the architecture shape is much closer to what SAP is describing for API agents.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-this-matters&#34;&gt;Why This Matters&lt;/h2&gt;&#xA;&lt;p&gt;Copilot Studio and Joule Studio are different surfaces:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Copilot Studio = close to Teams, Microsoft 365, SharePoint, Excel, Word, Jira&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Joule Studio = close to SAP products, SAP Build, Joule agents, SAP users&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ARC-1 = governed ABAP system access layer that can serve both&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The client can change, but the security model should not. For me that is the main point. ARC-1 should not be locked to Claude, Cursor, Copilot Studio, or Joule Studio. If the company allows it, the same governed ARC-1 endpoint should be usable from different AI clients.&lt;/p&gt;&#xA;&lt;p&gt;And ARC-1 is open source, which is important to me. If this kind of access layer becomes part of SAP AI architectures, then people should be able to inspect how it works, challenge the security model, test it against real systems, and decide for themselves if it fits their landscape.&lt;/p&gt;&#xA;&lt;p&gt;Also, this does not have to start with write access. Even read-only mode is already very powerful. Reading code, dependencies, ATC findings, release state, dumps, messages, packages, and where-used information can help architects, consultants, support teams, and developers without the assistant writing a single line of ABAP.&lt;/p&gt;&#xA;&lt;p&gt;The target picture is not &amp;ldquo;AI writes ABAP from a chat prompt&amp;rdquo;. The better target is:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;the user asks inside Joule&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Joule has access to the right tools&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ARC-1 provides real ABAP system context&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SAP documentation provides the official direction&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Integration Suite provides governance&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SAP authorizations still protect the backend&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;humans approve the risky parts&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That is much more interesting than a local MCP demo. It is also much closer to what I think enterprise ABAP agentic development needs.&lt;/p&gt;&#xA;&lt;h2 id=&#34;discuss-this-post&#34;&gt;Discuss this post&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://saptodon.org/@Mianbsp/116529573994656695&#34;&gt;Saptodon&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://bsky.app/profile/marian.zeis.de/post/3ml7kulu55s2v&#34;&gt;Bluesky&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/posts/marianzeis_what-if-joule-could-answer-abap-and-clean-activity-7458010353239691264-gbF0&#34;&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;references--links&#34;&gt;References &amp;amp; links&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1 on GitHub&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/&#34;&gt;ARC-1 Documentation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/tools/&#34;&gt;ARC-1 Tools&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/authorization/&#34;&gt;ARC-1 Authorization and Roles&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/phase4-btp-deployment/&#34;&gt;ARC-1 BTP Cloud Foundry Deployment&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/principal-propagation-setup/&#34;&gt;ARC-1 Principal Propagation Setup&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://mcp-sap-docs.marianzeis.de/&#34;&gt;mcp-sap-docs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/docs/JOULE/3fdd7b321eb24d1b9d40605dce822e84&#34;&gt;SAP Help: What is Joule?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/docs/Joule_Studio/45f9d2b8914b4f0ba731570ff9a85313/4444cd1ce4cd471bbe127ea2e4735b40.html&#34;&gt;SAP Help: What is Joule Studio?&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/docs/Joule_Studio/45f9d2b8914b4f0ba731570ff9a85313/3d9dfad0bc39468292d508f0808a12fe.html&#34;&gt;SAP Help: Add MCP Servers to Your Joule Agent&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://architecture.learning.sap.com/docs/ref-arch/ca1d2a3e/1&#34;&gt;SAP Architecture Center: A2A and MCP for Interoperability&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/docs/integration-suite/sap-integration-suite/api-management-capability&#34;&gt;SAP Integration Suite API Management&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/docs/btp/btp-developers-guide/use-joule-for-developers-generative-ai-in-abap-cloud&#34;&gt;SAP Joule for Developers&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/docs/abap-ai/generative-ai-in-abap-cloud/joule-for-developers-abap-ai-capabilities-5f175c94900741d6af3dbb23ce37e81a&#34;&gt;SAP Joule for Developers, ABAP AI capabilities&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/docs/joule/serviceguide/sap-consulting-capability-for-joule&#34;&gt;SAP Joule for Consultants&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/doc/sap-api-policy/latest/en-US/API_Policy_latest.pdf&#34;&gt;SAP API Policy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>ARC-1 with Copilot Studio: SAP System Context Beyond Developers</title>
      <link>https://blog.zeis.de/posts/2026-05-05-arc-1-copilot-studio/</link>
      <pubDate>Mon, 04 May 2026 09:00:00 +0200</pubDate>
      <guid>https://blog.zeis.de/posts/2026-05-05-arc-1-copilot-studio/</guid>
      <description>&lt;p&gt;Series note: This post is part of my &lt;a href=&#34;https://blog.zeis.de/tags/ai-abap-development-series/&#34;&gt;AI ABAP development series&lt;/a&gt;, where I go from AI development in general, to ABAP-specific problems, and then to ARC-1.&lt;/p&gt;&#xA;&lt;p&gt;In the &lt;a href=&#34;https://blog.zeis.de/posts/2026-04-29-arc-1-btp/&#34;&gt;previous post&lt;/a&gt;, I wrote about running &lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1&lt;/a&gt; on SAP BTP. That was the architecture part: central deployment, XSUAA, destinations, Cloud Connector, Principal Propagation, roles, and auditability.&lt;/p&gt;&#xA;&lt;p&gt;This post is the next step. If ARC-1 is already deployed centrally on BTP, then it does not have to be used only from developer tools like VS Code, Claude, Cursor, or Eclipse. It can also be used from &lt;a href=&#34;https://learn.microsoft.com/en-us/microsoft-copilot-studio/&#34;&gt;Microsoft Copilot Studio&lt;/a&gt; and then published into &lt;a href=&#34;https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-add-bot-to-microsoft-teams&#34;&gt;Teams or Microsoft 365 Copilot&lt;/a&gt;. That changes the audience quite a bit.&lt;/p&gt;&#xA;&lt;p&gt;For developers, ARC-1 is mainly an ADT MCP gateway for code, packages, activation, transports, diagnostics, and system context. MCP is the protocol that lets an AI client call external tools, and ADT is the API layer behind &lt;a href=&#34;https://help.sap.com/docs/btp/sap-business-technology-platform/abap-development-user-guides&#34;&gt;ABAP Development Tools&lt;/a&gt;. But this SAP system access is not only useful for developers. &lt;a href=&#34;https://docs.arc-1-mcp.com/tools/&#34;&gt;ARC-1 tools&lt;/a&gt; can also expose table structures, selected data, messages, transaction metadata, API release state, feature toggles, FLP content, dumps, transport information, and more. Depending on the enabled ARC-1 tools and SAP authorizations, that can become useful for functional consultants, solution architects, testers, security people, and support teams.&lt;/p&gt;&#xA;&lt;p&gt;The question for this post is: what happens if the SAP system context is not only available inside an IDE?&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-copilot-studio-fits-here&#34;&gt;Why Copilot Studio fits here&lt;/h2&gt;&#xA;&lt;p&gt;Functional consultants usually do not live in a local IDE. They work in Teams, Excel, Word, SharePoint, Jira, SAP GUI, Fiori, and many other tools around the actual system. So if the only AI access pattern is &amp;ldquo;install an MCP server locally and configure your IDE&amp;rdquo;, then we miss a large part of the SAP project team.&lt;/p&gt;&#xA;&lt;p&gt;Copilot Studio fits here because it is already close to where many business users work. An agent can be &lt;a href=&#34;https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-add-bot-to-microsoft-teams&#34;&gt;published into Teams and Microsoft 365 Copilot&lt;/a&gt;. It can use &lt;a href=&#34;https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-add-sharepoint&#34;&gt;SharePoint as a knowledge source&lt;/a&gt;. It can use connectors for systems like &lt;a href=&#34;https://learn.microsoft.com/en-us/microsoft-365/copilot/connectors/jira-cloud-deployment&#34;&gt;Jira Cloud&lt;/a&gt;, and the same idea also applies to other enterprise sources like Confluence if there is a connector or MCP server for it. I did not use Confluence in this test, but the architecture would be the same. And since Copilot Studio can &lt;a href=&#34;https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-add-existing-server-to-agent&#34;&gt;connect to existing MCP servers&lt;/a&gt;, it can also call ARC-1 when the server is deployed to BTP.&lt;/p&gt;&#xA;&lt;p&gt;That does not mean everyone should get write access to SAP from Teams. Quite the opposite. For this kind of usage I would start read-only and very controlled. But even read-only is already powerful if the agent can combine:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;A business specification from SharePoint.&lt;/li&gt;&#xA;&lt;li&gt;SAP documentation from the separately deployed &lt;a href=&#34;https://mcp-sap-docs.marianzeis.de/&#34;&gt;mcp-sap-docs&lt;/a&gt; MCP server.&lt;/li&gt;&#xA;&lt;li&gt;Real system context from ARC-1.&lt;/li&gt;&#xA;&lt;li&gt;Tickets or tasks from Jira.&lt;/li&gt;&#xA;&lt;li&gt;The conversation interface in Teams.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;the-architecture-stays-the-same&#34;&gt;The Architecture Stays The Same&lt;/h2&gt;&#xA;&lt;p&gt;Copilot Studio should not create a second SAP access architecture. It should use the same &lt;a href=&#34;https://docs.arc-1-mcp.com/phase4-btp-deployment/&#34;&gt;BTP-deployed ARC-1 endpoint&lt;/a&gt; from the previous post.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Copilot Studio / Teams&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; ARC-1 MCP endpoint on SAP BTP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; XSUAA / OAuth&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; Destination Service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; Cloud Connector&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; SAP ABAP system&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This means the security story does not change only because the client changes. ARC-1 still has the &lt;a href=&#34;https://docs.arc-1-mcp.com/authorization/#the-model-in-one-picture&#34;&gt;server ceiling&lt;/a&gt;. &lt;a href=&#34;https://docs.arc-1-mcp.com/xsuaa-setup/&#34;&gt;XSUAA roles&lt;/a&gt; still control what the user can do in ARC-1. If &lt;a href=&#34;https://docs.arc-1-mcp.com/principal-propagation-setup/&#34;&gt;Principal Propagation&lt;/a&gt; is active, ARC-1 does not call SAP as one shared technical user. The signed-in user&amp;rsquo;s identity is propagated to the ABAP backend, so SAP checks the request with that user&amp;rsquo;s normal SAP authorizations, for example object, package, transport, table, or &lt;code&gt;S_DEVELOP&lt;/code&gt; permissions.&lt;/p&gt;&#xA;&lt;p&gt;In simpler words: Copilot calls ARC-1 over HTTPS, BTP authenticates the user and resolves the SAP destination, and the Cloud Connector forwards the request to the ABAP system. The server ceiling is the maximum ARC-1 capability the admin enabled for this instance, so a user role can never enable more than the server allows.&lt;/p&gt;&#xA;&lt;p&gt;For Copilot Studio I would be extra conservative with the first setup:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;read/search/diagnose only&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;data preview only for selected users&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;free SQL only for selected users&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;writes disabled by default&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;transport writes disabled&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A Copilot Studio agent can be much more accessible to non-developers than an IDE tool, so the safety model matters even more.&lt;/p&gt;&#xA;&lt;h2 id=&#34;setup&#34;&gt;Setup&lt;/h2&gt;&#xA;&lt;p&gt;I would keep the setup simple and reuse the BTP deployment from the previous post:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Deploy ARC-1 on BTP with &lt;a href=&#34;https://docs.arc-1-mcp.com/xsuaa-setup/&#34;&gt;XSUAA&lt;/a&gt;, &lt;a href=&#34;https://docs.arc-1-mcp.com/btp-destination-setup/&#34;&gt;BTP destinations&lt;/a&gt;, and ideally &lt;a href=&#34;https://docs.arc-1-mcp.com/principal-propagation-setup/&#34;&gt;Principal Propagation&lt;/a&gt;. The detailed steps are in the &lt;a href=&#34;https://docs.arc-1-mcp.com/phase4-btp-deployment/&#34;&gt;BTP deployment guide&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Keep ARC-1 read-only first, or at least very restricted with &lt;a href=&#34;https://docs.arc-1-mcp.com/authorization/&#34;&gt;ARC-1 authorization and roles&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;li&gt;In Copilot Studio, add ARC-1 as an &lt;a href=&#34;https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-add-existing-server-to-agent&#34;&gt;existing MCP server&lt;/a&gt; with the public HTTPS endpoint from BTP, for example &lt;code&gt;https://arc1-ecc-dev.cfapps.eu10.hana.ondemand.com/mcp&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Use OAuth 2.0 for the MCP server authentication. Copilot Studio supports manual OAuth configuration for MCP servers, and ARC-1 on BTP can use XSUAA for that.&lt;/li&gt;&#xA;&lt;li&gt;Add &lt;a href=&#34;https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-add-sharepoint&#34;&gt;SharePoint as a knowledge source&lt;/a&gt;, add the &lt;a href=&#34;https://mcp-sap-docs.marianzeis.de/&#34;&gt;SAP documentation MCP server&lt;/a&gt; with its public MCP endpoint &lt;code&gt;https://mcp-sap-docs.marianzeis.de/mcp&lt;/code&gt;, and then add other enterprise sources only where they make sense.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-add-bot-to-microsoft-teams&#34;&gt;Publish the agent to Teams or Microsoft 365 Copilot&lt;/a&gt; after testing.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The &lt;a href=&#34;https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-add-existing-server-to-agent&#34;&gt;existing MCP server page&lt;/a&gt; also documents Streamable transport and the API key or OAuth 2.0 authentication options. For SAP system access I would not start with API keys unless it is a very controlled automation scenario, because OAuth gives a better identity story.&lt;/p&gt;&#xA;&lt;p&gt;In my test agent I used ARC-1 on BTP, a Jira MCP server, and SAP Docs as tools. For knowledge, I added SharePoint locations for specifications and IT documents, plus a Jira connector. For this showcase I enabled the available read and write tools.&lt;/p&gt;&#xA;&lt;p&gt;Microsoft&amp;rsquo;s own &lt;a href=&#34;https://learn.microsoft.com/en-us/graph/mcp-server/use-enterprise-mcp-server-copilot-studio&#34;&gt;MCP Server for Enterprise&lt;/a&gt; points in a similar direction for Microsoft Graph: enterprise context should come through governed endpoints, not random local scripts.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Copilot Studio SAP Agent tools screen showing ARC-1 BTP, Jira MCP Server, and SAP Docs as MCP tools.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-05-arc-1-copilot-studio/copilotstudio-tools.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Copilot Studio SAP Agent knowledge screen showing SharePoint knowledge sources and a Jira connector.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-05-arc-1-copilot-studio/sapcopilot-knowledge.png&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;sharepoint-and-sap-documentation&#34;&gt;SharePoint And SAP Documentation&lt;/h2&gt;&#xA;&lt;p&gt;The most natural non-developer setup is probably SharePoint plus SAP docs plus SAP system context. SharePoint is where many specifications and project documents already live, and Copilot Studio can use &lt;a href=&#34;https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-add-sharepoint&#34;&gt;SharePoint as a knowledge source&lt;/a&gt; while Microsoft authentication keeps the normal document permissions in place.&lt;/p&gt;&#xA;&lt;p&gt;But SharePoint alone is not enough. A specification can say what should happen, but it often does not know how the SAP system actually works today. This is where ARC-1 comes in. The agent can ask ARC-1 for current ABAP objects, CDS views, table structures, message texts, service bindings, transaction metadata, or selected table data, depending on what is enabled and authorized in the &lt;a href=&#34;https://docs.arc-1-mcp.com/authorization/&#34;&gt;ARC-1 tool and role model&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Then I would add the separately deployed &lt;a href=&#34;https://mcp-sap-docs.marianzeis.de/&#34;&gt;mcp-sap-docs&lt;/a&gt; server as the documentation layer, using the public MCP endpoint &lt;code&gt;https://mcp-sap-docs.marianzeis.de/mcp&lt;/code&gt;. It can search SAP documentation, ABAP keyword docs, RAP samples, style guides, DSAG guidelines, SAP Community, and also released object information. That gives the agent a much better chance to not only say &amp;ldquo;this is possible&amp;rdquo;, but also explain what SAP recommends and where the current system differs.&lt;/p&gt;&#xA;&lt;p&gt;This combination is more useful than any single source alone:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SharePoint = what the project wants&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Jira = what needs to be solved&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mcp-sap-docs = what SAP recommends&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ARC-1 = what the SAP system actually does&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Of these four, ARC-1 is the only one that can read or write actual ABAP in actual SAP. Everything else is orchestration around it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-real-use-cases-i-tested&#34;&gt;The Real Use Cases I Tested&lt;/h2&gt;&#xA;&lt;p&gt;I created a few small demo scenarios and tested them in Copilot Studio with ARC-1. The screenshots below are from those conversations.&lt;/p&gt;&#xA;&lt;h2 id=&#34;use-case-1-bug-fix-from-a-jira-ticket&#34;&gt;Use Case 1: Bug Fix From A Jira Ticket&lt;/h2&gt;&#xA;&lt;p&gt;The first scenario is still a developer scenario, but it shows the complete loop very well. The Jira ticket &lt;code&gt;KAN-2&lt;/code&gt; only says that a customer with exactly EUR 1,000,000.00 revenue gets the wrong discount tier. Copilot reads the ticket, searches the SAP system, reads &lt;code&gt;ZARC1_DEMO_DISCOUNT&lt;/code&gt;, compares the implementation with the header comment specification, and proposes the one character patch.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Look at KAN-2, propose a patch, but don&amp;#39;t apply it yet.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The important part for me is the confirmation step. The agent does not immediately write to SAP. It first shows the root cause and the diff. Only after the follow-up prompt it updates and activates the report.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Jira ticket KAN-2 describing the wrong discount tier for exactly EUR 1,000,000.00 revenue.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-05-arc-1-copilot-studio/conversations/01/jira-ticket.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Copilot Studio proposing a patch for Jira ticket KAN-2 after reading the ABAP report ZARC1_DEMO_DISCOUNT.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-05-arc-1-copilot-studio/conversations/01/patch-proposal.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Copilot Studio confirming that the patch for ZARC1_DEMO_DISCOUNT was applied and activated.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-05-arc-1-copilot-studio/conversations/01/patch-applied.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;full-answer-viewer.html?case=Use%20Case%201&amp;amp;title=Bug%20fix%20from%20a%20Jira%20ticket&amp;amp;answer=conversations/01/full-answer.txt&#34;&gt;Open the formatted full answer&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;This captured run shows both steps: first the patch proposal, then the explicit follow-up to apply and activate it. In a safer setup, the first step alone can already be enough. The developer can copy the suggested diff, review it, test it manually, and keep ARC-1 read-only for that scenario.&lt;/p&gt;&#xA;&lt;h2 id=&#34;use-case-2-sharepoint-change-request-to-impact-analysis&#34;&gt;Use Case 2: SharePoint Change Request To Impact Analysis&lt;/h2&gt;&#xA;&lt;p&gt;The second use case is more interesting for architects. A short SharePoint memo asks to widen &lt;code&gt;ZARC1_DEMO_AMOUNT_DOM&lt;/code&gt; from &lt;code&gt;CURR 13,2&lt;/code&gt; to &lt;code&gt;CURR 23,2&lt;/code&gt;. Copilot reads the memo and then uses ARC-1 to walk the dependency chain in SAP.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Read the change request in IT/Clean Core/ and tell me what would break.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The answer is not just &amp;ldquo;yes, change the domain&amp;rdquo;. It lists the dependency chain from domain to data element to table to report, then explains the risks: activation order, possible table lock, output length, and the hardcoded report layout.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Copilot Studio showing an impact analysis for a SharePoint change request to widen an ABAP amount domain.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-05-arc-1-copilot-studio/conversations/02/impact-analysis.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;full-answer-viewer.html?case=Use%20Case%202&amp;amp;title=SharePoint%20change%20request%20impact%20analysis&amp;amp;answer=conversations/02/full-answer.txt&#34;&gt;Open the formatted full answer&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is where a solution architect or functional consultant benefits from SAP system context without needing an IDE. It turns a business change request into a better technical discussion.&lt;/p&gt;&#xA;&lt;h2 id=&#34;use-case-3-build-a-cds-view-from-a-sharepoint-specification&#34;&gt;Use Case 3: Build A CDS View From A SharePoint Specification&lt;/h2&gt;&#xA;&lt;p&gt;The third use case combines SharePoint, SAP documentation, and ARC-1. The input is a small SharePoint specification for a sales order KPI CDS view. Copilot reads the spec, uses &lt;a href=&#34;https://mcp-sap-docs.marianzeis.de/&#34;&gt;mcp-sap-docs&lt;/a&gt; for SAP documentation and CDS conventions, reads the source table from SAP, and then creates and activates the views.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Build the CDS view from IT/Specifications/spec-orders-kpi.md.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;What I liked in this example is that the agent had to adapt to the system. The first simple idea did not work because the system did not allow arithmetic expressions directly inside aggregate functions. The final result was a two-layer CDS design: a base view for line revenue and a KPI view for aggregation.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Copilot Studio explaining that it created and activated a two-layer CDS view design from a SharePoint specification.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-05-arc-1-copilot-studio/conversations/03/cds-view-built.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;full-answer-viewer.html?case=Use%20Case%203&amp;amp;title=CDS%20view%20from%20a%20SharePoint%20specification&amp;amp;answer=conversations/03/full-answer.txt&#34;&gt;Open the formatted full answer&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is where Copilot Studio becomes more than a chatbot over documents: SharePoint for the requirement, mcp-sap-docs for the SAP pattern, and ARC-1 for the real table and activation.&lt;/p&gt;&#xA;&lt;h2 id=&#34;use-case-4-code-quality-report&#34;&gt;Use Case 4: Code Quality Report&lt;/h2&gt;&#xA;&lt;p&gt;The fourth scenario is reporting only. The prompt asks Copilot to audit the &lt;code&gt;$TMP&lt;/code&gt; &lt;code&gt;ZARC1_DEMO_*&lt;/code&gt; ABAP programs and post a quality report. The captured answer shows the generated Markdown report, not the SharePoint write-back step.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Audit our $TMP ZARC1_DEMO_* ABAP programs and post a quality report.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Copilot searches the SAP system, reads the programs, runs both SAP ATC checks and abaplint, and produces a per-program report with the two findings axes scored against an overall Risk column. It also catches things pure linting would not flag on its own: SQL injection in the dump-trigger report, full-table scans in the invoice list, and table-buffer bypass on &lt;code&gt;USR02&lt;/code&gt;. The same output could then be written to SharePoint, Word, or another document store depending on the connectors and permissions.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Copilot Studio showing an ABAP code quality audit report for ZARC1_DEMO programs.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-05-arc-1-copilot-studio/conversations/04/code-quality-report.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;full-answer-viewer.html?case=Use%20Case%204&amp;amp;title=ABAP%20code%20quality%20report&amp;amp;answer=conversations/04/full-answer.txt&#34;&gt;Open the formatted full answer&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;This is not mainly a coding example. It gives an architect, technical lead, or quality manager a faster first view: which programs are risky, which findings are only style, and which ones would block a promotion.&lt;/p&gt;&#xA;&lt;h2 id=&#34;use-case-5-short-dump-diagnosis-from-a-jira-ticket&#34;&gt;Use Case 5: Short Dump Diagnosis From A Jira Ticket&lt;/h2&gt;&#xA;&lt;p&gt;The fifth example starts from an intentionally weak Jira ticket. It only says that &lt;code&gt;ZARC1_DEMO_DUMP_RPT&lt;/code&gt; short dumped overnight and that ST22 has the dump. This is close to how many real support tickets start.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Investigate KAN-3 and apply a defensive fix.&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Copilot reads the Jira ticket, uses ARC-1 to read short dumps, identifies &lt;code&gt;DBSQL_SQL_ERROR&lt;/code&gt;, reads the report, explains the root cause, and applies a defensive fix. In this demo it adds validation before a dynamic &lt;code&gt;SELECT FROM (p_table)&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Jira ticket KAN-3 with a short description that the ABAP report ZARC1_DEMO_DUMP_RPT short dumped overnight.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-05-arc-1-copilot-studio/conversations/05/jira-dump-ticket.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Copilot Studio showing ST22 short dump analysis and the defensive fix for ZARC1_DEMO_DUMP_RPT.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-05-arc-1-copilot-studio/conversations/05/short-dump-fix.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;full-answer-viewer.html?case=Use%20Case%205&amp;amp;title=Short%20dump%20diagnosis%20from%20Jira&amp;amp;answer=conversations/05/full-answer.txt&#34;&gt;Open the formatted full answer&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;In bug fixing, the analysis is often the biggest part. If the agent can collect the ticket, dump, source code, and related objects, then the developer starts much further ahead.&lt;/p&gt;&#xA;&lt;h2 id=&#34;use-case-6-clean-core-readiness-check&#34;&gt;Use Case 6: Clean Core Readiness Check&lt;/h2&gt;&#xA;&lt;p&gt;The last scenario is about clean core readiness. The prompt is simple:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Is ZCL_ARC1_DEMO_CCORE clean-core ready?&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Copilot reads the class through ARC-1 and finds direct selects on &lt;code&gt;USR02&lt;/code&gt; and &lt;code&gt;BUT000&lt;/code&gt;. Then it uses two different context sources for the assessment. ARC-1&amp;rsquo;s &lt;code&gt;API_STATE&lt;/code&gt; read capability asks the SAP system for release state and successor information. The SAP documentation source adds the official guidance around clean core, released APIs, ABAP Cloud readiness, and why direct table access to internal SAP tables is problematic. When SAP documentation returned no entry at all for &lt;code&gt;USR02&lt;/code&gt;, the agent treated that as &amp;ldquo;strictly internal, find a released alternative&amp;rdquo; rather than &amp;ldquo;unknown, assume fine&amp;rdquo;, and inferred the right successor anyway. Based on that combined context, Copilot proposes released successor APIs like &lt;code&gt;I_BUSINESSUSERBASIC&lt;/code&gt; and &lt;code&gt;I_BUSINESSPARTNER&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Copilot Studio showing a clean core readiness analysis for class ZCL_ARC1_DEMO_CCORE.&#34; loading=&#34;lazy&#34; src=&#34;https://blog.zeis.de/posts/2026-05-05-arc-1-copilot-studio/conversations/06/clean-core-readiness.png&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;a href=&#34;full-answer-viewer.html?case=Use%20Case%206&amp;amp;title=Clean%20core%20readiness%20check&amp;amp;answer=conversations/06/full-answer.txt&#34;&gt;Open the formatted full answer&lt;/a&gt;&lt;/p&gt;&#xA;&lt;p&gt;ARC-1 provides the real custom code and the system-specific release state, while SAP documentation provides the official target direction. That makes the result useful for architecture and modernization planning, not only for a developer sitting in an IDE.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-this-matters&#34;&gt;Why This Matters&lt;/h2&gt;&#xA;&lt;p&gt;The important change is not that Copilot Studio can call one more tool. The important change is that a centrally deployed ARC-1 endpoint can make SAP system context available in places where more project roles can use it.&lt;/p&gt;&#xA;&lt;p&gt;Developers still need IDEs, and Copilot Studio does not replace ABAP development tools. But it can become a useful layer for analysis, specification, support, documentation, and architecture work, especially when it combines SAP system context, SAP documentation, SharePoint, Jira, and Microsoft 365 through governed tools and connectors. Without that central architecture, this would again become a local tool story. With BTP, it becomes an enterprise agent story.&lt;/p&gt;&#xA;&lt;h2 id=&#34;discuss-this-post&#34;&gt;Discuss this post&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://saptodon.org/@Mianbsp/116518419049843109&#34;&gt;Saptodon&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://bsky.app/profile/marian.zeis.de/post/3ml2me6teds2q&#34;&gt;Bluesky&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/posts/marianzeis_what-if-copilot-could-start-from-a-support-activity-7457285481433559041-tvAA&#34;&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;references--links&#34;&gt;References &amp;amp; links&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1 on GitHub&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/&#34;&gt;ARC-1 Documentation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/tools/&#34;&gt;ARC-1 Tools&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/enterprise-auth/&#34;&gt;ARC-1 Authentication Overview&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/phase4-btp-deployment/&#34;&gt;ARC-1 BTP Cloud Foundry Deployment&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/xsuaa-setup/&#34;&gt;ARC-1 XSUAA Setup&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/btp-destination-setup/&#34;&gt;ARC-1 BTP Destination Setup&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/principal-propagation-setup/&#34;&gt;ARC-1 Principal Propagation Setup&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/authorization/&#34;&gt;ARC-1 Authorization and Roles&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/marianfoo/mcp-sap-docs&#34;&gt;mcp-sap-docs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/docs/btp/sap-business-technology-platform/abap-development-user-guides&#34;&gt;SAP Help: ABAP Development Tools for Eclipse: User Guides&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://learn.microsoft.com/en-us/microsoft-copilot-studio/&#34;&gt;Microsoft Learn: Copilot Studio documentation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-add-existing-server-to-agent&#34;&gt;Microsoft Learn: Connect your agent to an existing MCP server&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-create-new-server&#34;&gt;Microsoft Learn: Create a new MCP server&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-add-sharepoint&#34;&gt;Microsoft Learn: Add SharePoint as a knowledge source&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-add-bot-to-microsoft-teams&#34;&gt;Microsoft Learn: Connect and configure an agent for Teams and Microsoft 365 Copilot&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://learn.microsoft.com/en-us/microsoft-365/copilot/connectors/jira-cloud-deployment&#34;&gt;Microsoft Learn: Jira Cloud connector for Microsoft 365 Copilot&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://learn.microsoft.com/en-us/graph/mcp-server/use-enterprise-mcp-server-copilot-studio&#34;&gt;Microsoft Learn: Use Microsoft MCP Server for Enterprise from Copilot Studio&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>ARC-1 on SAP BTP: Secure ABAP Agentic Development Beyond the Laptop</title>
      <link>https://blog.zeis.de/posts/2026-04-29-arc-1-btp/</link>
      <pubDate>Wed, 29 Apr 2026 09:00:00 +0200</pubDate>
      <guid>https://blog.zeis.de/posts/2026-04-29-arc-1-btp/</guid>
      <description>&lt;p&gt;Series note: This post is part of my &lt;a href=&#34;https://blog.zeis.de/tags/ai-abap-development-series/&#34;&gt;AI ABAP development series&lt;/a&gt;, where I go from AI development in general, to ABAP-specific problems, and then to ARC-1.&lt;/p&gt;&#xA;&lt;p&gt;In the &lt;a href=&#34;https://blog.zeis.de/posts/2026-04-27-arc-1/&#34;&gt;previous post&lt;/a&gt;, I introduced &lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1&lt;/a&gt; as a secure ADT MCP gateway for ABAP systems. The main point was not only that ARC-1 can expose ABAP development functionality to AI clients. The main point was that this access needs a place in the architecture.&lt;/p&gt;&#xA;&lt;p&gt;This post is about that place. If ARC-1 should not run uncontrolled on every developer laptop, then SAP BTP is the most natural enterprise option for me. Not because BTP makes the problem disappear, but because it already has the pieces you need for this kind of setup: XSUAA, destinations, Cloud Connector, role collections, audit logging, and the normal BTP operating model.&lt;/p&gt;&#xA;&lt;p&gt;This is not a full setup guide. The exact commands are in the &lt;a href=&#34;https://docs.arc-1-mcp.com/deployment/&#34;&gt;ARC-1 deployment docs&lt;/a&gt;, the &lt;a href=&#34;https://docs.arc-1-mcp.com/phase4-btp-deployment/&#34;&gt;BTP deployment guide&lt;/a&gt;, and the pages for &lt;a href=&#34;https://docs.arc-1-mcp.com/xsuaa-setup/&#34;&gt;XSUAA&lt;/a&gt;, &lt;a href=&#34;https://docs.arc-1-mcp.com/btp-destination-setup/&#34;&gt;destinations&lt;/a&gt;, and &lt;a href=&#34;https://docs.arc-1-mcp.com/principal-propagation-setup/&#34;&gt;Principal Propagation&lt;/a&gt;. Here I want to explain the architecture options and what I would look at first.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-btp&#34;&gt;Why BTP&lt;/h2&gt;&#xA;&lt;p&gt;The problem with agentic ABAP development is not only context. It is controlled context. The AI needs to read real SAP objects, but the company also needs to know who is authenticated, where credentials live, what the effective permission is, and who can later audit what happened.&lt;/p&gt;&#xA;&lt;p&gt;That is where BTP helps. ARC-1 can run as one central Cloud Foundry application instead of many local MCP servers. The SAP connection can use BTP destinations. On-premise and private cloud systems can be reached through Cloud Connector. Users can authenticate through XSUAA. Role collections can decide who gets read, write, data preview, SQL, transport, git, or admin scopes. If the BTP Audit Log Service is bound, ARC-1 can write audit events into the platform instead of only to a local laptop.&lt;/p&gt;&#xA;&lt;p&gt;For me this is the real difference. A local setup is good for testing and for special cases, but it is not the architecture I would want for a real ABAP team. A central BTP deployment gives you one managed MCP endpoint per SAP system, one place for policy, and no need to store SAP passwords in every developer client.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-basic-shape&#34;&gt;The Basic Shape&lt;/h2&gt;&#xA;&lt;p&gt;The architecture still has the same simple shape:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;MCP client -&amp;gt; ARC-1 -&amp;gt; SAP system&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;But on BTP this becomes two authentication hops:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;AI client&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; XSUAA OAuth&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; ARC-1 on SAP BTP Cloud Foundry&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; Destination Service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; Connectivity Service&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; Cloud Connector&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  -&amp;gt; SAP ABAP system&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The first hop is the MCP client talking to ARC-1. A client like Claude, Cursor, VS Code, GitHub Copilot for Eclipse, MCP Inspector, or Copilot Studio calls the ARC-1 &lt;code&gt;/mcp&lt;/code&gt; endpoint and authenticates through XSUAA. The second hop is ARC-1 talking to SAP. For that hop, ARC-1 can use a BTP destination with a technical user, a BTP destination with Principal Propagation, or a BTP ABAP Environment service key.&lt;/p&gt;&#xA;&lt;p&gt;For human developer usage, Principal Propagation is the most interesting option. ARC-1 receives the user token, passes it to the Destination Service, and BTP plus Cloud Connector can propagate the user identity to the backend. Then SAP sees the real user instead of one shared technical account. That is important for authorization and for audit.&lt;/p&gt;&#xA;&lt;p&gt;ARC-1 uses a dual-destination pattern for this:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SAP_BTP_DESTINATION      = shared BasicAuth destination&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SAP_BTP_PP_DESTINATION   = per-user PrincipalPropagation destination&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SAP_PP_ENABLED           = true&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;SAP_XSUAA_AUTH           = true&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The BasicAuth destination is used for startup work like feature probing and cache warmup, because there is no user JWT at startup. The PrincipalPropagation destination is used for authenticated per-user requests. In production I would also look at &lt;code&gt;SAP_PP_STRICT=true&lt;/code&gt;, because then a Principal Propagation problem fails clearly instead of silently falling back to a shared user.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-three-gates&#34;&gt;The Three Gates&lt;/h2&gt;&#xA;&lt;p&gt;The important part is that ARC-1 does not rely on one big switch. A request has to pass three gates:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;The server ceiling: what this ARC-1 instance can ever do, configured with environment variables like &lt;code&gt;SAP_ALLOW_WRITES&lt;/code&gt;, &lt;code&gt;SAP_ALLOW_FREE_SQL&lt;/code&gt;, or &lt;code&gt;SAP_ALLOWED_PACKAGES&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;The user permission: what this user can do inside ARC-1, coming from XSUAA role collections, OIDC scopes, or API-key profiles.&lt;/li&gt;&#xA;&lt;li&gt;The SAP authorization: what the SAP backend user can do, for example through &lt;code&gt;S_DEVELOP&lt;/code&gt;, package authorizations, transport authorizations, or ABAP Cloud restrictions.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;That means the effective permission is an AND model:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Effective permission = server ceiling AND user permission AND SAP authorization&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is why BTP role collections and ARC-1 safety flags are not the same thing. If the server has &lt;code&gt;SAP_ALLOW_WRITES=false&lt;/code&gt;, a user with &lt;code&gt;ARC-1 Developer&lt;/code&gt; still cannot write. If &lt;code&gt;SAP_ALLOW_FREE_SQL=false&lt;/code&gt;, a user with SQL scope still cannot run freestyle SQL. And even if both ARC-1 layers allow the action, SAP can still reject it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;deployment-options&#34;&gt;Deployment Options&lt;/h2&gt;&#xA;&lt;p&gt;The recommended option is the MTA deployment. ARC-1 includes an &lt;code&gt;mta.yaml&lt;/code&gt; with the Cloud Foundry app and the required services: XSUAA, Destination Service, and Connectivity Service. This is the most reproducible setup because the application and service bindings are described together, similar to how SAP describes multitarget applications for Cloud Foundry.&lt;/p&gt;&#xA;&lt;p&gt;The rough commands are:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm run btp:build&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm run btp:deploy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;or combined:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm run btp:build-deploy&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Docker on Cloud Foundry is the second option. That can make sense if a company wants to deploy a pinned image from GHCR or an internal registry. You still need the same BTP services, but you manage more yourself with &lt;code&gt;manifest.yml&lt;/code&gt;, &lt;code&gt;cf create-service&lt;/code&gt;, &lt;code&gt;cf bind-service&lt;/code&gt;, and &lt;code&gt;cf set-env&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;A direct Node.js buildpack deployment is also possible, especially if you patch or customize the source and push it directly with &lt;code&gt;cf push&lt;/code&gt;. For a stable team setup, I would start with MTA unless there is a concrete reason not to.&lt;/p&gt;&#xA;&lt;p&gt;BTP ABAP Environment is a separate scenario. There is no Cloud Connector involved. ARC-1 can use a service key and OAuth flow to connect to the ABAP environment. In this case &lt;code&gt;SAP_SYSTEM_TYPE=btp&lt;/code&gt; matters, because ARC-1 adapts tool definitions and avoids on-premise-only object types and assumptions.&lt;/p&gt;&#xA;&lt;h2 id=&#34;configuration-that-matters&#34;&gt;Configuration That Matters&lt;/h2&gt;&#xA;&lt;p&gt;This is not the full reference, but these are the variables I would explain first:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SAP_TRANSPORT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;http-streamable&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SAP_XSUAA_AUTH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SAP_BTP_DESTINATION&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;SAP_ECC_DEV&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SAP_BTP_PP_DESTINATION&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;SAP_ECC_DEV_PP&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SAP_PP_ENABLED&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SAP_PP_STRICT&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SAP_ALLOW_WRITES&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SAP_ALLOW_DATA_PREVIEW&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SAP_ALLOW_FREE_SQL&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SAP_ALLOW_TRANSPORT_WRITES&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SAP_ALLOW_GIT_WRITES&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;SAP_ALLOWED_PACKAGES&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;$TMP&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The first group makes ARC-1 a remote MCP server with XSUAA authentication. The second group controls the BTP destination setup and Principal Propagation. The third group is the server ceiling, and I would keep it conservative by default.&lt;/p&gt;&#xA;&lt;p&gt;For a development system, you may open selected writes:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cf set-env arc1-ecc-dev SAP_ALLOW_WRITES &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cf set-env arc1-ecc-dev SAP_ALLOW_TRANSPORT_WRITES &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cf set-env arc1-ecc-dev SAP_ALLOWED_PACKAGES &lt;span class=&#34;s1&#34;&gt;&amp;#39;Z*,$TMP&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cf restage arc1-ecc-dev&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For production, I would usually keep ARC-1 read-only:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cf set-env arc1-ecc-prod SAP_ALLOW_WRITES &lt;span class=&#34;nb&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cf set-env arc1-ecc-prod SAP_ALLOW_FREE_SQL &lt;span class=&#34;nb&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cf set-env arc1-ecc-prod SAP_ALLOW_DATA_PREVIEW &lt;span class=&#34;nb&#34;&gt;false&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cf restage arc1-ecc-prod&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The recommended architecture is like the one-instance-per-SAP-system model. A DEV system can allow selected writes, a PROD system can be read-only, and a BTP ABAP system can have its own endpoint and tool behavior. This keeps policies easier to understand than one large multi-backend gateway.&lt;/p&gt;&#xA;&lt;h2 id=&#34;roles-and-technical-users&#34;&gt;Roles And Technical Users&lt;/h2&gt;&#xA;&lt;p&gt;ARC-1 ships XSUAA scopes like &lt;code&gt;read&lt;/code&gt;, &lt;code&gt;write&lt;/code&gt;, &lt;code&gt;data&lt;/code&gt;, &lt;code&gt;sql&lt;/code&gt;, &lt;code&gt;transports&lt;/code&gt;, &lt;code&gt;git&lt;/code&gt;, and &lt;code&gt;admin&lt;/code&gt;. These are grouped into role collections such as &lt;code&gt;ARC-1 Viewer&lt;/code&gt;, &lt;code&gt;ARC-1 Developer&lt;/code&gt;, &lt;code&gt;ARC-1 Developer + Data&lt;/code&gt;, &lt;code&gt;ARC-1 Developer + SQL&lt;/code&gt;, and &lt;code&gt;ARC-1 Admin&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;For human developer usage, I would prefer XSUAA plus Principal Propagation. Then ARC-1 knows the MCP user, and SAP can also see the real SAP user. That gives a much better audit story.&lt;/p&gt;&#xA;&lt;p&gt;But not every use case needs Principal Propagation. For automation, scheduled checks, process agents, or a very controlled BTP Process Automation scenario, a technical user can be fine. The tradeoff just has to be clear: ARC-1 may know which token or client called it, but SAP will see the technical user. With Principal Propagation, SAP sees the real user.&lt;/p&gt;&#xA;&lt;h2 id=&#34;connecting-clients&#34;&gt;Connecting Clients&lt;/h2&gt;&#xA;&lt;p&gt;Once ARC-1 runs centrally, client configuration should become small. Ideally the developer configures only the MCP server URL, not SAP credentials:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;mcpServers&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;arc1-ecc-dev&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;https://arc1-ecc-dev.cfapps.eu10.hana.ondemand.com/mcp&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Clients with remote MCP and OAuth discovery can follow the XSUAA flow. ARC-1 exposes OAuth metadata and proxies the flow to XSUAA, so this can work for Claude, Cursor, VS Code-style MCP clients, and MCP Inspector.&lt;/p&gt;&#xA;&lt;p&gt;For Eclipse this becomes more concrete with &lt;a href=&#34;https://marketplace.eclipse.org/content/github-copilot&#34;&gt;GitHub Copilot for Eclipse&lt;/a&gt;. Eclipse ADT can stay the normal ABAP development environment, while Copilot can use MCP to call the same central ARC-1 endpoint. GitHub also added MCP OAuth support for Copilot in Eclipse, JetBrains, and Xcode, so this fits the BTP/XSUAA endpoint model much better than a local server on every laptop. ARC-1 still does not replace Eclipse. It gives the AI part a controlled SAP access path.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-i-would-verify-first&#34;&gt;What I Would Verify First&lt;/h2&gt;&#xA;&lt;p&gt;Before I would enable any write access, I would verify the boring things:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl https://arc1-ecc-dev.cfapps.eu10.hana.ondemand.com/health&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl https://arc1-ecc-dev.cfapps.eu10.hana.ondemand.com/.well-known/oauth-authorization-server&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then I would test a read-only MCP call and check the ARC-1 logs. The logs should show which authentication modes are active, for example XSUAA on the MCP side and Principal Propagation on the SAP side.&lt;/p&gt;&#xA;&lt;p&gt;Only after that I would enable writes, and only in steps:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;read-only -&amp;gt; writes to $TMP -&amp;gt; writes to selected packages -&amp;gt; transport writes&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is less exciting than a demo where the AI writes everything immediately, but it is much closer to how I think enterprise ABAP AI development should be introduced.&lt;/p&gt;&#xA;&lt;h2 id=&#34;where-to-go-deeper&#34;&gt;Where To Go Deeper&lt;/h2&gt;&#xA;&lt;p&gt;The architecture is the important part first, but the actual setup has many landscape-specific details.&lt;/p&gt;&#xA;&lt;p&gt;For the concrete steps, I would start with the &lt;a href=&#34;https://docs.arc-1-mcp.com/phase4-btp-deployment/&#34;&gt;BTP Cloud Foundry deployment guide&lt;/a&gt;, then go through &lt;a href=&#34;https://docs.arc-1-mcp.com/xsuaa-setup/&#34;&gt;XSUAA setup&lt;/a&gt;, &lt;a href=&#34;https://docs.arc-1-mcp.com/btp-destination-setup/&#34;&gt;BTP destination setup&lt;/a&gt;, and &lt;a href=&#34;https://docs.arc-1-mcp.com/principal-propagation-setup/&#34;&gt;Principal Propagation setup&lt;/a&gt; depending on the target landscape.&lt;/p&gt;&#xA;&lt;p&gt;For me the main point stays the same: ARC-1 on BTP is not just a nicer place to host a Node.js app. It is where the MCP server can become part of an enterprise SAP development architecture, with central access, controlled permissions, and a real identity story.&lt;/p&gt;&#xA;&lt;h2 id=&#34;discuss-this-post&#34;&gt;Discuss this post&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://saptodon.org/@Mianbsp/116490533476845801&#34;&gt;Saptodon&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://bsky.app/profile/marian.zeis.de/post/3mkoa3dkw5c27&#34;&gt;Bluesky&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/posts/marianzeis_arc-1-on-btp-is-about-one-simple-shift-agentic-activity-7455473576280817664-6oWh&#34;&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;references--links&#34;&gt;References &amp;amp; links&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1 on GitHub&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/&#34;&gt;ARC-1 Documentation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/deployment/&#34;&gt;ARC-1 Deployment&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/phase4-btp-deployment/&#34;&gt;ARC-1 BTP Cloud Foundry Deployment&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/enterprise-auth/&#34;&gt;ARC-1 Enterprise Authentication&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/xsuaa-setup/&#34;&gt;ARC-1 XSUAA Setup&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/btp-destination-setup/&#34;&gt;ARC-1 BTP Destination Setup&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/principal-propagation-setup/&#34;&gt;ARC-1 Principal Propagation Setup&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/authorization/&#34;&gt;ARC-1 Authorization and Roles&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/btp-abap-environment/&#34;&gt;ARC-1 BTP ABAP Environment Setup&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/docs/btp/sap-business-technology-platform/multitarget-applications-in-cloud-foundry-environment&#34;&gt;SAP Help: Multitarget Applications in Cloud Foundry&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/docs/btp/sap-business-technology-platform/what-is-sap-authorization-and-trust-management-service&#34;&gt;SAP Help: Authorization and Trust Management Service&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/docs/connectivity/sap-btp-connectivity-cf/authenticating-users-against-on-premise-systems&#34;&gt;SAP Help: Authenticating Users Against On-Premise Systems&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://sap.github.io/cloud-sdk/docs/js/features/connectivity/destinations&#34;&gt;SAP Cloud SDK: Destinations&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://marketplace.eclipse.org/content/github-copilot&#34;&gt;GitHub Copilot for Eclipse&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.blog/changelog/2025-11-18-enhanced-mcp-oauth-support-for-github-copilot-in-jetbrains-eclipse-and-xcode&#34;&gt;GitHub Changelog: Enhanced MCP OAuth support for Copilot in Eclipse, JetBrains, and Xcode&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>Introducing ARC-1: A Secure ADT MCP Server for Enterprise SAP Development</title>
      <link>https://blog.zeis.de/posts/2026-04-27-arc-1/</link>
      <pubDate>Mon, 27 Apr 2026 09:00:00 +0200</pubDate>
      <guid>https://blog.zeis.de/posts/2026-04-27-arc-1/</guid>
      <description>&lt;p&gt;Series note: This post is part of my &lt;a href=&#34;https://blog.zeis.de/tags/ai-abap-development-series/&#34;&gt;AI ABAP development series&lt;/a&gt;, where I go from AI development in general, to ABAP-specific problems, and then to ARC-1.&lt;/p&gt;&#xA;&lt;p&gt;In the &lt;a href=&#34;https://blog.zeis.de/posts/2026-04-20-how-i-use-ai/&#34;&gt;first post of this series&lt;/a&gt;, I wrote about context and how I use AI in development. In the &lt;a href=&#34;https://blog.zeis.de/posts/2026-04-22-ai-abap-development/&#34;&gt;previous post&lt;/a&gt;, I then moved that discussion into ABAP and ended more or less with one question: what would an ADT MCP setup need to look like if you take control, identity, and security seriously from the beginning?&lt;/p&gt;&#xA;&lt;p&gt;This post is my current answer to that question. It is called &lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1&lt;/a&gt; (ABAP Relay Connector, pronounced arc one [ɑːrk wʌn]), and yes, it is another ADT MCP server. But the important difference is not that it can talk to ADT at all. Other projects already showed very well that this is possible and useful. The difference is the architecture and the focus, which is also why the &lt;a href=&#34;https://docs.arc-1-mcp.com/&#34;&gt;ARC-1 documentation&lt;/a&gt; spends a lot of space on security, authentication, deployment, and operations, not only on the tool list.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-arc-1-had-to-exist&#34;&gt;Why ARC-1 had to exist&lt;/h2&gt;&#xA;&lt;p&gt;Luckily, the community already did a lot of the hard work before ARC-1. &lt;a href=&#34;https://github.com/marcellourbani/abap-adt-api&#34;&gt;Marcello Urbani&amp;rsquo;s abap-adt-api&lt;/a&gt; gave many TypeScript projects the foundation to work with ADT APIs at all, which are still not really documented in a useful way. Projects like &lt;a href=&#34;https://github.com/oisee/vibing-steampunk&#34;&gt;oisee/vibing-steampunk&lt;/a&gt;, &lt;a href=&#34;https://github.com/fr0ster/mcp-abap-adt&#34;&gt;fr0ster/mcp-abap-adt&lt;/a&gt;, and &lt;a href=&#34;https://github.com/DassianInc/dassian-adt&#34;&gt;DassianInc/dassian-adt&lt;/a&gt; already proved that MCP and ABAP development can work in practice and can be very useful. And &lt;a href=&#34;https://github.com/lemaiwo/btp-sap-odata-to-mcp-server&#34;&gt;Wouter Lemaire&amp;rsquo;s btp-sap-odata-to-mcp-server&lt;/a&gt; was also important for me, because it already showed a BTP-deployed and centrally managed direction much earlier, and Wouter also helped me during the ARC-1 implementation.&lt;/p&gt;&#xA;&lt;p&gt;So ARC-1 is not me claiming that nobody solved this before. For me it is more this: the others already proved the technical possibility, and ARC-1 is my attempt to close the enterprise gap. That gap is the same one I described in the last post. In ABAP, the hard part is not only getting context into the model. It is that context access, write access, and control are tied very closely together in a real SAP landscape.&lt;/p&gt;&#xA;&lt;p&gt;That is why I did not want to build just another local developer tool that happens to speak MCP. I wanted to build a secure ADT MCP server with a clearer security concept, more central control, and an architecture that fits better into enterprise SAP environments.&lt;/p&gt;&#xA;&lt;h2 id=&#34;central-instead-of-local&#34;&gt;Central instead of local&lt;/h2&gt;&#xA;&lt;p&gt;For me this is probably the biggest architectural difference. Most current MCP ADT setups are still mainly local. The server runs on the developer laptop, gets configured there, stores credentials there, and then talks directly to the SAP system from there.&lt;/p&gt;&#xA;&lt;p&gt;That is fine for trying things out. It is also fine for fast experimentation. And to be clear, ARC-1 can also run locally. That is useful for tests, local development, and simply trying the server out. But local developer setup is not the main story I care about here. The main story is central deployment.&lt;/p&gt;&#xA;&lt;p&gt;That means one managed ARC-1 instance per SAP system, with central configuration, central security settings, central logging, and a clear operational owner. That can run on a company server, in Docker, or ideally on SAP BTP Cloud Foundry. The &lt;a href=&#34;https://docs.arc-1-mcp.com/architecture/&#34;&gt;architecture documentation&lt;/a&gt; goes into the technical flow in more detail, but I will go much deeper into the BTP side in the next post, because that deserves its own post.&lt;/p&gt;&#xA;&lt;p&gt;For me BTP is especially interesting here because it lets you reuse things that already exist in many companies anyway: XSUAA, destinations, Cloud Connector, audit services, role assignment, and the usual BTP login flow. Then the developer mostly just needs the MCP URL and the standard login, while admins and authorization teams keep control in the place where they already work.&lt;/p&gt;&#xA;&lt;p&gt;I also do not think this is only an SAP-specific thought. Salesforce is already moving in a similar direction with &lt;a href=&#34;https://developer.salesforce.com/docs/platform/hosted-mcp-servers/guide/hosted-mcp-servers-overview.html&#34;&gt;hosted MCP servers&lt;/a&gt; and &lt;a href=&#34;https://www.salesforce.com/news/stories/salesforce-headless-360-announcement/&#34;&gt;Headless 360&lt;/a&gt;, where more of the platform is exposed as APIs, MCP tools, or CLI commands. To me that confirms that enterprise MCP is a platform and governance topic, not only a developer convenience topic.&lt;/p&gt;&#xA;&lt;p&gt;The reason this matters is simple. If the MCP server sits only on the laptop of an individual developer, then the architecture is also controlled there. That is exactly the part I do not find convincing for enterprise usage.&lt;/p&gt;&#xA;&lt;h2 id=&#34;two-auth-hops-matter&#34;&gt;Two auth hops matter&lt;/h2&gt;&#xA;&lt;p&gt;One thing that became very clear while building ARC-1 is that there are really two completely different authentication questions. The first one is who is allowed to talk to the MCP server at all. The second one is as which user the MCP server talks to the SAP system.&lt;/p&gt;&#xA;&lt;p&gt;That sounds obvious, but many discussions around MCP servers blur those two things together. In ARC-1, these are treated as two separate hops: &lt;code&gt;MCP client -&amp;gt; ARC-1&lt;/code&gt; and &lt;code&gt;ARC-1 -&amp;gt; SAP&lt;/code&gt;. This matters because the architecture becomes much clearer after that.&lt;/p&gt;&#xA;&lt;p&gt;For the first hop, ARC-1 can use things like API keys, OIDC/JWT, or &lt;a href=&#34;https://docs.arc-1-mcp.com/enterprise-auth/&#34;&gt;XSUAA OAuth&lt;/a&gt;, depending on how and where it is deployed. For the second hop, ARC-1 can talk to SAP with Basic Auth, BTP service keys, or with &lt;a href=&#34;https://docs.arc-1-mcp.com/principal-propagation-setup/&#34;&gt;Principal Propagation&lt;/a&gt;, depending on the target landscape.&lt;/p&gt;&#xA;&lt;p&gt;That split is very important for enterprise usage, because it lets you separate client access control from SAP identity handling instead of hiding both behind one local config file. It also makes it easier to support different use cases. If ARC-1 is used more like a backend connector for an automation, an API key may be totally fine. If real per-user identity matters, then OAuth or XSUAA plus Principal Propagation is the much more interesting setup.&lt;/p&gt;&#xA;&lt;h2 id=&#34;safe-by-default-not-allow-all-by-default&#34;&gt;Safe by default, not allow all by default&lt;/h2&gt;&#xA;&lt;p&gt;The next big difference is that ARC-1 starts from the assumption that the default should be restrictive. Out of the box ARC-1 is read-only. It blocks free SQL. It blocks named table preview. Transport reads such as list, get, check, and history remain available, but transport mutations require both writes and transport writes to be explicitly enabled. And even if writing is enabled, writes are still restricted to &lt;code&gt;$TMP&lt;/code&gt; unless packages are explicitly allowed.&lt;/p&gt;&#xA;&lt;p&gt;That last point is important to me. Yes, it makes the first setup a bit less magical. Sometimes you need to configure one more thing. But I prefer that over accidentally giving an AI assistant full write access to transportable packages because one flag was too broad.&lt;/p&gt;&#xA;&lt;p&gt;ARC-1 also has an action deny list, package restrictions, and safety profiles including &lt;code&gt;viewer&lt;/code&gt;, &lt;code&gt;viewer-data&lt;/code&gt;, &lt;code&gt;viewer-sql&lt;/code&gt;, &lt;code&gt;developer&lt;/code&gt;, &lt;code&gt;developer-data&lt;/code&gt;, &lt;code&gt;developer-sql&lt;/code&gt;, and &lt;code&gt;admin&lt;/code&gt;. So there is not only one on or off switch. For SAP development that feels much more realistic to me than a server that starts by allowing everything and then hopes people will restrict it later.&lt;/p&gt;&#xA;&lt;h2 id=&#34;layered-security-not-just-one-switch&#34;&gt;Layered security, not just one switch&lt;/h2&gt;&#xA;&lt;p&gt;This also leads to the next point. For me, security here is not one boolean setting. It is several layers on top of each other.&lt;/p&gt;&#xA;&lt;p&gt;At the ARC-1 level there is the server safety configuration itself: read-only mode, blocked SQL, package restrictions, the action deny list, and transport gates. Then there is the identity and role layer on top, for example via OIDC or XSUAA scopes and roles. And then there is still the SAP system itself with its own authorization objects and checks.&lt;/p&gt;&#xA;&lt;p&gt;That means all of these layers have to allow something before it actually happens. If ARC-1 is configured read-only, then even a user with a more powerful role still cannot write. If a user has write scope in ARC-1, but the SAP backend authorization is missing, the write still fails.&lt;/p&gt;&#xA;&lt;p&gt;That is exactly how I want it. ARC-1 should not replace SAP authorization. It should add another control layer in front of it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;per-user-identity-matters&#34;&gt;Per-user identity matters&lt;/h2&gt;&#xA;&lt;p&gt;This becomes even more interesting once you look at per-user identity. One of the things I wanted very early is that ARC-1 should not force everything through one shared technical SAP user if that can be avoided.&lt;/p&gt;&#xA;&lt;p&gt;That is why &lt;a href=&#34;https://docs.arc-1-mcp.com/principal-propagation-setup/&#34;&gt;Principal Propagation&lt;/a&gt; is such an important part of the architecture for me. If Principal Propagation is active, the MCP user identity can flow through ARC-1 and into SAP, so that the action runs with the real SAP user and the real SAP authorization of that person. I already tested this and it works.&lt;/p&gt;&#xA;&lt;p&gt;That is important not only because it is cleaner technically. It is important because it fits much better into audit, compliance, and real enterprise authorization models. I do not want the whole architecture to end in &amp;ldquo;trust this one service account and hope nobody asks too many questions later&amp;rdquo;. I want the system to be able to say who actually did what.&lt;/p&gt;&#xA;&lt;h2 id=&#34;audit-logging-is-part-of-the-feature-not-an-afterthought&#34;&gt;Audit logging is part of the feature, not an afterthought&lt;/h2&gt;&#xA;&lt;p&gt;The same applies to audit logging. If AI is allowed to read from or write to a real SAP system, then logging is not some optional extra feature. It is part of the basic architecture.&lt;/p&gt;&#xA;&lt;p&gt;ARC-1 emits structured audit events and can integrate with the &lt;a href=&#34;https://docs.arc-1-mcp.com/security-guide/&#34;&gt;BTP Audit Log Service&lt;/a&gt;. That means you can log who called which tool, what happened, and in which request context it happened. Especially on BTP, that gives you a much better compliance story than a local MCP server that mostly lives on one laptop.&lt;/p&gt;&#xA;&lt;p&gt;For normal hobby tooling this might feel like overkill. For SAP it does not. Especially if the recommended target architecture is BTP, it makes sense to also use the established platform services for logging and identity instead of building a parallel side world around them.&lt;/p&gt;&#xA;&lt;h2 id=&#34;not-locked-into-one-client&#34;&gt;Not locked into one client&lt;/h2&gt;&#xA;&lt;p&gt;This point is also important to me personally. There are already many useful prompt files, local plugins, slash commands, and client-specific workflows around SAP and ABAP. I do not think that is wrong. A lot of that work is useful and practical.&lt;/p&gt;&#xA;&lt;p&gt;But that is still a different architecture. Very often the logic, the access, and the credentials live mainly on one laptop and inside one AI client. For enterprise usage I want the opposite.&lt;/p&gt;&#xA;&lt;p&gt;I want one secure ADT MCP server that can be used from many clients. That can be Claude, &lt;a href=&#34;https://github.com/features/copilot&#34;&gt;GitHub Copilot&lt;/a&gt;, Copilot Studio, IDEs, or later other MCP clients that also support OAuth. In the best case, that can then be combined with Principal Propagation instead of local SAP credentials.&lt;/p&gt;&#xA;&lt;p&gt;That flexibility matters, because in many companies the default AI developer tooling will not be Claude Code. It will more likely be GitHub Copilot or other centrally managed tools. And I do not want the SAP side of the architecture to depend on one specific AI client. MCP is useful exactly because it decouples those things.&lt;/p&gt;&#xA;&lt;h2 id=&#34;testing-matters-more-here-than-for-normal-dev-tooling&#34;&gt;Testing matters more here than for normal dev tooling&lt;/h2&gt;&#xA;&lt;p&gt;I also want to stress the testing part, because for a project like this it matters a lot.&lt;/p&gt;&#xA;&lt;p&gt;If an MCP server only works in one perfect demo system, then that is not enough. SAP systems are messy. Different releases behave differently. Different endpoints exist or do not exist. BTP ABAP is different again. And error handling around ADT is not always beautiful.&lt;/p&gt;&#xA;&lt;p&gt;That is why ARC-1 puts a lot of effort into testing. Right now the project has &lt;a href=&#34;https://github.com/arc-mcp/arc-1#testing&#34;&gt;3,474 unit tests, a 262-test default integration profile, and a 141-test default E2E profile&lt;/a&gt;. The integration and E2E profiles test against live SAP systems, and the E2E tests execute real MCP tool calls against a running ARC-1 server. As a freelancer I obviously do not have access to every possible enterprise landscape, but I do test against real systems. I test against BTP ABAP, the ABAP trial system in Docker, and the older 7.50 trial system.&lt;/p&gt;&#xA;&lt;p&gt;I also do not test only with one ideal model and one toy example. I try it myself with stronger and weaker models and with workflows that are much closer to reality. That includes things like clean core analysis or creating a full RAP project from nothing, not even a table, up to an activated RAP project you can actually use. A lot of the workflows and feature ideas behind that are also visible in the &lt;a href=&#34;https://github.com/arc-mcp/arc-1/blob/main/skills/README.md&#34;&gt;ARC-1 skills catalog&lt;/a&gt;, because those are more or less the kinds of use cases I want to make work reliably.&lt;/p&gt;&#xA;&lt;p&gt;For me that is also one of the big lessons from working with SAP tooling in general: if you do not test against real systems, you often only test your assumptions.&lt;/p&gt;&#xA;&lt;h2 id=&#34;so-yes-this-is-another-adt-mcp-server&#34;&gt;So yes, this is another ADT MCP server&lt;/h2&gt;&#xA;&lt;p&gt;And that is fine. I do not think ARC-1 needs to exist because every other project is wrong. Quite the opposite. The other projects created the category, pushed the ecosystem forward, and showed there is real interest.&lt;/p&gt;&#xA;&lt;p&gt;At the same time I think ARC-1 is different enough in architecture and focus that it makes sense right now. It is especially different from the angle of secure defaults, central deployment, layered security, per-user identity, and auditability.&lt;/p&gt;&#xA;&lt;p&gt;And yes, it now also differentiates itself from SAP&amp;rsquo;s official approach. SAP first announced the server in its &lt;a href=&#34;https://community.sap.com/t5/technology-blog-posts-by-sap/introducing-the-next-era-of-abap-development/ba-p/14260522&#34;&gt;November 4, 2025 post about the next era of ABAP development&lt;/a&gt;. Since then, SAP has &lt;a href=&#34;https://community.sap.com/t5/technology-blog-posts-by-sap/abap-ai-chapter-3-we-go-agentic/ba-p/14391469&#34;&gt;made the official ABAP MCP server available in both Eclipse and VS Code&lt;/a&gt;. I think that is good news.&lt;/p&gt;&#xA;&lt;p&gt;The current difference is architectural. SAP&amp;rsquo;s &lt;a href=&#34;https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/configuring-adt-mcp-server-ed94320814734d97801f51a5b6deb802&#34;&gt;configuration guide&lt;/a&gt; describes the ADT MCP server as a local HTTP server hosted by the IDE and protected with a generated bearer token. ARC-1 can also run locally, but the main direction described in this post remains central deployment, BTP integration, enterprise authentication, per-user backend identity, roles, and audit logging.&lt;/p&gt;&#xA;&lt;p&gt;SAP also says that a possible standalone shipment of the ABAP Language Server and MCP Server is still under discussion. If reusable standalone components become available, ARC-1 should evaluate using that foundation instead of reimplementing more and more HTTP details on the community side. For now, the official local server and a centrally deployed ARC-1 instance are two existing approaches with different deployment and governance models.&lt;/p&gt;&#xA;&lt;p&gt;The point is not that my server must win. The point is that different architectures serve different needs, and competition is usually good. It helps people choose, it helps ideas spread, and it gives both SAP and community projects feedback from real use. People can decide whether the official local ADT MCP server, a centrally deployed ARC-1 setup, or both fit their landscape.&lt;/p&gt;&#xA;&lt;h2 id=&#34;a-note-on-adt-apis-and-saps-new-api-policy&#34;&gt;A note on ADT APIs and SAP&amp;rsquo;s new API policy&lt;/h2&gt;&#xA;&lt;p&gt;There is one more point worth separating from the architecture discussion. SAP published a new API policy in April 2026. The &lt;a href=&#34;https://help.sap.com/doc/sap-api-policy/latest/en-US/API_Policy_latest.pdf&#34;&gt;current SAP API Policy is version 4.2026a&lt;/a&gt;. It permits published APIs for their documented use, but says non-published APIs must not be used unless documentation or SAP authorization permits it. It also explicitly restricts API use with generative AI systems that plan, select, or execute sequences of calls outside SAP-endorsed architectures and documented limits. That makes this more than a theoretical support question for SAP customers, partners, and community tools that build on top of SAP development APIs.&lt;/p&gt;&#xA;&lt;p&gt;For ADT, the publicly available material points to a more nuanced situation. SAP provides an official ADT SDK with JavaDoc, and the ADT download page describes it as a public API to implement or integrate your own tools with SAP&amp;rsquo;s ABAP IDE. There is also an SAP document about creating and consuming RESTful APIs in ADT. This does not imply that every internal &lt;code&gt;/sap/bc/adt&lt;/code&gt; endpoint is covered by the same support boundary, but it does show that parts of the ADT tooling and communication model are documented and intended for integration scenarios.&lt;/p&gt;&#xA;&lt;p&gt;Since then, SAP has shipped the ABAP Language Server and MCP Server as parts of Eclipse and VS Code, while a standalone shipment remains under discussion. That does not by itself define the support boundary for every endpoint used by third-party tools. ARC-1&amp;rsquo;s position is therefore deliberately cautious: stay close to documented and discoverable ADT behavior, keep data preview and free SQL off by default, review the SAP policy and the customer&amp;rsquo;s SAP agreement, and ask SAP before production use. The &lt;a href=&#34;https://docs.arc-1-mcp.com/sap-api-policy-and-architecture/&#34;&gt;ARC-1 API Policy and Architecture Alignment&lt;/a&gt; page covers that position in more detail.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-this-matters-for-the-next-post&#34;&gt;Why this matters for the next post&lt;/h2&gt;&#xA;&lt;p&gt;In this post I mainly wanted to explain why ARC-1 exists at all and why it looks the way it does.&lt;/p&gt;&#xA;&lt;p&gt;The next post is where I want to go deeper into the BTP side, because that is where the architecture becomes much more interesting in practice: XSUAA, Destination Service, Cloud Connector, Principal Propagation, and how this can fit into a real enterprise setup instead of just a developer laptop.&lt;/p&gt;&#xA;&lt;h2 id=&#34;discuss-this-post&#34;&gt;Discuss this post&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://saptodon.org/@Mianbsp/116477784495254338&#34;&gt;Saptodon&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://bsky.app/profile/marian.zeis.de/post/3mkikvj4aos2k&#34;&gt;Bluesky&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/posts/marianzeis_introducing-arc-1-an-enterprise-adt-mcp-activity-7454748910893457408-M8BU&#34;&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;references--links&#34;&gt;References &amp;amp; links&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1&#34;&gt;ARC-1 on GitHub&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/&#34;&gt;ARC-1 Documentation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/architecture/&#34;&gt;ARC-1 Architecture&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/enterprise-auth/&#34;&gt;ARC-1 Authentication Overview&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/security-guide/&#34;&gt;ARC-1 Security Guide&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.zeis.de/posts/2026-04-20-how-i-use-ai/&#34;&gt;How I Use AI for Development and Why Context Matters&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.zeis.de/posts/2026-04-22-ai-abap-development/&#34;&gt;ABAP and Agentic AI: The Hidden Problem in Real Projects&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/marcellourbani/abap-adt-api&#34;&gt;Marcello Urbani: abap-adt-api&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/lemaiwo/btp-sap-odata-to-mcp-server&#34;&gt;Wouter Lemaire: btp-sap-odata-to-mcp-server&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/oisee/vibing-steampunk&#34;&gt;oisee/vibing-steampunk&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/fr0ster/mcp-abap-adt&#34;&gt;fr0ster/mcp-abap-adt&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/DassianInc/dassian-adt&#34;&gt;DassianInc/dassian-adt&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://github.com/arc-mcp/arc-1/blob/main/skills/README.md&#34;&gt;ARC-1 Skills Catalog&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://community.sap.com/t5/technology-blog-posts-by-sap/introducing-the-next-era-of-abap-development/ba-p/14260522&#34;&gt;Introducing the Next Era of ABAP Development&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://community.sap.com/t5/technology-blog-posts-by-sap/abap-ai-chapter-3-we-go-agentic/ba-p/14391469&#34;&gt;ABAP AI - Chapter 3: We Go Agentic!&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/configuring-adt-mcp-server-ed94320814734d97801f51a5b6deb802&#34;&gt;Configuring the ADT MCP Server&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/docs/abap-cloud/abap-development-tools-user-guide/model-context-protocol-tools&#34;&gt;SAP Model Context Protocol Tools&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://help.sap.com/doc/sap-api-policy/latest/en-US/API_Policy_latest.pdf&#34;&gt;SAP API Policy&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://docs.arc-1-mcp.com/sap-api-policy-and-architecture/&#34;&gt;ARC-1 API Policy and Architecture Alignment&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://tools.hana.ondemand.com/#abap&#34;&gt;ABAP Development Tools SDK&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.sap.com/documents/2013/04/12289ce1-527c-0010-82c7-eda71af511fa.html&#34;&gt;Create and Consume RESTful APIs in ADT&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://community.sap.com/t5/technology-blog-posts-by-sap/abap-development-tools-for-vs-code-everything-you-need-to-know/bc-p/14263439/highlight/true#M186133&#34;&gt;ABAP Development Tools for VS Code discussion&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>ABAP and Agentic AI: The Hidden Problem in Real Projects</title>
      <link>https://blog.zeis.de/posts/2026-04-22-ai-abap-development/</link>
      <pubDate>Wed, 22 Apr 2026 09:00:00 +0200</pubDate>
      <guid>https://blog.zeis.de/posts/2026-04-22-ai-abap-development/</guid>
      <description>&lt;p&gt;Series note: This post is part of my &lt;a href=&#34;https://blog.zeis.de/tags/ai-abap-development-series/&#34;&gt;AI ABAP development series&lt;/a&gt;, where I go from AI development in general, to ABAP-specific problems, and then to ARC-1.&lt;/p&gt;&#xA;&lt;p&gt;In the &lt;a href=&#34;https://blog.zeis.de/posts/2026-04-20-how-i-use-ai/&#34;&gt;first post of this series&lt;/a&gt;, I wrote more generally about how I use AI today, why context matters so much, and why I am still not fully convinced by the more maximalist agentic hype.&lt;/p&gt;&#xA;&lt;p&gt;Here I want to get more concrete.&#xA;Because SAP development is not one thing, and that matters a lot for AI.&lt;/p&gt;&#xA;&lt;p&gt;There is a big difference between UI5 or CAP development with AI and ABAP development with AI. If I mix those together, then the whole discussion becomes too vague very quickly.&lt;/p&gt;&#xA;&lt;p&gt;For me this comes down to three questions:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;How does the model get the needed context?&lt;/li&gt;&#xA;&lt;li&gt;Where does the writing happen?&lt;/li&gt;&#xA;&lt;li&gt;Who is actually in control of that setup?&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;I want to answer those questions in this post.&lt;/p&gt;&#xA;&lt;h2 id=&#34;sap-development-is-not-one-thing&#34;&gt;SAP development is not one thing&lt;/h2&gt;&#xA;&lt;p&gt;When people talk about &amp;ldquo;AI in SAP development&amp;rdquo;, a lot of very different things get mixed together.&lt;/p&gt;&#xA;&lt;p&gt;UI5, Fiori, CAP, BTP extensions, ABAP Cloud, ABAP on a shared dev system, Joule in Eclipse, MCP servers, local git workflows, sandbox systems, custom code migration. All of that gets thrown into one big AI bucket.&lt;/p&gt;&#xA;&lt;p&gt;But these are not the same problem.&#xA;The reason I want to split this early is simple: some SAP development areas already fit quite naturally into AI assisted workflows, and some really do not.&lt;/p&gt;&#xA;&lt;p&gt;If I do not separate that clearly, then the discussion becomes too vague very quickly.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-ui5-and-cap-already-feel-much-more-natural&#34;&gt;Why UI5 and CAP already feel much more natural&lt;/h2&gt;&#xA;&lt;p&gt;For frontend work like UI5, Fiori, CAP, or generally JS and TS based development, AI usage already feels much more normal. The development is usually off stack. You work in local files, use git, open pull requests, run CI/CD pipelines, let tests run, get peer review, and only then move the change further. If AI does something weird, it is annoying, but usually not catastrophic, because there are already good gates in this ideal process.&lt;/p&gt;&#xA;&lt;p&gt;That is also why GitHub Copilot in VS Code became pretty normal in a lot of companies. If you combine that with good context, for example docs from SAP Help or SAP Docs through MCP, then you can already move quite fast today. I use my own &lt;a href=&#34;https://github.com/marianfoo/mcp-sap-docs&#34;&gt;sap-mcp-docs server&lt;/a&gt; a lot for exactly that. SAP also moved in that direction with MCP servers for &lt;a href=&#34;https://community.sap.com/t5/technology-blog-posts-by-sap/give-your-ai-agent-some-tools-introducing-the-ui5-mcp-server/bc-p/14206959&#34;&gt;UI5&lt;/a&gt;, &lt;a href=&#34;https://community.sap.com/t5/technology-blog-posts-by-sap/boost-your-cap-development-with-ai-introducing-the-mcp-server-for-cap/ba-p/14202849&#34;&gt;CAP&lt;/a&gt;, and &lt;a href=&#34;https://community.sap.com/t5/technology-blog-posts-by-sap/sap-fiori-tools-update-first-release-of-the-sap-fiori-mcp-server-for/ba-p/14204694&#34;&gt;Fiori&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;In that environment the three questions above are much easier to answer:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Context comes from local files, documentation, and existing dev tooling.&lt;/li&gt;&#xA;&lt;li&gt;Writing happens locally, not directly in a shared SAP system.&lt;/li&gt;&#xA;&lt;li&gt;Control already exists through git, reviews, tests, and pipelines.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;So the main question there is often more about workflow quality than about technical possibility.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-abap-is-structurally-harder&#34;&gt;Why ABAP is structurally harder&lt;/h2&gt;&#xA;&lt;p&gt;In the ABAP world things look different. The two main problems are the architecture and the tooling.&lt;/p&gt;&#xA;&lt;p&gt;ABAP development is usually on stack. That means if you develop on the dev system, every change is directly applied to that shared system and can affect other developers as well. Even without AI that is already something you have to be careful with. With AI it becomes more sensitive, because a wrong write action is not just a wrong local file edit.&lt;/p&gt;&#xA;&lt;p&gt;The second problem is tooling. A lot of ABAP developers still use SE80. Eclipse has been there for a long time, but if you were never forced into newer development models like RAP, a lot of people just stayed where they were. And if your main world is still SE80, then there is not really much serious AI support there.&lt;/p&gt;&#xA;&lt;p&gt;So if I compare UI5 and ABAP, the problem is not only &amp;ldquo;does the model know ABAP&amp;rdquo;. The bigger question is in which environment this happens at all, and what happens if the model is wrong.&lt;/p&gt;&#xA;&lt;p&gt;That is also why I think the SAP Community post &lt;a href=&#34;https://community.sap.com/t5/technology-blog-posts-by-sap/the-agentic-revolution-is-here-and-your-abap-code-is-the-foundation/ba-p/14358726&#34;&gt;The agentic revolution is here, and your ABAP code is the foundation&lt;/a&gt; fits quite well here.&lt;/p&gt;&#xA;&lt;p&gt;The point there is not really that agents replace ABAP. It is more that if agents are going to call into SAP systems, then your ABAP foundation matters even more. Interfaces, CDS views, checks, naming, error handling, package structure, all of that becomes important.&lt;/p&gt;&#xA;&lt;p&gt;The better and clearer your ABAP foundation is, the more useful and safer the agent layer on top can become, because  they use your ABAP code as the foundation for their work.&lt;/p&gt;&#xA;&lt;p&gt;Model choice still matters, of course. I already wrote two separate posts around &lt;a href=&#34;https://blog.zeis.de/posts/2026-02-09-abap-llm-benchmark/&#34;&gt;ABAP code generation&lt;/a&gt; and &lt;a href=&#34;https://blog.zeis.de/posts/2026-03-05-abap-llm-benchmark-understanding/&#34;&gt;ABAP understanding&lt;/a&gt;, and my practical takeaway is still that strong general models together with better tooling and grounding are currently the better path than hoping one SAP specific model alone solves the problem. But even with a better model, the structural ABAP problem stays the same: on stack writes, shared systems, and weak control do not disappear. Frontier models are just better to handle more complex problems as with complexity comes usually a larger context to handle, and frontier models are usually better at that.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-three-questions-matter-more-than-the-hype&#34;&gt;The three questions matter more than the hype&lt;/h2&gt;&#xA;&lt;p&gt;I think this is also why &lt;a href=&#34;https://simonwillison.net/guides/agentic-engineering-patterns/&#34;&gt;Agentic Engineering Patterns&lt;/a&gt; from Simon Willison fits so well here.&lt;/p&gt;&#xA;&lt;p&gt;What I like there is that &amp;ldquo;agentic&amp;rdquo; is not treated like some magical category. It is more a set of working patterns: tools in a loop, tests, boundaries, anti-patterns, habits, and when not to let the loop run too far. For ABAP this matters even more, because the question is not only if an agent can do something, but what kind of loop you actually allow it to run against a real SAP system.&lt;/p&gt;&#xA;&lt;p&gt;So for every pattern below I want to keep asking the same three questions:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;How does the model get context?&lt;/li&gt;&#xA;&lt;li&gt;Where does writing happen?&lt;/li&gt;&#xA;&lt;li&gt;Who controls that setup?&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;current-patterns-for-ai-assisted-abap-development&#34;&gt;Current patterns for AI assisted ABAP development&lt;/h2&gt;&#xA;&lt;p&gt;Lars Hvam wrote a very useful paper on the &lt;a href=&#34;https://github.com/heliconialabs/patterns-for-using-llms-in-abap-development&#34;&gt;patterns for using LLMs in ABAP development&lt;/a&gt;. You can read more details and see diagrams there.&lt;/p&gt;&#xA;&lt;p&gt;I like that framing because it avoids the fake discussion of &amp;ldquo;one right way&amp;rdquo;. There is not one right way. There are different patterns with different tradeoffs depending on your landsacpe, knowledge, and setup.&lt;/p&gt;&#xA;&lt;h3 id=&#34;1-ide-integrated-ai-in-eclipse&#34;&gt;1. IDE integrated AI in Eclipse&lt;/h3&gt;&#xA;&lt;p&gt;This is the most obvious option. You stay where you already work and let the built in AI features help with explanations, code suggestions, tests, and smaller implementation tasks. Depending on landscape and setup, that could mean &lt;a href=&#34;https://www.sap.com/products/artificial-intelligence/joule-for-developers.html&#34;&gt;Joule for Developers&lt;/a&gt;, &lt;a href=&#34;https://marketplace.eclipse.org/content/github-copilot&#34;&gt;GitHub Copilot in Eclipse&lt;/a&gt;, or &lt;a href=&#34;https://docs.aws.amazon.com/amazonq/latest/qdeveloper-ug/q-in-IDE-setup.html&#34;&gt;Amazon Q Developer for Eclipse&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Context:&lt;/strong&gt; Mostly the currently selected SAP object plus what the IDE integration can access or what you add manually.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Writing:&lt;/strong&gt; Directly to the SAP system.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Control:&lt;/strong&gt; Mostly on the developer side, not much central boundary around the agent loop itself.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This is easy to adopt as &amp;ldquo;quick win&amp;rdquo;, but it does not solve the core architecture problem.&lt;/p&gt;&#xA;&lt;h3 id=&#34;2-vs-code-today-mostly-with-abap-remote-fs-and-soon-also-with-saps-own-extension&#34;&gt;2. VS Code, today mostly with ABAP Remote FS and soon also with SAP&amp;rsquo;s own extension&lt;/h3&gt;&#xA;&lt;p&gt;This gives a much better AI developer experience because VS Code is simply ahead in that area compared to Eclipse. Today that usually means community tooling like ABAP Remote FS. But SAP&amp;rsquo;s own &lt;a href=&#34;https://community.sap.com/t5/technology-blog-posts-by-sap/introducing-the-next-era-of-abap-development/ba-p/14260522&#34;&gt;ABAP Cloud Extension for VS Code&lt;/a&gt; is planned for Q2 2026, so likely around May if that timeline holds. That means ABAP Remote FS is probably more of a bridge than the long term answer, at least for the scenarios SAP will cover first.&lt;/p&gt;&#xA;&lt;p&gt;The problem stays similar though. If the setup writes back directly through ADT APIs, then the nicer editor experience still does not remove the main risk.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Context:&lt;/strong&gt; Better local editor experience, but still tied to what the tool can read from the system.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Writing:&lt;/strong&gt; Still directly to the SAP system.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Control:&lt;/strong&gt; Still relatively weak if the whole setup sits with the individual developer.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;So the nicer developer experience does not remove the main risk.&lt;/p&gt;&#xA;&lt;h3 id=&#34;3-adt-mcp-server&#34;&gt;3. ADT MCP Server&lt;/h3&gt;&#xA;&lt;p&gt;This is where things get really interesting.&lt;/p&gt;&#xA;&lt;p&gt;With an ADT MCP server the AI does not just see files. It gets structured tools. It can read objects, search code, inspect context, run checks, navigate references, write changes, etc., depending on what the server allows.&lt;/p&gt;&#xA;&lt;p&gt;This is also currently one of the best ways to solve the context problem.&lt;/p&gt;&#xA;&lt;p&gt;I already wrote earlier about this direction in &lt;a href=&#34;https://blog.zeis.de/posts/2026-02-04-abap-mcp-server/&#34;&gt;Finally: An MCP Server for ABAP&lt;/a&gt;, and since then the space has grown a lot. That is also why I keep &lt;a href=&#34;https://blog.zeis.de/posts/2026-03-05-sap-ai-mcp-servers-overview/&#34;&gt;SAP MCP Servers: The Missing Overview&lt;/a&gt; around, because the number of SAP MCP servers and adjacent tools is growing quickly enough that it is easy to lose track.&lt;/p&gt;&#xA;&lt;p&gt;The AI can say: I have a problem in this class, now get me the class, then maybe read the related table, check another class, search similar code, maybe combine that with SAP documentation from another MCP server like &lt;a href=&#34;https://github.com/marianfoo/mcp-sap-docs&#34;&gt;sap-mcp-docs&lt;/a&gt;, and build up the context automatically. That is really useful.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Context:&lt;/strong&gt; Very strong, because tools can gather much richer SAP context such as objects, data, and logs.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Writing:&lt;/strong&gt; Potentially directly to the SAP system.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Control:&lt;/strong&gt; Depends entirely on how the MCP server is designed, configured, and deployed.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This is exactly why the MCP path is so interesting and so dangerous at the same time.&lt;/p&gt;&#xA;&lt;p&gt;It solves a real problem, but it also raises the control question much more sharply. It is also why SAP&amp;rsquo;s post on &lt;a href=&#34;https://community.sap.com/t5/technology-blog-posts-by-sap/standardizing-ai-tool-integration-with-mcp-part-2-implementing-mcp-with-sap/ba-p/14359181&#34;&gt;Standardizing AI Tool Integration with MCP&lt;/a&gt; matters. MCP in SAP is not just some hobby side path anymore. It is becoming part of the real architectural conversation.&lt;/p&gt;&#xA;&lt;h3 id=&#34;4-sandbox-systems&#34;&gt;4. Sandbox systems&lt;/h3&gt;&#xA;&lt;p&gt;In my opinion this is one of the safest options.&lt;/p&gt;&#xA;&lt;p&gt;Give the AI a sandbox system that can be isolated, reset, or recreated, and suddenly much more becomes possible without damaging the shared dev system.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Context:&lt;/strong&gt; Very strong, because the AI can still inspect and work against a real SAP system.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Writing:&lt;/strong&gt; Direct, but only into an isolated system.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Control:&lt;/strong&gt; Much better than shared-system direct access, but with infrastructure cost and operational overhead.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This is a very good pattern if you can afford it. The problem is that most teams do not have this luxury.&lt;/p&gt;&#xA;&lt;h3 id=&#34;5-git-or-off-stack-development-with-abapgit-and-cicd&#34;&gt;5. Git or off stack development with abapGit and CI/CD&lt;/h3&gt;&#xA;&lt;p&gt;In many ways this is the cleanest approach.&lt;/p&gt;&#xA;&lt;p&gt;The AI never writes to the SAP system directly. It writes local files, then git, review, checks, and pipeline steps become the gate.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Context:&lt;/strong&gt; Depends on what additional read access you give the AI.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Writing:&lt;/strong&gt; Local first, not directly on the SAP system.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Control:&lt;/strong&gt; Much stronger, because review and automation become the boundary.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This is how a lot of frontend development already works, and it is much easier to trust.&lt;/p&gt;&#xA;&lt;p&gt;The problem is that many ABAP teams are simply not there yet. If there is no clear package separation, no git workflow, and no pipeline culture, then introducing this only for AI becomes a bigger transformation project.&lt;/p&gt;&#xA;&lt;h3 id=&#34;6-hybrid-approach&#34;&gt;6. Hybrid approach&lt;/h3&gt;&#xA;&lt;p&gt;This is the pattern I find currently the most practical long term.&lt;/p&gt;&#xA;&lt;p&gt;The AI works locally or off stack, but still gets read access to the SAP system through ADT or MCP for context.&lt;/p&gt;&#xA;&lt;p&gt;That means it can understand the actual system better, but the writing still happens in a gated git flow.&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Context:&lt;/strong&gt; Strong.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Writing:&lt;/strong&gt; Gated.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Control:&lt;/strong&gt; Much better than direct write access, while still preserving real system context.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;For me this is one of the most promising directions.&lt;/p&gt;&#xA;&lt;h2 id=&#34;read-access-already-gives-a-lot-of-value&#34;&gt;Read access already gives a lot of value&lt;/h2&gt;&#xA;&lt;p&gt;One thing I find important here is that AI does not need direct write access to be useful. For many real problems, reading and analysis can already take away maybe 80 percent of the work. If an issue comes in, the first question is usually not &amp;ldquo;who writes the line of code&amp;rdquo;, but &amp;ldquo;where is the actual problem&amp;rdquo;. If the AI can analyse the system, narrow it down, read code, data and logs, suggest where the bug is, and maybe propose the one line change, then the developer can still do that actual line manually. Or the AI writes the proposed fix and the developer still copy pastes it, reviews it properly, and tests it. That alone is already a lot of support.&lt;/p&gt;&#xA;&lt;p&gt;And this read access is not only useful for developers who want to code faster. It can also help people working more on architecture, specifications, analysis, testing, and migration. If they can read how the system works, where logic is implemented, how much something is used, or what the dependencies are, then that already helps a lot, for changes, fixes and the transformation from ECC to S/4HANA.&lt;/p&gt;&#xA;&lt;p&gt;That is also why I do not really buy the simple management idea that you just give everyone Copilot or an Agentic AI coding tool and suddenly everyone codes much faster. That is not the real point.&lt;/p&gt;&#xA;&lt;p&gt;The bigger question for me is how to help ABAP developers and SAP teams in their daily work with things like:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;faster problem analysis&lt;/li&gt;&#xA;&lt;li&gt;less wasted time searching for the right place&lt;/li&gt;&#xA;&lt;li&gt;easier access to relevant documentation, logs, and data&lt;/li&gt;&#xA;&lt;li&gt;faster understanding of old logic&lt;/li&gt;&#xA;&lt;li&gt;better support while writing specs and tests&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;An MCP server for documentation, an MCP server for SAP access, and access to more internal documentation can already help a lot here without giving full write access to everything.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-current-setups-still-do-not-solve&#34;&gt;What current setups still do not solve&lt;/h2&gt;&#xA;&lt;p&gt;So where is the actual gap today?&lt;/p&gt;&#xA;&lt;p&gt;For me it is not that AI cannot write ABAP. It can. It is also not that AI has no SAP context at all anymore. That situation is improving a lot through ADT tooling, MCP servers, documentation access, and better models.&lt;/p&gt;&#xA;&lt;p&gt;The real gap is that context access, write access, and control are tied much more closely together in ABAP than in off stack development, and that becomes an enterprise problem very quickly.&lt;/p&gt;&#xA;&lt;p&gt;What is often still missing is some combination of proper read-only defaults, operation boundaries, package restrictions, blocking dangerous features like free SQL, per-user identity instead of shared technical access, auditing, and a setup that security, basis, and development can all still trust.&lt;/p&gt;&#xA;&lt;p&gt;That is also why I am skeptical of setups where powerful ADT MCP servers simply run locally on the laptop of an individual user. If someone can set it up, and usually that is not even that hard, then suddenly you have a very powerful bridge from the model into the SAP system, but without much admin oversight around it. In an enterprise landscape that is not ideal at all.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-an-ideal-setup-would-look-like&#34;&gt;What an ideal setup would look like&lt;/h2&gt;&#xA;&lt;p&gt;So for me the question is not if agentic ABAP development is possible. It already is.&lt;/p&gt;&#xA;&lt;p&gt;The more important question is what a setup would need to look like if it should actually work in enterprise reality.&lt;/p&gt;&#xA;&lt;p&gt;For me that ideal direction is something like this: strong read access to real SAP context, useful structured tools instead of blind file edits, write access that is either gated or at least strongly restricted, central deployment instead of every user doing their own thing locally, clear identity handling, auditability, and enough safety boundaries that basis, security, and development can all live with it.&lt;/p&gt;&#xA;&lt;p&gt;That does not mean every team needs the exact same architecture. But it does mean the next step cannot just be &amp;ldquo;give the model more power and hope for the best&amp;rdquo;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-this-matters-for-the-next-post&#34;&gt;Why this matters for the next post&lt;/h2&gt;&#xA;&lt;p&gt;The next post is where I want to look at what a more enterprise-ready ADT MCP setup should actually provide if you take those problems seriously from the beginning.&lt;/p&gt;&#xA;&lt;h2 id=&#34;discuss-this-post&#34;&gt;Discuss this post&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://saptodon.org/@Mianbsp/116450582013903540&#34;&gt;Saptodon&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://bsky.app/profile/marian.zeis.de/post/3mk4idkeoi224&#34;&gt;Bluesky&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/posts/marianzeis_abap-and-agentic-ai-the-hidden-problem-in-activity-7452940568571232256-GF_S&#34;&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;related-posts&#34;&gt;Related posts&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.zeis.de/posts/2026-04-20-how-i-use-ai/&#34;&gt;How I Use AI for Development and Why Context Matters&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.zeis.de/posts/2026-02-04-abap-mcp-server/&#34;&gt;Finally: An MCP Server for ABAP&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.zeis.de/posts/2026-03-05-sap-ai-mcp-servers-overview/&#34;&gt;SAP MCP Servers: The Missing Overview&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
    <item>
      <title>How I Use AI for Development and Why Context Matters</title>
      <link>https://blog.zeis.de/posts/2026-04-20-how-i-use-ai/</link>
      <pubDate>Mon, 20 Apr 2026 20:00:00 +0200</pubDate>
      <guid>https://blog.zeis.de/posts/2026-04-20-how-i-use-ai/</guid>
      <description>&lt;p&gt;Series note: This post is part of my &lt;a href=&#34;https://blog.zeis.de/tags/ai-abap-development-series/&#34;&gt;AI ABAP development series&lt;/a&gt;, where I go from AI development in general, to ABAP-specific problems, and then to ARC-1.&lt;/p&gt;&#xA;&lt;p&gt;When it comes to AI, I do not really think about magic.&lt;/p&gt;&#xA;&lt;p&gt;I think more about another colleague helping me out.&lt;/p&gt;&#xA;&lt;p&gt;Sometimes that means architecture. Sometimes implementation. Sometimes testing, review, CI/CD, or deployment.&lt;/p&gt;&#xA;&lt;p&gt;But this only works with trust, and trust needs communication.&lt;/p&gt;&#xA;&lt;p&gt;If I do not know something, I ask. If code looks strange, I ask. If tests fail, I ask.&lt;/p&gt;&#xA;&lt;p&gt;The less I need to ask, the more likely it is because I already gave enough context up front: architecture, documentation, constraints, examples, and what I actually want. Even then I still review the result.&lt;/p&gt;&#xA;&lt;p&gt;That is why using AI well is a skill you build over time.&lt;/p&gt;&#xA;&lt;p&gt;My first larger projects with AI were much less smooth than newer ones. Over time I learned that better context, better tooling, and better guardrails lead to much better results. AI can speed things up a lot, but it does not remove engineering judgement.&lt;/p&gt;&#xA;&lt;h2 id=&#34;my-workflow-changed-over-the-last-year&#34;&gt;My workflow changed over the last year&lt;/h2&gt;&#xA;&lt;p&gt;Last year I was mostly just using ChatGPT directly, before tools like Claude Code became more normal. I asked something, copied the generated code into my project, checked if it runs, copied the error back if it failed, and repeated that loop.&lt;/p&gt;&#xA;&lt;p&gt;The error message was context. The result of trying it out was context. That manual loop slowly improved the output.&lt;/p&gt;&#xA;&lt;p&gt;What changed over time was not only the model. More and more the AI can get context itself.&lt;/p&gt;&#xA;&lt;p&gt;Before I had to spoon feed much more manually. Now tools can search, read docs, inspect files, and in some cases get the needed context on their own. For me that is one of the biggest improvements, because the AI does not only answer, it can first understand more.&lt;/p&gt;&#xA;&lt;p&gt;That is also why I liked &lt;a href=&#34;https://www.stavros.io/posts/how-i-write-software-with-llms/&#34;&gt;How I write software with LLMs&lt;/a&gt; by Stavros. Not because I use exactly the same workflow, but because it shows quite well that this is not only about the model. The workflow around the model matters a lot as well.&lt;/p&gt;&#xA;&lt;h2 id=&#34;context-matters-more-than-people-first-think&#34;&gt;Context matters more than people first think&lt;/h2&gt;&#xA;&lt;p&gt;A lot of the time the biggest value is not even that the model writes code for me.&lt;/p&gt;&#xA;&lt;p&gt;Very often it helps with understanding. It can explain a codebase, compare options, write down a plan, summarize documentation, help with tests and refactoring, or point me to the next thing I should check. For a lot of developers that alone is already useful, without going fully agentic.&lt;/p&gt;&#xA;&lt;p&gt;In many projects the important information is not only in the source code. It is in documentation, issues, diagrams, product docs, logs, dumps, table data, screenshots, pipeline output, and things people in the team just know. If the model only sees one file, it often gives you an answer that sounds nice but misses the actual problem.&lt;/p&gt;&#xA;&lt;p&gt;That is why I really liked the post &lt;a href=&#34;https://secondphase.com.au/context-slop-vs-shipping/&#34;&gt;Context is the Difference Between Slop and Shipping&lt;/a&gt;. I think the core point is right.&lt;/p&gt;&#xA;&lt;p&gt;If you do not understand the system first, or if the model does not get the right grounding, then you just get plausible looking nonsense faster. It looks like momentum, but often it is just wrong output with confidence.&lt;/p&gt;&#xA;&lt;p&gt;One of the first places where I really noticed this was UI5, especially with controls like the UI5 Wizard. I had to explain the API again and again, and without that extra context the output was often just wrong. That was one of the first moments where I noticed more clearly that in SAP development good context is not optional.&lt;/p&gt;&#xA;&lt;p&gt;Especially in SAP I noticed pretty quickly that you need some kind of grounding. You want to be able to say: use this documentation, use this guideline, use this code reference, trust this as the source of truth and do not just invent something.&lt;/p&gt;&#xA;&lt;p&gt;It still hallucinates sometimes, that does not fully go away, but it becomes less. Especially weaker models benefit a lot from having the right information at the right time.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-i-care-so-much-about-tooling-around-the-model&#34;&gt;Why I care so much about tooling around the model&lt;/h2&gt;&#xA;&lt;p&gt;That is also one reason why last year I started building my own MCP server for context. It can search GitHub repositories, SAP Help, and related sources, so I can bring better grounding into the workflow.&lt;/p&gt;&#xA;&lt;p&gt;For SAP development especially this helped, because so much is not directly visible in one code file. If the model can pull in SAP documentation, guidelines, and related references, it gets pushed much more into the right direction.&lt;/p&gt;&#xA;&lt;p&gt;I now almost always have that SAP docs setup with me. At the beginning it felt even more important, because the models were weaker and hallucinations were stronger. Today it is a bit better with the stronger frontier models.&lt;/p&gt;&#xA;&lt;p&gt;I also noticed this with BTP and Cloud Foundry work. There the models can often already use the CLI and public documentation quite well. So the models are improving.&lt;/p&gt;&#xA;&lt;p&gt;But the more special something gets, the more hidden it is, or the more SAP specific it is, the more important that extra context becomes again.&lt;/p&gt;&#xA;&lt;p&gt;That is also why I do not find the current AI discussion fully convincing sometimes. People talk a lot about models, but much less about the system around the model. To me, context and tooling matter more in real projects than benchmark discussions alone.&lt;/p&gt;&#xA;&lt;h2 id=&#34;model-quality-still-matters-but-it-is-not-the-whole-story&#34;&gt;Model quality still matters, but it is not the whole story&lt;/h2&gt;&#xA;&lt;p&gt;I already wrote two separate blog posts about ABAP LLM benchmark results, one more around &lt;a href=&#34;https://blog.zeis.de/posts/2026-02-09-abap-llm-benchmark/&#34;&gt;code generation&lt;/a&gt; and one around &lt;a href=&#34;https://blog.zeis.de/posts/2026-03-05-abap-llm-benchmark-understanding/&#34;&gt;understanding&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;My takeaway there was that strong general models are currently still the more practical choice for me, and that tooling and grounding are often the bigger lever than hoping for one SAP specific model to solve everything by itself.&lt;/p&gt;&#xA;&lt;p&gt;What also helps a lot is that my MCP SAP docs setup is not only pure API documentation. There are also style guides, DSAG guidelines, and other recommendations in there. These are often not hard rules, but they still push you in a certain direction. So even if I do not know the exact recommendation by heart, I can ask the model to look for guidelines and it gets nudged more automatically towards a better direction.&lt;/p&gt;&#xA;&lt;p&gt;And context is not only documentation. If I say change this class, then the context is not just that class. It is also the tables that are used, the other classes that are called, similar implementations, internal guidelines, what this system can even do, and what is already there in working code. That broader context improves quality a lot more than just throwing one file at the model.&lt;/p&gt;&#xA;&lt;h2 id=&#34;i-am-still-skeptical-of-full-agentic-hype&#34;&gt;I am still skeptical of full agentic hype&lt;/h2&gt;&#xA;&lt;p&gt;There is also a very practical spectrum in how much AI help you even want. You can just ask questions about context. You can ask it to find docs and let you read them. You can use it for analysis and planning. Or you can let it implement things more autonomously. That is not one binary choice. It is more a slider, and depending on the project, the team, and the risk, you move that slider differently.&lt;/p&gt;&#xA;&lt;p&gt;At the same time I am still not sure that going more agentic automatically makes you faster. Pure AI assistance already helps me a lot. But once it becomes more agentic, other things get harder again. The coding itself is very fast, but then you spend more time on plans, instructions, guardrails, review, and correction.&lt;/p&gt;&#xA;&lt;p&gt;This also matches quite well with the &lt;a href=&#34;https://arxiv.org/abs/2507.09089&#34;&gt;METR study on experienced open-source developers&lt;/a&gt;. What I found interesting there is not some simple &amp;ldquo;AI bad&amp;rdquo; takeaway, but more the gap between feeling faster and actually being faster.&lt;/p&gt;&#xA;&lt;p&gt;If less time goes into typing code, but more time goes into prompting, reviewing, waiting, and correcting, then it can still feel fast while the total time says something else. That matches quite well with what I notice myself.&lt;/p&gt;&#xA;&lt;p&gt;At the same time I also do not want to overcorrect too much into pure skepticism. The post &lt;a href=&#34;https://lalitm.com/post/building-syntaqlite-ai/&#34;&gt;Eight years of wanting, three months of building with AI&lt;/a&gt; is a good counterexample. AI helped a lot there, but the first more maximalist agentic approach also created a messy codebase, and things only got better again with tighter ownership and stronger review. That feels much closer to reality than either extreme.&lt;/p&gt;&#xA;&lt;p&gt;For me there is still a big difference between strong AI assistance and just letting the agent fully take over. Writing the code is now often the easiest part. I spend more time before coding on research, testing, planning, and architecture. And I spend more time after coding on review, rework, manual testing, and documentation.&lt;/p&gt;&#xA;&lt;p&gt;It is still faster in my opinion, but the time moved.&lt;/p&gt;&#xA;&lt;h2 id=&#34;process-helps-but-process-is-also-overhead&#34;&gt;Process helps, but process is also overhead&lt;/h2&gt;&#xA;&lt;p&gt;This also fits well to &lt;a href=&#34;https://community.sap.com/t5/artificial-intelligence-blogs-posts/how-i-teach-claude-code-to-work-my-way/ba-p/14349299&#34;&gt;How I teach Claude Code to work my way&lt;/a&gt;. What I like there is that the focus is not on one magical prompt, but on process. Explore first, think first, plan first, then execute.&lt;/p&gt;&#xA;&lt;p&gt;I do not use exactly the same process everywhere, but the general idea fits very well to what I learned myself. If you give the AI a process, it usually follows one. If you do not, it drifts more easily. At the same time, process also creates overhead, so it is only worth it when the task is big enough.&lt;/p&gt;&#xA;&lt;p&gt;That is also why I often want the model to first find a reference before it gives me a strong answer. Search for the SAP documentation. Find the guideline. Show me a similar implementation. Do not just make something up because it sounds right.&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-this-gets-harder-in-sap&#34;&gt;Why this gets harder in SAP&lt;/h2&gt;&#xA;&lt;p&gt;Security is also part of that trust question. How much trust do you put in the llm itself, how much in the model provider, and how much in the tools around it? How much security are you willing to give up to move faster? For toy projects people often accept a lot of risk. In enterprise development that looks very different.&lt;/p&gt;&#xA;&lt;p&gt;In SAP this matters even more, because so much important context is outside the code itself. The actual code change can be very small, but understanding why you need that change can require docs, config, logs, dumps, table entries, business process context, authorizations, and knowledge about how the landscape is set up.&lt;/p&gt;&#xA;&lt;p&gt;At the same time SAP is also moving. I was pleasantly surprised when SAP released MCP servers for &lt;a href=&#34;https://community.sap.com/t5/technology-blog-posts-by-sap/give-your-ai-agent-some-tools-introducing-the-ui5-mcp-server/bc-p/14206959&#34;&gt;UI5&lt;/a&gt;, &lt;a href=&#34;https://community.sap.com/t5/technology-blog-posts-by-sap/boost-your-cap-development-with-ai-introducing-the-mcp-server-for-cap/ba-p/14202849&#34;&gt;CAP&lt;/a&gt;, and &lt;a href=&#34;https://community.sap.com/t5/technology-blog-posts-by-sap/sap-fiori-tools-update-first-release-of-the-sap-fiori-mcp-server-for/ba-p/14204694&#34;&gt;Fiori&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;In that world it already feels much more natural, because a lot of that development is off stack anyway. You work locally, use git, run pipelines, get peer review, and if something goes wrong you can usually revert it. That is much easier territory for AI assisted development.&lt;/p&gt;&#xA;&lt;p&gt;So the interesting question for me is not if AI can help in SAP development. It already can. The more interesting question is where it helps today, where it becomes risky, and why especially ABAP development is still much harder than frontend or CAP development.&lt;/p&gt;&#xA;&lt;p&gt;In frontend and CAP development, AI can already fit quite naturally into workflows many teams already have. In ABAP, things look very different.&lt;/p&gt;&#xA;&lt;p&gt;The next post is where I want to look more concrete at that gap: what is already possible today, which patterns exist, and why enterprise guardrails matter much more there.&lt;/p&gt;&#xA;&lt;h2 id=&#34;discuss-this-post&#34;&gt;Discuss this post&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://saptodon.org/@Mianbsp/116439309593074502&#34;&gt;Saptodon&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://bsky.app/profile/marian.zeis.de/post/3mjxi4yqxtk2k&#34;&gt;Bluesky&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.linkedin.com/posts/marianzeis_how-i-use-ai-for-development-and-why-context-activity-7452215820195184641-r-uK&#34;&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;references--links&#34;&gt;References &amp;amp; links&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://www.stavros.io/posts/how-i-write-software-with-llms/&#34;&gt;How I write software with LLMs&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://secondphase.com.au/context-slop-vs-shipping/&#34;&gt;Context is the Difference Between Slop and Shipping&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://lalitm.com/post/building-syntaqlite-ai/&#34;&gt;Eight years of wanting, three months of building with AI&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://arxiv.org/abs/2507.09089&#34;&gt;Measuring the Impact of Early-2025 AI on Experienced Open-Source Developer Productivity&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://community.sap.com/t5/artificial-intelligence-blogs-posts/how-i-teach-claude-code-to-work-my-way/ba-p/14349299&#34;&gt;How I teach Claude Code to work my way&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.zeis.de/posts/2026-02-04-abap-mcp-server/&#34;&gt;Finally: An MCP Server for ABAP&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.zeis.de/posts/2026-03-05-sap-ai-mcp-servers-overview/&#34;&gt;SAP MCP Servers: The Missing Overview&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.zeis.de/posts/2026-02-09-abap-llm-benchmark/&#34;&gt;Benchmarking LLMs for ABAP: Why ABAP-1 Isn&amp;rsquo;t a Code Generator (Yet)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://blog.zeis.de/posts/2026-03-05-abap-llm-benchmark-understanding/&#34;&gt;SAP’s ABAP-1 Loses Every ABAP Benchmark, Even “Explaining”&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://community.sap.com/t5/technology-blog-posts-by-sap/give-your-ai-agent-some-tools-introducing-the-ui5-mcp-server/bc-p/14206959&#34;&gt;Give Your AI Agent Some Tools: Introducing the UI5 MCP Server&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://community.sap.com/t5/technology-blog-posts-by-sap/boost-your-cap-development-with-ai-introducing-the-mcp-server-for-cap/ba-p/14202849&#34;&gt;Boost your CAP Development with AI: Introducing the MCP Server for CAP&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://community.sap.com/t5/technology-blog-posts-by-sap/sap-fiori-tools-update-first-release-of-the-sap-fiori-mcp-server-for/ba-p/14204694&#34;&gt;SAP Fiori Tools Update - First Release of the SAP Fiori MCP Server for Agentic AI Workflows&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;</description>
    </item>
  </channel>
</rss>
