Skip to main content

Posts

Showing posts from April, 2025

GitHub Copilot–3 misconceptions why people don’t use it

As more as I’m motivating my teams to adopt and integrate GitHub Copilot in their development processes, the more I get push back with reasons why they cannot use it. This resistance often stems from misconceptions rather than Copilot's actual limitations. In this post, I'll address three common misconceptions I've encountered and share strategies for overcoming them.  Misconception 1: "Copilot produces low-quality and insecure code" One of the most persistent concerns I hear is that Copilot generates code that's either functionally deficient or contains security vulnerabilities. While it's true that Copilot isn't perfect, this concern often overestimates the risks while underestimating both Copilot's capabilities and the developer's role in the process: Copilot isn't designed to replace code review or testing practices The tool works best as a pair-programming assistant, not an autonomous coder Recent studies show that d...

AsyncEnumerable in C#: The importance of EnumeratorCancellation attribute

Modern applications often need to process large datasets or streams of data asynchronously. When we need to iterate through such data without loading everything at once, we've traditionally used IEnumerable. But what if our data access is inherently asynchronous? Enter IAsyncEnumerable<T> , introduced in C# 8.0 and .NET Core 3.0, designed specifically for asynchronous streaming scenarios. In this post, we'll explore IAsyncEnumerable<T> and why the EnumeratorCancellation attribute with a CancellationToken is crucial for writing robust, cancellable asynchronous code. What is IAsyncEnumerable<T>? IAsyncEnumerable<T> is an interface that represents a sequence of elements that can be asynchronously enumerated. It's the asynchronous counterpart to the familiar IEnumerable<T> interface. The beauty of IAsyncEnumerable<T> is that it allows you to: Perform asynchronous operations while iterating through a sequence Yield resu...

The quest of the 403.16 error in IIS

Ever heard about the 403.16 HTTP error response code? I certainly did not. But it was exactly this error code we got back after configuring IIS to expect a client certificate. In this post I’ll explain how we tackled the issue and found a solution(workaround?). How to configure IIS to expect a client certificate? First step is to enable SSL on IIS: Open IIS Manager . Select your site and click Bindings . Add or edit an HTTPS binding and select a valid SSL certificate . Now we need to configure our website so that it requires a client certificate: In IIS Manager, select your site. Click SSL Settings . Check Require SSL . Under Client certificates , select Require . Click on Apply . A last optional step is to configure client certificate mapping: Navigate to Authentication settings. Enable IIS Client Certificate Mapping Authentication . Remar...

How our kids learn–Object relational mapping

I was listening to the Coaching for Leaders podcast today where the episode featured Jon Fogel discussing "How to raise your kids without raising your voice." If you're a parent, I strongly recommend this episode. The ineffectiveness of punishment The key message that resonated with me is that punishment simply doesn't work. Many of us think we're "teaching our kids a lesson," but children often can't even remember what they were being punished for. Instead of imposing retribution, Jon suggests helping your kids understand the natural and logical consequences of their behaviors. For example, rather than punishing a child who refuses to wear a coat, letting them experience being cold (within safe limits) teaches the practical reason for wearing one far more effectively. One quote from the podcast particularly struck me: "Get curious, not furious: Your kid's not giving you a hard time; they're having a hard time." This...

Tool calling using MCP with Semantic Kernel

Semantic Kernel has the concept of a plugin as a way to give your AI superpowers and allow it to perform actions that it wouldn’t be able to do otherwise. A plugin consists of one or more functions that are available to your AI to be invoked. In Semantic Kernel you can create native plugins that are written in C#, Java or Python or create a plugin based on an OpenAPI specification. Behind the scenes, Semantic Kernel leverages function calling (also called tool calling). With function calling, LLMs can request a particular function, invoke it and capture the results. The way that these tools are created and called can be different from AI to AI and platform to platform. To tackle this problem Anthropic created the Model Context Protocol as a way to standardize all these integrations. Think of MCP like a USB-C port for AI applications. Just as USB-C provides a standardized way to connect your devices to various peripherals and accessories, MCP provides a standardized way to co...

Git cherry-picking

Git is my 'go-to' version control tool for a long time. I switched from SVN & TFVS (Team Foundation Version Control) a long time ago and never looked back. One feature that I used sometimes in TFVC was the cherry-pick feature but since I started using GIT I never used cherry-pick anymore. Until today... What is cherry-picking? Cherry-picking refers to the process of selecting a specific, individual commit from one branch and applying it to another. Unlike merging or rebasing entire branches, cherry-picking lets you choose exactly which changes you want to incorporate. Think of it as picking cherries from a tree (hence the name): instead of harvesting all the fruit, you carefully select only the ripest, most desirable ones. When to use cherry-picking? I have some bad memories from using cherry-picking in TFVC as it was used a lot as a poor mans alternative to a good versioning strategy. But there are some scenarios where cherry-picking can be useful: Backpor...

