Skip to main content

Building our first MCP Resources enabled MCP Server with C#–Advanced

This is a follow-up on an earlier post where I demonstrated how to build your own MCP server in C# and expose one or more MCP resources.

Today we dive a little bit deeper and look at some more advanced features you can add to your MCP server implementation.

Working with complex return types

Resources can return various types. Here are some advanced examples:

Return values from resource methods can be strings (for simple text), ReadResourceResult (for full control), or other types that the SDK automatically marshals into the appropriate format.

Dependency injection

Resources can use dependency injection to access services:

We changed our implementation to use instance methods (not static). Now we need to register the class in Program.cs:

Progress reporting

For long-running operations, you can report progress:

IProgress parameters accepting ProgressNotificationValue values enable progress reporting from resources to clients, with progress notifications propagating to the client if they included a ProgressToken in their request.


Binary resources

You can also return binary content by using a BlobResourceContents type and providing a base64 encoded version of our blob:

Remote Deployment with SSE

For remote deployment, you can use Server-Sent Events (SSE) or HTTP streaming with ASP.NET Core, enabling your MCP server to be accessible over HTTP.

First install an extra NuGet package:

dotnet add package ModelContextProtocol.AspNetCore --prerelease

Then you need to update your Program.cs:

You can now publish the server as a self-contained, ahead-of-time compiled native application, creating small executables that run without requiring the .NET runtime.

More information

If you are looking for an end-2-end example showing all the features I demonstrated, have a look at my GitHub repo:

Popular posts from this blog

Azure DevOps/ GitHub emoji

I’m really bad at remembering emoji’s. So here is cheat sheet with all emoji’s that can be used in tools that support the github emoji markdown markup: All credits go to rcaviers who created this list.

.NET 8–Keyed/Named Services

A feature that a lot of IoC container libraries support but that was missing in the default DI container provided by Microsoft is the support for Keyed or Named Services. This feature allows you to register the same type multiple times using different names, allowing you to resolve a specific instance based on the circumstances. Although there is some controversy if supporting this feature is a good idea or not, it certainly can be handy. To support this feature a new interface IKeyedServiceProvider got introduced in .NET 8 providing 2 new methods on our ServiceProvider instance: object? GetKeyedService(Type serviceType, object? serviceKey); object GetRequiredKeyedService(Type serviceType, object? serviceKey); To use it, we need to register our service using one of the new extension methods: Resolving the service can be done either through the FromKeyedServices attribute: or by injecting the IKeyedServiceProvider interface and calling the GetRequiredKeyedServic...

Kubernetes–Limit your environmental impact

Reducing the carbon footprint and CO2 emission of our (cloud) workloads, is a responsibility of all of us. If you are running a Kubernetes cluster, have a look at Kube-Green . kube-green is a simple Kubernetes operator that automatically shuts down (some of) your pods when you don't need them. A single pod produces about 11 Kg CO2eq per year( here the calculation). Reason enough to give it a try! Installing kube-green in your cluster The easiest way to install the operator in your cluster is through kubectl. We first need to install a cert-manager: kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.14.5/cert-manager.yaml Remark: Wait a minute before you continue as it can take some time before the cert-manager is up & running inside your cluster. Now we can install the kube-green operator: kubectl apply -f https://github.com/kube-green/kube-green/releases/latest/download/kube-green.yaml Now in the namespace where we want t...