<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Vajeedunnisa Mohammad on Medium]]></title>
        <description><![CDATA[Stories by Vajeedunnisa Mohammad on Medium]]></description>
        <link>https://medium.com/@learningtech1002?source=rss-4d769e02387d------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*VaMT6Ke50Z7WJTx9</url>
            <title>Stories by Vajeedunnisa Mohammad on Medium</title>
            <link>https://medium.com/@learningtech1002?source=rss-4d769e02387d------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Fri, 22 May 2026 00:17:06 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@learningtech1002/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Beyond the Gateway: Direct BIP Report Integration in AI Agent Studio]]></title>
            <link>https://medium.com/@learningtech1002/beyond-the-gateway-direct-bip-report-integration-in-ai-agent-studio-44037a69e2a5?source=rss-4d769e02387d------2</link>
            <guid isPermaLink="false">https://medium.com/p/44037a69e2a5</guid>
            <dc:creator><![CDATA[Vajeedunnisa Mohammad]]></dc:creator>
            <pubDate>Mon, 18 May 2026 16:08:02 GMT</pubDate>
            <atom:updated>2026-05-18T16:08:02.803Z</atom:updated>
            <content:encoded><![CDATA[<p>If there is one thing I absolutely love, it’s <strong>tackling new things head-on</strong>.</p><p>In the enterprise automation space, it’s incredibly easy to fall into the trap of doing things “the way they’ve always been done.” For a long time, if you wanted to pull an Oracle BI Publisher (BIP) report inside your automation flows, the default reflex has been to route everything through Oracle Integration Cloud (OIC). OIC is fantastic — it’s powerful, reliable, and a staple for complex architecture.</p><p>But I love asking: <em>What else is possible? Can we add another tool to our toolkit?</em></p><p>Instead of routing every single report through an integration layer, we have an alternative route. We can call BIP reports directly via an external REST call right inside <strong>AI Agent Studio</strong>!</p><p>Depending on how you like to architect your agents, you can implement this in two distinct ways: a hands-off <strong>Supervisor Flow</strong> or a structured, step-by-step <strong>Workflow</strong>.</p><p>Let’s try it out! 🛠️</p><p><strong>The Core Ingredient: The External REST Tool</strong></p><p>Before building either flow, we need to create an <strong>External REST Tool</strong> in your Agent Studio that talks directly to Oracle’s public report service.</p><p>Configure the tool to pass your authentication headers and use this SOAP envelope as the request body template. Just make sure to swap out the placeholder path and parameters with your specific report details:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7pmUAFTqlL0ks5yO5VGxBA.png" /></figure><p>Headers:<br>Content-Type : application/soap+xml</p><pre>&lt;soap:Envelope xmlns:soap=&quot;http://www.w3.org/2003/05/soap-envelope&quot; xmlns:pub=&quot;http://xmlns.oracle.com/oxp/service/PublicReportService&quot;&gt;<br>   &lt;soap:Header/&gt;<br>   &lt;soap:Body&gt;<br>      &lt;pub:runReport&gt;<br>         &lt;pub:reportRequest&gt;<br>            &lt;pub:attributeFormat&gt;csv&lt;/pub:attributeFormat&gt;<br>            &lt;pub:parameterNameValues&gt;<br>               &lt;pub:item&gt;<br>                  &lt;pub:name&gt;p_order_number&lt;/pub:name&gt;<br>                  &lt;pub:values&gt;<br>                     &lt;pub:item&gt;{OrderNumber}&lt;/pub:item&gt;<br>                  &lt;/pub:values&gt;<br>               &lt;/pub:item&gt;<br>            &lt;/pub:parameterNameValues&gt;<br>            &lt;pub:reportAbsolutePath&gt;/Custom/OIC_Reports/OrderDetails Report.xdo&lt;/pub:reportAbsolutePath&gt;<br>            &lt;pub:sizeOfDataChunkDownload&gt;-1&lt;/pub:sizeOfDataChunkDownload&gt;<br>         &lt;/pub:reportRequest&gt;<br>      &lt;/pub:runReport&gt;<br>   &lt;/soap:Body&gt;<br>&lt;/soap:Envelope&gt;</pre><p>Once this tool is ready, you can deploy it using one of two design patterns:</p><p><strong>Pattern 1: The Supervisor Flow (No Code)</strong></p><p>If you want a lean, intelligent setup where the LLM handles the heavy lifting natively, the Supervisor pattern is perfect. You don’t need any custom JavaScript arrays or manual parsing nodes — the agent’s cognitive capabilities handle it all.</p><p><strong>How to set it up:</strong></p><ol><li>Attach your newly created <strong>External REST Tool</strong> directly to your Agent.</li><li>Provide the Agent with a clear system prompt instructing it how to manage the inputs and outputs.</li></ol><p><strong>The Supervisor Prompt:</strong></p><pre>You are a helpful assistant with access to the GetOrderData tool, which retrieves order details from an Oracle BI Publisher report.<br>When a user asks about order details or requests information for a specific order number, follow these steps:<br>1. Extract the Order number from the user input and Call the GetOrderData tool with user provided order number as input parameter..<br>2. Parse the CSV response returned by the tool.<br>4. Present the data in a clean, well-structured markdown table with appropriate column headers.<br>5. If no data is returned or the order is not found, inform the user clearly.<br>Always confirm the order number with the user before calling the tool if it is ambiguous or missing.<br>When displaying results:<br>- Format all data as a readable markdown table.<br>- Use the first row of the CSV as the column headers.<br>- Align columns cleanly.<br>- If there are many rows, summarize the total count at the end (e.g., &quot;Showing 5 records for Order #100010&quot;).</pre><p>The beauty of this flow is its simplicity. You pass the input parameters and context in the input prompt, and the supervisor handles the tool execution and data formatting seamlessly in one place.</p><p><strong>Response:</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*HpKFMyCEnV2kXAIchb_0Uw.png" /></figure><p><strong>Pattern 2: The Workflow (Structured Action)</strong></p><p>If you prefer explicit control, predictability, and mapping out every exact transition on your canvas, the step-by-step Workflow pattern is the way to go.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FmLSFg_0nNl4i2PMkedjPA.png" /></figure><p>How to set it up:</p><p><strong>1. Set the Variables</strong></p><p>Use a <strong>Set Variable</strong> node (or an initial LLM node) to capture and store your input parameters (like OrderNumber) from the incoming user request.</p><p><strong>2. Call the Tool</strong></p><p>Add the External REST tool to your canvas and pass the variables from the previous step into your SOAP template payload.</p><p><strong>3. Convert Report Bytes to JSON Object</strong></p><p>Because Oracle returns the report data safely wrapped as a Base64 string inside the XML &lt;ns2:reportBytes&gt; element (and sometimes transitions tags without closing them), we use a targeted, platform-agnostic JavaScript node to convert it.</p><p>Pass $context.$nodes.EXTRACTORDERDETAILS.$output into this script to output a clean JSON array:</p><pre>// 1. Grab the input payload from your node<br>const xmlResponse = $context.$nodes.EXTRACTORDERDETAILS.$output;<br><br>// 2. Extract the Base64 string using Regex<br>const regex = /&lt;ns2:reportBytes&gt;([^&lt;]+)/;<br>const match = xmlResponse ? xmlResponse.match(regex) : null;<br><br>let finalResult = &quot;[]&quot;; // Default fallback to empty array string<br><br>if (match &amp;&amp; match[1]) {<br>    const base64Data = match[1].trim();<br><br>    // 3. Decode the Base64 data<br>    let decodedCsv = &quot;&quot;;<br>    if (typeof atob === &#39;function&#39;) {<br>        decodedCsv = atob(base64Data);<br>    } else if (typeof Buffer !== &#39;undefined&#39;) {<br>        decodedCsv = Buffer.from(base64Data, &#39;base64&#39;).toString(&#39;utf8&#39;);<br>    }<br><br>    // 4. Convert CSV lines into a structured JSON array<br>    if (decodedCsv) {<br>        // Split text by lines and remove empty rows<br>        const lines = decodedCsv.split(&#39;\n&#39;).map(line =&gt; line.trim()).filter(line =&gt; line);<br>        <br>        if (lines.length &gt; 1) {<br>            // First line contains the headers: [&quot;ORDER_NUMBER&quot;, &quot;HEADER_ID&quot;]<br>            const headers = lines[0].split(&#39;,&#39;);<br>            const jsonArray = [];<br><br>            // Loop through the data rows<br>            for (let i = 1; i &lt; lines.length; i++) {<br>                const currentLine = lines[i].split(&#39;,&#39;);<br>                const rowObject = {};<br>                <br>                headers.forEach((header, index) =&gt; {<br>                    rowObject[header] = currentLine[index] || null;<br>                });<br>                <br>                jsonArray.push(rowObject);<br>            }<br>            <br>            // Turn the array into a readable JSON string<br>            finalResult = JSON.stringify(jsonArray, null, 2);<br>        }<br>    }<br>} else {<br>    finalResult = JSON.stringify({ error: &quot;Could not locate &lt;ns2:reportBytes&gt; data&quot; });<br>}</pre><p><strong>4. Displaying a Clean Table Format</strong></p><p>Now that we have structured JSON data sitting in <strong>{{$context.$nodes.REPPORTBYTESTOJSON.$output.result}}</strong>, we don’t want to just dump raw JSON text on our end users.</p><p>Pass that JSON output directly into a final LLM Node with this formatting prompt to render a polished, bordered UI element instantly:</p><p><strong>Prompt:</strong></p><pre>convert the following JSON object into a clean, professional HTML table. Json: {{$context.$nodes.REPPORTBYTESTOJSON.$output.result}} <br>- Always use HTML markup while displaying data in table. Never markdown.<br>- Use Inline CSS only (no &lt;style&gt; blocks or external CSS)<br>- Use a standard &lt;table&gt; structure with border-collapse: collapse;<br>- Add subtle styling: A light gray header background, padding of 8px-12px, and a subtle border (#ddd)<br>- DO NOT word wrap individual words in table headers<br>- The table should include ONLY the following columns:<br> * Order Number - this should be mapped with &#39;order_number&#39; from JSON output<br> * Header Id- this should be total number of records for the &#39;headerId&#39; from JSON output<br>- In the next line, include below HTML markup tag. DO NOT markdown.<br>&lt;br&gt;</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*W1eyaiAEU5Dc57eELLJtwQ.png" /></figure><h4><strong><em>The Verdict</em></strong></h4><p>By trying something new and challenging the assumption that “BIP reports require OIC,” we shaved off latency, reduced infrastructure dependency, and built a self-contained AI Agent flow that handles data extraction to UI display completely end-to-end.</p><p>Don’t be afraid to break standard patterns in your builds. Sometimes the slickest solutions come from just saying, <em>“Let’s try it out anyway.”</em></p><p>What legacy workflows are you trying to bypass in your AI Agents next? Let me know in the comments!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=44037a69e2a5" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Have you ever thought about how complex systems communicate with one another?]]></title>
            <link>https://medium.com/@learningtech1002/have-you-ever-thought-about-how-complex-systems-communicate-with-one-another-38afc1e60019?source=rss-4d769e02387d------2</link>
            <guid isPermaLink="false">https://medium.com/p/38afc1e60019</guid>
            <category><![CDATA[api]]></category>
            <category><![CDATA[mcp-protocol]]></category>
            <dc:creator><![CDATA[Vajeedunnisa Mohammad]]></dc:creator>
            <pubDate>Sat, 10 May 2025 10:24:26 GMT</pubDate>
            <atom:updated>2025-05-10T10:24:26.272Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_VZRXLlXfugclv52dk8gjg.png" /></figure><p>Have you ever thought about how complex systems communicate with one another? What if I told you two concepts — Model-Content-Protocol (MCP) and APIs — are key players in this process, each serving a different, yet complementary, role? Let’s break down the similarities and differences to see how these elements drive modern applications and services.</p><h4>MCP vs. API: Understanding the Key Differences and Similarities</h4><blockquote><strong>What is MCP?</strong></blockquote><p>The Model Context Protocol (MCP) is a framework that standardizes how applications, large language models (LLMs), and external tools or data sources are connected. MCP defines how a model understands and utilizes tools during runtime.</p><p>To understand how Model Context Protocol (MCP) works, let’s compare it to something we all use every day: <strong>a laptop.</strong></p><ul><li>Imagine your laptop is the LLM (Large Language Model) — it’s the main system, ready to run applications and process tasks.</li><li>Your USB-C port acts like the MCP — a standardized connection point that tells the laptop how to communicate with different kinds of devices.</li><li>You can plug into the USB-C port:</li><li>A monitor → acts like a visualization or dashboard tool for the LLM</li><li>A disk drive → similar to a document search or retrieval tool</li><li>A power adapter → like a utility or external data source (e.g., a weather API or calculator)</li></ul><p>Even though each device serves a different purpose, the USB-C port ensures the laptop can understand and interact with all of them in a consistent way. Similarly, MCP standardizes how LLMs understand and interact with different tools, APIs, and data sources — making them modular and easily swappable.</p><blockquote><strong>What is an API? A Gateway to External Capabilities</strong></blockquote><p>An API (Application Programming Interface) is a standard way for one system to access the functionality or data of another system. Rather than building every feature from scratch, developers can leverage APIs to integrate existing services into their applications — quickly and efficiently.</p><p>Let’s say you’re building a travel or food delivery app that needs to show nearby restaurants and calculate the best route to get there.</p><p>Instead of building your own mapping system — which would be expensive and time-consuming — you can use the Google Maps API to do the heavy lifting.</p><blockquote><strong>Similarities:</strong></blockquote><ul><li><strong>Client-Server Architecture:</strong> Both MCP and APIs follow a client-server model, where the client sends a request and the server provides a response.</li></ul><p>· <strong>Abstraction:</strong> Both systems provide a level of abstraction, meaning the client does not need to understand the low-level details of the server’s internal workings.</p><p>· <strong>Simplification of Integration:</strong><br> By providing defined interfaces, both approaches simplify the process of combining different systems, so developers can wire systems together without building everything from scratch.</p><p>· <strong>Enabling System Integration:</strong> Both allow developers to integrate systems and use external capabilities without reinventing solutions.</p><blockquote><strong>Differences:</strong></blockquote><p>· <strong>Purpose:</strong> The primary purpose of MCP and APIs differs. MCP is designed to provide context and tool integration within the model, while APIs allow one system to access and leverage functionality or data from another system.</p><p>· <strong>Dynamic Self-Discovery:</strong></p><p>· <em>MCP:</em> Supports dynamic self-discovery, enabling a client to ask the server which tools it has available, making the system more adaptable.</p><p><strong>·</strong> <em>APIs:</em><strong> </strong>Typically do not offer built-in mechanisms for dynamic discovery; changes in functionality often require manual integration updates.</p><p>· <strong>Protocol Consistency:</strong> MCP follows a standardized protocol and pattern, ensuring consistency across different tools and systems. APIs, however, can vary significantly depending on the provider or the system, and there’s no single uniform way APIs are designed.</p><p>· <strong>Maintenance and Updates:</strong></p><p>· <em>MCP:</em> Automatically adapts to updates on the server side, meaning that once it’s built, it can integrate new or modified capabilities without requiring significant changes.</p><p>· <em>APIs:</em> If an API is modified or updated, developers often need to update their integration code to align with the changes.</p><blockquote><strong>✅ Conclusion</strong></blockquote><p>While Model Context Protocol (MCP) and APIs serve different purposes, they are not competing technologies — in fact, they often work hand-in-hand.</p><p>In many cases, MCP servers internally use APIs to perform their tasks. MCP essentially acts as a wrapper around APIs, providing a standardized and dynamic interface for large language models to interact with those services.</p><p>So, rather than seeing MCP and APIs as adversaries, it’s more accurate to view them as complementary layers in the AI stack:</p><ul><li>APIs expose system functionality.</li><li>MCP helps models discover and interact with that functionality in a consistent and intelligent way.</li></ul><p>Together, they create a more modular, reusable, and intelligent integration framework — enabling developers and models to build powerful, extensible applications faster than ever.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=38afc1e60019" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Model Context Protocol]]></title>
            <link>https://medium.com/@learningtech1002/model-context-protocol-6fc96a17abeb?source=rss-4d769e02387d------2</link>
            <guid isPermaLink="false">https://medium.com/p/6fc96a17abeb</guid>
            <category><![CDATA[mcp-server]]></category>
            <dc:creator><![CDATA[Vajeedunnisa Mohammad]]></dc:creator>
            <pubDate>Wed, 30 Apr 2025 17:32:16 GMT</pubDate>
            <atom:updated>2025-04-30T17:32:16.450Z</atom:updated>
            <content:encoded><![CDATA[<p>In the world of modern application development, speed, scalability, and simplicity are everything. That’s where <strong>Model-Driven Cloud Platform (MCP)</strong> steps in — a powerful framework that redefines how we build cloud-native apps by focusing on <strong>models</strong> instead of writing repetitive code.</p><p>Recently, I explored MCP using <strong>Claude for Desktop</strong>, and the experience was nothing short of exciting! I successfully integrated <strong>GitHub</strong> and <strong>SQLite MCP servers</strong>, and what amazed me most was how easily I could turn simple natural language prompts into working queries and configurations.</p><p>In this blog, I’ll walk you through:</p><ul><li>What MCP is and why it matters</li><li>How to integrate SQLite and GitHub MCP servers</li></ul><h3>Model Context Protocol (MCP)</h3><p>MCP is an open protocol that standardizes how applications provide context to LLMs. Think of MCP like a USB-C port for AI applications. Just as USB-C provides a standardized way to connect your devices to various peripherals and accessories, MCP provides a standardized way to connect AI models to different data sources and tools.</p><h3>Architecture</h3><p>MCP follows a client-server architecture where a host application can connect to multiple servers.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/691/1*XkGacOa1FfulHWBV8xT6Kw.png" /></figure><p>I used the <strong>pre-built MCP servers</strong> available in <strong>Claude for Desktop</strong>.<br>Claude is an advanced AI assistant developed by <strong>Anthropic</strong>.</p><p>I experimented with both the <strong>SQLite MCP and GitHub</strong> <strong>servers</strong>, which allow seamless integration with these platforms.</p><p>By providing a simple natural language prompt, Claude can generate the corresponding SQL query and display the output in the desired format.</p><p><strong>Steps to Integrate the SQLite MCP Server:</strong></p><p>-&gt; Download and install Claude for Desktop.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*gjGEGIGtpwVKihqK73rxfA.png" /></figure><p>-&gt;In Claude, click on <strong>“Developer”</strong> in the left-hand panel under <strong>Settings</strong>, then click <strong>“Edit Config”</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*feYw1QoKpY1lsI0n9q78cQ.png" /></figure><p>-&gt;Open the configuration file in any text editor and <strong>replace its contents</strong> with the provided configuration.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*3SYquy5tPxk_ZG37xFjJdw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*7b-LtQb-y3RrDiJ8zRSKAg.png" /></figure><p>-&gt;After saving your changes, <strong>restart Claude for Desktop</strong> for the configuration to take effect.</p><p>Reference:<br><a href="https://modelcontextprotocol.io/introduction">https://modelcontextprotocol.io/introduction</a></p><p>Thanks for reading!!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=6fc96a17abeb" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>