<?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:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[DEVELOPERS.DE]]></title><description><![CDATA[Software Development Blog with focus on .NET, Windows, Microsoft Azure powered by daenet]]></description><link>https://developers.de/</link><image><url>https://developers.de/favicon.png</url><title>DEVELOPERS.DE</title><link>https://developers.de/</link></image><generator>Ghost 1.21</generator><lastBuildDate>Wed, 28 Oct 2026 18:45:36 GMT</lastBuildDate><atom:link href="https://developers.de/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Why Vibe Coding Still Needs Engineering?]]></title><description><![CDATA[<div class="kg-card-markdown"><p>Here are two extremely simple C# snippets from one of my slides. If you think you can make software without needing to understand the produced code, please try to focus on these few lines only, at least. Both are generated by AI - VibeCoding. Together, they are about nine lines</p></div>]]></description><link>https://developers.de/2026/10/27/why-vibe-coding-still-needs-engineering/</link><guid isPermaLink="false">6ae0a7e45d6a821cf8783edb</guid><dc:creator><![CDATA[Damir Dobric]]></dc:creator><pubDate>Tue, 27 Oct 2026 13:34:12 GMT</pubDate><media:content url="https://developersde.blob.core.windows.net/usercontent/2026/10/271332_why-vibe-coding-cover.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://developersde.blob.core.windows.net/usercontent/2026/10/271332_why-vibe-coding-cover.png" alt="Why Vibe Coding Still Needs Engineering?"><p>Here are two extremely simple C# snippets from one of my slides. If you think you can make software without needing to understand the produced code, please try to focus on these few lines only, at least. Both are generated by AI - VibeCoding. Together, they are about nine lines of code in two functions. Both compile, both look clean, and both are typical AI output.</p>
<p>Here is the question. How many bugs do you see?</p>
<h3 id="sampleareturnstheaveragegrade">Sample A – &quot;Returns the average grade&quot;</h3>
<pre><code class="language-csharp">public static double AverageGrade(List&lt;Student&gt; students)
    =&gt; students.Select(s =&gt; s.Grade).Average();
</code></pre>
<h3 id="samplebreturnsthetopnscores">Sample B – &quot;Returns the top N scores&quot;</h3>
<pre><code class="language-csharp">public static int[] TopScores(int[] scores, int n)
{
    Array.Sort(scores);
    Array.Reverse(scores);
    return scores.Take(n).ToArray();
}
</code></pre>
<p>Take 60 seconds for each before you read on.</p>
<h2 id="sixbugsinninelinesofcode">Six bugs in nine lines of code</h2>
<p><strong>A – AverageGrade (3 lines)</strong></p>
<ul>
<li>If students is null, the application will crash.</li>
<li>If the list is empty, the application crashes again. Average() throws on an empty sequence.</li>
<li>If one student in the list is null, it crashes again.</li>
</ul>
<p><strong>B – TopScores (6 lines)</strong></p>
<ul>
<li>It silently sorts and reverses the caller's original array, so other parts of the system now see changed data.</li>
<li>If scores is null, it crashes.</li>
<li>If n is negative, it returns an empty result without any error.</li>
</ul>
<p><strong>That's six bugs in nine lines, and nobody notices them in a 60-second look. Ok, try with 6 minutes :).</strong></p>
<h3 id="nowscaleitup">Now scale it up</h3>
<p>Imagine 100,000 lines of vibe-coded software, or a million. Even if real code were a hundred times better than this example, you would still have hundreds of hidden bugs that nobody wrote consciously, nobody reviewed, and nobody understands.</p>
<h3 id="nowletspicturethesamethingwithacar">Now let's picture the same thing with a car</h3>
<p>Imagine a technology called <strong>VibeCarCreating</strong>. You describe your dream car, and an hour later it's standing in front of your house. It's shiny and quiet, the doors close perfectly, and the dashboard glows.</p>
<p>But nobody designed the brakes. Nobody calculated the steering. Nobody crash-tested it. It was generated, and it looks right. Your family is waiting to get in.</p>
<p><strong>Would you drive it?</strong> Maybe slowly, around an empty parking lot. Would you drive it on the Autobahn at 200 km/h with your children in the back seat?</p>
<h3 id="andnowmakeitfly">And now make it fly</h3>
<p>Your Prompt: &quot;Take this car and make it fly.&quot; Wow. Next Monday you go to your colleagues and will probably say: &quot;<em>See what I did with Cloude at the weekend.</em>&quot;</p>
<p>Imagine it's a flying car. A car that fails stops at the side of the road. A plane that fails doesn't get a second chance.</p>
<p>We would never accept this for a car, yet we're starting to accept it for software that runs hospitals, banks, factories and energy grids.</p>
<p>My question: Are these two car models an 80:20 solution, which can be completed by some freelancer or a student from your neighbourhood?</p>
<h3 id="wherewouldyoudrivethiscode">Where would you drive this code?</h3>
<p>I'm not against vibe coding. Many of us did that in the past, just manually. The result was inventing the Application Lifecycle Framework to stop engineers from being in the vibe flow. The difference now is democratisation and scale. You do not have to be a professional to jump into the Vibe flow. I also use a lot of AI to generate code every day (and night). But generated code is a prototype, not a product, until someone who understands it has tested it, reviewed it and taken responsibility for it. Usually, more than a single persona.</p>
<p>Here is my advice. Before you ship generated code, ask yourself the honest questions:</p>
<ul>
<li><strong>Where</strong> will it run? A prototype, or the core of a business?</li>
<li><strong>How fast?</strong> A handful of users, or millions of transactions?</li>
<li><strong>Can it fly?</strong> If it fails, does it stop safely or crash hard?</li>
<li>How <strong>secure</strong> is it?</li>
</ul>
<p><strong>Where would you drive or fly such code, and how fast?</strong></p>
<h1 id="vibecodingaisoftwareengineeringcodequalitygenaidotnetagenticai">VibeCoding #AI #SoftwareEngineering #CodeQuality #GenAI #dotnet #AgenticAI</h1>
<p><em>Originally published on <a href="https://www.linkedin.com/pulse/why-vibe-coding-still-needs-engineering-dr-damir-dobric-bnqde">LinkedIn</a>.</em></p>
</div>]]></content:encoded></item><item><title><![CDATA[Microsoft Frontier Tour Cologne: From AI Experiments to Skilled Agents]]></title><description><![CDATA[<div class="kg-card-markdown"><p>What a day in Cologne! The Microsoft Frontier Tour brought together developers, architects and decision-makers who want to move AI out of the pilot phase and into real business processes. The energy in the room was great.</p>
<p>One thing was clear all day: the conversation has moved on. Nobody asks</p></div>]]></description><link>https://developers.de/2026/10/23/microsoft-frontier-tour-cologne-from-ai-experiments-to-skilled-agents/</link><guid isPermaLink="false">6ae0ae3a5d6a821cf8783ee5</guid><dc:creator><![CDATA[Damir Dobric]]></dc:creator><pubDate>Fri, 23 Oct 2026 07:15:15 GMT</pubDate><media:content url="https://developersde.blob.core.windows.net/usercontent/2026/10/271357_frontier-0.gif" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://developersde.blob.core.windows.net/usercontent/2026/10/271357_frontier-0.gif" alt="Microsoft Frontier Tour Cologne: From AI Experiments to Skilled Agents"><p>What a day in Cologne! The Microsoft Frontier Tour brought together developers, architects and decision-makers who want to move AI out of the pilot phase and into real business processes. The energy in the room was great.</p>
<p>One thing was clear all day: the conversation has moved on. Nobody asks anymore whether agents work. Teams now ask how to build agents that are <strong>reliable, secure, maintainable and good at specific tasks</strong>.</p>
<h3 id="mysessionbuildingskilledagentswithmicrosoftagentframeworkincnet">My session: Building Skilled Agents with Microsoft Agent Framework in C#/.NET</h3>
<ul>
<li>What &quot;skills&quot; are, and why packaging know-how into reusable skills makes an agent better than a bigger prompt does</li>
<li>How to combine skills and tools</li>
<li>Lessons from projects we've built at daenet for German Mittelstand customers: what works in production and what doesn't</li>
</ul>
<p>Thank you to Microsoft for the great organization, and thanks to everyone who joined the session and stopped by the labs. If you'd like to continue the conversation about your agent scenarios, send me a message.</p>
<h1 id="microsoftaiagentframeworkdotnetcsharpagenticaimcpfrontiertourdaenet">MicrosoftAI #AgentFramework #dotnet #CSharp #AgenticAI #MCP #FrontierTour #daenet</h1>
<p><em>Originally published on <a href="https://www.linkedin.com/feed/update/urn:li:activity:7519295361446957056/">LinkedIn</a>.</em></p>
</div>]]></content:encoded></item><item><title><![CDATA[What if “wenn” worked just as well as “if”? My students and I built a compiler that turns German into .NET IL]]></title><description><![CDATA[<div class="kg-card-markdown"><p>Every developer in Germany thinks in German and codes in English. We say &quot;solange der Kunde aktiv ist…&quot; in the meeting, then type while (customer.IsActive) in the IDE. We've done it so long we don't even notice the translation anymore.</p>
<p>So in my <strong>Software Engineering course at</strong></p></div>]]></description><link>https://developers.de/2026/10/22/what-if-wenn-worked-just-as-well-as-if-my-students-and-i-built-a-compiler-that-turns-german-into-net-il/</link><guid isPermaLink="false">6ae0ae395d6a821cf8783ee4</guid><dc:creator><![CDATA[Damir Dobric]]></dc:creator><pubDate>Thu, 22 Oct 2026 08:30:40 GMT</pubDate><media:content url="https://developersde.blob.core.windows.net/usercontent/2026/10/271346_deutsch-cover.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://developersde.blob.core.windows.net/usercontent/2026/10/271346_deutsch-cover.png" alt="What if “wenn” worked just as well as “if”? My students and I built a compiler that turns German into .NET IL"><p>Every developer in Germany thinks in German and codes in English. We say &quot;solange der Kunde aktiv ist…&quot; in the meeting, then type while (customer.IsActive) in the IDE. We've done it so long we don't even notice the translation anymore.</p>
<p>So in my <strong>Software Engineering course at Frankfurt University of Applied Sciences</strong>, I gave my students a slightly crazy challenge: <strong>what would it take to write code in German and have it run natively on .NET?</strong>  Not transpiled to C#, and not interpreted. Real Intermediate Language, running on the same runtime as every enterprise app we ship.</p>
<p>The answer: about 400 lines of C#, a lot of whiteboard discussions, and a room full of students who suddenly realised that compilers aren't magic and the AI is a friend.</p>
<h3 id="meetdeutschnet">Meet Deutsch.NET#</h3>
<pre><code>zahl fakultät = 1;
zahl i = 1;

