<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Azure Integration Services Blog articles</title>
    <link>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/bg-p/IntegrationsonAzureBlog</link>
    <description>Azure Integration Services Blog articles</description>
    <pubDate>Sat, 18 Apr 2026 04:00:02 GMT</pubDate>
    <dc:creator>IntegrationsonAzureBlog</dc:creator>
    <dc:date>2026-04-18T04:00:02Z</dc:date>
    <item>
      <title>Introducing the plugin marketplace for Azure API Center</title>
      <link>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/introducing-the-plugin-marketplace-for-azure-api-center/ba-p/4512231</link>
      <description>&lt;P&gt;Today, we're excited to announce the public preview of the&amp;nbsp;&lt;STRONG&gt;plugin marketplace endpoint&lt;/STRONG&gt;&amp;nbsp;for Azure API Center. This new capability makes it easier than ever for developers to discover and install AI plugins — including MCP servers and skills — directly from the tools they already use, like Claude Code and GitHub Copilot CLI.&lt;/P&gt;
&lt;H2&gt;The problem we're solving&lt;/H2&gt;
&lt;P&gt;As AI plugins and MCP servers become core parts of the developer workflow, teams have struggled with a fundamental challenge: there's no central, governed place to find and manage them. Developers hunt through documentation, Teams messages, and wikis — and platform teams have no reliable way to ensure the right plugins are being used. Azure API Center has built the plugin marketplace to fix this issue&lt;/P&gt;
&lt;H2&gt;What's new&lt;/H2&gt;
&lt;P&gt;When you register plugins in your API Center inventory and enable the API Center portal, we now automatically provision a&amp;nbsp;marketplace.git&amp;nbsp;endpoint at your data plane URL:&lt;/P&gt;
&lt;P&gt;Your marketplace endpoint is &lt;SPAN style="color: rgb(30, 30, 30);"&gt;https://&amp;lt;service&amp;gt;.data.&amp;lt;region&amp;gt;.azure-apicenter.ms/workspaces/default/plugins/marketplace.git&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;This endpoint serves as a live, version-controlled catalog of every plugin in your API Center — with metadata, configuration, and install instructions ready for developer tools to consume.&lt;/P&gt;
&lt;H2&gt;Get up and running in seconds&lt;/H2&gt;
&lt;P&gt;We've designed the experience to be as frictionless as possible. Developers can add your organization's marketplace and start installing plugins with just two commands:&lt;/P&gt;
&lt;P&gt;In Claude Code&lt;/P&gt;
&lt;P&gt;/plugin marketplace add &lt;A href="https://myapicenter.data.eastus.azure-apicenter.ms/workspaces/default/plugins/marketplace.git" target="_blank" rel="noopener"&gt;&amp;lt;url&amp;gt;&lt;/A&gt;&lt;BR /&gt;/plugin install plugin-name@myapicenter&lt;/P&gt;
&lt;P&gt;In GitHub Copilot CLI&lt;/P&gt;
&lt;P&gt;/plugin marketplace add &amp;lt;url&amp;gt;&lt;BR /&gt;/plugin marketplace browse myapicenter&lt;/P&gt;
&lt;H2&gt;Enterprise-ready from day one&lt;/H2&gt;
&lt;P&gt;The plugin marketplace isn't just convenient — it's governed. Access to the marketplace endpoint inherits the same authentication model you configured for your API Center portal, so your security and compliance posture stays intact. Platform teams remain in full control of what gets published; developers get a seamless, trusted source of truth.&lt;/P&gt;
&lt;H2&gt;Documentation&lt;/H2&gt;
&lt;P&gt;To learn more click &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/api-center/enable-api-center-plugin-marketplace" target="_blank" rel="noopener"&gt;here&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 17 Apr 2026 00:50:01 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/introducing-the-plugin-marketplace-for-azure-api-center/ba-p/4512231</guid>
      <dc:creator>Sreekanth_Thirthala</dc:creator>
      <dc:date>2026-04-17T00:50:01Z</dc:date>
    </item>
    <item>
      <title>Migrate Data Ingestion from Data Collector to Log Ingestion</title>
      <link>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/migrate-data-ingestion-from-data-collector-to-log-ingestion/ba-p/4510493</link>
      <description>&lt;P&gt;HTTP Data Collector API in Log Analytics workspaces is being deprecated, and will be totally out of support in September 2026.&lt;/P&gt;
&lt;P&gt;Data Collector actions in logic app using already created API connections (which uses workspace Id &amp;amp; Key) would still work against old custom log tables, however, newly created table will not be able to ingest data, although the connector would still succeed in logic app, but no data will be populated in newly created custom logs.&lt;BR /&gt;&lt;BR /&gt;In case new API connection is created for Data Collector action (using workspace Id &amp;amp; Key); these will fail with 403 - Forbidden action.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Users should start using the Log Ingestion API to send data to custom tables, and this document will guide users on how to use Log Ingestion API in logic apps.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Note: Azure portal currently is update so it doesn't show the Workspace keys in Log Analytics workspace page, however, Az CLI will still get the keys, but as stated, actions will fail with 403 when using them in Data Collector Action.&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;STRONG&gt;Creating DCE &amp;amp; DCRs:&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;To utilize the Log Ingestion API, Data Collection Endpoint &amp;amp; Data Collection Rule should be created first.&lt;/P&gt;
&lt;P&gt;DCE Creation is simple, from azure portal search for DCE, and then create a new one:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;For DCR creation, it can be either created from the DCR page in Azure Portal, or upon creating the custom log in Log Analytics workspace.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;DCR Popup&lt;/STRONG&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;You need to upload sample data file, so the custom log table has a schema, it needs to be JSON array. In case the sample log doesn't have a TimeGenerated field, you can easily add it using the mapping function as below:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Add the below code in the Transformation box, then click run.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Once you complete the DCR creation, we need to get the DCE full endpoint.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;STRONG&gt;Getting DCE Log Ingestion Full URL&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;To get the full endpoint URL, please follow the below:&lt;BR /&gt;1. Get the DCE Log Ingestion URL from the DCE overview page:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;2. On the DCR Page, get the immutable id for the DCR., then click on the JSON view of the DCR resource:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;3. From the JSON view, get the stream name from the &lt;STRONG&gt;streamDeclarations &lt;/STRONG&gt;field&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;BR /&gt;Now the full Log Ingestion URL is:&lt;BR /&gt;DCE_URL/dataCollectionRules/&lt;STRONG&gt;{immutable_id}&lt;/STRONG&gt;/streams/{&lt;STRONG&gt;streamName&lt;/STRONG&gt;}?api-version=2023-01-01&lt;/P&gt;
&lt;P&gt;It would be similar to:&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;https://mshbou****.westeurope-1.ingest.monitor.azure.com/dataCollectionRules/dcr-7*****4e988bef2995cd52ae/streams/Custom-mshboulLogAPI_CL?api-version=2023-01-01&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;STRONG&gt;Granting Logic App MI needed IAM Roles:&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;To call the ingestion endpoint using Logic Apps MI, we need to grant logic apps MI the role "&lt;STRONG&gt;Monitoring Metrics Publisher&lt;/STRONG&gt;" over the DCR resource. To do this, open the DCR, from the blade choose Access Control (IAM), and then grant the logic app MI the role "&lt;STRONG&gt;Monitoring Metrics Publisher&lt;/STRONG&gt;"&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;STRONG&gt;Calling Log Ingestion Endpoint from logic apps:&lt;/STRONG&gt;&lt;/U&gt;&lt;/P&gt;
&lt;P&gt;To call the ingestion endpoint from logic apps, we need to use the HTTP action, as below, the URI is the full DCE Endpoint we created before. Add the content-type headers, and the json body that contains the log data you want to send.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;For the authentication, it will be as below:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Once executed, it should succeed, with status code 204.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;For more details on the Log Ingestion API, and the migration, please see our documentation:&lt;BR /&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/azure-monitor/logs/custom-logs-migrate" target="_blank"&gt;Migrate from the HTTP Data Collector API to the Log Ingestion API - Azure Monitor | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/azure-monitor/logs/logs-ingestion-api-overview" target="_blank"&gt;Logs Ingestion API in Azure Monitor - Azure Monitor | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Thanks.&lt;/P&gt;</description>
      <pubDate>Mon, 13 Apr 2026 08:06:40 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/migrate-data-ingestion-from-data-collector-to-log-ingestion/ba-p/4510493</guid>
      <dc:creator>mshboul</dc:creator>
      <dc:date>2026-04-13T08:06:40Z</dc:date>
    </item>
    <item>
      <title>Logic Apps Aviators Newsletter - April 2026</title>
      <link>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/logic-apps-aviators-newsletter-april-2026/ba-p/4508804</link>
      <description>&lt;P&gt;&lt;STRONG&gt;In this issue:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="#community--1-aceaviator" target="_blank" rel="noopener"&gt;Ace Aviator of the Month&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="#community--1-productnews" target="_blank" rel="noopener"&gt;News from our product group&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="#community--1-communitynews" target="_blank" rel="noopener"&gt;News from our community&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;HR /&gt;
&lt;H1 id="aceaviator"&gt;Ace Aviator of the Month&lt;/H1&gt;
&lt;P&gt;&lt;STRONG&gt;April 2026's Ace Aviator: &lt;A class="lia-external-url" href="https://www.linkedin.com/in/marcelogomesdasilva/" target="_blank" rel="noopener"&gt;Marcelo Gomes&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;img&gt;Marcelo Gomes - Integration Team Leader @ COFCO International&lt;/img&gt;
&lt;P class="lia-clear-both"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;What’s your role and title? What are your responsibilities?&lt;/H5&gt;
&lt;P&gt;I’m an Integration Team Leader (Azure Integrations) at COFCO International, working within the Enterprise Integration Platform.&lt;BR /&gt;&lt;BR /&gt;My core responsibility is to design, architect, and operate integration solutions that connect multiple enterprise systems in a scalable, secure, and resilient way. I sit at the intersection of business, architecture, and engineering, ensuring that business requirements are correctly translated into technical workflows and integration patterns.&lt;BR /&gt;&lt;BR /&gt;From a practical standpoint, my responsibilities include:&lt;BR /&gt;- Defining integration architecture standards and patterns across the organization&lt;BR /&gt;- Designing end‑to‑end integration solutions using Azure Integration Services&lt;BR /&gt;- Owning and evolving the API landscape (via Azure API Management)&lt;BR /&gt;- Leading, mentoring, and supporting the integration team&lt;BR /&gt;- Driving PoCs, experiments, and technical explorations to validate new approaches&lt;BR /&gt;- Acting as a bridge between systems, teams, and business domains, ensuring alignment and clarity&lt;BR /&gt;&lt;BR /&gt;In short, my role is to make sure integrations are not just working — but are well‑designed, maintainable, and aligned with business goals.&lt;/P&gt;
&lt;H5&gt;Can you give us some insights into your day‑to‑day activities and what a typical day looks like?&lt;/H5&gt;
&lt;P&gt;My day‑to‑day work is a balance between technical leadership, architecture, and execution.&lt;BR /&gt;&lt;BR /&gt;A typical day usually involves:&lt;BR /&gt;- Working closely with Business Analysts and Product Owners to understand integration requirements, constraints, and expected outcomes&lt;BR /&gt;- Translating those requirements into integration flows, APIs, and orchestration logic&lt;BR /&gt;- Defining or validating the architecture of integrations, including patterns, error handling, resiliency, and observability&lt;BR /&gt;- Guiding developers during implementation, reviewing approaches, and helping them make architectural or design decisions&lt;BR /&gt;- Managing and governing APIs through Azure API Management, ensuring consistency, security, and reusability&lt;BR /&gt;- Unblocking team members by resolving technical issues, dependencies, or architectural doubts&lt;BR /&gt;- Performing estimations, supporting planning, and aligning delivery expectations&lt;BR /&gt;&lt;BR /&gt;I’m also hands‑on. I actively build integrations myself — not just to help deliver, but to stay close to the platform, understand real challenges, and continuously improve our standards and practices. I strongly believe technical leadership requires staying connected to the actual implementation.&lt;/P&gt;
&lt;H5&gt;What motivates and inspires you to be an active member of the Aviators / Microsoft community?&lt;/H5&gt;
&lt;P&gt;What motivates me is knowledge sharing.&lt;BR /&gt;&lt;BR /&gt;A big part of what I know today comes from content shared by others — blog posts, samples, talks, community discussions, and real‑world experiences. Most of my learning followed a simple loop:&lt;BR /&gt;someone shared → I tried it → I broke it → I fixed it → I learned.&lt;BR /&gt;&lt;BR /&gt;For me, learning only really completes its cycle when we share back. Explaining what worked (and what didn’t) helps others avoid the same mistakes and accelerates collective growth.&lt;BR /&gt;Communities like Aviators and the Microsoft ecosystem create a space where learning is practical, honest, and experience‑driven — and that’s exactly the type of environment I want to contribute to.&lt;/P&gt;
&lt;H5&gt;Looking back, what advice would you give to people getting into STEM or technology?&lt;/H5&gt;
&lt;P&gt;My main advice is: start by doing.&lt;BR /&gt;&lt;BR /&gt;Don’t wait until you feel ready or confident — you won’t. When you start doing, you will fail. And that failure is not a problem; it’s part of the learning process. Each failure builds experience, confidence, and technical maturity.&lt;BR /&gt;&lt;BR /&gt;Another important point: ask questions.&lt;BR /&gt;There is no such thing as a stupid question. Asking questions opens perspectives, challenges assumptions, and often triggers better solutions. Sometimes, a simple question from a fresh point of view can completely change how a problem is solved.&lt;BR /&gt;&lt;BR /&gt;Progress in technology comes from curiosity, iteration, and collaboration — not perfection.&lt;/P&gt;
&lt;H5&gt;What has helped you grow professionally?&lt;/H5&gt;
&lt;P&gt;Curiosity has been the biggest driver of my professional growth.&lt;BR /&gt;&lt;BR /&gt;I like to understand how things work under the hood, not just how to use them. When I’m curious about something, I try it myself, test different approaches, and build my own experience around it.&lt;BR /&gt;&lt;BR /&gt;That hands‑on curiosity helps me:&lt;BR /&gt;&lt;BR /&gt;- Develop stronger technical intuition&lt;BR /&gt;- Understand trade‑offs instead of just following patterns blindly&lt;BR /&gt;- Make better architectural decisions&lt;BR /&gt;- Communicate more clearly with both technical and non‑technical stakeholders&lt;BR /&gt;&lt;BR /&gt;Having personal experience with successes and failures gives me clarity about what I’m really looking for in a solution — and that has been key to my growth.&lt;/P&gt;
&lt;H5&gt;If you had a magic wand to create a new feature in Logic Apps, what would it be and why?&lt;/H5&gt;
&lt;P&gt;I’d add real‑time debugging with execution control.&lt;BR /&gt;Specifically, the ability to:&lt;BR /&gt;&lt;BR /&gt;- Pause a running Logic App execution&lt;BR /&gt;- Inspect intermediate states, variables, and payloads in real time&lt;BR /&gt;- Step through actions one by one, similar to a traditional debugger&lt;BR /&gt;&lt;BR /&gt;This would dramatically improve troubleshooting, learning, and optimization, especially in complex orchestrations. Today, we rely heavily on post‑execution inspection, which works — but real‑time visibility would be a huge leap forward in productivity and understanding.&lt;BR /&gt;&lt;BR /&gt;For integration engineers, that kind of feature would be a true game‑changer.&lt;/P&gt;
&lt;HR /&gt;
&lt;H1 id="productnews"&gt;News from our product group&lt;/H1&gt;
&lt;H5&gt;&lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/how-to-revoke-connection-oauth-programmatically-in-logic-apps/4506825" target="_blank" rel="noopener noreferrer"&gt;How to revoke connection OAuth programmatically in Logic Apps&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;The post shows how to revoke an API connection’s OAuth tokens programmatically in Logic Apps, without using the portal. It covers two approaches: invoking the Revoke Connection Keys REST API directly from a Logic App using the 'Invoke an HTTP request' action, and using an Azure AD app registration to acquire a bearer token that authorizes the revoke call from Logic Apps or tools like Postman. Step-by-step guidance includes building the request URL, obtaining tokens with client credentials, parsing the token response, and setting the Authorization header. It also documents required permissions and a least-privilege custom RBAC role.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/introducing-skills-in-azure-api-center/4506014" target="_blank" rel="noopener noreferrer"&gt;Introducing Skills in Azure API Center&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;This article introduces Skills in Azure API Center—registered, reusable capabilities that AI agents can discover and use alongside APIs, models, agents, and MCP servers. A skill describes what it does, its source repository, ownership, and which tools it is allowed to access, providing explicit governance. Teams can register skills manually in the Azure portal or automatically sync them from a Git repository, supporting GitOps workflows at scale. The portal offers discovery, filtering, and lifecycle visibility. Benefits include a single inventory for AI assets, better reuse, and controlled access via Allowed tools. Skills are available in preview with documentation links.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/reliable-blob-processing-using-azure-logic-apps-recommended-architecture/4408091" target="_blank" rel="noopener noreferrer"&gt;Reliable blob processing using Azure Logic Apps: Recommended architecture&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;The post explains limitations of the in‑app Azure Blob trigger in Logic Apps, which relies on polling and best‑effort storage logs that can miss events under load. For mission‑critical scenarios, it recommends a queue‑based pattern: have the source system emit a message to Azure Storage Queues after each blob upload, then trigger the Logic App from the queue and fetch the blob by metadata. Benefits include guaranteed triggering, decoupling, retries, and observability. As an alternative, it outlines using Event Grid with single‑tenant Logic App endpoints, plus caveats for private endpoints and subscription validation requirements.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/implementing--migrating-the-biztalk-server-aggregator-pattern-to-azure-logic-app/4495107" target="_blank" rel="noopener noreferrer"&gt;Implementing / Migrating the BizTalk Server Aggregator Pattern to Azure Logic Apps Standard&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;This article shows how to implement or migrate the classic BizTalk Server Aggregator pattern to Azure Logic Apps Standard using a production-ready template available in the Azure portal. It maps BizTalk orchestration concepts (correlation sets, pipelines, MessageBox) to cloud-native equivalents: a stateful workflow, Azure Service Bus as the messaging backbone, CorrelationId-based grouping, and FlatFileDecoding for reusing existing BizTalk XSD schemas with zero refactoring. Step-by-step guidance covers triggering with the Service Bus connector, grouping messages by CorrelationId, decoding flat files, composing aggregated results, and delivering them via HTTP. A side‑by‑side comparison highlights architectural differences and migration considerations, aligned with BizTalk Server end‑of‑life timelines.&lt;/P&gt;
&lt;HR /&gt;
&lt;H1 id="communitynews"&gt;News from our community&lt;/H1&gt;
&lt;H5&gt;&lt;A href="https://medium.com/@stephaneeyskens/resilience-for-azure-ipaas-services-92519d12b22d" target="_blank" rel="noopener noreferrer"&gt;Resilience for Azure IPaaS services&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://be.linkedin.com/in/stephane-eyskens" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Stéphane Eyskens&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Stéphane Eyskens examines resilience patterns for Azure iPaaS workloads and how to design multi‑region architectures spanning stateless and stateful services. The article maps strategies across Service Bus, Event Hubs, Event Grid, Durable Functions, Logic Apps, and API Management, highlighting failover models, idempotency, partitioning, and retry considerations. It discusses trade‑offs between active‑active and active‑passive, the role of a governed API front door, and the importance of consistent telemetry for recovery and diagnostics. The piece offers pragmatic guidance for integration teams building high‑availability, fault‑tolerant solutions on Azure.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://www.linkedin.com/pulse/from-apis-agents-rethinking-integration-agentic-era-al-ghoniem-mba-lmxmc" target="_blank" rel="noopener noreferrer"&gt;From APIs to Agents: Rethinking Integration in the Agentic Era&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://au.linkedin.com/in/alghoniem" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Al Ghoniem, MBA&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This article frames AI agents as a new layer in enterprise integration rather than a replacement for existing platforms. It contrasts deterministic orchestration with agent‑mediated behavior, then proposes an Azure‑aligned architecture: Azure AI Agent Service as runtime, API Management as the governed tool gateway, Service Bus/Event Grid for events, Logic Apps for deterministic workflows, API Center as registry, and Entra for identity and control. It also outlines patterns—tool‑mediated access, hybrid orchestration, event+agent systems, and policy‑enforced interaction—plus anti‑patterns to avoid.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://www.youtube.com/watch?v=wQm1W-4we0M" target="_blank" rel="noopener noreferrer"&gt;DevUP Talks 01 - 2026 Q1 trends with Kent Weare&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Video by &lt;A href="https://se.linkedin.com/in/logdberg" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Mattias Lögdberg&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Mattias Lögdberg hosts Kent Weare for a concise discussion on early‑2026 trends affecting integration and cloud development. The conversation explores how AI is reshaping solution design, where new opportunities are emerging, and how teams can adapt practices for reliability, scalability, and speed. It emphasizes practical implications for developers and architects working with Azure services and modern integration stacks. The episode serves as a quick way to track directional changes and focus on skills that matter as agentic automation and platform capabilities evolve.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://www.stephenwthomas.com/azure-integration-thoughts/expose-azure-logic-apps-mcp-servers-guide/" target="_blank" rel="noopener noreferrer"&gt;Azure Logic Apps as MCP Servers: A Step-by-Step Guide&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://www.linkedin.com/in/stephen-w-thomas" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Stephen W Thomas&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Stephen W Thomas shows how to expose Azure Logic Apps (Standard) as MCP servers so AI agents can safely reuse existing enterprise workflows. The guide explains why this matters—reusing logic, tapping 1,400+ connectors, and applying key-based auth—and walks through creating an HTTP workflow, defining JSON schemas, connecting to SQL Server, and generating API keys from the MCP Servers blade. It closes with testing in VS Code, demonstrating how agents invoke Logic Apps tools to query live data with governance intact, without rewriting integration code.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://blog.sandro-pereira.com/2024/08/26/biztalk-to-azure-migration-roadmap-integration-journey/" target="_blank" rel="noopener noreferrer"&gt;BizTalk to Azure Migration Roadmap: Integration Journey&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://pt.linkedin.com/in/sandropereira" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Sandro Pereira&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This roadmap-style article distills lessons from BizTalk-to-Azure migrations into a structured journey. It outlines motivations for moving, capability mapping from BizTalk to Azure Integration Services, and phased strategies that reduce risk while modernizing. Readers get guidance on assessing dependencies, choosing target Azure services, designing hybrid or cloud‑native architectures, and sequencing workloads. The post emphasises that migration is not a lift‑and‑shift but a program of work aligned to business priorities, platform governance, and operational readiness.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://www.linkedin.com/pulse/biztalk-adapters-azure-logic-apps-connectors-michael-stephenson-ejjne" target="_blank" rel="noopener noreferrer"&gt;BizTalk Adapters to Azure Logic Apps Connectors&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://uk.linkedin.com/in/michaelstephensonuk1" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Michael Stephenson&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Michael Stephenson discusses how organizations migrating from BizTalk must rethink integration patterns when moving to Azure Logic Apps connectors. The post considers what maps well, where gaps and edge cases appear, and how real-world implementations often require re‑architecting around AIS capabilities rather than a one‑to‑one adapter swap. It highlights community perspectives and practical considerations for planning, governance, and operationalizing new designs beyond pure connector parity.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://www.youtube.com/watch?v=iPu4XbXhSKo" target="_blank" rel="noopener noreferrer"&gt;Pro-Code Enterprise AI-Agents using MCP for Low-Code Integration&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Video by &lt;A href="https://de.linkedin.com/in/sebastianmeyerit" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Sebastian Meyer&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This short video demonstrates bridging pro‑code and low‑code by using the Model Context Protocol (MCP) to let autonomous AI agents interact with enterprise systems via Logic Apps. It walks through the high‑level setup—agent, MCP server, and Logic Apps workflows—and shows how to connect to platforms like ServiceNow and SAP. The focus is on practical tool choice and architecture so teams can extend existing integration assets to agent‑driven use cases without rebuilding from scratch.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://blog.sandro-pereira.com/2026/03/27/friday-fact-stop-endless-retries-azure-logic-apps/" target="_blank" rel="noopener noreferrer"&gt;Friday Fact: The Hidden Retry Behavior That Makes Logic Apps Feel Stuck&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A class="lia-external-url" href="https://www.linkedin.com/in/jo%C3%A3o-pedro-castro-ferreira-953533150/" target="_blank" rel="noopener nofollow noreferrer"&gt;João Ferreira&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This Friday Fact explains why a Logic App can appear “stuck” when calling unstable APIs: hidden retry policies, exponential backoff, and looped actions can accumulate retries and slow runs dramatically. It lists default behaviors many miss, common causes like throttling, and mitigation steps such as setting explicit retry policies, using Configure run after for failure paths, and introducing circuit breakers for flaky backends. The takeaway: the workflow may not be broken—just retrying too aggressively—so design explicit limits and recovery paths.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://www.youtube.com/watch?v=s8b62JC-5VI" target="_blank" rel="noopener noreferrer"&gt;Your Logic App Is NOT Your Business Process (Here’s Why)&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Video by &lt;A href="https://au.linkedin.com/in/alghoniem" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Al Ghoniem, MBA&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This short explainer argues that mapping Logic Apps directly to a business process produces brittle workflows. Real systems require retries, enrichment, and exception paths, so the design quickly diverges from a clean process diagram. The video proposes separating technical orchestration from business visibility using Business Process Tracking. That split yields clearer stakeholder views and more maintainable solutions, while keeping deterministic execution inside Logic Apps. It’s a practical reminder to design for operational reality rather than mirroring a whiteboard flow.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://blog.sandro-pereira.com/2023/01/26/biztalk-server-migration-to-azure-integration-services-architecture-guidance/" target="_blank" rel="noopener noreferrer"&gt;BizTalk Server Migration to Azure Integration Services Architecture Guidance&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://pt.linkedin.com/in/sandropereira" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Sandro Pereira&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;A brief overview of Microsoft’s architecture guidance for migrating BizTalk Server to Azure Integration Services. The post explains the intent of the guidance, links to sections on reasons to migrate, AIS capabilities, BizTalk vs. AIS comparisons, and service selection. It highlights planning topics such as migration approaches, best practices, and a roadmap, helping teams frame decisions for hybrid or cloud‑native architectures as they modernize BizTalk workloads.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://blog.sandro-pereira.com/2023/02/13/logic-app-power-automate-action-name-to-code-translator-tool/" target="_blank" rel="noopener noreferrer"&gt;Logic Apps &amp;amp; Power Automate Action Name to Code Translator&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://pt.linkedin.com/in/sandropereira" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Sandro Pereira&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This post introduces a lightweight utility that converts Logic Apps and Power Automate action names into their code identifiers—useful when writing expressions or searching in Code View. It explains the difference between designer-friendly labels and underlying names (spaces become underscores and certain symbols are disallowed), why this causes friction, and how the tool streamlines the translation. It includes screenshots, usage notes, and the download link to the open-source project, making it a practical time-saver for developers moving between designer and code-based workflows.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://blog.sandro-pereira.com/2025/04/14/logic-apps-consumption-cicd-from-zero-to-hero-whitepaper/" target="_blank" rel="noopener noreferrer"&gt;Logic Apps Consumption CI/CD from Zero to Hero Whitepaper&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://pt.linkedin.com/in/sandropereira" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Sandro Pereira&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This whitepaper provides an end‑to‑end path to automate CI/CD for Logic Apps Consumption using Azure DevOps. It covers solution structure, parameterization, and environment promotion, then shows how to build reliable pipelines for packaging, deploying, and validating Logic Apps. The guidance targets teams standardizing delivery with repeatable patterns and governance. With templates and practical advice, it helps reduce manual steps, improve quality, and accelerate releases for Logic Apps workloads.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://blog.sandro-pereira.com/2022/02/27/logic-app-best-practices-tips-and-tricks-2-actions-naming-convention/" target="_blank" rel="noopener noreferrer"&gt;Logic App Best practices, Tips and Tricks: #2 Actions Naming Convention&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://pt.linkedin.com/in/sandropereira" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Sandro Pereira&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This best‑practices post focuses on action naming in Logic Apps. It explains why consistent, descriptive names improve readability, collaboration, and long‑term maintainability, then outlines rules and constraints on allowed characters. It shows common pitfalls—default names, uneditable trigger/branch labels—and practical tips for renaming while avoiding broken references. The guidance helps teams treat names as living documentation so workflows remain understandable without drilling into each action’s configuration.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://blog.sandro-pereira.com/2022/03/11/how-to-expose-and-protect-logic-app-using-azure-api-management-whitepaper/" target="_blank" rel="noopener noreferrer"&gt;How to Expose and Protect Logic App Using Azure API Management (Whitepaper)&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://pt.linkedin.com/in/sandropereira" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Sandro Pereira&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This whitepaper explains how to front Logic Apps with Azure API Management for governance and security. It covers publishing Logic Apps as APIs, restricting access, enforcing IP filtering, preventing direct calls to Logic Apps, and documenting operations. It also discusses combining multiple Logic Apps under a single API, naming conventions, and how to remove exposed operations safely. The paper provides step‑by‑step guidance and a download link to help teams standardize exposure and protection patterns.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://anithasantosh.wordpress.com/2026/03/17/logic-apps-check-the-empty-result-in-sql-connector/" target="_blank" rel="noopener noreferrer"&gt;Logic apps – Check the empty result in SQL connector&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://uk.linkedin.com/in/anithaeswaran" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Anitha Eswaran&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This post shows a practical pattern for handling empty SQL results in Logic Apps. Using the SQL connector’s output, it adds a Parse JSON step to normalize the result and then evaluates length() to short‑circuit execution when no rows are returned. Screenshots illustrate building the schema, wiring the content, and introducing a conditional branch that terminates the run when the array is empty. The approach avoids unnecessary downstream actions and reduces failures, providing a reusable, lightweight guard for query‑driven workflows.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://www.linkedin.com/pulse/azure-logic-apps-basically-power-automate-steroids-you-kim-brian-hz1sc" target="_blank" rel="noopener noreferrer"&gt;Azure Logic Apps Is Basically Power Automate on Steroids (And You Shouldn’t Be Afraid of It)&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://au.linkedin.com/in/kimberleybrian" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Kim Brian&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Kim Brian explains why Logic Apps feels familiar to Power Automate builders while removing ceilings that appear at scale. The article contrasts common limits in cloud flows with Standard/Consumption capabilities, highlights the designer vs. code‑view model, and calls out built‑in Azure management features such as versioning, monitoring, and CI/CD. It positions Logic Apps as the “bigger sibling” for enterprise‑grade integrations and data throughput, offering more control without abandoning the visual authoring experience.&lt;/P&gt;
&lt;H5&gt;&lt;A class="lia-external-url" href="https://blog.sandro-pereira.com/2021/04/12/logic-apps-csv-alphabetic-sorting/" target="_blank" rel="noopener noreferrer"&gt;Logic Apps CSV Alphabetic Sorting Explained&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://pt.linkedin.com/in/sandropereira" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Sandro Pereira&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Sandro Pereira describes why CSV headers and columns can appear in alphabetical order after deploying Logic Apps via ARM templates. He explains how JSON serialization and array ordering influence CSV generation, what triggers the sorting behavior, and practical workarounds to preserve intended column order. The article helps teams avoid subtle defects in data exports by aligning workflow design and deployment practices with how Logic Apps materializes CSV content at runtime.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://www.tech-findings.com/2026/02/azure-logic-apps-translation-vs.html" target="_blank" rel="noopener noreferrer"&gt;Azure Logic Apps Translation vs Transformation – Actions, Examples, and Schema Mapping Explained&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://in.linkedin.com/in/maheshtiwari" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Maheshkumar Tiwari&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Maheshkumar Tiwari clarifies the difference between translation (format change) and transformation (business logic) in Logic Apps, then maps each to concrete Azure capabilities. Using a purchase‑order scenario, he shows how to decode/encode flat files and EDI, convert XML↔JSON, and apply Liquid/XSLT, Select, Compose, and Filter Array for schema mapping and enrichment. A quick reference table ties common tasks to the right action, helping architects separate concerns so format changes don’t break business rules and workflow design remains maintainable.&lt;/P&gt;</description>
      <pubDate>Tue, 07 Apr 2026 16:55:33 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/logic-apps-aviators-newsletter-april-2026/ba-p/4508804</guid>
      <dc:creator>WSilveira</dc:creator>
      <dc:date>2026-04-07T16:55:33Z</dc:date>
    </item>
    <item>
      <title>How to revoke connection OAuth programmatically in Logic Apps</title>
      <link>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/how-to-revoke-connection-oauth-programmatically-in-logic-apps/ba-p/4506825</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;There are multiple ways to revoke the OAuth of an API Connection other than clicking on the Revoke button in the portal:&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;For using the "Invoke an HTTP request":&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get the connection name:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Create a Logic App (Consumption), use a trigger of your liking, then add the “Invoke an HTTP request” Action.&lt;BR /&gt;Create a connection on the same Tenant that has the connection, then add the below URL to the action, and test it:&lt;/P&gt;
&lt;P&gt;&lt;A href="https://management.azure.com/subscriptions/%5bSUBSCRIPTION_ID%5d/resourceGroups/%5bRESOURCE_GROUP%5d/providers/Microsoft.Web/connections/%5bNAME_OF_CONNECTION%5d/revokeConnectionKeys?api-version=2018-07-01-preview" target="_blank"&gt;https://management.azure.com/subscriptions/[SUBSCRIPTION_ID]/resourceGroups/[RESOURCE_GROUP]/providers/Microsoft.Web/connections/[NAME_OF_CONNECTION]/revokeConnectionKeys?api-version=2018-07-01-preview&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Your test should be successful.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;For using an App Registration to fetch the Token (which is how you can do this with Postman or similar as well):&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;App Registration should include this permission:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For your Logic App, or Postman, get the Bearer Token by calling this URL:&amp;nbsp;&lt;A href="https://login.microsoftonline.com/%5bTENANT_ID%5d/oauth2/v2.0/token" target="_blank"&gt;https://login.microsoftonline.com/[TENANT_ID]/oauth2/v2.0/token&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;With this in the Body:&lt;/P&gt;
&lt;P&gt;Client_Id=[CLIENT_ID_OF_THE_APP_REG]&amp;amp;Client_Secret=[CLIENT_SECRET_FROM_APP_REG]&amp;amp;grant_type=client_credentials&amp;amp;scope=https://management.azure.com/.default&lt;/P&gt;
&lt;P&gt;For the Header use: Content-Type = application/x-www-form-urlencoded&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If you’ll use a Logic App for this; Add a Parse JSON action, use the Body of the Get Bearer Token HTTP Action as an input to the Parse JSON Action, then use the below as the Schema:&lt;/P&gt;
&lt;P&gt;{&lt;BR /&gt;&amp;nbsp; "properties": {&lt;BR /&gt;&amp;nbsp; &amp;nbsp; "access_token": {&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "type": "string"&lt;BR /&gt;&amp;nbsp; &amp;nbsp; },&lt;BR /&gt;&amp;nbsp; &amp;nbsp; "expires_in": {&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "type": "integer"&lt;BR /&gt;&amp;nbsp; &amp;nbsp; },&lt;BR /&gt;&amp;nbsp; &amp;nbsp; "ext_expires_in": {&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "type": "integer"&lt;BR /&gt;&amp;nbsp; &amp;nbsp; },&lt;BR /&gt;&amp;nbsp; &amp;nbsp; "token_type": {&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; "type": "string"&lt;BR /&gt;&amp;nbsp; &amp;nbsp; }&lt;BR /&gt;&amp;nbsp; },&lt;BR /&gt;&amp;nbsp; "type": "object"&lt;BR /&gt;}&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Finally, add another HTTP Action (or call this in Postman or similar) to call the Revoke API. In the Header add “Authorization”key with a value of “Bearer” followed by a space then add the bearer token from the output of the Parse JSON Action.&lt;/P&gt;
&lt;P&gt;&lt;A href="https://management.azure.com/subscriptions/%5bSUBSCRIPTION_ID%5d/resourceGroups/%5bRESOURCE_GROUP%5d/providers/Microsoft.Web/connections/%5bNAME_OF_CONNECTION%5d/revokeConnectionKeys?api-version=2018-07-01-preview" target="_blank"&gt;https://management.azure.com/subscriptions/[SUBSCRIPTION_ID]/resourceGroups/[RESOURCE_GROUP]/providers/Microsoft.Web/connections/[NAME_OF_CONNECTION]/revokeConnectionKeys?api-version=2018-07-01-preview&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;If you want to use CURL:&lt;/U&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Request the Token&lt;/STRONG&gt;&amp;nbsp;Use the OAuth 2.0 client credentials flow to get the token:&lt;/P&gt;
&lt;P&gt;curl -X POST \&lt;/P&gt;
&lt;P&gt;-H "Content-Type: application/x-www-form-urlencoded" \&lt;/P&gt;
&lt;P&gt;-d "client_id=[CLIENT_ID_OF_APP_REG]" \&lt;/P&gt;
&lt;P&gt;-d "scope= &lt;A href="https://management.azure.com/.default" target="_blank"&gt;https://management.azure.com/.default&lt;/A&gt;" \&lt;/P&gt;
&lt;P&gt;-d "client_secret=[CLIENT_SECRET_FROM_APP_REG]" \&lt;/P&gt;
&lt;P&gt;-d "grant_type=client_credentials" \&lt;/P&gt;
&lt;P&gt;&lt;A href="https://login.microsoftonline.com/%5bTENANT_ID%5d/oauth2/v2.0/token" target="_blank"&gt;https://login.microsoftonline.com/[TENANT_ID]/oauth2/v2.0/token&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The&amp;nbsp;access_token&amp;nbsp;in the response is your Bearer token.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Call the Revoke API&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;curl -X POST "&lt;A href="https://management.azure.com/subscriptions/%5bSUBSCRIPTION_ID%5d/resourceGroups/%5bRESOURCE_GROUP%5d/providers/Microsoft.Web/connections/%5bNAME_OF_CONNECTION%5d/revokeConnectionKeys?api-version=2018-07-01-preview" target="_blank"&gt;https://management.azure.com/subscriptions/[SUBSCRIPTION_ID]/resourceGroups/[RESOURCE_GROUP]/providers/Microsoft.Web/connections/[NAME_OF_CONNECTION]/revokeConnectionKeys?api-version=2018-07-01-preview&lt;/A&gt;" \&lt;/P&gt;
&lt;P&gt;-H "Authorization: Bearer &amp;lt;ACCESS_TOKEN&amp;gt;" \&lt;/P&gt;
&lt;P&gt;-H "Content-Type: application/json" \&lt;/P&gt;
&lt;P&gt;-d '{"key":"value"}'&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;If you face the below error,&amp;nbsp;&lt;/STRONG&gt;you will need to &lt;STRONG&gt;grant Contributor Role to the App Registration on the Resource Group that contains the API Connection. (If you want “Least privilege” skip to below )&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;{ "error": {&lt;BR /&gt;"code": "AuthorizationFailed", "message": "The client '[App_reg_client_id]' with object id '[App_reg_object_id]' does not have authorization to perform action 'Microsoft.Web/connections/revokeConnectionKeys/action' over scope '/subscriptions/[subscription_id]/resourceGroups/[resource_group_id]/providers/Microsoft.Web/connections/[connection_name]' or the scope is invalid. If access was recently granted, please refresh your credentials."&lt;BR /&gt;} }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;For “Least privilege” solution,&lt;/STRONG&gt; create a &lt;STRONG&gt;Custom RBAC Role&lt;/STRONG&gt; with the below Roles, and &lt;STRONG&gt;assign it to the App Registration Object ID&lt;/STRONG&gt; same as above:&lt;/P&gt;
&lt;P&gt;{&lt;BR /&gt;"actions": [&lt;BR /&gt;"Microsoft.Web/connections/read",&lt;BR /&gt;"Microsoft.Web/connections/write",&lt;BR /&gt;"Microsoft.Web/connections/delete",&lt;BR /&gt;"Microsoft.Web/connections/revokeConnectionKeys/action"&lt;BR /&gt;] }&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 01 Apr 2026 11:02:44 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/how-to-revoke-connection-oauth-programmatically-in-logic-apps/ba-p/4506825</guid>
      <dc:creator>Omar_Abu_Arisheh</dc:creator>
      <dc:date>2026-04-01T11:02:44Z</dc:date>
    </item>
    <item>
      <title>Introducing Skills in Azure API Center</title>
      <link>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/introducing-skills-in-azure-api-center/ba-p/4506014</link>
      <description>&lt;H2&gt;The problem&lt;/H2&gt;
&lt;P&gt;Modern applications depend on more than APIs. A single AI workflow might call an LLM, invoke an MCP tool, integrate a third-party service, and reference a business capability spanning dozens of endpoints. Without a central inventory, these assets become impossible to discover, easy to duplicate, and painful to govern.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Azure API Center&lt;/STRONG&gt; — part of the Azure API Management platform — already catalogs models, agents, and MCP servers alongside traditional APIs. Skills extend that foundation to cover reusable AI capabilities.&lt;/P&gt;
&lt;H2&gt;What is a Skill?&lt;/H2&gt;
&lt;P&gt;As AI agents become more capable, organizations need a way to define and govern what those agents can actually do. Skills are the answer.&lt;/P&gt;
&lt;P&gt;A &lt;STRONG&gt;Skill&lt;/STRONG&gt; in Azure API Center is a reusable, registered capability that AI agents can discover and consume to extend their functionality. Each skill is backed by source code — typically hosted in a Git repository — and describes what it does, what APIs or MCP servers it can access, and who owns it.&lt;/P&gt;
&lt;P&gt;Think of skills as the building blocks of AI agent behavior, promoted into a governed inventory alongside your APIs, MCP servers, models, and agents.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 1088px; height: 67px; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Example:&amp;nbsp; &lt;/STRONG&gt;A "Code Review Skill" performs automated code reviews using static analysis. It is registered in API Center with a Source URL pointing to its GitHub repo, allowed to access your code analysis API, and discoverable by any AI agent in your organization.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 100.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H2&gt;How Skills work in API Center&lt;/H2&gt;
&lt;P&gt;Skills can be added to your inventory in two ways: registered manually through the Azure portal, or synchronized automatically from a connected Git repository. Both approaches end up in the same governed catalog, discoverable through the API Center portal.&lt;/P&gt;
&lt;H3&gt;Option 1: Register a Skill manually&lt;/H3&gt;
&lt;P&gt;Use the Azure portal to register a skill directly. Navigate to Inventory &amp;gt; Assets in your API center, select + Register an asset &amp;gt; Skill, and fill in the registration form.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figure 2: Register a skill form in the Azure portal.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;The form captures everything needed to make a skill discoverable and governable:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Field&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Description&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Title&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Display name for the skill (e.g. Code Review Skill).&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Identification&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Auto-generated URL slug based on the title. Editable.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Summary&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;One-line description of what the skill does.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Description&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Full detail on capabilities, use cases, and expected behavior.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Lifecycle stage&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Current state: Design, Preview, Production, or Deprecated.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Source URL&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Git repository URL for the skill source code.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Allowed tools&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;The APIs or MCP servers from your inventory this skill is permitted to access. Enforces governance at the capability level.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;License&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Licensing terms: MIT, Apache 2.0, Proprietary, etc.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Contact information&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Owner or support contact for the skill.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 1075px; height: 82px; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Governance note:&amp;nbsp; &lt;/STRONG&gt;The Allowed tools field is key for AI governance. It explicitly defines which APIs and MCP servers a skill can invoke — preventing uncontrolled access and making security review straightforward.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 100.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H3&gt;Option 2: Sync Skills from a Git repository&lt;/H3&gt;
&lt;P&gt;For teams managing skills in source control, API Center can integrate directly with a Git repository and synchronize skill information automatically. This is the recommended approach for teams practicing GitOps or managing many skills at scale.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figure 3: Integrating a Git repository to sync skills automatically into API Center.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;When you configure a Git integration, API Center:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Creates an Environment representing the repository as a source of skills&lt;/LI&gt;
&lt;LI&gt;Scans for files matching the configured pattern (default: **/skill.md)&lt;/LI&gt;
&lt;LI&gt;Syncs matching skills into your inventory and keeps them current as the repo changes&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;For private repositories, a Personal Access Token (PAT) stored in Azure Key Vault is used for authentication. API Center's managed identity retrieves the PAT securely — no credentials are stored in the service itself.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 1051px; height: 88px; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Tip:&amp;nbsp; &lt;/STRONG&gt;Use the Automatically configure managed identity and assign permissions option when setting up the integration if you haven't pre-configured a managed identity. API Center handles the Key Vault permissions automatically.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 100.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H3&gt;Discovering Skills in your catalog&lt;/H3&gt;
&lt;P&gt;Once registered — manually or via Git — skills appear in the Inventory &amp;gt; Assets page alongside all other asset types. Linked skills (synced from Git) are visually identified with a link icon, so teams can see at a glance which skills are source-controlled.&lt;/P&gt;
&lt;P&gt;From the API Center portal, developers and other stakeholders can browse the full skill catalog, filter by lifecycle stage or type, and view detailed information about each skill — including its source URL, allowed tools, and contact information.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;Figure 4: Skills catalog in API Center portal, showing registered skills and the details related to the skill.&lt;/EM&gt;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 1058px; height: 89px; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Developer experience:&amp;nbsp; &lt;/STRONG&gt;The API Center portal gives teams a self-service way to discover approved skills without needing to ask around or search GitHub. The catalog becomes the authoritative source of what's available and what's allowed.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 100.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H2&gt;Why this matters for AI development teams&lt;/H2&gt;
&lt;P&gt;Skills close a critical gap in AI governance. As organizations deploy AI agents, they need to know — and control — what those agents can do. Without a governed skill registry, capability discovery is ad hoc, reuse is low, and security review is difficult.&lt;/P&gt;
&lt;P&gt;By bringing skills into Azure API Center alongside APIs, MCP servers, models, and agents, teams get:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;A single inventory for all the assets AI agents depend on&lt;/LI&gt;
&lt;LI&gt;Explicit governance over which resources each skill can access via Allowed tools&lt;/LI&gt;
&lt;LI&gt;Automated, source-controlled skill registration via Git integration&lt;/LI&gt;
&lt;LI&gt;Discoverability for developers and AI systems through the API Center portal&lt;/LI&gt;
&lt;LI&gt;Consistent lifecycle management — Design through Production to Deprecated&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;API Center, as part of the Azure API Management platform and the broader AI Gateway vision, is evolving into the system of record for AI-ready development. Skills are the latest step in that direction.&lt;/P&gt;
&lt;H2&gt;Available now&lt;/H2&gt;
&lt;P&gt;Skills are available today in Azure API Center (preview). To register your first skill:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Sign in to the Azure portal and navigate to your API Center instance&lt;/LI&gt;
&lt;LI&gt;In the sidebar, select Inventory &amp;gt; Assets&lt;/LI&gt;
&lt;LI&gt;Select + Register an asset &amp;gt; Skill&lt;/LI&gt;
&lt;LI&gt;Fill in the registration form and select Create&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;→ &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/api-center/register-discover-skills" target="_blank" rel="noopener"&gt;Register and discover skills in Azure API Center (docs)&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;→ &lt;A class="lia-external-url" href="https://ms.portal.azure.com/#browse/Microsoft.ApiCenter%2Fservices" target="_blank" rel="noopener"&gt;Set up your API Center portal&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;→ &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/api-management/" target="_blank" rel="noopener"&gt;Explore the Azure API Management platform&lt;/A&gt;&lt;/P&gt;</description>
      <pubDate>Thu, 26 Mar 2026 21:31:02 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/introducing-skills-in-azure-api-center/ba-p/4506014</guid>
      <dc:creator>anishta</dc:creator>
      <dc:date>2026-03-26T21:31:02Z</dc:date>
    </item>
    <item>
      <title>Reliable blob processing using Azure Logic Apps: Recommended architecture</title>
      <link>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/reliable-blob-processing-using-azure-logic-apps-recommended/ba-p/4408091</link>
      <description>&lt;P&gt;&lt;STRONG&gt;Understanding the Limitations of In-App Blob Triggers&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The Logic App Blob - In-App trigger &lt;A href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Flearn.microsoft.com%2Fen-us%2Fazure%2Flogic-apps%2Fconnectors%2Fbuilt-in%2Freference%2Fazureblob%2F&amp;amp;data=05%7C02%7CK.Swathi%40microsoft.com%7Ce1afe64eabad4635087d08dd795b4b2b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C638800155234338439%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&amp;amp;sdata=FXUv3KQIabqxvkV0tRopKp07Ic9sFVqG2B%2BbWtbODUE%3D&amp;amp;reserved=0" target="_blank" rel="noopener"&gt;https://learn.microsoft.com/en-us/azure/logic-apps/connectors/built-in/reference/azureblob/ &lt;/A&gt;is built upon the same architecture as the Azure Function App Blob trigger and therefore inherits similar features and limitations. Notably, the in-app blob trigger uses polling as its core mechanism to detect changes in blob containers &lt;A href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Flearn.microsoft.com%2Fen-us%2Fazure%2Fazure-functions%2Ffunctions-bindings-storage-blob-trigger%3Ftabs%3Dpython-v2%252Cisolated-process%252Cnodejs-v4%252Cextensionv5%26pivots%3Dprogramming-language-csharp%23polling-and-latency&amp;amp;data=05%7C02%7CK.Swathi%40microsoft.com%7Ce1afe64eabad4635087d08dd795b4b2b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C638800155234349484%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&amp;amp;sdata=1bUbL0vr%2FQ7f84RAihmcOgitUNH5ArKUrQqkhG381C0%3D&amp;amp;reserved=0" target="_blank" rel="noopener"&gt;Polling and latency&lt;/A&gt;.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Key behaviors and limitations include:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Polling-Based Detection: The trigger polls the associated container rather than subscribing to events. This hybrid mechanism combines periodic container scans with Azure Storage analytics log inspection.&lt;/LI&gt;
&lt;LI&gt;Batch Scanning: Blobs are scanned in batches of up to 10,000 per interval, using a continuation token to track progress.&lt;/LI&gt;
&lt;LI&gt;Best-Effort Logging: The system relies on Azure Storage logs, which are generated on a best-effort basis. These logs are not guaranteed to capture all blob events.&lt;/LI&gt;
&lt;LI&gt;Event Loss Risk: Under specific conditions — such as high blob throughput, delayed log generation, or log retention settings — some blob creation events may be missed.&lt;/LI&gt;
&lt;LI&gt;Latency and Missed Triggers: Due to the asynchronous and non-deterministic nature of polling and logging, there may be latency in triggering workflows, and in some cases, triggers may not fire at all.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Given these limitations, relying solely on the in-app blob trigger may not be suitable for mission-critical scenarios that require guaranteed blob processing.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Recommended Alternative Approach: Queue-Based Reliable Triggering&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;To ensure reliable and scalable blob processing without missing any events, we recommend an alternative architecture that introduces explicit event signaling via Azure Storage Queues. This approach provides greater reliability and control, especially in high-throughput or mission-critical scenarios. For more info on this pattern please refer &lt;A href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Flearn.microsoft.com%2Fen-us%2Fazure%2Farchitecture%2Fpatterns%2Fclaim-check&amp;amp;data=05%7C02%7CK.Swathi%40microsoft.com%7Ce1afe64eabad4635087d08dd795b4b2b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C638800155234284420%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&amp;amp;sdata=TbsOxOVlGUW%2Fm9a1jcDSD6p1gOvJI9R9aUBhitto4iU%3D&amp;amp;reserved=0" target="_blank" rel="noopener"&gt;Claim-Check pattern - Azure Architecture Center | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;In this approach, the Logic App uses a Storage Queue trigger, and the source system must send a queue message whenever a blob is uploaded.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;The source system should implement the following steps:
&lt;UL&gt;
&lt;LI&gt;File path or blob name&lt;/LI&gt;
&lt;LI&gt;Filename&lt;/LI&gt;
&lt;LI&gt;Additional context (for example, customer ID or upload timestamp)&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;OL&gt;
&lt;LI&gt;Blob Upload&lt;BR /&gt;Upload the file to an Azure Blob Storage container as usual.&lt;/LI&gt;
&lt;LI&gt;Queue Message Creation (Source responsibility)&lt;BR /&gt;Immediately after the blob upload completes, the source system constructs a queue message containing relevant blob metadata, such as:&lt;/LI&gt;
&lt;LI&gt;Send Message to Azure Storage Queue&lt;BR /&gt;The source system sends the constructed metadata message to a pre‑configured Azure Storage Queue.&lt;BR /&gt;This queue message acts as the explicit trigger for downstream processing.&lt;/LI&gt;
&lt;/OL&gt;
&lt;LI&gt;Trigger Logic App via Queue Message&lt;BR /&gt;The Logic App is configured with a Storage Queue trigger and is triggered only when a new message arrives in the queue.&lt;/LI&gt;
&lt;LI&gt;Process Blob via Metadata&lt;BR /&gt;Upon receiving the queue message, the Logic App:&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;Parses the blob metadata (for example, file path and filename)&lt;/LI&gt;
&lt;LI&gt;Uses the “Get blob content” action (or equivalent) to retrieve and process the actual blob content from Azure Blob Storage&lt;/LI&gt;
&lt;/UL&gt;
&lt;/OL&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;Benefits of This Approach&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Guaranteed Triggering: The Logic App is reliably triggered by a queue message, ensuring no blob is missed.&lt;/LI&gt;
&lt;LI&gt;Decoupled Workflow: This architecture decouples blob creation from processing logic, enabling better scalability and fault isolation.&lt;/LI&gt;
&lt;LI&gt;Resilience and Retry Support: Azure Storage Queues provide built-in retry capabilities, message visibility timeouts, and dead-lettering to handle transient failures gracefully.&lt;/LI&gt;
&lt;LI&gt;Better Monitoring and Control: You can monitor the queue depth, message age, and processing status to track workflow health and throughput.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Alternative Approach: Event Grid Integration&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Another reliable method for handling blob events is using Event Grid with Single Tenant Logic App workflow endpoints.&lt;/P&gt;
&lt;P&gt;&lt;A href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Ftechcommunity.microsoft.com%2Fblog%2Fintegrationsonazureblog%2Fusing-single-tenant-logic-app-workflow-endpoint-as-event-grid-subscription%2F3055814&amp;amp;data=05%7C02%7CK.Swathi%40microsoft.com%7Ce1afe64eabad4635087d08dd795b4b2b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C638800155234360478%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&amp;amp;sdata=ZQuEsIqIzBLjvC6RUqjvZuUaGdt8FcW%2FSxCGW%2F4Yt%2F0%3D&amp;amp;reserved=0" target="_blank" rel="noopener"&gt;Using Single Tenant Logic App Workflow Endpoint as Event Grid Subscription&lt;/A&gt; method allows you to handle events from either system or custom Event Grid topics. However, Event Grid topics won't be able to deliver events on private endpoints. Hence, if you have Logic App enabled with Private Endpoint, you wouldn't be able to use the workflow endpoints as Event Grid subscriptions&lt;/P&gt;
&lt;P&gt;In this approach, blob processing is triggered by events. Here, Azure Blob Storage acts as the event publisher, and Event Grid delivers blob lifecycle events to the Logic App endpoint, which then processes the blob.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Steps to Implement Event Grid Integration:&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Create Event Grid Subscription&lt;BR /&gt;Configure an Event Grid subscription on the Azure Storage account or specific blob container to listen for blob events&lt;/LI&gt;
&lt;LI&gt;Configure Logic App Endpoint&lt;BR /&gt;Configure the Logic App Standard workflow endpoint (HTTP or Event Grid trigger) as the event subscriber.&lt;BR /&gt;The endpoint must be publicly reachable, or an intermediate component must be used if private networking is required.&lt;/LI&gt;
&lt;LI&gt;Handle Subscription Handshake (Logic App responsibility)&lt;BR /&gt;For Single‑Tenant Logic Apps, implement explicit Event Grid subscription validation (handshake) to confirm that the Logic App endpoint accepts events from Event Grid.
&lt;UL&gt;
&lt;LI&gt;When an Event Grid subscription is created, Event Grid sends a SubscriptionValidationEvent to the subscriber endpoint.&lt;/LI&gt;
&lt;LI&gt;The Logic App must:
&lt;OL&gt;
&lt;LI&gt;Detect the Microsoft.EventGrid.SubscriptionValidationEvent&lt;/LI&gt;
&lt;LI&gt;Extract the validation Code from the request payload&lt;/LI&gt;
&lt;LI&gt;Return an HTTP 200 OK response
&lt;P&gt;For detailed implementation guidance and example, see:&amp;nbsp;&lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/using-single-tenant-logic-app-workflow-endpoint-as-event-grid-subscription/3055814" target="_blank"&gt;Using Single‑Tenant Logic App Workflow Endpoint as Event Grid Subscription&lt;/A&gt;&lt;/P&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Trigger Logic App via Events&lt;BR /&gt;Once the subscription is active, Event Grid automatically pushes blob events to the Logic App endpoint whenever a blob is created, updated.&lt;/LI&gt;
&lt;LI&gt;Process Blob Based on Event Data&lt;BR /&gt;Upon receiving the event payload, the Logic App:
&lt;OL&gt;
&lt;LI&gt;Parses event data (container name, blob name, blob URL, event type)&lt;/LI&gt;
&lt;LI&gt;Retrieves the blob using actions such as “Read blob content”&lt;/LI&gt;
&lt;LI&gt;Processes the blob according to business logic&lt;/LI&gt;
&lt;/OL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Benefits of Event Grid Integration&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Event-Driven Architecture: Provides real-time event handling, reducing latency compared to polling mechanisms.&lt;/LI&gt;
&lt;LI&gt;Scalability: Event Grid can handle many events efficiently.&lt;/LI&gt;
&lt;LI&gt;Flexibility: Supports various event sources and custom topics.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Note:&lt;/STRONG&gt; If you have Logic App enabled with Private Endpoint, refer to &lt;A href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Ftechcommunity.microsoft.com%2Fblog%2Fappsonazureblog%2Fhow-to-trigger-azure-function-from-event-grid-over-virtual-network%2F4049984&amp;amp;data=05%7C02%7CK.Swathi%40microsoft.com%7Ce1afe64eabad4635087d08dd795b4b2b%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C638800155234374815%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&amp;amp;sdata=JLyv3KVJ3HM1I%2FEhzfU1QpLslE%2FN3ssg5DSbVBft33o%3D&amp;amp;reserved=0" target="_blank" rel="noopener"&gt;how to trigger Azure Function from Event Grid over virtual network&lt;/A&gt; for alternative configurations&lt;/P&gt;</description>
      <pubDate>Mon, 23 Mar 2026 10:53:35 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/reliable-blob-processing-using-azure-logic-apps-recommended/ba-p/4408091</guid>
      <dc:creator>SwathiK</dc:creator>
      <dc:date>2026-03-23T10:53:35Z</dc:date>
    </item>
    <item>
      <title>Implementing / Migrating the BizTalk Server Aggregator Pattern to Azure Logic Apps Standard</title>
      <link>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/implementing-migrating-the-biztalk-server-aggregator-pattern-to/ba-p/4495107</link>
      <description>&lt;P&gt;While the article focuses on the migration path from BizTalk Server, the template is equally suited for &lt;STRONG&gt;new (greenfield) implementations &lt;/STRONG&gt;any team looking to implement the Aggregator pattern natively in Azure Logic Apps can deploy it directly from the Azure portal without prior BizTalk experience.&lt;/P&gt;
&lt;P&gt;The template source code is open source and available in the &lt;A href="https://github.com/Azure/LogicAppsTemplates/tree/main/aggregate-messages-servicebus-correlationid" target="_blank" rel="noopener"&gt;&lt;EM&gt;Azure LogicAppsTemplates GitHub repository&lt;/EM&gt;&lt;/A&gt;. For full details on the original BizTalk implementation, see the &lt;A href="https://learn.microsoft.com/en-us/biztalk/core/aggregator-biztalk-server-sample" target="_blank" rel="noopener"&gt;&lt;EM&gt;BizTalk Server Aggregator SDK sample&lt;/EM&gt;&lt;/A&gt;.&lt;/P&gt;
&lt;H2&gt;Why is it important?&lt;/H2&gt;
&lt;P&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/lifecycle/products/biztalk-server-2020" target="_blank" rel="noopener"&gt;BizTalk Server End of life&lt;/A&gt; has been confirmed and if you have not started your migration to Logic Apps, you should start soon. This is one of many articles in BizTalk Migration. More information can be found here: &lt;A href="https://aka.ms/biztalkeolblog" target="_blank" rel="noopener"&gt;&lt;EM&gt;https://aka.ms/biztalkeolblog&lt;/EM&gt;&lt;/A&gt;.&lt;/P&gt;
&lt;H2&gt;The migration at a glance: BizTalk orchestration vs. Logic Apps workflow&lt;/H2&gt;
&lt;P&gt;The BizTalk SDK implements the pattern through an orchestration (Aggregate.odx) that uses correlation sets, receive shapes, loop constructs, and send pipelines. The Logic Apps Standard template replicates the same logic using a stateful workflow with Azure Service Bus and CorrelationId-based grouping.&lt;/P&gt;
&lt;img&gt;&lt;EM&gt;Figure 1: BizTalk Server Aggregator Orchestration (Aggregate.odx) correlates messages by DestinationPartnerURI, loops to accumulate them, and sends the aggregated interchange.&lt;/EM&gt;&lt;/img&gt;
&lt;P&gt;The BizTalk solution includes:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Component&lt;/th&gt;&lt;th&gt;Purpose&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Aggregate.odx&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Main orchestration that collects correlated messages and executes the send pipeline&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;FFReceivePipeline.btp&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Receive pipeline with flat file disassembler&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;&lt;A href="vscode-file://vscode-app/c:/Users/reynaldom/AppData/Local/Programs/Microsoft%20VS%20Code/591199df40/resources/app/out/vs/code/electron-browser/workbench/workbench.html" target="_blank" rel="noopener" data-href="file:///c%3A/Code/Logic%20Apps/BTS%20LA%20Patterns/WS-BTS-LA-PATTERNS/LA-BTS-PATTERNS/Artifacts/Schemas/Invoice.xsd" data-keybinding-context="1850"&gt;Invoice.xsd&lt;/A&gt;&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Document schema for invoice messages&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;InvoiceEnvelope.xsd&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Envelope schema for output interchange&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;PropertySchema.xsd&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Property schema with promoted properties for correlation&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;XMLAggregatingPipeline.btp&lt;/STRONG&gt;&lt;/td&gt;&lt;td&gt;Send pipeline to assemble collected messages into XML interchange&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H2&gt;The Azure Logic Apps Standard implementation&lt;/H2&gt;
&lt;P&gt;The Logic Apps Standard workflow replicates the same Aggregator pattern using a&amp;nbsp;&lt;STRONG&gt;stateful workflow&lt;/STRONG&gt; with Azure Service Bus as the message source and CorrelationId-based grouping. The template is publicly available in the Azure portal templates gallery.&lt;/P&gt;
&lt;img&gt;
&lt;P&gt;&lt;EM&gt;Figure 2: The “Aggregate messages from Azure Service Bus by CorrelationId” template in the Azure portal templates gallery, published by Microsoft. Receives messages from Service Bus in batches, groups them by CorrelationId, decodes flat files, and responses with the aggregated result via HTTP.&lt;/EM&gt;&lt;/P&gt;
&lt;/img&gt;
&lt;H2&gt;Side-by-side comparison: BizTalk Server vs. Azure Logic Apps&lt;/H2&gt;
&lt;P&gt;Understanding how each component maps between platforms is essential for a smooth migration:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Concept&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;BizTalk Server (Aggregate.odx)&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Azure Logic Apps Standard&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Messaging infrastructure&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;MessageBox database (SQL Server)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Azure Service Bus (cloud-native PaaS)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Message source&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Receive Port / Receive Location&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Service Bus trigger (peekLockQueueMessagesV2)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Message decoding&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Receive Pipeline (Flat File Disassembler)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Decode_Flat_File_Invoice action (FlatFileDecoding)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Correlation mechanism&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Correlation Sets on promoted properties (DestinationPartnerURI)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;CorrelationId from Service Bus message properties&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Message accumulation&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Loop shape + Message Assignment shapes&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;ForEach loop + CorrelationGroups dictionary variable&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Completion condition&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Loop exit (10 messages or 1-minute timeout)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Batch-based: processes all messages in current batch&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Aggregated message construction&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Construct Message shape + XMLAggregatingPipeline&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Build_Aggregated_Messages ForEach + Compose actions&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Result delivery&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Send Port (file, HTTP, or other adapter)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;HTTP Response or any other regarding business need&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Error handling&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Exception Handler shapes + SuspendMessage.odx&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Scope + error handler actions&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Schema support&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;BizTalk Flat File Schemas (XSD)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Same XSD schemas in Artifacts/Schemas folder&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;State management&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Orchestration dehydration/rehydration&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Stateful workflow with run history&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H3&gt;Key architectural differences&lt;/H3&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Aspect&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;BizTalk Server&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Azure Logic Apps Standard&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Processing model&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Convoy pattern (long-running, event-driven)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Batch-based (processes N messages per trigger)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Scalability&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;BizTalk Host instances (manual scaling)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Elastic scale (Azure App Service Plan)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Retry logic&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Adapter-level retries&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Built-in HTTP retry policy (3 attempts, 10s interval)&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Architecture&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Monolithic orchestration&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Decoupled: aggregation + downstream processing&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Monitoring&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;BizTalk Admin Console / HAT&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Azure portal run history + Azure Monitor&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Schema reuse&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;BizTalk project schemas&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Direct XSD reuse in Artifacts/Schemas&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Deployment&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;MSI / BizTalk deployment&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;ARM templates, Azure DevOps, GitHub Actions&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P class="lia-clear-both"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2 class="lia-clear-both"&gt;How the workflow works&lt;EM&gt;&lt;BR /&gt;&lt;/EM&gt;&lt;/H2&gt;
&lt;P&gt;&lt;STRONG&gt;1. Trigger: Receive messages from Service Bus&lt;/STRONG&gt;&lt;BR /&gt;The workflow uses the &lt;STRONG&gt;&lt;A href="#community--1-_Azure_Service_Bus:" target="_blank" rel="noopener"&gt;&lt;EM&gt;built-in Service Bus trigger&lt;/EM&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;&lt;/A&gt;&lt;/STRONG&gt;to retrieve messages in batches &lt;STRONG&gt;&lt;EM&gt;from a non-session queue&lt;/EM&gt;&lt;/STRONG&gt;. This is analogous to BizTalk's Receive Location polling the message source.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;&lt;EM&gt;Figure 4: Detail of "When messages are available in a queue" for triggering the Logic App Workflow when messages are available in a queue.&lt;/EM&gt;&lt;/img&gt;
&lt;P&gt;&lt;STRONG&gt;2. Process and correlate: Group messages by CorrelationId&lt;BR /&gt;&lt;/STRONG&gt;Each message is processed sequentially (like BizTalk's ordered delivery). The workflow:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Extracts the CorrelationId&lt;/STRONG&gt; from Service Bus message properties (equivalent to BizTalk's promoted property used in the Correlation Set)&lt;EM&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/EM&gt;&lt;img&gt;&lt;EM&gt;Figure 5: Detail of "Get CorrelationId" using coalesce for avoiding issues if correlationId message property is null or empty.&lt;/EM&gt;&lt;/img&gt;&lt;EM&gt;&lt;BR /&gt;&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Decodes flat file content&lt;/STRONG&gt;&amp;nbsp;&lt;STRONG&gt;with zero refactoring&lt;/STRONG&gt; &lt;A href="#community--1-_Decode_Flat_File" target="_blank" rel="noopener"&gt;&lt;EM&gt;using the XSD schema (equivalent to BizTalk's Flat File Disassembler pipeline component)&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;img&gt;&lt;EM&gt;Figures 6 and 7: Detail of "Decode Flat File" action using the same Invoice.xsd schema from BizTalk Server SDK Sample. This action Decodes or encodes as needed.&lt;/EM&gt;&lt;/img&gt;&lt;img /&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Groups messages&lt;/STRONG&gt; into a dictionary keyed by CorrelationId (equivalent to BizTalk's loop + message assignment pattern)&lt;/LI&gt;
&lt;/UL&gt;
&lt;img&gt;&lt;EM&gt;Figure 8: Detail of "Update CorrelationGroups" action where the correalation from messages are grouped.&lt;/EM&gt;&lt;/img&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;EM&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;3. Build aggregated output&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Once all messages in the batch are processed, the workflow constructs a result object for each correlation group containing the &lt;EM&gt;CorrelationId&lt;/EM&gt;, &lt;EM&gt;message count&lt;/EM&gt; and the &lt;EM&gt;array &lt;/EM&gt;of decoded messages.&lt;/P&gt;
&lt;img&gt;&lt;EM&gt;Figure 9: Detail of the "Build Result Object" action which composes the resulted aggregated message.&lt;/EM&gt;&lt;/img&gt;
&lt;P&gt;&lt;STRONG&gt;4. Deliver results&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The aggregated output is sent to a&amp;nbsp;&lt;STRONG&gt;target workflow&lt;/STRONG&gt; via HTTP POST, following a decoupled architecture pattern. This is analogous to BizTalk's Send Port delivering the result to the destination system. You can substitute this action for another endpoint as needed. This, will depend on your business case.&lt;/P&gt;
&lt;img&gt;Figure 10: Details of the "Response" action and its body.&lt;/img&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;Azure Service Bus: The cloud-native replacement for BizTalk’s MessageBox&lt;/H2&gt;
&lt;P&gt;In BizTalk Server, the &lt;A href="https://learn.microsoft.com/en-us/biztalk/core/the-messagebox-database" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;&lt;EM&gt;MessageBox database&lt;/EM&gt;&lt;/STRONG&gt;&lt;/A&gt; is the central hub for all message routing, subscription-based delivery, and correlation. It’s the engine that enables patterns like the Aggregator — messages are published to the MessageBox, and the orchestration subscribes to them based on promoted properties and correlation sets.&lt;/P&gt;
&lt;P&gt;In Azure Logic Apps Standard, there is no MessaeBox equivalent. Instead, &lt;A href="https://learn.microsoft.com/en-us/azure/service-bus-messaging/service-bus-messaging-overview" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;&lt;EM&gt;Azure Service Bus&lt;/EM&gt;&lt;/STRONG&gt;&lt;/A&gt; serves as the cloud-native messaging backbone. Service Bus provides the same publish/subscribe semantics, message correlation (via the built-in CorrelationId property), peek-lock delivery, and reliable queuing — but as a fully managed, elastically scalable PaaS service with no infrastructure to maintain.&lt;/P&gt;
&lt;P&gt;This is a fundamental shift in architecture: you move from a &lt;STRONG&gt;centralized SQL Server-based message broker&lt;/STRONG&gt; (MessageBox) to a &lt;STRONG&gt;distributed, cloud-native messaging service&lt;/STRONG&gt; (Service Bus) that scales independently and integrates natively with Logic Apps through the built-in Service Bus connector.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;Important:&lt;/EM&gt;&lt;/STRONG&gt; Service Bus is not available on-premises. However, RabbitMQ is available to cover these needs, on-premises. RabbitMQ offers a fantastic alternative for customers looking to replicate BizTalk message routing, subscription-based delivery, and correlation.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;H2&gt;Decode Flat File Invoice: Reuse your BizTalk schemas with zero refactoring&lt;/H2&gt;
&lt;P&gt;One of the biggest concerns during any BizTalk migration is: &lt;EM&gt;“What happens to our flat file schemas and message formats?”&lt;BR /&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;The workflow template includes a &lt;STRONG&gt;Decode Flat File &lt;/STRONG&gt;action (type &lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/logic-apps-enterprise-integration-flatfile" target="_blank" rel="noopener"&gt;FlatFileDecoding&lt;/A&gt;) that converts positional or delimited flat file content into XML — exactly like BizTalk’s Flat File Disassembler pipeline component. The key advantage: &lt;STRONG&gt;your original BizTalk XSD flat file schemas work as-is&lt;/STRONG&gt;. Upload them to the Logic Apps Artifacts/Schemas folder and reference them by name in the workflow — no modifications, no refactoring.&lt;/P&gt;
&lt;P&gt;This means:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Your existing message formats don’t change&lt;/STRONG&gt; — upstream and downstream systems continue sending and receiving the same flat file messages&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Your BizTalk schemas are directly reusable&lt;/STRONG&gt; — the same Invoice.xsd from your BizTalk project works seamlessly with the &lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/logic-apps-enterprise-integration-flatfile" target="_blank" rel="noopener"&gt;FlatFileDecoding&lt;/A&gt; action&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;Migration effort is significantly reduced&lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt; — no need to redesign schemas, re-validate message structures, or update trading partner agreements&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;Time-to-production is faster&lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt; — focus on workflow logic and connectivity instead of rewriting message definitions&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Notice that, if you need to process XML data, as your data might arrive in XML format, use the XML Operations: Validate, Transform, Parse, and Compose XML with schema. You can find more information at &lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/logic-apps-enterprise-integration-xml-compose" target="_blank" rel="noopener"&gt;&lt;EM&gt;Compose XML using Schemas in Standard Workflows - Azure Logic Apps | Microsoft Learn&lt;/EM&gt;&lt;/A&gt;.&lt;/P&gt;
&lt;H2&gt;The message with correlation Id&lt;/H2&gt;
&lt;P&gt;Each message in the Service Bus queue is a &lt;STRONG&gt;flat file invoice &lt;/STRONG&gt;the same positional/delimited text format used in the BizTalk SDK sample. Here's an example:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;INVOICE12345&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;DestinationPartnerURI:http://www.contoso.com?ID=1E1B9646-48CF-41dd-A0C0-1014B1CE5064&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;BILLTO,US,John Connor,123 Cedar Street,Mill Valley,CA,90952&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;101-TT &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Plastic flowers &amp;nbsp; 10 &amp;nbsp; 4.99 &amp;nbsp; &amp;nbsp; &amp;nbsp;Fragile handle with care&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;202-RR &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Fertilizer &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1 &amp;nbsp; &amp;nbsp;10.99 &amp;nbsp; &amp;nbsp; Lawn fertilizer &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;453-XS &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Weed killer &amp;nbsp; &amp;nbsp; &amp;nbsp; 1 &amp;nbsp; &amp;nbsp;5.99 &amp;nbsp; &amp;nbsp; &amp;nbsp;Lawn weed killer&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The message structure combines positional and delimited fields:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Line 1&lt;/STRONG&gt;: Invoice identifier (fixed-length record)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Line 2&lt;/STRONG&gt;: Destination partner URI — in BizTalk, this value is promoted as a context property and used in the Correlation Set to group related messages&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Line 3&lt;/STRONG&gt;: Bill-to header (comma-delimited: country, name, address, city, state, ZIP)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Line 4:&lt;/STRONG&gt; Line items (positional fields: item code, description, quantity, unit price, notes)&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Why CorrelationId is essential&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;In BizTalk Server, the orchestration promotes `DestinationPartnerURI` from the message body into a context property and uses it as the &lt;STRONG&gt;Correlation Set&lt;/STRONG&gt; to match related messages. This requires a Property Schema, promoted properties, and pipeline configuration.&lt;/P&gt;
&lt;P&gt;In Azure Logic Apps Standard, correlation is &lt;STRONG&gt;&amp;nbsp;decoupled from the message body&lt;/STRONG&gt;. The `CorrelationId` is a &lt;STRONG&gt;native Azure Service Bus message property with &lt;/STRONG&gt;a first-class header set by the message producer when sending to the queue. This means:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;No schema changes needed: &lt;/STRONG&gt;the flat file content stays exactly the same&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;No property promotion:&lt;/STRONG&gt; Service Bus provides the correlation identifier out of the box&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Simpler architecture: &lt;/STRONG&gt;the workflow reads `CorrelationId` directly from the message metadata, not from the payload&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Producer flexibility &lt;/STRONG&gt;any system sending to Service Bus can set the `CorrelationId` header using standard SDK methods, without modifying the message body&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;This is why the Aggregator pattern maps so naturally to Service Bus: the correlation mechanism that BizTalk implements through promoted properties and correlation sets is already built into the messaging infrastructure.&lt;/P&gt;
&lt;H2&gt;Step-by-step guide: Deploy the template from the Azure portal&lt;/H2&gt;
&lt;P&gt;The &lt;STRONG&gt;“Aggregate messages from Azure Service Bus by CorrelationId”&lt;/STRONG&gt; template is publicly available in the Azure Logic Apps Standard templates gallery. Follow these steps to deploy it:&lt;/P&gt;
&lt;H3&gt;Prerequisites&lt;/H3&gt;
&lt;P&gt;Before you begin, make sure you have:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;An Azure subscription&lt;/STRONG&gt;. If you don’t have one,
&lt;DIV&gt;&lt;A href="https://azure.microsoft.com/pricing/purchase-options/azure-account" target="_blank" rel="noopener"&gt;&lt;EM&gt;sign up for a free Azure account&lt;/EM&gt;&lt;/A&gt;&lt;/DIV&gt;
.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;An Azure Logic Apps Standard resource&lt;/STRONG&gt; deployed in your subscription. If you need to create one, see
&lt;DIV&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/create-single-tenant-workflows-azure-portal" target="_blank" rel="noopener"&gt;&lt;EM&gt;Create an example Standard logic app workflow&lt;/EM&gt;&lt;/A&gt;&lt;/DIV&gt;
.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;An Azure Service Bus namespace&lt;/STRONG&gt; with a non-session queue configured.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;A flat file XSD schema&lt;/STRONG&gt; (for example, Invoice.xsd) ready to upload to the logic app’s Artifacts/Schemas folder.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;A target workflow&lt;/STRONG&gt; with an HTTP trigger to receive the aggregated results (optional, can be created after deployment).&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3&gt;Step 1: Open the templates gallery&lt;/H3&gt;
&lt;OL&gt;
&lt;LI&gt;Sign in to the
&lt;DIV&gt;&lt;A href="https://portal.azure.com" target="_blank" rel="noopener"&gt;&lt;EM&gt;Azure portal&lt;/EM&gt;&lt;/A&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;Navigate to your &lt;STRONG&gt;Standard logic app resource&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;On the logic app sidebar menu, select &lt;STRONG&gt;Workflows&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;On the logic app sidebar menu, select&amp;nbsp;&lt;STRONG style="color: rgb(30, 30, 30);"&gt;Workflows&lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt;.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;On the Workflows page, select &lt;STRONG style="color: rgb(30, 30, 30);"&gt;+ Create&lt;/STRONG&gt;&lt;SPAN style="color: rgb(30, 30, 30);"&gt; to create a new workflow.&lt;BR /&gt;&lt;/SPAN&gt;&lt;img /&gt;
&lt;OL&gt;
&lt;LI style="list-style-type: none;"&gt;
&lt;OL&gt;
&lt;LI&gt;In the “Create a new workflow” pane, select &lt;STRONG&gt;Use Template&lt;/STRONG&gt; to open the templates gallery and select &lt;STRONG&gt;Create&lt;/STRONG&gt; &lt;STRONG&gt;button&lt;/STRONG&gt;.&lt;BR /&gt;&lt;img /&gt;&lt;BR /&gt;
&lt;H3&gt;&amp;nbsp;&lt;/H3&gt;
&lt;H3&gt;Step 2: Find the Aggregator template&lt;/H3&gt;
&lt;OL&gt;
&lt;LI&gt;In the templates gallery, use the &lt;STRONG&gt;search box&lt;/STRONG&gt; and type &lt;STRONG&gt;“Aggregate”&lt;/STRONG&gt; or &lt;STRONG&gt;“Aggregator”&lt;/STRONG&gt;.&lt;BR /&gt;&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Optionally, filter by:
&lt;P&gt;o&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;Connectors&lt;/STRONG&gt;: Select Azure Service Bus&lt;/P&gt;
&lt;P&gt;o&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;Categories&lt;/STRONG&gt;: All&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Locate the template named &lt;STRONG&gt;“Aggregate messages from Azure Service Bus by CorrelationId”&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;o&amp;nbsp;&amp;nbsp; The template card shows the labels &lt;STRONG&gt;Workflow&lt;/STRONG&gt; and &lt;STRONG&gt;Event&lt;/STRONG&gt; as the solution type and trigger type.&lt;/P&gt;
o&amp;nbsp; &amp;nbsp;The template is published by &lt;STRONG&gt;Microsoft&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;/OL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3&gt;Step 3: Review the template details&lt;/H3&gt;
&lt;OL&gt;
&lt;LI&gt;Select the template card to open the &lt;STRONG&gt;template overview pane&lt;/STRONG&gt;.&lt;BR /&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;LI&gt;On the &lt;STRONG&gt;Summary&lt;/STRONG&gt; tab, review:&lt;BR /&gt;
&lt;P&gt;o&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;Connections included in this template&lt;/STRONG&gt;: Azure Service Bus (in-app connector)&lt;/P&gt;
&lt;P&gt;o&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;Prerequisites&lt;/STRONG&gt;: Requirements for Azure Service Bus, flat file schema, and connection configuration&lt;/P&gt;
&lt;P&gt;o&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;Details&lt;/STRONG&gt;: Description of the Aggregator enterprise integration pattern implementation&lt;/P&gt;
&lt;STRONG&gt;Source code&lt;/STRONG&gt;: Link to the &lt;A href="https://github.com/Azure/LogicAppsTemplates/tree/main/aggregate-messages-servicebus-correlationid/default/manifest.json" target="_blank" rel="noopener"&gt;&lt;EM&gt;GitHub repository&lt;/EM&gt;&lt;/A&gt;&lt;BR /&gt;&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;Select the &lt;STRONG&gt;Workflow&lt;/STRONG&gt; tab to preview the workflow design that the template creates and when you are ready select &lt;STRONG&gt;Use this template.&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;img /&gt;
&lt;H3&gt;Step 4: Provide workflow information&lt;/H3&gt;
&lt;OL&gt;
&lt;LI&gt;In the &lt;STRONG&gt;Create a new workflow from template&lt;/STRONG&gt; pane, on the &lt;STRONG&gt;Basics&lt;/STRONG&gt; tab:&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;o&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;Workflow name&lt;/STRONG&gt;: Enter a name for your workflow, for example, wf-aggregator-invoices&lt;/P&gt;
&lt;P&gt;o&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;State type&lt;/STRONG&gt;: Select &lt;STRONG&gt;Stateful&lt;/STRONG&gt; (recommended for aggregation scenarios that require run history and reliable processing)&lt;/P&gt;
&lt;OL start="2"&gt;
&lt;LI&gt;Select &lt;STRONG&gt;Next&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3&gt;Step 5: Create connections&lt;/H3&gt;
&lt;OL&gt;
&lt;LI&gt;On the &lt;STRONG&gt;Connections&lt;/STRONG&gt; tab, create the &lt;STRONG&gt;Azure Service Bus&lt;/STRONG&gt; connection:&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;o&amp;nbsp;&amp;nbsp; Select &lt;STRONG&gt;Connect&lt;/STRONG&gt; next to the Service Bus connection.&lt;/P&gt;
&lt;P&gt;o&amp;nbsp;&amp;nbsp; Provide your Service Bus connection string or select the managed identity authentication option.&lt;/P&gt;
&lt;P&gt;For managed identity (recommended), make sure your logic app’s managed identity has the &lt;STRONG&gt;Azure Service Bus Data Receiver&lt;/STRONG&gt; role on the Service Bus namespace.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;2. Select&amp;nbsp;&lt;STRONG&gt;Next&lt;/STRONG&gt;.&lt;/P&gt;
&lt;H3&gt;Step 6: Configure parameters&lt;/H3&gt;
&lt;OL&gt;
&lt;LI&gt;On the &lt;STRONG&gt;Parameters&lt;/STRONG&gt; tab, provide values for the workflow parameters:&lt;/LI&gt;
&lt;/OL&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;Parameter&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Description&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Example value&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Azure Service Bus queue name&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;The queue to monitor for incoming messages&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;invoice-queue&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Maximum batch size&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Number of messages per batch (1-100)&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;10&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Flat file schema name&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;XSD schema name in Artifacts/Schemas&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Invoice.xsd&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Default CorrelationId&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Fallback value for messages without CorrelationId&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;NO_CORRELATION_ID&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Target workflow URL&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;HTTP endpoint of the downstream workflow&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;https://your-logicapp.azurewebsites.net/...&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Target workflow timeout&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;HTTP call timeout in seconds&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;60&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Enable sequential processing&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;Maintain message order&lt;/P&gt;
&lt;/td&gt;&lt;td&gt;
&lt;P&gt;true&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;img /&gt;
&lt;P&gt;2. Select&amp;nbsp;&lt;STRONG&gt;Next&lt;/STRONG&gt;.&lt;/P&gt;
&lt;H3&gt;Step 7: Review and create&lt;/H3&gt;
&lt;OL&gt;
&lt;LI&gt;On the &lt;STRONG&gt;Review + create&lt;/STRONG&gt; tab, review all the provided information.&lt;/LI&gt;
&lt;LI&gt;Select &lt;STRONG&gt;Create&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;When the deployment completes, select &lt;STRONG&gt;Go to my workflow&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3&gt;Step 8: Upload the flat file schema&lt;/H3&gt;
&lt;OL&gt;
&lt;LI&gt;Navigate to your logic app resource in the Azure portal.&lt;/LI&gt;
&lt;LI&gt;On the sidebar menu, under &lt;STRONG&gt;Artifacts&lt;/STRONG&gt;, select &lt;STRONG&gt;Schemas&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI&gt;Select &lt;STRONG&gt;+ Add&lt;/STRONG&gt; and upload your Invoice.xsd.&lt;/LI&gt;
&lt;LI&gt;Confirm the schema appears in the list.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;EM&gt;Notice that: for this scenario we are using the Invoice.xsd schema, you can/must use the schema your scenario needs.&lt;/EM&gt;&lt;/P&gt;
&lt;H3&gt;Step 9: Verify and test&lt;/H3&gt;
&lt;OL&gt;
&lt;LI&gt;On the workflow sidebar, select &lt;STRONG&gt;Designer&lt;/STRONG&gt; to review the created workflow.&lt;/LI&gt;
&lt;LI&gt;Verify all actions are configured correctly.&lt;/LI&gt;
&lt;LI&gt;Send test messages to your Service Bus queue with different CorrelationId values.&lt;/LI&gt;
&lt;LI&gt;Monitor the &lt;STRONG&gt;Run history&lt;/STRONG&gt; to verify successful execution and aggregation.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;For more information on creating workflows from templates, see &lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/create-workflows-from-templates" target="_blank" rel="noopener"&gt;&lt;EM&gt;Create workflows from prebuilt templates in Azure Logic Apps&lt;/EM&gt;&lt;/A&gt;.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;H2&gt;Conclusion&lt;/H2&gt;
&lt;P&gt;The Aggregator pattern is a cornerstone of enterprise integration, and migrating it from BizTalk Server to Azure Logic Apps Standard doesn’t mean starting from scratch. By using this template, you can:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Reuse your existing XSD flat file schemas&lt;/STRONG&gt; directly from your BizTalk projects&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Replace BizTalk Correlation Sets&lt;/STRONG&gt; with CorrelationId-based message grouping via Azure Service Bus&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Deploy in minutes&lt;/STRONG&gt; from the Azure portal templates gallery&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Scale elastically&lt;/STRONG&gt; with Azure App Service Plan&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Monitor with Azure-native tools&lt;/STRONG&gt; instead of the BizTalk Admin Console&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The template is open source and available at:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;GitHub PR&lt;/STRONG&gt;: &lt;A href="https://github.com/Azure/LogicAppsTemplates/pull/108" target="_blank" rel="noopener"&gt;&lt;EM&gt;Azure/LogicAppsTemplates#108&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Template name in Azure portal&lt;/STRONG&gt;: “Aggregate messages from Azure Service Bus by CorrelationId”&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Source code&lt;/STRONG&gt;: &lt;A href="https://github.com/Azure/LogicAppsTemplates/tree/main/aggregate-messages-servicebus-correlationid" target="_blank" rel="noopener"&gt;&lt;EM&gt;GitHub repository&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Whether you’re migrating from BizTalk Server or building a new integration solution from scratch, this template gives you a solid, production-ready starting point. I encourage you to try it, customize it for your scenarios, and contribute back to the community.&lt;/P&gt;
&lt;H2&gt;Resources&lt;/H2&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/biztalk/core/aggregator-biztalk-server-sample" target="_blank" rel="noopener"&gt;&lt;EM&gt;BizTalk Server Aggregator SDK sample&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/create-workflows-from-templates" target="_blank" rel="noopener"&gt;&lt;EM&gt;Create workflows from prebuilt templates in Azure Logic Apps&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/create-publish-workflow-templates" target="_blank" rel="noopener"&gt;&lt;EM&gt;Create and publish workflow templates for Azure Logic Apps&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/logic-apps-enterprise-integration-flatfile" target="_blank" rel="noopener"&gt;&lt;EM&gt;Flat file encoding and decoding in Logic Apps&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/connectors/servicebus/" target="_blank" rel="noopener"&gt;&lt;EM&gt;Azure Service Bus connector overview&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/azure/logic-apps/logic-apps-move-from-mabs" target="_blank" rel="noopener"&gt;&lt;EM&gt;BizTalk to Azure migration guide&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://github.com/haroldcampos/BizTalkMigrationStarter" target="_blank" rel="noopener"&gt;&lt;EM&gt;BizTalk Migration Starter tool&lt;/EM&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 03 Mar 2026 16:08:08 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/implementing-migrating-the-biztalk-server-aggregator-pattern-to/ba-p/4495107</guid>
      <dc:creator>reynaldom</dc:creator>
      <dc:date>2026-03-03T16:08:08Z</dc:date>
    </item>
    <item>
      <title>Logic Apps Aviators Newsletter - March 2026</title>
      <link>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/logic-apps-aviators-newsletter-march-2026/ba-p/4498260</link>
      <description>&lt;P&gt;&lt;STRONG&gt;In this issue:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="#community--1-aceaviator" target="_blank" rel="noopener"&gt;Ace Aviator of the Month&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="#community--1-productnews" target="_blank" rel="noopener"&gt;News from our product group&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="#community--1-communitynews" target="_blank" rel="noopener"&gt;News from our community&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;HR /&gt;
&lt;H1 id="aceaviator"&gt;Ace Aviator of the Month&lt;/H1&gt;
&lt;P&gt;&lt;STRONG&gt;March 2026's Ace Aviator: &lt;A href="https://www.linkedin.com/in/lilansameera/" target="_blank" rel="noopener nofollow noreferrer"&gt;Lilan Sameera&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;img&gt;Lilan Sameera - Senior Consulltant @ Adaptiv&lt;/img&gt;
&lt;H5&gt;What's your role and title? What are your responsibilities?&lt;/H5&gt;
&lt;P&gt;I’m a Senior Consultant at Adaptiv, where I design, build, and support integration solutions across cloud and enterprise systems, translating business requirements into reliable, scalable, and maintainable solutions. I work with Azure Logic Apps, Azure Functions, Azure Service Bus, Azure API Management, Azure Storage, Azure Key Vault, and Azure SQL.&lt;/P&gt;
&lt;H5&gt;Can you give us some insights into your day-to-day activities?&lt;/H5&gt;
&lt;P&gt;Most of my work focuses on designing and delivering reliable, maintainable integration solutions. I spend my time shaping workflows in Logic Apps, deciding how systems should connect, handling errors, and making sure solutions are safe and effective.&lt;BR /&gt;On a typical day, I might be:&lt;BR /&gt;- Designing or reviewing integration workflows and message flows&lt;BR /&gt;- Investigating tricky issues&lt;BR /&gt;- Working with teams to simplify complex processes&lt;BR /&gt;- Making decisions about patterns, performance, and long-term maintainability&lt;BR /&gt;A big part of what I do is thinking ahead, anticipating where things could go wrong, and building solutions that are easy to support and extend. The culture at Adaptiv encourages this approach and makes knowledge sharing across teams easy.&lt;/P&gt;
&lt;H5&gt;What motivates and inspires you to be an active member of the Aviators/Microsoft community?&lt;/H5&gt;
&lt;P&gt;The Microsoft and Logic Apps communities are incredibly generous with knowledge. I’ve learned so much from blogs, GitHub repos, and forum posts. Being part of the Aviators community is my way of giving back, sharing real-world experiences, lessons learned, and practical solutions. Adaptiv encourages people to engage with the community, which makes it easier to contribute and stay involved.&lt;/P&gt;
&lt;H5&gt;Looking back, what advice do you wish you had been given earlier?&lt;/H5&gt;
&lt;P&gt;Don’t wait until you feel like you “know everything” to start building or sharing. You learn the most by doing, breaking things, fixing them, and asking questions.&lt;BR /&gt;Focus on understanding concepts, not simply tools. Technologies change, fundamentals don’t. Communication matters as well. Being able to explain why something works is just as important as making it work.&lt;/P&gt;
&lt;H5&gt;What has helped you grow professionally?&lt;/H5&gt;
&lt;P&gt;Working on real-world, high-impact projects has been key. Being exposed to different systems, integration patterns, and production challenges has taught me more than any textbook. Supportive teammates, constructive feedback, and a culture that encourages learning and ownership have also been key in my growth.&lt;/P&gt;
&lt;H5&gt;If you had a magic wand that could create a feature in Logic Apps, what would it be?&lt;/H5&gt;
&lt;P&gt;I would love a first-class, visual way to version and diff Logic Apps workflows, like how code changes are tracked in Git. It would make reviews, troubleshooting, and collaboration much easier, notably in complex enterprise integrations, and help teams work more confidently.&lt;/P&gt;
&lt;HR /&gt;
&lt;H1 id="productnews"&gt;News from our product group&lt;/H1&gt;
&lt;H5&gt;&lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/new-azure-api-management-service-limits/4497574" target="_blank" rel="noopener noreferrer"&gt;New Azure API management service limits&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Azure API Management announced updated service limits across classic and v2 tiers to ensure predictable performance on shared infrastructure. The post details new limits for key resources such as API operations, tags, products, subscriptions, and users, along with a rollout schedule: Consumption/Developer/Basic (including v2) from March 15, Standard/Standard v2 from April 15, and Premium/Premium v2 from May 15, 2026. Existing classic services are grandfathered at 10% above observed usage at the time limits take effect. Guidance is provided on managing within limits, evaluating impact, and requesting increases (priority for Standard/Standard v2 and Premium/Premium v2).&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/how-to-access-a-shared-onedrive-folder-in-azure-logic-apps/4484962" target="_blank" rel="noopener noreferrer"&gt;How to Access a Shared OneDrive Folder in Azure Logic Apps&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Logic Apps can work with files in a OneDrive folder shared by a colleague, but the OneDrive for Business “List files in folder” action doesn’t show shared folders because it enumerates only the signed‑in user’s drive. The article explains two supported approaches: (1) call Microsoft Graph using HTTP with Microsoft Entra ID (delegated permissions), or (2) use Graph Explorer to discover the shared folder’s driveId and folderId, then manually configure the action with {driveId}:{folderId}. A troubleshooting section shows how to extract these identifiers from browser network traces when Graph Explorer results are incomplete.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/stop-writing-plumbing-use-the-new-logic-apps-mcp-server-wizard/4496702" target="_blank" rel="noopener noreferrer"&gt;Stop Writing Plumbing! Use the New Logic Apps MCP Server Wizard&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;A new configuration experience in Logic Apps Standard (Preview) turns an existing logic app into an MCP server with a guided, in‑portal workflow. The wizard centralizes setup for authentication, API keys, server creation, and tool exposure, letting teams convert connectors and workflows into discoverable MCP tools that agents can call. You can generate tools from new connectors or register existing HTTP‑based workflows, choose API key or OAuth (EasyAuth) authentication, and test from agent platforms such as VS Code, Copilot Studio, and Foundry. The post also notes prerequisites and a known OAuth issue mitigated by reapplying EasyAuth settings.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/logic-apps-agentic-workflows-with-sap---part-2-ai-agents/4492362" target="_blank" rel="noopener noreferrer"&gt;Logic Apps Agentic Workflows with SAP - Part 2: AI Agents&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Part 2 focuses on the AI portion of an SAP–Logic Apps integration. A Logic Apps validation agent retrieves business rules from SharePoint and produces structured outputs—an HTML summary, a CSV of invalid order IDs, and an “invalid rows” CSV—that directly drive downstream actions: email notifications, optional persistence of failed rows as custom IDocs, and filtering before a separate analysis step returns results to SAP. The post explains the agent loop design, tool boundaries (“Get validation rules,” “Get CSV payload,” “Summarize review”), and a two‑model pattern (validation vs. analysis) to keep AI outputs deterministic and workflow‑friendly.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/logic-apps-agentic-workflows-with-sap---part-1-infrastructure/4491906" target="_blank" rel="noopener noreferrer"&gt;Logic Apps Agentic Workflows with SAP - Part 1: Infrastructure&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Part 1 establishes the infrastructure and contracts for a Logic Apps + SAP pattern that keeps integrations deterministic. A source workflow sends CSV data to SAP, while destination workflows handle validation and downstream processing. The post covers SAP connectivity (RFC/IDoc), the SAP‑side wrapper function, and the core contract elements—IT_CSV for input lines, ANALYSIS for results, EXCEPTIONMSG for human‑readable status, and RETURN (BAPIRET2) for structured success/error. It also details data shaping, error propagation, and email notification paths, with code snippets and diagrams to clarify gateway settings, namespace‑robust XPath extraction, and end‑to‑end flow control.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/azure-api-management---unified-ai-gateway-design-pattern/4495436" target="_blank" rel="noopener noreferrer"&gt;Azure API Management - Unified AI Gateway Design Pattern&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;This customer‑implemented pattern from Uniper uses Azure API Management as a unified AI gateway to normalize requests, enforce authentication and governance, and dynamically route traffic across multiple AI providers and models. Key elements include a single wildcard API, unified auth (API keys/JWT plus managed identity to backends), policy‑based path construction and model‑aware routing, circuit breakers with regional load balancing, token limits and metrics, and centralized logging. Reported outcomes include an 85% reduction in API definitions, faster feature availability, and 99.99% service availability. A GitHub sample shows how to implement the policy‑driven pipeline with modular policy fragments.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/a-biztalk-migration-tool-from-orchestrations-to-logic-apps-workflows/4494876" target="_blank" rel="noopener noreferrer"&gt;A BizTalk Migration Tool: From Orchestrations to Logic Apps Workflows&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;The BizTalk Migration Starter is an open‑source toolkit for modernizing BizTalk Server solutions to Azure Logic Apps. It includes tools to convert BizTalk maps (.btm) to Logic Apps Mapping Language (.lml), transform orchestrations (.odx) into Logic Apps workflow JSON, map pipelines to Logic Apps processing patterns, and expose migration tools via an MCP server for AI‑assisted workflows. The post outlines capabilities, core components, and command‑line usage, plus caveats (e.g., scripting functoids may require redesign). A demo video and GitHub repo links are provided for getting started, testing, and extending connector mappings and migration reports.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/azure-arc-jumpstart-template-for-hybrid-logic-apps-deployment/4493996" target="_blank" rel="noopener noreferrer"&gt;Azure Arc Jumpstart Template for Hybrid Logic Apps Deployment&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;A new Azure Arc Jumpstart “drop” provisions a complete hybrid environment for Logic Apps Standard on an Arc‑enabled AKS cluster with a single command. The deployment script sets up AKS, Arc for Kubernetes, the ACA extension, a custom location and Connected Environment, Azure SQL for runtime storage, an Azure Storage account for SMB artifacts, and a hybrid Logic Apps resource. After deployment, test commands verify each stage. The post links to prerequisites, quick‑start steps, a demo video, and references on hybrid deployment requirements. It invites community feedback and contributions via the associated GitHub repository.&lt;/P&gt;
&lt;HR /&gt;
&lt;H1 id="communitynews"&gt;News from our community&lt;/H1&gt;
&lt;H5&gt;&lt;A href="https://www.youtube.com/watch?v=iPu4XbXhSKo" target="_blank" rel="noopener noreferrer"&gt;Pro-Code Enterprise AI-Agents using MCP for Low-Code Integration&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Video by &lt;A href="https://de.linkedin.com/in/sebastianmeyerit" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Sebastian Meyer&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This video demonstrates how Model Context Protocol (MCP) can bridge pro-code and low-code integration by combining Microsoft Agent Framework with Azure Logic Apps. It shows how an autonomous AI agent can be wired into enterprise workflows, using MCP as the glue to connect to systems and trigger actions through Logic Apps. Viewers see how this approach reduces friction between traditional development and low-code automation while enabling consistent orchestration across services. The result is a practical pattern for extending enterprise automation with agent capabilities, improving flexibility without sacrificing control.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://www.linkedin.com/pulse/logic-apps-autonomous-agent-loops-practical-solution-%C5%9Fahin-%C3%B6zdemir-nwzge?trk=public_post_feed-article-content" target="_blank" rel="noopener noreferrer"&gt;Logic Apps: Autonomous agent loops - a practical solution for application registration secrets expiration (part 1)&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://nl.linkedin.com/in/%C5%9Fahin-%C3%B6zdemir-2058666" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Şahin Özdemir&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Şahin Özdemir describes how a single expired client secret disrupted an integration platform and how Logic Apps autonomous agent loops can prevent recurrence. The solution uses an AI-backed agent loop to call Microsoft Graph, list app registrations, detect secrets expiring within three weeks, and notify stakeholders via email using the Office 365 connector. Prerequisites include a Logic App with a managed identity and an AI model (e.g., via Microsoft Foundry). Clear agent instructions and tool context are emphasized to ensure consistent behavior. The result is a low-effort operational guardrail that replaces complex control-flow logic.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://youtu.be/l1JoQv5Kj2Y" target="_blank" rel="noopener noreferrer"&gt;From Low-Code to Full Power: When Power Platform Needs Azure with Sofia Platas&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Video by &lt;A class="lia-external-url" href="https://www.linkedin.com/in/ahmed-gb/" target="_blank" rel="noopener"&gt;Ahmed Bayoumy&lt;/A&gt; &amp;amp; &lt;A href="https://se.linkedin.com/in/robin-wilde-408bb497" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Robin Wilde&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Robin Wilde hosts Sofia Platas to explore when Power Platform solutions should extend into Azure. The conversation focuses on adopting an engineering mindset beyond low-code constraints—recognizing when workloads need Azure capabilities for scale, integration, or specialized services. It highlights moving from CRM and Power Platform into Azure and AI, and how pushing boundaries accelerates growth. The episode emphasizes practical decision-making over rigid labels, encouraging builders to reach for Azure when required while retaining the speed of low-code. It’s an insightful discussion about balancing agility with the robustness of cloud-native architecture.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://dev.to/imdj/cut-logic-apps-standard-costs-by-70-in-dev-poc-azure-environments-22on" target="_blank" rel="noopener noreferrer"&gt;Cut Logic Apps Standard Costs by 70% in Dev &amp;amp; POC Azure Environments&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://be.linkedin.com/in/danielj45" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Daniel Jonathan&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This article explains a practical cost-saving pattern for Logic Apps Standard in non‑production environments. Because Standard runs on an App Service Plan billed continuously, the author recommends deploying compute only during working hours and tearing it down afterward while retaining the Storage Account. Run history persists in storage, so redeployments reconnect seamlessly. Scripts automate deploy/teardown, with guidance on caveats: avoid removing compute during active runs, recurrence triggers won’t “catch up,” and production should stay always‑on. The post compares Standard versus Consumption and shows how this approach typically yields around 70% savings.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://blog.sandro-pereira.com/2026/02/13/friday-fact-you-can-reference-app-settings-inside-your-logic-apps-workflows/" target="_blank" rel="noopener noreferrer"&gt;Friday Fact: You can reference App Settings inside your Logic Apps Workflows&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://pt.linkedin.com/in/sandropereira" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Sandro Pereira&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Sandro Pereira highlights a simple technique to externalize configuration in Logic Apps Standard by using the appsetting('Key') expression directly in workflow actions. The approach allows storing connection details, flags, and endpoints in App Settings or local.settings.json rather than hardcoding values, improving maintainability and environment portability. He notes the expression may not appear in the editor’s suggestion list but still works when added manually. The post includes a concise “one‑minute brief” and reminders to ensure the keys exist in the chosen configuration source, plus a short video for those who prefer a quick walkthrough.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://github.com/sujithre/LogicAppWorkbook" target="_blank" rel="noopener noreferrer"&gt;LogicAppWorkbook: Azure Monitor Workbook for Logic Apps Standard (App Insights v1)&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://in.linkedin.com/in/sujith-reddy-komma-051553ba" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;sujith reddy komma&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This open-source Azure Monitor workbook provides a focused dashboard for Logic Apps Standard using Application Insights v1 telemetry. It organizes monitoring into Overview and Failures tabs, surfacing KPIs, status distribution, execution trends, and detailed failure grids. The repository includes KQL queries (Queries.md), screenshots, and clear import steps for Azure Workbooks. Notably, it targets the v1 telemetry schema (traces table, FlowRunLastJob) and isn’t compatible with newer v2 telemetry without query adjustments. It’s a useful starting point for teams wanting quick visibility into run health and trends without building dashboards from scratch.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://www.linkedin.com/pulse/azure-logic-apps-choosing-between-consumption-orestis-meikopoulos?trk=public_post_feed-article-content" target="_blank" rel="noopener noreferrer"&gt;Azure Logic Apps - Choosing Between Consumption and Standard Models&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://au.linkedin.com/in/manishrules" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Manish K.&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This post shares a primer that compares Logic Apps Consumption and Standard models to help teams choose the right hosting approach. It outlines Standard’s single‑tenant isolation, VNET integration, and better fit for long‑running or high‑throughput workloads, versus Consumption’s multi‑tenant, pay‑per‑action model ideal for short, variable workloads. It highlights migration considerations, limitations, and when each model is cost‑effective. The takeaway: align architecture, networking, and workload patterns to the model’s strengths to avoid surprises in performance, security, and pricing as solutions scale.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://integration.team/insights/logic-apps-standard-monitoring-dashboard-fix-runs-tab/" target="_blank" rel="noopener noreferrer"&gt;Logic Apps standard monitoring dashboard – Fix ‘Runs’ tab&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://be.linkedin.com/company/integration.team" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Integration.team&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Integration.team describes a fix for Logic Apps Standard where the Application Insights “Runs” tab shows a misconfiguration error and no history. The solution has two parts: ensure host.json sets ApplicationInsights telemetry to v2, and add a hidden tag on the Logic App that links it to the App Insights resource. They provide Bicep snippets for automated deployments and a portal-based alternative during initial creation. After applying both steps, run history populates correctly, restoring visibility in the monitoring dashboard and making troubleshooting more reliable.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://www.stephenwthomas.com/using-mcp-servers-with-azure-logic-app-agent-loops/" target="_blank" rel="noopener noreferrer"&gt;Using MCP Servers with Azure Logic App Agent Loops&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://www.linkedin.com/in/stephen-w-thomas" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Stephen W Thomas&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Stephen W Thomas explains how exposing Logic Apps as MCP servers simplifies agent loop designs. By moving inline tool logic out of the agent and into MCP-exposed endpoints, tools become reusable, easier to debug, and scoped to only what an agent needs. He discusses limiting accessible tools to control cost and execution time, and outlines a structure for organizing Logic Apps as discrete capabilities. The approach reduces agent complexity while improving maintainability and governance for AI-enabled workflows on Azure.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://blog.sandro-pereira.com/2026/02/03/logic-app-best-practices-tips-and-tricks-49-the-hidden-32-character-naming-trap-in-logic-apps-standard/" target="_blank" rel="noopener noreferrer"&gt;Logic App Best Practices, Tips, and Tricks: #49 The Hidden 32-Character Naming Trap in Logic Apps Standard&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://pt.linkedin.com/in/sandropereira" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Sandro Pereira&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Sandro Pereira explains a subtle but impactful pitfall in Logic Apps Standard tied to the Azure Functions runtime: the host ID is derived from only the first 32 characters of the Logic App name. When multiple Logic App Standard instances share a storage account and have identical leading characters, collisions can cause intermittent deployment and runtime failures. He recommends ensuring uniqueness within the first 32 characters or, in advanced cases, explicitly setting the host ID via AzureFunctionsWebHost__hostid. The article includes naming patterns and practical guidance to avoid hours of troubleshooting.&lt;/P&gt;</description>
      <pubDate>Mon, 02 Mar 2026 16:00:00 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/logic-apps-aviators-newsletter-march-2026/ba-p/4498260</guid>
      <dc:creator>WSilveira</dc:creator>
      <dc:date>2026-03-02T16:00:00Z</dc:date>
    </item>
    <item>
      <title>New Azure API management service limits</title>
      <link>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/new-azure-api-management-service-limits/ba-p/4497574</link>
      <description>&lt;P&gt;Azure API Management operates on finite physical infrastructure. To ensure reliable performance for all customers, the service enforces limits calibrated based on:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Azure platform capacity and performance characteristics&lt;/LI&gt;
&lt;LI&gt;Service tier capabilities&lt;/LI&gt;
&lt;LI&gt;Typical customer usage patterns&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Resource limits are interrelated and tuned to prevent any single aspect from disrupting overall service performance.&lt;/P&gt;
&lt;H2&gt;Changes to service limits - 2026 update&lt;/H2&gt;
&lt;P&gt;Starting March 2026 and over the following several months, Azure API Management is introducing updated resource limits for instances across all tiers. The limits are shown in the following table.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 89.3519%; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Entity/Resource&lt;/th&gt;&lt;th&gt;Consumption&lt;/th&gt;&lt;th&gt;Developer&lt;/th&gt;&lt;th&gt;Basic/&lt;BR /&gt;Basic v2&lt;/th&gt;&lt;th&gt;Standard/&lt;BR /&gt;Standard v2&lt;/th&gt;&lt;th&gt;Premium/&lt;BR /&gt;Premium v2&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;API operations&lt;/td&gt;&lt;td&gt;3,000&lt;/td&gt;&lt;td&gt;3,000&lt;/td&gt;&lt;td&gt;10,000&lt;/td&gt;&lt;td&gt;50,000&lt;/td&gt;&lt;td&gt;75,000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;API tags&lt;/td&gt;&lt;td&gt;1,500&lt;/td&gt;&lt;td&gt;1,500&lt;/td&gt;&lt;td&gt;1,500&lt;/td&gt;&lt;td&gt;2,500&lt;/td&gt;&lt;td&gt;15,000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Named values&lt;/td&gt;&lt;td&gt;5,000&lt;/td&gt;&lt;td&gt;5,000&lt;/td&gt;&lt;td&gt;5,000&lt;/td&gt;&lt;td&gt;10,000&lt;/td&gt;&lt;td&gt;18,000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Loggers&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;td&gt;200&lt;/td&gt;&lt;td&gt;400&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Products&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;td&gt;100&lt;/td&gt;&lt;td&gt;200&lt;/td&gt;&lt;td&gt;500&lt;/td&gt;&lt;td&gt;2,000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Subscriptions&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;10,000&lt;/td&gt;&lt;td&gt;15,000&lt;/td&gt;&lt;td&gt;25,000&lt;/td&gt;&lt;td&gt;75,000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Users&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;20,000&lt;/td&gt;&lt;td&gt;20,000&lt;/td&gt;&lt;td&gt;50,000&lt;/td&gt;&lt;td&gt;75,000&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Workspaces per workspace gateway&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;30&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Self-hosted gateways&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;N/A&lt;/td&gt;&lt;td&gt;100&lt;SUP&gt;1&lt;/SUP&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 16.67%" /&gt;&lt;col style="width: 16.67%" /&gt;&lt;col style="width: 16.67%" /&gt;&lt;col style="width: 16.67%" /&gt;&lt;col style="width: 16.67%" /&gt;&lt;col style="width: 16.67%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;SUP&gt;1&lt;/SUP&gt; Applies to Premium tier only.&lt;/P&gt;
&lt;H3&gt;What's changing&lt;/H3&gt;
&lt;UL&gt;
&lt;LI&gt;Limits in the classic tiers now align with those set in the v2 tiers.&lt;/LI&gt;
&lt;LI&gt;Limits are enforced for a smaller set of resource types that are directly related to service capacity and performance, such as API operations, tags, products, and subscriptions.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Rollout process&lt;/H3&gt;
&lt;P&gt;New limits roll out in a phased approach by tier as follows:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table border="1" style="width: 46.6667%; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Tier&lt;/th&gt;&lt;th&gt;Expected rollout date&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;Consumption&lt;BR /&gt;Developer&lt;BR /&gt;Basic&lt;BR /&gt;Basic v2&lt;/td&gt;&lt;td&gt;March 15, 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Standard&lt;BR /&gt;Standard v2&lt;/td&gt;&lt;td&gt;April 15, 2026&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Premium&lt;BR /&gt;Premium v2&lt;/td&gt;&lt;td&gt;May 15, 2026&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H3&gt;Limits policy for existing classic tier customers&lt;/H3&gt;
&lt;P&gt;After the new limits take effect, you can continue using your preexisting API Management resources without interruption.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Existing classic tier services, where current usage exceeds the new limits, are "grandfathered" when the new limits are introduced. (Instances in the v2 tiers are already subject to the new limits.)&lt;/LI&gt;
&lt;LI&gt;Limits in grandfathered services will be set 10% higher than the customer's observed usage at the time new limits take effect.&lt;/LI&gt;
&lt;LI&gt;Grandfathering applies per service and service tier.&lt;/LI&gt;
&lt;LI&gt;Other existing services and new services are subject to the new limits when they take effect.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;Guidelines for limit increases&lt;/H2&gt;
&lt;P&gt;In some cases, you might want to increase a service limit. Before requesting a limit increase, note the following guidelines:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Explore strategies to address the issue proactively before requesting a limit increase. See the article here &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/api-management/service-limits#strategies-to-manage-resources" target="_blank" rel="noopener" data-linktype="self-bookmark"&gt;Manage resources within limits&lt;/A&gt;.&lt;/LI&gt;
&lt;LI&gt;Consider potential impacts of the limit increase on overall service performance and stability. Increasing a limit might affect your service's capacity or increase latency in some service operations.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;Requesting a limit increase&lt;/H3&gt;
&lt;P&gt;The product team considers requests for limit increases only for customers using services in the following tiers that are designed for medium to large production workloads:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Standard and Standard v2&lt;/LI&gt;
&lt;LI&gt;Premium and Premium v2&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Requests for limit increases are evaluated on a case-by-case basis and aren't guaranteed. The product team prioritizes Premium and Premium v2 tier customers for limit increases.&lt;/P&gt;
&lt;P&gt;To request a limit increase, create a support request from the Azure portal. For more information, see&amp;nbsp;&lt;A href="https://azure.microsoft.com/support/" target="_blank" rel="noopener" data-linktype="external"&gt;Azure support plans&lt;/A&gt;.&lt;/P&gt;
&lt;H3&gt;Documentation&lt;/H3&gt;
&lt;P&gt;For more information, please see documentation &lt;A class="lia-external-url" href="https://aka.ms/apimlimits" target="_blank"&gt;here&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 04 Mar 2026 07:14:10 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/new-azure-api-management-service-limits/ba-p/4497574</guid>
      <dc:creator>Sreekanth_Thirthala</dc:creator>
      <dc:date>2026-03-04T07:14:10Z</dc:date>
    </item>
    <item>
      <title>How to Access a Shared OneDrive Folder in Azure Logic Apps</title>
      <link>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/how-to-access-a-shared-onedrive-folder-in-azure-logic-apps/ba-p/4484962</link>
      <description>&lt;H2&gt;What is the problem?&lt;/H2&gt;
&lt;P&gt;A common enterprise automation scenario involves copying files from a &lt;STRONG&gt;OneDrive folder shared by a colleague&lt;/STRONG&gt; into another storage service such as &lt;STRONG&gt;SharePoint&lt;/STRONG&gt; or &lt;STRONG&gt;Azure Blob Storage&lt;/STRONG&gt; using &lt;STRONG&gt;Azure Logic Apps&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;However, when you configure the &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/connectors/onedriveforbusiness/#list-files-in-folder" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;OneDrive for Business – “List files in folder”&lt;/STRONG&gt;&lt;/A&gt; action in a Logic App, you quickly run into a limitation:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;The folder picker only shows:
&lt;UL&gt;
&lt;LI&gt;Root directory&lt;/LI&gt;
&lt;LI&gt;Subfolders of the &lt;STRONG&gt;authenticated user’s OneDrive&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Shared folders do not appear at all&lt;/STRONG&gt;, even though you can access them in the OneDrive UI&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;This makes it seem like Logic Apps cannot work with shared OneDrive folders—but that’s not entirely true.&lt;/P&gt;
&lt;img&gt;Logic app's "List files in folder" action from OneDrive for business connector showing list of folders while when clicked on the file picker icon&lt;/img&gt;
&lt;H2&gt;Why this happens&lt;/H2&gt;
&lt;P&gt;The OneDrive for Business connector is &lt;STRONG&gt;user‑context scoped&lt;/STRONG&gt;. It only enumerates folders that belong to the signed-in user’s drive and does not automatically surface folders that are &lt;STRONG&gt;shared with the user&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Even though shared folders are visible under &lt;EM&gt;“Shared with me”&lt;/EM&gt; in the OneDrive UI, they:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Live in a &lt;STRONG&gt;different drive&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Have a &lt;STRONG&gt;different driveId&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Require explicit identification before Logic Apps can access them&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;How to access a shared OneDrive folder&lt;/H2&gt;
&lt;P&gt;There are &lt;STRONG&gt;two supported ways&lt;/STRONG&gt; to access a shared OneDrive directory from Logic Apps.&lt;/P&gt;
&lt;H3&gt;Option 1: Use Microsoft Graph APIs (Delegated permissions)&lt;/H3&gt;
&lt;P&gt;You can invoke Microsoft Graph APIs directly using:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/connectors/webcontents/#invoke-an-http-request" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;HTTP with Microsoft Entra ID (preauthorized)&lt;/STRONG&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Delegated permissions on behalf of the signed‑in user&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;This requires:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Admin consent or delegated consent workflows&lt;/LI&gt;
&lt;LI&gt;Additional Entra ID configuration&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;📘 Reference: &lt;A href="https://learn.microsoft.com/en-us/connectors/webcontents/#authorize-the-connector-to-act-on-behalf-of-a-signed-in-user" target="_blank" rel="noopener"&gt;HTTP with Microsoft Entra ID (preauthorized) - Connectors | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;While powerful, this approach adds setup complexity.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Option 2: Use Graph Explorer to configure the OneDrive connector&lt;/H3&gt;
&lt;P&gt;Instead of calling Graph from Logic Apps directly, you can:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Use &lt;STRONG&gt;Graph Explorer&lt;/STRONG&gt; to discover the shared folder metadata&lt;/LI&gt;
&lt;LI&gt;Manually configure the OneDrive action using that metadata&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;Step-by-step: Using Graph Explorer to access a shared folder&lt;/H2&gt;
&lt;H3&gt;Scenario&lt;/H3&gt;
&lt;P&gt;A colleague has shared a OneDrive folder named &lt;STRONG&gt;“Test”&lt;/STRONG&gt; with me, and I need to process files inside it using a Logic App.&lt;/P&gt;
&lt;H3&gt;Step 1: List shared folders using Microsoft Graph&lt;/H3&gt;
&lt;P&gt;In &lt;A class="lia-external-url" href="https://developer.microsoft.com/en-us/graph/graph-explorer" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;Graph Explorer&lt;/STRONG&gt;&lt;/A&gt;, run the following request:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;GET https://graph.microsoft.com/v1.0/users/{&lt;EM&gt;OneDrive shared folder owner username}&lt;/EM&gt;/drive/root/children&lt;/P&gt;
&lt;P class=""&gt;📘Reference: &lt;A href="https://learn.microsoft.com/en-us/graph/api/driveitem-list-children?view=graph-rest-1.0&amp;amp;tabs=http" target="_blank" rel="noopener"&gt;List the contents of a folder - Microsoft Graph v1.0 | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;✅This returns all root-level folders visible to the signed-in user, including folders &lt;STRONG&gt;shared with you&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;From the response, locate the shared folder. You only need &lt;STRONG&gt;two values&lt;/STRONG&gt;:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;parentReference.driveId&lt;/LI&gt;
&lt;LI&gt;id (folder ID)&lt;/LI&gt;
&lt;/UL&gt;
&lt;img&gt;
&lt;P&gt;Graph explorer snippet showing the request sent to the API to list the files &amp;amp; folders shared by a specific user on the root drive&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Step 2: Configure Logic App “List files in folder” action&lt;/H3&gt;
&lt;P&gt;In your Logic App:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Add &lt;STRONG&gt;OneDrive for Business → List files in folder&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Do not use the folder picker&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Manually enter the folder value using this format: &lt;SPAN class="lia-text-color-6"&gt;&lt;U&gt;&lt;EM&gt;&lt;STRONG&gt;{driveId}&lt;/STRONG&gt;&lt;/EM&gt;&lt;/U&gt;&lt;/SPAN&gt;&lt;EM&gt;&lt;STRONG&gt;.&lt;/STRONG&gt;&lt;/EM&gt;&lt;SPAN class="lia-text-color-10"&gt;&lt;U&gt;&lt;EM&gt;&lt;STRONG&gt;{folderId}&lt;/STRONG&gt;&lt;/EM&gt;&lt;/U&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Once saved, the action successfully lists files from the&amp;nbsp;&lt;STRONG&gt;shared OneDrive folder&lt;/STRONG&gt;.&lt;/P&gt;
&lt;H3&gt;Step 3: Build the rest of your workflow&lt;/H3&gt;
&lt;P&gt;After the folder is resolved correctly:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;You can loop through files&lt;/LI&gt;
&lt;LI&gt;Copy them to SharePoint&lt;/LI&gt;
&lt;LI&gt;Upload them to Azure Blob Storage&lt;/LI&gt;
&lt;LI&gt;Apply filters, conditions, or transformations&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;All standard OneDrive actions now work as expected.&lt;/P&gt;
&lt;H2&gt;Troubleshooting: When Graph Explorer doesn’t help&lt;/H2&gt;
&lt;P&gt;If you’re unable to find the driveId or folderId via Graph Explorer, there’s a reliable fallback.&lt;/P&gt;
&lt;H3&gt;Use browser network tracing&lt;/H3&gt;
&lt;OL&gt;
&lt;LI&gt;Open the shared folder in OneDrive (web)&lt;/LI&gt;
&lt;LI&gt;Open &lt;STRONG&gt;Browser Developer Tools → Network&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Look for requests like:&lt;img&gt;Browser network trace snippet on how to fetch the required driveID &amp;amp; folderId&lt;/img&gt;&lt;/LI&gt;
&lt;LI&gt;In the response payload, extract:
&lt;UL&gt;
&lt;LI&gt;CurrentFolderUniqueId → folder ID&lt;/LI&gt;
&lt;LI&gt;drives/{driveId} from the CurrentFolderSpItemUrl&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;This method is very effective when Graph results are incomplete or filtered.&lt;/P&gt;</description>
      <pubDate>Tue, 10 Mar 2026 06:39:31 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/how-to-access-a-shared-onedrive-folder-in-azure-logic-apps/ba-p/4484962</guid>
      <dc:creator>Arpit_MSFT</dc:creator>
      <dc:date>2026-03-10T06:39:31Z</dc:date>
    </item>
    <item>
      <title>Stop Writing Plumbing! Use the New Logic Apps MCP Server Wizard</title>
      <link>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/stop-writing-plumbing-use-the-new-logic-apps-mcp-server-wizard/ba-p/4496702</link>
      <description>&lt;P&gt;As part of our continued investment in making Logic Apps a first‑class platform for providing AI agents with connectivity, we’ve introduced the new Logic Apps MCP server configuration experience—a guided, in‑portal workflow that lets you turn any existing Standard logic app into a fully functional MCP server. With just a few clicks, you can configure authentication, generate API keys, create or manage MCP servers, and convert workflows into discoverable MCP tools that agents can call securely and reliably. This experience consolidates everything you need: setup, tooling, and management into one intuitive surface so developers can focus on building meaningful agentic capabilities instead of wiring up protocol plumbing.&lt;/P&gt;
&lt;P&gt;This new experience builds upon our previous investments with&amp;nbsp;&lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/introducing-logic-apps-mcp-servers-public-preview/4450419" target="_blank" rel="noopener"&gt;API Center&lt;/A&gt; and the &lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/%F0%9F%8E%99%EF%B8%8Fpublic-preview-azure-logic-apps-connectors-as-mcp-tools-in-microsoft-foundry/4473062" target="_blank" rel="noopener"&gt;Microsoft Foundry tools catalog&lt;/A&gt; that introduced the ability to dynamically build MCP servers through a publishing wizard experience that leveraged Azure Logic Apps connectors. The investments made with API Center and Microsoft Foundry enabled the underlying platform components that make Logic Apps workflows accessible over the MCP protocol as MCP tools. What we have subsequently invested in is the ability to enable any existing Logic Apps Standard instance as an MCP server.&lt;/P&gt;
&lt;H3&gt;Core Capabilities&lt;/H3&gt;
&lt;P&gt;From an existing Logic Apps Standard instance, you will now discover a new section in our table of contents called Agents. Within this section, you will find an entry point called MCP servers. If you click on this link, our configuration experience will load. This experience will provide you with the option to create an MCP server using existing workflows or by creating new workflows.&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;Create new workflows&lt;/H3&gt;
&lt;P&gt;Using this option, allows us to dynamically build MCP tools using the Logic Apps managed connectors, much like we provide in API Center and Microsoft Foundry.&lt;/P&gt;
&lt;P&gt;You will start by providing:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;MCP Server Name&lt;/LI&gt;
&lt;LI&gt;MCP Server Description&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Once this information has been provided, we can select a connector that we would like to use in our MCP server like the Salesforce connector.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;With our connector selected, we can choose one or more actions. For each action that is selected, a corresponding workflow will be created that enables that connector to be called. For our use case, we will select Create record, Update record and Get Opportunity records from Salesforce.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;To connect to Salesforce, we need a connection so we will create that now&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;If we scroll down, we will discover that we have some actions that require configuration including Create record and Update record. The reason for this is due to the design of the Salesforce connector and its support for may different Salesforce object types. Salesforce has many object types and delegating this decision to a model will result in a lot of unpredictable behavior. We can increase the consistency of our MCP server by making it more specific.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;To improve our predictability, we will target a specific object type of Contacts. With this selected, we will also be able to choose which fields we want our model to populate. For any fields that we want to hardcode, we can specify a provided by value to be set to User.&lt;/P&gt;
&lt;P&gt;It is also a good practice to update the Description of our action to ensure we have something meaningful so that our model can achieve higher accuracy when trying to call it.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;To complete our process, click the Register button. Once this is clicked, the related workflows will be automatically get created for us. These underlying workflows will have Request trigger schemas provided and configuration that will wire-up these inputs into our action.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Once the registration process is complete, we will see a notification in the upper fight corner indicating that our tools (workflows) have been saved.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;We will now see our MCP Server created with the corresponding workflow tools. From this experience, there are multiple functions that we can access from this screen including:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Editing MCP Server Name and Description&lt;/LI&gt;
&lt;LI&gt;Adding/removing workflows for this MCP server&lt;/LI&gt;
&lt;LI&gt;Copy the MCP Server URL&lt;/LI&gt;
&lt;LI&gt;Delete MCP Server&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;o&amp;nbsp;&amp;nbsp; The underlying workflows will remain, even if the MCP Server is deleted.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;If we want to explore one of our workflow tools, we can click on the link and we will be navigated to the underlying workflow. If we want to make changes to this workflow, we are able to do so, including adding additional connectors (managed or built-in), business logic, custom code etc.&lt;/P&gt;
&lt;P&gt;As we explore this workflow we will discover that we have a trigger schema that is included and we have our Salesforce action mapped. This was all completed by the wizard experience that we just went through. We can now secure and test our MCP server, as discussed later in this article.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Use existing workflows&lt;/H3&gt;
&lt;P&gt;You may already have workflows built that you want to expose as MCP tools. With this requirement in mind, we can support these use cases by selecting: Use existing workflows option.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Once again, we will provide an MCP server Name and Description. With these values provided, we can select one or more existing workflow(s) to be included in this MCP Server.&lt;/P&gt;
&lt;P&gt;In order for a workflow to be eligible for selection it must satisfy the following conditions:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;HTTP Trigger&lt;/LI&gt;
&lt;LI&gt;HTTP Response Action&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;You have a lot of creative licensing for whatever actions you want to include between these actions. This can include calling APIs, custom code, built-in connectors and additional business logic.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Note:&lt;/STRONG&gt; Using this approach also allows you to create a workflow with your own naming conventions in place and support for advanced scenarios.&lt;/P&gt;
&lt;P&gt;I have built the following workflow which includes my trigger, ServiceNow action and a response. To optimize our model reliably calling my MCP Server, I have:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Added a relevant description for my trigger. This will communicate to the model what this workflow (tool) is able to provide.&lt;/LI&gt;
&lt;LI&gt;Within my trigger, provided a JSON schema and included description fields that communicate to the model what these data properties provide.&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Once we have provided a Name and Description, we can now select our workflow(s) and click Create button.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;We now have two MCP servers that are hosted in this Logic App. Each MCP server will have a unique URL, but will share the same security scheme.&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;Authentication&lt;/H3&gt;
&lt;P&gt;There are two authentication schemes that are available for MCP servers:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;API Key-based&lt;/LI&gt;
&lt;LI&gt;OAuth&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;Note: &lt;/STRONG&gt;It is important to know that these authentication schemes apply to the entire Logic App and not the individual MCP Servers/tools.&lt;/P&gt;
&lt;H3&gt;API key-based authentication&lt;/H3&gt;
&lt;P&gt;When we select Key-based from our method dropdown, we have the ability to generate keys by clicking on the Generate key button. From there, select a Duration and an Access Key, followed by clicking on the Generate button.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;An API key will be presented for which you can copy this value.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Note:&lt;/STRONG&gt; When you navigate away from this page, you will not be able to see this value again, so store it in a safe place. However, you can generate additional API keys. Prior API keys will continue to be valid until their expiration date is no longer valid or the access keys are regenerated. &amp;nbsp;Regenerating access keys will be available in a future release, but are available via an API call.&lt;/P&gt;
&lt;img /&gt;
&lt;H3&gt;OAuth Authentication&lt;/H3&gt;
&lt;P&gt;Here we are going to take advantage of EasyAuth authentication for Azure Logic Apps. We will start by clicking on the Manage authentication link.&lt;/P&gt;
&lt;P&gt;From there we will click on the Add identity provider button.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Select Microsoft as the identity provider, followed by clicking the Add button.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;We will now need an App Registration, so in a separate tab navigate to App registrations in the Azure Portal.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Start by providing a Name and select the desired account types.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Click on Expose an API&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Add a Scope and provide relevant data&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Navigate to the Overview page and then copy the values for:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Application (client) ID&lt;/LI&gt;
&lt;LI&gt;Directory (tenant) ID&lt;/LI&gt;
&lt;LI&gt;Application ID URI&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;P&gt;Back in our Logic Apps, Add an identity provider and provide the following information from our App Registration:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Application (client) ID&lt;/LI&gt;
&lt;LI&gt;Issuer URL &lt;A href="https://login.microsoftonline.com/%3cYour_Tenant_ID%3e/v2.0" target="_blank" rel="noopener"&gt;https://login.microsoftonline.com/&amp;lt;Your_Tenant_ID&amp;gt;/v2.0&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Allowed token audiences (Application ID URI) api://&amp;lt;your_value&amp;gt;/&lt;/LI&gt;
&lt;/UL&gt;
&lt;img /&gt;
&lt;P&gt;In the Additional checks section, enable the following:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Allow requests from any application&lt;/LI&gt;
&lt;LI&gt;Allow requests from any identity&lt;/LI&gt;
&lt;LI&gt;Use default restrictions based on issuer&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;For the App Server authentication settings, enable unauthenticated access.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Note:&lt;/STRONG&gt; These settings can be modified to address your organization’s specific needs.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Click Add to complete the configuration&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Testing&lt;/H3&gt;
&lt;P&gt;You are now ready to test your MCP server from your favorite agent platform including VS Code, Copilot Studio, Microsoft Foundry or Azure Logic Apps. If you are using an API key, you will be asked to create an authentication header. In this case you will want to use: X-API-KEY and then provide your key value.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Known issue:&amp;nbsp;&lt;/STRONG&gt;We have seen some situations that when using OAuth, the Easy Auth settings need to be re-applied to address an authentication error from occurring. Issuing the following command from a Cloud shell should address the problem and allow you to authenticate using Easy Auth.&lt;/P&gt;
&lt;P&gt;az webapp auth microsoft update --name "&amp;lt;LogicAppName&amp;gt;" --resource-group "&amp;lt;Your_ResourceGroup&amp;gt;" --client-id "&amp;lt;Your_Client_ID&amp;gt;" --issuer "https://login.microsoftonline.com/&amp;lt;tenant&amp;gt;/v2.0"&lt;/P&gt;
&lt;H3&gt;Video content&lt;/H3&gt;
&lt;P&gt;Want to see this content in video format? Check out the following video.&lt;/P&gt;
&lt;div data-video-id="https://youtu.be/AIKvqCVrTcg/1771968107086" data-video-remote-vid="https://youtu.be/AIKvqCVrTcg/1771968107086" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FAIKvqCVrTcg%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DAIKvqCVrTcg&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FAIKvqCVrTcg%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 25 Feb 2026 14:19:26 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/stop-writing-plumbing-use-the-new-logic-apps-mcp-server-wizard/ba-p/4496702</guid>
      <dc:creator>KentWeareMSFT</dc:creator>
      <dc:date>2026-02-25T14:19:26Z</dc:date>
    </item>
    <item>
      <title>Logic Apps Agentic Workflows with SAP - Part 2: AI Agents</title>
      <link>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/logic-apps-agentic-workflows-with-sap-part-2-ai-agents/ba-p/4492362</link>
      <description>&lt;P&gt;&lt;STRONG&gt;Part 2&lt;/STRONG&gt; focuses on the AI-shaped portion of the destination workflows: how the Logic Apps Agent is configured, how it pulls business rules from SharePoint, and how its outputs are converted into concrete workflow artifacts. In Destination workflow #1, the agent produces three structured outputs—an HTML validation summary, a CSV list of &lt;CODE&gt;InvalidOrderIds&lt;/CODE&gt;, and an Invalid CSV payload—which drive (1) a verification email, (2) an optional RFC call to persist failed rows as IDocs, and (3) a filtered dataset used for the separate analysis step that returns only analysis (or errors) back to SAP. In Destination workflow #2, the same approach is applied to inbound IDocs: the workflow reconstructs CSV from the custom segment, runs AI validation against the same SharePoint rules, and safely appends results to an append blob using a lease-based write pattern for concurrency.&lt;/P&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;1. Introduction&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;In&amp;nbsp;&lt;STRONG&gt;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/logic-apps-agentic-workflows-with-sap---part-1-infrastructure/4491906" target="_blank" rel="noopener" data-lia-auto-title="Part 1" data-lia-auto-title-active="0"&gt;Part 1&lt;/A&gt;&lt;/STRONG&gt;, the goal was to make the integration deterministic: stable payload shapes, stable response shapes, and predictable error propagation across SAP and Logic Apps. Concretely, &lt;STRONG&gt;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/logic-apps-agentic-workflows-with-sap---part-1-infrastructure/4491906" target="_blank" rel="noopener" data-lia-auto-title="Part 1" data-lia-auto-title-active="0"&gt;Part 1&lt;/A&gt;&lt;/STRONG&gt; established:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;how SAP reaches Logic Apps (Gateway/Program ID plumbing)&lt;/LI&gt;
&lt;LI&gt;the RFC contracts (&lt;CODE&gt;IT_CSV&lt;/CODE&gt;, response envelope, &lt;CODE&gt;RETURN&lt;/CODE&gt;/&lt;CODE&gt;MESSAGE&lt;/CODE&gt;, &lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt;)&lt;/LI&gt;
&lt;LI&gt;how the source workflow interprets RFC responses (success vs error)&lt;/LI&gt;
&lt;LI&gt;how invalid rows can be persisted into SAP as custom IDocs (&lt;CODE&gt;Z_CREATE_ONLINEORDER_IDOC&lt;/CODE&gt;)&lt;/LI&gt;
&lt;LI&gt;and how the second destination workflow receives those IDocs asynchronously&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;With that foundation in place, &lt;STRONG&gt;Part 2&lt;/STRONG&gt; narrows in on the part that is &lt;EM&gt;not&lt;/EM&gt; just plumbing: the agent loop, the tool boundaries, and the output schemas that make AI results usable inside a workflow rather than “generated text you still need to interpret.”&lt;/P&gt;
&lt;P&gt;The diagram below highlights the portion of the destination workflow where AI is doing real work. The red-circled section is the validation agent loop (rules in, structured validation outputs out), which then fans out into operational actions like email notification, optional IDoc persistence, and filtering for the analysis step.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;&lt;STRONG&gt;Figure: AI boundary in the destination workflow.&lt;/STRONG&gt;&lt;/img&gt;
&lt;P&gt;What matters here is the shape of the agent outputs and how they are consumed by the rest of the workflow. The agent is not treated as a black box; it is forced to emit typed, workflow-friendly artifacts (summary + invalid IDs + filtered CSV). Those artifacts are then used deterministically: invalid rows are reported (and optionally persisted as IDocs), while valid rows flow into the analysis stage and ultimately back to SAP.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;What this post covers&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;In this post, I focus on five practical topics:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Agent loop design in Logic Apps:&lt;/STRONG&gt; tools, message design, and output schemas that make the agent’s results deterministic enough to automate.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;External rule retrieval:&lt;/STRONG&gt; pulling validation rules from SharePoint and applying them consistently to incoming payloads.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Structured validation outputs → workflow actions:&lt;/STRONG&gt; producing &lt;CODE&gt;InvalidOrderIds&lt;/CODE&gt; and a filtered CSV payload that directly drive notifications and SAP remediation.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Two-model pattern:&lt;/STRONG&gt; a specialized model for validation (agent) and a separate model call for analysis, with a clean handoff between the two.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Output shaping for consumption:&lt;/STRONG&gt; converting AI output into HTML for email and into the SAP response envelope (analysis/errors only).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;EM&gt;(Everything else—SAP plumbing, RFC wiring, and response/exception patterns—was covered in &lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/logic-apps-agentic-workflows-with-sap---part-1-infrastructure/4491906" target="_blank" rel="noopener" data-lia-auto-title="Part 1" data-lia-auto-title-active="0"&gt;&lt;STRONG&gt;Part 1&lt;/STRONG&gt;&lt;/A&gt; and is assumed here.)&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Next, I’ll break down the agent loop itself—the tool sequence, the required output fields, and the exact points where the workflow turns AI output into variables, emails, and SAP actions.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Huge thanks to &lt;a href="javascript:void(0)" data-lia-user-mentions="" data-lia-user-uid="1377763" data-lia-user-login="KentWeareMSFT" class="lia-mention lia-mention-user"&gt;KentWeareMSFT​&lt;/a&gt;&lt;/STRONG&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;for helping me understand agent loops and design the validation agent structure. And thanks to everyone in&lt;STRONG&gt; &lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/%F0%9F%A4%96-agent-loop-demos-%F0%9F%A4%96/4414770" target="_blank" rel="noopener"&gt;🤖 Agent Loop Demos 🤖 | Microsoft Community Hub&lt;/A&gt;&amp;nbsp;&lt;/STRONG&gt;for making such great material available.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-background-color-16" border="1" style="width: 100%; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 99.9074%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Note: For the full set of assets used here, see the &lt;A class="lia-external-url" href="https://github.com/Azure/logicapps/tree/master/agentic-sap-workflows" target="_blank" rel="noopener"&gt;companion GitHub repository&lt;/A&gt; (workflows, schemas, SAP ABAP code, and sample files).&lt;/STRONG&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;2. Validation Agent Loop&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;In this solution, the&lt;STRONG&gt; &lt;/STRONG&gt;Data Validation Agent runs inside the destination workflow after the inbound SAP payload has been normalized into a single CSV string. The agent is invoked as a single Logic Apps Agent action, configured with an Azure OpenAI deployment and a short set of instructions. Its inputs are deliberately simple at this stage:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;the CSV payload (the dataset to validate), and&lt;/LI&gt;
&lt;LI&gt;the &lt;CODE&gt;ValidationRules&lt;/CODE&gt; reference (where the rule document lives), shown in the instructions &lt;EM&gt;as a parameter token (ValidationRules is a logic app parameter).&lt;/EM&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The figure below shows the validation agent configuration used in the destination workflow. The top half is the Agent action configuration (model + instructions), and the bottom half shows the toolset that the agent is allowed to use. The key design choice is that the agent is not “free-form chat”: it’s constrained by a small number of tools and a workflow-friendly output contract.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;&lt;STRONG&gt;Figure: Data Validation Agent configuration in Logic Apps.&lt;/STRONG&gt;&lt;/img&gt;
&lt;P&gt;What matters most in this configuration is the separation between&lt;STRONG&gt; &lt;/STRONG&gt;instructions and tools. The instructions tell the agent &lt;EM&gt;what&lt;/EM&gt; to do (“follow business process steps 1–3”), while the tools define &lt;EM&gt;how&lt;/EM&gt; the agent can interact with external systems and workflow state. This keeps the agent modular: you can change rules in SharePoint or refine summarization expectations without rewriting the overall SAP integration mechanics.&lt;/P&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;Purpose&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;This agent’s job is narrowly scoped: validate the CSV payload from SAP against externally stored business rules and produce outputs that the workflow can use deterministically. In other words, it turns “validation as reasoning” into workflow artifacts (summary + invalid IDs + invalid payload), instead of leaving validation as unstructured prose.&lt;/P&gt;
&lt;P&gt;In Azure Logic Apps terms, this is an agent loop: an iterative process where an LLM follows instructions and selects from available tools to complete a multi-step task. Logic Apps agent workflows explicitly support this “agent chooses tools to complete tasks” model (see &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/logic-apps/agent-workflows-concepts" target="_blank" rel="noopener"&gt;Agent Workflows Concepts).&lt;/A&gt;&lt;/P&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;Tools&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;In Logic Apps agent workflows, a &lt;STRONG&gt;tool&lt;/STRONG&gt; is a named sequence that contains one or more actions the agent can invoke to accomplish part of its task (see&amp;nbsp;&lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/agent-workflows-concepts" target="_blank" rel="noopener"&gt;Agent Workflows Concepts).&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;In the screenshot, the agent is configured with &lt;STRONG&gt;three tools&lt;/STRONG&gt;, explicitly labeled&amp;nbsp;&lt;EM&gt;&lt;STRONG&gt;Get validation rules,&amp;nbsp;Get CSV payload, Summarize CSV payload review&lt;/STRONG&gt;. &lt;/EM&gt;These tool names match the business process in the “Instructions for agent” box (steps 1–3). The next sections of the post go deeper into&amp;nbsp;&lt;EM&gt;what each tool does internally&lt;/EM&gt;; at this level, the important point is simply that the agent is constrained to a small, explicit toolset.&lt;/P&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;Agent execution&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;The screenshot shows the agent configured with:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;AI model:&lt;/STRONG&gt; gpt-5-3 (gpt-5)&lt;/LI&gt;
&lt;LI&gt;A connection line: “Connected to … (Azure OpenAI)”&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Instructions for agent&lt;/STRONG&gt; that define the agent’s role and a 3-step business process:
&lt;OL&gt;
&lt;LI style="font-weight: bold;"&gt;&lt;STRONG&gt;Get validation rules (via the &lt;CODE&gt;ValidationRules&lt;/CODE&gt; reference)&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI style="font-weight: bold;"&gt;&lt;STRONG&gt;Get CSV payload&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI style="font-weight: bold;"&gt;&lt;STRONG&gt;Summarize the CSV payload review, using the validation document&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;This pattern is intentional:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;The &lt;STRONG&gt;instructions&lt;/STRONG&gt; provide the agent’s “operating procedure” in plain language.&lt;/LI&gt;
&lt;LI&gt;The &lt;STRONG&gt;tools&lt;/STRONG&gt; give the agent: controlled ways to fetch the rule document, access the CSV input, and return structured results.&lt;/LI&gt;
&lt;LI&gt;Because the workflow consumes the agent’s outputs downstream, the instruction text is effectively part of your&lt;STRONG&gt; &lt;/STRONG&gt;workflow contract (it must remain stable enough that later actions can trust the output shape).&lt;/LI&gt;
&lt;/UL&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN lia-align-left"&gt;&lt;table class="lia-background-color-16" border="1" style="width: 100%; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 99.9074%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Note&lt;/STRONG&gt;: If a reader wants to recreate this pattern, the fastest path is:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Start with the official overview of agent workflows&amp;nbsp;(&lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/agent-workflows-concepts?tabs=standard" target="_blank" rel="noopener"&gt;Workflows with AI Agents and Models - Azure Logic Apps).&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Follow a hands-on walkthrough for building an agent workflow and connecting it to an Azure OpenAI deployment (Logic Apps Labs is a good step-by-step reference). &lt;A href="https://azure.github.io/logicapps-labs/docs/logicapps-ai-course/build_autonomous_agents/create-first-autonomous-agent/" target="_blank" rel="noopener"&gt;[&lt;CODE&gt;azure.github.io&lt;/CODE&gt;]&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Use the Azure OpenAI connector reference to understand authentication options and operations available in Logic Apps Standard (see&amp;nbsp;&lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/logic-apps/connectors/built-in/reference/openai/" target="_blank" rel="noopener"&gt;Built-in OpenAI Connector)&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;If you’re using Foundry for resource management, review how Foundry connections are created and used, especially when multiple resources/tools are involved (see&amp;nbsp;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-foundry/how-to/connections-add?view=foundry-classic" target="_blank" rel="noopener"&gt;How to connect to AI foundry).&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H4&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;2.1 Tool 1: Get validation rules&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;The first tool in the validation agent loop is&amp;nbsp;&lt;STRONG&gt;&lt;EM&gt;Get validation rules&lt;/EM&gt;&lt;/STRONG&gt;. Its job is to load the business validation rules that will be applied to the incoming CSV payload from SAP. I keep these rules outside the workflow (in a document) so they can be updated without redeploying the Logic App. In this example, the rules are stored in SharePoint, and the tool simply retrieves the document content at runtime.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Get validation rules&lt;/EM&gt; is implemented as a single action called &lt;EM&gt;Get validation document&lt;/EM&gt;. In the designer, you can see it:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;uses a SharePoint Online connection (SharePoint icon and connector action)&lt;/LI&gt;
&lt;LI&gt;calls &lt;EM&gt;&lt;CODE&gt;GetFileContentByPath&lt;/CODE&gt;&lt;/EM&gt; (shown by the “File Path” input)&lt;/LI&gt;
&lt;LI&gt;reads the rule file from the configured &lt;EM&gt;Site Address&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;uses the workflow parameter token &lt;EM&gt;&lt;CODE&gt;ValidationRules&lt;/CODE&gt;&lt;/EM&gt; for the &lt;EM&gt;File Path&lt;/EM&gt; (so the exact rule file location is configurable per environment)&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The output of this tool is the raw rule document content, which the &lt;EM&gt;Data Validation Agent&lt;/EM&gt; uses in the next steps to validate the CSV payload.&lt;/P&gt;
&lt;img&gt;&lt;STRONG&gt;Figure: Tool #1 — Get validation rules retrieves the validation document from SharePoint&lt;/STRONG&gt;&lt;/img&gt;
&lt;P&gt;The bottom half of the figure shows an excerpt of the rules document. The format is simple and intentionally human-editable: each rule is expressed as&amp;nbsp;&lt;EM&gt;&lt;CODE&gt;FieldName&lt;/CODE&gt;: condition.&lt;/EM&gt; For example, the visible rules include:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;CODE&gt;PaymentMethod&lt;/CODE&gt;:&lt;/STRONG&gt; value must exist&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;CODE&gt;PaymentMethod&lt;/CODE&gt;:&lt;/STRONG&gt; value cannot be “Cash”&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;CODE&gt;OrderStatus&lt;/CODE&gt;:&lt;/STRONG&gt; value must be different from “Cancelled”&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;CODE&gt;CouponCode&lt;/CODE&gt;:&lt;/STRONG&gt; value must have at least 1 character&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;CODE&gt;OrderID&lt;/CODE&gt;:&lt;/STRONG&gt; value must be unique in the CSV array&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;A scope note:&lt;/STRONG&gt; &lt;EM&gt;“Do not validate the Date field.”&lt;/EM&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;These rules are the “source of truth” for validation. The workflow does not hardcode them into expressions; instead, it retrieves them from SharePoint and passes them into the agent loop so the validation logic remains configurable and auditable (you can always point to the exact rule document used for a given run).&lt;/P&gt;
&lt;P&gt;A small but intentional rule in the document is &lt;EM&gt;“Do not validate the Date field.” &lt;/EM&gt;That line is there for a practical reason: in an early version of the source workflow, the date column was being corrupted during CSV generation. The validation agent still tried to validate dates (&lt;EM&gt;even though date validation wasn’t part of the original intent&lt;/EM&gt;), and the result was predictable: &lt;EM&gt;every row failed validation&lt;/EM&gt;, leaving nothing to analyze. The upstream issue is fixed now, but I kept this rule in the demo to illustrate an important point: validation is only useful when it’s aligned with the data contract you can actually guarantee at that point in the pipeline.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-background-color-16" border="1" style="width: 100%; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 99.9074%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Note:&lt;/STRONG&gt; The rules shown here assume the CSV includes a &lt;STRONG&gt;header row&lt;/STRONG&gt; (field names in the first line) so the agent can interpret each column by name. If you want the agent to be &lt;STRONG&gt;schema‑agnostic&lt;/STRONG&gt;, you can extend the rules with an explicit column mapping, for example:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Column 1: Order ID&lt;/LI&gt;
&lt;LI&gt;Column 2: Date&lt;/LI&gt;
&lt;LI&gt;Column 3: Customer ID&lt;/LI&gt;
&lt;LI&gt;…&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;This makes the contract explicit even when headers are missing or unreliable.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;With the rules loaded, the next tool provides the second input the agent needs: the &lt;EM&gt;CSV payload&lt;/EM&gt; that will be validated against this document.&lt;/P&gt;
&lt;H4&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;2.2 Tool 2: Get CSV payload&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;The second tool in the validation agent loop is &lt;STRONG&gt;&lt;EM&gt;Get CSV payload&lt;/EM&gt;&lt;/STRONG&gt;. Its purpose is to make the dataset-to-validate explicit: it defines &lt;EM&gt;exactly&lt;/EM&gt; what the agent should treat as “the CSV payload,” rather than relying on implicit workflow context. In this workflow, the CSV is already constructed earlier (as &lt;CODE&gt;Create_CSV_payload&lt;/CODE&gt;), and this tool acts as the narrow bridge between that prepared string and the agent’s validation step.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;
&lt;P class="lia-align-center"&gt;&lt;STRONG&gt;Figure: Tool #2 (“Get CSV payload”) defines a single agent parameter and binds it to the workflow’s generated CSV.&lt;/STRONG&gt;&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;The figure shows two important pieces:&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;STRONG&gt;- The tool parameter contract (“Agent Parameters”)&lt;/STRONG&gt;&lt;BR /&gt;On the right, the tool defines an agent parameter named&lt;STRONG&gt; &lt;/STRONG&gt;&lt;EM&gt;CSV Payload&lt;/EM&gt; with type &lt;EM&gt;String&lt;/EM&gt;, and the description (highlighted in yellow) makes the intent explicit: &lt;EM style="color: rgb(51, 51, 51); font-family: SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace; font-size: 14px; white-space-collapse: preserve;"&gt;“The CSV payload received from SAP and that we validate based on the validation rules.”&lt;/EM&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;This parameter is the tool’s &lt;EM&gt;interface&lt;/EM&gt;: it documents what the agent is supposed to provide/consume when using this tool, and it anchors the rest of the validation process to a single, well-defined input. Tools in Logic Apps agent workflows exist specifically to constrain and structure what an agent can do and what data it operates on (see&amp;nbsp;&lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/agent-workflows-concepts" target="_blank" rel="noopener"&gt;Agent Workflows Concepts&lt;/A&gt;).&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;STRONG&gt;- Why there is an explicit Compose action (“CSV payload”)&lt;/STRONG&gt;&lt;BR /&gt;In the lower-right “Code view,” the tool’s internal action is shown as a standard &lt;EM&gt;Compose&lt;/EM&gt;:&lt;/P&gt;
&lt;LI-CODE lang="json"&gt;{
  "type": "Compose",
  "inputs": "@outputs('Create_CSV_payload')"
}&lt;/LI-CODE&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;This is intentional. Even though the CSV already exists in the workflow, the tool still needs a concrete action that &lt;EM&gt;produces&lt;/EM&gt; the value it returns to the agent. The Compose step:&lt;/P&gt;
&lt;UL&gt;
&lt;LI style="list-style-type: none;"&gt;
&lt;UL&gt;
&lt;LI&gt;pins the tool output to a single source of truth (&lt;CODE&gt;Create_CSV_payload&lt;/CODE&gt;), and&lt;/LI&gt;
&lt;LI&gt;creates a stable boundary: “this is the exact CSV string the agent validates,” independent of other workflow state.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Put simply: &lt;EM&gt;the Compose action isn’t there because Logic Apps can’t access the CSV—it’s there to make the agent/tool interface explicit, repeatable, and easy to troubleshoot.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-background-color-16" border="1" style="width: 100%; height: 34.8px; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr style="height: 34.8px;"&gt;&lt;td style="height: 34.8px;"&gt;
&lt;P&gt;&lt;STRONG&gt;What “tool parameters” are (in practical terms)&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;In Logic Apps agent workflows, a &lt;STRONG&gt;tool&lt;/STRONG&gt; is a named sequence of one or more actions that the agent can invoke while executing its instructions. &lt;BR /&gt;A &lt;STRONG&gt;tool parameter&lt;/STRONG&gt; is the tool’s input/output contract exposed to the agent. In this screenshot, that contract is defined under &lt;STRONG&gt;Agent Parameters&lt;/STRONG&gt;, where you specify:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Name:&lt;/STRONG&gt; CSV Payload&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Type:&lt;/STRONG&gt; String&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Description:&lt;/STRONG&gt; “The CSV payload received from SAP…”&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;This matters because it clarifies (for both the model and the human reader) what the tool represents and what data it is responsible for supplying.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 100.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;With Tool #1 providing the rules document and Tool #2 providing the CSV dataset, Tool #3 is where the agent produces workflow-ready outputs (summary + invalid IDs + filtered payload) that the downstream steps can act on.&lt;/P&gt;
&lt;H4&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;2.3 Tool 3: Summarize CSV payload review&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;The third tool, &lt;STRONG&gt;&lt;EM&gt;Summarize CSV payload review&lt;/EM&gt;&lt;/STRONG&gt;, is where the agent stops being “an evaluator” and becomes a producer of workflow-ready outputs. It does most of the heavy lifting so let's go into the details.&lt;/P&gt;
&lt;P&gt;Instead of returning one blob of prose, the tool defines&amp;nbsp;&lt;EM&gt;three explicit agent parameters&lt;/EM&gt;—each with a specific format and purpose—so the workflow can reliably consume the results in downstream actions. In Logic Apps agent workflows, tools are explicitly defined tasks the agent can invoke, and each tool can be structured around actions and schemas that keep the loop predictable (see &lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/agent-workflows-concepts" target="_blank" rel="noopener"&gt;Agent Workflows Concepts&lt;/A&gt;).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;
&lt;P class="lia-align-center"&gt;&lt;STRONG&gt;Figure: Tool #3 (“Summarize CSV payload review”) defines three structured agent outputs&lt;/STRONG&gt;&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;Description is not just documentation—it’s the contract&amp;nbsp;the model is expected to satisfy, and it strongly shapes what the agent considers “relevant” when generating outputs. The parameters are:&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-background-color-16" border="1" style="width: 100%; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 99.9074%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Validation summary (String)&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Goal&lt;/STRONG&gt;: a human-readable summary that can be dropped straight into email.&lt;/P&gt;
&lt;P&gt;In the screenshot, the description is very explicit about shape and content:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;EM&gt;“expected format is an HTML table”&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;“create a list of all orderids that have failed”&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;“create a CSV document… only for the orderid values that failed… each row on a separate line”&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;EM style="color: rgb(30, 30, 30);"&gt;“include title row only in the email body”&lt;/EM&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;This parameter is designed for presentation: it’s the thing you want humans to read first.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;CODE&gt;InvalidOrderIds&lt;/CODE&gt; (String, CSV format)&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Goal&lt;/STRONG&gt;: a machine-friendly list of identifiers the workflow can use deterministically.&lt;/P&gt;
&lt;P&gt;The key part of the description (highlighted in the image) is:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;“The format is CSV.”&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;That single sentence is doing a lot of work: it tells the model to emit a comma-separated list, which you then convert into an array in the workflow using split(...).&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Invalid CSV payload (String, one row per line)&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Goal&lt;/STRONG&gt;: the failed rows extracted from the original dataset, in a form that downstream steps can reuse.&lt;/P&gt;
&lt;P&gt;The description constrains the output tightly:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;EM&gt;“original CSV rows… for the orderid values that failed validation”&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;“each row must be on a separate line”&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;“keep the title row only for the email body and remove it otherwise”&lt;/EM&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;This parameter is designed for automation: it becomes input to remediation steps (like transforming rows to XML and creating IDocs), not just a report.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;What “agent parameters” do here (and why they matter)&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;A useful way to think about agent parameters is: they are the “&lt;EM&gt;typed return values&lt;/EM&gt;” of a tool. Tools in agent workflows exist to structure work into bounded tasks the agent can perform, and a schema/parameter contract makes the results consumable by the rest of the workflow (see &lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/agent-workflows-concepts" target="_blank" rel="noopener"&gt;Agent Workflows Concepts&lt;/A&gt;).&lt;/P&gt;
&lt;P&gt;In this tool, the parameters serve two purposes at once:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;They guide the agent toward salient outputs.&lt;/STRONG&gt;&lt;BR /&gt;The descriptions explicitly name what matters: “failed orderids,” “HTML table,” “CSV format,” “one row per line,” “header row rules.” That phrasing makes it much harder for the model to “wander” into irrelevant commentary.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;They align with how the workflow will parse and use the results.&lt;/STRONG&gt;&lt;BR /&gt;By stating “&lt;CODE&gt;InvalidOrderIds&lt;/CODE&gt; is CSV,” you make it trivially parseable (split), and by stating “Invalid CSV payload is one row per line,” you make it easy to feed into later transformations.&lt;/LI&gt;
&lt;/OL&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;Why the wording works (and what wording tends to work best)&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P class="lia-align-left"&gt;What’s interesting about the parameter descriptions is that they combine three kinds of constraints:&lt;/P&gt;
&lt;UL class="lia-align-left"&gt;
&lt;LI style="font-weight: bold;"&gt;&lt;STRONG&gt;Output format constraints (make parsing deterministic)&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI style="list-style-type: none;"&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;EM&gt;“expected format is an HTML table”&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;“The format is CSV.”&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;“each row must be on a separate line”&lt;/EM&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-30px lia-align-left"&gt;These format cues help the agent decide what to emit and help you avoid brittle parsing later.&lt;/P&gt;
&lt;UL class="lia-align-left"&gt;
&lt;LI style="font-weight: bold;"&gt;&lt;STRONG&gt;Output selection constraints (force relevance)&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI style="list-style-type: none;"&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;EM&gt;“only for the orderid values that failed validation”&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;“Create a list of all orderids that have failed”&lt;/EM&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-30px lia-align-left"&gt;This tells the agent what to keep and what to ignore.&lt;/P&gt;
&lt;UL class="lia-align-left"&gt;
&lt;LI style="font-weight: bold;"&gt;&lt;STRONG&gt;Output operational constraints (tie outputs to downstream actions)&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI style="list-style-type: none;"&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;EM&gt;“Include title row only in the email body”&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;“remove it otherwise”&lt;/EM&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-30px lia-align-left"&gt;This explicitly anticipates downstream usage (email vs remediation), which is exactly the kind of detail models often miss unless you state it.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px lia-align-left"&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-background-color-16" border="1" style="width: 100%; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 99.9074%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Rule of thumb:&lt;/STRONG&gt; wording works best when it describes&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;what to produce,&amp;nbsp;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;in what format,&amp;nbsp;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;with what filtering rules, and&amp;nbsp;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;why the workflow needs it&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;/OL&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;How these parameters tie directly to the downstream actions&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;The next picture makes the design intent very clear: each parameter is immediately “bound” to a normal workflow value via Compose actions and then used by later steps. This is the pattern we want: &lt;EM&gt;agent output → Compose → (optional) normalization → reused by deterministic workflow actions&lt;/EM&gt;. It’s the opposite of “read the model output and hope.”&lt;/P&gt;
&lt;img&gt;&lt;STRONG&gt;Figure: Tying up parameters to downstream actions.&lt;/STRONG&gt;&lt;/img&gt;
&lt;P&gt;This is the reusable pattern:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Decide the minimal set of outputs the workflow needs.&lt;/LI&gt;
&lt;LI&gt;Specify formats that are easy to parse.&lt;/LI&gt;
&lt;LI&gt;Write parameter descriptions that encode both selection and formatting constraints.&lt;/LI&gt;
&lt;LI&gt;Immediately bind outputs to workflow variables via Compose/&lt;CODE&gt;SetVariable&lt;/CODE&gt; actions.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;The main takeaway &lt;/STRONG&gt;from this tool is that the agent is being forced into a &lt;EM&gt;structured contract:&lt;/EM&gt; three outputs with explicit formats and clear intent. That contract is what makes the rest of the workflow deterministic—Compose actions can safely read @agentParameters(...), the workflow can safely split(...) the invalid IDs, and downstream actions can treat the “invalid payload” as real data rather than narrative.&lt;/P&gt;
&lt;P&gt;I'll show later how this same “parameter-first” design scales to other agent tools.&lt;/P&gt;
&lt;H4&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;2.4 Turning agent outputs into a verification email&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;Once the agent has produced structured outputs (Validation summary, &lt;CODE&gt;InvalidOrderIds&lt;/CODE&gt;, and Invalid CSV payload), the next goal is to make those outputs operational: humans need a quick summary of what failed, and the workflow needs machine‑friendly values it can reuse downstream.&lt;/P&gt;
&lt;P&gt;The design here is intentionally straightforward: the workflow converts each agent parameter into a first‑class workflow output (via Compose actions and one variable assignment), then binds those values directly into the Office 365 email body. The result is an email that is both readable and actionable—without anyone needing to open run history.&lt;/P&gt;
&lt;P&gt;The figure below shows how the outputs of Summarize CSV payload review are mapped into the verification email. On the left, the tool produces three values via subsequent actions (Summary, Invalid order ids, and Invalid CSV payload), and the workflow also normalizes the invalid IDs into an array (Save invalid order ids). On the right, the Send verification summary action composes the email body using those same values as dynamic content tokens.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;
&lt;P class="lia-align-center"&gt;&lt;STRONG&gt;Figure: Mapping agent outputs to the verification email&lt;/STRONG&gt;&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;The important point is that the email is not constructed by “re-prompting” or “re-summarizing.” It is assembled from already-structured outputs. This mapping is intentionally direct: each piece of the email corresponds to one explicit output from the agent tool. The workflow doesn’t interpret or transform the summary beyond basic formatting—its job is to preserve the agent’s structured outputs and present them consistently. The only normalization step happens for &lt;EM&gt;&lt;CODE&gt;InvalidOrderIds&lt;/CODE&gt;&lt;/EM&gt;, where the workflow also converts the CSV string into an array (&lt;EM&gt;&lt;CODE&gt;ArrayOfInvalidOrderIDs&lt;/CODE&gt;&lt;/EM&gt;) for later filtering and analysis steps.&lt;/P&gt;
&lt;P&gt;The next figure shows a sample verification email produced by this pipeline. It illustrates the three-part structure: an HTML validation summary table, the raw invalid order ID list, and the extracted invalid CSV rows:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;
&lt;P class="lia-align-center"&gt;&lt;STRONG&gt;Figure: Sample verification email — validation summary table + invalid order IDs + invalid CSV rows.&lt;/STRONG&gt;&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;The extracted artifacts &lt;CODE&gt;InvalidOrderIds&lt;/CODE&gt; and Invalid CSV payload are used in the downstream actions that persist failed rows as IDocs for later processing, which were presented in &lt;STRONG&gt;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/logic-apps-agentic-workflows-with-sap---part-1-infrastructure/4491906" target="_blank" rel="noopener" data-lia-auto-title="Part 1" data-lia-auto-title-active="0"&gt;Part 1&lt;/A&gt;&lt;/STRONG&gt;. I will get back to this later to talk about reusing the validation agent. Next however I will go over the data analysis part of the AI integration.&lt;/P&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;3. Analysis Phase: from validated dataset to HTML output&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;After the validation agent loop finishes, the workflow enters a second AI phase: &lt;EM&gt;analysis&lt;/EM&gt;. The validation phase is deliberately about correctness (what to exclude and why). The analysis phase is about insight, and it runs on the remaining dataset after invalid rows are filtered out.&lt;/P&gt;
&lt;P&gt;At a high level, this phase has three steps:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Call Azure OpenAI to analyze the CSV dataset while explicitly excluding invalid &lt;CODE&gt;OrderIDs&lt;/CODE&gt;.&lt;/LI&gt;
&lt;LI&gt;Extract the model’s text output from the OpenAI response object.&lt;/LI&gt;
&lt;LI&gt;Convert the model’s markdown output into HTML so it renders cleanly in email (and in the SAP response envelope).&lt;/LI&gt;
&lt;/OL&gt;
&lt;H4&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;3.1 OpenAI component: the “Analyze data” call&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;The figure below shows the &lt;EM&gt;Analyze data&lt;/EM&gt; action that drives the analysis phase. This action is executed after the Data Validation Agent completes, and it uses three messages: a system instruction that defines the task, the CSV dataset as input, and a second user message that enumerates the &lt;CODE&gt;OrderIDs&lt;/CODE&gt; to exclude (the invalid IDs produced by validation).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;
&lt;P class="lia-align-center"&gt;&lt;STRONG&gt;Figure: Azure OpenAI analysis call.&lt;/STRONG&gt;&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;The analysis call is structured as:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;system: define the task and constraints&lt;/LI&gt;
&lt;LI&gt;user: provide the dataset&lt;/LI&gt;
&lt;LI&gt;user: provide exclusions derived from validation&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI-CODE lang=""&gt;system: Analyze dataset; provide trends/predictions; exclude specified orderids.
user:   &amp;lt;csv payload=""&amp;gt;
user:   Excluded orderids: &amp;lt;comma-separated ids="" invalid=""&amp;gt;&amp;lt;/comma-separated&amp;gt;&amp;lt;/csv&amp;gt;&lt;/LI-CODE&gt;
&lt;P&gt;Two design choices are doing most of the work here:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;EM&gt;The model is given the dataset and the exclusions separately. &lt;/EM&gt;This avoids ambiguity: the dataset is one message, and the “do not include these &lt;CODE&gt;OrderIDs&lt;/CODE&gt;” constraint is another.&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;The exclusion list is derived from validation output, not re-discovered during analysis. &lt;/EM&gt;The analysis step doesn’t re-validate; it consumes the validation phase’s results and focuses purely on trends/predictions.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H4&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;3.2 Processing the response&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;The next figure shows how the workflow turns the Azure OpenAI response into a single string that can be reused for email and for the SAP response. The workflow does three things in sequence: it parses the response JSON, extracts the model’s text content, and then passes that text into an HTML formatter.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;
&lt;P class="lia-align-center"&gt;&lt;STRONG&gt;Figure: Processing the OpenAI response.&lt;/STRONG&gt;&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;This is the only part of the OpenAI response you need to understand for this workflow:&lt;/P&gt;
&lt;LI-CODE lang=""&gt;Analyze_data response
└─ choices[]                    (array)
   └─ [0]                        (object)
      └─ message                 (object)
         └─ content              (string)   &amp;lt;-- analysis text
&lt;/LI-CODE&gt;
&lt;P&gt;Everything else in the OpenAI response (filters, indexes, metadata) is useful for auditing but not required to build the final user-facing output.&lt;/P&gt;
&lt;H4&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;3.3 Crafting the output to HTML&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;The model’s output is plain text and often includes lightweight markdown structures (headings, lists, separators). To make the analysis readable in email (and safe to embed in the SAP response envelope), the workflow converts the markdown into HTML. The script was generated with copilot. Source code snippet may be found in &lt;STRONG&gt;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/logic-apps-agentic-workflows-with-sap---part-1-infrastructure/4491906" target="_blank" rel="noopener" data-lia-auto-title="Part 1" data-lia-auto-title-active="0"&gt;Part 1&lt;/A&gt;&lt;/STRONG&gt;. The next figure shows what the formatted analysis looks like when rendered. Not the explicit r&lt;SPAN style="color: rgb(30, 30, 30);"&gt;eference to the excluded &lt;CODE&gt;OrderIDs&lt;/CODE&gt; and summary of the remaining dataset before listing trend observations.&lt;/SPAN&gt;&lt;/P&gt;
&lt;img&gt;
&lt;P class="lia-align-center"&gt;&lt;STRONG&gt;Figure: Example analysis output after formatting.&lt;/STRONG&gt;&lt;/P&gt;
&lt;/img&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;4. Closing the loop: persisting invalid rows as IDocs&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;In &lt;STRONG&gt;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/logic-apps-agentic-workflows-with-sap---part-1-infrastructure/4491906" target="_blank" rel="noopener" data-lia-auto-title="Part 1" data-lia-auto-title-active="0"&gt;Part 1&lt;/A&gt;&lt;/STRONG&gt;, I introduced an optional remediation branch: when validation finds bad rows, the workflow can persist them into SAP as&amp;nbsp;&lt;STRONG&gt;custom IDocs&lt;/STRONG&gt; for later handling. In &lt;STRONG&gt;Part 2&lt;/STRONG&gt;, after unpacking the agent loop, I want to reconnect those pieces and show the “end of the story”: the destination workflow creates IDocs for invalid data, and a second destination workflow receives those IDocs and produces a consolidated audit trail in Blob Storage.&lt;/P&gt;
&lt;P&gt;This final section is intentionally pragmatic. It shows:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;where the IDoc creation call happens,&lt;/LI&gt;
&lt;LI&gt;how the created IDocs arrive downstream,&lt;/LI&gt;
&lt;LI&gt;and how to safely handle &lt;EM&gt;many concurrent workflow instances &lt;/EM&gt;writing to the same storage artifact (one instance per IDoc).&lt;/LI&gt;
&lt;/UL&gt;
&lt;H4&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;4.1 From “verification summary” to “Create all IDocs”&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;The figure below shows the tail end of the verification summary flow. Once the agent produces the structured validation outputs, the workflow first emails the human-readable summary, then converts the invalid CSV rows into an SAP-friendly XML shape, and finally calls the RFC that creates IDocs from those rows.&lt;/P&gt;
&lt;img&gt;
&lt;P class="lia-align-center"&gt;&lt;STRONG&gt;Figure: End of the validation/remediation branch.&lt;/STRONG&gt;&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;This is deliberately a “handoff point.” After this step, the invalid rows are no longer just text in an email—they become durable SAP artifacts (IDocs) that can be routed, retried, and processed independently of the original workflow run.&lt;/P&gt;
&lt;H4&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;&lt;CODE&gt;&lt;SPAN class="lia-text-color-15"&gt;4.2 &lt;/SPAN&gt;Z_CREATE_ONLINEORDER_IDOC&lt;/CODE&gt; and the downstream receiver&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;The next figure is the same overview from &lt;STRONG&gt;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/logic-apps-agentic-workflows-with-sap---part-1-infrastructure/4491906" target="_blank" rel="noopener" data-lia-auto-title="Part 1" data-lia-auto-title-active="0"&gt;Part 1&lt;/A&gt;&lt;/STRONG&gt;. I’m reusing it here because it captures the full loop: the workflow calls &lt;CODE&gt;Z_CREATE_ONLINEORDER_IDOC&lt;/CODE&gt;, SAP converts the invalid rows into custom IDocs, and Destination workflow #2 receives those IDocs asynchronously (one workflow run per IDoc).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;
&lt;P class="lia-align-center"&gt;&lt;STRONG&gt;Figure 2: Invalid rows persisted as custom IDocs.&lt;/STRONG&gt;&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;This pattern is intentionally modular:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Destination workflow #1 decides which rows are invalid and optionally persists them.&lt;/LI&gt;
&lt;LI&gt;SAP encapsulates the IDoc creation mechanics behind a stable RFC (&lt;CODE&gt;Z_CREATE_ONLINEORDER_IDOC&lt;/CODE&gt;).&lt;/LI&gt;
&lt;LI&gt;Destination workflow #2 processes each incoming IDoc independently, which matches how IDoc-driven integrations typically behave in production.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H4&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;4.3 Two phases in Destination workflow #2: AI agent + Blob Storage logging&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;In the receiver workflow, there are two distinct phases:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;AI agent phase (per-IDoc):&lt;/STRONG&gt; reconstruct a CSV view from the incoming IDoc payload and (optionally) run the same validation logic.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Blob storage phase (shared output):&lt;/STRONG&gt; append a normalized “verification line” into a shared blob in a concurrency-safe way.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;It’s worth calling out: in &lt;EM&gt;this demo&lt;/EM&gt;, the IDocs being received were created from already-validated outputs upstream, so you could argue the second validation is redundant. I keep it anyway for two reasons:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;it demonstrates that the agent tooling is reusable with minimal changes, and&lt;/LI&gt;
&lt;LI&gt;in a general integration, Destination workflow #2 may receive IDocs from multiple sources, not only from this pipeline—so “validate on receipt” can still be valuable.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;4.3.1 AI agent phase&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;The figure below shows the validation agent used in Destination workflow #2. The key difference from the earlier agent loop is the output format: instead of producing an HTML summary + invalid lists, this agent writes a single “audit line” that includes the IDoc correlation key (&lt;CODE&gt;DOCNUM&lt;/CODE&gt;) along with the order ID and the failed rules.&lt;/P&gt;
&lt;img&gt;
&lt;P class="lia-align-center"&gt;&lt;STRONG&gt;Figure: Destination workflow #2 agent configuration.&lt;/STRONG&gt;&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;The reusable part here is the&amp;nbsp;tooling structure: rules still come from the same validation document, the dataset is still supplied as CSV, and the summarization tool outputs a structured value the workflow can consume deterministically. The only meaningful change is “what shape do I want the output to take,” which is exactly what the agent parameter descriptions control.&lt;/P&gt;
&lt;P&gt;The next figure zooms in on the summarization tool parameter in Destination workflow #2. Instead of three outputs, this tool uses a single parameter (&lt;CODE&gt;VerificationInfo&lt;/CODE&gt;) whose description forces a consistent line format anchored on &lt;CODE&gt;DOCNUM&lt;/CODE&gt;.&lt;/P&gt;
&lt;img&gt;
&lt;P class="lia-align-center"&gt;&lt;STRONG&gt;Figure 4: &lt;CODE&gt;VerificationInfo&lt;/CODE&gt; parameter.&lt;/STRONG&gt;&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;This is the same design principle as Tool #3 in the first destination workflow: describe the output as a contract, not as a vague request. The parameter description tells the agent exactly what must be present (&lt;CODE&gt;DOCNUM&lt;/CODE&gt; + &lt;CODE&gt;OrderId&lt;/CODE&gt; + failed rules) and therefore makes it straightforward to append the output to a shared log without additional parsing.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Interesting snippets&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Extracting &lt;CODE&gt;DOCNUM&lt;/CODE&gt;&amp;nbsp;from the IDoc control record and carry it through the run:&lt;/P&gt;
&lt;LI-CODE lang="xml"&gt;xpath(xml(triggerBody()?['content']),
  'string(/*[local-name()="Receive"]
           /*[local-name()="idocData"]
           /*[local-name()="EDI_DC40"]
           /*[local-name()="DOCNUM"])')&lt;/LI-CODE&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;4.3.2 Blob Storage phase&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;Destination workflow #2 runs one instance per inbound IDoc. That means multiple runs can execute at the same time, all trying to write to the same “&lt;CODE&gt;ValidationErrorsYYYYMMDD.txt&lt;/CODE&gt;” artifact. The figure below shows the resulting appended output: one line per IDoc, each line beginning with &lt;CODE&gt;DOCNUM&lt;/CODE&gt;, which becomes the stable correlation key.&lt;/P&gt;
&lt;P&gt;&lt;IMG src="data:image/png;base64,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" alt="" /&gt;&lt;/P&gt;
&lt;P&gt;Destination workflow #2 runs one instance per inbound IDoc, so multiple instances can attempt to write to the same daily “validation errors” append blob at the same time. The figure below shows the concurrency control pattern I used to make those writes safe: a short &lt;STRONG&gt;l&lt;/STRONG&gt;ease acquisition loop that retries until it owns the blob lease, then appends the verification line(s), and finally releases the lease.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;
&lt;P class="lia-align-center"&gt;&lt;STRONG&gt;Figure: Concurrency-safe append pattern.&lt;/STRONG&gt;&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;Reading the diagram top‑to‑bottom, the workflow uses a simple&amp;nbsp;lease → append → release pattern to make concurrent writes safe. Each instance waits briefly (Delay), attempts to acquire a blob lease (Acquire validation errors blob lease), and loops until it succeeds (Set status code → Until lease is acquired). Once a lease is obtained, the workflow stores the lease ID (Save lease id), appends its verification output under that lease (Append verification results), and then releases the lease (Release the lease) so the next workflow instance can write.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Implementation note:&lt;/STRONG&gt; the complete configuration for this concurrency pattern (including the HTTP actions, headers, retries, and loop conditions) is included in the attached artifacts, in the workflow JSON for Destination workflow #2.&lt;/P&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;5. Concluding remarks&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;STRONG&gt;Part 2&lt;/STRONG&gt; zoomed in on the AI boundary inside the destination workflows and made it concrete: &lt;EM&gt;what the agent sees, what it is allowed to do, what it must return, and how those outputs drive deterministic workflow actions&lt;/EM&gt;.&lt;/P&gt;
&lt;P&gt;The practical outcomes of &lt;STRONG&gt;Part 2&lt;/STRONG&gt; are:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;A tool-driven validation agent that produces workflow artifacts, not prose.&lt;/STRONG&gt;&lt;BR /&gt;The validation loop is constrained by tools and parameter schemas so its outputs are immediately consumable: an email-friendly validation summary, a machine-friendly &lt;CODE&gt;InvalidOrderIds&lt;/CODE&gt; list, and an invalid-row payload that can be remediated.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;A clean separation between validation and analysis.&lt;/STRONG&gt;&lt;BR /&gt;Validation decides &lt;EM&gt;what not to trust&lt;/EM&gt; (invalid IDs / rows) and analysis focuses on &lt;EM&gt;what is interesting&lt;/EM&gt; in the remaining dataset. The analysis prompt makes the exclusion rule explicit by passing the dataset and excluded IDs as separate messages.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;A repeatable response-processing pipeline.&lt;/STRONG&gt;&lt;BR /&gt;You extract the model’s text from a stable response path (&lt;CODE&gt;choices[0].message.content&lt;/CODE&gt;), then shape it into HTML once (markdown → HTML) so the same formatted output can be reused for email and the SAP response envelope.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;A “reuse with minimal changes” pattern across workflows.&lt;/STRONG&gt;&lt;BR /&gt;Destination workflow #2 shows the same agent principles applied to IDoc reception, but with a different output contract optimized for logging: &lt;CODE&gt;DOCNUM&lt;/CODE&gt; + &lt;CODE&gt;OrderId&lt;/CODE&gt; + &lt;CODE&gt;FailedRules&lt;/CODE&gt;. This demonstrates that the real reusable asset is the &lt;EM&gt;tool + parameter contract design.&lt;/EM&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H4&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;Putting It All Together&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;We have a full integration story where&lt;STRONG&gt; &lt;/STRONG&gt;SAP, Logic Apps, AI, and IDocs are connected with explicit contracts and predictable behavior:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/logic-apps-agentic-workflows-with-sap---part-1-infrastructure/4491906" target="_blank" rel="noopener" data-lia-auto-title="Part 1" data-lia-auto-title-active="0"&gt;Part 1&lt;/A&gt; established the deterministic integration foundation.&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;SAP ↔ Logic Apps connectivity (gateway/program wiring)&lt;/LI&gt;
&lt;LI&gt;RFC payload/response contracts (&lt;CODE&gt;IT_CSV&lt;/CODE&gt;, response envelope, error semantics)&lt;/LI&gt;
&lt;LI&gt;predictable exception propagation back into SAP&lt;/LI&gt;
&lt;LI&gt;an optional remediation branch that persists invalid rows as IDocs via a custom RFC (&lt;CODE&gt;Z_CREATE_ONLINEORDER_IDOC&lt;/CODE&gt;)&lt;/LI&gt;
&lt;LI&gt;and the end-to-end response handling pattern in the caller workflow.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;&lt;STRONG&gt;Part 2&lt;/STRONG&gt; layered AI on top without destabilizing the contracts.&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;Agent loop + tools for rule retrieval and validation&lt;/LI&gt;
&lt;LI&gt;output schemas that convert “reasoning” into workflow artifacts&lt;/LI&gt;
&lt;LI&gt;a separate analysis step that consumes validated data and produces formatted results&lt;/LI&gt;
&lt;LI&gt;and an asynchronous IDoc receiver that logs outcomes safely under concurrency.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;The reason it works as a two-part series is that the two layers evolve at different speeds:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;EM&gt;The integration layer (&lt;STRONG&gt;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/logic-apps-agentic-workflows-with-sap---part-1-infrastructure/4491906" target="_blank" rel="noopener" data-lia-auto-title="Part 1" data-lia-auto-title-active="0"&gt;Part 1&lt;/A&gt;&lt;/STRONG&gt;) should change slowly. &lt;/EM&gt;It defines interoperability: payload shapes, RFC names, error contracts, and IDoc interfaces.&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;The AI layer (&lt;STRONG&gt;Part 2&lt;/STRONG&gt;) is expected to iterate. &lt;/EM&gt;Prompts, rule documents, output formatting, and agent tool design will evolve as you tune behavior and edge cases.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;References&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/logic-apps-agentic-workflows-with-sap---part-1-infrastructure/4491906" target="_blank" rel="noopener" data-lia-auto-title="Logic Apps Agentic Workflows with SAP - Part 1: Infrastructure" data-lia-auto-title-active="0"&gt;Logic Apps Agentic Workflows with SAP - Part 1: Infrastructure&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/%F0%9F%A4%96-agent-loop-demos-%F0%9F%A4%96/4414770" target="_blank" rel="noopener"&gt;🤖 Agent Loop Demos 🤖 | Microsoft Community Hub&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/agent-workflows-concepts" target="_blank" rel="noopener"&gt;Agent Workflows Concepts&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/agent-workflows-concepts?tabs=standard" target="_blank" rel="noopener"&gt;Workflows with AI Agents and Models - Azure Logic Apps&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/connectors/built-in/reference/openai/" target="_blank" rel="noopener"&gt;Built-in OpenAI Connector&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/ai-foundry/how-to/connections-add?view=foundry-classic" target="_blank" rel="noopener"&gt;How to connect to AI foundry&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/logic-apps/create-autonomous-agent-workflows?tabs=consumption" target="_blank" rel="noopener"&gt;Create Autonomous AI Agent Workflows - Azure Logic Apps&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/handling-errors-in-sap-bapi-transactions/1909185" target="_blank" rel="noopener" data-lia-auto-title="Handling Errors in SAP BAPI Transactions" data-lia-auto-title-active="0"&gt;Handling Errors in SAP BAPI Transactions&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/logic-apps/connectors/sap?tabs=standard" target="_blank" rel="noopener"&gt;Access SAP from workflows&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/logic-apps/connectors/sap-create-example-scenario-workflows?tabs=standard" target="_blank" rel="noopener"&gt;Create common SAP workflows&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/logic-apps/connectors/sap-generate-schemas-for-artifacts?tabs=standard" target="_blank" rel="noopener"&gt;Generate Schemas for SAP Artifacts via Workflows&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/abenabap_exceptions.html" target="_blank" rel="noopener"&gt;Exception Handling | ABAP Keyword Documentation&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abenhandl_prop_except_guidl.htm" target="_blank" rel="noopener"&gt;Handling and Propagating Exceptions - ABAP Keyword Documentation&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.sap.com/content/dam/support/en_us/library/ssp/products/connectors/msnet/NCo31_Overview.pdf" target="_blank" rel="noopener"&gt;SAP .NET Connector 3.1 Overview&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.sap.com/content/dam/support/en_us/library/ssp/products/connectors/msnet/NCo31_ProgrammingGuide.pdf" target="_blank" rel="noopener"&gt;SAP .NET Connector 3.1 Programming Guide&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/logic-apps/connectors/azure-ai" target="_blank" rel="noopener"&gt;Connect to Azure AI services from Workflows&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;All supporting content for this post may be found in the&amp;nbsp;&lt;A class="lia-external-url" href="https://github.com/Azure/logicapps/tree/master/agentic-sap-workflows" target="_blank" rel="noopener"&gt;companion GitHub repository.&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 23 Feb 2026 07:15:00 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/logic-apps-agentic-workflows-with-sap-part-2-ai-agents/ba-p/4492362</guid>
      <dc:creator>Emmanuel_Abram_Profeta</dc:creator>
      <dc:date>2026-02-23T07:15:00Z</dc:date>
    </item>
    <item>
      <title>Logic Apps Agentic Workflows with SAP - Part 1: Infrastructure</title>
      <link>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/logic-apps-agentic-workflows-with-sap-part-1-infrastructure/ba-p/4491906</link>
      <description>&lt;P&gt;When you integrate Azure Logic Apps with SAP, the “hello world” part is usually easy. The part that bites you later is data quality. In SAP-heavy flows, validation isn’t a nice-to-have — it’s what makes the downstream results meaningful. If invalid data slips through, it can get expensive fast: you may create incorrect business documents, trigger follow-up processes&lt;STRONG&gt;,&lt;/STRONG&gt; and end up in a cleanup path that’s harder (and more manual) than building validation upfront. And in “all-or-nothing” transactional patterns, things get even more interesting: one bad record can force a rollback strategy, compensating actions, or a whole replay/reconciliation story you didn’t want to own. See for instance &lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/handling-errors-in-sap-bapi-transactions/1909185" target="_blank" rel="noopener"&gt;Handling Errors in SAP BAPI Transactions | Microsoft Community Hub&lt;/A&gt; to get an idea of the complexity in a BizTalk context.&lt;/P&gt;
&lt;P&gt;That’s the motivation for this post:&amp;nbsp;a practical starter pattern that you can adapt to many data shapes and domains for validating data in a Logic Apps + SAP integration.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-background-color-16" border="1" style="width: 100%; height: 34.8px; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 99.9074%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 34.8px;"&gt;&lt;td style="height: 34.8px;"&gt;&lt;STRONG&gt;Note: For the full set of assets used here, see the &lt;A class="lia-external-url" href="https://github.com/Azure/logicapps/tree/master/agentic-sap-workflows" target="_blank" rel="noopener"&gt;companion GitHub repository&lt;/A&gt; (workflows, schemas, SAP ABAP code, and sample files).&lt;/STRONG&gt;&amp;nbsp;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;1. Introduction&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;H5&gt;&lt;STRONG&gt;Scenario overview&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;The scenario is intentionally simple, but it mirrors what shows up in real systems:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;A Logic App workflow sends CSV documents to an SAP endpoint.&lt;/LI&gt;
&lt;LI&gt;SAP forwards the payload to a second Logic App workflow that performs:
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;rule-based validation&lt;/STRONG&gt; (based on pre-defined rules)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;analysis/enrichment&lt;/STRONG&gt; (market trends, predictions, recommendations)&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;The workflow either:
&lt;UL&gt;
&lt;LI&gt;returns validated results (or validation errors) to the initiating workflow, or&lt;/LI&gt;
&lt;LI&gt;persists outputs for later use&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;For illustration, I’m using fictitious retail data. The content is made up, but the mechanics are generic: the same approach works for orders, inventory, pricing, master data feeds, or any “file in → decision out” integration. You’ll see sample inputs and outputs below to keep the transformations concrete.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;&lt;STRONG&gt;Figure: Input CSV data and corresponding rules&lt;/STRONG&gt;&lt;/img&gt;
&lt;P class="lia-align-center lia-clear-both"&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;&lt;STRONG&gt;Figure: Outputs - Analysis of trends and predictions, validation summary and IDoc information.&lt;/STRONG&gt;&lt;/img&gt;
&lt;H5&gt;&lt;STRONG&gt;What this post covers&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;This walkthrough focuses on the integration building blocks that tend to matter in production:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Calling SAP RFCs from Logic App workflows, and invoking Logic App workflows from SAP function modules&lt;/LI&gt;
&lt;LI&gt;Using the Logic Apps SAP built-in trigger&lt;/LI&gt;
&lt;LI&gt;Receiving and processing IDocs&lt;/LI&gt;
&lt;LI&gt;Returning responses and exceptions back to SAP in a structured, actionable way&lt;/LI&gt;
&lt;LI&gt;Data manipulation patterns in Logic Apps, including:
&lt;UL&gt;
&lt;LI&gt;parsing and formatting&lt;/LI&gt;
&lt;LI&gt;inline scripts&lt;/LI&gt;
&lt;LI&gt;XPath (where it fits, and where it becomes painful).&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;SPAN class="lia-text-color-21"&gt;&lt;STRONG&gt;Overall Implementation&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H5&gt;
&lt;P&gt;A high-level view of the implementation is shown below. The source workflow handles end-to-end ingestion—file intake, transformation, SAP integration, error handling, and notifications—using Azure Logic Apps. The destination workflows focus on validation and downstream processing, including AI-assisted analysis and reporting, with robust exception handling across multiple technologies. I’ll cover the AI portion in a follow-up post.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;&lt;STRONG&gt;Figure: Overall implementation.&lt;BR /&gt;&lt;/STRONG&gt;&lt;/img&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-background-color-16" border="1" style="width: 100%; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 99.9074%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;Note on AI-assisted development&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Most of the workflow “glue” in this post—XPath, JavaScript snippets, and Logic Apps expressions—was built with help from Copilot and the AI assistant in the designer (see &lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/workflow-assistant-standard" target="_blank" rel="noopener"&gt;Get AI-assisted help for Standard workflows - Azure Logic Apps | Microsoft Learn&lt;/A&gt;). In my experience, this is exactly where AI assistance pays off: generating correct scaffolding quickly, then iterating based on runtime behavior.&lt;/P&gt;
&lt;P&gt;I’ve also included SAP ABAP snippets for the SAP-side counterpart. You don’t need advanced ABAP knowledge to follow along; the snippets are deliberately narrow and integration-focused. I include them because it’s hard to design robust integrations if you only understand one side of the contract. When you understand how SAP expects to receive data, how it signals errors, and where transactional boundaries actually are, you end up with cleaner workflows and fewer surprises.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;2. Source Workflow&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;This workflow is a small, end‑to‑end “sender” pipeline: it reads a CSV file from Azure Blob Storage, converts the rows into the SAP table‑of‑lines XML shape expected by an RFC, calls &lt;CODE&gt;Z_GET_ORDERS_ANALYSIS&lt;/CODE&gt; via the SAP connector, then extracts analysis or error details from the RFC response and emails a single consolidated result. &lt;STRONG&gt;&lt;EM&gt;The name of the data file is a parameter of the logic app.&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;At a high level:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Input&lt;/STRONG&gt;: an HTTP request (used to kick off the run) + a blob name.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Processing&lt;/STRONG&gt;: CSV → array of rows → XML (…) → RFC call&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Output&lt;/STRONG&gt;: one email containing either:
&lt;UL&gt;
&lt;LI&gt;the analysis (success path), or&lt;/LI&gt;
&lt;LI&gt;a composed error summary (failure path).&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The diagram below summarizes the sender pipeline:&amp;nbsp;HTTP trigger → Blob CSV (header included) → rows → SAP RFC → parse response → email.&lt;/P&gt;
&lt;img&gt;&lt;STRONG&gt;Figure: End‑to‑end sender pipeline&lt;/STRONG&gt;&lt;/img&gt;
&lt;P&gt;Two design choices are doing most of the work here. First, the workflow keeps the CSV transport contract stable by sending the file as a verbatim list of lines—including the header—wrapped into &lt;CODE&gt;… &lt;/CODE&gt;elements under&amp;nbsp;&lt;CODE&gt;IT_CSV&lt;/CODE&gt;. Second, it treats the RFC response as the source of truth: &lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt; and &lt;CODE&gt;RETURN/MESSAGE&lt;/CODE&gt; drive a single &lt;CODE&gt;Has errors&lt;/CODE&gt; gate, which determines whether the email contains the analysis or a consolidated failure summary.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Step-by-step description&lt;/STRONG&gt;&lt;/H5&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-background-color-16 lia-border-style-outset" border="2" style="width: 100%; border-width: 2px;"&gt;&lt;colgroup&gt;&lt;col /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="border-width: 2px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Phase 0 — Trigger&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Trigger &lt;/STRONG&gt;— &lt;CODE&gt;When_an_HTTP_request_is_received&lt;/CODE&gt;&lt;BR /&gt;The workflow is invoked via an HTTP request trigger (stateful workflow).&lt;/LI&gt;
&lt;/OL&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-width: 2px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Phase 1 — Load and split the CSV&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Read file&lt;/STRONG&gt; — &lt;CODE&gt;Read_CSV_orders_from_blob&lt;/CODE&gt;&lt;BR /&gt;Reads the CSV from container onlinestoreorders using the blob name from @parameters('DataFileName'). &lt;EM&gt;The name of the data file is a parameter of the logic app.&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Split into rows &lt;/STRONG&gt;— &lt;CODE&gt;Extract_rows&lt;/CODE&gt;&lt;BR /&gt;Splits the blob content on \r\n, producing an array of CSV lines.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Design note: Keeping the header row is useful when downstream validation or analysis wants column names, and it avoids implicit assumptions in the sender workflow.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-width: 2px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Phase 2 — Shape the RFC payload&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Convert CSV rows to SAP XML &lt;/STRONG&gt;— &lt;CODE&gt;Transform_CSV_to_XML&lt;/CODE&gt;&lt;BR /&gt;Uses JavaScript to wrap each CSV row (including the header line)&amp;nbsp;into the SAP line structure and XML‑escape special characters. The output is an XML fragment representing a table of &lt;CODE&gt;ZTY_CSV_LINE&lt;/CODE&gt; rows.&lt;/LI&gt;
&lt;/OL&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-width: 2px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Phase 3 — Call SAP and extract response fields&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Call the RFC &lt;/STRONG&gt;— [RFC]_&lt;CODE&gt;Z_GET_ORDERS_ANALYSIS&lt;/CODE&gt;&lt;BR /&gt;Invokes &lt;CODE&gt;Z_GET_ORDERS_ANALYSIS&lt;/CODE&gt; with an XML body containing … built from the transformed rows. &lt;EM&gt;Note that a &amp;lt;DEST&amp;gt;...&amp;lt;/DEST&amp;gt; element can also be provided to override the default value in the function module definition.&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Extract error/status &lt;/STRONG&gt;— &lt;CODE&gt;Save_EXCEPTION_message&lt;/CODE&gt; and &lt;CODE&gt;Save_RETURN_message&lt;/CODE&gt;&lt;BR /&gt;Uses XPath to pull:
&lt;UL&gt;
&lt;LI&gt;&lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt; from the RFC response, and&lt;/LI&gt;
&lt;LI&gt;the structured &lt;CODE&gt;RETURN&lt;/CODE&gt;/&lt;CODE&gt;MESSAGE&lt;/CODE&gt; field.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-width: 2px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Phase 4 — Decide success vs failure and notify&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Initialize output buffer &lt;/STRONG&gt;— &lt;CODE&gt;Initialize_email_body&lt;/CODE&gt;&lt;BR /&gt;Creates the EmailBody variable used by both success and failure cases.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Gate &lt;/STRONG&gt;— &lt;CODE&gt;Has_errors&lt;/CODE&gt;&lt;BR /&gt;Determines whether to treat the run as failed based on:
&lt;UL&gt;
&lt;LI&gt;&lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt; being different from "ok", &lt;STRONG&gt;or&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;CODE&gt;RETURN&lt;/CODE&gt;/&lt;CODE&gt;MESSAGE&lt;/CODE&gt; being non‑empty.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Send result — Send_an_email_(V2)&lt;/STRONG&gt;&lt;BR /&gt;Emails either:
&lt;UL&gt;
&lt;LI&gt;the extracted &lt;CODE&gt;ANALYSIS&lt;/CODE&gt; (success), or&lt;/LI&gt;
&lt;LI&gt;a concatenated error summary including &lt;CODE&gt;RETURN&lt;/CODE&gt;/&lt;CODE&gt;MESSAGE&lt;/CODE&gt; plus message details (&lt;CODE&gt;MESSAGE_V1&lt;/CODE&gt;…&lt;CODE&gt;MESSAGE_V4&lt;/CODE&gt;) and &lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&lt;STRONG&gt;Note&lt;/STRONG&gt;: Because the header row is included in &lt;CODE&gt;IT_CSV&lt;/CODE&gt;, the SAP-side parsing/validation treats the first line as column titles (or simply ignores it). The sender workflow stays “schema-agnostic” by design.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Useful snippets&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;&lt;STRONG&gt;Snippet 1 — Split the CSV into rows&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="xquery"&gt;split(string(body('Read_CSV_orders_from_blob')?['content']), '\r\n') 

Tip: If your CSV has a header row you don’t want to send to SAP, switch back to: 
@skip(split(string(body('Read_CSV_orders_from_blob')?['content']), '\r\n'), 1)&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Snippet 2 — JavaScript transform: “rows → SAP table‑of‑lines XML”&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="javascript"&gt;const lines = workflowContext.actions.Extract_rows.outputs;

function xmlEscape(value) {
  return String(value)
    .replace(/&amp;amp;/g, "&amp;amp;")
    .replace(//g, "&amp;gt;")
    .replace(/"/g, """)
    .replace(/'/g, "'");
}

// NOTE: we don't want to keep empty lines (which can be produced by reading the blobs)
// the reason being that if the recipient uses a schema to validate the xml,
// it may reject it if it does not allow empty nodes.
const xml = lines
  .filter(line =&amp;gt; line &amp;amp;&amp;amp; line.trim() !== '') // keep only non-empty lines
  .map(line =&amp;gt; `&amp;lt;zty_csv_line&amp;gt;&amp;lt;line&amp;gt;${xmlEscape(line)}&amp;lt;/line&amp;gt;&amp;lt;/zty_csv_line&amp;gt;`)
  .join('');

  return { xml };&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Snippet 3 — XPath extraction of response fields (namespace-robust)&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="xquery"&gt;EXCEPTIONMSG: 
@xpath(body('[RFC]_Call_Z_GET_ORDERS_ANALYSIS')?['content'], 'string(
  /*[local-name()="Z_GET_ORDERS_ANALYSISResponse"]
  /*[local-name()="EXCEPTIONMSG"])') 

RETURN/MESSAGE: 
@xpath(body('[RFC]_Call_Z_GET_ORDERS_ANALYSIS')?['content'], 'string(
/*[local-name()="Z_GET_ORDERS_ANALYSISResponse"]
/*[local-name()="RETURN"]
/*[local-name()="MESSAGE"])')&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;Snippet 4 — Failure email body composition&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="xquery"&gt;concat(
  'Error message: ', outputs('Save_RETURN_message'), ', details: ',
  xpath(body('[RFC]_Call_Z_GET_ORDERS_ANALYSIS')?['content'], 'string(//*[local-name()=\"MESSAGE_V1\"])'),
  xpath(body('[RFC]_Call_Z_GET_ORDERS_ANALYSIS')?['content'], 'string(//*[local-name()=\"MESSAGE_V2\"])'),
  xpath(body('[RFC]_Call_Z_GET_ORDERS_ANALYSIS')?['content'], 'string(//*[local-name()=\"MESSAGE_V3\"])'),
  xpath(body('[RFC]_Call_Z_GET_ORDERS_ANALYSIS')?['content'], 'string(//*[local-name()=\"MESSAGE_V4\"])'),
  '; ',
  'Exception message: ', outputs('Save_EXCEPTION_message'), '.')&lt;/LI-CODE&gt;
&lt;H3&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-15"&gt;3. SAP Support&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;To make the SAP/Logic Apps boundary simple, I model the incoming CSV as a table of “raw lines” on the SAP side. The function module &lt;CODE&gt;Z_GET_ORDERS_ANALYSIS&lt;/CODE&gt; exposes a single table parameter, &lt;CODE&gt;IT_CSV&lt;/CODE&gt;, typed using a custom line structure.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;
&lt;P class="lia-align-center"&gt;Figure: &lt;CODE&gt;IT_CSV&lt;/CODE&gt; is a table of CSV lines (&lt;CODE&gt;ZTY_CSV_LINE&lt;/CODE&gt;), with a single &lt;CODE&gt;LINE&lt;/CODE&gt; field (&lt;CODE&gt;CHAR2048&lt;/CODE&gt;).&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;&lt;CODE&gt;IT_CSV&lt;/CODE&gt; uses the custom structure &lt;CODE&gt;ZTY_CSV_LINE&lt;/CODE&gt;, which contains a single component &lt;CODE&gt;LINE&lt;/CODE&gt; (&lt;CODE&gt;CHAR2048&lt;/CODE&gt;). This keeps the SAP interface stable: the workflow can send CSV lines without SAP having to know the schema up front, and the parsing/validation logic can evolve independently.&lt;/P&gt;
&lt;P&gt;The diagram below shows the plumbing that connects SAP to Azure Logic Apps in two common patterns: SAP sending IDocs to a workflow and SAP calling a remote-enabled endpoint via an RFC destination. I’m showing all three pieces together—the ABAP call site, the &lt;CODE&gt;SM59&lt;/CODE&gt; RFC destination, and the Logic Apps SAP built-in trigger—because most “it doesn’t work” problems come down to a small set of mismatched configuration values rather than workflow logic.&lt;/P&gt;
&lt;img&gt;&lt;STRONG&gt;Figure: SAP-to-Logic Apps wiring for inbound IDocs and RFC callbacks&lt;/STRONG&gt;&lt;/img&gt;
&lt;P&gt;&lt;STRONG&gt;The key takeaway&lt;/STRONG&gt; is that both patterns hinge on the same contract:&amp;nbsp;Program ID plus the SAP Gateway host/service. In SAP, those live in &lt;CODE&gt;SM59&lt;/CODE&gt; (TCP/IP destination, registered server program). In Logic Apps, the SAP built-in trigger listens using the same Program ID and gateway settings, while the trigger configuration (for example, IDoc format and degree of parallelism) controls how messages are interpreted and processed. Once these values line up, the rest of the implementation becomes “normal workflow engineering”: validation, predictable error propagation, and response shaping.&lt;/P&gt;
&lt;P&gt;Before diving into workflow internals, I make the SAP-side contract explicit. The function module interface below shows the integration boundary: CSV lines come in as &lt;CODE&gt;IT_CSV&lt;/CODE&gt;, results come back as &lt;CODE&gt;ANALYSIS&lt;/CODE&gt;, and status/error information is surfaced both as a human-readable &lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt; and as a structured &lt;CODE&gt;RETURN&lt;/CODE&gt; (&lt;CODE&gt;BAPIRET2&lt;/CODE&gt;). I also use a dedicated exception (&lt;CODE&gt;SENDEXCEPTIONTOSAPSERVER&lt;/CODE&gt;) to signal workflow-raised failures cleanly.&lt;/P&gt;
&lt;P&gt;Contract (what goes over RFC):&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Input:&lt;/STRONG&gt; &lt;CODE&gt;IT_CSV&lt;/CODE&gt; (CSV lines)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Outputs:&lt;/STRONG&gt; &lt;CODE&gt;ANALYSIS&lt;/CODE&gt; (analysis payload), &lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt; (human-readable status)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Return structure:&lt;/STRONG&gt; &lt;CODE&gt;RETURN&lt;/CODE&gt; (&lt;CODE&gt;BAPIRET2&lt;/CODE&gt;) for structured SAP-style success/error&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Custom exception:&lt;/STRONG&gt; &lt;CODE&gt;SENDEXCEPTIONTOSAPSERVER&lt;/CODE&gt; for workflow-raised failures&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Here is the ABAP wrapper that calls the remote implementation and normalizes the result.&lt;/P&gt;
&lt;LI-CODE lang="abap"&gt;FUNCTION z_get_orders_analysis.
*"----------------------------------------------------------------------
*" This module acts as a caller wrapper.
*" Important: the remote execution is determined by DESTINATION.
*" Even though the function name is the same, this is not recursion:
*" the call runs in the remote RFC server registered under DESTINATION "DEST".
*"----------------------------------------------------------------------
*" Contract:
*"   TABLES     it_csv        "CSV lines
*"   IMPORTING  analysis      "Result payload
*"   EXPORTING  exceptionmsg  "Human-readable status / error
*"   CHANGING   return        "BAPIRET2 return structure
*"   EXCEPTIONS sendexceptiontosapserver
*"----------------------------------------------------------------------

  CALL FUNCTION 'Z_GET_ORDERS_ANALYSIS' DESTINATION dest
    IMPORTING
      analysis                 = analysis
    TABLES
      it_csv                   = it_csv
    CHANGING
      return                   = return
    EXCEPTIONS
      sendexceptiontosapserver = 1
      system_failure           = 2 MESSAGE exceptionmsg
      communication_failure    = 3 MESSAGE exceptionmsg
      OTHERS                   = 4.

  CASE sy-subrc.
    WHEN 0.
      exceptionmsg = 'ok'.

      "Optional: normalize success into RETURN for callers that ignore EXCEPTIONMSG
      IF return-type IS INITIAL.
        return-type    = 'S'.
        return-message = 'OK'.
      ENDIF.

    WHEN 1.
      exceptionmsg =
        |Exception from workflow: SENDEXCEPTIONTOSAPSERVER { sy-msgv1 }{ sy-msgv2 }{ sy-msgv3 }{ sy-msgv4 }|.

      return-type    = 'E'.
      return-message = exceptionmsg.

    WHEN 2 OR 3.
      "system_failure / communication_failure usually already populate exceptionmsg
      IF exceptionmsg IS INITIAL.
        exceptionmsg = |RFC system/communication failure.|.
      ENDIF.

      return-type    = 'E'.
      return-message = exceptionmsg.

    WHEN OTHERS.
      exceptionmsg =
        |Error in workflow: { sy-msgv1 }{ sy-msgv2 }{ sy-msgv3 }{ sy-msgv4 }|.

      return-type    = 'E'.
      return-message = exceptionmsg.
  ENDCASE.

ENDFUNCTION.&lt;/LI-CODE&gt;
&lt;P&gt;The wrapper is intentionally small: it forwards the payload to the remote implementation via the RFC destination and then normalizes the outcome into a predictable shape. The point isn’t fancy ABAP — it’s reliability. With a stable contract (&lt;CODE&gt;IT_CSV, ANALYSIS, RETURN, EXCEPTIONMSG&lt;/CODE&gt;) the Logic Apps side can evolve independently while SAP callers still get consistent success/error semantics.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-background-color-16" border="1" style="width: 100%; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 99.9074%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Important&lt;/STRONG&gt;: in 'CALL FUNCTION 'Z_GET_ORDERS_ANALYSIS' DESTINATION dest' the name of the called function should be the same as the name of the ABAP wrapper function module, the reason being that the SAP built-in trigger in the logic app uses the function module signature as the contract (i.e. metadata).&lt;/P&gt;
&lt;P&gt;Also note that in the provided companion artifacts, a default value was assigned to 'dest' in the function module definition. But it can also be specified in the request (DEST element).&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN lia-align-center"&gt;&lt;img&gt;&lt;STRONG&gt;Figure: ABAP interface and error propagation for &lt;CODE&gt;Z_GET_ORDERS_ANALYSIS&lt;/CODE&gt;.&lt;/STRONG&gt;&lt;/img&gt;&lt;/DIV&gt;
&lt;P&gt;To sum up, the integration is intentionally shaped around three outputs: the raw input table (&lt;CODE&gt;IT_CSV&lt;/CODE&gt;), a standardized SAP return structure (&lt;CODE&gt;RETURN&lt;/CODE&gt; / &lt;CODE&gt;BAPIRET2&lt;/CODE&gt;), and a readable status string (&lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt;). The custom exception (&lt;CODE&gt;SENDEXCEPTIONTOSAPSERVER&lt;/CODE&gt;) gives me a clean way to surface workflow failures back into SAP without burying them inside connector-specific error payloads. This is depicted in the figure below.&lt;/P&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;4. Destination Workflow&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;The diagram below shows the destination workflow at a high level. I designed it as a staged pipeline:&amp;nbsp;guard early, normalize input, validate, and then split the workload into two paths—operational handling of invalid records (notifications and optional IDoc remediation) and analysis of the validated dataset. Importantly, the SAP response is intentionally narrow: SAP receives only the final analysis (or a structured error), while validation details are delivered out-of-band via email.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-background-color-16" border="1" style="width: 100%; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 99.9074%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;How to read this diagram&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Guardrail:&lt;/STRONG&gt; &lt;STRONG&gt;Validate requested action&lt;/STRONG&gt; ensures the workflow only handles the expected request.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Normalize:&lt;/STRONG&gt; &lt;STRONG&gt;Create CSV payload&lt;/STRONG&gt; converts the inbound content into a consistent CSV representation.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Validate:&lt;/STRONG&gt; &lt;STRONG&gt;Data Validation Agent&lt;/STRONG&gt; identifies invalid records (and produces a summary).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Operational handling (invalid data):&lt;/STRONG&gt; invalid rows are &lt;STRONG&gt;reported by email&lt;/STRONG&gt; and may optionally be turned into &lt;STRONG&gt;IDocs&lt;/STRONG&gt; (right-hand block).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Analyze (valid data):&lt;/STRONG&gt; &lt;STRONG&gt;Analyze data&lt;/STRONG&gt; runs only on the validated dataset (invalid IDs excluded).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Outputs:&lt;/STRONG&gt; users receive &lt;STRONG&gt;Email analysis&lt;/STRONG&gt;, while &lt;STRONG&gt;SAP receives only the analysis (or a structured error)&lt;/STRONG&gt; via &lt;STRONG&gt;Respond to SAP server&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;/OL&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;
&lt;P class="lia-align-center"&gt;Figure: Destination workflow with staged validation, optional IDoc remediation, and an SAP response .&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;Reading the workflow top-to-bottom, the main design choice is separation of concerns. Validation is used to filter and operationalize bad records (notify humans, optionally create IDocs), while the SAP-facing response stays clean and predictable: SAP receives the final analysis for the validated dataset, or an error if the run can’t complete. This keeps the SAP contract stable even as validation rules and reporting details evolve.&lt;/P&gt;
&lt;H5 class="lia-text-color-21"&gt;&lt;STRONG&gt;Step‑by‑step walkthrough&lt;/STRONG&gt;&lt;/H5&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-background-color-16" border="1" style="width: 98.8889%; height: 1904px; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Phase 0 — Entry and routing&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Trigger &lt;/STRONG&gt;— When a message is received&lt;BR /&gt;The workflow starts when an inbound SAP message is delivered to the Logic Apps SAP built‑in trigger.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Guardrail &lt;/STRONG&gt;— Validate requested action (2 cases)&lt;BR /&gt;The workflow immediately checks whether the inbound request is the operation it expects (for example, the function/action name equals &lt;CODE&gt;Z_GET_ORDERS_ANALYSIS&lt;/CODE&gt;).
&lt;UL&gt;
&lt;LI&gt;If the action does not match: the workflow sends an exception back to SAP describing the unexpected action and terminates early (fail fast).&lt;/LI&gt;
&lt;LI&gt;If the action matches: processing continues.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Phase 1 — Normalize input into a workflow‑friendly payload&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Prepare input&lt;/STRONG&gt; — Create CSV payload&lt;BR /&gt;The workflow extracts CSV lines from the inbound (XML) SAP payload and normalizes them into a consistent CSV text payload that downstream steps can process reliably.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Initialize validation state &lt;/STRONG&gt;— Initialize array of invalid order ids&lt;BR /&gt;The workflow creates an empty array variable to capture order IDs that fail validation. This becomes the “validation output channel” used later for reporting, filtering, and optional remediation.&lt;/LI&gt;
&lt;/OL&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Phase 2 — Validate the dataset (AI agent loop)&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Validate &lt;/STRONG&gt;— Data Validation Agent (3 cases)&lt;BR /&gt;This stage performs rule‑based validation using an agent pattern (backed by Azure OpenAI). Conceptually, it does three things (as shown in the diagram’s expanded block):
&lt;UL&gt;
&lt;LI&gt;Get validation rules: retrieves business rules from a SharePoint‑hosted validation document.&lt;BR /&gt;&lt;STRONG&gt;&lt;EM&gt;The location of the validation rules file is a parameter of the logic app.&lt;/EM&gt;&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;Get CSV payload: loads the normalized CSV created earlier.&lt;/LI&gt;
&lt;LI&gt;Summarize CSV payload review: evaluates the CSV against the rules and produces structured validation outputs.&lt;/LI&gt;
&lt;/UL&gt;
Outputs produced by validation:
&lt;UL&gt;
&lt;LI&gt;A list of invalid order IDs&lt;/LI&gt;
&lt;LI&gt;The corresponding invalid CSV rows&lt;/LI&gt;
&lt;LI&gt;A human‑readable validation summary&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;STRONG&gt;Note&lt;/STRONG&gt;: The detailed AI prompt/agent mechanics are covered in &lt;STRONG&gt;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/logic-apps-agentic-workflows-with-sap---part-2-ai-agents/4492362" target="_blank" rel="noopener" data-lia-auto-title="Part 2" data-lia-auto-title-active="0"&gt;Part 2&lt;/A&gt;&lt;/STRONG&gt;. In &lt;STRONG&gt;Part 1&lt;/STRONG&gt;, the focus is on the integration flow and how data moves.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;STRONG&gt;Phase 3 — Operational handling of invalid records (email + optional SAP remediation)&lt;/STRONG&gt;
&lt;P&gt;After validation, the workflow treats invalid records as an operational concern: they are reported to humans and can optionally be routed into an SAP remediation path. This is shown in the right‑hand “Create IDocs” block.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Notify &lt;/STRONG&gt;— Send verification summary&lt;BR /&gt;The workflow sends an email report (Office 365) to configured recipients containing:
&lt;UL&gt;
&lt;LI&gt;the validation summary&lt;/LI&gt;
&lt;LI&gt;the invalid order IDs&lt;/LI&gt;
&lt;LI&gt;the invalid CSV payload (or the subset of invalid rows)&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Transform &lt;/STRONG&gt;— Transform CSV to XML&lt;BR /&gt;The workflow converts the invalid CSV lines into an XML format that is suitable for SAP processing.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Optional remediation &lt;/STRONG&gt;— [RFC] Create all IDocs (conditional)&lt;BR /&gt;If the workflow parameter (for example, CreateIDocs) is enabled, the workflow calls an SAP RFC (e.g., &lt;CODE&gt;Z_CREATE_ONLINEORDER_IDOC&lt;/CODE&gt;) to create IDocs from the transformed invalid data.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;STRONG&gt;Why this matters&lt;/STRONG&gt;: Validation results are made visible (email) and optionally actionable (IDocs), without polluting the primary analysis response that SAP receives.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Phase 4 — Analyze only the validated dataset (AI analysis)&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The workflow runs AI analysis on the validated dataset, explicitly excluding invalid order IDs discovered during the validation phase. The analysis prompt instructs the model to produce outputs such as trends, predictions, and recommendations.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Note&lt;/STRONG&gt;: The AI analysis prompt design and output shaping are covered in &lt;STRONG&gt;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/logic-apps-agentic-workflows-with-sap---part-2-ai-agents/4492362" target="_blank" rel="noopener" data-lia-auto-title="Part 2" data-lia-auto-title-active="0"&gt;Part 2&lt;/A&gt;&lt;/STRONG&gt;.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Phase 5 — Post‑process the AI response and publish outputs&lt;/STRONG&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Package results &lt;/STRONG&gt;— Process analysis results (Scope)&lt;BR /&gt;The workflow converts the AI response into a format suitable for email and for SAP consumption:
&lt;UL&gt;
&lt;LI&gt;Parse the OpenAI JSON response&lt;/LI&gt;
&lt;LI&gt;Extract the analysis content&lt;/LI&gt;
&lt;LI&gt;Convert markdown → &lt;CODE&gt;HTML&lt;/CODE&gt; using custom JavaScript formatting&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Outputs&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;Email analysis: sends the formatted analysis to recipients.&lt;/LI&gt;
&lt;LI&gt;Respond to SAP server: returns only the analysis (and errors) to SAP.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;STRONG&gt;Key design choice&lt;/STRONG&gt;: SAP receives a clean, stable contract—analysis on success, structured error on failure. Validation details are handled out‑of‑band via email (and optionally via IDoc creation).&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Note&lt;/STRONG&gt;: the analysis email sent by the destination workflow is there for testing purposes, to verify that the html content remains the same as it is sent back to the source workflow.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 100.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H5&gt;&lt;STRONG&gt;Useful snippets&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;&lt;STRONG&gt;Snippet 1 - Join each CSV line in the XML to make a CSV table:&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="xquery"&gt;join(
  xpath(
    xml(triggerBody()?['content']),
    '/*[local-name()=\"Z_GET_ORDERS_ANALYSIS\"]
    /*[local-name()=\"IT_CSV\"]
    /*[local-name()=\"ZTY_CSV_LINE\"]
    /*[local-name()=\"LINE\"]/text()'
  ),
  '\r\n')
&lt;/LI-CODE&gt;
&lt;P&gt;&lt;SPAN class="lia-text-color-8"&gt;&lt;STRONG&gt;Note&lt;/STRONG&gt;: For the sake of simplicity, XPath is used here and throughout all places where XML is parsed. In the general case however, the &lt;STRONG&gt;&lt;A href="#community--1-Appendix1" target="_blank" rel="noopener" data-lia-auto-title="Parse XML with schema" data-lia-auto-title-active="0"&gt;Parse XML with schema&lt;/A&gt; &lt;/STRONG&gt;action is the better and recommended way to strictly enforce the data contract between senders and receivers. More information about&amp;nbsp;&lt;A href="#community--1-Appendix1" target="_blank" rel="noopener" data-lia-auto-title="Parse XML with schema" data-lia-auto-title-active="0"&gt;Parse XML with schema&lt;/A&gt; is provided in&lt;A class="lia-internal-link" href="#community--1-Appendix1" target="_self" rel="noopener" data-lia-auto-title=" Appendix 1" data-lia-auto-title-active="0"&gt; Appendix 1&lt;/A&gt;.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-21"&gt;Snippet 2 - Format markdown to html (simplified):&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;LI-CODE lang="javascript"&gt;const raw = workflowContext.actions.Extract_analysis.outputs;

// Basic HTML escaping for safety (keeps &amp;lt;code&amp;gt; blocks clean)
const escapeHtml = s =&amp;gt; s.replace(/[&amp;amp;&amp;lt;&amp;gt;"]/g, c =&amp;gt; ({'&amp;amp;':'&amp;amp;','&amp;lt;':'&amp;lt;','&amp;gt;':'&amp;gt;','"':'"'}[c]));

// Normalize line endings
let md = raw; // raw.replace(/\r\n/g, '\n').trim();

// Convert code blocks (``` ... ```)
md = md.replace(/```([\s\S]*?)```/g, (m, p1) =&amp;gt; `&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;${escapeHtml(p1)}&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;`);

// Horizontal rules --- or ***
md = md.replace(/(?:^|\n)---+(?:\n|$)/g, '&amp;lt;hr/&amp;gt;');

// Headings ###### to #
for (let i = 6; i &amp;gt;= 1; i--) {
  const re = new RegExp(`(?:^|\\n)${'#'.repeat(i)}\\s+(.+?)\\s*(?=\\n|$)`, 'g');
  md = md.replace(re, (m, p1) =&amp;gt; `&amp;lt;h${i}&amp;gt;${p1.trim()}&amp;lt;/h${i}&amp;gt;`);
}

// Bold and italic
md = md.replace(/\*\*([^*]+)\*\*/g, '&amp;lt;strong&amp;gt;$1&amp;lt;/strong&amp;gt;');
md = md.replace(/\*([^*]+)\*/g, '&amp;lt;em&amp;gt;$1&amp;lt;/em&amp;gt;');

// Unordered lists (lines starting with -, *, +)
md = md.replace(/(?:^|\n)([-*+]\s.+(?:\n[-*+]\s.+)*)/g, (m) =&amp;gt; {
  const items = m.trim().split(/\n/).map(l =&amp;gt; l.replace(/^[-*+]\s+/, '').trim());
  return '\n&amp;lt;ul&amp;gt;' + items.map(i =&amp;gt; `&amp;lt;li&amp;gt;${i}&amp;lt;/li&amp;gt;`).join('\n') + '&amp;lt;/ul&amp;gt;';
});

// Paragraphs: wrap remaining text blocks in &amp;lt;p&amp;gt;...&amp;lt;/p&amp;gt;
const blocks = md.split(/\n{2,}/).map(b =&amp;gt; {
  if (/^&amp;lt;h\d&amp;gt;|^&amp;lt;ul&amp;gt;|^&amp;lt;pre&amp;gt;|^&amp;lt;hr\/&amp;gt;/.test(b.trim())) return b;
  return `&amp;lt;p&amp;gt;${b.replace(/\n/g, '&amp;lt;br/&amp;gt;')}&amp;lt;/p&amp;gt;`;
});
const html = blocks.join('');

return { html };&lt;/LI-CODE&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;5. Exception Handling&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;To illustrate exception handling, we supposed that multiple workflows may listen to the same program id (by design or unexpectedly) and could therefore receive messages that were meant for others. So the first thing that happens is validate that the function name is as expected. It is shown below.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;In this section I show three practical ways to surface workflow failures back to SAP using the Logic Apps action “Send exception to SAP server”, and the corresponding ABAP patterns used to handle them. The core idea is the same in all three: Logic Apps raises an exception on the SAP side, SAP receives it as an RFC exception, and your ABAP wrapper converts that into something predictable (for example, a readable &lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt;, a populated &lt;CODE&gt;RETURN&lt;/CODE&gt;, or both). The differences are in how much control you want over the exception identity and whether you want to leverage SAP message classes for consistent, localized messages.&lt;/P&gt;
&lt;H4 class="lia-text-color-21"&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;5.1 Default exception&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;This first example shows the default behavior of Send exception to SAP server. When the action runs without a custom exception name configuration, the connector raises a pre-defined exception that can be handled explicitly in ABAP.&lt;/P&gt;
&lt;P&gt;On the Logic Apps side, the action card “Send exception to SAP server” sends an Exception Error Message (for example, “Unexpected action in request: …”). On the ABAP side, the RFC call lists &lt;CODE&gt;SENDEXCEPTIONTOSAPSERVER&lt;/CODE&gt; = 1 under &lt;CODE&gt;EXCEPTIONS&lt;/CODE&gt;, and the code uses &lt;CODE&gt;CASE&lt;/CODE&gt; &lt;CODE&gt;sy-subrc&lt;/CODE&gt; to map that exception to a readable message.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;&lt;STRONG&gt;Figure: Default exception&lt;/STRONG&gt;&lt;/img&gt;
&lt;P&gt;&lt;STRONG&gt;The key takeaway&lt;/STRONG&gt; is that you get a reliable “out-of-the-box” exception path: ABAP can treat &lt;CODE&gt;sy-subrc&lt;/CODE&gt; = 1 as the workflow‑raised failure and generate a consistent &lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt;. This is the simplest option and works well when you don’t need multiple exception names—just one clear “workflow failed” signal.&lt;/P&gt;
&lt;H4 class="lia-text-color-21"&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;5.2 Message exception&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;If you want more control than the default, you can configure the action to raise a named exception declared in your ABAP function module interface. This makes it easier to route different failure types without parsing free-form text.&lt;/P&gt;
&lt;P&gt;The picture shows Advanced parameters under the Logic Apps action, including “Exception Name” with helper text indicating it must match an exception declared in the ABAP function module definition.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;&lt;STRONG&gt;Figure: Message exception&lt;/STRONG&gt;&lt;/img&gt;
&lt;P&gt;This option is useful when you want to distinguish workflow error categories (e.g., validation vs. routing vs. downstream failures) using exception identity, not just message text. The contract stays explicit: Logic Apps raises a named exception, and ABAP can branch on that name (or on &lt;CODE&gt;sy-subrc&lt;/CODE&gt; mapping) with minimal ambiguity.&lt;/P&gt;
&lt;H4 class="lia-text-color-21"&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;5.3 Message class exception&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;The third approach uses SAP’s built-in message class mechanism so that the exception raised by the workflow can map cleanly into SAP’s message catalog (&lt;CODE&gt;T100&lt;/CODE&gt;). This is helpful when you want consistent formatting and localization aligned with standard SAP patterns.&lt;/P&gt;
&lt;P&gt;On the Logic Apps side, the action shows advanced fields including Message Class, Message Number, and an Is ABAP Message toggle, with helper text stating the message class can come from message maintenance (&lt;CODE&gt;SE91&lt;/CODE&gt;) or be custom. On the ABAP side, the code highlights an error-handling block that calls using &lt;CODE&gt;sy-msgid&lt;/CODE&gt;, &lt;CODE&gt;sy-msgno&lt;/CODE&gt;, and variables &lt;CODE&gt;sy-msgv1&lt;/CODE&gt;…&lt;CODE&gt;sy-msgv4&lt;/CODE&gt;, then stores the resulting text in &lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt;.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;&lt;STRONG&gt;Figure: Message class exception&lt;/STRONG&gt;&lt;/img&gt;
&lt;P&gt;This pattern is ideal when you want workflow exceptions to look and behave like “native” SAP messages. Instead of hard-coding strings, you rely on the message catalog and let ABAP produce a consistent final message via &lt;A class="lia-internal-link" href="#community--1-FORMAT_MESSAGE" target="_blank" rel="noopener" data-lia-auto-title="FORMAT_MESSAGE" data-lia-auto-title-active="0"&gt;&lt;CODE&gt;FORMAT_MESSAGE&lt;/CODE&gt;&lt;/A&gt;. The result is easier to standardize across teams and environments—especially if you already manage message classes as part of your SAP development process.&lt;/P&gt;
&lt;P&gt;Refer to Appendix 2 for further information on &lt;A class="lia-internal-link" href="#community--1-FORMAT_MESSAGE" target="_blank" rel="noopener" data-lia-auto-title="FORMAT_MESSAGE" data-lia-auto-title-active="0"&gt;&lt;CODE&gt;FORMAT_MESSAGE&lt;/CODE&gt;&lt;/A&gt;.&lt;/P&gt;
&lt;H4 class="lia-text-color-21"&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;5.4 Choosing an exception strategy that SAP can act on&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;Across these examples, the goal is consistent: treat workflow failures as first‑class outcomes in SAP, not as connector noise buried in run history. The Logic Apps action Send exception to SAP server gives you three increasingly structured ways to do that, and the “right” choice depends on how much semantics you want SAP to understand.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Default exception (lowest ceremony): Use this when you just need a reliable “workflow failed” signal. The connector raises a pre-defined exception name (for example, &lt;CODE&gt;SENDEXCEPTIONTOSAPSERVER&lt;/CODE&gt;), and ABAP can handle it with a simple &lt;CODE&gt;EXCEPTIONS&lt;/CODE&gt; … = 1 mapping and a &lt;CODE&gt;sy-subrc&lt;/CODE&gt; check. This is the fastest way to make failures visible and deterministic.&lt;/LI&gt;
&lt;LI&gt;Named exception(s) (more routing control): Use this when you want SAP to distinguish failure &lt;EM&gt;types&lt;/EM&gt; without parsing message text. By raising an exception name declared in the ABAP function module interface, you can branch cleanly in ABAP (or map to different return handling) and keep the contract explicit and maintainable.&lt;/LI&gt;
&lt;LI&gt;Message class + number (most SAP-native): Use this when you want errors to look and behave like standard SAP messages—consistent wording, centralized maintenance, and better alignment with SAP operational practices. In this mode, ABAP can render the final localized string using &lt;CODE&gt;FORMAT_MESSAGE&lt;/CODE&gt; and return it as &lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt; (and optionally &lt;CODE&gt;BAPIRET2&lt;/CODE&gt;-&lt;CODE&gt;MESSAGE&lt;/CODE&gt;), which makes the failure both human-friendly and SAP-friendly.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;A practical rule of thumb: start with the default exception while you stabilize the integration, move to named exceptions when you need clearer routing semantics, and adopt message classes when you want SAP-native error governance (standardization, maintainability, and localization). Regardless of the option, the key is to end with a predictable SAP-side contract: a clear success path, and a failure path that produces a structured return and a readable message.&lt;/P&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;6. Response Handling&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;This section shows how the destination workflow returns either a successful analysis response or a workflow exception back to SAP, and how the source (caller) workflow interprets the RFC response structure to produce a single, human‑readable outcome (an email body). The key idea is to keep the SAP-facing contract stable: SAP always returns a &lt;CODE&gt;Z_GET_ORDERS_ANALYSISResponse&lt;/CODE&gt; envelope, and the caller workflow decides between success and error using just two fields: &lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt; and &lt;CODE&gt;RETURN&lt;/CODE&gt;/&lt;CODE&gt;MESSAGE&lt;/CODE&gt;. To summarize the steps:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Destination workflow&lt;/STRONG&gt; either:
&lt;UL&gt;
&lt;LI&gt;sends a normal response via &lt;STRONG&gt;Respond to SAP server&lt;/STRONG&gt;, or&lt;/LI&gt;
&lt;LI&gt;raises an exception via &lt;STRONG&gt;Send exception to SAP server&lt;/STRONG&gt; (with an error message).&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;SAP server&lt;/STRONG&gt; exposes those outcomes through the RFC wrapper:
&lt;UL&gt;
&lt;LI&gt;&lt;CODE&gt;sy-subrc&lt;/CODE&gt; = 0 → success (&lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt; = 'ok')&lt;/LI&gt;
&lt;LI&gt;&lt;CODE&gt;sy-subrc&lt;/CODE&gt; = 1 → workflow exception (&lt;CODE&gt;SENDEXCEPTIONTOSAPSERVER&lt;/CODE&gt;)&lt;/LI&gt;
&lt;LI&gt;&lt;CODE&gt;sy-subrc&lt;/CODE&gt; = 2/3 → system/communication failures&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Source workflow&lt;/STRONG&gt; calls the RFC, extracts:
&lt;UL&gt;
&lt;LI&gt;&lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;CODE&gt;RETURN&lt;/CODE&gt;/&lt;CODE&gt;MESSAGE&lt;/CODE&gt; and uses an &lt;STRONG&gt;Has errors&lt;/STRONG&gt; gate to choose between a success email body (analysis) or a failure email body (error summary).&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;The figure below shows the full return path for results and failures. On the right, the destination workflow either responds normally (Respond to SAP server) or raises a workflow exception (Send exception to SAP server). SAP then maps that into the RFC outcome (&lt;CODE&gt;sy-subrc&lt;/CODE&gt; and message fields). On the left, the source workflow parses the RFC response structure and populates a single EmailBody variable using two cases: failure (error details) or success (analysis text).&lt;/P&gt;
&lt;img&gt;
&lt;P class="lia-align-center"&gt;&lt;STRONG&gt;Figure: Response/exception flow&lt;/STRONG&gt;&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;Two things make this pattern easy to operationalize. First, the caller workflow does not need to understand every SAP field—only &lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt; and &lt;CODE&gt;RETURN&lt;/CODE&gt;/&lt;CODE&gt;MESSAGE&lt;/CODE&gt; are required to decide success vs failure. Second, the failure path intentionally aggregates details (&lt;CODE&gt;MESSAGE_V1&lt;/CODE&gt;…&lt;CODE&gt;MESSAGE_V4&lt;/CODE&gt; plus the exception text) into a single readable string so errors don’t get trapped in run history.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Callout&lt;/STRONG&gt;: The caller workflow deliberately treats &lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt; != "ok" or &lt;CODE&gt;RETURN&lt;/CODE&gt;/&lt;CODE&gt;MESSAGE&lt;/CODE&gt; present as the single source of truth for failure, which keeps the decision logic stable even if the response schema grows.&lt;/P&gt;
&lt;H5 class="lia-text-color-21"&gt;&lt;STRONG&gt;Detailed description&lt;/STRONG&gt;&lt;/H5&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-background-color-16" border="1" style="width: 100%; height: 351.6px; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 99.9074%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr style="height: 247.2px;"&gt;&lt;td style="height: 247.2px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Phase 1 — Destination workflow: choose “response” vs “exception”&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Respond to SAP server&lt;/STRONG&gt; returns the normal response payload back to SAP.&lt;/P&gt;
&lt;/LI&gt;
&lt;LI&gt;
&lt;P&gt;&lt;STRONG&gt;Send exception to SAP server&lt;/STRONG&gt; raises a workflow failure with an Exception Error Message (the screenshot shows an example beginning with “Unexpected action in request:” and a token for Function Name).&lt;/P&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Outcome&lt;/STRONG&gt;: SAP receives either a normal response or a raised exception for the RFC call.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 34.8px;"&gt;&lt;td style="height: 34.8px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Phase 2 — SAP server: map workflow outcomes to RFC results&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The SAP-side wrapper code shown in the figure calls:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;CODE&gt;CALL&lt;/CODE&gt; &lt;CODE&gt;FUNCTION&lt;/CODE&gt; '&lt;CODE&gt;Z_GET_ORDERS_ANALYSIS&lt;/CODE&gt;' &lt;CODE&gt;DESTINATION&lt;/CODE&gt; &lt;CODE&gt;DEST&lt;/CODE&gt; ...&lt;/LI&gt;
&lt;LI&gt;It declares exception mappings including:
&lt;UL&gt;
&lt;LI&gt;&lt;CODE&gt;SENDEXCEPTIONTOSAPSERVER&lt;/CODE&gt; = 1&lt;/LI&gt;
&lt;LI&gt;&lt;CODE&gt;system_failure&lt;/CODE&gt; = 2 &lt;CODE&gt;MESSAGE&lt;/CODE&gt; &lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;CODE&gt;communication_failure&lt;/CODE&gt; = 3 &lt;CODE&gt;MESSAGE&lt;/CODE&gt; &lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;CODE&gt;OTHERS&lt;/CODE&gt; = 4&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Then it uses &lt;CODE&gt;CASE&lt;/CODE&gt; &lt;CODE&gt;sy-subrc&lt;/CODE&gt;. to normalize outcomes (the figure shows &lt;CODE&gt;WHEN&lt;/CODE&gt; 0. setting &lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt; = 'ok'., and &lt;CODE&gt;WHEN&lt;/CODE&gt; 1. building a readable message for the workflow exception).&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Outcome&lt;/STRONG&gt;: regardless of why it failed, SAP can provide a consistent set of fields back to the caller: a return structure and an exception/status message.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 34.8px;"&gt;&lt;td style="height: 34.8px;"&gt;
&lt;P&gt;&lt;STRONG&gt;Phase 3 — Source workflow: parse response and build one “email body”&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;After the RFC action ([RFC] Call Z GET &lt;CODE&gt;ORDERS&lt;/CODE&gt; &lt;CODE&gt;ANALYSIS&lt;/CODE&gt;) the source workflow performs:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Save &lt;CODE&gt;EXCEPTION&lt;/CODE&gt; message&lt;/STRONG&gt;&lt;BR /&gt;Extracts &lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt; from the response XML using XPath.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Save &lt;CODE&gt;RETURN&lt;/CODE&gt; message&lt;/STRONG&gt;&lt;BR /&gt;Extracts &lt;CODE&gt;RETURN&lt;/CODE&gt;/&lt;CODE&gt;MESSAGE&lt;/CODE&gt; from the response XML using XPath.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Initialize email body&lt;/STRONG&gt;&lt;BR /&gt;Creates EmailBody once, then sets it in exactly one of two cases.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Has errors&lt;/STRONG&gt; (two cases)&lt;BR /&gt;The condition treats the run as “error” if either:
&lt;UL&gt;
&lt;LI&gt;&lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt; is not equal to "ok", &lt;STRONG&gt;or&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;CODE&gt;RETURN&lt;/CODE&gt;/&lt;CODE&gt;MESSAGE&lt;/CODE&gt; is not empty.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Set email body (failure)&lt;/STRONG&gt; / &lt;STRONG&gt;Set email body (success)&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Failure:&lt;/STRONG&gt; builds a consolidated string containing &lt;CODE&gt;RETURN&lt;/CODE&gt;/&lt;CODE&gt;MESSAGE&lt;/CODE&gt;, message details (&lt;CODE&gt;MESSAGE_V1&lt;/CODE&gt;..V4), and &lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt;.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Success:&lt;/STRONG&gt; sets EmailBody to the &lt;CODE&gt;ANALYSIS&lt;/CODE&gt; field extracted from the response.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;STRONG&gt;Outcome&lt;/STRONG&gt;: the caller produces a single artifact (EmailBody) that is readable and actionable, without requiring anyone to inspect the raw RFC response.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Note&lt;/STRONG&gt;: the email recipient is set as a logic app parameter.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H3 class="lia-text-color-21"&gt;&lt;STRONG&gt;&lt;SPAN class="lia-text-color-15"&gt;7. Destination Workflow #2: Persisting failed rows as custom IDocs&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;In this section I zoom in on the&amp;nbsp;optional “IDoc persistence” branch at the end of the destination workflow. After the workflow identifies invalid rows (via the Data Validation Agent) and emails a verification summary, it can optionally call a second SAP RFC to save the failed rows as IDocs for later processing.&lt;/P&gt;
&lt;P&gt;This is mainly included to showcase another common SAP integration scenario—creating/handling IDocs—and to highlight that you can combine “AI-driven validation” with traditional enterprise workflows. The deeper motivation for invoking this as part of the agent tooling is covered in &lt;STRONG&gt;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/logic-apps-agentic-workflows-with-sap---part-2-ai-agents/4492362" target="_blank" rel="noopener" data-lia-auto-title="Part 2" data-lia-auto-title-active="0"&gt;Part 2&lt;/A&gt;&lt;/STRONG&gt;; here, the goal is to show the connector pattern and the custom RFC used to create IDocs from CSV input.&lt;/P&gt;
&lt;P&gt;The figure below shows the destination workflow at two levels: a high-level overview at the top, and a zoomed view of the post-validation remediation steps at the bottom. The zoom starts from Data Validation Agent → Summarize CSV payload review and&amp;nbsp;then expands the sequence that runs after Send verification summary: Transform CSV to XML followed by an SAP RFC call that creates IDocs from the failed data.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;&lt;STRONG&gt;Figure: Zoomed remediation branch&lt;/STRONG&gt;&lt;/img&gt;
&lt;P&gt;The key point is that this branch is&amp;nbsp;not the main “analysis response” path. It’s a practical remediation option: once invalid rows are identified and reported, the workflow can persist them into SAP using a dedicated RFC (&lt;CODE&gt;Z_CREATE_ONLINEORDER_IDOC&lt;/CODE&gt;) and a simple &lt;CODE&gt;IT_CSV&lt;/CODE&gt; payload. This keeps the end-to-end flow modular: analysis can remain focused on validated data, while failed records can be routed to SAP for follow-up processing on their own timeline.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Callout&lt;/STRONG&gt;: This branch exists to showcase an IDoc-oriented connector scenario. The “why this is invoked from the agent tooling” context is covered in &lt;STRONG&gt;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/logic-apps-agentic-workflows-with-sap---part-2-ai-agents/4492362" target="_blank" rel="noopener" data-lia-auto-title="Part 2" data-lia-auto-title-active="0"&gt;Part 2&lt;/A&gt;&lt;/STRONG&gt;; here the focus is the mechanics of calling &lt;CODE&gt;Z_CREATE_ONLINEORDER_IDOC&lt;/CODE&gt; with &lt;CODE&gt;IT_CSV&lt;/CODE&gt; and receiving &lt;CODE&gt;ET_RETURN&lt;/CODE&gt; / &lt;CODE&gt;ET_DOCNUMS&lt;/CODE&gt;.&lt;/P&gt;
&lt;P&gt;The screenshot shows an XML body with the RFC root element and an SAP namespace:&lt;/P&gt;
&lt;LI-CODE lang="xml"&gt;&amp;lt;z_create_onlineorder_idoc xmlns="http://Microsoft.LobServices.Sap/2007/03/Rfc/"&amp;gt;
  &amp;lt;iv_direction&amp;gt;...&amp;lt;/iv_direction&amp;gt;
  &amp;lt;iv_sndptr&amp;gt;...&amp;lt;/iv_sndptr&amp;gt;
  &amp;lt;iv_sndprn&amp;gt;...&amp;lt;/iv_sndprn&amp;gt;
  &amp;lt;iv_rcvptr&amp;gt;...&amp;lt;/iv_rcvptr&amp;gt;
  &amp;lt;iv_rcvprn&amp;gt;...&amp;lt;/iv_rcvprn&amp;gt;
  &amp;lt;it_csv&amp;gt;
    @{ ...Outputs... }
  &amp;lt;/it_csv&amp;gt;
  &amp;lt;et_return&amp;gt;&amp;lt;/et_return&amp;gt;
  &amp;lt;et_docnums&amp;gt;&amp;lt;/et_docnums&amp;gt;
&amp;lt;/z_create_onlineorder_idoc&amp;gt;&lt;/LI-CODE&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;EM&gt;What to notice:&lt;/EM&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;the workflow passes invalid CSV rows in &lt;CODE&gt;IT_CSV&lt;/CODE&gt;, and SAP returns a status table (&lt;CODE&gt;ET_RETURN&lt;/CODE&gt;) and created document numbers (&lt;CODE&gt;ET_DOCNUMS&lt;/CODE&gt;) for traceability.&lt;/LI&gt;
&lt;LI&gt;The payload includes standard-looking control fields (&lt;CODE&gt;IV_DIRECTION&lt;/CODE&gt;, &lt;CODE&gt;IV_SNDPTR&lt;/CODE&gt;, &lt;CODE&gt;IV_SNDPRN&lt;/CODE&gt;, &lt;CODE&gt;IV_RCVPTR&lt;/CODE&gt;, &lt;CODE&gt;IV_RCVPRN&lt;/CODE&gt;) &lt;EM&gt;and&lt;/EM&gt; the actual failed-row payload as &lt;CODE&gt;IT_CSV&lt;/CODE&gt;.&lt;/LI&gt;
&lt;LI&gt;&lt;CODE&gt;IT_CSV&lt;/CODE&gt; is populated via a Logic Apps expression (shown as @{ ...Outputs... } in the screenshot), which is the bridge between the prior transform step and the RFC call.&lt;/LI&gt;
&lt;LI&gt;The response side indicates table-like outputs: &lt;CODE&gt;ET_RETURN&lt;/CODE&gt; and &lt;CODE&gt;ET_DOCNUMS&lt;/CODE&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H4 class="lia-text-color-21"&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;7.1 From CSV to IDocs&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;I’ll cover the details of Destination workflow #2 in &lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/logic-apps-agentic-workflows-with-sap---part-2-ai-agents/4492362" target="_blank" rel="noopener" data-lia-auto-title="Part 2" data-lia-auto-title-active="0"&gt;&lt;STRONG&gt;Part 2&lt;/STRONG&gt;&lt;/A&gt;. In this post (&lt;STRONG&gt;Part 1&lt;/STRONG&gt;), I focus on the contract and the end-to-end mechanics: what the RFC expects, what it returns, and how the created IDocs show up in the receiving workflow.&lt;/P&gt;
&lt;P&gt;Before looking at the RFC itself, it helps to understand the payload we’re building inside the IDoc. The screenshot below shows the custom segment definition used by the custom IDoc type. This segment is intentionally shaped to mirror the columns of the CSV input so the mapping stays direct and easy to reason about.&lt;/P&gt;
&lt;img&gt;
&lt;P class="lia-align-center"&gt;Figure: Custom segment &lt;CODE&gt;ZONLINEORDER000&lt;/CODE&gt; (segment type &lt;CODE&gt;ZONLINEORDER&lt;/CODE&gt;)&lt;/P&gt;
&lt;/img&gt;
&lt;P&gt;This segment definition is the contract anchor: it makes the CSV-to-IDoc mapping explicit and stable. Each CSV record becomes one segment instance with the same 14 business fields. That keeps the integration “boringly predictable,” which is exactly what you want when you’re persisting rejected records for later processing.&lt;/P&gt;
&lt;P&gt;The figure below shows the full loop for persisting failed rows as IDocs. The source workflow calls the custom RFC and sends the invalid CSV rows as XML. SAP converts each row into the custom segment and creates outbound IDocs. Those outbound IDocs are then received by Destination workflow #2, which processes them asynchronously (one workflow instance per IDoc) and appends results into shared storage for reporting.&amp;nbsp;&lt;/P&gt;
&lt;img&gt;&lt;STRONG&gt;Figure: Persisting rejected rows as IDocs&lt;/STRONG&gt;&lt;/img&gt;
&lt;P&gt;This pattern deliberately separates concerns:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;the &lt;EM&gt;first&lt;/EM&gt; destination workflow identifies invalid rows and decides whether to persist them,&lt;/LI&gt;
&lt;LI&gt;SAP encapsulates the mechanics of &lt;STRONG&gt;IDoc creation&lt;/STRONG&gt; behind a stable RFC interface, and&lt;/LI&gt;
&lt;LI&gt;a &lt;EM&gt;second&lt;/EM&gt; destination workflow processes those IDocs asynchronously (one per IDoc), which is closer to how IDoc-driven integrations typically operate in production.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Destination workflow #2 is included here to show the end-to-end contract and the “receipt” side of the connector scenario:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Triggered by the SAP built-in trigger and checks FunctionName = &lt;CODE&gt;IDOC_INBOUND_ASYNCHRONOUS&lt;/CODE&gt;&lt;/LI&gt;
&lt;LI&gt;extracts &lt;CODE&gt;DOCNUM&lt;/CODE&gt; from the IDoc control record (&lt;CODE&gt;EDI_DC40&lt;/CODE&gt;/&lt;CODE&gt;DOCNUM&lt;/CODE&gt;)&lt;/LI&gt;
&lt;LI&gt;reconstructs a CSV payload from the IDoc data segment (the fields shown match the segment definition)&lt;/LI&gt;
&lt;LI&gt;appends a “verification info” line to shared storage for reporting&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The implementation details of that workflow (including why it is invoked from the agent tooling) are covered in&amp;nbsp;&lt;STRONG&gt;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/logic-apps-agentic-workflows-with-sap---part-2-ai-agents/4492362" target="_blank" rel="noopener" data-lia-auto-title="Part 2" data-lia-auto-title-active="0"&gt;Part 2&lt;/A&gt;&lt;/STRONG&gt;.&lt;/P&gt;
&lt;H4 class="lia-text-color-21"&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;&lt;CODE&gt;&lt;SPAN class="lia-text-color-15"&gt;7.2&lt;/SPAN&gt; Z_CREATE_ONLINEORDER_IDOC&lt;/CODE&gt; - Contract overview&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H4&gt;
&lt;P&gt;The full source code for &lt;CODE&gt;Z_CREATE_ONLINEORDER_IDOC&lt;/CODE&gt; is included in the supporting material. It’s too long to reproduce inline, so this post focuses on the contract—the part you need to call the RFC correctly and interpret its results.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;A quick note on authorship:&lt;/EM&gt; most of the implementation was generated with Copilot, with manual review and fixes to resolve build errors and align the behavior with the intended integration pattern. The contract is deliberately generic because the goal was to produce an RFC that’s reusable across more than one scenario, rather than tightly coupled to a single workflow.&lt;/P&gt;
&lt;P&gt;At a high level, the RFC is designed to support:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Both inbound and outbound IDoc creation&lt;/STRONG&gt;&lt;BR /&gt;It can either write IDocs to the SAP database (inbound-style persistence) or create/distribute IDocs outbound.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Multiple IDoc/message/segment combinations&lt;/STRONG&gt;&lt;BR /&gt;IDoc type (&lt;CODE&gt;IDOCTYP&lt;/CODE&gt;), message type (&lt;CODE&gt;MESTYP&lt;/CODE&gt;), and segment type (&lt;CODE&gt;SEGTP&lt;/CODE&gt;) are configurable so the same RFC can be reused.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Explicit partner/port routing control&lt;/STRONG&gt;&lt;BR /&gt;Optional sender/receiver partner/port fields can be supplied when routing matters.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Traceability of created artifacts&lt;/STRONG&gt;&lt;BR /&gt;The RFC returns created &lt;STRONG&gt;IDoc numbers&lt;/STRONG&gt; so the caller can correlate “these failed rows” to “these IDocs.”&lt;/LI&gt;
&lt;/UL&gt;
&lt;H6&gt;&lt;SPAN class="lia-text-color-21"&gt;&lt;STRONG&gt;Contract:&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H6&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-background-color-16" border="1" style="width: 100%; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 99.9074%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Inputs (import parameters)&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;CODE&gt;IV_DIRECTION&lt;/CODE&gt; &lt;EM&gt;(default: 'O')&lt;/EM&gt; — 'I' for inbound write-to-db, 'O' for outbound distribute/dispatch&lt;/LI&gt;
&lt;LI&gt;&lt;CODE&gt;IV_IDOCTYP&lt;/CODE&gt; &lt;EM&gt;(default: &lt;CODE&gt;ZONLINEORDERIDOC&lt;/CODE&gt;)&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;CODE&gt;IV_MESTYP&lt;/CODE&gt; &lt;EM&gt;(default: &lt;CODE&gt;ZONLINEORDER&lt;/CODE&gt;)&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;CODE&gt;IV_SEGTP&lt;/CODE&gt; &lt;EM&gt;(default: &lt;CODE&gt;ZONLINEORDER&lt;/CODE&gt;)&lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;Optional partner/port routing fields: &lt;CODE&gt;IV_SNDPRT&lt;/CODE&gt;, &lt;CODE&gt;IV_SNDPRN&lt;/CODE&gt;, &lt;CODE&gt;IV_RCVPRT&lt;/CODE&gt;, &lt;CODE&gt;IV_RCVPRN&lt;/CODE&gt;, &lt;CODE&gt;IV_RCVPOR&lt;/CODE&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Tables&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;CODE&gt;IT_CSV&lt;/CODE&gt; &lt;EM&gt;(structure &lt;CODE&gt;ZTY_CSV_LINE&lt;/CODE&gt;)&lt;/EM&gt; — each row is one CSV line (the “table-of-lines” pattern)&lt;/LI&gt;
&lt;LI&gt;&lt;CODE&gt;ET_RETURN&lt;/CODE&gt; &lt;EM&gt;(structure &lt;CODE&gt;BAPIRET2&lt;/CODE&gt;)&lt;/EM&gt; — success/warning/error messages (per-row and/or aggregate)&lt;/LI&gt;
&lt;LI&gt;&lt;CODE&gt;ET_DOCNUMS&lt;/CODE&gt; &lt;EM&gt;(type &lt;CODE&gt;ZTY_DOCNUM_TT&lt;/CODE&gt;)&lt;/EM&gt; — list of created IDoc numbers for correlation/traceability&lt;/LI&gt;
&lt;/UL&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;
&lt;P&gt;&lt;STRONG&gt;Outputs&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;CODE&gt;EV_DOCNUM&lt;/CODE&gt; — a convenience “primary / last created” &lt;CODE&gt;DOCNUM&lt;/CODE&gt; value returned by the RFC&lt;/LI&gt;
&lt;/UL&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;8. Concluding Remarks&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;STRONG&gt;Part 1 &lt;/STRONG&gt;established a stable SAP ↔ Logic Apps integration baseline: CSV moves end‑to‑end using explicit contracts, and failures are surfaced predictably. The source workflow reads CSV from Blob, wraps rows into the &lt;CODE&gt;IT_CSV&lt;/CODE&gt; table‑of‑lines payload, calls &lt;CODE&gt;Z_GET_ORDERS_ANALYSIS&lt;/CODE&gt;, and builds one outcome using two fields from the RFC response: &lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt; and &lt;CODE&gt;RETURN&lt;/CODE&gt;/&lt;CODE&gt;MESSAGE&lt;/CODE&gt;. The destination workflow gates requests, validates input, and returns&amp;nbsp;only analysis (or errors) back to SAP while handling invalid rows operationally (notification + optional persistence).&lt;/P&gt;
&lt;P&gt;On the error path, we covered three concrete patterns to raise workflow failures back into SAP: the default connector exception (&lt;CODE&gt;SENDEXCEPTIONTOSAPSERVER&lt;/CODE&gt;), named exceptions (explicit ABAP contract), and message‑class‑based errors (SAP‑native formatting via &lt;CODE&gt;FORMAT_MESSAGE&lt;/CODE&gt;). On the remediation side, we added a realistic enterprise pattern: persist rejected rows as custom IDocs via &lt;CODE&gt;Z_CREATE_ONLINEORDER_IDOC&lt;/CODE&gt; (&lt;CODE&gt;IT_CSV&lt;/CODE&gt; in, &lt;CODE&gt;ET_RETURN&lt;/CODE&gt; + &lt;CODE&gt;ET_DOCNUMS&lt;/CODE&gt; out), using the custom segment &lt;CODE&gt;ZONLINEORDER000&lt;/CODE&gt; as the schema anchor and enabling downstream receipt in Destination workflow #2 (one run per IDoc, correlated via &lt;CODE&gt;DOCNUM&lt;/CODE&gt;).&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/logic-apps-agentic-workflows-with-sap---part-2-ai-agents/4492362" target="_blank" rel="noopener" data-lia-auto-title="Part 2" data-lia-auto-title-active="0"&gt;&lt;STRONG&gt;Part 2&lt;/STRONG&gt;&lt;/A&gt; is separate because it tackles a different problem: the AI layer. With contracts and error semantics now fixed, &lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/logic-apps-agentic-workflows-with-sap---part-2-ai-agents/4492362" target="_blank" rel="noopener" data-lia-auto-title="Part 2" data-lia-auto-title-active="0"&gt;&lt;STRONG&gt;Part 2&lt;/STRONG&gt;&lt;/A&gt; can focus on the agent/tooling details that tend to iterate—rule retrieval, structured validation outputs, prompt constraints, token/history controls, and how the analysis output is generated and shaped—without muddying the transport story.&lt;/P&gt;
&lt;H3&gt;&lt;a id="community--1-Appendix1" class="lia-anchor"&gt;&lt;/a&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;SPAN class="lia-linked-item"&gt;&lt;STRONG&gt;Appendix 1:&lt;/STRONG&gt; Parse XML with schema&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;In this section I consider the CSV payload creation as an example, but parsing XML with schema applies in every place where we get an XML input to process, such as when receiving SAP responses, exceptions, or request/responses from other RFCs.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Strong contract&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;The &lt;CODE&gt;Create_CSV_payload&lt;/CODE&gt; step in the shown implementation uses an &lt;CODE&gt;xpath() + join()&lt;/CODE&gt; expression to extract LINE values from the incoming XML:&lt;/P&gt;
&lt;LI-CODE lang="xquery"&gt;join(
  xpath(
    xml(triggerBody()?['content']),
    '/*[local-name()="Z_GET_ORDERS_ANALYSIS"]
     /*[local-name()="IT_CSV"]
     /*[local-name()="ZTY_CSV_LINE"]
     /*[local-name()="LINE"]/text()'
  ),
  '\r\n'
)&lt;/LI-CODE&gt;
&lt;P&gt;That approach works, but it’s essentially a&amp;nbsp;&lt;STRONG&gt;“weak contract”&lt;/STRONG&gt;: it assumes the message shape stays stable and that your XPath continues to match. By contrast, the &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/logic-apps/logic-apps-enterprise-integration-xml-parse" target="_blank" rel="noopener"&gt;&lt;STRONG&gt;Parse XML with schema&lt;/STRONG&gt;&lt;/A&gt; action turns the XML payload into structured data based on an XSD, which gives you a &lt;STRONG&gt;“strong contract”&lt;/STRONG&gt; and enables downstream steps to bind to known fields instead of re-parsing XML strings.&lt;/P&gt;
&lt;P&gt;The figure below compares two equivalent ways to build the CSV payload from the RFC input. On the left is the direct xpath() compose (labeled “weak contract”). On the right is the schema-based approach (labeled “strong contract”), where the workflow parses the request first and then builds the CSV payload by iterating over typed rows.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img&gt;&lt;STRONG&gt;Figure: comparison Compose/XPath vs. Parse XML with schema.&lt;/STRONG&gt;&lt;/img&gt;
&lt;P&gt;What’s visible in the diagram is the key tradeoff:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;XPath compose path (left): the workflow creates the CSV payload directly using &lt;CODE&gt;join(xpath(...), '\r\n')&lt;/CODE&gt;, with the XPath written using local-name() selectors. This is fast to prototype, but the contract is implicit—your workflow “trusts” the XML shape and your XPath accuracy.&lt;/LI&gt;
&lt;LI&gt;Parse XML with schema path (right): the workflow inserts a Parse XML with schema step (“&lt;CODE&gt;Parse Z GET ORDERS ANALYSIS request&lt;/CODE&gt;”), initializes variables, loops For each CSV row, and Appends to CSV payload, then performs &lt;CODE&gt;join(variables('CSVPayload'), '\r\n')&lt;/CODE&gt;. Here, the contract is explicit—your XSD defines what IT_CSV and LINE mean, and downstream steps bind to those fields rather than re-parsing XML.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;A good rule of thumb is: XPath is great for lightweight extraction, while Parse XML with schema is better when you want contract enforcement and long-term maintainability, especially in enterprise integration / BizTalk migration scenarios where schemas are already part of the integration culture.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Implementation details&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;The next figure shows the concrete configuration for Parse XML with schema and how its outputs flow into the “For each CSV row” loop. This is the “strong contract” version of the earlier XPath compose.&lt;/P&gt;
&lt;img&gt;&lt;STRONG&gt;Figure: Parse XML with schema - details.&lt;/STRONG&gt;&lt;/img&gt;
&lt;P&gt;This screenshot highlights three practical implementation details:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;The Parse action is schema-backed.&lt;/STRONG&gt;&lt;BR /&gt;In the Parameters pane, the action uses:
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Content:&lt;/STRONG&gt; the incoming XML Response&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Schema source:&lt;/STRONG&gt; LogicApp&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Schema name:&lt;/STRONG&gt; Z_GET_ORDERS_ANALYSIS&lt;BR /&gt;The code view snippet shows the same idea: type: "XmlParse" with content: "&lt;CODE&gt;@triggerBody()?['content']&lt;/CODE&gt;" and schema: { source: "LogicApp", name: "Z_GET_ORDERS_ANALYSIS.xsd" }.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;The parsed output becomes typed “dynamic content.”&lt;/STRONG&gt;&lt;BR /&gt;The loop input is shown as “&lt;CODE&gt;JSON Schema for element 'Z_GET_ORDERS_ANALYSIS: IT_CSV'&lt;/CODE&gt;”. This is the key benefit: you are no longer scraping strings—you are iterating over a structured collection that was produced by schema-based parsing.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;The &lt;CODE&gt;LINE&lt;/CODE&gt; extraction becomes trivial and readable.&lt;/STRONG&gt;&lt;BR /&gt;The “Append to CSV payload” step appends &lt;CODE&gt;@item()?['LINE']&lt;/CODE&gt; to the CSVpayload variable (as shown in the code snippet). Then the final Create CSV payload becomes a simple &lt;CODE&gt;join(variables('CSVPayload'), '\r\n')&lt;/CODE&gt;. This is exactly the kind of “workflow readability” benefit you get once XML parsing is schema-backed.&lt;/LI&gt;
&lt;/OL&gt;
&lt;H5&gt;&lt;STRONG&gt;Schema generation&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;The Parse action requires XSD schemas, which can be stored in the Logic App (or via a linked Integration Account). The final figure shows a few practical ways to obtain and manage those XSDs:&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Generate Schema (SAP connector):&lt;/STRONG&gt; a “Generate Schema” action with Operation Type = RFC and an&lt;STRONG&gt; &lt;/STRONG&gt;RFC Name field, which is a practical way to bootstrap schema artifacts when you already know the RFC you’re calling.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Run Diagnostics / Fetch RFC Metadata:&lt;/STRONG&gt; a “Run Diagnostics” action showing&lt;STRONG&gt; &lt;/STRONG&gt;Operation type = Fetch RFC Metadata and RFC Name, which is useful to confirm the shape of the RFC interface and reconcile it with your XSD/contract.&lt;/LI&gt;
&lt;/UL&gt;
&lt;img&gt;&lt;STRONG&gt;Figure: schema generation.&lt;/STRONG&gt;&lt;/img&gt;
&lt;P&gt;If you don’t want to rely solely on connector-side schema generation, there are also classic “developer tools” approaches:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Infer XSD from a sample XML&lt;/STRONG&gt; using .NET’s XmlSchemaInference (good for quick starting points).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Generate XSD from an XML instance&lt;/STRONG&gt; using xsd.exe (handy when you already have representative sample payloads) or by asking&amp;nbsp;your favorite AI prompt.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;When to choose XPath vs Parse XML with schema (practical guidance)&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;&lt;EM&gt;Generally speaking, choose &lt;STRONG&gt;XPath&lt;/STRONG&gt; when…&lt;/EM&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;You need a quick extraction and you’re comfortable maintaining a single XPath.&lt;/LI&gt;
&lt;LI&gt;You don’t want to manage schema artifacts yet (early prototypes).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;EM&gt;Choose &lt;STRONG&gt;Parse XML with schema&lt;/STRONG&gt; when…&lt;/EM&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;You want a &lt;STRONG&gt;stronger, explicit contract&lt;/STRONG&gt; (XSD defines what the payload is).&lt;/LI&gt;
&lt;LI&gt;You want the designer to expose &lt;STRONG&gt;structured outputs&lt;/STRONG&gt; (“JSON Schema for element …”) so downstream steps are readable and less brittle.&lt;/LI&gt;
&lt;LI&gt;You expect the message shape to evolve over time and prefer schema-driven changes over XPath surgery.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;a id="community--1-FORMAT_MESSAGE" class="lia-anchor"&gt;&lt;/a&gt;&lt;SPAN class="lia-text-color-15 lia-linked-item"&gt;&lt;STRONG&gt;Appendix 2: &lt;/STRONG&gt;Using &lt;A class="lia-internal-link" href="#community--1-FORMAT_MESSAGE" target="_blank" rel="noopener" data-lia-auto-title="FORMAT_MESSAGE" data-lia-auto-title-active="0"&gt;FORMAT_MESSAGE&lt;/A&gt; to produce SAP‑native error text&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;When propagating failures from Logic Apps back into SAP (for example via Send exception to SAP server), I want the SAP side to produce a predictable, human‑readable message without forcing callers to parse connector‑specific payloads. ABAP’s &lt;CODE&gt;FORMAT_MESSAGE&lt;/CODE&gt; is ideal for this because it converts SAP’s message context—message class, message number, and up to four variables—into the final message text that SAP would normally display, but without raising a UI message.&lt;/P&gt;
&lt;H5 class="lia-text-color-21"&gt;&lt;STRONG&gt;What &lt;A class="lia-internal-link" href="#community--1-FORMAT_MESSAGE" target="_blank" rel="noopener" data-lia-auto-title="FORMAT_MESSAGE" data-lia-auto-title-active="0"&gt;FORMAT_MESSAGE&lt;/A&gt; does&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;&lt;CODE&gt;FORMAT_MESSAGE&lt;/CODE&gt; formats a message defined in SAP’s message catalog (&lt;CODE&gt;T100&lt;/CODE&gt; / maintained via &lt;CODE&gt;SE91&lt;/CODE&gt;) using the values in &lt;CODE&gt;sy-msgid&lt;/CODE&gt;, &lt;CODE&gt;sy-msgno&lt;/CODE&gt;, and &lt;CODE&gt;sy-msgv1&lt;/CODE&gt;…&lt;CODE&gt;sy-msgv4&lt;/CODE&gt;. Conceptually, it answers the question:&lt;/P&gt;
&lt;P&gt;“Given message class + number + variables, what is the rendered message string?”&lt;/P&gt;
&lt;P&gt;This is particularly useful after an RFC call fails, where ABAP may have message context available even if the exception itself is not a clean string.&lt;/P&gt;
&lt;H5 class="lia-text-color-21"&gt;&lt;STRONG&gt;Why this matters in an RFC wrapper&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;In the message class–based exception configuration, the workflow can provide message metadata (class/number/type) so that SAP can behave “natively”: ABAP receives a failure (&lt;CODE&gt;sy-subrc&lt;/CODE&gt; &amp;lt;&amp;gt; 0), formats the message using &lt;CODE&gt;FORMAT_MESSAGE&lt;/CODE&gt;, and returns the final text in a field like &lt;CODE&gt;EXCEPTIONMSG&lt;/CODE&gt; (and/or in &lt;CODE&gt;BAPIRET2&lt;/CODE&gt;-&lt;CODE&gt;MESSAGE&lt;/CODE&gt;). The result is:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;consistent wording across systems and environments&lt;/LI&gt;
&lt;LI&gt;easier localization (SAP selects language-dependent text)&lt;/LI&gt;
&lt;LI&gt;separation of concerns: code supplies variables; message content lives in message maintenance&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5 class="lia-text-color-21"&gt;&lt;STRONG&gt;A robust pattern&lt;/STRONG&gt;&lt;/H5&gt;
&lt;P&gt;After the RFC call, I use this order of precedence:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Use any explicit text already provided (for example via &lt;CODE&gt;system_failure&lt;/CODE&gt; … &lt;CODE&gt;MESSAGE&lt;/CODE&gt; exceptionmsg), because it’s already formatted.&lt;/LI&gt;
&lt;LI&gt;If that’s empty but SAP message context exists (&lt;CODE&gt;sy-msgid&lt;/CODE&gt; / &lt;CODE&gt;sy-msgno&lt;/CODE&gt;), call &lt;CODE&gt;FORMAT_MESSAGE&lt;/CODE&gt; to produce the final string.&lt;/LI&gt;
&lt;LI&gt;If neither is available, fall back to a generic message that includes &lt;CODE&gt;sy-subrc&lt;/CODE&gt;.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;Here is a compact version of that pattern:&lt;/P&gt;
&lt;LI-CODE lang="abap"&gt;DATA: lv_text TYPE string.

CALL FUNCTION 'Z_GET_ORDERS_ANALYSIS' DESTINATION dest
  IMPORTING
    analysis = analysis
  TABLES
    it_csv   = it_csv
  CHANGING
    return   = return
  EXCEPTIONS
    sendexceptiontosapserver = 1
    system_failure           = 2 MESSAGE exceptionmsg
    communication_failure    = 3 MESSAGE exceptionmsg
    OTHERS                   = 4.

IF sy-subrc &amp;lt;&amp;gt; 0.

  "Prefer explicit message text if it already exists
  IF exceptionmsg IS INITIAL.

    "Otherwise format SAP message context into a string
    IF sy-msgid IS NOT INITIAL AND sy-msgno IS NOT INITIAL.
      CALL FUNCTION 'FORMAT_MESSAGE'
        EXPORTING
          id  = sy-msgid
          no  = sy-msgno
          v1  = sy-msgv1
          v2  = sy-msgv2
          v3  = sy-msgv3
          v4  = sy-msgv4
        IMPORTING
          msg = lv_text.

      exceptionmsg = lv_text.
    ELSE.
      exceptionmsg = |RFC failed (sy-subrc={ sy-subrc }).|.
    ENDIF.

  ENDIF.

  "Optionally normalize into BAPIRET2 for structured consumption
  return-type    = 'E'.
  return-message = exceptionmsg.

ENDIF.&lt;/LI-CODE&gt;
&lt;H5 class="lia-text-color-21"&gt;&lt;STRONG&gt;Common gotchas&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;CODE&gt;FORMAT_MESSAGE&lt;/CODE&gt; only helps if &lt;CODE&gt;sy-msgid&lt;/CODE&gt; and &lt;CODE&gt;sy-msgno&lt;/CODE&gt; are set. If the failure did not originate from an SAP message (or message mapping is disabled), these fields may be empty—so keep a fallback.&lt;/LI&gt;
&lt;LI&gt;Message numbers are typically 3-digit strings (e.g., 001, 012), matching how messages are stored in the catalog.&lt;/LI&gt;
&lt;LI&gt;&lt;CODE&gt;FORMAT_MESSAGE&lt;/CODE&gt; formats text; it does not raise or display a message. That makes it safe to use in RFC wrappers and background processing.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Bottom line:&lt;/STRONG&gt; &lt;CODE&gt;FORMAT_MESSAGE&lt;/CODE&gt; is a simple tool that helps workflow‑originated failures “land” in SAP as clean, SAP‑native messages—especially when using message classes to standardize and localize error text.&lt;/P&gt;
&lt;H3&gt;&lt;SPAN class="lia-text-color-15"&gt;&lt;STRONG&gt;References&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;/H3&gt;
&lt;P&gt;&lt;A class="lia-internal-link lia-internal-url lia-internal-url-content-type-blog" href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/logic-apps-agentic-workflows-with-sap---part-2-ai-agents/4492362" target="_blank" rel="noopener" data-lia-auto-title="Logic Apps Agentic Workflows with SAP - Part 2: AI Agents" data-lia-auto-title-active="0"&gt;Logic Apps Agentic Workflows with SAP - Part 2: AI Agents&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/handling-errors-in-sap-bapi-transactions/1909185" target="_blank" rel="noopener"&gt;Handling Errors in SAP BAPI Transactions | Microsoft Community Hub&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/connectors/sap?tabs=standard" target="_blank" rel="noopener"&gt;Access SAP from workflows | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/connectors/sap-create-example-scenario-workflows?tabs=standard" target="_blank" rel="noopener"&gt;Create common SAP workflows | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/connectors/sap-generate-schemas-for-artifacts?tabs=standard" target="_blank" rel="noopener"&gt;Generate Schemas for SAP Artifacts via Workflows | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/logic-apps-enterprise-integration-xml-parse" target="_blank" rel="noopener"&gt;Parse XML using Schemas in Standard workflows - Azure Logic Apps | Microsoft Learn &lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-external-url" href="https://www.youtube.com/watch?v=5axAw_-HLU4" target="_blank" rel="noopener"&gt;Announcing XML Parse and Compose for Azure Logic Apps GA&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://help.sap.com/doc/abapdocu_cp_index_htm/CLOUD/en-US/abenabap_exceptions.html" target="_blank" rel="noopener"&gt;Exception Handling | ABAP Keyword Documentation&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://help.sap.com/doc/abapdocu_751_index_htm/7.51/en-us/abenhandl_prop_except_guidl.htm" target="_blank" rel="noopener"&gt;Handling and Propagating Exceptions - ABAP Keyword Documentation&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.sap.com/content/dam/support/en_us/library/ssp/products/connectors/msnet/NCo31_Overview.pdf" target="_blank" rel="noopener"&gt;SAP .NET Connector 3.1 Overview&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://support.sap.com/content/dam/support/en_us/library/ssp/products/connectors/msnet/NCo31_ProgrammingGuide.pdf" target="_blank" rel="noopener"&gt;SAP .NET Connector 3.1 Programming Guide&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;All supporting content for this post may be found in the &lt;A class="lia-external-url" href="https://github.com/Azure/logicapps/tree/master/agentic-sap-workflows" target="_blank" rel="noopener"&gt;companion GitHub repository.&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 23 Feb 2026 07:12:09 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/logic-apps-agentic-workflows-with-sap-part-1-infrastructure/ba-p/4491906</guid>
      <dc:creator>Emmanuel_Abram_Profeta</dc:creator>
      <dc:date>2026-02-23T07:12:09Z</dc:date>
    </item>
    <item>
      <title>Azure API Management - Unified AI Gateway Design Pattern</title>
      <link>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/azure-api-management-unified-ai-gateway-design-pattern/ba-p/4495436</link>
      <description>&lt;H2&gt;Scaling AI adoption requires a unified control plane&lt;/H2&gt;
&lt;P&gt;As organizations scale generative AI adoption, they face growing complexity managing multiple AI providers, models, API formats, and rapid release cycles. Without a unified control plane, enterprises risk fragmented governance, inconsistent developer experiences, and uncontrolled AI consumption costs.&lt;/P&gt;
&lt;P&gt;As an &lt;A class="lia-external-url" href="https://learn.microsoft.com/azure/api-management/genai-gateway-capabilities" target="_blank"&gt;AI Gateway&lt;/A&gt;, Azure API Management enables organizations to implement centralized AI mediation, governance, and developer access control across AI services. This blog post introduces the &lt;STRONG&gt;Unified AI Gateway design pattern&lt;/STRONG&gt;, a customer developed architecture pattern designed by &lt;A class="lia-external-url" href="https://www.uniper.energy/" target="_blank"&gt;Uniper&lt;/A&gt;, that builds on API Management’s policy extensibility to create a flexible and maintainable solution for managing AI services across providers, models, and environments.&amp;nbsp; Uniper runs this pattern in production today to optimize AI governance and operational efficiency, enhance the developer experience, and manage AI costs.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;Note: The Unified AI Gateway described in this post is a customer-implemented design pattern built using Azure API Management policy extensibility.&lt;/EM&gt;&lt;/P&gt;
&lt;H2&gt;Customer spotlight: Uniper&lt;/H2&gt;
&lt;P&gt;Uniper is a leading European energy company with a global footprint, generating, trading, and delivering electricity and natural gas through a diverse portfolio spanning hydro, wind, solar, nuclear, and flexible thermal assets. With a strategy centered on accelerating the energy transition, Uniper provides reliable and innovative energy solutions that power industries, strengthen grids, and support communities across its core markets.&lt;/P&gt;
&lt;P&gt;Committed to becoming one of Europe’s first AI-driven utilities, Uniper views artificial intelligence as a strategic cornerstone for future competitiveness, efficiency, and operational transformation. Building on a strong foundation of AI and machine-learning solutions—from plant optimization and predictive maintenance to advanced energy trading—Uniper is now scaling the adoption of generative AI (GenAI) across all business functions.&lt;/P&gt;
&lt;P&gt;At Uniper, AI is not just a technology enhancer—it is a business imperative. The momentum for AI-driven transformation starts within Uniper’s business areas, with the technology organization enabling and empowering this evolution through responsible, value-focused AI deployment.&lt;/P&gt;
&lt;img /&gt;
&lt;H2&gt;Enterprise challenges when scaling AI services&lt;/H2&gt;
&lt;P&gt;As Uniper expanded AI adoption, they encountered challenges common across enterprises implementing multi-model and multi-provider AI architectures:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;API growth and management overhead&lt;/STRONG&gt; – Using a conventional REST/SOAP API definition approach, each combination of AI provider, model, API type, and version typically results in a separate API schema definition in API Management. As AI services evolve, the number of API definitions can grow significantly, increasing management overhead.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Limited routing flexibility&lt;/STRONG&gt; – Each API schema definition is typically linked to a static backend, which prevents dynamic routing decisions based on factors like model cost, capacity, or performance (e.g., routing to gpt-4.1-mini instead of gpt-4.1).&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;Because AI services evolve rapidly, this approach creates exponential growth in API definitions and ongoing management overhead:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Separate APIs are typically needed for each of the following:&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;o&amp;nbsp;&amp;nbsp; AI service provider (e.g. Microsoft Foundry, Google Gemini)&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;o&amp;nbsp;&amp;nbsp; API type (e.g., OpenAI, Inference, Responses)&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;o&amp;nbsp;&amp;nbsp; Model (e.g., gpt-4.1, gpt-4.1-mini, phi-4)&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Each AI service also supports multiple versions. &lt;/STRONG&gt;For instance, OpenAI might include:&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;o&amp;nbsp;&amp;nbsp; 2025-01-01-preview (latest features)&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;o&amp;nbsp;&amp;nbsp; 2024-10-21 (stable release)&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;o&amp;nbsp;&amp;nbsp; 2024-02-01 (legacy support)&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Different request patterns may be required. &lt;/STRONG&gt;For example, Microsoft Foundry's OpenAI supports chat completion using both:&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;o&amp;nbsp;&amp;nbsp; OpenAI v1 format (/v1/chat/completions)&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;o&amp;nbsp;&amp;nbsp; Azure OpenAI format (/openai/deployments/{model}/chat/completions)&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Each API definition may be replicated across environments. &lt;/STRONG&gt;For example, Development, Test, and Production API Management environments.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H2&gt;The Unified AI Gateway design pattern&lt;/H2&gt;
&lt;P&gt;To address these challenges, Uniper implemented a policy-driven enterprise AI mediation layer using Azure API Management.&lt;/P&gt;
&lt;P&gt;At a high level, the pattern creates a single enterprise AI access layer that:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Normalizes requests across providers and models&lt;/LI&gt;
&lt;LI&gt;Enforces consistent authentication and governance&lt;/LI&gt;
&lt;LI&gt;Dynamically routes traffic across AI services&lt;/LI&gt;
&lt;LI&gt;Provides centralized observability and cost controls&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;The design emphasizes modular policy components that provide centralized, auditable control over security, routing, quotas, and monitoring.&lt;/P&gt;
&lt;H3&gt;Core architecture components&lt;/H3&gt;
&lt;P&gt;The following components are involved in the Unified AI Gateway pattern:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Single wildcard API definition&lt;/STRONG&gt; with wildcard operations (/*) that minimizes API management overhead. No API definition changes are required when introducing new AI providers, models, or APIs.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Unified authentication&lt;/STRONG&gt; that enforces consistent authentication for every request, supporting both API key and &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/api-management/validate-jwt-policy" target="_blank"&gt;JWT validation&lt;/A&gt; for inbound requests, with managed identity used for backend authentication to AI services.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Optimized path construction&lt;/STRONG&gt; that automatically transforms requests to simplify consuming AI services, such as automatic API version selection (for example, transforming /deployments/gpt-4.1-mini/chat/completions to /openai/deployments/gpt-4.1-mini/chat/completions?api-version=2025-01-01-preview).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Model and API aware backend&lt;/STRONG&gt; &lt;STRONG&gt;selection&lt;/STRONG&gt; that dynamically routes requests to backend AI services and load balancing pools based on capacity, cost, performance, and other operational factors.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Circuit breaker and load&lt;/STRONG&gt; &lt;STRONG&gt;balancing&lt;/STRONG&gt; that leverages API Management’s built-in circuit breaker functionality with load balancing pools to provide resiliency across backend AI services deployed in different regions. When endpoints reach failure thresholds, traffic automatically rebalances to healthy regional instances.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Tiered token limiting&lt;/STRONG&gt; that enforces token consumption using API Management’s &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/api-management/llm-token-limit-policy" target="_blank"&gt;llm-token-limit policy&lt;/A&gt; with quota thresholds.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Comprehensive trace logging and monitoring&lt;/STRONG&gt; using Application Insights to provide robust usage tracking and operational insights, including token tracking through API Management’s &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/api-management/llm-emit-token-metric-policy" target="_blank"&gt;llm‑emit‑token‑metric policy&lt;/A&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;img&gt;Unified AI Gateway pattern designed by Uniper&lt;/img&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;EM&gt;"The collaboration between the Uniper and Microsoft’s AI and API Management teams on delivering the unified AI gateway has been exceptional. Together, we've built a robust solution that provides the flexibility to rapidly adapt to fast-paced advancements in the AI sphere, while maintaining the highest standards of security, resilience, and governance. This partnership has enabled us to deliver enterprise-grade AI solutions that our customers can trust and scale with confidence." &lt;/EM&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;&lt;EM&gt;~ &lt;/EM&gt;&lt;EM&gt;Ian Beeson – Uniper, API Centre of Excellence Lead&lt;/EM&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;H2&gt;Uniper’s results: Business and operational impact&lt;/H2&gt;
&lt;P&gt;For Uniper, shifting to use the Unified AI Gateway pattern has proven to be a strategic enabler for scaling their AI adoption with API Management.&amp;nbsp; &amp;nbsp;Uniper reports significant improvements across governance, efficiency, developer experience, and cost management:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Centralized AI security and governance&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;o&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;Real-time content filtering &lt;/STRONG&gt;– Uniper can detect, log, and alert on content filter violations.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;o&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;Centralized audit and traceability&lt;/STRONG&gt; – All AI requests and responses are centrally logged, enabling unified auditing and tracing.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Operational efficiency&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;o&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;Reduction in API definitions&lt;/STRONG&gt; – Uniper estimates an &lt;STRONG&gt;85% API definition reduction&lt;/STRONG&gt;, moving from managing seven API definitions per environment (Development, Test, and Production) to a single universal wildcard API definition per environment.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;o&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;Feature deployment speed&lt;/STRONG&gt; – Uniper delivers AI capabilities &lt;STRONG&gt;60–180 days faster&lt;/STRONG&gt;, enabled by immediate feature availability and the elimination of reliance on API schema updates and migrations.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;o&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;AI service availability&lt;/STRONG&gt; – Uniper achieves &lt;STRONG&gt;99.99% availability for AI services&lt;/STRONG&gt;, enabled through circuit breakers and multi‑regional backend routing.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;o&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;Centralized ownership and maintenance&lt;/STRONG&gt; – API management responsibilities are now consolidated under a single team.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Improved developer experience&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;o&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;STRONG&gt;Immediate feature availability&lt;/STRONG&gt; – New AI capabilities are available immediately without requiring API definition updates, eliminating the previous 2–6-month delay before new features could be shared with Uniper’s developers.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;o&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;Automatic API schema compatibility&lt;/STRONG&gt; – Both Microsoft and third-party provider API updates no longer require migrations to new or updated API definitions. Previously, Uniper’s developers had to migrate for each update.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;o&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;Consistent API interface with equivalent SDK support&lt;/STRONG&gt; – A unified API surface across all AI services simplifies development and integration for Uniper’s developers.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;o&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;Equivalent request performance&lt;/STRONG&gt; – Uniper validated that request performance through the Unified AI Gateway pattern is equivalent to the conventional API definition approach, based on comparing the time a request is received by the gateway to the time it is sent to the backend.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;AI cost management&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;o&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;Token consumption visibility&lt;/STRONG&gt; – Uniper uses detailed usage and token level metrics to enable a charge‑back model.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;o&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;Automated cost controls&lt;/STRONG&gt; – Uniper enforces costs through configurable quotas and limits at both the AI gateway and backend AI service levels.&lt;/P&gt;
&lt;P class="lia-indent-padding-left-60px"&gt;o&amp;nbsp;&amp;nbsp; &lt;STRONG&gt;Optimized model routing&lt;/STRONG&gt; – Uniper dynamically routes requests to the most cost-effective models based on their policy.&lt;/P&gt;
&lt;img&gt;Uniper's results&lt;/img&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;&lt;EM&gt;“The Unified AI Gateway pattern has fundamentally changed how we scale and govern AI across the enterprise. By consolidating AI access behind a single, policy-driven Azure API Management layer, we’ve reduced operational complexity while improving security, resilience,&amp;nbsp;and developer experience. Most importantly, this approach allows us to adopt new models and capabilities at the pace the AI ecosystem demands—without compromising performance, availability, or governance.”&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&amp;nbsp;~ Hinesh Pankhania – Uniper, Head of Cloud Engineering &amp;amp; CCoE&lt;/EM&gt;&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;H2&gt;When to use this pattern&lt;/H2&gt;
&lt;P&gt;The Unified AI Gateway pattern is most beneficial when organizations experience growing AI service complexity. Consider using the Unified AI Gateway pattern when:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Multiple AI service providers&lt;/STRONG&gt;: Your organization integrates with various AI service providers (Microsoft Foundry, Google Gemini, etc.)&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Frequent model/API changes&lt;/STRONG&gt;: New models/APIs need to be regularly added or existing ones updated&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Dynamic routing needs&lt;/STRONG&gt;: Your organization requires dynamic backend selection based on capacity, cost, or performance&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;When not to use this pattern&lt;/STRONG&gt;: If you expect a limited number of models/API definitions with minimal ongoing changes, following the conventional approach may be simpler to implement and maintain. The additional implementation and maintenance effort required by the Unified AI Gateway pattern should be weighed against the management overhead it is intended to reduce. Refer to the next section for details on implementing the Unified AI Gateway pattern, including how the request and response pipeline is built using API Management &lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/api-management/policy-fragments" target="_blank"&gt;policy fragments&lt;/A&gt;.&lt;/P&gt;
&lt;H2&gt;Get started&lt;/H2&gt;
&lt;P&gt;Get started by exploring a simplified sample that demonstrates the Unified AI Gateway pattern: &lt;A class="lia-external-url" href="https://github.com/Azure-Samples/APIM-Unified-AI-Gateway-Sample" target="_blank"&gt;Azure-Samples/APIM-Unified-AI-Gateway-Sample&lt;/A&gt;. The sample shows how to route requests to multiple AI models through a single API Management endpoint, including &lt;STRONG&gt;Phi‑4, GPT‑4.1, and GPT‑4.1‑mini from Microsoft Foundry&lt;/STRONG&gt;, as well as &lt;STRONG&gt;Google Gemini 2.5 Flash‑Lite&lt;/STRONG&gt;. It uses a universal wildcard API definition (/*) across GET, POST, PUT, and DELETE operations, routing all requests through a unified, policy-driven pipeline built with policy fragments to ensure consistent security, dynamic routing, load balancing, rate limiting, and comprehensive logging and monitoring.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The Unified AI Gateway pattern is designed to be extensible, allowing organizations to add support for additional API types, models, versions, etc. to meet their unique requirements through minimal updates to policy fragments. Each policy fragment is designed as a modular component with a single, well-defined responsibility. This modular design enables targeted customization, such as adding customized token tracking, without impacting the rest of the pipeline.&lt;/P&gt;
&lt;img&gt;Unified AI Gateway sample component diagram&lt;/img&gt;
&lt;H2&gt;Acknowledgments&lt;/H2&gt;
&lt;P&gt;We would like to recognize the following Uniper contributors for their design of the Unified AI Gateway pattern and their contributions to this blog post:&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;~&amp;nbsp;&lt;/EM&gt;&lt;A class="lia-external-url" href="https://www.linkedin.com/in/hinesh-pankhania/" target="_blank"&gt;Hinesh Pankhania, Uniper – Head of Cloud Engineering and CCoE&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;~ &lt;/EM&gt;&lt;A class="lia-external-url" href="https://www.linkedin.com/in/ian-beeson-1918ab36/" target="_blank"&gt;Ian Beeson, Uniper - API Centre of Excellence Lead&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;~ &lt;/EM&gt;&lt;A class="lia-external-url" href="https://www.linkedin.com/in/steveatco/" target="_blank"&gt;Steve Atkinson – Freelance AI Architect and AI Engineering Lead (Contract)&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Tue, 17 Feb 2026 16:21:27 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/azure-api-management-unified-ai-gateway-design-pattern/ba-p/4495436</guid>
      <dc:creator>nicolehaugen</dc:creator>
      <dc:date>2026-02-17T16:21:27Z</dc:date>
    </item>
    <item>
      <title>A BizTalk Migration Tool: From Orchestrations to Logic Apps Workflows</title>
      <link>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/a-biztalk-migration-tool-from-orchestrations-to-logic-apps/ba-p/4494876</link>
      <description>&lt;P&gt;As organizations move toward cloud-native architecture, this project addresses one of the most challenging aspects of modernization: converting existing BizTalk artifacts into their Azure Logic Apps equivalents while preserving business logic and integration patterns.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P class="lia-clear-both"&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Architecture and Components&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;The BizTalk Migration Starter is available here: &lt;A href="https://github.com/haroldcampos/BizTalkMigrationStarter" target="_blank" rel="noopener"&gt;haroldcampos/BizTalkMigrationStarter&lt;/A&gt; and&amp;nbsp;consists of four main projects and a test project, each targeting a specific aspect of BizTalk migration:&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;BTMtoLMLMigrator - BizTalk Map Converter&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;The BTMtoLMLMigrator is a tool that converts BizTalk Maps (.btm files) to the Logic Apps Mapping Language (.lml files). BizTalk maps define data transformations between different message formats, using XSLT and functoids to implement complex mapping logic.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Input:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Output:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Key Capabilities:&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Parses BizTalk map XML structure to extract transformation logic.&lt;/LI&gt;
&lt;LI&gt;Translates BizTalk functoids (string manipulation, mathematical operations, logical operations, date/time functions, etc.) to equivalent LML syntax&lt;/LI&gt;
&lt;LI&gt;Preserves source and target schema references&lt;/LI&gt;
&lt;LI&gt;Generates Logic Apps-compatible Liquid maps that can be directly deployed to Azure Integration Accounts&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;Core Components:&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;U&gt;BtmParser.cs&lt;/U&gt;: Extracts map structure, functoid definitions, and link connections from BTM files&lt;/LI&gt;
&lt;LI&gt;&lt;U&gt;FunctoidTranslator.cs&lt;/U&gt;: Converts BizTalk functoid operations to Logic Apps Maps template equivalents&lt;/LI&gt;
&lt;LI&gt;&lt;U&gt;LmlGenerator.cs&lt;/U&gt;: Generates the final LML output&lt;/LI&gt;
&lt;LI&gt;&lt;U&gt;BtmMigrator.cs&lt;/U&gt;: Orchestrates the entire conversion process&lt;/LI&gt;
&lt;LI&gt;&lt;U&gt;Models.cs&lt;/U&gt;: Defines data structures for representing maps, functoids, and links&lt;/LI&gt;
&lt;/UL&gt;
&lt;H6&gt;&lt;STRONG&gt;To convert a single map:&lt;/STRONG&gt;&lt;/H6&gt;
&lt;P&gt;BTMtoLMLMigrator.exe -btm "C:\BizTalkMaps\OrderToInvoice.btm" -source "C:\Schemas\Order.xsd" -target "C:\Schemas\Invoice.xsd" -output "C:\Output\OrderToInvoice.lml"&lt;/P&gt;
&lt;H6&gt;&lt;STRONG&gt;To Convert all maps in a directory:&lt;/STRONG&gt;&lt;/H6&gt;
&lt;P&gt;Be mindful of having the right naming for schemas in the BizTalk maps to avoid the tool picking up the wrong schemas:&lt;/P&gt;
&lt;P&gt;BTMtoLMLMigrator.exe -batchDir "C:\BizTalkMaps" -schemasDir "C:\Schemas" -outputDir "C:\Output\LMLMaps"&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Recommendations and Troubleshooting:&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Make sure to use the real schemas, source and destination, and the corresponding map.&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Most BizTalk functoids are supported, however for those who don’t, like scripting, it will add the code into the lml file, expecting you to conduct a re-design of the scenario. Currently the Data Mapper does not have a direct function that replaces scripting functoids. We are exploring alternatives for this.&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Use GHCP agent to troubleshoot the tool if you run into issues.&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;ODXtoWFMigrator - Orchestration to Workflow Converter&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;The ODXtoWFMigrator tackles one of the most complex aspects of BizTalk migration: converting BizTalk Orchestrations (.odx files) to Azure Logic Apps workflow definitions. Orchestrations represent business processes with sequential, parallel, and conditional logic flows. It requires the orchestration and bindings file, exported from the BizTalk Application. If you don't have orchestration, for Content Routing Based scenarios, it uses the bindings file only.&lt;/P&gt;
&lt;P&gt;Go to BizTalk Central Admin. Select your BizTalk Application:&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;Export all bindings. You can have multiple orchestrations in one binding file, so is important to export all the information available.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Input:&lt;/STRONG&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Output:&lt;/STRONG&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Key Capabilities:&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Parses BizTalk orchestration XML to extract process flows, shapes, and connections&lt;/LI&gt;
&lt;LI&gt;Maps BizTalk orchestration shapes (Receive, Send, Decide, Parallel, Loop, etc.) to Logic Apps actions and control structures&lt;/LI&gt;
&lt;LI&gt;Generates connector configurations for common integration patterns&lt;/LI&gt;
&lt;LI&gt;Creates comprehensive migration reports documenting the conversion process and any limitations&lt;/LI&gt;
&lt;LI&gt;Produces standard Logic Apps JSON workflow definitions ready for deployment&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;Core Components:&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;BizTalkOrchestrationParser.cs: Analyzes orchestration structure and extracts workflow patterns&lt;/LI&gt;
&lt;LI&gt;LogicAppsMapper.cs: Maps BizTalk orchestration shapes to Logic Apps equivalents&lt;/LI&gt;
&lt;LI&gt;LogicAppJSONGenerator.cs: Generates the final Logic Apps workflow JSON&lt;/LI&gt;
&lt;LI&gt;OrchestrationReportGenerator.cs: Creates detailed migration reports.&lt;/LI&gt;
&lt;LI&gt;Schemas/Connectors/connector-registry.json: Registry of connector mappings and configurations&lt;/LI&gt;
&lt;/UL&gt;
&lt;H5&gt;&lt;STRONG&gt;Recommendations and Troubleshooting:&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Most BizTalk shapes are supported, however for those who don’t, it will default to compose actions and inject the code or a comment. It supports most BizTalk adapters.&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;If you need to add support to a new Logic Apps connector/service provider, you can update the connector-registry.json &lt;/STRONG&gt;file&lt;STRONG&gt; &lt;/STRONG&gt;by adding the trigger or action following the pattern for the other entries&lt;STRONG&gt;.&lt;/STRONG&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;This tool has been tested with multiple patterns and orchestrations. Use GHCP agent to troubleshoot the tool if you run into issues.&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;U&gt;The following are some&lt;/U&gt;&lt;/STRONG&gt; of the supported commands. Please run the command line and review the README files to see all supported commands.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-border-color-custom-ff0000 lia-border-style-solid" border="1" style="width: 1076px; border-width: 1px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;Command&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;Sample Usage&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;MIGRATE / CONVERT&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;With output file&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;ODXtoWFMigrator.exe convert "C:\BizTalk\InventorySync.odx" "C:\BizTalk\BindingInfo.xml" "C:\Output\InventorySync.workflow.json"&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;With refactored generator&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;ODXtoWFMigrator.exe migrate "C:\BizTalk\MessageRouter.odx" "C:\BizTalk\BindingInfo.xml" --refactor&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;BINDINGS-ONLY&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;Basic bindings-only&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;ODXtoWFMigrator.exe bindings-only "C:\BizTalk\ProductionBindings.xml"&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;With output directory&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;ODXtoWFMigrator.exe bindings-only "C:\BizTalk\BindingInfo.xml" "C:\LogicApps\BindingsWorkflows"&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;With refactored generator&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;ODXtoWFMigrator.exe bindings-only "C:\BizTalk\BindingInfo.xml" --refactor&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;REPORT / ANALYZE&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;Basic HTML report&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;ODXtoWFMigrator.exe report "C:\BizTalk\OrderProcessing.odx"&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;With output file&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;ODXtoWFMigrator.exe report "C:\BizTalk\OrderProcessing.odx" --output "C:\Reports\OrderProcessing_Analysis.html"&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;BATCH REPORT&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;Process directory&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;ODXtoWFMigrator.exe batch report --directory "C:\BizTalk\Orchestrations"&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;Short directory flag&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;ODXtoWFMigrator.exe batch report -d "C:\BizTalk\ContosoProject\Orchestrations"&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;BATCH CONVERT&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;Basic batch convert&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;ODXtoWFMigrator.exe batch convert --directory "C:\BizTalk\Orchestrations" --bindings "C:\BizTalk\BindingInfo.xml"&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;Alternative migrate syntax&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;ODXtoWFMigrator.exe batch migrate -d "C:\BizTalk\AllOrchestrations" -b "C:\BizTalk\BindingInfo.xml"&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;Specific files&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;ODXtoWFMigrator.exe batch convert --files "C:\BizTalk\Order.odx,C:\BizTalk\Invoice.odx" --bindings "C:\BizTalk\BindingInfo.xml"&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;With output directory&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;ODXtoWFMigrator.exe batch convert -d "C:\BizTalk\Orchestrations" -b "C:\BizTalk\BindingInfo.xml" -o "C:\LogicApps\Workflows"&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;With refactored generator&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;ODXtoWFMigrator.exe batch convert -d "C:\BizTalk\Orchestrations" -b "C:\BizTalk\BindingInfo.xml" --refactor&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;GENERATE-PACKAGE&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;Basic package generation&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;ODXtoWFMigrator.exe generate-package "C:\BizTalk\OrderProcessing.odx" "C:\BizTalk\BindingInfo.xml"&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;With output directory&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;ODXtoWFMigrator.exe generate-package "C:\BizTalk\OrderProcessing.odx" "C:\BizTalk\BindingInfo.xml" "C:\Deploy\OrderProcessing"&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;With refactored generator&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;ODXtoWFMigrator.exe package "C:\BizTalk\CloudIntegration.odx" "C:\BizTalk\BindingInfo.xml" --refactor&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;ANALYZE-ODX / GAP-ANALYSIS&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;Analyze directory&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;ODXtoWFMigrator.exe analyze-odx "C:\BizTalk\LegacyOrchestrations"&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;With output report&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;ODXtoWFMigrator.exe analyze-odx "C:\BizTalk\Orchestrations" --output "C:\Reports\gap_analysis.json"&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;LEGACY MODE&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;Legacy basic&lt;/P&gt;
&lt;/td&gt;&lt;td class="lia-border-color-custom-ff0000"&gt;
&lt;P&gt;&lt;STRONG&gt;ODXtoWFMigrator.exe "C:\BizTalk\OrderProcessing.odx" "C:\BizTalk\BindingInfo.xml" "C:\Output\OrderProcessing.json"&lt;/STRONG&gt;&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 313px" /&gt;&lt;col style="width: 763px" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;BTPtoLA - Pipeline to Logic Apps Converter&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;BTPtoLA handles the conversion of BizTalk pipelines to Logic Apps components. BizTalk pipelines process messages as they enter or leave the messaging engine, performing operations like validation, decoding, and transformation.&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Key Capabilities:&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Converts BizTalk receive and send pipelines to Logic Apps processing patterns&lt;/LI&gt;
&lt;LI&gt;Maps pipeline components (decoders, validators, disassemblers, etc.) to Logic Apps actions&lt;/LI&gt;
&lt;LI&gt;Preserves pipeline stage configurations and component properties&lt;/LI&gt;
&lt;LI&gt;Generates appropriate connector configurations for pipeline operations&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Input:&lt;/STRONG&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;STRONG&gt;&amp;nbsp;Output:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;&lt;STRONG&gt;Core Components:&lt;/STRONG&gt;&lt;/H5&gt;
&lt;UL&gt;
&lt;LI&gt;Pipeline parsing and analysis logic&lt;/LI&gt;
&lt;LI&gt;Connector registry (Schemas/Connectors/pipeline-connector-registry.json) for mapping pipeline components&lt;/LI&gt;
&lt;LI&gt;Logic Apps workflow generation for pipeline equivalents&lt;/LI&gt;
&lt;/UL&gt;
&lt;H6&gt;&lt;STRONG&gt;To convert a receive pipeline:&lt;/STRONG&gt;&lt;/H6&gt;
&lt;P&gt;BTPtoLA.exe -pipeline "C:\Pipelines\ReceiveOrderPipeline.btp" -type receive -output "C:\Output\ReceiveOrderPipeline.json"&lt;/P&gt;
&lt;H6&gt;&lt;STRONG&gt;To Convert a send pipeline:&lt;/STRONG&gt;&lt;/H6&gt;
&lt;P&gt;BTPtoLA.exe -pipeline "C:\Pipelines\SendInvoicePipeline.btp" -type send -output "C:\Output\SendInvoicePipeline.json"&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;BizTalktoLogicApps.MCP - Model Context Protocol Server&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;The MCP (Model Context Protocol) server provides a standardized interface for AI-assisted migration workflows. This component enables integration with AI tools and assistants to provide intelligent migration suggestions and automation.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Key Capabilities:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Exposes migration tools through a standardized MCP interface&lt;/LI&gt;
&lt;LI&gt;Enables AI-driven migration assistance and recommendations&lt;/LI&gt;
&lt;LI&gt;Provides tool handlers for map conversion and other migration operations&lt;/LI&gt;
&lt;LI&gt;Facilitates interactive migration workflows with AI assistance&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;STRONG&gt;Core Components:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;McpServer.cs: Main MCP server implementation&lt;/LI&gt;
&lt;LI&gt;Server/ToolHandlers/MapConversionToolHandler.cs: Handler for map conversion operations&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;test-requests.json&lt;/STRONG&gt;: Test request definitions for validating MCP functionality&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3&gt;&lt;STRONG&gt;BizTalktoLogicApps.Tests - Test Project&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;A complete test project ensuring the reliability and accuracy of all migration tools, with integration tests that validate end-to-end conversion scenarios.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Key Capabilities:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Integration tests for BTM to LML conversion across multiple map files&lt;/LI&gt;
&lt;LI&gt;Schema validation and error handling tests&lt;/LI&gt;
&lt;LI&gt;Batch processing tests for converting multiple artifacts&lt;/LI&gt;
&lt;LI&gt;Output verification and quality assurance&lt;/LI&gt;
&lt;/UL&gt;
&lt;H4&gt;Where to upload your data:&lt;/H4&gt;
&lt;P&gt;Upload your BizTalk artifacts in the Data directory, and run your tests using the Test explorer.&lt;/P&gt;
&lt;img /&gt;&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For a complete demonstration, watch the video below:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;div data-video-id="https://youtu.be/H-Cw3mCxMms?si=tBjoVFjAY3qRNCmk/1771005216006" data-video-remote-vid="https://youtu.be/H-Cw3mCxMms?si=tBjoVFjAY3qRNCmk/1771005216006" class="lia-video-container lia-media-is-center lia-media-size-large"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2FH-Cw3mCxMms%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3DH-Cw3mCxMms&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2FH-Cw3mCxMms%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" allowfullscreen="" style="max-width: 100%"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 13 Feb 2026 19:03:08 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/a-biztalk-migration-tool-from-orchestrations-to-logic-apps/ba-p/4494876</guid>
      <dc:creator>hcamposu</dc:creator>
      <dc:date>2026-02-13T19:03:08Z</dc:date>
    </item>
    <item>
      <title>Azure Arc Jumpstart Template for Hybrid Logic Apps Deployment</title>
      <link>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/azure-arc-jumpstart-template-for-hybrid-logic-apps-deployment/ba-p/4493996</link>
      <description>&lt;P&gt;&lt;SPAN data-contrast="auto"&gt;Today&amp;nbsp;I’m&amp;nbsp;sharing a new Azure Arc Jumpstart template (Jumpstart Drop) that implements a&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&lt;STRONG&gt;hybrid deployment&lt;/STRONG&gt; for Azure Logic Apps&amp;nbsp;(Standard)&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;on Azure Arc-enabled AKS cluster&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;which&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;enables deployment with a&amp;nbsp;&lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="none"&gt;single command&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="none"&gt;&amp;nbsp;that sets up a complete, working environment for testing your scenarios.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Jumpstart Drop link:&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://jumpstart.azure.com/azure_jumpstart_drops?repo=arc_jumpstart_drops&amp;amp;branch=main&amp;amp;drop=Hybrid%20deployment%20for%20Azure%20Logic%20Apps%20on%20AKS" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Azure Arc Jumpstart&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="none"&gt;Hybrid deployment model allows you to run Logic Apps workloads on your own infrastructure, providing you with the option to host your integration solutions on premises, in a private cloud, or even in a third-party public cloud. You can find more information in this article:&lt;/SPAN&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/set-up-standard-workflows-hybrid-deployment-requirements" target="_blank" rel="noopener"&gt;Set up your own infrastructure for Standard logic app workflows - Azure Logic Apps | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="auto"&gt;Demo&amp;nbsp;video:&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;div contenteditable="false" class="lia-embeded-content"&gt;&lt;iframe src="https://cdn.embedly.com/widgets/media.html?src=https%3A%2F%2Fwww.youtube.com%2Fembed%2F_Qf_U-d7lXg%3Ffeature%3Doembed&amp;amp;display_name=YouTube&amp;amp;url=https%3A%2F%2Fwww.youtube.com%2Fwatch%3Fv%3D_Qf_U-d7lXg&amp;amp;image=https%3A%2F%2Fi.ytimg.com%2Fvi%2F_Qf_U-d7lXg%2Fhqdefault.jpg&amp;amp;type=text%2Fhtml&amp;amp;schema=youtube" title="YouTube embed" scrolling="no" allowfullscreen="allowfullscreen" frameborder="0" allow="autoplay; fullscreen; encrypted-media; picture-in-picture;" class="lia-iframe-embeded" sandbox="allow-scripts allow-same-origin"&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="none"&gt;Given that&amp;nbsp;Hybrid&amp;nbsp;Logic Apps is designed to support mission-critical, enterprise-level integration scenarios,&amp;nbsp;with provision to configure&amp;nbsp;on custom infrastructure across both Azure and Kubernetes environments—the setup can naturally be complex. This Jumpstart template addresses these intricacies by simplifying onboarding and providing an all-in-one script for comprehensive testing and validation.&lt;/SPAN&gt;&lt;SPAN data-contrast="auto"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="none"&gt;This Jumpstart template deploys the following components and verifies each deployment stage.&amp;nbsp;You can customize each step as per your requirements&amp;nbsp;by&amp;nbsp;modifying&amp;nbsp;the script.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="12" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="none"&gt;An AKS cluster as the Kubernetes substrate for the scenario.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:true,&amp;quot;134233118&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:240}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="12" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="none"&gt;Azure Arc enablement for Kubernetes to onboard the cluster into Azure for centralized governance and operations.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:true,&amp;quot;134233118&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:240}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="12" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="none"&gt;ACA extension, Custom&amp;nbsp;location&amp;nbsp;and Connected Environment.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:true,&amp;quot;134233118&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:240}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="12" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="4" data-aria-level="1"&gt;&lt;SPAN data-contrast="none"&gt;Azure SQL Server for runtime storage.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:true,&amp;quot;134233118&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:240}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="12" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="5" data-aria-level="1"&gt;&lt;SPAN data-contrast="none"&gt;Azure storage account for SMB artifacts storage.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:true,&amp;quot;134233118&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:240}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;UL&gt;
&lt;LI aria-setsize="-1" data-leveltext="" data-font="Symbol" data-listid="12" data-list-defn-props="{&amp;quot;335552541&amp;quot;:1,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769226&amp;quot;:&amp;quot;Symbol&amp;quot;,&amp;quot;469769242&amp;quot;:[8226],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="6" data-aria-level="1"&gt;&lt;SPAN data-contrast="none"&gt;A&amp;nbsp;hybrid logic Apps&amp;nbsp;resource.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:true,&amp;quot;134233118&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559740&amp;quot;:240}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{&amp;quot;134233117&amp;quot;:true,&amp;quot;134233118&amp;quot;:true,&amp;quot;201341983&amp;quot;:0,&amp;quot;335559685&amp;quot;:720,&amp;quot;335559740&amp;quot;:240}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P aria-level="2"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Get&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;ting&lt;/SPAN&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;&amp;nbsp;started&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt; :&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&lt;SPAN data-contrast="none"&gt;Visit the Jumpstart URL&amp;nbsp;&lt;A href="https://jumpstart.azure.com/azure_jumpstart_drops?repo=arc_jumpstart_drops&amp;amp;branch=main&amp;amp;drop=Hybrid%20deployment%20for%20Azure%20Logic%20Apps%20on%20AKS" target="_blank" rel="noopener"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Azure Arc Jumpstart&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;and follow the steps below.&lt;/SPAN&gt; &lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;OL&gt;
&lt;LI aria-setsize="-1" data-leveltext="%1." data-font="Aptos" data-listid="9" data-list-defn-props="{&amp;quot;335552541&amp;quot;:0,&amp;quot;335559685&amp;quot;:1440,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[65533,0],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;%1.&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="1" data-aria-level="1"&gt;&lt;SPAN data-contrast="none"&gt;Check prerequisites and permissions (see Prerequisites tab).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559685&amp;quot;:720}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;OL&gt;
&lt;LI aria-setsize="-1" data-leveltext="%1." data-font="Aptos" data-listid="9" data-list-defn-props="{&amp;quot;335552541&amp;quot;:0,&amp;quot;335559685&amp;quot;:1440,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[65533,0],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;%1.&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="2" data-aria-level="1"&gt;&lt;SPAN data-contrast="none"&gt;Download the GitHub repo and run the deployment command (see Quick Start tab).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559685&amp;quot;:720}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;OL&gt;
&lt;LI aria-setsize="-1" data-leveltext="%1." data-font="Aptos" data-listid="9" data-list-defn-props="{&amp;quot;335552541&amp;quot;:0,&amp;quot;335559685&amp;quot;:1440,&amp;quot;335559991&amp;quot;:360,&amp;quot;469769242&amp;quot;:[65533,0],&amp;quot;469777803&amp;quot;:&amp;quot;left&amp;quot;,&amp;quot;469777804&amp;quot;:&amp;quot;%1.&amp;quot;,&amp;quot;469777815&amp;quot;:&amp;quot;multilevel&amp;quot;}" data-aria-posinset="3" data-aria-level="1"&gt;&lt;SPAN data-contrast="none"&gt;After deployment, run test commands to confirm everything works (see Testing tab).&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559685&amp;quot;:720}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559685&amp;quot;:720}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P aria-level="2"&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-parastyle="heading 2"&gt;Feedback and contributions&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;134245418&amp;quot;:true,&amp;quot;134245529&amp;quot;:true,&amp;quot;335559738&amp;quot;:160,&amp;quot;335559739&amp;quot;:80}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-contrast="none"&gt;Jumpstart templates are built for the community and improved with community input. If you try this drop and have suggestions (documentation clarity,&amp;nbsp;additional&amp;nbsp;validation, new scenarios, or fixes),&amp;nbsp;please share feedback through&amp;nbsp;the&amp;nbsp;https://github.com/ShreeDivyaMV/LogicApps_Jumpstart_Templates&amp;nbsp;repository associated with the drop.&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559685&amp;quot;:720}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;SPAN data-ccp-props="{&amp;quot;335559685&amp;quot;:720}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Heading 2 Char"&gt;References&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;SPAN data-contrast="none"&gt;:&lt;/SPAN&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/announcement-general-availability-of-logic-apps-hybrid-deployment-model/4422414" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Announcement: General Availability of Logic Apps Hybrid Deployment Model | Microsoft Community Hub&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/logic-apps/create-standard-workflows-hybrid-deployment?branch=main&amp;amp;branchFallbackFrom=pr-en-us-287718&amp;amp;tabs=azure-portal" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Create Standard logic app workflows for hybrid deployment - Azure Logic Apps | Microsoft Learn&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://github.com/ShreeDivyaMV/LogicApps_Jumpstart_Templates" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;https://github.com/ShreeDivyaMV/LogicApps_Jumpstart_Templates&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href="https://jumpstart.azure.com/azure_jumpstart_drops?repo=arc_jumpstart_drops&amp;amp;branch=main&amp;amp;drop=Hybrid%20deployment%20for%20Azure%20Logic%20Apps%20on%20AKS" target="_blank" rel="noopener"&gt;&lt;SPAN data-contrast="none"&gt;&lt;SPAN data-ccp-charstyle="Hyperlink"&gt;Azure Arc Jumpstart&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN data-ccp-props="{}"&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Tue, 10 Feb 2026 03:43:20 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/azure-arc-jumpstart-template-for-hybrid-logic-apps-deployment/ba-p/4493996</guid>
      <dc:creator>Shree_Divya_M_V</dc:creator>
      <dc:date>2026-02-10T03:43:20Z</dc:date>
    </item>
    <item>
      <title>Logic Apps Aviators Newsletter - February 2026</title>
      <link>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/logic-apps-aviators-newsletter-february-2026/ba-p/4491309</link>
      <description>&lt;P&gt;&lt;STRONG&gt;In this issue:&lt;/STRONG&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="#community--1-aceaviator" target="_blank" rel="noopener"&gt;Ace Aviator of the Month&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="#community--1-productnews" target="_blank" rel="noopener"&gt;News from our product group&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="#community--1-communitynews" target="_blank" rel="noopener"&gt;News from our community&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;HR /&gt;
&lt;H1 id="aceaviator"&gt;Ace Aviator of the Month&lt;/H1&gt;
&lt;P&gt;&lt;STRONG&gt;February 2026’s Ace Aviator:&amp;nbsp;&lt;A class="lia-external-url" href="https://www.linkedin.com/in/camilla-bielk-0481411/" target="_blank" rel="noopener"&gt;Camilla Bielk&lt;/A&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;img&gt;Camilla Bielk - Solutions Architect @ XLENT&lt;/img&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;What's your role and title? What are your responsibilities?&lt;/H5&gt;
&lt;P&gt;I’m a developer and solution architect, working as a consultant (at XLENT) in teams involved across the integration lifecycle—from understanding business needs and building new solutions to operations. Previously I worked a lot with BizTalk and with customers using both Azure and BizTalk. In my current role, I work exclusively with Azure.&lt;/P&gt;
&lt;H5&gt;Can you give us some insights into your day-to-day activities and what a typical day in your role looks like?&lt;/H5&gt;
&lt;P&gt;A typical day starts by syncing operational status with the team to ensure everything is running as expected (Logic Apps, Service Bus, Functions, API Management, etc.) and discussing any findings from the previous day. Then I continue with ongoing work, ranging from stakeholder meetings and designing new integration flows to C# development, operations, and maintenance of the existing landscape.&lt;/P&gt;
&lt;P&gt;I enjoy being involved across the entire chain. Working closely with operational issues provides valuable input into design decisions, and vice versa, which strengthens me as a designer and architect.&lt;/P&gt;
&lt;H5&gt;What motivates and inspires you to be an active member of the Aviators/Microsoft community?&lt;/H5&gt;
&lt;P&gt;The openness to feedback and knowledge sharing from both community developers and the product team motivates me to stay active, continuously learn, and become the best consultant I can be. Passing knowledge to new team members is rewarding and completes the circle. Integration conferences are inspiring - networking with amazing people and discussing the technology we use every day. That’s also why we started the Nordic Integration Summit: to give more people the chance to take part in such an inspiring event.&lt;/P&gt;
&lt;H5&gt;Looking back, what advice do you wish you had been given earlier that you'd now share with those looking to get into STEM/technology?&lt;/H5&gt;
&lt;P&gt;Your social skills are more valuable than you might think. Teamwork is everything, and understanding business needs—even from non-technical colleagues—is just as important as technology. Listen to your heart and find environments where you can thrive.&lt;/P&gt;
&lt;P&gt;Programming languages change over time; the real takeaway is mastering common concepts and patterns and developing the ability to learn continuously. Stay curious and embrace new things as they come!&lt;/P&gt;
&lt;H5&gt;What has helped you grow professionally?&lt;/H5&gt;
&lt;P&gt;100% of my professional growth comes from working with kind, humble, and collaborative people—teams where knowledge is shared freely in all directions, mistakes are allowed, and learning from them is encouraged.&lt;/P&gt;
&lt;H5&gt;If you had a magic wand that could create a feature in Logic Apps, what would it be and why?&lt;/H5&gt;
&lt;P&gt;Better cost transparency—clearly showing which actions drive costs (executions, retries, data volume, logging) with visibility before production deployment. Design-time guidance that warns about expensive operations, anti-patterns, and inefficient configurations.&lt;/P&gt;
&lt;HR /&gt;
&lt;H1 id="productnews"&gt;News from our product group&lt;/H1&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-border-style-solid" border="1" style="width: 100%; border-width: 1px; border-spacing: 2px;"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="border-width: 1px; padding: 2px;"&gt;&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&amp;nbsp;&lt;/td&gt;&lt;td style="border-width: 1px; padding: 2px;"&gt;
&lt;H5&gt;&lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/introducing-unit-test-agent-profiles-for-logic-apps--data-maps/4490216" target="_blank" rel="noopener noreferrer"&gt;Introducing Unit Test Agent Profiles for Logic Apps &amp;amp; Data Maps&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Focused unit test agent profiles help Logic Apps Standard teams discover workflows and data maps, write reusable specifications, generate typed mocks/test data, and implement MSTest suites against the Automated Test SDK. The approach promotes spec-first testing, consistent artifacts, and reliable validations across scenarios (happy path, error handling, boundaries). The project demonstrates how GitHub Copilot custom agents and prompts can accelerate unit test authoring while enforcing constraints for maintainability in enterprise integrations.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-width: 1px; padding: 2px;"&gt;&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td style="border-width: 1px; padding: 2px;"&gt;
&lt;H5&gt;&lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/automated-test-framework---missing-tests-in-test-explorer/4490186" target="_blank" rel="noopener noreferrer"&gt;Automated Test Framework - Missing Tests in Test Explorer&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;If Logic Apps Standard tests disappear from VS Code’s Test Explorer, the cause is typically a MSTest version mismatch introduced by a recent C# DevKit update. The fix is to update package references in the project (MSTest, Test SDK, and related dependencies) to supported versions. After adjusting packages and restarting VS Code, tests reappear and run as expected. The extension is being updated, but existing projects should apply the manual changes to restore a stable testing experience.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-width: 1px; padding: 2px;"&gt;&amp;nbsp;&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;/td&gt;&lt;td style="border-width: 1px; padding: 2px;"&gt;
&lt;H5&gt;&lt;A href="https://techcommunity.microsoft.com/blog/integrationsonazureblog/upcoming-agentic-azure-logic-apps-workshops/4484526" target="_blank" rel="noopener noreferrer"&gt;Upcoming Agentic Azure Logic Apps Workshops&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Free workshops introduce Agentic Business Processes in Azure Logic Apps, including MCP Server integrations and agent loop patterns. Sessions cover connecting the enterprise with MCP Servers from Copilot Studio and building agentic workflows in a day using Logic Apps (Standard). Registration links are provided, with dates set in January. These events help practitioners explore agent tools, orchestration patterns, and practical scenarios for intelligent automation in modern integration landscapes.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 50.00%" /&gt;&lt;col style="width: 50.00%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;HR /&gt;
&lt;H1 id="communitynews"&gt;News from our community&lt;/H1&gt;
&lt;H5&gt;&lt;A href="https://www.linkedin.com/pulse/enterprise-ai-copilot-al-ghoniem-mba-cr87c" target="_blank" rel="noopener noreferrer"&gt;Enterprise AI ≠ Copilot&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://www.linkedin.com/in/alghoniem" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Al Ghoniem, MBA&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Deploying Copilot is not the same as building an enterprise AI strategy. This article distinguishes between adopting a product versus developing a core organizational capability. It explores why many AI rollouts stall when treated as point solutions and outlines what it takes to embed AI as a strategic, scalable function across the enterprise. For leaders evaluating their AI roadmaps, this piece offers a framework for thinking beyond tools toward sustainable transformation.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://blog.sandro-pereira.com/2026/01/27/biztalk-server-and-winscp-error-could-not-load-file-or-assembly-winscpnet-version1-16-0-16453-cultureneutral-publickeytoken2271ec4a3c56d0bf-or-one-of-its-dependencies/" target="_blank" rel="noopener noreferrer"&gt;BizTalk Server and WinSCP Error&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://www.linkedin.com/in/sandropereira" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Sandro Pereira&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;A common SFTP adapter issue resurfaces when BizTalk Server cumulative updates are applied. This troubleshooting guide explains why the WinSCPnet assembly fails to load after upgrading from CU5 to CU6 and provides a version compatibility matrix for BizTalk Server 2020. It includes step-by-step instructions to resolve the error by copying the correct WinSCP binaries to the BizTalk installation folder, along with an automated PowerShell script for streamlined remediation.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://www.mikaelsand.se/2026/01/more-on-finding-application-registrations-used-by-logic-apps/" target="_blank" rel="noopener noreferrer"&gt;More on finding application registrations used by Logic Apps&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://www.linkedin.com/in/mikaelsand" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Mikael Sand&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Building on earlier work around API connection discovery, this post extends KQL queries to find Logic Apps that authenticate via Client ID and secret in HTTP actions. Using Azure Resource Graph Explorer, the technique scans workflow parameters to identify application registration references. While the approach assumes parameters are used for credentials, it provides a practical method for auditing which Logic Apps depend on a given app registration across subscriptions.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://www.youtube.com/watch?v=jinbjN2PfJA" target="_blank" rel="noopener noreferrer"&gt;MCP Servers in Azure Logic Apps Agent Loops (Step-by-Step)&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Video by &lt;A href="https://www.linkedin.com/in/stephen-w-thomas" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Stephen W. Thomas&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This walkthrough demonstrates how to move tool logic out of Logic App Agent loops and into reusable Model Context Protocol servers. The video covers setting up an MCP server, registering tools, and invoking them from within an agent workflow. By decoupling tool definitions from orchestration logic, developers can build modular, maintainable agentic systems that scale across multiple workflows and scenarios.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://sjwiggers.com/2026/01/25/from-rigid-choreography-to-intelligent-collaboration-agentic-orchestration-as-the-evolution-of-soa/" target="_blank" rel="noopener noreferrer"&gt;From Rigid Choreography to Intelligent Collaboration: Agentic Orchestration as the Evolution of SOA&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://www.linkedin.com/in/steefjan" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Steef-Jan Wiggers&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Integration has evolved from rigid, deterministic workflows to adaptive, goal-driven orchestrations powered by intelligent agents. This article traces the journey from BizTalk-era SOA composites to modern agentic patterns, explaining how AI-enabled orchestrators dynamically plan, self-correct, and communicate intent rather than follow fixed sequences. With examples from Azure Logic Apps Agent Loop, it shows how integration professionals can leverage existing connectors and APIs as tools within reasoning-based architectures.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://www.linkedin.com/pulse/azure-integrations-actually-work-production-devarajan-gurusamy-fjjlf" target="_blank" rel="noopener noreferrer"&gt;Azure Integrations That Actually Work in Production&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://www.linkedin.com/in/devarajang" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Devarajan Gurusamy&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Architecture diagrams often look perfect in presentations but fail under real-world conditions. This article examines what it takes to build Azure integrations that survive production workloads, covering resilience patterns, error handling strategies, and operational considerations that separate proof-of-concepts from enterprise-grade solutions. It offers practical guidance for teams moving beyond demos toward reliable, maintainable integration implementations.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://blog.sandro-pereira.com/2026/01/22/configuring-biztalk-server-backup-jobs-for-azure-blob-storage/" target="_blank" rel="noopener noreferrer"&gt;Configuring BizTalk Server Backup Jobs for Azure Blob Storage&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://www.linkedin.com/in/sandropereira" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Sandro Pereira&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Modernizing BizTalk infrastructure can start with small, targeted improvements. This guide shows how to redirect native BizTalk backup jobs to Azure Blob Storage using SQL Server’s BACKUP TO URL feature. It covers generating SAS tokens, creating SQL credentials, updating job steps, and validating backups. The approach improves disaster recovery posture with geo-redundant cloud storage while keeping the BizTalk environment unchanged—no new components or custom code required.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://www.stephenwthomas.com/azure-integration-thoughts/building-ai-agent-logic-apps-consumption-agent-loop/" target="_blank" rel="noopener noreferrer"&gt;Building an AI Agent with Logic Apps Consumption and Agent Loop&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://www.linkedin.com/in/stephen-w-thomas" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Stephen W. Thomas&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Logic Apps Consumption with AgentLoop offers a fast path to practical AI agents, particularly for experimentation and low-volume workloads. This post walks through building a stateful poker-playing agent, demonstrating tool orchestration, agent instructions, and execution tracing. It compares Consumption and Standard tiers, explores cost efficiency, and shows how to offload reasoning to external models. At roughly a dollar for 25 runs, it’s an accessible entry point for agentic development.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://github.com/microsoft/agent-framework" target="_blank" rel="noopener noreferrer"&gt;Microsoft Agent Framework&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://www.linkedin.com/in/alghoniem" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Al Ghoniem, MBA&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Microsoft’s open-source Agent Framework provides a comprehensive toolkit for building, orchestrating, and deploying AI agents in Python and .NET. It features graph-based workflows with streaming and checkpointing, multi-agent patterns, built-in observability via OpenTelemetry, and support for multiple LLM providers. The repository includes quickstart samples, migration guides from Semantic Kernel and AutoGen, and experimental labs for benchmarking and reinforcement learning.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://blog.sandro-pereira.com/2026/01/15/storage-account-you-do-not-have-permissions-to-list-the-data-using-your-user-account-with-entra-id/" target="_blank" rel="noopener noreferrer"&gt;Storage Account: You do not have permissions to list the data using your user account with Entra ID&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://www.linkedin.com/in/sandropereira" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Sandro Pereira&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;Being an Owner of an Azure Storage Account does not automatically grant access to its data. This common confusion trips up many developers working with Logic Apps and blob storage. The article explains the distinction between management roles and data-plane permissions, then walks through assigning Storage Blob Data roles via Access Control (IAM) to resolve the “You do not have permissions” error when authenticating with Microsoft Entra ID.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://srigunnala.com/office365-connection-standard-logic-app/" target="_blank" rel="noopener noreferrer"&gt;Using Office 365 Outlook Connector in Logic Apps Standard&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://www.linkedin.com/in/srikanthgunnala" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Srikanth Gunnala&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;When configuring Office 365 Outlook (V2) with Managed Identity in Logic Apps Standard, the workflow designer may fail to auto-bind existing API connections—even when runtime works correctly. This post details the issue, explaining how a null referenceName in the workflow JSON causes the trigger to appear unbound. The fix involves manually setting the connection reference name in the workflow definition, after which the designer immediately recognizes the connection.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://dev.to/imdj/inside-logic-apps-standard-understanding-compute-units-cu-for-storage-scaling-39k6" target="_blank" rel="noopener noreferrer"&gt;Inside Logic Apps Standard: Understanding Compute Units (CU) for Storage Scaling&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://www.linkedin.com/in/danielj45" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Daniel Jonathan&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;High-volume Logic Apps can hit Azure Storage throttling limits. This deep-dive explains how Compute Units enable horizontal storage scaling by distributing workflow execution data across up to 32 storage accounts. It covers CU routing via Run ID suffixes, table distribution patterns, and configuration via host.json. Understanding this architecture is essential for building monitoring tools, querying run histories programmatically, or troubleshooting performance at scale.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://www.youtube.com/watch?v=fbyEEEbWlhU" target="_blank" rel="noopener noreferrer"&gt;E59 - Roles &amp;amp; Personas&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Video by &lt;A href="https://www.linkedin.com/in/sebastianmeyerit" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Sebastian Meyer&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;This episode recaps highlights from SAP TechEd and Microsoft Ignite, with a focus on the SAP Innovation Guide and Logic Apps announcements. It explores roles and personas in the integration space, discussing how different team members contribute to enterprise integration projects. The conversation provides context for practitioners following both SAP and Microsoft ecosystems and offers insights into recent platform developments relevant to hybrid integration scenarios.&lt;/P&gt;
&lt;H5&gt;&lt;A href="https://theagentfrontier.com/architecting-trust-leveraging-microsoft-foundry-to-solve-ai-governance-challenges" target="_blank" rel="noopener noreferrer"&gt;Architecting Trust: Leveraging Microsoft Foundry to Solve AI Governance Challenges&lt;/A&gt;&lt;/H5&gt;
&lt;P&gt;Post by &lt;A href="https://www.linkedin.com/in/kentweare" target="_blank" rel="noopener nofollow noreferrer"&gt;&lt;EM&gt;Kent Weare&lt;/EM&gt;&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;As organizations scale AI deployments, governance becomes critical. This article explores how Microsoft Foundry addresses common AI governance challenges including model management, access controls, auditability, and compliance. It outlines architectural patterns for building trust into AI systems from the ground up and provides guidance for teams navigating the balance between innovation velocity and responsible AI practices in enterprise environments.&lt;/P&gt;</description>
      <pubDate>Mon, 02 Feb 2026 20:44:05 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/logic-apps-aviators-newsletter-february-2026/ba-p/4491309</guid>
      <dc:creator>WSilveira</dc:creator>
      <dc:date>2026-02-02T20:44:05Z</dc:date>
    </item>
    <item>
      <title>Introducing Unit Test Agent Profiles for Logic Apps &amp; Data Maps</title>
      <link>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/introducing-unit-test-agent-profiles-for-logic-apps-data-maps/ba-p/4490216</link>
      <description>&lt;SECTION id="overview"&gt;
&lt;P&gt;I did some experimentation this week with GitHub Copilot custom agents and custom prompts. The result was a couple of agents&amp;nbsp; to help with creation of unit tests for Logic Apps Standard workflows and data maps.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;These agent profiles are designed to keep test artifacts consistent and maintainable by separating discovery, specification, data generation, and implementation. Specifications serve as the single source of truth; generated code and data follow from the specs.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Discover:&lt;/STRONG&gt; Enumerate workflows/maps, triggers/actions, dependencies, and control flow to build a testability inventory.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Spec (Speckit):&lt;/STRONG&gt; Write reusable test specifications (intent, inputs/mocks, expected outcomes) stored in a predictable location.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Cases:&lt;/STRONG&gt; Design scenario catalogs with categories (Happy Path, Error Handling, Boundary Conditions, etc.).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Test Data:&lt;/STRONG&gt; Generate typed mocks (Logic Apps) or input/expected data files (Data Maps) per scenario.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Implement:&lt;/STRONG&gt; Produce MSTest code against the Automated Test SDK on net8.0, enforcing strict constraints for reliability.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Project Batch:&lt;/STRONG&gt; Run operations across all workflows/maps with pre-checks, scaffolding verification, and summary reporting.&lt;/LI&gt;
&lt;/UL&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;ℹ️ You can find this project on GitHub:&amp;nbsp;&lt;A class="lia-external-url" href="https://github.com/wsilveiranz/logicapps-unittest-custom-agent" target="_blank"&gt;https://github.com/wsilveiranz/logicapps-unittest-custom-agent&lt;/A&gt;. This is an example of how those agents can be created using what is available in GitHub Copilot, so feel free to fork it and adjust it to your own requirements.&lt;/P&gt;
&lt;/BLOCKQUOTE&gt;
&lt;/SECTION&gt;
&lt;H2 id="agents"&gt;Agent Profiles Available&lt;/H2&gt;
&lt;SECTION id="logic-apps"&gt;
&lt;H3&gt;Logic Apps Workflow Unit Test Author&lt;/H3&gt;
&lt;P&gt;Specialist agent for authoring Logic Apps Standard workflow unit tests using MSTest (net8.0) and the Automated Test SDK. Produces spec-first test cases, typed mocks, and runnable MSTest implementations.&lt;/P&gt;
&lt;H4&gt;How It Works&lt;/H4&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Discover workflows:&lt;/STRONG&gt; Locate &lt;EM&gt;workflow.json&lt;/EM&gt;, summarize triggers/actions, and identify external dependencies to mock.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Spec-first:&lt;/STRONG&gt; Write reusable specs capturing intent, mock plan, inputs, and expected outcomes.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Create cases:&lt;/STRONG&gt; Build scenario catalogs (Happy Path, Error Handling, Boundary Conditions, etc.).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Generate test data:&lt;/STRONG&gt; Produce typed &lt;EM&gt;MockOutput&lt;/EM&gt; and &lt;EM&gt;ActionMock&lt;/EM&gt; classes instances mapped to action names. This step is optional, as implementation will create test data if not available.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Implement tests:&lt;/STRONG&gt; Generate MSTest code enforcing SDK constraints and required annotations.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Validate:&lt;/STRONG&gt; Build and run tests; refine specs and data as needed.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Batch (optional):&lt;/STRONG&gt; Apply the flow across all workflows once scaffolding is verified.&lt;/LI&gt;
&lt;/OL&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-border-style-solid" border="1" style="width: 100%; height: 389px; border-width: 1px;"&gt;&lt;thead&gt;&lt;tr style="height: 35px;"&gt;&lt;th style="height: 35px; border-width: 1px;"&gt;Skill&lt;/th&gt;&lt;th style="height: 35px; border-width: 1px;"&gt;Description&lt;/th&gt;&lt;th style="height: 35px; border-width: 1px;"&gt;Prompt File&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr style="height: 59px;"&gt;&lt;td style="height: 59px; border-width: 1px;"&gt;Discover Workflows&lt;/td&gt;&lt;td style="height: 59px; border-width: 1px;"&gt;Discover workflow definitions, summarize triggers/actions, and produce a mock inventory.&lt;/td&gt;&lt;td style="height: 59px; border-width: 1px;"&gt;.github/prompts/la-unit-tests-discover.prompt.md&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 59px;"&gt;&lt;td style="height: 59px; border-width: 1px;"&gt;Create Test Cases&lt;/td&gt;&lt;td style="height: 59px; border-width: 1px;"&gt;Create unit test cases from a workflow definition; define intent, inputs, mock plan, and expected outcomes.&lt;/td&gt;&lt;td style="height: 59px; border-width: 1px;"&gt;.github/prompts/la-unit-tests-create-cases.prompt.md&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 59px;"&gt;&lt;td style="height: 59px; border-width: 1px;"&gt;Write Speckit Specs&lt;/td&gt;&lt;td style="height: 59px; border-width: 1px;"&gt;Write and maintain Speckit-style specification documents for reusable scenarios.&lt;/td&gt;&lt;td style="height: 59px; border-width: 1px;"&gt;.github/prompts/la-unit-tests-speckit-specs.prompt.md&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 59px;"&gt;&lt;td style="height: 59px; border-width: 1px;"&gt;Implement Tests&lt;/td&gt;&lt;td style="height: 59px; border-width: 1px;"&gt;Implement MSTest unit tests using the Automated Test SDK with enforced constraints.&lt;/td&gt;&lt;td style="height: 59px; border-width: 1px;"&gt;.github/prompts/la-unit-tests-implement.prompt.md&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 59px;"&gt;&lt;td style="height: 59px; border-width: 1px;"&gt;Generate Test Data&lt;/td&gt;&lt;td style="height: 59px; border-width: 1px;"&gt;Generate trigger/action mock payloads and typed outputs for success and failure variants.&lt;/td&gt;&lt;td style="height: 59px; border-width: 1px;"&gt;.github/prompts/la-unit-tests-generate-test-data.prompt.md&lt;/td&gt;&lt;/tr&gt;&lt;tr style="height: 59px;"&gt;&lt;td style="height: 59px; border-width: 1px;"&gt;Project Batch&lt;/td&gt;&lt;td style="height: 59px; border-width: 1px;"&gt;Execute project-wide operations with scaffolding verification and roll-up reporting.&lt;/td&gt;&lt;td style="height: 59px; border-width: 1px;"&gt;.github/prompts/la-unit-tests-project-batch.prompt.md&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;/SECTION&gt;
&lt;SECTION id="data-maps"&gt;
&lt;H3&gt;Logic Apps Data Map Unit Test Author&lt;/H3&gt;
&lt;P&gt;Specialist agent for authoring Data Map unit tests from LML or XSLT using MSTest (net8.0). Produces spec-first test cases, sample input/expected data, and MSTest implementations.&lt;/P&gt;
&lt;H4&gt;How It Works&lt;/H4&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt;Discover data maps:&lt;/STRONG&gt; Locate &lt;EM&gt;Artifacts/MapDefinitions/*.lml&lt;/EM&gt; and &lt;EM&gt;Artifacts/Maps/*.xslt&lt;/EM&gt;; summarize transformations and schema requirements.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Spec-first:&lt;/STRONG&gt; Write reusable specs capturing intent, input data, expected output, and validation criteria.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Create cases:&lt;/STRONG&gt; Build scenario catalogs (Happy Path, Empty/Missing, Boundary Values, Special Characters, Large Data, etc.).&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Generate test data:&lt;/STRONG&gt; Produce representative input files and expected output files aligned to schemas and mapping rules. This step is optional, as implementation will create test data if not available.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Implement tests:&lt;/STRONG&gt; Generate MSTest classes using &lt;EM&gt;DataMapTestExecutor&lt;/EM&gt;.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Validate:&lt;/STRONG&gt; Build and run tests; refine specs and data as needed.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Batch (optional):&lt;/STRONG&gt; Apply the flow across all maps; verify project scaffolding first.&lt;/LI&gt;
&lt;/OL&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-border-style-solid" border="1" style="border-width: 1px;"&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style="border-width: 1px;"&gt;Skill&lt;/th&gt;&lt;th style="border-width: 1px;"&gt;Description&lt;/th&gt;&lt;th style="border-width: 1px;"&gt;Prompt File&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="border-width: 1px;"&gt;Discover Data Maps&lt;/td&gt;&lt;td style="border-width: 1px;"&gt;Discover LML/XSLT maps and schemas; summarize transformation structure and complexity.&lt;/td&gt;&lt;td style="border-width: 1px;"&gt;.github/prompts/dm-unit-tests-discover.prompt.md&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-width: 1px;"&gt;Create Test Cases&lt;/td&gt;&lt;td style="border-width: 1px;"&gt;Design scenarios covering happy path, edge cases, and error handling.&lt;/td&gt;&lt;td style="border-width: 1px;"&gt;.github/prompts/dm-unit-tests-create-cases.prompt.md&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-width: 1px;"&gt;Write Speckit Specs&lt;/td&gt;&lt;td style="border-width: 1px;"&gt;Write and maintain Speckit-style specs with mapping rules and validations.&lt;/td&gt;&lt;td style="border-width: 1px;"&gt;.github/prompts/dm-unit-tests-speckit-specs.prompt.md&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-width: 1px;"&gt;Implement Tests&lt;/td&gt;&lt;td style="border-width: 1px;"&gt;Implement MSTest suites using &lt;EM&gt;DataMapTestExecutor&lt;/EM&gt; with required defaults.&lt;/td&gt;&lt;td style="border-width: 1px;"&gt;.github/prompts/dm-unit-tests-implement.prompt.md&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-width: 1px;"&gt;Generate Test Data&lt;/td&gt;&lt;td style="border-width: 1px;"&gt;Generate input and expected output files matched to map rules and schemas.&lt;/td&gt;&lt;td style="border-width: 1px;"&gt;.github/prompts/dm-unit-tests-generate-test-data.prompt.md&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="border-width: 1px;"&gt;Project Batch&lt;/td&gt;&lt;td style="border-width: 1px;"&gt;Execute project-wide operations with scaffolding and summary reporting.&lt;/td&gt;&lt;td style="border-width: 1px;"&gt;.github/prompts/dm-unit-tests-project-batch.prompt.md&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;colgroup&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;col style="width: 33.33%" /&gt;&lt;/colgroup&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;/SECTION&gt;
&lt;SECTION id="faq"&gt;
&lt;H3&gt;FAQ&lt;/H3&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;&lt;SPAN class="k"&gt;Why Speckit-style specs?&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Specs are human-readable contracts that drive consistent test implementation across teams and time. They decouple scenario design from code generation, improving reuse.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;&lt;SPAN class="k"&gt;Can I run batch operations?&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;Yes. Use the project-batch profiles to orchestrate discovery and implementation across all workflows/maps once scaffolding is verified.&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;&lt;SPAN class="k"&gt;What if scaffolding is missing?&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;The Implement and Project Batch agents will stop and report the exact folders/files you need to create (via the Logic Apps Designer’s&amp;nbsp;&lt;EM&gt;Create Unit Test&lt;/EM&gt; command or manual steps).&lt;/P&gt;
&lt;/SECTION&gt;</description>
      <pubDate>Wed, 28 Jan 2026 23:33:34 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/introducing-unit-test-agent-profiles-for-logic-apps-data-maps/ba-p/4490216</guid>
      <dc:creator>WSilveira</dc:creator>
      <dc:date>2026-01-28T23:33:34Z</dc:date>
    </item>
    <item>
      <title>Automated Test Framework - Missing Tests in Test Explorer</title>
      <link>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/automated-test-framework-missing-tests-in-test-explorer/ba-p/4490186</link>
      <description>&lt;P&gt;Have your tests created using the Logic Apps Standard Automated Test Framework disappeared from the Test Explorer in VS Code all of a sudden? The answer is a mismatch between the MSTest versions used.&lt;/P&gt;
&lt;P&gt;A recent update in the C# DevKit extension changed the minimum requirements for the MSTest library - it now requires the minimum of 3.7.*. The project scaffolding created byt the Logic Apps Standard extension uses 3.0.2.&lt;/P&gt;
&lt;P&gt;The good news is that you can fix this by just changing package versions on your project. Follow the instructions below to have this fixed:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Open the &lt;EM&gt;.csproj&amp;nbsp;&lt;/EM&gt; that the extension created (e.g.&amp;nbsp;&lt;STRONG&gt;LogicApps.csproj&lt;/STRONG&gt;).&lt;/LI&gt;
&lt;LI&gt;Find the ItemGroup containing your package references. It should look like this:&lt;/LI&gt;
&lt;/OL&gt;
&lt;LI-CODE lang="xml"&gt;  &amp;lt;ItemGroup&amp;gt;
    &amp;lt;PackageReference Include="MSTest" Version="3.2.0"/&amp;gt;
    &amp;lt;PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0"/&amp;gt;
    &amp;lt;PackageReference Include="MSTest.TestAdapter" Version="3.2.0"/&amp;gt;
    &amp;lt;PackageReference Include="MSTest.TestFramework" Version="3.2.0"/&amp;gt;
    &amp;lt;PackageReference Include="Microsoft.Azure.Workflows.WebJobs.Tests.Extension" Version="1.0.0"/&amp;gt;
    &amp;lt;PackageReference Include="coverlet.collector" Version="3.1.2"/&amp;gt;
&amp;lt;/ItemGroup&amp;gt;&lt;/LI-CODE&gt;
&lt;OL start="3"&gt;
&lt;LI&gt;Replace the package references with this new version:&lt;/LI&gt;
&lt;/OL&gt;
&lt;LI-CODE lang="xml"&gt;  &amp;lt;ItemGroup&amp;gt;
    &amp;lt;PackageReference Include="Microsoft.Azure.Workflows.WebJobs.Tests.Extension" Version="1.*" /&amp;gt;
    &amp;lt;PackageReference Include="MSTest" Version="4.0.2" /&amp;gt;
    &amp;lt;PackageReference Include="coverlet.collector" Version="3.2.0" /&amp;gt;
  &amp;lt;/ItemGroup&amp;gt;&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Once you make this change, restart VSCode window and rebuild your project - Test Explorer will start showing your tests again.&amp;nbsp; Notice that this package reference is simplified as some of the previous references are already in the dependency chain, so don't need to be explicitly added.&lt;/P&gt;
&lt;BLOCKQUOTE&gt;ℹ️ &lt;EM&gt;&lt;STRONG&gt;We are updating our extension to make sure that new projects are being generated with the new values, but you should make those changes manually on existing projects.&lt;/STRONG&gt;&lt;/EM&gt;&lt;/BLOCKQUOTE&gt;</description>
      <pubDate>Thu, 05 Feb 2026 01:49:49 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/automated-test-framework-missing-tests-in-test-explorer/ba-p/4490186</guid>
      <dc:creator>WSilveira</dc:creator>
      <dc:date>2026-02-05T01:49:49Z</dc:date>
    </item>
    <item>
      <title>Upcoming Agentic Azure Logic Apps Workshops</title>
      <link>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/upcoming-agentic-azure-logic-apps-workshops/ba-p/4484526</link>
      <description>&lt;P&gt;Join me for a couple of upcoming workshops where you can learn about Logic Apps MCP Servers and building Agentic Business Processes&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Topic:&amp;nbsp;&lt;/STRONG&gt;Connecting the enterprise, using MCP Servers from Copilot Studio&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;When:&lt;/STRONG&gt; Tuesday, January 13th at 2PM CET/6 AM Mountain&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-external-url" href="https://www.linkedin.com/events/7406108337387233280/" target="_blank"&gt;Registration link&lt;/A&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Topic:&amp;nbsp;&lt;/STRONG&gt;Building Agentic Business Processes in a Day, using Azure Logic Apps Agent Loop&lt;BR /&gt;&lt;STRONG&gt;When:&amp;nbsp;&lt;/STRONG&gt;Friday, January 16th at 2pm CET/6 AM Mountain&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-external-url" href="https://www.linkedin.com/events/7406997279758471170/" target="_blank"&gt;Registration Link&lt;/A&gt;&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 09 Jan 2026 21:52:15 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-integration-services-blog/upcoming-agentic-azure-logic-apps-workshops/ba-p/4484526</guid>
      <dc:creator>KentWeareMSFT</dc:creator>
      <dc:date>2026-01-09T21:52:15Z</dc:date>
    </item>
  </channel>
</rss>

