<?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 Abhishek Jagtap on Medium]]></title>
        <description><![CDATA[Stories by Abhishek Jagtap on Medium]]></description>
        <link>https://medium.com/@jagtapabhi13?source=rss-bb08e175ad9b------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*qA3oAjqovOYgRmzmxUV34g.jpeg</url>
            <title>Stories by Abhishek Jagtap on Medium</title>
            <link>https://medium.com/@jagtapabhi13?source=rss-bb08e175ad9b------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 03:04:49 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@jagtapabhi13/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[I Let an AI Agent Clean Up My Mi TV Remove Ads, Replace the Launcher, and Add Some Halloween…]]></title>
            <link>https://medium.com/@jagtapabhi13/i-let-an-ai-agent-clean-up-my-mi-tv-remove-ads-replace-the-launcher-and-add-some-halloween-7d548189468f?source=rss-bb08e175ad9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/7d548189468f</guid>
            <category><![CDATA[tv]]></category>
            <category><![CDATA[claude-code]]></category>
            <category><![CDATA[cleanyourtv]]></category>
            <category><![CDATA[xaiomi]]></category>
            <category><![CDATA[mi-tv]]></category>
            <dc:creator><![CDATA[Abhishek Jagtap]]></dc:creator>
            <pubDate>Tue, 03 Nov 2026 17:58:01 GMT</pubDate>
            <atom:updated>2026-11-03T18:01:56.115Z</atom:updated>
            <content:encoded><![CDATA[<h3>I Let an AI Agent Clean Up My Mi TV Remove Ads, Replace the Launcher, and Add Some Halloween Magic🎃</h3><p><em>How I debloated a Xiaomi Android TV in one evening, without rooting it and without uninstalling anything, using an open-source repo and an AI coding agent.</em></p><p>My TV is a Xiaomi Mi TV 4A Pro (the model string is MiTV-AXSO0) running Android TV 9. It works fine, but every time I turned it on, the first thing I saw was an advert.</p><p>This is what the home screen looked like before I started:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*gSMsBAZSq3v1l7lJoUYifg.png" /></figure><p>The top half was a rotating hero banner, often marked <strong>Sponsored</strong>. Below that was a PatchWall tile, Xiaomi’s own content hub. Below that came rows of “recommendations” that were mostly promotions. In the background, Xiaomi analytics, a “statistics” service, a cleaner app nobody asked for, a sponsored TV guide and a partner-app auto-installer were all running.</p><p>I wanted three things:</p><p>1. <strong>Get rid of the ads and the telemetry</strong> without breaking HDMI, Live TV, the remote, or the streaming apps my family actually uses.</p><p>2. <strong>Replace the home scree</strong> with something clean: black, calm, my apps and nothing else.</p><p>3. <strong>Be able to undo all of it.</strong></p><p>Here’s how it went.</p><h3><strong>The tools: an open-source repo plus an AI agent</strong></h3><p>I used <strong>[CleanYourTV](</strong><a href="https://github.com/Gathin23/cleanyourtv">https://github.com/Gathin23/cleanyourtv</a><strong>)</strong>, an open-source project that does two things:</p><p>- It keeps <strong>tested debloat lists</strong> for specific TV models. Each list is a plain text file of package names, with comments explaining what each one is.</p><p>- It ships a <strong>small native Android TV launcher</strong>, written in plain Java with no internet permission, that looks a lot like the Apple TV home screen.</p><p>The repo also has a long prompt (`PROMPT.md`) that you give to an AI coding agent. I used <strong>Claude Code</strong> on my Windows laptop, pasted that prompt in, and the agent did the work over ADB (Android Debug Bridge) on my home Wi-Fi. It asked me before anything that depended on my preferences.</p><p>What I liked most is that the safety rules are built into the scripts, not left to the agent’s judgement:</p><p>- <strong>Disable, never uninstall.</strong> Every change is `pm disable-user`, which can be reversed with `pm enable`. Nothing is uninstalled, rooted or flashed.</p><p>- <strong>Back up first.</strong> The full package list, the list of already-disabled packages, all system properties and every system setting get saved to a folder on your PC before anything changes.</p><p>- <strong>Core Android packages are untouchable.</strong> The scripts refuse to run a list that includes things like the package installer or the permission controller.</p><ul><li><strong>Don’t open factory menus,</strong> not even to look. On some boards that flips a flag the shell can’t undo.</li></ul><h3>🛠️ Step 0: Set Up Your Computer</h3><p>Before we get started, let’s prepare your computer.</p><p>You’ll need a computer connected to the <strong>same Wi-Fi network as your Android TV</strong>. I used a Windows laptop for this setup, but macOS and Linux should work too.</p><h3>1. 📦 Install the Required Tools</h3><p>We’ll need a few tools to clone the project, interact with the TV, build the Android launcher, and run our AI coding agent.</p><p>Here’s what each tool does:</p><h3>1. 📦 Install the Required Tools</h3><p>Before we begin, make sure you have the following tools installed:</p><ul><li>🐙 Git — To clone/download the project repository from GitHub.</li><li>💻 VS Code — To open the project, edit files, and run commands in the integrated terminal.</li><li>🐍 Python 3 — To execute the TV automation scripts and Python-based tools.</li><li>🔌 Android Platform Tools (ADB) — To communicate with your Android TV over the network.</li><li>🤖 Android Studio — To get the Android SDK required to build the custom launcher.</li><li>☕ JDK 17 — Required to compile and build the Android launcher.</li><li>🧠 AI Coding Agent (Claude Code) — To understand the project, execute commands, and automate the setup process.</li></ul><p>💡 <strong>Tip for Windows users:</strong> You can install most of these tools directly from PowerShell or Windows Terminal using winget.</p><p>Run the following commands:</p><pre>winget install Git.Git</pre><pre>winget install Microsoft.VisualStudioCode</pre><pre>winget install Python.Python.3.12</pre><pre>winget install Google.PlatformTools</pre><pre>winget install Google.AndroidStudio</pre><pre>winget install EclipseAdoptium.Temurin.17.JDK</pre><p>Once Android Studio is installed, open it at least once. This allows it to download and configure the required Android SDK.</p><p>You won’t need to use Android Studio regularly after this initial setup.</p><h3>2. 📥 Clone the Repository and Open It</h3><p>Now that our development environment is ready, let’s download the project.</p><p>Open your terminal and execute:</p><pre>git clone https://github.com/Gathin23/cleanyourtv</pre><pre>cd cleanyourtv</pre><pre>code .</pre><p>This downloads the repository, navigates into the project directory, and opens it in VS Code.</p><p><strong>⚠️ Important: Run your AI coding agent from inside the cloned repository.</strong></p><p>This is more important than it might seem!</p><p>The repository already contains scripts such as:</p><ul><li>tools/disable.sh</li><li>The launcher’s installation script</li><li>Backup and recovery mechanisms</li><li>A protected-package list</li><li>Safety checks that prevent disabling the stock launcher before the new launcher is working.</li></ul><p>These safeguards are already implemented in the project.</p><p>By running the AI agent from inside the repository, it can understand and reuse the existing scripts instead of creating everything from scratch.</p><p><strong>What about Python dependencies?</strong></p><p>No need to install Python packages manually!</p><p>On its first run, the agent creates a virtual environment inside tools/venv and installs the required dependencies from the repository&#39;s requirements file.</p><h3>3. 📝 Locate the Main Prompt</h3><p>We’re almost ready!</p><p>The main instructions for the AI coding agent are stored in a file called <strong>PROMPT.md</strong>, located in the root directory of the repository.</p><p>If you’re using VS Code:</p><ol><li>Look at the Explorer panel on the left.</li><li>Find PROMPT.md.</li><li>Open the file.</li><li>Review the instructions that will guide the AI agent through the setup.</li></ol><p>This file is important because it tells the agent what needs to be done and how to interact with your Android TV safely.</p><p>In the next step, we’ll use this prompt to get the AI agent working on the TV setup.</p><p><strong>Start the agent and paste the Prompt-</strong></p><p>Open a terminal in the repo folder (in VS Code: <strong>Terminal → New Terminal</strong>), start the agent (claude for Claude Code) and paste the copied prompt.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/945/1*DrQgbfbECCa8jLMw6GjPBg.png" /></figure><p><strong>🎯 That’s it for Step 0!</strong> Your computer is ready, the repository is cloned, and all the required tools are in place.</p><p>Let’s move on to the interesting part: letting the AI agent take over!</p><h3>🔧 Step 1: Enable Debugging, Connect, and Back Up</h3><p>Now that our computer is ready, it’s time to connect to the Android TV.</p><p>We’ll use <strong>ADB (Android Debug Bridge)</strong> throughout this process. ADB is the same tool Android developers use to communicate with and manage Android devices.</p><p>By default, ADB debugging is disabled on Android TV. We’ll first enable Developer Options and USB Debugging using the TV remote.</p><h3>1. 🔓 Unlock Developer Options</h3><p>Let’s start on your Android TV:</p><ol><li>Open <strong>Settings</strong> (the ⚙️ gear icon).</li><li>Navigate to <strong>Device Preferences → About</strong>.</li><li>Scroll down to <strong>Build</strong>.</li><li>Select <strong>Build</strong> using your remote and press the <strong>OK button seven times</strong>.</li></ol><p>After a few presses, you’ll see a countdown message.</p><p>Once completed, you should see:</p><p>🎉 <strong>“You are now a developer!”</strong></p><p><em>📸 Settings → Device Preferences → About. The Build option is usually further down the list.</em></p><h3>2. 🐞 Enable USB Debugging</h3><p>Now that Developer Options are unlocked, let’s enable debugging.</p><ol><li>Press the <strong>Back</strong> button on your remote once.</li><li>Open <strong>Device Preferences → Developer Options</strong>.</li><li>Scroll down to the <strong>Debugging</strong> section.</li><li>Find <strong>USB Debugging</strong> and switch it ON.</li><li>Confirm the warning message when prompted.</li></ol><p>✅ That’s it! USB Debugging is now enabled, allowing your computer to communicate with the TV through ADB.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*L9bX1cucXuS98XHlU37KVQ.png" /></figure><h3>3. 🌐 Connect to the TV Over Wi-Fi</h3><p>Despite its name, <strong>USB Debugging</strong> on my Mi TV also enables ADB over the network on port 5555.</p><p>This means you don’t need a USB cable! Your laptop and TV just need to be connected to the same Wi-Fi network.</p><p>💡 <strong>Note:</strong> Some TVs have a separate <strong>Network Debugging</strong> or <strong>ADB over Network</strong> toggle on the same screen. Newer Google TV devices may offer <strong>Wireless Debugging</strong>, which requires pairing using a code.</p><h3>4. 📍 Find Your TV’s IP Address</h3><p>On your Android TV, navigate to:</p><p><strong>Settings → Network &amp; Internet → Your connected Wi-Fi network</strong></p><p>Here, you’ll find the TV’s IP address.</p><p>💡 In my case, the AI agent discovered the IP address automatically from my laptop, but it’s handy to know where to find it.</p><h3>5. 🔐 Accept the Connection Prompt</h3><p>The first time your computer connects to the TV, a permission prompt will appear on the TV screen.</p><ul><li>Select <strong>Always allow from this computer</strong>.</li><li>Choose <strong>Allow</strong> using your TV remote.</li></ul><p>✅ That’s it! Your computer is now authorized to communicate with your Android TV through ADB.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8gPN63ByYMWmyLzKqkN58A.png" /><figcaption><em>The prompt that appears on the TV when the computer connects. Tick “Always allow from this computer” and press OK.</em></figcaption></figure><p>If you don’t press OK, nothing can connect. That’s the main protection ADB has, and it’s why you should revoke these authorisations and switch debugging off again when you’re done (Step 6).</p><h3>6. 💾 Back Up Your TV</h3><p>With the connection established, the AI agent discovered my TV on the network and connected through ADB on port 5555.</p><p>Before making any changes, it created a backup of the TV’s existing configuration, including:</p><ul><li>📦 All <strong>113 installed packages</strong>.</li><li>🚫 The <strong>3 packages</strong> that were already disabled.</li><li>⚙️ Complete getprop output.</li><li>🔧 All global, secure, and system settings.</li><li>🖥️ Display size and density.</li><li>🏠 The currently configured Home app (launcher).</li></ul><p><strong>One more interesting discovery!</strong> The repository already contained a tested package list for my exact TV model and firmware:</p><ul><li>Board: dangal</li><li>Build: PI.6036</li></ul><p>This was important because the package list had already been tested on the same TV model and firmware. So, we weren’t relying on guesswork when deciding what could safely be disabled.</p><p>✅ <strong>Backup complete!</strong> Now we have a snapshot of the original configuration before making any changes.</p><h3>🧹 Step 2: Debloat in Small Batches</h3><p>Before disabling anything, the AI agent grouped the installed packages and asked me which streaming apps and services I actually use.</p><p>I kept <strong>Netflix, Prime Video, YouTube, JioHotstar, Google Assistant, Chromecast, screen mirroring and the firmware updater</strong>. Anything I wasn’t sure about stayed enabled.</p><p>The agent then disabled <strong>17 packages across three small batches</strong>, taking a screenshot after each batch to make sure nothing had broken.</p><h3>📦 Batch 1: Telemetry</h3><ul><li>Mi TV Analytics and Xiaomi Statistics.</li><li>Google Feedback and Bug Report Sender.</li></ul><h3>📺 Batch 2: Ads &amp; Content Rows</h3><ul><li>PatchWall.</li><li>Xiaomi Web Content Service and Floating Frame.</li><li>Google TV Recommendations.</li><li>Mi TV+ sponsored live channels.</li><li>Sensara sponsored TV guide.</li><li>Play auto-installer for partner apps.</li></ul><h3>🧹 Batch 3: Background Clutter</h3><ul><li>TV Manager (cleaner app).</li><li>Handbook and legal-text screens.</li><li>Mi Music and Mi Gallery.</li></ul><h3>🔍 One Interesting Discovery</h3><p>After Batch 2, the PatchWall tile disappeared, but the <strong>Sponsored</strong> banner was still there.</p><p>It turns out that the banner comes from Google’s stock launcher itself. Removing it required replacing the launcher — which was exactly what we planned to do next!</p><h3>🔄 Verify After Reboot</h3><p>One important detail: Android writes package-state changes to disk roughly 10 seconds after a change.</p><p>Rebooting too quickly can make it appear as though the firmware has re-enabled the disabled packages.</p><p>To avoid this, the agent ran sync, rebooted the TV, and compared the disabled-package list before and after.</p><p>✅ All 17 packages remained disabled!</p><h3>🏠 Step 3: Meet the New Home Screen</h3><p>Now comes the exciting part! Let’s replace the stock Android TV launcher with the <strong>CleanYourTV launcher</strong>.</p><p>The launcher is lightweight, approximately <strong>575 KB</strong>, and designed for TVs with limited memory.</p><p>It comes with:</p><ul><li>🚫 No network access</li><li>🔄 No background polling</li><li>🌫️ No blur effects</li><li>🎬 No video playback</li></ul><p>The installation script takes care of everything:</p><ol><li>Builds the launcher.</li><li>Installs it on the TV.</li><li>Sets it as the default Home app.</li><li>Confirms that the new launcher is working.</li><li>Only then disables the stock launcher.</li></ol><p>🔐 <strong>Safety first:</strong> The old launcher won’t be disabled until the new one is confirmed as the active Home app.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kTivHpdgPXVBw2-sy6QVNA.png" /><figcaption><em>The new home screen. Big thin clock, greeting, glass pill buttons for Inputs, Wi-Fi and Settings, and a dock with a soft glow in the focused app’s colour</em></figcaption></figure><h3>✨ What Does the New Launcher Offer?</h3><ul><li>📱 <strong>App Dock:</strong> Your four apps displayed in a slightly lighter, rounded band.</li><li>🎨 <strong>Dynamic Ambient Glow:</strong> The focused app’s name appears in large text, with a soft glow inspired by its banner colour.</li><li>💎 <strong>Glass Highlight:</strong> A smooth, spring-like highlight that moves from one app tile to another</li><li>⚙️ <strong>Quick Settings:</strong> Frosted-glass buttons for Inputs, Wi-Fi and Settings in the top-right corner.</li><li>📺 <strong>Inputs Dropdown:</strong> Quick access to HDMI 1–3, AV and Live TV.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*pX2RELebAk9ejDnNpF7EHA.png" /><figcaption><em>The Inputs dropdown switches sources through Android’s TV input framework</em></figcaption></figure><p>The agent then tested the D-pad from every edge. Down moves exactly one row. Up from the dock goes to the top bar. The ends of the top bar don’t wrap around onto the tiles. And after a reboot, the TV now <strong>starts straight on the new home screen.</strong></p><p>One build hiccup worth mentioning: Android Studio’s bundled JDK 25 was too new for the project’s Gradle version. A portable <strong>JDK 17</strong> fixed it.</p><h3><strong>Step 4: The remote, which needed testing by hand</strong></h3><p>This is the part I’d tell anyone doing this to pay attention to. <strong>Keys injected over ADB don’t prove the real remote works.</strong> The agent asked me to press each physical button, and recorded what the TV received while I did:</p><p>- The <strong>Mi button</strong> is a normal Home key. It works.</p><p>- <strong>Netflix, Prime, mic</strong> all still work.</p><p>- One button, the one that used to open <strong>PatchWall</strong>, now did nothing. It sends keycode 192, and a Xiaomi system service sends that to PatchWall, which we had disabled.</p><p>At first I left it dead, which is the safe choice. Then I had a better idea.</p><h3>🎃 Step 5: Making It Spooky — Halloween Theme &amp; Bat Button</h3><p>The default launcher looked a little too plain for my taste, so I decided to explore the themes available in the repository.</p><p>And there are plenty to choose from! Around <strong>20 themes</strong>, including:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/945/1*wYWRu6tfU6Sczz7W-rC26A.png" /></figure><ul><li>🍎 <strong>Aerial:</strong> Apple TV-style wallpapers featuring photographs taken from the International Space Station.</li><li>💎 <strong>Frosted Glass:</strong> A sleek glass-inspired appearance.</li><li>🌌 <strong>Aurora:</strong> Beautiful aurora-inspired visuals.</li><li>🎮 <strong>Pixel Art:</strong> Retro pixel-art landscapes.</li><li>🎃 <strong>Seasonal Themes:</strong> Special themes for different occasions.</li></ul><p>I decided to go with <strong>Halloween</strong>!</p><h3>🦇 A Little Halloween Customization</h3><p>Themes are managed using a simple config.json file along with wallpapers. You can push them directly to the TV with a single command. <strong>No rebuild required!</strong></p><p>Since the theme’s festive mode had officially ended on 1 November, I created a personal copy and extended its end date to the 30th.</p><p>Here’s what changed:</p><ul><li>🎃 <strong>Wi-Fi:</strong> The Wi-Fi pill becomes a glowing jack-o’-lantern when connected.</li><li>🦇 <strong>Inputs:</strong> Replaced with a bat icon.</li><li>👻 <strong>Settings:</strong> Replaced with a ghost icon.</li><li>🎉 <strong>Greeting:</strong> Displays “Happy Halloween”.</li><li>🌕 <strong>Wallpapers:</strong> Rotates between haunted houses, jack-o’-lanterns, full moons and foggy cemeteries.</li><li>🦇 <strong>Daily Surprise:</strong> The first time you press Home each day, a flock of bats flies across the screen!</li></ul><p>Now that’s a home screen with some personality! 👻</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*fisvOGswVJwbHF0FYuZ71w.png" /><figcaption><em>Bats rising over the haunted house.</em></figcaption></figure><h3>🦇 Giving the PatchWall Button a New Job</h3><p>Once a day wasn’t enough! I wanted to trigger the bat animation whenever I wanted.</p><p>So, I repurposed the unused <strong>PatchWall button</strong> on the remote. Now, pressing it makes bats fly across the screen, even while using YouTube!</p><p>🔧 <strong>How did it work?</strong></p><ul><li>Added a new bats action alongside existing actions like home, mute, and screensaver.</li><li>Mapped the PatchWall button to this new action.</li></ul><p>It works through the launcher’s <strong>key helper</strong>, an accessibility service that intercepts remote button presses before Xiaomi’s system service handles them.</p><p>🎃 One more reason to love this custom launcher!</p><h3>🔒 Step 6: Lock the Door Behind You</h3><p>One important step that’s easy to forget: <strong>disable ADB debugging once you’re done.</strong></p><p>ADB on port 5555 is unencrypted while enabled, meaning other devices on your home network could potentially access your TV.</p><p>Here’s what I did:</p><ol><li>Go to <strong>Settings → Device Preferences → Developer Options → Revoke USB debugging authorisations</strong>.</li><li>Turn OFF <strong>USB Debugging</strong> and <strong>Network Debugging</strong>, if available.</li><li>Restart the TV via <strong>Settings → Device Preferences → About → Restart</strong>.</li></ol><p>The repository’s checker then confirmed the final configuration.</p><h3>🎉 What I Ended Up With</h3><ul><li>🚫 <strong>17 packages disabled</strong> — telemetry, ads and unnecessary clutter. Nothing was uninstalled.</li><li>📺 <strong>No sponsored banners or PatchWall</strong> when the TV starts.</li><li>🍎 A clean, Apple TV-inspired home screen with my four favourite apps.</li><li>✅ HDMI, Live TV, Chromecast, microphone and streaming apps still working.</li><li>🦇 A dedicated bat button on the remote!</li><li>💾 A backup and restore script, plus a README explaining how to re-enable apps, change the dock and swap wallpapers.</li></ul><h3>💡 A Few Tips Before You Try It</h3><ul><li>🔍 Check the repository’s examples/ folder for your TV model. A tested package list makes the process much safer.</li><li>🛡️ Make changes in small batches, keep your backup, and test the physical remote afterwards.</li><li>🔒 <strong>Disable ADB when you’re finished.</strong> Don’t leave debugging enabled unnecessarily.</li></ul><p>And that’s it! A cleaner, lighter and more personalised Android TV experience without uninstalling anything or breaking the features I use every day.</p><p>The project is open source and MIT-licensed:</p><p><a href="https://github.com/Gathin23/cleanyourtv">github.com/Gathin23/cleanyourtv</a>. Thanks to everyone who has contributed tested lists for their TVs. Mine only took one evening because someone else had already worked out which packages were safe on this exact model.</p><p><strong>A big thank-you to Gathin, who created CleanYourTV</strong> (<a href="https://github.com/Gathin23/cleanyourtv">github.com/Gathin23/cleanyourtv</a>), for building a tool that turned an ad-filled TV into something I actually enjoy switching on. This was genuinely fun to do, bats and all. 🦇</p><p>In case of any doubts or if you just want to have a fun conversation, feel free to reach out anytime: <a href="https://www.linkedin.com/in/abhishek-jagtap-314624140/">Abhishek Jagtap on LinkedIn</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7d548189468f" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Build an AI Job Hunter Agent with UiPath Coded Agents & LangGraph]]></title>
            <link>https://medium.com/@jagtapabhi13/build-an-ai-job-hunter-agent-with-uipath-coded-agents-langgraph-61f7a2c3a5a9?source=rss-bb08e175ad9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/61f7a2c3a5a9</guid>
            <category><![CDATA[firecrawl]]></category>
            <category><![CDATA[langgraph]]></category>
            <category><![CDATA[uipath-automation]]></category>
            <category><![CDATA[learning]]></category>
            <category><![CDATA[uipath]]></category>
            <dc:creator><![CDATA[Abhishek Jagtap]]></dc:creator>
            <pubDate>Thu, 06 Aug 2026 11:56:48 GMT</pubDate>
            <atom:updated>2026-08-06T11:56:48.798Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LZFbVzqzBZWoabOdrvoZUQ.png" /></figure><p>Searching job portals every day is repetitive. Instead of manually opening LinkedIn, Indeed, and company career pages, why not let an AI agent do the searching, analyze every posting, rank them against your skills, and deliver the best matches directly to your inbox?</p><p>If you’ve looked at UiPath’s newer “coded agents” and wondered how they actually fit together with LangGraph, Pydantic, and the rest of the Python AI ecosystem, this tutorial walks through a complete, working example: an <strong>AI Job Hunter</strong> agent.</p><p>Give it a role, some keywords, and your skills — it searches the web for matching postings, has an LLM read and score each one against your profile, removes duplicates, and hands you back a polished .xlsx report (with an optional email delivery on top).</p><h3>Why LangGraph?</h3><p>Instead of placing everything inside main.py, the project separates responsibilities across multiple modules:</p><ul><li>config.py manages configuration.</li><li>models.py defines the application&#39;s data contracts.</li><li>firecrawl_tools.py handles job discovery and scraping.</li><li>workflow.py orchestrates the complete AI workflow.</li><li>excel_utils.py generates the final report.</li></ul><p>This modular design makes the project easier to maintain, debug, and extend.</p><h3>What we’re building</h3><p>The agent is a four-step LangGraph pipeline:</p><ul><li><strong>discover_jobs</strong> — searches and scrapes job postings using <a href="https://www.firecrawl.dev/">Firecrawl</a>.</li><li><strong>analyze_jobs</strong> — sends each posting to an LLM (through UiPath&#39;s LLM Gateway) and gets back a structured, Pydantic-validated JobAnalysis object: title, company, required skills, a 0–100 match score, and a short explanation.</li><li><strong>export_results</strong> — deduplicates by application URL and writes everything to a styled Excel workbook.</li><li><strong>send_email</strong> — optionally delivers an HTML summary plus the workbook as an attachment through a UiPath AgentHub MCP mail server.</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Tch7yGLpfbSTAO39iu1cJQ.png" /></figure><h3>Prerequisites</h3><h3>🚀 Getting Started in Your Environment</h3><p>Getting the project up and running is straightforward. Before you begin, make sure you have the following installed:</p><ul><li>🐍 <strong>Python 3.11–3.13</strong></li><li>🌿 <strong>Git</strong></li><li>⚡ <strong>uv</strong> (used to manage project dependencies)</li><li>🤖 <strong>UiPath CLI</strong></li><li>☁️ <strong>A UiPath Automation Cloud account</strong></li></ul><h3>Getting Started in your environment</h3><h3>Clone the Repository</h3><p>Start by cloning the repository and installing the project dependencies:</p><p>💡 <strong>Tip:</strong> You’ll find the repo link at the bottom of this article.</p><pre>git clone https://github.com/AJYoutube007/JobHunter_Agent.git<br>cd JobHunter_Agent<br>uv sync</pre><h3>Create a UiPath Studio Workflow for Sending Emails</h3><p>Create a simple UiPath Web Studio workflow that sends emails using the Gmail Integration activities. The workflow should accept inputs such as the recipient’s email address, subject, email body, and an optional attachment.</p><p>Once the workflow is tested successfully, publish it to UiPath Orchestrator and expose it as an MCP tool. This allows the AI Job Hunter Agent to call the workflow whenever it needs to email the job summary and Excel report.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nDh4-evjV8JOmPOVnk1oXQ.png" /></figure><h3>Configure Your Environment</h3><p>Next, create your environment file by copying the sample configuration:</p><pre>cp .env.example .env</pre><p>Open the .env file and add your Firecrawl API key along with any other required settings.</p><pre>FIRECRAWL_API_KEY= # You can get it from https://www.firecrawl.dev/<br><br># These are generated automatically once you run `uipath auth` or `uipath init`<br><br>UIPATH_ACCESS_TOKEN=<br>UIPATH_URL=<br>UIPATH_TENANT_ID=<br>UIPATH_ORGANIZATION_ID=<br>FIRECRAWL_API_KEY=<br>UIPATH_MODEL=gpt-4o-mini-2024-07-18<br>OUTPUT_DIR=output<br>FIRECRAWL_LIMIT=10<br><br># Studio workflow: build a flow that sends emails via the Gmail integration,<br># then expose it through UiPath as an MCP tool<br><br>UIPATH_MCP_SERVER_URL=</pre><p>Once that&#39;s done, authenticate with UiPath using:</p><pre>uip login</pre><h3>Try It Without Live Data (Demo Mode)</h3><p>If you’re just exploring the project, you don’t even need a Firecrawl API key. Enable Demo Mode, and the agent will generate sample job data so you can experience the full workflow without making any external API calls.</p><h3>Run a Real Job Search</h3><p>When you’re ready to search for real jobs, update input.json with your preferred job title, locations, skills, and experience, then run the agent via the UiPath CLI. The agent will search for jobs, analyze each posting with AI, and generate a neatly formatted Excel report of the best matches.</p><h3>Deploy to Orchestrator</h3><p>Once you’ve successfully run the agent locally, the next step is deploying it to UiPath Orchestrator so it can be managed and executed in an enterprise environment.</p><p>Package and publish the project using the UiPath CLI:</p><pre>uip pack<br>uip publish</pre><p>That’s it! In just a few minutes, you’ll have your own AI-powered Job Hunter Agent running locally.</p><h3>Step 1: Define Strong Data Models (models.py)</h3><p>Instead of passing dictionaries between workflow nodes, the project uses <strong>Pydantic</strong> models defined in <strong>models.py</strong>.</p><p>The key models include:</p><ul><li><strong>CandidateProfile</strong> — stores candidate skills and experience.</li><li><strong>JobHunterInput</strong> — represents the agent input.</li><li><strong>JobAnalysis</strong> — represents the AI-generated analysis for each job.</li><li><strong>Workflow State</strong> — shared state between LangGraph nodes.</li></ul><p>Using strongly typed models improves validation and keeps each workflow node predictable.</p><h3>Step 2— Keep AI Prompts Separate (prompts.py)</h3><p>Prompt engineering is isolated inside <strong>prompts.py</strong>.</p><p>Rather than embedding prompt text throughout the workflow, all AI instructions are centralized in one location.</p><p>This makes prompts easier to:</p><ul><li>improve</li><li>maintain</li></ul><p>without changing the workflow logic.</p><pre># prompts.py<br>&quot;&quot;&quot;Prompts are isolated to make production tuning auditable.&quot;&quot;&quot;<br><br>from .models import CandidateProfile<br><br><br>def job_analysis_prompt(document: str, url: str, profile: CandidateProfile) -&gt; str:<br>    return f&quot;&quot;&quot;You are an exacting job-posting analyst. Extract only facts supported by the posting,<br>then assess fit for the candidate. Do not invent salary, dates, skills, or remote status.<br><br>Candidate profile:<br>- Skills: {&#39;, &#39;.join(profile.skills) or &#39;not provided&#39;}<br>- Years of experience: {profile.years_experience if profile.years_experience is not None else &#39;not provided&#39;}<br>- Summary: {profile.summary or &#39;not provided&#39;}<br><br>Apply URL (use this exact URL if the posting does not provide a better application URL): {url}<br><br>Posting:<br>{document[:24000]}<br><br>Return the requested structured fields. Match score is 0-100. Explain the score concisely and<br>identify missing critical requirements in notes. Set status to New.&quot;&quot;&quot;</pre><h3>Step 3— Discover Jobs (firecrawl_tools.py)</h3><p>The <strong>firecrawl_tools.py</strong> module communicates with Firecrawl.</p><p>Instead of scraping a single job portal, it performs web searches using dynamic search queries.</p><p>For example:</p><pre>Senior UiPath Developer Remote India</pre><p>Firecrawl then:</p><ul><li>searches the web</li><li>scrapes relevant pages</li><li>returns markdown</li><li>resolves job URLs</li></ul><p>Because Firecrawl searches the open web, the project isn’t tied to any specific job board.</p><h3>Step 4— Analyze Jobs with AI (workflow.py + prompts.py)</h3><p>The heart of the application is <strong>workflow.py</strong>.</p><p>This file defines the LangGraph workflow responsible for orchestrating every step.</p><p>For each discovered job:</p><ol><li>The description is collected.</li><li>The prompt from prompts.py is used.</li><li>The LLM extracts structured information.</li><li>A JobAnalysis object is returned.</li></ol><p>The AI extracts information such as:</p><ul><li>Job Title, Company, Experience, Skills, Summary, Match Score, Apply URL</li></ul><p>Instead of returning unstructured text, the LLM produces validated structured data.</p><h3>Step 5— Resolve Direct Job URLs (firecrawl_tools.py)</h3><p>Search engines often return listing pages rather than actual job postings.</p><p>The project detects these situations and uses additional Firecrawl searches to locate the direct application page.</p><p>If no valid application URL can be resolved, the listing is skipped.</p><p>This keeps the final report clean and prevents broken links.</p><h3>Step 6— Export Results (excel_utils.py)</h3><p>Once analysis is complete, <strong>excel_utils.py</strong> creates a formatted Excel workbook.</p><p>Each row includes:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*hV_HTq0QSRQQtGsyH-we4g.png" /></figure><p>The workbook is automatically formatted with readable headers, filters, and styling so it’s immediately ready for use.</p><h3>📬 Expected Output</h3><p>Once the workflow completes, you’ll receive a polished HTML email summarizing the best matching jobs, along with a formatted Excel report containing complete job details and direct application links.</p><p><em>Sample output:</em></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DEh8mCUvHfUu24Qa8xhnmQ.png" /></figure><p>📘 <strong>Reference:</strong></p><p>You can copy the whole Agent from my GitHub page:</p><p><a href="https://github.com/AJYoutube007/JobHunter_Agent">GitHub - AJYoutube007/JobHunter_Agent</a></p><p>In case of any doubts or if you just want to have a fun conversation, feel free to reach out anytime: <a href="https://www.linkedin.com/in/abhishek-jagtap-314624140/">Abhishek Jagtap on LinkedIn</a></p><p>Best of luck and happy automating! 🤖💫</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=61f7a2c3a5a9" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Wait… UiPath Studio Has Extensions Now?]]></title>
            <link>https://medium.com/@jagtapabhi13/wait-uipath-studio-has-extensions-now-58106bc3cad2?source=rss-bb08e175ad9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/58106bc3cad2</guid>
            <category><![CDATA[uipath-automation]]></category>
            <category><![CDATA[openai-codex]]></category>
            <category><![CDATA[uipath]]></category>
            <category><![CDATA[extension]]></category>
            <category><![CDATA[ai-agent]]></category>
            <dc:creator><![CDATA[Abhishek Jagtap]]></dc:creator>
            <pubDate>Sun, 14 Jun 2026 16:29:28 GMT</pubDate>
            <atom:updated>2026-06-14T16:29:28.225Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*l_hbeQy2yH06K2wzhtebUA.png" /></figure><p>When UiPath announced extension support in Studio 26.0.195, my first question was simple:</p><p><strong>Can I install actual VS Code extensions inside UiPath Studio?</strong></p><p>The answer is yes.</p><p>UiPath Studio now supports VSIX packages, which means many extensions from the VS Code ecosystem can be installed directly into Studio. To see how far this could go, I decided to experiment with a few completely different extensions — from a mini game, to an AI coding agent, to PDF and Word document viewers.</p><p>All extensions can be discovered, installed, and managed from the new <strong>Extensions</strong> panel in UiPath Studio.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/492/1*0XIZGSnisSV343v8sddmNA.png" /></figure><p>Here’s what I tried first.</p><h3>Extension #1: OpenAI Codex Inside Studio 🤖</h3><p>The first extension I installed was Codex.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/432/1*oljNBywD9dT51pZ21AE95Q.png" /></figure><p>Instead of switching between Studio and an external AI tool, I could interact with an AI coding agent directly from my automation development environment.</p><p>Whether it’s generating logic, explaining code, reviewing workflows, or helping troubleshoot issues, having an AI assistant available within Studio creates a much smoother development experience.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1-fHWwssJZE0N_dUU9sZeQ.gif" /></figure><h3>Extension #2: Keeping Project Documentation Inside Studio 📄</h3><p>Every automation project comes with documentation.</p><p>PDDs, business requirements, solution design documents, test cases, sample invoices, input spreadsheets, and process notes are constantly referenced during development.</p><p>To solve this, I installed two extensions:</p><ul><li><strong>vscode-pdf</strong> for viewing PDF documents</li><li><strong>Office Viewer</strong> for opening Word, Excel, and PowerPoint files</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/437/1*EZPPYc8HraSMgxq3z2AUVw.png" /></figure><p>With these extensions, project documentation can be opened directly inside UiPath Studio. Whether it’s reviewing a PDD, checking an input spreadsheet, or validating business rules in a Word document, everything remains available alongside the workflow being developed.</p><p>This is one of those features that immediately feels useful after trying it.</p><p>One thing I discovered while testing these extensions is that PDF, Word, Excel, and other non-automation files may not appear in the Explorer panel by default.</p><p><strong>Important Note: Click the Filter icon and enable Other under file types.</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/527/1*gXl0vi0vtj8G-XIeT0kYPQ.png" /></figure><p>Results after the installation of extension</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*mp1mQ0X8ejO_wWs2pIK9CQ.gif" /></figure><h3>Extension #3: Testing APIs with Postman 🔌</h3><p>APIs are at the heart of modern automations, and the Postman extension brings API testing directly into UiPath Studio.</p><p>Instead of switching between applications, you can validate endpoints, test authentication, inspect responses, and verify payloads before implementing HTTP Request activities.</p><p>While I encountered an authentication issue during testing, the ability to test APIs from within Studio highlights the potential of the new extension ecosystem and a more integrated development experience.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/442/1*NBBS73KVzUGmVkJ4thmadQ.png" /></figure><h3>Extension #4: Playing Games Inside UiPath Studio 🎮</h3><p>Now for the extension I definitely wasn’t expecting.</p><p>I installed a mini-game extension and suddenly found myself playing games inside UiPath Studio.</p><p>While this won’t help deliver automations faster, it perfectly demonstrates the flexibility of the new extension framework.</p><p>The fact that Studio can host everything from AI coding assistants to document viewers — and even games — shows how much the platform has evolved.</p><p>And let’s be honest: every developer deserves a quick break while waiting for a package restore.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/431/1*5_8stdYFME8asB1mKdYfgw.png" /></figure><p>Here are the results:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*Ghf_AjbyZpBHzILbe9wwXg.gif" /></figure><h3>Final Thoughts</h3><p>UiPath Studio Extensions may seem like a small feature, but they have the potential to significantly improve the developer experience.</p><p>From AI assistants and API testing to project documentation and even a few fun extras, extensions make it easier to keep everything in one place.</p><p>I’m excited to see how the community adopts this feature and what extensions become must-haves for automation developers.</p><p>Which extension are you trying first?</p><p>📘 <strong>Reference:</strong></p><p><a href="https://forum.uipath.com/t/uipath-26-0-195-june-community-release/5752759">UiPath 26.0.195 June Community Release</a></p><p>In case of any doubts or if you just want to have a fun conversation, feel free to reach out anytime: <a href="https://www.linkedin.com/in/abhishek-jagtap-314624140/">Abhishek Jagtap on LinkedIn</a></p><p>Best of luck and happy automating! 🤖💫</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=58106bc3cad2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[I Discovered UiPath Agent Skills — Now AI Agents Build My Automation Workflows]]></title>
            <link>https://medium.com/@jagtapabhi13/i-discovered-uipath-agent-skills-now-ai-agents-build-my-automation-workflows-e3fd59a0a3d2?source=rss-bb08e175ad9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/e3fd59a0a3d2</guid>
            <category><![CDATA[uipath-automation]]></category>
            <category><![CDATA[gemini-cli]]></category>
            <category><![CDATA[uipath-cli]]></category>
            <category><![CDATA[ai-agent]]></category>
            <category><![CDATA[uipath]]></category>
            <dc:creator><![CDATA[Abhishek Jagtap]]></dc:creator>
            <pubDate>Sat, 18 Apr 2026 19:44:42 GMT</pubDate>
            <atom:updated>2026-04-18T19:44:42.734Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*c2AEbpnW0zkEroa4v9xv_A.png" /></figure><p>AI coding assistants are great — until you ask them to build a UiPath automation.</p><p>That’s when things start to fall apart.</p><p>The model confidently generates workflows, references activities that sound perfectly valid, and produces code that looks right… but fails instantly. Activities don’t exist. Package behavior is guessed. And suddenly you’re debugging fiction instead of automation.</p><p>The problem isn’t the model — it’s the ecosystem.</p><p>UiPath is highly specialized. It combines XAML workflows, activity packages, orchestrator interactions, and now coded automations. This structure doesn’t translate cleanly into the kind of generalized patterns most AI models are trained on. So the model fills in the gaps with assumptions — and those assumptions break things.</p><p>That’s where UiPath Agent Skills comes in.</p><p><strong>UiPath Agent Skills is UiPath’s official answer to this gap.</strong> It’s an open-source collection of structured “skills” that you plug directly into your AI coding assistant. Instead of guessing, the model now has grounded knowledge of real activities, APIs, and patterns.</p><p>And the best part? It’s incredibly simple to use.</p><p>Two commands — and your AI goes from “creative but unreliable” to “actually useful.”</p><h3><strong>What is a “skill” in this context?</strong></h3><p>In the UiPath Agent Skills repo, a skill isn’t a library — it’s a structured instruction file (SKILL.md) for your AI agent. It tells the agent exactly how to perform a UiPath task: which activities to use, required parameters, project structure, CLI commands, and common pitfalls.</p><p>Think of it as a focused briefing that removes guesswork.</p><p>This approach is increasingly common in agentic tools like Claude Code and Cursor IDE, which load project-specific rules. UiPath skills plug into that same idea — giving your AI a practical, grounded understanding of UiPath development.</p><h4>🧰 Prerequisites</h4><p>Before you start, make sure you have:</p><p>🟢 <strong>Node.js (LTS)</strong><br> Verify with node -v — no version = install it first</p><p>🤖 <strong>UiPath Studio</strong><br> For building and running automations with Terminal</p><p>🧠 <strong>AI Coding Agent</strong><br> Claude Code, Cursor IDE, Codex CLI, or Gemini</p><p><strong>Step 1: Install Node.js</strong></p><p>Verify with node -v — no version = install it first</p><p>To Install <strong>Node.js (LTS)</strong> using Winget:</p><pre>winget install OpenJS.NodeJS.LTS</pre><p>Verify with node -v</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/627/1*5nYXun1TMqGUyxfncj1vcA.png" /></figure><p><strong>Step 2 : Install UiPath Cli</strong></p><pre>npm -g install @uipath/cli</pre><p>This command installs the <strong>UiPath CLI globally on your machine</strong>.</p><ul><li><strong>npm</strong> → Node package manager (comes with Node.js)</li><li><strong>-g (global)</strong> → Installs the package system-wide (usable from anywhere in terminal)</li><li><strong>@uipath/cli</strong> → Official UiPath CLI package</li></ul><h4>✅ Verify Installation</h4><p>Now if you run: <em>uip</em></p><p>You should see the UiPath CLI help menu.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*jsOVI1Uw1G_8_5f6EHPbxg.png" /></figure><h4>Step 3: Install Skills</h4><p>Now we can install the AI skills:</p><pre>uip skills install</pre><p>You can install all the skills in my Tutorial i have only install the Gemini CLI, You can use any agent that you prefer.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*N_zmnB2NQ0s5acqR_BRtrg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*JWN2W1u_ryrt-zHcDyrFDQ.gif" /></figure><p>After Skills installation we also need to link these skills to our Gemini cli agent</p><p>If Gemini cli is not already installed</p><pre>npm install -g @google/gemini-cli</pre><p>you can also check my other article where i have mention all the detail steps for gemini <a href="https://medium.com/@jagtapabhi13/i-found-a-terminal-in-uipath-studio-so-i-had-to-try-everything-40dbfce555c7">link</a></p><p><strong>Step 4: Link those skills With Agent</strong></p><p>Skills are installed at the user profile level when you run the <strong>UiPath CLI</strong> command uip skills install.<br>These skills are stored at for example : <em>C:\Users\Abhishek\.uipath\.skills\skills</em></p><p>To use them with the <strong>Gemini CLI</strong>, you must link this directory so Gemini can recognize them as native skills.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*lkl0fr5wjscE1f68m9-HeQ.gif" /></figure><p>You can see the whole skills list in the gemini cli</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*GKOvRDTcvdaXm1rHGfG3tg.png" /></figure><p><strong>Step 5: Give it a Try</strong></p><p>Now you are all set to use these skills inside <strong>UiPath Studio</strong>.</p><p>To try it out, I went with something fun and gave this prompt:</p><p><em>&gt;</em><strong><em> create a simple number guessing game using uipath-rpa skills take input &amp; then give output in loop until correct, make it fun logical game in main.xaml</em></strong></p><p>The results were impressive — the system generated a complete, runnable workflow.<br>It handled input, implemented a loop until the correct guess, added logical conditions, and produced structured output — all directly usable in Main.xaml.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ally2a-A14NvspF3D6QC5g.gif" /></figure><p>If you’re already using tools like Cursor IDE or Claude Code, this is one of the easiest upgrades you can make.</p><p>Two commands — and your AI goes from guessing to building.</p><p>📘 <strong>Reference:</strong></p><p>If you’re building automations on UiPath and using any AI coding assistant, this repo deserves a look.</p><p><a href="https://github.com/uipath/skills">GitHub - UiPath/skills: This is a repository of skills for interfacing UiPath capabilities to external developers.</a></p><p>In case of any doubts or if you just want to have a fun conversation, feel free to reach out anytime: <a href="https://www.linkedin.com/in/abhishek-jagtap-314624140/">Abhishek Jagtap on LinkedIn</a></p><p>Best of luck and happy automating! 🤖💫</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=e3fd59a0a3d2" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[I Found a Terminal in UiPath Studio… So I Had to Try Everything ]]></title>
            <link>https://medium.com/@jagtapabhi13/i-found-a-terminal-in-uipath-studio-so-i-had-to-try-everything-40dbfce555c7?source=rss-bb08e175ad9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/40dbfce555c7</guid>
            <category><![CDATA[uipath]]></category>
            <category><![CDATA[cli]]></category>
            <category><![CDATA[uipath-training]]></category>
            <category><![CDATA[terminal]]></category>
            <category><![CDATA[gemini-cli]]></category>
            <dc:creator><![CDATA[Abhishek Jagtap]]></dc:creator>
            <pubDate>Fri, 13 Mar 2026 18:40:50 GMT</pubDate>
            <atom:updated>2026-03-13T18:40:50.524Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2oq-OhOQA_fIMtn_yKPciw.png" /></figure><p>For years, <strong>UiPath Studio</strong> has been a powerful IDE for building enterprise automations. But one thing many developers missed was a <strong>native terminal inside the IDE</strong>.</p><p>Whenever you needed to run a quick Git command, execute a script, or use an AI coding assistant, you had to switch to an external terminal window. That context switching interrupted the development flow.</p><p>With the <a href="https://forum.uipath.com/t/uipath-26-0-188-february-community-release/5725679"><strong>UiPath 26.0.188 February Community Release</strong></a>, that gap has finally been addressed. This is a meaningful shift — it positions UiPath Studio not just as an automation builder, but as a complete developer workspace.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YXxxkRnVAcmYIL3NHjy2xA.png" /></figure><h3>What the Terminal Panel Means for Studio Developers</h3><p>The new terminal gives developers the flexibility to work with the same command-line tools they already use in modern development environments.</p><p>Instead of switching between multiple applications, you can now:</p><ul><li>run scripts</li><li>perform Git operations</li><li>install CLI tools</li><li>interact with AI assistants</li><li>debug environments</li></ul><p>— all <strong>without leaving your automation project</strong>.</p><p>In short, <strong>everything lives in one window</strong>.</p><h3><strong>A Few Ways I’ve Been Exploring the New Terminal</strong></h3><p>Here are some of the ways I’ve been experimenting with the built-in terminal during my initial exploration:</p><p><strong>Git — Version Control Without Leaving Studio</strong></p><p>Working with <strong>Git</strong> directly from the Studio terminal is one of the most immediate benefits.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qV7lqi7PjaN1gwEa75c79g.gif" /></figure><p>For developers who are already comfortable with command-line Git, this workflow feels far more natural and efficient.</p><p><strong>AI Assistance with Gemini CLI</strong></p><p>Google’s Gemini CLI brings AI-powered code suggestions, explanations, and generation right into your terminal session. Inside UiPath Studio’s terminal, you can ask Gemini to help scaffold logic, explain a regex, or suggest an approach — without ever leaving your automation project.</p><p>Install the Gemini command-line tool:</p><pre>npm install -g @google/gemini-cli</pre><p><strong>If you want to run Gemini CLI temporarily without installing it globally.</strong></p><pre>npx @google/gemini-cli</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*AGvF7INrFa1swkq5My1B9w.png" /></figure><ol><li><strong>AI-Assisted Code Fixes Using the Terminal:</strong></li></ol><p>In the following example, I asked Gemini CLI to fix an issue in my UiPath Studio workflow directly from the terminal.</p><p>Gemini analyzes the project files, identifies the issue (In My case missing quotation mark) in the workflow code, and suggests or applies the required fixes. This allows developers to quickly resolve problems without manually digging through multiple files.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*RMN_EkNyUD4uhxfL1-M4aA.gif" /></figure><p><strong>2. Building Workflows Using AI from the Terminal</strong></p><p>You can also build automation workflows using AI directly from the terminal. In the example below, I used Gemini CLI inside UiPath Studio to generate a <strong>.xaml workflow</strong>.</p><p>In this simple demo, the generated workflow opens Notepad and writes <strong>“Hello World.”</strong></p><p>While the example is basic, the same approach can be used to generate much more complex workflows. With the right prompts, AI can help quickly create and prototype automation workflows directly from the terminal.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*8QxrD3uiZPu89K90pZZbIw.gif" /></figure><p><strong>3. Adding Workflow Annotations Using AI</strong></p><p>We can also add annotations across an entire workflow using a single prompt in the AI-assisted terminal. In this demo, I used Gemini CLI inside UiPath Studio to automatically add annotations to the workflow.</p><p>Gemini reviews the activities in the <strong>.xaml workflow</strong>, understands the logic, and then generates meaningful annotations throughout the code. This helps quickly document the workflow and makes it easier for other developers to understand the automation.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*iIy7KFNVhvG1Jf1l4N6UsA.gif" /></figure><p><strong>4. Generating Documentation Using AI from the Terminal</strong></p><p>Another useful example is generating documentation directly from the AI-assisted terminal. By giving a simple prompt to Gemini CLI inside UiPath Studio, AI can analyze the workflow files and automatically generate documentation.</p><p>It reviews the activities and workflow logic, then creates a structured document explaining how the automation works. This makes it much faster to produce technical documentation without manually going through the entire workflow.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*C0NW95ll3n1peURLvdBbuw.png" /></figure><p>Most of the examples above focused on using Gemini CLI, but this is just scratching the surface. There are many more possibilities when combining AI tools with the built-in terminal in UiPath Studio.</p><p><strong>5. Using Claude CLI from the Terminal</strong></p><p>While tools like Claude CLI can also be used from the terminal inside UiPath Studio, I haven’t explored it much yet since it is not free like Gemini CLI.</p><p>Install the Claude command-line tool:</p><pre>npm install -g @anthropic-ai/claude-code</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qWQvMeMFr5F3_aCyUW0Wdg.png" /></figure><p>However, the example shows that the terminal can work with multiple AI CLI tools, opening up many possibilities for AI-assisted development.</p><p>6. <strong>Experimenting with UiPath LangGraph Agents</strong></p><p>I also tried creating a <strong>LangGraph-based agent</strong> using the terminal inside UiPath Studio.</p><p>Using the terminal, I ran the command to scaffold a new agent project with the UiPath LangGraph tools. This generated files like:</p><ul><li>main.py</li><li>langgraph.json</li><li>pyproject.toml</li></ul><p>While the agent project is created successfully, the <strong>.py files are currently not visible or editable inside UiPath Studio</strong>. To modify the Python logic, the files need to be opened in an external editor such as Visual Studio Code.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*HZvSWmKl36eYxYXlqbxE9A.png" /></figure><p>Hopefully in the future, coded agents using UiPath LangGraph, LangChain can be built entirely within UiPath Studio without needing external tools like Visual Studio Code.</p><p><strong>A Little Bit of Fun 😄</strong></p><p>Apart from development use cases, I also played around with the fun side of the terminal. You can actually run simple terminal games like Tetris or Snake directly inside the terminal.</p><p>It’s a small but fun reminder that the built-in terminal in UiPath Studio isn’t just for development tasks — you can also use it to experiment and explore just like any other developer terminal.</p><p>This uses Node.js and npm to launch the classic Snake directly inside the terminal.</p><pre>npx tetris-cli</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*kpjwm5aXXmwKPxkieBLx0w.gif" /></figure><p>For Snake:</p><pre>npx snake-cli</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*1He1aeoa3o9dnferGObD8A.gif" /></figure><p>The built-in terminal in UiPath Studio adds a lot of flexibility for developers. From running Git commands to experimenting with AI tools like Gemini CLI, it opens up new ways to build and manage automations.</p><p>There’s still a lot to explore, and it will be interesting to see how this evolves in future updates. And of course, if you need a quick break, you can always run a game of Tetris or Snake right inside the terminal. 😉🎮</p><p>In case of any doubts or if you just want to have a fun conversation, feel free to reach out anytime: <a href="https://www.linkedin.com/in/abhishek-jagtap-314624140/">Abhishek Jagtap on LinkedIn</a></p><p>Best of luck and happy automating! 🤖💫</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=40dbfce555c7" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Building a Web Research Agent Using UiPath OpenAI Agents SDK and Firecrawl MCP]]></title>
            <link>https://medium.com/@jagtapabhi13/building-a-web-research-agent-using-uipath-openai-agents-sdk-and-firecrawl-mcp-14ede515e6c3?source=rss-bb08e175ad9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/14ede515e6c3</guid>
            <category><![CDATA[uipath-sdk]]></category>
            <category><![CDATA[uipath]]></category>
            <category><![CDATA[firecrawl]]></category>
            <category><![CDATA[uipath-automation]]></category>
            <category><![CDATA[openai-agents-sdk]]></category>
            <dc:creator><![CDATA[Abhishek Jagtap]]></dc:creator>
            <pubDate>Sun, 08 Mar 2026 17:47:01 GMT</pubDate>
            <atom:updated>2026-03-08T17:47:01.704Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*D1wMwNa4X-NTEvlRLdYn_Q.jpeg" /></figure><p>Harness the power of UiPath’s OpenAI Agents SDK, Model Context Protocol (MCP), and Firecrawl to create a production-ready web research agent — deployable directly to UiPath Automation Cloud</p><p>If you’ve been following along with my previous articles on building coded agents in UiPath, you already know how powerful it is to combine UiPath’s orchestration capabilities with modern AI frameworks. In this article, we’re taking it up a notch — we’re going to build a <strong>web research agent</strong> using the <strong>UiPath OpenAI Agents SDK</strong>, <strong>Firecrawl’s MCP server</strong>, and UiPath’s CLI toolchain.</p><p>This agent can:</p><ul><li>🔍 <strong>Search the web</strong> for any topic using Firecrawl</li><li>📄 <strong>Scrape individual pages</strong> for detailed content</li><li>🕸️ <strong>Crawl entire websites</strong> for comprehensive research</li><li>🗂️ <strong>Extract structured data</strong> from any URL using a custom schema</li></ul><p>By the end of this article, you’ll have a fully working agent that you can run locally, package, and publish directly to UiPath Automation Cloud with just a few CLI commands.</p><h3>🧰 Prerequisites</h3><p>Before coding, make sure you have:</p><ul><li>🐍 <strong>Python 3.10+</strong></li><li>🤖 <strong>UiPath Automation Cloud / Orchestrator</strong> account</li><li>🧬 Basic familiarity with <strong>UiPath Open Ai Agents SDK</strong></li><li>A<strong> Firecrawl MCP Server URL</strong> (That I will show in the Tutorial how to get)</li></ul><h3>Step 1: Environment Setup</h3><p>Let’s start by setting up our development environment. We’ll usepipfor package management. For faster package management, you can use the uv.</p><p># Create project directory e.g. UiPathOpenAIAgent_FireCrawl i have created</p><p>Inside that we need to create virtual environment</p><pre>python -m venv .venv</pre><p>after virtual environment creation we need to activate the environment</p><pre>.venv\Scripts\Activate.ps1</pre><p>After activation your screen will look like this:</p><p><strong>Step 2: Installing Required Packages</strong></p><p>With the environment activated, we’re now ready to install the dependencies and start building our openai based UiPath agent. Upgrade the pip &amp; install the uipath Openai package.</p><pre># Upgrade pip to the latest version<br>python -m pip install --upgrade pip<br># Install the uipath package<br>pip install uipath-openai-agents</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/938/1*u1H_rs-jPVEge6piE5f4Eg.png" /></figure><p><strong>Step 3: Create Your Agent with the CLI</strong></p><p>UiPath provides a convenient CLI command to create a new agent:</p><p>Run the following command:</p><pre>uipath new OpenAI_FireCrawl</pre><p>here i have given OpenAI_FireCrawl as the name of our OpenAI agent</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*V8J3hF--vawiAYxgMaSAnQ.png" /></figure><p>This will create these files inside your folder</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/423/1*KKrCOhsh8RV_edk3EwGGKw.png" /></figure><p>If you open the main.py file after creating a coded agent project, you’ll notice that <strong>UiPath</strong> provides a default sample implementation to help developers understand how agents work.</p><p>In the sample, a basic tool called get_weather is defined using the @function_tool decorator, which exposes the function to the agent so it can call it whenever it needs external information.</p><p>For this tutorial, we won’t be using that example. You can <strong>safely delete the entire sample code</strong> from main.py and replace it with the custom implementation provided in the next section.</p><p>We’ll build our own <strong>Web Research Agent</strong> using <strong>UiPath</strong>, the <strong>OpenAI Agents SDK</strong>, and <strong>Firecrawl</strong> via MCP, tailored specifically for this use case.</p><pre>import asyncio<br>import os<br>import sys<br>from contextlib import asynccontextmanager<br><br>from dotenv import load_dotenv<br>from agents import Agent, Runner, function_tool<br>from agents.models import _openai_shared<br>from uipath_openai_agents.chat import UiPathChatOpenAI<br>from uipath_openai_agents.chat.supported_models import OpenAIModels<br>from mcp import ClientSession<br>from mcp.client.streamable_http import streamablehttp_client<br><br>load_dotenv()<br><br><br>@asynccontextmanager<br>async def get_mcp_session():<br>    MCP_SERVER_URL = os.getenv(&quot;MCP_SERVER_URL&quot;)<br>    UIPATH_PAT = os.getenv(&quot;UIPATH_PAT&quot;)<br><br>    if not MCP_SERVER_URL:<br>        raise ValueError(&quot;MCP_SERVER_URL must be set&quot;)<br>    if not UIPATH_PAT:<br>        raise ValueError(&quot;UIPATH_PAT must be set&quot;)<br><br>    headers = {&quot;Authorization&quot;: f&quot;Bearer {UIPATH_PAT}&quot;}<br><br>    async with streamablehttp_client(<br>        url=MCP_SERVER_URL,<br>        headers=headers,<br>        timeout=60,<br>    ) as (read, write, _):<br>        async with ClientSession(read, write) as session:<br>            await session.initialize()<br>            yield session<br><br><br>@function_tool<br>async def firecrawl_search(query: str, limit: int = 5) -&gt; str:<br>    &quot;&quot;&quot;Search the web using Firecrawl.&quot;&quot;&quot;<br>    async with get_mcp_session() as session:<br>        result = await session.call_tool(<br>            &quot;firecrawl_search&quot;,<br>            {&quot;query&quot;: query, &quot;limit&quot;: limit},<br>        )<br>        return str(result)<br><br><br>@function_tool<br>async def firecrawl_scrape(url: str) -&gt; str:<br>    &quot;&quot;&quot;Scrape a single webpage.&quot;&quot;&quot;<br>    async with get_mcp_session() as session:<br>        result = await session.call_tool(<br>            &quot;firecrawl_scrape&quot;,<br>            {&quot;url&quot;: url},<br>        )<br>        return str(result)<br><br><br>@function_tool<br>async def firecrawl_crawl(url: str, limit: int = 10) -&gt; str:<br>    &quot;&quot;&quot;Crawl an entire website.&quot;&quot;&quot;<br>    async with get_mcp_session() as session:<br>        result = await session.call_tool(<br>            &quot;firecrawl_crawl&quot;,<br>            {&quot;url&quot;: url, &quot;limit&quot;: limit},<br>        )<br>        return str(result)<br><br><br>@function_tool<br>async def firecrawl_extract(url: str, extract_schema: str) -&gt; str:<br>    &quot;&quot;&quot;Extract structured data using a schema (pass schema as JSON string).&quot;&quot;&quot;<br>    import json<br>    async with get_mcp_session() as session:<br>        schema = json.loads(extract_schema)<br>        result = await session.call_tool(<br>            &quot;firecrawl_extract&quot;,<br>            {&quot;url&quot;: url, &quot;schema&quot;: schema},<br>        )<br>        return str(result)<br><br><br>MODEL = OpenAIModels.gpt_5_1_2025_11_13<br><br>uipath_openai_client = UiPathChatOpenAI(model_name=MODEL)<br>_openai_shared.set_default_openai_client(uipath_openai_client.async_client)<br><br>firecrawl_agent = Agent(<br>    name=&quot;firecrawl_agent&quot;,<br>    instructions=&quot;&quot;&quot;<br>You are an advanced web research assistant powered by Firecrawl.<br><br>Use the available tools appropriately:<br>- firecrawl_search: Search the web for information<br>- firecrawl_scrape: Extract content from a single URL<br>- firecrawl_crawl: Crawl an entire website<br>- firecrawl_extract: Extract structured data using a schema<br><br>Always use tools to gather information instead of guessing.<br>Summarize results clearly and concisely.<br>&quot;&quot;&quot;,<br>    model=MODEL,<br>    tools=[<br>        firecrawl_search,<br>        firecrawl_scrape,<br>        firecrawl_crawl,<br>        firecrawl_extract,<br>    ],<br>)<br><br><br>def agent() -&gt; Agent:<br>    &quot;&quot;&quot;UiPath entry point — returns the agent instance.&quot;&quot;&quot;<br>    return firecrawl_agent<br><br><br>async def main():<br>    &quot;&quot;&quot;Local test entry point.&quot;&quot;&quot;<br>    # Read query from CLI arg or use default<br>    query = sys.argv[1] if len(sys.argv) &gt; 1 else &quot;Search for the latest information about AI and summarize the findings.&quot;<br>    result = await Runner.run(firecrawl_agent, query)<br>    print(result.final_output)<br><br><br>if __name__ == &quot;__main__&quot;:<br>    asyncio.run(main())</pre><p><strong>Step 4: Copy the code from above and paste it into </strong><strong>main.py.</strong></p><p>This implementation builds a <strong>Web Research Agent</strong> using <strong>UiPath</strong> and the <strong>OpenAI Agents SDK</strong>.</p><p>The agent uses <strong>Firecrawl tools via MCP (Model Context Protocol)</strong> to perform web research tasks such as:</p><ul><li>Searching the web</li><li>Scraping webpage content</li><li>Crawling entire websites</li><li>Extracting structured data</li></ul><p>The project contains the following key files:</p><p>📄 main.py → This file holds your agent logic, tool definitions, and the UiPath entry point.</p><p>⚙️ openai_agents.json → Defines your OpenAI Agents configuration, mapping agent names to their entry points (for example: &quot;agents&quot;: { &quot;agent&quot;: &quot;main.py:agent&quot; })</p><p>🧾 pyproject.toml → Contains the project metadata such as the project name, version, author details, and required dependencies.</p><p>🪄 <strong>Step 5: Authenticate with UiPath</strong></p><p>Before running your OpenAI agent, you need to <strong>authenticate</strong> with UiPath.<br>The easiest way is through the <strong>CLI authentication command</strong>:</p><pre>Uipath Auth</pre><h3>⚙️ What happens when you run this:</h3><ol><li>🌐 <strong>Browser Opens</strong> — Your default browser launches the <strong>UiPath Cloud Platform</strong>.</li><li>🔑 <strong>Login</strong> — Sign in with your UiPath credentials.</li><li>✅ <strong>Grant Access</strong> — Authorize the CLI to access your UiPath account.</li><li>⚡ <strong>Auto-Configuration</strong> — The CLI automatically generates or updates your .env file with:</li></ol><ul><li>UIPATH_URL → Your organization and tenant URL</li><li>UIPATH_ACCESS_TOKEN → Secure access token</li><li>UIPATH_TENANT_ID</li><li>UIPATH_ORGANIZATION_ID</li></ul><p>📁 Once complete, your .env file is ready — containing all the required credentials for your LlamaIndex agent to connect with UiPath seamlessly.</p><p>Your folder structure will look like this, <strong>.env</strong> file is created with details</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/301/1*fkBUOzGcJjUSjFUZWpQ-hQ.png" /></figure><p><strong>Step 6: Generate the FireCrwal MCP Server</strong></p><p>First, generate your Firecrawl API key:</p><ol><li>Go to <a href="https://www.firecrawl.dev/">firecrawl.dev</a> and create a free account</li><li>Navigate to <a href="https://www.firecrawl.dev/app/api-keys"><strong>firecrawl.dev/app/api-keys</strong></a> and generate a new API key — it will look like fc-xxxxxxxxxxxxxxxx</li></ol><p>Firecrawl provides a ready-to-use hosted MCP server URL — no setup or self-hosting required. Simply plug your API key directly into the URL:</p><pre>https://mcp.firecrawl.dev/{FIRECRAWL_API_KEY}/v2/mcp</pre><p><strong>Add Firecrawl as a Remote MCP Server in UiPath</strong></p><p><em>💡 </em><strong><em>Optional:</em></strong><em> Registering Firecrawl as a Remote MCP Server in UiPath is optional. Since the Firecrawl MCP URL already includes your API key (</em><em>https://mcp.firecrawl.dev/YOUR_API_KEY/v2/mcp), you can use it directly in your </em><em>.env file without proxying through UiPath.</em></p><p>Once you have your Firecrawl API key, you need to register it as a Remote MCP Server in UiPath Automation Cloud so your agent can access it.</p><ol><li>Go to <strong>My Workspace → MCP Servers → Add MCP Server</strong></li><li>Select the <strong>Remote</strong> tab — this option proxies requests to an external MCP server</li><li>Fill in the following fields:</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/916/1*n1KHhAOrJPTUQmdxHt76XQ.png" /></figure><p>Replace {FIRECRAWL_API_KEY} in the Remote URL with your actual API key before clicking <strong>Add</strong>.</p><p>Once added successfully, your Firecrawl MCP server will appear in the <strong>MCP Servers</strong> list with a green <strong>Active</strong> status. Click on it to expand the details panel on the right — you’ll see all the tools that are now available to your agent:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*eTjKgECRaUkfwoY0DKUuTg.png" /></figure><p>These are exactly the tools our agent code calls via MCP — firecrawl_search, firecrawl_scrape, firecrawl_crawl, and firecrawl_extract are all confirmed available here.</p><p>Now copy the <strong>Preview URL</strong> from the MCP Server details panel and paste it as your MCP_SERVER_URL in the .env file:</p><p><strong>Step 7: Generate PAT Token From UiPath</strong></p><p>We also need a <strong>UiPath Personal Access Token (PAT)</strong> to authenticate MCP requests. To generate one</p><p>Create a <strong>Personal Access Token</strong> from:</p><p>Automation Cloud → User Menu → Preferences → Personal Access Tokens</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/840/0*85B8Yve2gLb_wp03.png" /></figure><p>Then add it to your .env file: UIPATH_PAT=your_personal_access_token_here</p><p>Your .env file will look like this</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1008/1*uvC3J0MEP-rxIZ6kRfyQaA.png" /></figure><h4>⚙️ Step 8: Initialize the UiPath Project</h4><p>Set up your UiPath configuration files by running:</p><pre>uipath init</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/841/1*9OEUBpqYAMyl6iUnyhSLaw.png" /></figure><p>One of the most useful things this command generates is the <strong>agent.mermaid</strong> file — a visual graph of your agent’s flow.</p><p>These are project configuration files that UiPath generates to manage your agent’s metadata, input/output bindings, and entry point registration</p><p>Once created, your project is fully initialized and ready to connect with UiPath!</p><p><strong>🧩 Step 8: Test Your Agent Locally</strong></p><p>To quickly verify our agent works correctly or not run this query</p><pre>uipath run agent &#39;{\&quot;messages\&quot;: \&quot;Search the web for MCP servers\&quot;}&#39;</pre><p>You will see something like this</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*cocoVK-gR9O3P1OqKGdHPQ.png" /></figure><p>What&#39;s happening under the hood:</p><ol><li><strong>Agent starts</strong> → loads firecrawl_agent with all 4 tools registered</li><li><strong>Calls UiPath AI Gateway</strong> → routes the request to gpt-5.1-2025-11-13</li><li><strong>Model decides to call </strong><strong>firecrawl_search</strong> → fires a request to the Firecrawl MCP server via the UiPath proxy URL</li><li><strong>MCP returns results</strong> → the model synthesizes them into a clean summary</li><li><strong>✓ Successful execution</strong></li></ol><p><strong>Step 9: Update </strong><strong>pyproject.toml file</strong></p><p>Before publishing the project to <strong>UiPath Orchestrator</strong>, we need to update the dependencies in the <strong>pyproject.toml</strong> file to ensure all required packages are included.</p><p>This step is essential to make sure the coded agent runs correctly once deployed in the UiPath environment. You can either <strong>add the missing dependencies manually</strong> or <strong>replace the entire file</strong>, updating only the project name, author name, and email with your own details.</p><pre>[project]<br>name = &quot;OpenAI_FireCrawl&quot;<br>version = &quot;0.0.1&quot;<br>description = &quot;OpenAI_FireCrawl&quot;<br>authors = [{ name = &quot;Your Name Here&quot;, email = &quot;Your Email Address&quot; }]<br>dependencies = [<br>    &quot;uipath-openai-agents&gt;=0.0.1, &lt;0.1.0&quot;,<br>    &quot;mcp&gt;=1.0.0&quot;,<br>    &quot;python-dotenv&gt;=1.0.0&quot;,<br>]<br>requires-python = &quot;&gt;=3.11&quot;</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*3HcfCr54TkD7m8LE5m4HLw.png" /></figure><h4>Step 10: Package and Publish Your Agent</h4><p>After testing locally and finalizing your project, it’s time to <strong>package and publish</strong> your OpenAI agent to <strong>UiPath Automation Cloud</strong>.</p><p>Run the following command:</p><pre>UiPath Pack</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/705/1*poDD4woMTFjnNH_KDyXmkg.png" /></figure><p>Once your agent is packaged, publish it directly to your <strong>UiPath tenant</strong> using:</p><p>Run the following command:</p><pre>Uipath Publish</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/768/1*Q-uypsjyjP6uk4OPAocuwA.png" /></figure><ul><li><strong>select the target feed</strong> where the package should be published</li></ul><p>After publishing, your OpenAI agent is live and ready to run from UiPath Orchestrator! 💼</p><h4>⚙️ Step 11: Add the Published Agent as a Process in Orchestrator &amp; Run It in UiPath Cloud</h4><p>Now that your agent is published to UiPath Cloud, the next step is to create a <strong>Process</strong> in UiPath Orchestrator so it becomes executable.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LaXKQaqOHzO-9REndJeInQ.png" /></figure><p>Once the process is set up, you can <strong>run your OpenAI agent directly from Orchestrator</strong>!</p><p>When triggering the process:</p><p>Once published, go to <strong>Jobs → Start Job</strong> and configure the following:</p><p><strong>Environment Configuration</strong> — add your environment varibles</p><pre>UIPATH_PAT=your_pat_token_here<br>MCP_SERVER_URL=your_mcp_url_here</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*_-TrYMk7Sk-Ua8gTL-iC0A.png" /></figure><p>Once your agent runs successfully in <strong>UiPath Orchestrator</strong>, you’ll see the generated result in the <strong>Job Output</strong> or <strong>Logs</strong> section.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*BAy6YwSnviIfRcadQaNhPw.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qPGwl0IRKoaj2dJjsLw_YQ.png" /></figure><p>You can see the agent has successfully picked Firecrawl_Scrape tool.</p><h4>Whola! 🎊 You’ve officially built, configured, and deployed your first OpenAI-powered agent in UiPath!</h4><p>Now you know how to combine <strong>AI intelligence</strong> with <strong>UiPath automation</strong> to create something powerful and scalable.</p><p>Keep exploring, keep building, and who knows — your next agent might just change how automation works! ⚙️🤖</p><p>📘 <strong>Reference:</strong></p><p>You can copy the whole Agent from my GitHub page:</p><p><a href="https://github.com/AJYoutube007/UiPathOpenAI_Agents_FireCrawl">GitHub - AJYoutube007/UiPathOpenAI_Agents_FireCrawl: Harness the power of UiPath&#39;s OpenAI Agents SDK, Model Context Protocol (MCP), and Firecrawl to create a production-ready web research agent - deployable directly to UiPath Automation Cloud</a></p><p>Explore the official UiPath LlamaIndex SDK and examples here:</p><p>👉<a href="https://uipath.github.io/uipath-python/openai-agents/quick_start/">https://uipath.github.io/uipath-python/openai-agents/quick_start/</a></p><p>In case of any doubts or if you just want to have a fun conversation, feel free to reach out anytime: <a href="https://www.linkedin.com/in/abhishek-jagtap-314624140/">Abhishek Jagtap on LinkedIn</a></p><p>Best of luck and happy automating! 🤖💫</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=14ede515e6c3" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Control UiPath Automations with Natural Language via MCP and Gemini CLI]]></title>
            <link>https://medium.com/@jagtapabhi13/control-uipath-automations-with-natural-language-via-mcp-and-gemini-cli-3aed40d30d99?source=rss-bb08e175ad9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/3aed40d30d99</guid>
            <category><![CDATA[mcp-server]]></category>
            <category><![CDATA[uipath-automation]]></category>
            <category><![CDATA[mcps]]></category>
            <category><![CDATA[gemini-cli]]></category>
            <category><![CDATA[uipath]]></category>
            <dc:creator><![CDATA[Abhishek Jagtap]]></dc:creator>
            <pubDate>Sun, 08 Feb 2026 11:37:57 GMT</pubDate>
            <atom:updated>2026-02-08T11:37:57.431Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*SbEcA4bVmJUVOPfwDv8_gw.png" /></figure><h3>What is MCP (Model Context Protocol)?</h3><p>MCP (Model Context Protocol) is a standard that allows AI agents to discover and call external tools in a structured and secure way.</p><p>Instead of hard-coding APIs into workflows, MCP lets you:</p><ul><li>Expose functionality as tools</li><li>Let agents decide when and how to use them</li><li>Execute logic outside the agent, but under its control</li></ul><p>In UiPath, an <strong>MCP Server acts as a tool provider</strong> that agents can call during execution.</p><h3>What We Are Building</h3><p>In this tutorial, we will:</p><ol><li>Install <strong>Gemini CLI</strong></li><li>Create a <strong>UiPath MCP Server</strong></li><li>Connect it to Gemini</li><li>Run UiPath robots using <strong>natural language</strong></li></ol><h3>🧰 Prerequisites</h3><p>Before building the MCP server, make sure you have:</p><ul><li><strong>Node.js 18+</strong> installed (for Gemini CLI)</li><li><strong>Gemini CLI</strong> installed and logged in</li><li><strong>Python 3.10+</strong> installed</li><li><strong>UiPath Automation Cloud</strong> account</li><li><strong>UiPath Personal Access Token (PAT)</strong></li></ul><h3>Step 1: Environment Setup &amp; Installing Required Packages</h3><h4>1. Node.js (for Gemini CLI)</h4><ul><li>Install <strong>Node.js version 18 or higher</strong></li><li>Download from:<br> <a href="https://nodejs.org/">https://nodejs.org</a></li><li>Verify installation:</li></ul><figure><img alt="" src="https://cdn-images-1.medium.com/max/415/1*RKU0vc8UepDPMBRj8sbagg.png" /></figure><h4><strong>2. Install Gemini CLI</strong></h4><p>Install the Gemini command-line tool:</p><pre>npm install -g @google/gemini-cli</pre><p><strong>If you want to run Gemini CLI temporarily without installing it globally.</strong></p><pre>npx @google/gemini-cli</pre><p>Running npx @google/gemini-cli starts Gemini CLI without installing it globally. Once the CLI starts, you will see the Gemini welcome screen.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*nbGQfMTXOlmJuoNxE5MQeg.png" /></figure><h4>3. Install Gemini CLI</h4><h4>Environment Setup</h4><p>Let’s start by setting up our development environment. We’ll usepipfor package management. For faster package management, you can use the uv.</p><p># Create project directory e.g. Gemini_MCP i have created</p><p>Inside that we need to create virtual environment</p><pre>python -m venv .venv</pre><p>after virtual environment creation we need to activate the environment</p><pre>.venv\Scripts\Activate.ps1</pre><p>With the virtual environment activated, we’re now ready to install the required dependencies and start building our <strong>MCP Server</strong>.</p><pre>pip install fastmcp requests</pre><h4>4. UiPath Personal Access Token (PAT)</h4><p>Create a <strong>Personal Access Token</strong> from:</p><p>Automation Cloud → User Menu → Preferences → Personal Access Tokens</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UBzJXsTKJ_1vbPqP-exN7Q.png" /></figure><h3>Step 2: Create the MCP Server</h3><p>Open your project folder. In my case, it is <strong>Gemini_MCP</strong>.</p><p>Create a new Python file inside it.<br>You can name it <strong>uipath_server.py</strong> or any name you prefer.</p><p>Your folder will look something like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/274/1*ZVBAe6w_vPXAXSH7ISv34Q.png" /></figure><p>Copy the code from below and paste it into <strong>uipath_server.py</strong>, then save the file.</p><p>Replace these values with your actual UiPath details in Python Script Below</p><pre>ORG_NAME = &quot;Your Org Name&quot;<br>TENANT_NAME = &quot;Your Tenant Name&quot;</pre><pre>import os<br>import requests<br>from fastmcp import FastMCP<br>from typing import Optional, List, Dict<br><br># =========================<br># MCP Server Initialization<br># =========================<br>mcp = FastMCP(&quot;UiPath Manager&quot;)<br><br># =========================<br># UiPath Configuration<br># =========================<br>ORG_NAME = &quot;Your Org Name&quot;<br>TENANT_NAME = &quot;Your Tenent Name&quot;<br>BASE_URL = f&quot;https://cloud.uipath.com/{ORG_NAME}/{TENANT_NAME}/orchestrator_/odata&quot;<br><br><br># =========================<br># Helper: Auth Header<br># =========================<br>def _get_headers(folder_id: Optional[int] = None) -&gt; Dict[str, str]:<br>    token = os.getenv(&quot;UIPATH_PAT&quot;)<br>    if not token:<br>        raise ValueError(&quot;UIPATH_PAT environment variable is not set&quot;)<br><br>    headers = {<br>        &quot;accept&quot;: &quot;application/json&quot;,<br>        &quot;Content-Type&quot;: &quot;application/json&quot;,<br>        &quot;authorization&quot;: f&quot;Bearer {token}&quot;<br>    }<br><br>    if folder_id is not None:<br>        headers[&quot;X-UIPATH-OrganizationUnitId&quot;] = str(folder_id)<br><br>    return headers<br><br><br># =========================<br># MCP Tool: List Processes<br># =========================<br>@mcp.tool()<br>def list_processes() -&gt; List[Dict]:<br>    &quot;&quot;&quot;<br>    Lists all available processes with folder information.<br>    &quot;&quot;&quot;<br>    try:<br>        headers = _get_headers()<br><br>        response = requests.get(<br>            f&quot;{BASE_URL}/Releases&quot;,<br>            headers=headers,<br>            timeout=15<br>        )<br><br>        response.raise_for_status()<br>        releases = response.json().get(&quot;value&quot;, [])<br><br>        return [<br>            {<br>                &quot;Name&quot;: r.get(&quot;Name&quot;),<br>                &quot;ReleaseKey&quot;: r.get(&quot;Key&quot;),<br>                &quot;OrganizationUnitId&quot;: r.get(&quot;OrganizationUnitId&quot;)<br>            }<br>            for r in releases<br>        ]<br><br>    except Exception as e:<br>        return [{&quot;error&quot;: str(e), &quot;type&quot;: type(e).__name__}]<br><br><br># =========================<br># MCP Tool: Run Process<br># =========================<br>@mcp.tool()<br>def run_process(name: str, arguments: Optional[Dict] = None) -&gt; Dict:<br>    &quot;&quot;&quot;<br>    Starts a UiPath process by name.<br>    &quot;&quot;&quot;<br>    try:<br>        # Step 1: Find process<br>        headers = _get_headers()<br><br>        params = {<br>            &quot;$filter&quot;: f&quot;Name eq &#39;{name}&#39;&quot;<br>        }<br><br>        response = requests.get(<br>            f&quot;{BASE_URL}/Releases&quot;,<br>            headers=headers,<br>            params=params,<br>            timeout=15<br>        )<br><br>        response.raise_for_status()<br>        releases = response.json().get(&quot;value&quot;, [])<br><br>        if not releases:<br>            return {&quot;error&quot;: f&quot;Process &#39;{name}&#39; not found&quot;}<br><br>        release = releases[0]<br>        release_key = release.get(&quot;Key&quot;)<br>        folder_id = release.get(&quot;OrganizationUnitId&quot;)<br><br>        if folder_id is None:<br>            return {&quot;error&quot;: &quot;FolderId not found for this process&quot;}<br><br>        # Step 2: Prepare input arguments<br>        input_args = &quot;{}&quot;<br>        if arguments:<br>            input_args = str(arguments).replace(&quot;&#39;&quot;, &#39;&quot;&#39;)<br><br>        body = {<br>            &quot;startInfo&quot;: {<br>                &quot;ReleaseKey&quot;: release_key,<br>                &quot;Strategy&quot;: &quot;ModernJobsCount&quot;,<br>                &quot;JobsCount&quot;: 1,<br>                &quot;InputArguments&quot;: input_args<br>            }<br>        }<br><br>        # Step 3: Start job<br>        start_headers = _get_headers(folder_id)<br><br>        start_response = requests.post(<br>            f&quot;{BASE_URL}/Jobs/UiPath.Server.Configuration.OData.StartJobs&quot;,<br>            headers=start_headers,<br>            json=body,<br>            timeout=15<br>        )<br><br>        start_response.raise_for_status()<br>        result = start_response.json()<br>        jobs = result.get(&quot;value&quot;, [])<br><br>        job_ids = [job.get(&quot;Id&quot;) for job in jobs]<br><br>        return {<br>            &quot;message&quot;: f&quot;Process &#39;{name}&#39; started successfully&quot;,<br>            &quot;FolderId&quot;: folder_id,<br>            &quot;JobIds&quot;: job_ids<br>        }<br><br>    except requests.exceptions.HTTPError as e:<br>        return {<br>            &quot;error&quot;: str(e),<br>            &quot;response&quot;: e.response.text<br>        }<br>    except Exception as e:<br>        return {&quot;error&quot;: str(e), &quot;type&quot;: type(e).__name__}<br><br><br># =========================<br># MCP Tool: Check Job Status<br># =========================<br>@mcp.tool()<br>def check_job_status(job_id: int, folder_id: int) -&gt; Dict:<br>    &quot;&quot;&quot;<br>    Checks the status of a UiPath job.<br>    &quot;&quot;&quot;<br>    try:<br>        headers = _get_headers(folder_id)<br><br>        response = requests.get(<br>            f&quot;{BASE_URL}/Jobs({job_id})&quot;,<br>            headers=headers,<br>            timeout=15<br>        )<br><br>        response.raise_for_status()<br>        job = response.json()<br><br>        return {<br>            &quot;JobId&quot;: job.get(&quot;Id&quot;),<br>            &quot;State&quot;: job.get(&quot;State&quot;),<br>            &quot;StartTime&quot;: job.get(&quot;StartTime&quot;),<br>            &quot;EndTime&quot;: job.get(&quot;EndTime&quot;),<br>            &quot;ReleaseName&quot;: job.get(&quot;ReleaseName&quot;)<br>        }<br><br>    except Exception as e:<br>        return {&quot;error&quot;: str(e), &quot;type&quot;: type(e).__name__}<br><br><br># =========================<br># MCP Entry Point<br># =========================<br>if __name__ == &quot;__main__&quot;:<br>    mcp.run()</pre><p>This Python script creates a <strong>UiPath MCP server</strong> that connects an AI agent to UiPath Orchestrator. It exposes the following tools:</p><ul><li><strong>list_processes</strong> – retrieves all available processes from Orchestrator</li><li><strong>run_process</strong> – starts a process by its name</li><li><strong>check_job_status</strong> – checks the status of a running job</li></ul><p>When you give a natural language command in an AI agent like Gemini CLI, the agent selects the appropriate tool, calls the MCP server, and the server executes the request through the UiPath Orchestrator API.</p><h3>Step 3: Connect MCP Server to Gemini</h3><p>Now our script is ready. Next, we need to add the MCP server to the <strong>Gemini settings file</strong> so the agent can use it.</p><p>Open the Gemini configuration folder:</p><pre>C:\Users\&lt;your-username&gt;\.gemini\settings.json</pre><p>Inside this folder open <strong>settings.json</strong> file</p><pre>{<br>  &quot;hasSeenIdeIntegrationNudge&quot;: true,<br>  &quot;security&quot;: {<br>    &quot;auth&quot;: {<br>      &quot;selectedType&quot;: &quot;oauth-personal&quot;<br>    }<br>  },<br>  &quot;mcpServers&quot;: {<br>    &quot;uipath&quot;: {<br>      &quot;command&quot;: &quot;python&quot;,<br>      &quot;args&quot;: [<br>        &quot;C:\\Gemini_MCP\\uipath_server.py&quot;<br>      ],<br>      &quot;env&quot;: {<br>        &quot;UIPATH_PAT&quot;: &quot;Your Personal Access Token here&quot;<br>      }<br>    }<br>  }<br>}</pre><p>In the <strong>settings.json</strong> you need to replace the args section with:</p><ul><li>the <strong>full path to your Python MCP server file</strong></li><li>the <strong>access token</strong> as the argument</li></ul><h3>Step 4: Test with Natural Language Inside Gemini CLI</h3><p>Go to your terminal</p><p>You already have the Gemini CLI installed. Type</p><pre>gemini</pre><p>Inside the Gemini CLI, check the connected MCP tools:</p><pre>/mcp list</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*k1rmjvZqNmvsFYYcEgR8fQ.gif" /></figure><p>You will see</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/430/1*FTOI5x_uqLlD813iiAdV5Q.png" /></figure><p>Now the tool is available, you can ask in natural language to check what processes are available.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*dgSZp5LFepRymr2Lbk2oFQ.gif" /></figure><p>You will see all the processes which are available</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/795/1*n7IfMmZqZNYDFVsV8UwoKQ.png" /></figure><p>Now you can simply run any process you want using a natural language prompt. i will run the Extract.Bank.Statements</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*48At72Fmx-TFNEXeeQuNNg.gif" /></figure><p>after the run successfully started you will see Job ID</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*FA__cK8Kq5hEz6nwPweVmQ.png" /></figure><p>You can check the status of the process</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uvZeU0iKU7mXf2M_2q7Z7A.gif" /></figure><p>You can see the status, In my case it got suspended as this is action center process</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*O_PPe1WlCT8nKr6jFRZQIw.png" /></figure><p>I hope you enjoyed building this as much as I did.</p><p>This simple setup shows how you can connect UiPath with an MCP server and control your automations directly from the Gemini CLI using natural language. With just a few configuration steps, you can start processes, check their status, and interact with your robots without writing complex scripts. This approach opens the door to more agentic and conversational automation experiences using UiPath.</p><p>📘 <strong>Reference:</strong></p><ul><li><a href="https://geminicli.com/docs/get-started/">Get started with Gemini CLI</a></li><li><a href="https://docs.uipath.com/orchestrator/automation-cloud/latest/api-GuidE/introduction">Orchestrator - Introduction</a></li></ul><p>You can get the full code here-</p><p><a href="https://github.com/AJYoutube007/uipath-mcp-gemini-cli">GitHub - AJYoutube007/uipath-mcp-gemini-cli</a></p><p>In case of any doubts or if you just want to have a fun conversation, feel free to reach out anytime: <a href="https://www.linkedin.com/in/abhishek-jagtap-314624140/">Abhishek Jagtap on LinkedIn</a></p><p>Best of luck and happy automating! 🤖💫</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=3aed40d30d99" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Build a UiPath-Coded MCP Server That Automatically Generates Memes with Imgflip API]]></title>
            <link>https://medium.com/@jagtapabhi13/create-memes-with-a-fully-coded-mcp-server-in-uipath-using-the-imgflip-api-b3d09dc5616c?source=rss-bb08e175ad9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/b3d09dc5616c</guid>
            <category><![CDATA[memes]]></category>
            <category><![CDATA[uipath]]></category>
            <category><![CDATA[mcp-server]]></category>
            <category><![CDATA[uipath-automation]]></category>
            <category><![CDATA[uipath-training]]></category>
            <dc:creator><![CDATA[Abhishek Jagtap]]></dc:creator>
            <pubDate>Sun, 25 Jan 2026 09:51:47 GMT</pubDate>
            <atom:updated>2026-01-25T12:24:05.979Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YFfAQ9ziisMEjSnqk9XnvQ.png" /></figure><h3>What is MCP (Model Context Protocol)?</h3><p><strong>MCP (Model Context Protocol)</strong> is a standard that allows <strong>AI agents to discover and call external tools</strong> in a structured, secure, and runtime-managed way.</p><p>Instead of hard-coding APIs into workflows, MCP lets you:</p><ul><li>Expose functionality as <strong>tools</strong></li><li>Let agents <strong>decide when and how</strong> to use them</li><li>Execute logic <strong>outside the agent</strong>, but under its control</li></ul><p>In UiPath, an MCP Server acts as a <strong>tool provider</strong> for agents.</p><h3>What We Are Building in This Tutorial</h3><p>In this tutorial, we are building a <strong>UiPath Coded MCP Server</strong> that acts as a <strong>Meme Generator service</strong> powered by the Imgflip API.</p><p>This MCP Server exposes meme-related capabilities as <strong>agent-callable tools</strong>, allowing UiPath Agents to:</p><ul><li>Discover popular meme templates</li><li>Select an appropriate template</li><li>Generate a captioned meme dynamically</li></ul><p>All of this happens through <strong>agent reasoning</strong>, not hard-coded workflows.</p><h3>🧰 Prerequisites</h3><p>Before building the MCP server, make sure you have:</p><p>🐍 <strong>Python 3.10 or higher</strong></p><p>🤖 <strong>UiPath Automation Cloud / Orchestrator account</strong></p><p>🔗 <strong>Basic understanding of UiPath Agents and MCP (Model Context Protocol)</strong></p><h3>Step 1: Environment Setup &amp; <strong>Installing Required Packages</strong></h3><p>Let’s start by setting up our development environment. We’ll usepipfor package management. For faster package management, you can use the uv.</p><p># Create project directory e.g. Meme_MCP_2 i have created</p><p>Inside that we need to create virtual environment</p><pre>python -m venv .venv</pre><p>after virtual environment creation we need to activate the environment</p><pre>.venv\Scripts\Activate.ps1</pre><p>With the virtual environment activated, we’re now ready to install the required dependencies and start building our <strong>Coded MCP Server</strong>.</p><p>First, upgrade pip to the latest version and install the <strong>UiPath MCP package</strong>, which provides the tools needed to create and run an MCP server</p><pre># Upgrade pip<br>python -m pip install --upgrade pip<br># Install packages<br>pip install uipath-mcp<br>pip install requests</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uG3mF39DbGNEvf4c0WHBuA.png" /></figure><p><strong>Step 2: Create Your Agent with the CLI</strong></p><p>UiPath provides a convenient CLI command to create a new MCP Server:</p><p>Run the following command:</p><pre>uipath new meme-server007 </pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/826/1*DeUstULWKLLK8uLUNYLQ4w.png" /></figure><p>UiPath scaffolds a new <strong>Coded MCP Server project</strong> and generates the following files:</p><p>1. server.pyA sample MCP math server using FastMCP</p><p>2. mcp.jsonConfiguration file needed for coded UiPath MCP Servers.</p><p>3. pyproject.tomlProject metadata and dependencies as per PEP 518.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*COB5SOUwGfThCInit4rfuw.png" /></figure><p>If you open the <strong>server.py</strong> file, you’ll notice that UiPath provides a sample MCP server implementation by default. This sample uses FastMCP to perform basic math operations.</p><p>For this tutorial, we won’t be using that example. You can safely delete the entire sample code from <strong>server.py</strong> and replace it with the custom implementation provided in the next section.</p><p>We’ll be building our own <strong>Meme Generator MCP Server</strong>, which allows you to fetch meme templates from Imgflip and generate custom memes with captions directly via our MCP server.</p><pre>import os<br>import requests<br>from mcp.server.fastmcp import FastMCP<br><br># Read Imgflip credentials from environment variables<br>IMGFLIP_USERNAME = os.getenv(&quot;IMGFLIP_USERNAME&quot;)<br>IMGFLIP_PASSWORD = os.getenv(&quot;IMGFLIP_PASSWORD&quot;)<br><br>mcp = FastMCP(<br>    name=&quot;meme-server&quot;<br>)<br><br># -------------------------<br># TOOL 1: Get memes<br># -------------------------<br>@mcp.tool()<br>def get_memes(limit: int = 10) -&gt; dict:<br>    &quot;&quot;&quot;<br>    Get trending meme templates from Imgflip<br>    &quot;&quot;&quot;<br><br>    url = &quot;https://api.imgflip.com/get_memes&quot;<br>    response = requests.get(url, timeout=30)<br>    data = response.json()<br><br>    if not data.get(&quot;success&quot;):<br>        return {<br>            &quot;success&quot;: False,<br>            &quot;error_message&quot;: &quot;Failed to fetch memes&quot;<br>        }<br><br>    memes = data[&quot;data&quot;][&quot;memes&quot;][:limit]<br><br>    return {<br>        &quot;success&quot;: True,<br>        &quot;count&quot;: len(memes),<br>        &quot;memes&quot;: memes<br>    }<br><br><br># -------------------------<br># TOOL 2: Caption image<br># -------------------------<br>@mcp.tool()<br>def caption_image(<br>    template_id: str,<br>    text0: str = &quot;&quot;,<br>    text1: str = &quot;&quot;<br>) -&gt; dict:<br>    &quot;&quot;&quot;<br>    Create a meme using Imgflip caption_image API<br>    &quot;&quot;&quot;<br><br>    if not IMGFLIP_USERNAME or not IMGFLIP_PASSWORD:<br>        return {<br>            &quot;success&quot;: False,<br>            &quot;error_message&quot;: &quot;IMGFLIP_USERNAME or IMGFLIP_PASSWORD not set&quot;<br>        }<br><br>    url = &quot;https://api.imgflip.com/caption_image&quot;<br><br>    payload = {<br>        &quot;template_id&quot;: template_id,<br>        &quot;username&quot;: IMGFLIP_USERNAME,<br>        &quot;password&quot;: IMGFLIP_PASSWORD,<br>        &quot;text0&quot;: text0,<br>        &quot;text1&quot;: text1<br>    }<br><br>    response = requests.post(url, data=payload, timeout=30)<br>    data = response.json()<br><br>    if not data.get(&quot;success&quot;):<br>        return {<br>            &quot;success&quot;: False,<br>            &quot;error_message&quot;: data.get(&quot;error_message&quot;, &quot;Unknown error&quot;)<br>        }<br><br>    return {<br>        &quot;success&quot;: True,<br>        &quot;url&quot;: data[&quot;data&quot;][&quot;url&quot;],<br>        &quot;page_url&quot;: data[&quot;data&quot;][&quot;page_url&quot;]<br>    }<br><br><br>if __name__ == &quot;__main__&quot;:<br>    mcp.run()</pre><p><strong>Step 3: Copy the code above and paste it into </strong><strong>server.py</strong></p><p>This server exposes two tools:</p><ul><li>get_memes → fetch meme templates</li><li>caption_image → generate a captioned meme</li></ul><p>This is a fun example, but the same architecture applies to <strong>real enterprise APIs</strong>.</p><p><strong>Step 4: Initialize the UiPath Project</strong></p><p>Set up your UiPath configuration files by running:</p><pre>uipath init</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/575/1*4pD4trRtGiHuEFMHjtj-4g.png" /></figure><p>creates the core files needed for a <strong>UiPath Coded MCP Server</strong>.</p><p>It generated following files</p><p><strong>.env</strong>Local environment variables &amp; secrets. <strong>Not packaged or published</strong>.</p><p><strong>uipath.json</strong>Defines tool bindings and input/output schemas used by UiPath Agents.</p><p><strong>Step 5: Get imgflip API Credentials</strong></p><p>Go to <a href="https://imgflip.com/api"><strong>https://imgflip.com/api</strong></a>, create an account, and note down your <strong>username</strong> and <strong>password</strong>. These credentials are required to call the Imgflip API for meme generation.</p><p><strong>Step 6: Authenticate with UiPath</strong></p><p>Before running your MCP Server locally, you need to <strong>authenticate</strong> with UiPath.<br>The easiest way is through the <strong>CLI authentication command</strong>:</p><pre>Uipath Auth </pre><h3>⚙️ What happens when you run this:</h3><ol><li>🌐 <strong>Browser Opens</strong> — Your default browser launches the <strong>UiPath Cloud Platform</strong>.</li><li>🔑 <strong>Login</strong> — Sign in with your UiPath credentials.</li><li>✅ <strong>Grant Access</strong> — Authorize the CLI to access your UiPath account.</li><li>⚡ <strong>Auto-Configuration</strong> — The CLI automatically generates or updates your .env file with:</li></ol><ul><li>UIPATH_URL → Your organization and tenant URL</li><li>UIPATH_ACCESS_TOKEN → Secure access token</li><li>UIPATH_TENANT_ID</li><li>UIPATH_ORGANIZATION_ID</li></ul><h4><strong>Step 7: Update .env file</strong></h4><p>Add the <strong>Imgflip API credentials</strong> to the .env file <strong>only when running the MCP server locally</strong>.</p><h4>📍 For Local / On-Prem Execution:</h4><p>When running locally:</p><ul><li>JSON-RPC requests are securely <strong>tunneled from UiPath servers to your local MCP server</strong></li><li>On startup, the local server <strong>automatically registers itself with UiPath</strong></li><li>MCP servers are <strong>folder-scoped</strong> in Orchestrator</li></ul><p>Because of this, you must define the <strong>UiPath folder context</strong> explicitly.</p><p>Since MCP servers are folder-scoped in Orchestrator, you need to set the UIPATH_FOLDER_PATH environment variable. To do this:</p><ol><li>Copy the folder path from your Orchestrator interface &amp; Add it to the .env file</li></ol><pre>IMGFLIP_USERNAME=your_username<br>IMGFLIP_PASSWORD=your_password<br>UIPATH_FOLDER_PATH=Shared/MyFolder</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/629/1*rh65ZugmKzXjMNDpplzF3w.png" /></figure><p>Your .env file will look like this</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/610/1*7d6W70oiIaX8DV8iWyqXXQ.png" /></figure><p><strong>Update </strong><strong>pyproject.toml file</strong></p><p>Before publishing the project to <strong>UiPath Orchestrator</strong>, we need to update the dependencies in the <strong>pyproject.toml</strong> file to ensure all required packages are included.</p><pre>[project]<br>name = &quot;meme-server007&quot;<br>version = &quot;0.0.1&quot;<br>description = &quot;Description for meme-server007 project&quot;<br>authors = [{ name = &quot;Your Name&quot;, email = &quot;Your Email Address&quot; }]<br>dependencies = [<br>    &quot;uipath-mcp&gt;=0.0.106&quot;,<br>    &quot;requests&gt;=2.31.0&quot;,<br>    &quot;python-dotenv&gt;=1.0.0&quot;<br>]<br>requires-python = &quot;&gt;=3.11&quot;</pre><h4><strong>Step 8: To Run the server locally</strong></h4><pre>uipath run meme-server007</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*2_KMq8Oocmu52MtVjuoJvw.png" /></figure><p>If the process runs successfully, and you’ve provided the folder path of <strong>My Workspace</strong>, you can navigate to <strong>My Workspace → MCP Servers</strong> to see the hosted server. The server type will be displayed as <strong>Self-Hosted</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*G-0hhHEtqBdCmF9kZ-tmcQ.png" /></figure><h3>Verify MCP Server in Orchestrator</h3><p>If the server starts successfully with <strong>My Workspace</strong> as the folder path:</p><ol><li>Go to <strong>Orchestrator → My Workspace → MCP Servers</strong></li><li>You’ll see the server listed (e.g., meme-server)</li></ol><h3>✔ What You’ll See</h3><ul><li><strong>Type</strong>: Self Hosted</li><li><strong>Status</strong>: Active</li><li><strong>View tools</strong> shows all exposed MCP tools</li></ul><p>This confirms the MCP server is registered and ready for agent use.</p><h4><strong>Step 9: Package and Publish Your MCP Server</strong></h4><p>After completing local testing and finalizing your <strong>UiPath Coded MCP Server</strong>, package it for deployment to <strong>UiPath Automation Cloud</strong>.</p><pre>uipath pack</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/728/1*I0UcMAYcynnMEmlbe5xjZQ.png" /></figure><p>After packaging the MCP server, publish it to <strong>My Workspace</strong> using:</p><pre>uipath publish --my-workspace</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*5HHtLrFFK5_33C4nQBuQ8g.png" /></figure><p><strong>Click the Process Configuration link</strong> shown in the terminal</p><p>You’ll be redirected to <strong>Orchestrator → Process configuration</strong></p><p>In <strong>Environment Configuration</strong>, add the required values:</p><ul><li>IMGFLIP_USERNAME</li><li>IMGFLIP_PASSWORD</li></ul><p>Save the configuration</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*8qmtsuc643Rur4nzxu7jlg.png" /></figure><p>You can see in the processes</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*VbxIA7EZe6M1XZ7dMecYLA.png" /></figure><h4><strong>Step 10: Add the MCP Server in Orchestrator</strong></h4><ol><li>Go to <strong>Orchestrator → My Workspace → MCP Servers</strong></li><li>Click <strong>Add MCP Server</strong></li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*LT2GJPC-fvEgOC6wNuZzXg.png" /></figure><p>Select <strong>Coded</strong></p><ol><li>Enter the <strong>MCP Server name</strong></li><li>Select the published <strong>Process (MCP Server)</strong></li><li>Click <strong>Add</strong></li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*k1igzv-p65lM_sR12Owrsg.png" /></figure><p>After adding the server, you can check the server &amp; tools</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*KXsA3J-73Gi38-9hwa9X4w.png" /></figure><h3>✅ MCP Server Ready for Use</h3><p>As you can see:</p><ul><li>The MCP server is <strong>Active</strong></li><li>All exposed <strong>tools</strong> (get_memes, caption_image) are listed and available</li></ul><p>This means the MCP server can now be used in:</p><ul><li><strong>Coded Agents</strong></li><li><strong>UiPath Agents</strong></li><li><strong>Agentic workflows</strong></li></ul><p>Next, let’s see <strong>how an agent actually uses this MCP server in action</strong>.</p><p><strong>Step 11: Go to UiPath Cloud Studio &amp; Select Agent</strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7UpEw0duBm_QzzVtbxaOfw.png" /></figure><p>We need to attach our MCP server as a tool to our agent. Click on the Tool Select MCP Server</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/456/1*rrKyh-NT3PoKD-OkJBLuHQ.png" /></figure><p>Select your MCP Name in my case it is meme_server007 &amp; i can see 2 tools inside it get_memes &amp; Caption_image</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*rKrp11SlYUxyzC3UQs2UHg.png" /></figure><p>now click on the agent &amp; update this system prompt:</p><pre>You are a meme assistant.<br><br><br>Rules you must strictly follow:<br>1. If the user asks to create or caption a meme, you MUST first call the `get_memes` tool.<br>2. From the returned templates, choose the most appropriate meme template based on the meaning of the user request.<br>3. After selecting a template, call the `caption_image` tool with:<br>   - template_id<br>   - text0 (top text)<br>   - text1 (bottom text)<br>4. Do NOT ask the user for a template ID.<br>5. Do NOT expose tool calls, credentials, or internal reasoning.<br>6. Return only the final meme image URL to the user.</pre><p>&amp; User Prompt: You can cutomize as per your requirment</p><pre>Create a meme about MCP finally working after many redeployments</pre><p>it will look like this</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*s38dfygjJOMIoSErZEvdeA.png" /></figure><h3>What the Agent Does</h3><ol><li>Reads the <strong>user prompt</strong></li><li>Calls the get_memes tool to fetch meme templates</li><li>Selects the most relevant template automatically</li><li>Calls the caption_image tool with:</li></ol><ul><li>template_id</li><li>text0 (top text)</li><li>text1 (bottom text)</li></ul><p>5. Returns <strong>only the final meme image URL</strong></p><p>You can see the output</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*PVvt6E_vArxgVl7WPU-bMQ.png" /></figure><p>when you click on the output link you can see the meme</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/765/1*dWrFRIdlpaia1mLHuBt2sQ.png" /></figure><p>This was a <strong>simple agent built purely for demo purposes</strong>, but the possibilities don’t stop here. You can easily extend this further to <strong>send the generated meme via email</strong>, <strong>share it directly on WhatsApp</strong>, or plug it into any downstream automation.</p><p>The goal of this demo was to show how <strong>UiPath MCP Servers and Agents work together</strong> — from exposing tools, to agent orchestration, to delivering real outcomes with minimal setup.</p><p>I hope you enjoyed building this as much as I did.<br>Happy automating 🚀</p><p>📘 <strong>Reference:</strong></p><p><a href="https://uipath.github.io/uipath-python/mcp/quick_start/">Getting Started - UiPath SDK</a></p><p>You can get the full code here-</p><p><a href="https://github.com/AJYoutube007/MCP_Meme_Generator">https://github.com/AJYoutube007/MCP_Meme_Generator</a></p><p>🎥 <strong>YouTube tutorial of this:-</strong></p><p><a href="https://youtu.be/GzE5WGVkl0s?si=-WpvNtl-auiAKhQL">https://youtu.be/GzE5WGVkl0s?si=-WpvNtl-auiAKhQL</a></p><p>In case of any doubts or if you just want to have a fun conversation, feel free to reach out anytime: <a href="https://www.linkedin.com/in/abhishek-jagtap-314624140/">Abhishek Jagtap on LinkedIn</a></p><p>Best of luck and happy automating! 🤖💫</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b3d09dc5616c" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Building Custom UiPath Connectors Using Connector Builder — NewsAPI Example⭐]]></title>
            <link>https://medium.com/@jagtapabhi13/building-custom-uipath-connectors-using-connector-builder-newsapi-example-87b1e904201b?source=rss-bb08e175ad9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/87b1e904201b</guid>
            <category><![CDATA[uipath-training]]></category>
            <category><![CDATA[connectorbuilder]]></category>
            <category><![CDATA[uipath]]></category>
            <category><![CDATA[uipath-automation]]></category>
            <category><![CDATA[connector]]></category>
            <dc:creator><![CDATA[Abhishek Jagtap]]></dc:creator>
            <pubDate>Wed, 14 Jan 2026 15:43:13 GMT</pubDate>
            <atom:updated>2026-01-14T15:43:13.515Z</atom:updated>
            <content:encoded><![CDATA[<h3>Building Custom UiPath Connectors Using Connector Builder — NewsAPI Example⭐</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/955/1*FrisSGowT7BLwLaDnElLug.png" /></figure><p>UiPath Integration Service makes it easy to consume external APIs without writing custom HTTP logic in every automation. Using <strong>Connector Builder</strong>, you can visually define authentication, operations, inputs, and outputs — and expose them as reusable activities across UiPath Studio and Automation Cloud.</p><p>In this article, we’ll build a <strong>custom connector for the NewsAPI </strong><strong>/v2/top-headlines endpoint</strong> using <strong>UiPath Connector Builder</strong>, following the same design principles as the official UiPath documentation—but tailored specifically for <strong>NewsAPI</strong>.</p><h4>🧾 Prerequisites</h4><p>Before starting, ensure you have:</p><p>✔ UiPath Automation Cloud access<br>✔ Integration Service enabled<br>✔ Permission to use <strong>Connector Builder</strong><br>✔ A <strong>NewsAPI API Key</strong> from <a href="https://newsapi.org/">https://newsapi.org</a><br>✔ Basic understanding of REST APIs and JSON</p><h3>Step 1: Create a New Connector</h3><ol><li>Go to <strong>Automation Cloud</strong></li><li>Navigate to <strong>Integration Service → Connectors</strong></li><li>Click <strong>Build a Connector</strong></li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/639/1*Jatj_sJxIxuB-6h1rQEq7Q.png" /></figure><p>Click on the Create new connector</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/532/1*xngN6fbetiK-q02R1c2SSg.png" /></figure><p>Before we start building the connector, head over to <a href="https://newsapi.org/"><strong>https://newsapi.org</strong></a>.<br>NewsAPI is a free news API platform that allows you to access articles and breaking news headlines from thousands of news sources and blogs across the web.</p><p>To use the API, you’ll need to <strong>create an account on the website and generate your API key</strong>, which will be required later while configuring authentication in UiPath Connector Builder.</p><p>When building a custom connector in UiPath, you have <strong>two options</strong>:</p><ul><li><strong>Start from an API definition</strong> — Import a Postman or Swagger/OpenAPI file, either from a local file or a public URL. (From a URL — Enter a file URL, such as <a href="https://petstore.swagger.io/v2/swagger.json">https://petstore.swagger.io/v2/swagger.json</a>.)Connector Builder uses this definition to auto-generate most of the connector configuration.</li><li><strong>Start from blank</strong>— Manually configure authentication, operations, and schemas.</li></ul><h4><strong>Step 2: Set Up the Connector Basics:</strong></h4><p>👉 <strong>In this tutorial, we’ll start from blank </strong>to understand the connector setup step by step.</p><p>On the <strong>Create new connector</strong> screen, select <strong>Start from blank</strong> to begin with an empty canvas.</p><p>Provide the basic connector details:</p><p><strong>Name:</strong> NewsAPI.Org</p><p><strong>Description:</strong> Locate articles and breaking news headlines from news sources across the web</p><p><strong>Icon:</strong> Upload a suitable icon (for example, NewsAPI.png) to make the connector easily recognizable in Integration Service and Studio.</p><p>Once these details are filled in, proceed to configure authentication and operations for the connector.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*BqGZ9XPNNG87E53AQ3yY4Q.png" /></figure><h4>Step 3: Configure the Base API</h4><p>In the <strong>Base API</strong> tab, set the <strong>Base URL</strong> to:</p><pre>https://newsapi.org</pre><p>Since NewsAPI does not specify a default pagination strategy, keep the <strong>Pagination type</strong> set to <strong>None</strong> and leave the remaining values as default.<br>Ensure both <strong>Content-Type</strong> and <strong>Accept</strong> headers are set to application/json.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*NL5eXJl9bDCFASLH18Xc6g.png" /></figure><h4>Step 4: Configure Authentication</h4><p>Navigate to the <strong>Authentication</strong> tab and select <strong>API Key</strong> as the authentication type from the dropdown.<br> Set <strong>Ask the user</strong> to <strong>Yes</strong> for the API key so users are prompted to provide their NewsAPI key when creating a connection.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*NSUirtCGFM2Y55aeOQrqPA.png" /></figure><h4>Step 5: Configure the Response Schema</h4><p>After configuring authentication the next step is to perform and validate the actual API calls.</p><ol><li>From the left-side panel, navigate to <strong>Activity→ Create new resource </strong>to begin defining the API operations.</li></ol><figure><img alt="" src="https://cdn-images-1.medium.com/max/373/1*UIakuuYEPIfKxQIK1vCGtA.png" /></figure><p>After clicking <strong>Create new resource</strong>, a pop-up window appears showing the <strong>Base URL</strong>.<br>In the <strong>Path</strong> field, add the API endpoint for fetching top headlines. For this connector, use:</p><pre>/v2/top-headlines?country={country}&amp;apiKey={apiKey}</pre><p>Provide a meaningful name such as <strong>Top Headlines</strong> and select <strong>List All Records (GET)</strong> as the method.<br>This defines the GET operation that will retrieve top news headlines from NewsAPI.</p><p><strong><em>This API endpoint returns a response in JSON format, containing a list of top headline articles with details such as the title, description, source, URL, and published time.</em></strong></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/798/1*UIr9LyQ9xDIiu7nxLeOeGg.png" /></figure><p>Once the resource is created, your request will look like this.<br>You’ll see the <strong>Top Headlines</strong> endpoint along with the parameters extracted from the URL. The <strong>apiKey</strong> and <strong>country</strong> parameters are automatically detected and listed, making them available as inputs for the activity.</p><p>This makes it easy to pass different values at runtime when using the connector in UiPath Studio.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*Rkxo4PYpmMz22HEnIJ8bFw.png" /></figure><h4>Step 6: Establish A Connection</h4><p>Before you can start fetching data, you need to <strong>establish a connection</strong>. Click on the <strong>Not connected</strong> dropdown and select <strong>Add connection</strong>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/400/1*TGJZIJe3NPf8DKSAXTCX6g.png" /></figure><p>It will open another tab where we can need to add our API key from the newsapi.org</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/787/1*P74IyNLh2g_IF9o0Xxa5OA.png" /></figure><p>Once the connection is successfully established, you can invoke the API by clicking the <strong>Send Request</strong> button.</p><h4>Step 7: Test API calls</h4><p>Before sending the request, make sure to provide your <strong>API key</strong> and specify the <strong>country name</strong> for which you want to fetch the top news. Once these details are added, triggering the request will return the latest headlines for the selected country.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/573/1*CvnOrRxi5NVWfrKRPyE3Iw.png" /></figure><p>After executing the request, the API response is displayed in the <strong>Response</strong> panel. This section shows the complete output returned by the service, allowing you to verify the status, inspect the response body, and analyze the data retrieved from the API.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*aEs4XkfQDy8AGPfC4Wds1w.png" /></figure><p>🎉 <strong>Voilà! You’ve successfully built your connector.</strong></p><h4>Step 8: Publish You Connector</h4><p>The final step is to <strong>publish</strong> it. Click <strong>Publish</strong> to make the connector available in your tenant. Once published, the connector will appear in the list of connectors featured in your tenant and can be used across your automations.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/491/1*RV_xD4KkoW2NCu_MwKba4w.png" /></figure><p>After clicking <strong>Publish</strong>, a <strong>Publish Connector</strong> window appears.</p><p>In this window, provide the <strong>Documentation URL</strong> (for example, the official API documentation link) and add a brief <strong>description</strong> explaining the purpose of the connector. You can also choose to include the <strong>HTTP Request activity</strong> and enable the <strong>Data Mapper</strong>, based on your integration needs.</p><p>Once all the details are filled in, click <strong>Publish</strong> to complete the process. The publishing may take a few minutes, after which the connector becomes available in your tenant. I have added the documentation for the newsapi.org (<a href="https://newsapi.org/docs">https://newsapi.org/docs</a>)</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/623/1*ntMzuF5N61DTm9fvreNsZA.png" /></figure><p>Once the publishing process is complete, the <strong>NewsAPI.org</strong> connector becomes active. You can now see it listed under <strong>Connectors</strong> in your tenant.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*mfu3JWD6FXPD7L9yRbF7Eg.png" /></figure><p>With the connector successfully published, you can now use it in <strong>UiPath Studio Web</strong> as well as <strong>UiPath Studio (Desktop)</strong>.</p><h4>Step 9: Use the Connector in UiPath Studio</h4><p>The <strong>NewsAPI.org</strong> connector appears in the <strong>Activities</strong> panel, where you can directly drag and drop activities such as <strong>List All Records</strong> or <strong>HTTP Request</strong> into your workflow. By providing the required inputs like the <strong>API key</strong> and <strong>country</strong>, you can fetch top headlines and seamlessly work with the response data — log article titles, iterate through results, or integrate them into downstream automation logic.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*0WoKeHCZli4nBahOTeOlow.png" /></figure><p>here <strong>Output</strong> panel displays the result of iterating through all the articles returned by the API.</p><p>Using a <strong>For Each</strong> activity, the workflow loops through the list of articles and logs each article’s <strong>title</strong> individually.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*X_9frRxLb84CV7kImGFIMg.png" /></figure><p>✅ Final Thoughts</p><p>Using <strong>UiPath Connector Builder</strong>, you can convert a simple REST API into a fully reusable, enterprise-ready connector. The <strong>NewsAPI Top Headlines</strong> connector is a great example of how external data can be brought into automations without cluttering workflows with raw HTTP logic, and instead exposed as <strong>clean, reusable activities that work seamlessly in Studio Web and Studio Desktop</strong>.</p><p>Once published, the connector becomes a shared asset across teams and projects — making automations cleaner, smarter, and much easier to maintain.</p><p>Keep exploring, keep building, and who knows — your next <strong>connector</strong> might just change how automation works! ⚙️🤖</p><p>📘 <strong>Reference:</strong></p><ul><li>NewsAPI Documentation: <a href="https://newsapi.org/docs">https://newsapi.org/docs</a></li><li>UiPath Connector Builder Documentation: <a href="https://docs.uipath.com/integration-service/automation-cloud/latest/user-guide/connector-builder-about">https://docs.uipath.com/integration-service/docs/connector-builder-overview</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=87b1e904201b" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Building a Webpage Summarizer Coded Agent in UiPath Using LlamaIndex and Google Gemini ]]></title>
            <link>https://medium.com/@jagtapabhi13/building-a-webpage-summarizer-coded-agent-in-uipath-using-llamaindex-and-google-gemini-86f39f48fc39?source=rss-bb08e175ad9b------2</link>
            <guid isPermaLink="false">https://medium.com/p/86f39f48fc39</guid>
            <category><![CDATA[uipath-coded-agent]]></category>
            <category><![CDATA[llamaindex]]></category>
            <category><![CDATA[uipath]]></category>
            <category><![CDATA[uipath-community]]></category>
            <category><![CDATA[uipath-training]]></category>
            <dc:creator><![CDATA[Abhishek Jagtap]]></dc:creator>
            <pubDate>Thu, 01 Jan 2026 07:43:50 GMT</pubDate>
            <atom:updated>2026-01-01T07:43:50.789Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*X_4_qm1i9Yb7WD8jHSl3tg.png" /></figure><p>In an era of information overload, quickly extracting key insights from web pages has become critical for modern business automation. Teams constantly sift through documentation, knowledge bases, and external websites — spending valuable time reading instead of acting.</p><p>But what if your <strong>UiPath automations could read any webpage and deliver a concise summary in seconds?</strong></p><p>In this tutorial, we’ll build exactly that — a <strong>Webpage Summarizer Coded Agent</strong> powered by <strong>LlamaIndex workflows</strong> and <strong>Google Gemini</strong>, fully integrated into <strong>UiPath’s Coded Automation framework</strong>.</p><p>This guide is <strong>beginner-friendly</strong>. Even if you’re new to UiPath Coded Agents, Python-based automations, or LlamaIndex, you’ll be able to follow along step by step and understand not just <em>how</em> it works, but <em>why</em> each component is used.</p><h3>🧰 Prerequisites</h3><p>Before coding, make sure you have:</p><ul><li>🐍 <strong>Python 3.10+</strong></li><li>🤖 <strong>UiPath Automation Cloud / Orchestrator</strong> account</li><li>🧬 Basic familiarity with <strong>LlamaIndex &amp; Google Gemini</strong></li></ul><h3>Step 1: Environment Setup</h3><p>Let’s start by setting up our development environment. We’ll usepipfor package management. For faster package management, you can use the uv.</p><p># Create project directory e.g. Llamaindex_WebPageSummarization i have created</p><p>Inside that we need to create virtual environment</p><pre>python -m venv .venv</pre><p>after virtual environment creation we need to activate the environment</p><pre>.venv\Scripts\Activate.ps1</pre><p>After activation your screen will look like this:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*e-pMN1eNs3ok-JUY5ctLMg.png" /></figure><p><strong>Step 2: Installing Required Packages</strong></p><p>With the environment activated, we’re now ready to install the dependencies and start building our llamaindex based UiPath agent. Upgrade the pip &amp; install the uipath llamaindex package.</p><pre># Upgrade pip<br>python -m pip install --upgrade pip<br># Install packages<br>pip install uipath-llamaindex</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*IdAYDkJU7G2wxG9lFKn_8g.png" /></figure><p><strong>Step 3: Create Your Agent with the CLI</strong></p><p>UiPath provides a convenient CLI command to create a new agent:</p><p>Run the following command:</p><pre>uipath new your_agent_name</pre><p>here i have given webpage_Summarizer as the name of our llamaindex agent</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*NVybS351-0Ek_gpMMyE6fQ.png" /></figure><p>This will create these files inside your folder</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/470/1*BzyXJZrqDz5tFLxaqOCp1g.png" /></figure><p>If you open the main.py file, you’ll notice that UiPath provides a sample implementation by default. This sample uses an <strong>OpenAI API key</strong> to generate a joke on a given topic and then critiques it.</p><p>For this tutorial, we won’t be using that example. You can <strong>safely delete the entire sample code</strong> from main.py and replace it with the custom implementation provided in the next section.</p><p>We’ll be building our own <strong>Webpage Summarizer Coded Agent</strong>, tailored specifically for this use case.</p><pre># main.py<br>import os<br>from dotenv import load_dotenv<br><br>from llama_index.core.workflow import (<br>    Workflow,<br>    step,<br>    StartEvent,<br>    StopEvent,<br>    Event,<br>)<br>from llama_index.readers.web import SimpleWebPageReader<br>from google import genai<br><br># ---------------------------<br># Load env vars<br># ---------------------------<br>load_dotenv()<br>GEMINI_API_KEY = os.getenv(&quot;GEMINI_API_KEY&quot;)<br>if not GEMINI_API_KEY:<br>    raise EnvironmentError(&quot;GEMINI_API_KEY not found in .env&quot;)<br><br># ---------------------------<br># Events<br># ---------------------------<br>class UrlEvent(StartEvent):<br>    url: str<br><br>class PageContentEvent(Event):<br>    url: str<br>    content: str<br><br>class SummaryEvent(StopEvent):<br>    url: str<br>    summary: str<br><br># ---------------------------<br># Workflow<br># ---------------------------<br>class UrlSummarizerWorkflow(Workflow):<br><br>    @step<br>    async def load_page(self, ev: UrlEvent) -&gt; PageContentEvent:<br>        reader = SimpleWebPageReader()<br>        documents = reader.load_data([ev.url])<br><br>        # Combine all document text<br>        content = &quot;\n&quot;.join(doc.text for doc in documents)<br><br>        # Keep within free-tier limits<br>        content = content[:6000]<br><br>        return PageContentEvent(url=ev.url, content=content)<br><br>    @step<br>    async def summarize(self, ev: PageContentEvent) -&gt; SummaryEvent:<br>        client = genai.Client(api_key=GEMINI_API_KEY)<br><br>        prompt = f&quot;&quot;&quot;<br>        Summarize the following webpage content in concise bullet points.<br>        Focus on key ideas and avoid repetition.<br><br>        CONTENT:<br>        {ev.content}<br>        &quot;&quot;&quot;<br><br>        response = client.models.generate_content(<br>            model=&quot;gemini-2.5-flash&quot;,<br>            contents=prompt,<br>        )<br><br>        return SummaryEvent(<br>            url=ev.url,<br>            summary=response.text.strip(),<br>        )<br><br># ---------------------------<br># Required entrypoint<br># ---------------------------<br>workflow = UrlSummarizerWorkflow(timeout=60, verbose=True)</pre><p><strong>Step 4: Copy the code above and paste it into </strong><strong>main.py.</strong></p><p>This implementation uses <strong>LlamaIndex workflows</strong> to structure a simple two-step flow:</p><ol><li><strong>Fetch webpage content</strong> using LlamaIndex’s web reader</li><li><strong>Summarize the content</strong> using <strong>Google Gemini</strong></li></ol><p>LlamaIndex manages the workflow and data flow, while Gemini performs the actual summarization — resulting in a clean, modular, and easy-to-follow coded agent.</p><p>The project contains the following key files:</p><p>📄 <strong>main.py</strong> → This file holds your <strong>agent logic</strong>.</p><p>⚙️ <strong>llama_index.json</strong> → Defines your LlamaIndex workflow configuration, mapping workflow names to their entry points<br> <em>(for example: </em><em>&quot;workflows&quot;: { &quot;agent&quot;: &quot;main.py:agent&quot; })</em></p><p>🧾 <strong>pyproject.toml</strong> → Contains the project metadata such as the project name, version, author details, and required dependencies.</p><p>Next, we need to install a few required dependencies for this project. These packages provide support for <strong>LlamaIndex workflows</strong>, <strong>Google Gemini</strong>, and <strong>environment variable management</strong>.</p><pre>pip install llama-index google-genai python-dotenv</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*KPmg46FViIgrXruiz7KQag.png" /></figure><p>🪄 <strong>Step 5: Authenticate with UiPath</strong></p><p>Before running your LangGraph agent, you need to <strong>authenticate</strong> with UiPath.<br>The easiest way is through the <strong>CLI authentication command</strong>:</p><pre>Uipath Auth </pre><h3>⚙️ What happens when you run this:</h3><ol><li>🌐 <strong>Browser Opens</strong> — Your default browser launches the <strong>UiPath Cloud Platform</strong>.</li><li>🔑 <strong>Login</strong> — Sign in with your UiPath credentials.</li><li>✅ <strong>Grant Access</strong> — Authorize the CLI to access your UiPath account.</li><li>⚡ <strong>Auto-Configuration</strong> — The CLI automatically generates or updates your .env file with:</li></ol><ul><li>UIPATH_URL → Your organization and tenant URL</li><li>UIPATH_ACCESS_TOKEN → Secure access token</li><li>UIPATH_TENANT_ID</li><li>UIPATH_ORGANIZATION_ID</li></ul><p>📁 Once complete, your .env file is ready — containing all the required credentials for your LlamaIndex agent to connect with UiPath seamlessly.</p><p>Your folder structure will look like this, <strong>.env</strong> file is created with details</p><h4>Step 6: Generate the Google Gemini API Key</h4><p>To use Google Gemini, you’ll need an API key stored in your .env file.</p><ol><li>Go to <a href="https://aistudio.google.com/"><strong>https://aistudio.google.com/</strong></a></li><li>Create a sample project</li><li>Generate a <strong>Google Gemini API key</strong></li></ol><p>Google provides a <strong>free tier for basic usage</strong>, which is sufficient for this tutorial.</p><p>Once you have the key, add it to your .env file:</p><pre>GEMINI_API_KEY=your_api_key_here</pre><p>Your coded agent will automatically read this key at runtime.</p><p>Your .env file will look something like this all UiPath keys will be auto generated but you need to add the GEMINI_API_KEY in the file.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/987/1*IfDbB7VnST36gkILRzwq1g.png" /></figure><h4>⚙️ Step 7: Initialize the UiPath Project</h4><p>Set up your UiPath configuration files by running:</p><pre>uipath init</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/736/1*tH3tXnBeeJzjS-l9Yx334Q.png" /></figure><p>This command generates essential project files:</p><ul><li>🧾 <strong>uipath.json</strong> → Links your <strong>LlamaIndex agent</strong> to UiPath</li><li>🪄 <strong>agent.mermaid</strong> → (Optional) A <strong>visual workflow diagram</strong> of your agent’s process</li></ul><p>Once created, your project is fully initialized and ready to connect with UiPath!</p><p><strong>🧩 Step 8: Test Your Agent Locally</strong></p><p>To quickly verify your LlamaIndex agent before deployment: we need to create an <strong>input.json</strong> file in the project folder. This file allows us to pass structured or complex inputs—such as a URL—to the coded agent in a clean and reliable way. You can give any URL in here which you want to pass to your agent.</p><pre>{<br>  &quot;url&quot;: &quot;https://rickandmorty.fandom.com/wiki/Rick_and_Morty_(TV_series)&quot;<br>}</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*DdVD0LuCuIoTSwPN2TKMDA.png" /></figure><p>Run the following command:</p><pre>uipath run agent --input-file input.json</pre><p>Once you run this command in the terminal, you’ll see that the agent executes successfully — confirming that your coded agent is working correctly.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*I8aR3JZNuSWS2lRngoUYZg.png" /></figure><p><strong>Step 9: Update </strong><strong>pyproject.toml file</strong></p><p>Before publishing the project to <strong>UiPath Orchestrator</strong>, we need to update the dependencies in the <strong>pyproject.toml</strong> file to ensure all required packages are included.</p><p>This step is essential to make sure the coded agent runs correctly once deployed in the UiPath environment. You can either <strong>add the missing dependencies manually</strong> or <strong>replace the entire file</strong>, updating only the project name, author name, and email with your own details.</p><pre>[project]<br>name = &quot;webpage_Summarizer&quot;<br>version = &quot;0.0.1&quot;<br>description = &quot;webpage_Summarizer&quot;<br>authors = [{ name = &quot;Add Your Name&quot;, email = &quot;Your Email Address&quot; }]<br>dependencies = [<br>    &quot;uipath-llamaindex&gt;=0.1.0&quot;,<br>    &quot;llama-index&gt;=0.10.40&quot;,<br>    &quot;llama-index-readers-web&gt;=0.1.16&quot;,<br>    &quot;google-genai&gt;=0.6.0&quot;,<br>    &quot;python-dotenv&gt;=1.0.1&quot;,<br>    &quot;requests&gt;=2.32.0&quot;<br>]<br>requires-python = &quot;&gt;=3.11&quot;</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*uwz6MR-HcFP7HCQf_9pQJQ.png" /></figure><h4>Step 10: Package and Publish Your Agent</h4><p>After testing locally and finalizing your project, it’s time to <strong>package and publish</strong> your LlamaIndex agent to <strong>UiPath Automation Cloud</strong>.</p><p>Run the following command:</p><pre>uipath pack</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/822/1*7C_TiRL4fJvRuvQ4dHGYsQ.png" /></figure><p>🧩 <strong>What it does:</strong></p><ul><li>📦 Compiles your project into a <strong>deployment-ready </strong><strong>.nupkg file</strong></li><li>💾 Saves the package inside the <strong>.uipath</strong> directory</li></ul><p>Your agent is now packaged and ready to be published to UiPath Orchestrator or Automation Cloud! 🌐</p><h4>☁️ Step 11: Publish Your Agent to UiPath Cloud</h4><p>Once your agent is packaged, publish it directly to your <strong>UiPath tenant</strong> using:</p><p>Run the following command:</p><pre>uipath publish</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*2y-ImCXMaxk-suQ20Zwmsg.png" /></figure><h4>⚙️ What happens:</h4><ul><li>🚀 Uploads the packaged <strong>.nupkg</strong> file to the <strong>UiPath Cloud Orchestrator</strong></li><li>🌐 Makes your agent available for execution within your tenant’s environment</li><li>🎯 Prompts you to <strong>select the target feed</strong> where the package should be published</li></ul><p>After publishing, your LlamaIndex agent is live and ready to run from UiPath Orchestrator! 💼</p><h4>⚙️ Step 12: Add the Published Agent as a Process in Orchestrator &amp; Run It in UiPath Cloud</h4><p>Now that your agent is published to UiPath Cloud, the next step is to create a <strong>Process</strong> in UiPath Orchestrator so it becomes executable.</p><p>Once the process is set up, you can <strong>run your LlamaIndex agent directly from Orchestrator</strong>!</p><p>When triggering the process:</p><ul><li>🧠 <strong>Provide a URL</strong> as input, for example: &quot;https://powerpuffgirls.fandom.com/wiki/Powerpuff_Girls_Wiki&quot;</li><li>🌐 <strong>Set your API key</strong> in the environment variables, since we are calling external APIs like Gemini</li></ul><p>And that’s it — your agent is now ready to fetch and process data from the web through UiPath!</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/940/1*YVlaULIx0TX713PkvM5gog.png" /></figure><p>Once your agent runs successfully in <strong>UiPath Orchestrator</strong>, you’ll see the generated result in the <strong>Job Output</strong> or <strong>Logs</strong> section.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/892/1*k_6-6LW-4zkLLVbQ93ZU6g.png" /></figure><h4>Whola! 🎊 You’ve officially built, configured, and deployed your first LlamaIndex-powered agent in UiPath!</h4><p>Now you know how to combine <strong>AI intelligence</strong> with <strong>UiPath automation</strong> to create something powerful and scalable.</p><p>Keep exploring, keep building, and who knows — your next agent might just change how automation works! ⚙️🤖</p><p>📘 <strong>Reference:</strong></p><p>You can copy the whole Agent from my GitHub page:</p><p>👉<a href="https://github.com/AJYoutube007/Llamaindex_WebPageSummarization">https://github.com/AJYoutube007/Llamaindex_WebPageSummarization</a></p><p>Explore the official UiPath LlamaIndex SDK and examples here:</p><p>👉<a href="https://github.com/UiPath/uipath-llamaindex-python">https://github.com/UiPath/uipath-llamaindex-python</a></p><p>👉<a href="https://uipath.github.io/uipath-python/llamaindex/quick_start/">https://uipath.github.io/uipath-python/llamaindex/quick_start/</a></p><p>In case of any doubts or if you just want to have a fun conversation, feel free to reach out anytime: <a href="https://www.linkedin.com/in/abhishek-jagtap-314624140/">Abhishek Jagtap on LinkedIn</a></p><p>Best of luck and happy automating! 🤖💫</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=86f39f48fc39" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>