solange i &lt;= 10 {
    fakultät = fakultät * i;
    i = i + 1;
}

wenn fakultät &gt; 1000000 {
    schreibe &quot;Das ist groß!&quot;;
}
</code></pre>
<p>That's a real program. zahl, solange, wenn, sonst and schreibe are keywords, umlauts are valid in variable names (yes, größe works), and the output is a genuine .NET assembly. You can run it with dotnet programm.dll or open it in ILSpy and read the IL.</p>
<h3 id="howitworksitslessmagicthanyouthinkallekochenmitwasser">How it works (it's less magic than you think - alle kochen mit Wasser)</h3>
<p>Every compiler, from Roslyn to GCC, follows the same basic pipeline. Together we implemented each stage in its simplest honest form.</p>
<p><strong>1. Lexer.</strong>  It turns raw text into tokens. It recognizes solange as a keyword, fakultät as a name and &lt;= as an operator.</p>
<p><strong>2. Parser.</strong>  A recursive-descent parser turns tokens into an abstract syntax tree. Operator precedence (oder &lt; und &lt; comparison &lt; + &lt; *) is simply the order in which the functions call each other.</p>
<p><strong>3. Code generation.</strong>  The tree is walked and each node is emitted as IL through System.Reflection.Emit. A solange loop becomes a label, the condition, a brfalse to the end, the body, and a br back to the start. Even &lt;= has no direct IL instruction; it becomes cgt followed by &quot;compare with zero&quot;. That's the kind of detail you only learn by building it yourself.</p>
<p><strong>4. Assembly.</strong>  The new PersistedAssemblyBuilder in .NET 9 writes the result to disk as a real executable. For years this was only possible on .NET Framework; now it's back, and it's a game changer for anyone building languages or DSLs on .NET.</p>
<h3 id="whybuildacompilerinasoftwareengineeringcourse">Why build a compiler in a Software Engineering course?</h3>
<p>Because it's the perfect software engineering project in miniature.</p>
<p><strong>Architecture becomes tangible.</strong>  Lexer, parser and code generator are clean, separate layers with clear contracts between them. Students experience firsthand why separation of concerns isn't just a slide in a lecture.</p>
<p><strong>Testing gets real.</strong>  Every keyword, every operator and every edge case (what happens with zahl x = x;?) needs a test. Good error messages in German (&quot;Zeile 7: ';' erwartet&quot;) turned out to be just as much work as the happy path, exactly like in real products.</p>
<p><strong>The fundamentals stick.</strong>  When you've emitted ldloc and brfalse yourself, you understand async state machines, LINQ and performance profiles on a completely different level. Abstractions stop being mysterious once you've built one.</p>
<p><strong>And it's fun.</strong>  Seeing your own German program print &quot;Das ist groß!&quot; from an assembly you generated byte by byte is a moment students don't forget.</p>
<h3 id="whythismattersbeyondtheclassroom">Why this matters beyond the classroom</h3>
<p><strong>Domain-specific languages are underrated.</strong>  Imagine business rules, pricing logic or configuration written in the language the domain experts speak. A DSL compiled to IL runs at full .NET speed and remains strictly deterministic.</p>
<p><strong>And this is where it gets interesting for AI.</strong>  Everyone is talking about natural language as the new programming interface. LLMs are brilliant at turning intent into code, but they're probabilistic. Compilers are deterministic. The real power lies in combining both: an agent translates human intent into a precise, constrained DSL, and a compiler guarantees what actually runs. Natural language for expression, formal languages for trust.</p>
<p>The next generation of engineers needs to understand both worlds. That's exactly what we try to teach.</p>
<h3 id="whatsnext">What's next</h3>
<p>Deutsch# is intentionally tiny: integers, strings, branches and loops. The roadmap is already on the whiteboard. That means nested scopes, a real type checker, functions (funktion … gib zurück …), and calling into the .NET base class library. Plenty of material for the next student projects.</p>
<p>We also used Claude and ChatGPT as an AI pair programmer along the way, which is a story in itself. It sped things up a lot, but the real understanding came from the students reading and questioning every line it suggested.</p>
<p><strong>Would you write production code in your native language, or is English simply the lingua franca of code forever?</strong>  And should we put Deutsch.NET# on GitHub? Let us know in the comments. ?</p>
<p>Huge thanks to my students for their curiosity and energy. You made this one a blast. ?</p>
<h1 id="dotnetcsharpcompilerssoftwareengineeringteachingfrankfurtuasaidslmicrosoftmvp">dotnet #csharp #compilers #softwareengineering #teaching #FrankfurtUAS #AI #DSL #MicrosoftMVP</h1>
<p><em>Originally published on <a href="https://www.linkedin.com/pulse/what-wenn-worked-just-well-my-students-i-built-compiler-dobric-05sde/">LinkedIn</a>.</em></p>
</div>]]></content:encoded></item><item><title><![CDATA[The New Rhetoric: What Is Happening to Scrum in the Era of AI?]]></title><description><![CDATA[<div class="kg-card-markdown"><p>Everything is changing, and Scrum is changing too. I don't want to give the impression that this post is a prediction. I don't know what the future will look like, and nobody does, including the CEOs of the hyperscalers.</p>
<p>But this is how my teams have been working over the</p></div>]]></description><link>https://developers.de/2026/10/12/the-new-rhetoric-what-is-happening-to-scrum-in-the-era-of-ai/</link><guid isPermaLink="false">6ae0ae385d6a821cf8783ee3</guid><dc:creator><![CDATA[Damir Dobric]]></dc:creator><pubDate>Mon, 12 Oct 2026 07:10:37 GMT</pubDate><media:content url="https://developersde.blob.core.windows.net/usercontent/2026/10/271357_scrum-0.jpg" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://developersde.blob.core.windows.net/usercontent/2026/10/271357_scrum-0.jpg" alt="The New Rhetoric: What Is Happening to Scrum in the Era of AI?"><p>Everything is changing, and Scrum is changing too. I don't want to give the impression that this post is a prediction. I don't know what the future will look like, and nobody does, including the CEOs of the hyperscalers.</p>
<p>But this is how my teams have been working over the last few years. Our workflow hasn't changed, but our roles are changing.</p>
<p><strong>Spec → Plan → Task → Test → Review → Commit</strong></p>
<p>More precisely, we are learning a new kind of rhetoric. Why? Between every step there's an agent doing some of the work.</p>
<p>What surprised me is that the agent didn't make the process less important. I think the engineering approach stays fully in place, even when we use AI. When you give an agent a vague story, you get a vague result. When you give it a small task with clear acceptance criteria, it does a very good job. So we are discovering a new rhetoric for working with AI.</p>
<h3 id="agoodtaskforanaiagentis">A good task for an AI agent is:</h3>
<ul>
<li>✔ <strong>small</strong> (minutes to hours, not days)</li>
<li>✔ <strong>testable</strong> (Given / When / Then)</li>
<li>✔ <strong>traceable</strong> (task ID in the commit)</li>
<li>✔ and last but not least, <strong>reviewed by a person</strong></li>
</ul>
<p>This is the new reality with LLMs, at least for now, at least at daenet/ACP.</p>
<p>The value isn't in the model. It's in us: in how well we specify, split and verify the work. The engineering discipline we have always taught is suddenly worth more, not less.</p>
<p>I'd be happy to hear your suggestions and thoughts.</p>
<h1 id="aiagenticaiscrumsoftwareengineeringdaenet">AI #AgenticAI #Scrum #SoftwareEngineering #daenet</h1>
<p><em>Originally published on <a href="https://www.linkedin.com/feed/update/urn:li:activity:7515307925557522432/">LinkedIn</a>.</em></p>
</div>]]></content:encoded></item><item><title><![CDATA[Publishing Modes of a .NET Application]]></title><description><![CDATA[<div class="kg-card-markdown"><p>You've built a great .NET application. It works perfectly on your machine. You send it to a customer, and the first reply you get is: <em>&quot;It doesn't start. It says something about installing .NET.&quot;</em></p>
<p>The way you publish your app decides whether your customer double-clicks and gets going,</p></div>]]></description><link>https://developers.de/2026/10/11/publishing-modes-of-a-net-application/</link><guid isPermaLink="false">6ae0ae385d6a821cf8783ee2</guid><dc:creator><![CDATA[Damir Dobric]]></dc:creator><pubDate>Sun, 11 Oct 2026 12:24:06 GMT</pubDate><media:content url="https://developersde.blob.core.windows.net/usercontent/2026/10/271357_publishing-cover.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://developersde.blob.core.windows.net/usercontent/2026/10/271357_publishing-cover.png" alt="Publishing Modes of a .NET Application"><p>You've built a great .NET application. It works perfectly on your machine. You send it to a customer, and the first reply you get is: <em>&quot;It doesn't start. It says something about installing .NET.&quot;</em></p>
<p>The way you publish your app decides whether your customer double-clicks and gets going, or opens a ticket with their IT department and waits two weeks. Here's a practical look at the options.</p>
<h3 id="frameworkdependentsmallbutwithstringsattached">Framework-dependent: small, but with strings attached</h3>
<p>A framework-dependent app expects the .NET runtime to already be on the machine. The standard runtime installer puts it in C:\Program Files\dotnet, a machine-wide location, so installing it requires admin rights.</p>
<p>On a developer box that's no problem. On a locked-down corporate laptop, it often is. The user can't install the runtime themselves, and their IT department may not have rolled out the version you need (say, .NET 10). Your app is ready; the machine isn't.</p>
<h3 id="selfcontainedbringyourownruntime">Self-contained: bring your own runtime</h3>
<p>Self-contained publishing ships the .NET runtime inside your app's folder. Nothing is installed system-wide. The user can unzip or copy the app into any folder they have write access to, such as the Desktop, Downloads or %LOCALAPPDATA%, and simply run it.</p>
<p>No installer. No elevation prompt. No &quot;please install .NET 10 first&quot; step.</p>
<p>There's a quiet but valuable side benefit: your app always runs on exactly the runtime version you tested with, regardless of what else is (or isn't) installed on the machine. Fewer &quot;works on my machine&quot; surprises.</p>
<p><img src="https://developersde.blob.core.windows.net/usercontent/2026/10/271357_publishing-0.png" alt="Publishing Modes of a .NET Application"></p>
<h3 id="singlefileoneexedone">Single file: one .exe, done</h3>
<p>Single-file publishing goes one step further. Instead of a folder full of DLLs, the customer gets one .exe to double-click. For distribution to non-technical users, that's about as simple as it gets.</p>
<pre><code>dotnet publish -c Release -r win-x64 --self-contained true -p:PublishSingleFile=true
</code></pre>
<p><img src="https://developersde.blob.core.windows.net/usercontent/2026/10/271357_publishing-1.png" alt="Publishing Modes of a .NET Application"></p>
<h3 id="caveatsyoullbeaskedabout">Caveats you'll be asked about</h3>
<p><img src="https://developersde.blob.core.windows.net/usercontent/2026/10/271357_publishing-2.png" alt="Publishing Modes of a .NET Application"></p>
<p><strong>Missing admin rights don't strictly block framework-dependent apps.</strong>  A determined user can install the runtime per-user with the dotnet-install script and point DOTNET_ROOT at it. It works, but it's not something you'd reasonably expect a customer to do.</p>
<p><strong>Self-contained doesn't defeat every lock-down.</strong>  If IT uses AppLocker or similar policies to block executables in user folders, your app won't run either way. Publishing mode can't solve a policy decision; that conversation has to happen with IT.</p>
<p><strong>Size is the trade-off.</strong>  Bundling the runtime makes the app noticeably bigger, roughly 60–80 MB. Trimming (-p:PublishTrimmed=true) can bring that down considerably, but test carefully: trimming can break code that relies on reflection, and WinForms and WPF apps don't officially support it.</p>
<h3 id="thebottomline">The bottom line</h3>
<p>If you control the target machines, framework-dependent keeps things lean. If you're shipping to customers whose environments you don't control, self-contained (ideally as a single file) removes the most common reason your app fails to start, and that first impression matters.</p>
<p>How do you publish your .NET apps for customers? I'd be curious to hear what has worked in your environments.</p>
<h1 id="dotnetcsharpsoftwaredevelopmentdeploymentmicrosoft">dotnet #csharp #softwaredevelopment #deployment #microsoft</h1>
<p><em>Originally published on <a href="https://www.linkedin.com/pulse/publishing-modes-net-application-dr-damir-dobric-ay88e/">LinkedIn</a>.</em></p>
</div>]]></content:encoded></item><item><title><![CDATA[How to Build Agents with Microsoft Foundry? Start with the Agent Type]]></title><description><![CDATA[<div class="kg-card-markdown"><p>The first architectural decision is not the model. <strong>It's the agent type!</strong></p>
<p>Foundry Agent Service now offers three types. Each one determines how much you build and how much the platform manages for you.</p>
<h3 id="1promptagentsthefastestpatheasytobuildbutlimited">1. Prompt agents: the fastest path (easy to build, but limited)</h3>
<p>You define instructions, a model</p></div>]]></description><link>https://developers.de/2026/10/05/how-to-build-agents-with-microsoft-foundry-start-with-the-agent-type/</link><guid isPermaLink="false">6ae0ae375d6a821cf8783ee1</guid><dc:creator><![CDATA[Damir Dobric]]></dc:creator><pubDate>Mon, 05 Oct 2026 06:45:36 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><p>The first architectural decision is not the model. <strong>It's the agent type!</strong></p>
<p>Foundry Agent Service now offers three types. Each one determines how much you build and how much the platform manages for you.</p>
<h3 id="1promptagentsthefastestpatheasytobuildbutlimited">1. Prompt agents: the fastest path (easy to build, but limited)</h3>
<p>You define instructions, a model and tools, and Foundry runs the agent. There's no application code, no containers and no infrastructure. Author it in the portal, or define it through the SDK/REST API so it fits into CI/CD.</p>
<p><strong>Best for:</strong> internal tools and production agents that don't need custom orchestration.</p>
<h3 id="2voicebasedpromptagentsrealtimeconversationspeechmodelphone">2. Voice-based prompt agents: real-time conversation (Speech → Model → Phone)</h3>
<p>Same configuration-first approach, but for spoken interaction. You connect over a real-time WebSocket through Voice Live, which handles speech recognition, turn-taking and speech synthesis. You can choose native speech-to-speech for low latency, or a cascaded STT → LLM → TTS pipeline for more control. Telephony via Teams Phone or Twilio.</p>
<p><strong>Best for:</strong> customer-facing voice and call-center scenarios. Note: still in preview.</p>
<h3 id="3hostedagentsfullcontrolmostpowerfulnolimits">3. Hosted agents: full control (most powerful, no limits)</h3>
<p>Bring your own code with Agent Framework, LangGraph, the OpenAI Agents SDK, the Anthropic Agent SDK, the GitHub Copilot SDK or plain custom code. Ship it as a container or a .zip, and Foundry runs it with a managed endpoint, autoscaling, a dedicated Entra identity, session state and end-to-end observability.</p>
<p><strong>Best for:</strong> agents that call into your own code, custom orchestration and multi-agent systems.</p>
<h3 id="myruleofthumb">My rule of thumb</h3>
<p>Start with a prompt agent. If you hit the limit (and you will), daenet can help you with a hosted agent.</p>
<p>I will host the AI Lab <strong>ILL335-CGN – Building &amp; deploying AI agents with Microsoft Foundry</strong> at the <a href="https://lnkd.in/e2-2qucd">Microsoft AI Tour in Cologne</a> on October 22, 2026.</p>
<h1 id="microsoftfoundryaiagentsagenticaiazuremcpagentframework">MicrosoftFoundry #AIAgents #AgenticAI #Azure #MCP #AgentFramework</h1>
<p><em>Originally published on <a href="https://www.linkedin.com/feed/update/urn:li:activity:7512764917267972096/">LinkedIn</a>.</em></p>
</div>]]></content:encoded></item><item><title><![CDATA[Requirements Are Quietly Becoming the New Source Code]]></title><description><![CDATA[<div class="kg-card-markdown"><p>For decades, there was a small, patient corner of research called <strong>Requirements Engineering</strong>, the discipline of capturing what a system is actually supposed to do. From 1983 to 2019, people tried to point language technology at it: automatically spotting contradictions in a spec, classifying requirements, finding defects. Useful work, but</p></div>]]></description><link>https://developers.de/2026/08/21/requirements-are-quietly-becoming-the-new-source-code/</link><guid isPermaLink="false">6ae0ae375d6a821cf8783ee0</guid><dc:creator><![CDATA[Damir Dobric]]></dc:creator><pubDate>Fri, 21 Aug 2026 07:33:05 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><p>For decades, there was a small, patient corner of research called <strong>Requirements Engineering</strong>, the discipline of capturing what a system is actually supposed to do. From 1983 to 2019, people tried to point language technology at it: automatically spotting contradictions in a spec, classifying requirements, finding defects. Useful work, but slow-moving and mostly analytical. The machine read your requirements and told you what looked wrong.</p>
<p>Then ChatGPT arrived, and the field changed character almost overnight.</p>
<p>The first studies on large language models for requirements appeared in 2023, not a year earlier, not a year later. Seventy-four have followed since. In two years, this new wave has produced roughly a fifth of everything the previous thirty-six years managed. What unlocked it wasn't a breakthrough in capability so much as a breakthrough in access: the moment researchers could simply type instead of building pipelines, they did.</p>
<p>But the volume isn't the interesting part. The interesting part is what these studies attempt.</p>
<p>Models are being used to elicit requirements from messy, informal material (user feedback, issue trackers, half-finished notes), to validate them and to build models from them. Tasks that were considered out of reach for traditional NLP are suddenly on the table.</p>
<p>And then there's the detail that should make every software engineer sit up: <strong>about one in five of these studies isn't really about requirements at all. It's about generating code and tests directly from them.</strong></p>
<p>That's a quiet inversion of how we build software. Today, requirements are documentation: written once, drifting out of sync with the code within weeks, consulted mainly during arguments. If code and tests can be derived from the specification, the specification stops being a description of the system and becomes the system's actual source. Code turns into an output, something regenerated rather than maintained by hand.</p>
<p>Which shifts where the craft lives. Not in typing the implementation, but in describing intent precisely enough that the implementation follows. Anyone who has tried to write a truly unambiguous requirement knows this is not the easy half of the job.</p>
<p>Software engineering may be about to re-center itself on the thing it always claimed to start with.</p>
<h3 id="thenumbersbehindit">The numbers behind it</h3>
<ul>
<li><strong>74</strong> studies on LLMs for Requirements Engineering, all since 2023</li>
<li><strong>+136%</strong> publications in 2024 versus 2023</li>
<li><strong>~20%</strong>: how much of 36 years of prior research (1983–2019) this wave matched in just 2 years</li>
<li><strong>20%</strong> of studies generate code or tests from requirements, not just analyze them</li>
<li><strong>66% / 23% / 11%</strong> conferences / workshops / journals: a field moving faster than journal cycles</li>
<li><strong>28%</strong> appear at the flagship RE conference; 57% are scattered across other venues, including AI, NLP and HCI communities</li>
<li><strong>2026</strong>: the year output could equal all prior NLP-for-requirements research, if growth holds</li>
</ul>
<p>Source: <a href="https://arxiv.org/abs/2509.11446v1">arxiv.org/abs/2509.11446</a></p>
<h1 id="softwareengineeringrequirementsengineeringllmaigenerativeai">SoftwareEngineering #RequirementsEngineering #LLM #AI #GenerativeAI</h1>
<p><em>Originally published on <a href="https://www.linkedin.com/feed/update/urn:li:activity:7496469409981489153/">LinkedIn</a>.</em></p>
</div>]]></content:encoded></item><item><title><![CDATA[Where AI Really Stands in the German Mittelstand: My Handelsblatt Interview]]></title><description><![CDATA[<div class="kg-card-markdown"><p>I recently did an interview with the German Handelsblatt on where AI actually stands in the German <em>Mittelstand</em>, and I didn't hold back on the uncomfortable parts.</p>
<p>The honest answer: most companies are still in &quot;trying things out&quot; mode. Everyone has tested a chatbot or let a few</p></div>]]></description><link>https://developers.de/2026/08/03/where-ai-really-stands-in-the-german-mittelstand-my-handelsblatt-interview/</link><guid isPermaLink="false">6ae0ae375d6a821cf8783edf</guid><dc:creator><![CDATA[Damir Dobric]]></dc:creator><pubDate>Mon, 03 Aug 2026 09:14:09 GMT</pubDate><media:content url="https://developersde.blob.core.windows.net/usercontent/2026/10/271357_handelsblatt-0.jpg" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://developersde.blob.core.windows.net/usercontent/2026/10/271357_handelsblatt-0.jpg" alt="Where AI Really Stands in the German Mittelstand: My Handelsblatt Interview"><p>I recently did an interview with the German Handelsblatt on where AI actually stands in the German <em>Mittelstand</em>, and I didn't hold back on the uncomfortable parts.</p>
<p>The honest answer: most companies are still in &quot;trying things out&quot; mode. Everyone has tested a chatbot or let a few people play with ChatGPT. But there's a massive gap between an impressive demo and something that runs in production and actually moves the numbers.</p>
<p>Why? Driven by the ME-TOO algorithm: <em>&quot;We also do AI.&quot;</em> No clear use cases, messy or unusable data, no safe way to wire it into existing systems, and often simply not enough internal competence to make good calls.</p>
<h3 id="my1advicetodecisionmakers">My #1 advice to decision-makers</h3>
<p><strong>Build real technological understanding before you build anything else.</strong> Every new technology demands a certain level of understanding; without it, you make bad decisions. Cookie banners are the textbook example: regulation written without understanding the underlying tech, solving nothing while making life harder for millions of people. If we get AI wrong the same way, we'll get the same kind of well-meaning mess.</p>
<h3 id="agentvschatbot">Agent vs. chatbot</h3>
<p>I also talked about what an &quot;AI agent&quot; really is, compared to just another chatbot. A chatbot is request-response, done. An agent works in a continuous loop: it reasons, breaks a task into subtasks and takes actions through interfaces that we as developers build. And that's the key point I keep repeating: <strong>the model itself doesn't act or decide. The responsibility for what actually happens sits with the software and the developers who build those interfaces.</strong></p>
<p>That distinction gets lost far too often in political and regulatory discussions.</p>
<h3 id="onemorethingworthsayingclearly">One more thing worth saying clearly</h3>
<p>Language models don't &quot;understand&quot; in the human sense. They calculate probable next words. That means they can sound convincing and still be wrong. For real logical reasoning, guaranteed-correct numbers or reliable facts, a language model alone is not enough.</p>
<p><strong>Read the full article (in German):</strong> <a href="https://www.handelsblatt.com/adv/firmen/ki-im-mittelstand.html">KI im Mittelstand – Handelsblatt</a></p>
<h1 id="digitalisierungaikiartificialintelligencesoftwareengineeringinnovationmittelstanddaenet">Digitalisierung #AI #KI #ArtificialIntelligence #SoftwareEngineering #Innovation #Mittelstand #daenet</h1>
<p><em>Originally published on <a href="https://www.linkedin.com/feed/update/urn:li:activity:7489971864581230592/">LinkedIn</a>.</em></p>
</div>]]></content:encoded></item><item><title><![CDATA[WeAreDevelopers World Congress 2026: Mastering Agents, MCP and Other Hypes]]></title><description><![CDATA[<div class="kg-card-markdown"><p>What a session! The two-hour deep-dive workshop <strong>&quot;Mastering Agents, MCP and other hypes&quot;</strong> on July 8 at WeAreDevelopers World Congress in Berlin was completely full, with people staying for the entire discussion and a steady stream of great questions right until the end of the next break.</p>
<p>We</p></div>]]></description><link>https://developers.de/2026/07/22/wearedevelopers-world-congress-2026-mastering-agents-mcp-and-other-hypes/</link><guid isPermaLink="false">6ae0ae365d6a821cf8783ede</guid><dc:creator><![CDATA[Damir Dobric]]></dc:creator><pubDate>Wed, 22 Jul 2026 11:24:01 GMT</pubDate><media:content url="https://developersde.blob.core.windows.net/usercontent/2026/10/271357_wad-0.jpg" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://developersde.blob.core.windows.net/usercontent/2026/10/271357_wad-0.jpg" alt="WeAreDevelopers World Congress 2026: Mastering Agents, MCP and Other Hypes"><p>What a session! The two-hour deep-dive workshop <strong>&quot;Mastering Agents, MCP and other hypes&quot;</strong> on July 8 at WeAreDevelopers World Congress in Berlin was completely full, with people staying for the entire discussion and a steady stream of great questions right until the end of the next break.</p>
<p>We went through building AI agents based on <strong>Microsoft Agent Framework</strong>, with extended capabilities using Function Calling, MCP and RAG. From the core concepts behind agents and plugins to building custom agents, and working across Microsoft Foundry and different AI models, we covered a lot of ground, all demo-driven and built for developers, architects and technical decision-makers.</p>
<p>Huge thanks to everyone who packed the room, asked amazing questions and stayed engaged for the full two hours. Conversations like these are exactly why events like WeAreDevelopers matter.</p>
<h1 id="wearedevelopersaiaiagentsmcpsemantickernelmicrosoftfoundryllmmicrosoftagentframeworkazureaidevelopercommunityberlin2026">WeAreDevelopers #AI #AIAgents #MCP #SemanticKernel #MicrosoftFoundry #LLM #MicrosoftAgentFramework #AzureAI #DeveloperCommunity #Berlin2026</h1>
<p><em>Originally published on <a href="https://www.linkedin.com/feed/update/urn:li:activity:7485655893137776641/">LinkedIn</a>.</em></p>
</div>]]></content:encoded></item><item><title><![CDATA[DWX Interview: How AI Is Rewriting the Rules of Software Development]]></title><description><![CDATA[<div class="kg-card-markdown"><p>This is not a distant future. It is happening right now. And it is just one example of how AI is fundamentally rewriting the rules of software development.</p>
<p>I recently had the opportunity to talk with the DWX team about where I think the AI journey could be heading. Here</p></div>]]></description><link>https://developers.de/2026/06/29/dwx-interview-how-ai-is-rewriting-the-rules-of-software-development/</link><guid isPermaLink="false">6ae0ae365d6a821cf8783edd</guid><dc:creator><![CDATA[Damir Dobric]]></dc:creator><pubDate>Mon, 29 Jun 2026 06:30:27 GMT</pubDate><media:content url="https://developersde.blob.core.windows.net/usercontent/2026/10/271357_dwx-0.jpg" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://developersde.blob.core.windows.net/usercontent/2026/10/271357_dwx-0.jpg" alt="DWX Interview: How AI Is Rewriting the Rules of Software Development"><p>This is not a distant future. It is happening right now. And it is just one example of how AI is fundamentally rewriting the rules of software development.</p>
<p>I recently had the opportunity to talk with the DWX team about where I think the AI journey could be heading. Here is a summary of a few things I said, some of which may be a little surprising.</p>
<h3 id="itproinnaturallanguage">IT Pro in natural language</h3>
<p>Instead of battling with PowerShell, Bicep or Terraform, developers today can simply describe what they want: <em>&quot;Please provision a VM in Germany West with 10 GB RAM.&quot;</em> Just type it, or say it into the microphone. The AI translates intent into executable code, using a technique we now call CLAW (Command Line Automated Workflow). The next LLM wave is arriving step by step through voice input, and hyperscalers like Microsoft are pushing hard in this direction.</p>
<h3 id="howcoolisvibecodingreally">How cool is vibe coding really?</h3>
<p>I'm a bit skeptical. Yes, you make fast progress at the beginning. Almost too fast. Then comes the awakening: code duplicated three times, endless refactoring, and a system that nobody really understands anymore. There is no developer, no author, you can call. Professional software shipping is and remains a software engineering skill. One example: if you don't know what CSS attributes or HTML structure mean, you won't be able to ship production-ready code and maintain it over time, even with the best AI tool. Vibe-coded tools like these will only find their place internally, where you are responsible for yourself.</p>
<h3 id="willdevelopershavetofearfortheirjobs">Will developers have to fear for their jobs?</h3>
<p>No. Code monkeys will. The language changes, the profession doesn't. We have gone through Assembler, BASIC, C++ and C#, and now perhaps spoken German comes next. That's evolution, not extinction. Old jobs disappear and new ones emerge. It has always been that way.</p>
<h3 id="ondatasovereignty">On data sovereignty</h3>
<p>I won't sugarcoat this. The idea of running AI and cloud entirely in your own data center in Germany? That train has almost left the station. Missing energy, missing infrastructure, missing core technology. And open source isn't a complete answer to dependencies either; the recent Notepad++ security issue shows that clearly. We need to talk about this openly.</p>
<h3 id="myconclusion">My conclusion</h3>
<p>Everyone should try AI. Not because the apocalypse will come if you don't, but because competition is becoming more efficient, and you will feel it.</p>
<p>I will go deeper into all of this as Track Chair for Cloud Strategies and AI Strategies at DWX 2026 in Mannheim (June 29 – July 2).</p>
<p><strong>Watch the full interview (in German):</strong> <a href="https://youtu.be/y9JzHfeCA0c">youtu.be/y9JzHfeCA0c</a></p>
<h1 id="aicloudcomputingsoftwaredevelopmentdwx2026artificialintelligencedevopsmicrosoftazure">AI #CloudComputing #SoftwareDevelopment #DWX2026 #ArtificialIntelligence #DevOps #Microsoft #Azure</h1>
<p><em>Originally published on <a href="https://www.linkedin.com/feed/update/urn:li:activity:7477247091241721856/">LinkedIn</a>.</em></p>
</div>]]></content:encoded></item><item><title><![CDATA[Running Out of Tokens: The New Pain of the Agentic Era]]></title><description><![CDATA[<div class="kg-card-markdown"><p>Running out of tokens is not a nice feeling.</p>
<p>This seems to be a new pain of the agentic population.</p>
<p>When it happens to me, I simply follow my own rule: when I run out of tokens, I go out. :)</p>
<h1 id="aiagenticaillmgithubcopilot">AI #AgenticAI #LLM #GitHubCopilot</h1>
<p><em>Originally published on <a href="https://www.linkedin.com/feed/update/urn:li:activity:7470502507287388161/">LinkedIn</a>.</em></p>
</div>]]></description><link>https://developers.de/2026/06/10/running-out-of-tokens-the-new-pain-of-the-agentic-era/</link><guid isPermaLink="false">6ae0ae355d6a821cf8783edc</guid><dc:creator><![CDATA[Damir Dobric]]></dc:creator><pubDate>Wed, 10 Jun 2026 15:49:52 GMT</pubDate><media:content url="https://developersde.blob.core.windows.net/usercontent/2026/10/271357_tokens-0.jpg" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://developersde.blob.core.windows.net/usercontent/2026/10/271357_tokens-0.jpg" alt="Running Out of Tokens: The New Pain of the Agentic Era"><p>Running out of tokens is not a nice feeling.</p>
<p>This seems to be a new pain of the agentic population.</p>
<p>When it happens to me, I simply follow my own rule: when I run out of tokens, I go out. :)</p>
<h1 id="aiagenticaillmgithubcopilot">AI #AgenticAI #LLM #GitHubCopilot</h1>
<p><em>Originally published on <a href="https://www.linkedin.com/feed/update/urn:li:activity:7470502507287388161/">LinkedIn</a>.</em></p>
</div>]]></content:encoded></item><item><title><![CDATA[Office Crash: When Microsoft Word cannot open files on OneDrive, SharePoint & Co.]]></title><description><![CDATA[<div class="kg-card-markdown"><h1 id="whenmicrosoftwordcrasheshowathirdpartyplugincanbringitdown">When Microsoft Word Crashes: How a Third-Party Plugin Can Bring It Down</h1>
<p>Microsoft Word or other Office Application is usually a very stable application. When it starts crashing repeatedly, many users assume the problem lies with Office itself, Windows updates, or corrupted documents. In practice, a very common cause is</p></div>]]></description><link>https://developers.de/2026/02/03/my-office-applications-cannot-open-files-on-onedrive-sharepoint/</link><guid isPermaLink="false">69808948e8c0b11b9c3d615a</guid><dc:creator><![CDATA[Damir Dobric]]></dc:creator><pubDate>Tue, 03 Feb 2026 12:28:18 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><h1 id="whenmicrosoftwordcrasheshowathirdpartyplugincanbringitdown">When Microsoft Word Crashes: How a Third-Party Plugin Can Bring It Down</h1>
<p>Microsoft Word or other Office Application is usually a very stable application. When it starts crashing repeatedly, many users assume the problem lies with Office itself, Windows updates, or corrupted documents. In practice, a very common cause is <strong>third-party Office plugins</strong> that integrate deeply into Word.<br>
You might blame Microsoft or Windows for this, but as in most cases it is not Microsoft. You update office, but some other plugins are not compatible with the new version. So, what to do?</p>
<p>One frequent example is a crash caused by the <em>Seclore FileSecure</em> Office plugin.</p>
<p>This article explains:</p>
<ul>
<li>How to locate this kind of issue</li>
<li>Why Word crashes even though it is not the real cause</li>
<li>How to safely disable the problematic plugin</li>
</ul>
<p>Note, the same issue can be fixed for all other office applications!</p>
<hr>
<h2 id="thecrashsymptoms">The Crash Symptoms</h2>
<p>Users typically report:</p>
<ul>
<li>Office application cannot open the file at the remote location.</li>
<li>Office application crashing when opening</li>
<li>Repeated crashes</li>
</ul>
<p>In <strong>Windows Event Viewer</strong>, the error often looks like this:</p>
<pre><code class="language-text">Faulting application name: WINWORD.EXE
Faulting module name: Office2016x64Plugin.dll
Exception code: 0xc0000409
Faulting module path: ...\Seclore\FileSecure\Desktop Client\...
</code></pre>
<p>At first glance, it appears that <strong>Microsoft Word</strong> (or other office applicaiton) is at fault — but that is misleading.</p>
<hr>
<h2 id="understandingtherootcause">Understanding the Root Cause</h2>
<p>The most important line in the crash report is:</p>
<pre><code class="language-text">Faulting module name: Office2016x64Plugin.dll
</code></pre>
<p>This DLL belongs to <strong>Seclore</strong>, an enterprise Information Rights Management (IRM) solution that integrates directly into Microsoft Office.</p>
<p>What is happening internally:</p>
<ul>
<li>Word loads the Seclore plugin during startup</li>
<li>The plugin performs low-level operations (file protection, encryption, policy enforcement)</li>
<li>Due to a bug, incompatibility, or outdated version, the plugin triggers a <strong>memory violation</strong></li>
<li>Windows terminates Word immediately to protect system integrity</li>
</ul>
<p>The exception code <code>0xc0000409</code> usually indicates:</p>
<ul>
<li>Stack buffer overrun</li>
<li>Memory corruption</li>
<li>Unsafe or incompatible plugin code</li>
</ul>
<p>In short: <strong>Word crashes because the plugin crashes inside Word’s process</strong>.</p>
<hr>
<h2 id="whythisproblemoftenappearssuddenly">Why This Problem Often Appears Suddenly</h2>
<p>This issue commonly starts after:</p>
<ul>
<li>A <strong>Microsoft Office update</strong></li>
<li>A <strong>Windows update</strong></li>
<li>An update mismatch between Office and the Seclore client</li>
<li>Security software not being updated in sync with Office</li>
</ul>
<p>Reinstalling Office alone usually does <strong>not</strong> fix the issue, because the faulty plugin remains installed.</p>
<hr>
<h2 id="howtodisablethesecloreplugininmicrosoftword">How to Disable the Seclore Plugin in Microsoft Word</h2>
<p>If your organization allows it, disabling the plugin is the fastest way to confirm and resolve the problem.</p>
<h3 id="method1disableviawordoptionsrecommended">Method 1: Disable via Word Options (Recommended)</h3>
<ol>
<li>Open <strong>Microsoft Word</strong></li>
<li>Go to <strong>File → Options</strong></li>
<li>Select <strong>Add-ins</strong></li>
<li>At the bottom, next to <strong>Manage</strong>, choose <strong>COM Add-ins</strong></li>
<li>Click <strong>Go</strong></li>
<li>Locate the <strong>Seclore</strong> add-in (or similar)</li>
<li><strong>Uncheck</strong> the plugin</li>
<li>Click <strong>OK</strong></li>
<li>Restart Word</li>
</ol>
<p>If Word opens normally afterward, the plugin was the cause.</p>
<hr>
<h3 id="method2startwordinsafemodediagnostic">Method 2: Start Word in Safe Mode (Diagnostic)</h3>
<p>This method does not disable the plugin permanently, but it helps confirm the root cause.</p>
<ol>
<li>Press <strong>Win + R</strong></li>
<li>Run:<pre><code class="language-text">winword /safe
</code></pre>
</li>
<li>If Word works correctly in Safe Mode, the issue is <strong>definitely an add-in</strong></li>
</ol>
<hr>
<h3 id="method3updateorreinstallseclorebestlongtermfix">Method 3: Update or Reinstall Seclore (Best Long-Term Fix)</h3>
<p>If the plugin is required by company policy:</p>
<ul>
<li>Update the <strong>Seclore Desktop Client</strong> to the latest version</li>
<li>If already updated, reinstall it</li>
<li>Verify compatibility with the current Office build</li>
</ul>
<p>In managed corporate environments, this step should be handled by IT support.</p>
<hr>
<h2 id="keytakeaway">Key Takeaway</h2>
<p>When Office APplications crashe:</p>
<ul>
<li>The <em>faulting application</em> is not always the <em>root cause</em></li>
<li>Third-party Office plugins run inside Word’s process</li>
<li>A single buggy DLL can crash the entire application</li>
</ul>
<p>In this case, <strong>Word is the victim — not the problem</strong>.</p>
<p><img src="https://developersde.blob.core.windows.net/usercontent/2026/2/21127_carshin%20word%20plugin.png" alt="21127_carshin%20word%20plugin"></p>
</div>]]></content:encoded></item><item><title><![CDATA[?Migrating All Azure Resources Between Subscriptions with Azure CLI & PowerShell?]]></title><description><![CDATA[<div class="kg-card-markdown"><p>Migrating resources between Azure subscriptions is a <strong>common but risky task</strong>. Whether you’re reorganizing tenants, separating billing, or preparing for a handover, doing this manually is slow and error-prone.<br>
The issue here is that Azure Portal does not provide an option to migrate all resources at once.</p>
<p>For this</p></div>]]></description><link>https://developers.de/2026/01/23/migrating-all-azure-resources-between-subscriptions-with-azure-cli/</link><guid isPermaLink="false">69723816c62a6e11f4d8554a</guid><category><![CDATA[Azure]]></category><category><![CDATA[Cloud]]></category><dc:creator><![CDATA[Damir Dobric]]></dc:creator><pubDate>Fri, 23 Jan 2026 09:57:00 GMT</pubDate><content:encoded><![CDATA[<div class="kg-card-markdown"><p>Migrating resources between Azure subscriptions is a <strong>common but risky task</strong>. Whether you’re reorganizing tenants, separating billing, or preparing for a handover, doing this manually is slow and error-prone.<br>
The issue here is that Azure Portal does not provide an option to migrate all resources at once.</p>
<p>For this reason, I created a <strong>PowerShell + Azure CLI script</strong> that <strong>automatically migrates all resource groups and their resources</strong> from one subscription to another.</p>
<h2 id="whatthisscriptdoes">? What This Script Does</h2>
<p>The script performs the following steps:</p>
<ol>
<li>Connects to a <strong>source Azure subscription</strong></li>
<li>Retrieves <strong>all resource groups</strong></li>
<li>Switches to a <strong>target subscription</strong></li>
<li>Creates missing resource groups</li>
<li>Moves <strong>all supported resources</strong> to the target subscription</li>
<li>Logs success and failure clearly</li>
</ol>
<p>It uses native <strong>Azure Resource Manager (ARM) move operations</strong>, meaning:</p>
<ul>
<li>Resource IDs remain intact</li>
<li>No redeployment is required</li>
<li>Downtime is minimized (but not zero)</li>
</ul>
<hr>
<h2 id="prerequisites">? Prerequisites</h2>
<p>Before running the script, ensure:</p>
<ul>
<li>Azure CLI is installed (<code>az version</code>)</li>
<li>You are logged in (<code>az login</code>)</li>
<li>You have <strong>Owner</strong> or <strong>Contributor</strong> permissions on both subscriptions</li>
<li>Resources are in a <strong>movable state</strong></li>
</ul>
<blockquote>
<p>⚠️ Not all Azure resources support cross-subscription moves (e.g., classic resources, some networking dependencies).</p>
</blockquote>
<hr>
<h2 id="scriptconfiguration">⚙️ Script Configuration</h2>
<p>Update the following values before running:</p>
<pre><code class="language-powershell">$sourceSubId = &quot;***&quot;     # Source subscription ID
$targetSubId = &quot;***&quot;     # Target subscription ID
$location = &quot;westeurope&quot; # Location for new resource groups
</code></pre>
<p>The <code>$location</code> value is only used when <strong>creating missing resource groups</strong> in the target subscription.</p>
<hr>
<p><img src="https://images.unsplash.com/photo-1515879218367-8466d910aaa4?q=80&amp;w=1600&amp;auto=format&amp;fit=crop" alt="PowerShell automation terminal"></p>
<hr>
<h2 id="scriptwalkthrough">? Script Walkthrough</h2>
<h3 id="1switchtosourcesubscription">1️⃣ Switch to Source Subscription</h3>
<pre><code class="language-powershell">az account set --subscription $sourceSubId
</code></pre>
<p>This ensures all resource discovery happens in the <strong>correct source context</strong>.</p>
<hr>
<h3 id="2retrieveallresourcegroups">2️⃣ Retrieve All Resource Groups</h3>
<pre><code class="language-powershell">$resourceGroups = az group list --query &quot;[].name&quot; -o tsv
</code></pre>
<p>This fetches <strong>every resource group name</strong> in the source subscription.</p>
<hr>
<h3 id="3ensureresourcegroupsexistintarget">3️⃣ Ensure Resource Groups Exist in Target</h3>
<pre><code class="language-powershell">az group exists --name $rg
</code></pre>
<p>If the resource group doesn’t exist in the target subscription, it is automatically created:</p>
<pre><code class="language-powershell">az group create --name $rg --location $location
</code></pre>
<p>✔ Prevents failures during resource moves<br>
✔ Keeps naming consistent</p>
<hr>
<h3 id="4collectresourceids">4️⃣ Collect Resource IDs</h3>
<pre><code class="language-powershell">$ids = az resource list --resource-group $rg --query &quot;[].id&quot; -o tsv
</code></pre>
<p>Azure requires <strong>resource IDs</strong> for move operations, not names.</p>
<hr>
<h3 id="5moveresourcesacrosssubscriptions">5️⃣ Move Resources Across Subscriptions</h3>
<pre><code class="language-powershell">az resource move `
  --destination-group $rg `
  --destination-subscription-id $targetSubId `
  --ids $ids
</code></pre>
<p>This is the <strong>core operation</strong>:</p>
<ul>
<li>Moves resources</li>
<li>Keeps them in the same resource group name</li>
<li>Preserves configuration and metadata</li>
</ul>
<hr>
<h3 id="6errorhandlinglogging">6️⃣ Error Handling &amp; Logging</h3>
<pre><code class="language-powershell">if ($LASTEXITCODE -eq 0) {
    Write-Host &quot;SUCCESS&quot;
} else {
    Write-Host &quot;FAILED - see error above&quot;
}
</code></pre>
<p>Failures usually occur due to:</p>
<ul>
<li>Unsupported resource types</li>
<li>Dependency constraints</li>
<li>Resources spanning multiple resource groups</li>
</ul>
<hr>
<p><img src="https://images.unsplash.com/photo-1556155092-490a1ba16284?q=80&amp;w=1600&amp;auto=format&amp;fit=crop" alt="Azure error diagnostics dashboard"></p>
<hr>
<h2 id="importantlimitations">⚠️ Important Limitations</h2>
<p>Be aware of these Azure constraints:</p>
<p>❌ Some resources <strong>cannot be moved</strong></p>
<ul>
<li>Classic resources</li>
<li>Certain App Service plans</li>
<li>Managed identities with dependencies</li>
</ul>
<p>❌ Resources <strong>must move together</strong></p>
<ul>
<li>VNets + subnets</li>
<li>NICs + VMs</li>
<li>Disks + VMs</li>
</ul>
<p>✔ Azure will <strong>block the move</strong> if dependencies are violated</p>
<hr>
<h2 id="bestpracticesbeforerunning">✅ Best Practices Before Running</h2>
<p>✔ Test on a <strong>single resource group first</strong><br>
✔ Export ARM templates as a backup<br>
✔ Run during a <strong>maintenance window</strong><br>
✔ Validate networking dependencies<br>
✔ Monitor activity logs during execution</p>
<hr>
<h2 id="whenshouldyouusethisscript">? When Should You Use This Script?</h2>
<p>This approach is ideal for:</p>
<ul>
<li>Subscription consolidation</li>
<li>Tenant separation</li>
<li>Environment restructuring (Dev → Prod)</li>
<li>M&amp;A cloud migrations</li>
<li>Billing realignment</li>
</ul>
<hr>
<h2 id="finalthoughts">? Final Thoughts</h2>
<p>This script provides a <strong>clean, repeatable, and safe</strong> way to migrate Azure resources at scale using native tooling from <strong>Microsoft Azure</strong>.</p>
<p>It’s not magic—but with proper preparation, it can save <strong>hours or days of manual work</strong>.</p>
<p>If you found this useful, feel free to:<br>
? Like<br>
? Repost<br>
? Share your migration war stories</p>
<p>Happy migrating ☁️?</p>
<p>----- SCRIPT ------</p>
<pre><code>Write-Host &quot;======================================&quot;
$sourceSubId = &quot;***&quot;
$targetSubId = &quot;***&quot;
$location = &quot;westeurope&quot;               

Write-Host $sourceSubId
Write-Host $targetSubId

# Switch to source subscription
Write-Host Setting + $targetSubId
az account set --subscription $sourceSubId

# Get list of all resource group names
$resourceGroups = az group list --query &quot;[].name&quot; -o tsv

foreach ($rg in $resourceGroups) {
    Write-Host &quot;======================================&quot; -ForegroundColor Cyan
    Write-Host &quot;Processing source RG: $rg&quot; -ForegroundColor Yellow

    # Check if same-name RG already exists in TARGET subscription
    az account set --subscription $targetSubId

    $exists = az group exists --name $rg --output tsv

    if ($exists -eq &quot;false&quot;) {
        Write-Host &quot;  Creating target RG '$rg' in location $location ...&quot; -ForegroundColor Green
        az group create --name $rg --location $location --subscription $targetSubId
    } else {
        Write-Host &quot;  Target RG '$rg' already exists - skipping creation&quot; -ForegroundColor Green
    }

    # Switch back to source to list resources
    az account set --subscription $sourceSubId

    # Get resource IDs from source RG
    $ids = az resource list --resource-group $rg --query &quot;[].id&quot; -o tsv

    if ($ids) {
        Write-Host &quot;  Moving resources from '$rg' ...&quot; -ForegroundColor Yellow
        az resource move `
            --destination-group $rg `
            --destination-subscription-id $targetSubId `
            --ids $ids

        if ($LASTEXITCODE -eq 0) {
            Write-Host &quot;  SUCCESS&quot; -ForegroundColor Green
        } else {
            Write-Host &quot;  FAILED - see error above. Often due to dependencies or unsupported resource types.&quot; -ForegroundColor Red
        }
    } else {
        Write-Host &quot;  No resources found in '$rg' - skipping move&quot; -ForegroundColor Gray
    }
}