Semantic Kernel with Ollama returns 404 - The final solution

Today I had to do some small changes in an existing project where we were using Semantic Kernel together with Ollama during debugging and testing. As Ollama exposes an Open AI compatible API, this is possible without any code changes. At least it was... Here is the code I was using: When I opened the project I noticed that some of the packages references where outdated so I started by upgrading to the latest version of the Semantic Kernel NuGet packages. However after doing that the requests started to fail with a 404 error message. Mmm? Didn’t I got the same error before? And indeed I talked about this issue in an earlier post . The issue is still there as I could confirm by looking at the Ollama log messages: Here is the successful request using the old Semantic Kernel version: [GIN] 2025/04/24 - 10:05:40 | 200 |    48.466781s |       127.0.0.1 | POST     "/v1/chat/completions" Here is the failing ...

GitHub–Disable required reviews for pull requests

I’m working on a (small) open source application where I’m currently the only contributor. I setup the project so that the main branch is protected by a branch protection rule. By using branch protection rules, you can enforce certain workflows or requirements before someone can push changes to a branch, including merging a pull request into the branch. You can view the active branch protection rules by going to Settings –> Branches (available in the Code and automation section): In my case I had setup a rule that required a pull request before merging son that I could track and iterate on changes in separate branches.  To see the specific branch rule, click on Edit next to the branch: I liked the pull request model for this application but as a default GitHub also configured that an approval was required by at least one reviewer. This is great if you are working with multiple contributors on a project but as I was working mostly alone on it, requiring such a review n...

Debugging your MCP integration

As the list of available tools keeps growing, sooner or later something will not work and some debugging becomes necessary. In this post I look into ways to troubleshoot your MCP integration. Let's dive in! To understand what we need to debug you need to be aware of the architecture of an MCP integration. It follows a client-server architecture , where AI models can request data through a host with an MCP client (e.g. GitHub Copilot, Claude Desktop, …) from MCP servers, which then retrieve relevant information from local or remote sources. This means that when a problem occurs that there (at least) 2 places to look at. Debugging the MCP client Let’s start by looking into the client. The way you need to debug the client is completely dependent on the host. I’ll focus on GitHub Copilot and Claude Desktop. GitHub Copilot When VSCode encounters an error while trying to interact with an MCP server, you get a red error indicator in the Chat window: Click on the icon and...

Let Claude Desktop interact with local Powerpoint and Word documents

On Monday I talked about interacting with Word and Powerpoint documents directly through GitHub Copilot. After writing that post , a colleague reached out to me asking if the same is possible through Claude Desktop . As the original MCP protocol was created by Anthropic(the company that created Claude Desktop), the answer is 'of course'. Remark: If you want a general introduction about MCP servers, check out my previous post . The use case Part of my job is working on presales activities. Typically, this involves answering RFI's and RFP's by creating solution designs, project plans and describe the supporting processes. The end result is typically a Word document containing all the details about our offer in combination with a PowerPoint to present our offer to the customer. I was wondering if I could let an AI agent interact directly with these documents to help me create and finetune our proposals. Use an MCP server to talk to Microsoft Office To realize th...

GitHub Copilot Agent Tool calling -Safe by default

Through the MCP integration in GitHub Copilot, your AI agent is no longer limited to interactions with your IDE but can interact with your local computer and the outside world. A problem is that this open up a new range of possible attack vectors and malicious actors. So be careful when downloading a random MCP server example from the Internet. GitHub Copilot Agents helps you by asking by default permission to execute a task: Only by clicking on Continue the MCP server instance is called, and the tool is executed. Of course, it can become annoying to confirm this over and over again. Therefore, you can choose between multiple options: Allow in this Session Allow in this Workspace Always allow This gives you full control to balance between security and convenience. If you really want to just auto-approve everything (not recommended) set this in your settings: chat.tools.autoApprove: true Happy (vibe) coding! More information Use MCP servers in VS Code (Prev...

Let GitHub Copilot interact with your local PowerPoint and Word documents

Part of my job is working on presales activities. Typically, this involves answering RFI's and RFP's by creating solution designs, project plans and describe the supporting processes. The end result is typically a Word document containing all the details about our offer in combination with a PowerPoint to present our offer to the customer. I was wondering if I could let GitHub Copilot interact directly with these documents to help me create and finetune our proposals. Thanks to the rise of the Model Context Protocol (MCP) and a growing list of MCP servers, we can easily do this. But before I dive in the details, let me briefly explain what MCP is all about. What is MCP? MCP, or Model Context Protocol , is an open protocol designed to standardize how applications provide context to large language models (LLMs).  In the documentation they describe it like a USB-C port for AI applications —just as USB-C allows devices to connect seamlessly, MCP enables AI models to integrate...