Write-Host &quot;======================================&quot; -ForegroundColor Cyan
Write-Host &quot;All resource groups processed.&quot; -ForegroundColor White
</code></pre>
</div>]]></content:encoded></item><item><title><![CDATA[Building Smarter Agents with Copilot Studio + Model Context Protocol (MCP)]]></title><description><![CDATA[<div class="kg-card-markdown"><h2 id="introduction">Introduction</h2>
<p>Integrating a custom Model Context Protocol (MCP) server with Copilot Studio agents opens up new possibilities for organizations leveraging Microsoft 365 Copilot and Teams. This article guides you through the process of creating, deploying, and extending an AI agent with specialized skills, using MCP and Copilot Studio as the</p></div>]]></description><link>https://developers.de/2025/10/16/building-smarter-agents-with-copilot-studio-model-context-protocol-mcp/</link><guid isPermaLink="false">68e904fa9afb880dd816c1d2</guid><category><![CDATA[AI]]></category><category><![CDATA[Model Context Protocol]]></category><category><![CDATA[MCP]]></category><category><![CDATA[Azure]]></category><category><![CDATA[Cloud]]></category><category><![CDATA[asp.net]]></category><dc:creator><![CDATA[Heiko Luxenhofer]]></dc:creator><pubDate>Thu, 16 Oct 2025 08:07:21 GMT</pubDate><media:content url="https://developersde.blob.core.windows.net/usercontent/2025/10/161014_post_image%201%201.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><h2 id="introduction">Introduction</h2>
<img src="https://developersde.blob.core.windows.net/usercontent/2025/10/161014_post_image%201%201.png" alt="Building Smarter Agents with Copilot Studio + Model Context Protocol (MCP)"><p>Integrating a custom Model Context Protocol (MCP) server with Copilot Studio agents opens up new possibilities for organizations leveraging Microsoft 365 Copilot and Teams. This article guides you through the process of creating, deploying, and extending an AI agent with specialized skills, using MCP and Copilot Studio as the foundation. Whether you are a low-code enthusiast or a professional developer, you’ll find practical steps and insights to help you build robust, action-oriented agents tailored to your enterprise needs.</p>
<h2 id="understandingagenttypesincopilotstudio">Understanding Agent Types in Copilot Studio</h2>
<p>The diagram below illustrates the main types of agents you can build in Copilot Studio. Each type is tailored for specific tasks, ranging from answering questions and providing recommendations to executing automated actions and guiding users through processes. This simplified visual overview helps you quickly identify which agent type best fits your business.<br>
<img src="https://developersde.blob.core.windows.net/usercontent/2025/10/101311_agent_types.png" alt="Building Smarter Agents with Copilot Studio + Model Context Protocol (MCP)"><br>
In this post, we focus on the action-oriented agent type, which leverages an existing Azure DevOps MCP server implementation to extend capabilities and automate workflows. You can find the source code and deployment instructions for the MCP server in the following GitHub repository:<br>
<a href="https://github.com/heluxenhofer/mcp-server-azure-devops">https://github.com/heluxenhofer/mcp-server-azure-devops</a></p>
<h2 id="hostingyourmcpserverinazure">Hosting Your MCP Server in Azure</h2>
<p>To make your MCP server accessible to Copilot Studio agents, you first need to prepare your server code for deployment in Azure. Using the Azure Developer CLI, you can deploy your MCP server to an Azure Container App Environment. The process is straightforward: clone the example repository from GitHub, follow the instructions in the README, and configure your deployment. The resulting architecture includes managed identity, a container registry, Azure Key Vault, and Application Insights for monitoring. This setup ensures your MCP server is secure, scalable, and ready for enterprise use.<br>
<img src="https://developersde.blob.core.windows.net/usercontent/2025/10/13825_infrastructure.png" alt="Building Smarter Agents with Copilot Studio + Model Context Protocol (MCP)"></p>
<h2 id="agentwithmcpincopilotstudio">Agent with MCP in Copilot Studio</h2>
<p>Once your MCP server is running in Azure, the next step is to integrate it with Copilot Studio. Begin by manually configuring your agent in Copilot Studio, enabling generative AI orchestration mode to allow dynamic tool selection. For best results, disable general knowledge and web search features so your agent remains focused on its core tasks.<br>
When defining your agent’s instructions, clarity is key. For example, you might specify that your agent is an Azure DevOps assistant, designed to help developers perform specific tasks using Azure DevOps tools. The agent should be able to retrieve available MCP tools, summarize them for users, and guide them through actions such as creating new branches. It’s important to ensure the agent politely declines unrelated requests and maintains a friendly, engaging tone throughout interactions.<br>
Example instructions can be found in GitHub Repo <a href="https://github.com/heluxenhofer/mcp-server-azure-devops/blob/ac12db18f7cf5b9af95fbc77d3c400c65e47e596/docs/copilotstudio_instructions.md">here</a>.<br>
<strong>Tip</strong>: Take care to name referenced tools in your instructions like in configuration.<br>
If you aren`t familiar with creating agents in Copilot Studio, just follow instructions on Microsoft documentation <a href="https://learn.microsoft.com/en-us/microsoft-copilot-studio/fundamentals-get-started">Quickstart: Create and deploy an agent - Microsoft Copilot Studio | Microsoft Learn</a>.</p>
<h3 id="monitoringandinsights">Monitoring and Insights</h3>
<p>Monitoring is essential for maintaining high-quality, production-ready agents. Azure Application Insights provides comprehensive visibility into both your MCP server and Copilot Studio agents. By integrating Application Insights, you can track performance metrics, user interactions, and potential issues, enabling continuous improvement and reliable operation.  Application Insights can be set up under Settings-Advanced</p>
<h3 id="integratingthemcptoolincopilotstudio">Integrating the MCP Tool in Copilot Studio</h3>
<h4 id="initiatingthemcptoolintegration">Initiating the MCP Tool Integration</h4>
<p>Begin by opening your agent configuration in Copilot Studio and selecting the option to add a new tool. Choose “Model Context Protocol (MCP)” as the integration type. The onboarding wizard will guide you through the required steps. For a comprehensive walkthrough, refer to the official documentation:<br>
<a href="https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-add-existing-server-to-agent">https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-add-existing-server-to-agent</a></p>
<h4 id="configuringthemcpserverendpoint">Configuring the MCP Server Endpoint</h4>
<p>During setup, you will be prompted to provide the endpoint of your MCP server. For this post, the integration leverages an existing Azure DevOps MCP server implementation, available at:<br>
<a href="https://github.com/heluxenhofer/mcp-server-azure-devops">https://github.com/heluxenhofer/mcp-server-azure-devops</a><br>
Ensure your MCP server is deployed and accessible from the Copilot Studio environment, see section <a href="#Hosting-Your-MCP-Server-in-Azure">Hosting</a>.</p>
<h4 id="settingupsecureauthentication">Setting Up Secure Authentication</h4>
<p>Security is essential when integrating enterprise tools. Select Microsoft Entra ID (OAuth 2.0) as the authentication method. You will need to enter the Client ID, Client Secret, Authorization URL, Token / Refresh URL and the required scopes from your Azure Entra ID App Registration. You can use existing App Registration which was created for MCP-Server, described in <a href="https://github.com/heluxenhofer/mcp-server-azure-devops">GitHub Repository</a>.<br>
<strong>Tip</strong>: You can find these endpoints in the Azure portal under Azure Active Directory → App registrations → [Your App] → Overview → Endpoints.<br>
<img src="https://developersde.blob.core.windows.net/usercontent/2025/10/1390_Mcp_wizard.png" alt="Building Smarter Agents with Copilot Studio + Model Context Protocol (MCP)"></p>
<ul>
<li>Set the “Authorization URL” to the value labeled OAuth 2.0 authorization endpoint (v2).</li>
<li>Set the “Token URL” and “Refresh URL” to the value labeled OAuth 2.0 token endpoint (v2).</li>
<li>Scopes are defined under Expose an API in your App Registration.</li>
</ul>
<p>After completing these fields, Copilot Studio will generate a Redirect URL. Add this URL to your registered app’s Redirect URIs in Azure Entra ID to enable the authorization flow.<br>
<img src="https://developersde.blob.core.windows.net/usercontent/2025/10/1390_mcp_redirecturl.png" alt="Building Smarter Agents with Copilot Studio + Model Context Protocol (MCP)"></p>
<h4 id="finalizingandvalidatingtheintegration">Finalizing and Validating the Integration</h4>
<p>Once configuration is complete, Copilot Studio will prompt you to authenticate using your Entra ID credentials. Open the Connections Manager if necessary, verify your credentials, and reauthenticate as needed. After successful authentication, your agent will be able to invoke MCP tools for Azure DevOps automation.<br>
It is recommended to validate the integration using Copilot Studio’s Test pane. Enter prompts that trigger MCP tool actions and confirm that your agent can successfully connect and perform the intended operations.<br>
<img src="https://developersde.blob.core.windows.net/usercontent/2025/10/131059_agent_testing.png" alt="Building Smarter Agents with Copilot Studio + Model Context Protocol (MCP)"></p>
<h4 id="publishingandsharingyouragent">Publishing and Sharing Your Agent</h4>
<p>With your agent configured and authenticated, you’re ready to publish it in Copilot Studio. Add channels such as Microsoft Teams to make your agent accessible across your organization. Before rolling out the agent company-wide, test it in your chosen channels to ensure everything works as expected. Copilot Studio’s publishing workflow makes it easy to manage availability and distribution, supporting both targeted testing and broad deployment.<br>
<img src="https://developersde.blob.core.windows.net/usercontent/2025/10/13110_agent_publish.png" alt="Building Smarter Agents with Copilot Studio + Model Context Protocol (MCP)"><br>
Read more about publishing and deploying your agent on Microsoft documentation.<br>
<a href="https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-fundamentals-publish-channels?tabs=web">Key concepts - Publish and deploy your agent - Microsoft Copilot Studio | Microsoft Learn</a></p>
<p>After publishing the agent and adding channels, you can try out your agent in Microsoft Teams by clicking on “Availability options” and copy / paste the link into your browser and try your agent inside Microsoft Teams.<br>
<img src="https://developersde.blob.core.windows.net/usercontent/2025/10/13111_teams_testing.png" alt="Building Smarter Agents with Copilot Studio + Model Context Protocol (MCP)"><br>
<strong>Note</strong>: At the time of writing this post, there might be a bug when clicking on “See agent in Teams” and agent wasn`t working in Teams chat like expected. Click on “Availability options” and copy link to test agent instead.</p>
<h2 id="summary">Summary</h2>
<p>Integrating a custom MCP server with Copilot Studio enables organizations to build powerful, action-oriented AI agents that streamline workflows and enhance productivity. By leveraging Azure Container Apps for hosting and Copilot Studio’s orchestration and authentication features, teams can deploy scalable, secure, and flexible solutions tailored to their business needs.</p>
<h2 id="bestpracticesrecommendations">Best Practices &amp; Recommendations</h2>
<ul>
<li>Use separate environments for development, testing, and production in Copilot Studio to ensure stability and manage changes effectively.</li>
<li>Design agents with clear objectives and leverage built-in topics for extensibility.</li>
<li>Implement additional security measures for your MCP server in production, such as restricting access and monitoring usage.</li>
<li>Set up CI/CD pipelines for automated deployments and updates.</li>
<li>Regularly monitor agent performance and collect user feedback to continuously refine capabilities and address potential issues.</li>
</ul>
<h2 id="references">References</h2>
<p>GitHub Repository custom MCP Server: <a href="https://github.com/heluxenhofer/mcp-server-azure-devops">https://github.com/heluxenhofer/mcp-server-azure-devops</a><br>
Copilot Studio Documentation: <a href="https://learn.microsoft.com/en-us/microsoft-copilot-studio/">https://learn.microsoft.com/en-us/microsoft-copilot-studio/</a><br>
Model Context Protocol Integration: <a href="https://learn.microsoft.com/en-us/microsoft-copilot-studio/agent-extend-action-mcp">https://learn.microsoft.com/en-us/microsoft-copilot-studio/agent-extend-action-mcp</a><br>
Azure Container App Deployment: <a href="https://learn.microsoft.com/en-us/azure/developer/ai/build-mcp-server-ts">https://learn.microsoft.com/en-us/azure/developer/ai/build-mcp-server-ts</a><br>
Authentication with Entra ID: <a href="https://learn.microsoft.com/en-us/microsoft-copilot-studio/configuration-authentication-azure-ad">https://learn.microsoft.com/en-us/microsoft-copilot-studio/configuration-authentication-azure-ad</a></p>
</div>]]></content:encoded></item><item><title><![CDATA[Building AI-Ready, Discoverable Tools with Model Context Protocol (MCP) in .NET 9 & C#]]></title><description><![CDATA[Learn how to implement Model Context Protocol (MCP) in .NET 9 and C#. Build discoverable, schema-driven tools for AI assistants, automation, and DevOps workflows. This guide covers benefits, architecture, elicitation, and a quick start to future-proof your integrations.]]></description><link>https://developers.de/2025/08/26/model-context-protocol-mcp-with-net-9/</link><guid isPermaLink="false">68ad9c37ca9a670b48eb5c3a</guid><category><![CDATA[AI]]></category><category><![CDATA[.NET Core]]></category><category><![CDATA[MCP]]></category><category><![CDATA[Model Context Protocol]]></category><category><![CDATA[LLM]]></category><dc:creator><![CDATA[Heiko Luxenhofer]]></dc:creator><pubDate>Tue, 26 Aug 2025 12:13:41 GMT</pubDate><media:content url="https://developersde.blob.core.windows.net/usercontent/2025/8/26126_mcp-diagram.png" medium="image"/><content:encoded><![CDATA[<div class="kg-card-markdown"><img src="https://developersde.blob.core.windows.net/usercontent/2025/8/26126_mcp-diagram.png" alt="Building AI-Ready, Discoverable Tools with Model Context Protocol (MCP) in .NET 9 & C#"><p>This article presents a hands-on showcase of the Model Context Protocol (MCP) implemented with .NET and C#. See how MCP can be used to expose, discover, and orchestrate server-side tools in a standardized way—making integration smarter, more flexible, and ready for modern automation scenarios.</p>
<h1 id="introduction">Introduction</h1>
<p>Ever wondered how to make your tools and services more discoverable, interoperable, and easy to automate? MCP (Model Context Protocol) is designed for exactly that. In this showcase project, we use .NET and C# to demonstrate how MCP can turn ordinary APIs into intelligent, composable tools—ready for integration with clients, AI assistants, and automation platforms.</p>
<h2 id="whatismcp">What is MCP?</h2>
<p>MCP (Model Context Protocol) is an open protocol for exposing server-side operations as standardized, discoverable tools. According to the <a href="https://modelcontextprotocol.io/docs/getting-started/intro">official MCP specification</a>, MCP enables clients—such as developer tools, automation platforms, or AI assistants—to dynamically discover available operations, understand their input/output schemas, and invoke them in a consistent way.<br>
The diagrams below illustrate the difference between integrating APIs with and without MCP. This illustration alone demonstrates the advantages of using MCP.<br>
<img src="https://developersde.blob.core.windows.net/usercontent/2025/8/261146_rest-api-diagram.png" alt="Building AI-Ready, Discoverable Tools with Model Context Protocol (MCP) in .NET 9 & C#"><em>Integration of existing APIs without MCP</em><br>
<img src="https://developersde.blob.core.windows.net/usercontent/2025/8/261148_mcp-diagram.png" alt="Building AI-Ready, Discoverable Tools with Model Context Protocol (MCP) in .NET 9 & C#"><em>Integration of existing APIs with MCP</em></p>
<h3 id="benefitsofusingmcp">Benefits of Using MCP</h3>
<ul>
<li><strong>Discoverability</strong>: Clients can query the server to list all available tools and their capabilities, reducing the need for hardcoded API knowledge.</li>
<li><strong>Interoperability</strong>: MCP provides a common language for tools and clients, making integration across platforms and technologies straightforward.</li>
<li><strong>Extensibility</strong>: New tools and operations can be added to the server without breaking existing clients.</li>
<li><strong>Schema Transparenc</strong>y: Each tool exposes its input and output schema, enabling robust validation and easier client development.</li>
<li><strong>Security</strong>: MCP supports modern authentication and authorization mechanisms, such as OAuth 2.0 and Microsoft Entra ID.</li>
<li><strong>Automation &amp; AI Readiness</strong>: MCP is designed for orchestration by automation scripts and AI agents, supporting conversational and intelligent workflows.</li>
</ul>
<h3 id="elicitationwithmcpinteractiveuserworkflows">Elicitation with MCP: Interactive User Workflows</h3>
<p>A unique feature of MCP is its support for elicitation—interactive user input collection. In this project, elicitation is used to prompt users for required information (e.g., selecting a parent branch when creating a new branch). The MCP server sends a schema describing the expected input, and the client (or LLM) collects the user’s response, ensuring a guided and error-resistant workflow.<br>
Example json request/response with using an enum schema:</p>
<pre><code class="language-json">{
    &quot;type&quot;: &quot;object&quot;,
    &quot;properties&quot;: {
        &quot;ParentBranch&quot;: {
            &quot;type&quot;: &quot;string&quot;,
            &quot;enum&quot;: [
                &quot;main&quot;
            ]
        }
    },
    &quot;required&quot;: [
        &quot;ParentBranch&quot;
    ]
}
</code></pre>
<p><em>Request schema</em></p>
<pre><code class="language-json">{
    &quot;action&quot;: &quot;accept&quot;,
    &quot;content&quot;: {
        &quot;ParentBranch&quot;: &quot;main&quot;
    },
    &quot;_meta&quot;: null
}
</code></pre>
<p><em>Response schema</em></p>
<p>This approach makes user interaction smarter and more flexible, allowing for dynamic, context-aware prompts and responses.</p>
<h2 id="architectureoverview">Architecture Overview</h2>
<p>This showcase project on <a href="https://github.com/heluxenhofer/mcp-server-azure-devops">GitHub</a> is built with .NET 9 and C#, using MCP to abstract a set of Azure DevOps operations as MCP tools. The diagram below illustrates the key components and their interactions:</p>
<ul>
<li><strong>MCP Server</strong>:  Hosts the MCP tools and exposes a standardized discovery endpoint. Implements authentication via Microsoft Entra ID.</li>
<li><strong>MCP Tools</strong>: Each tool represents a server-side operation (e.g., create branch, list repositories). Tools expose input/output schemas for validation and interoperability. Requests operations to Azure DevOps REST API.</li>
<li><strong>Client/LLM</strong>: Discovers available tools dynamically and invokes them using the MCP protocol. Supports elicitation for interactive workflows.</li>
<li><strong>Authentication Layer</strong>:  Uses OAuth 2.0 and Entra ID for secure access control. Uses on-behalf-flow for accessing Azure DevOps REST API.</li>
</ul>
<p><img src="https://developersde.blob.core.windows.net/usercontent/2025/8/261154_architecture.png" alt="Building AI-Ready, Discoverable Tools with Model Context Protocol (MCP) in .NET 9 & C#"><em>Components of current architecture</em></p>
<h2 id="technicalimplementation">Technical Implementation</h2>
<p>This project is a practical demonstration of MCP’s power when combined with .NET and C#:</p>
<ul>
<li><strong>Modern</strong> .NET: Built with .NET 9 for reliability and performance.</li>
<li><strong>C# Best Practices</strong>: Clean, maintainable code that’s easy to extend.</li>
<li><strong>MCP Tooling</strong>: Azure DevOps operations are exposed as MCP tools, with clear schemas and discoverable endpoints.</li>
<li><strong>Secure by Design</strong>: Authentication via Entra ID and secure configuration management. Using on-behalf authentication flow for accessing Azure DevOps REST API in a secure way.</li>
</ul>
<p>More technical details, instructions and examples can be found in <a href="https://github.com/heluxenhofer/mcp-server-azure-devops/blob/main/README.md">readme</a> file of <a href="https://github.com/heluxenhofer/mcp-server-azure-devops">GitHub project</a></p>
<h2 id="whytrymcpwithnetandc">Why Try MCP with .NET and C#?</h2>
<p>If you’re a developer, architect, or automation enthusiast, this showcase is for you. MCP makes it easy to build smarter, more flexible integrations—whether you’re connecting tools, enabling AI, or future-proofing your APIs. With .NET and C#, you get a robust, enterprise-ready foundation for your MCP server.</p>
<h2 id="references">References</h2>
<p><a href="https://github.com/heluxenhofer/mcp-server-azure-devops">Project GitHub Repository</a><br>
<a href="https://github.com/modelcontextprotocol/csharp-sdk">MCP C# SDK</a><br>
<a href="https://github.com/modelcontextprotocol/modelcontextprotocol">MCP GitHub (Official)</a><br>
<a href="https://modelcontextprotocol.io/docs/getting-started/intro">MCP Specification</a></p>
</div>]]></content:encoded></item></channel></rss>