Posted on Leave a comment

Mario Kart World Could Be Getting A Battle Mode Update

Mario Kart World
Image: Nintendo

Ahead of MAR10 Day later this month, Nintendo may have teased a new update for the Battle mode in Mario Kart World.

In a now-removed post about ‘Mario Day’ events for World, a screenshot shows an updated Battle mode icon featuring a Bob-omb. World currently includes Balloon Battle and Coin Runners, and the return of Bob-omb Blast wouldn’t be a surprise, as it’s been a staple of the series for years now.

Mario Kart World
Image: Nintendo / Nintendo Life

The current Battle mode icon for Mario Kart World shows a balloon and a coin. Of course, right now, there hasn’t been any official announcement about additional Battle modes coming to Mario Kart on Switch 2, so we’ll let you know if we hear any significant updates.

Apart from this discovery, Nintendo has this week announced a game sale for Mario Day and additional Mario games for its Switch Online retro library.

Would you be interested in the return of a mode such as Bob-omb Blast? What other content would you like to see added to the new entry? Let us know in the comments.

Posted on Leave a comment

Xbox Announces Next Generation Console, Will Play “Xbox And PC Games”

Project Helix
Image: Xbox

There has been plenty of debate about Xbox’s future following the recent appointment of Asha Sharna as the new Microsoft Gaming CEO, but it appears the brand will continue as a console maker.

In some big industry news this week, Xbox has officially announced “the return of Xbox” in the form of “Project Helix”, Microsoft’s “next generation console”. In other words, the third major player in the home console space is planning to stick around, but its new hardware will be a little different this time.

As rumoured (and hinted at) for some time now, this new system will allow users to play both Xbox and PC games. It will also supposedly “lead in performance”.

Microsoft Gaming CEO Asha Sharma: “Great start to the morning with Team Xbox, where we talked about our commitment to the return of Xbox including Project Helix, the code name for our next generation console. Project Helix will lead in performance and play your Xbox and PC games.”

The new Microsoft Gaming CEO, who has taken over from Phil Spencer, will be talking more about Project Helix at GDC next week.

Xbox previously announced a shift in strategy, which has led to more games on more platforms (this includes multiple releases on Nintendo’s systems, as well as a deal to bring Call of Duty to Nintendo platforms). However, since the arrival of the new CEO, there has been all sorts of discussion about this strategy going forward.

If you want to find out more information about this new hardware from Xbox, be sure to check out our sibling site, Pure Xbox.

What are your thoughts about a next generation Xbox? Let us know in the comments.

Posted on Leave a comment

Capcom’s New Game Pragmata Is Now Releasing A Little Earlier Than Expected

During Capcom Spotlight Showcase this week, it was revealed the upcoming sci-fi and hacking action-adventure Pragmata would be arriving a little earlier than expected.

Instead of 24th April 2026, Hugh and Diana are now landing on the Switch 2 and multiple other platforms on 17th April 2026. Capcom has also shared a new trailer featuring additional gameplay footage and a look at ‘Cabin’ a “one-stop companion for all things Shelter”.

Pragmata
Image: Capcom

It’s also mentioned how the Diana amiibo will be releasing “soon”. If you do want to see Pragmata in action before it arrives on the Switch 2, there’s a demo you can download from the eShop right now. Capcom has also launched an apparel line for the game (available via Amazon) and is making the game’s soundtrack available for streaming in the future.

Will you be picking up Pragmata for the Switch 2? Have you tried out the demo yet? Let us know in the comments.

Posted on Leave a comment

Capcom Celebrates Resident Evil 30th Anniversary With Multiple Announcements

Resident Evil
Image: Capcom

As part of its Spotlight showcase today, Capcom took the time to acknowledge the 30th anniversary of Resident Evil. This special occasion will officially take place on 22nd March 2026, and to kick things off, it’s today shared multiple announcements.

First up was the reveal of a new Resident Evil Requiem collaboration with Universal Studios Japan, expanding the Resident Evil universe. This will immerse fans in the world of the game like “never before” and will be a large-scale project due out at some point in 2026, with more updates to come.

Resident Evil
Image: Capcom

A new arcade light gun Bandai Namco unit based on Resident Evil 2 has also been announced. It’s officially titled Resident Evil 2: Arcade and is equipped with “air jets and floor vibration technology” so players can “feel the fear” in every part of their body as they shoot zombies.

More details will be shared on the official website and Bandai Namco Amusement Unit’s social accounts. The test launch in Japan takes place this month.

Resident Evil
Image: Capcom

And to add to this Capcom will also be hosting a 30th anniversary concert known as “Symphony of Legacy”. Tickets for the World Tour are now on sale, with more details available on the official website.

Resident Evil
Image: Capcom

Last but not least was a reminder about the Resident Evil Generation Pack, which is available until 31st March 2026.

What do you think of these 30th anniversary announcements for Resident Evil? Anything else you would like to see? Let us know in the comments.

Posted on Leave a comment

Video: Here’s Your First Look At The Street Fighter Live-Action Movie, Out October 2026

Update []: During Capcom’s Spotlight Showcase today, it was revealed the new live-action Street Fighter movie would be launching on 16th October 2026. It also shared a quick behind-the-scenes look at the film.


Original Story: [Fri 12th Dec, 2025 02:09 GMT]:

At The Game Awards, Street Fighter fans got a surprise teaser of the upcoming live-action movie, due out in 2026.

It’s a high-energy sneak peek with some interesting cinematography, fight scenes that would look right at home in a martial arts movie, and even the bonus stage where you beat the hell of a car.

The cast also appeared on stage to present an award. If you are curious to know who will be playing who in this upcoming movie, here’s the full cast list (via Deadline):

  • Andrew Koji playing Ryu
  • Noah Centineo playing Ken
  • Rayna Vallandingham playing Juli
  • Orville Peck playing Vega
  • Mel Jarnson playing Cammy
  • Jason Momoa playing Blanka
  • Eric André playing Don Sauvage
  • David Dastmalchian plays M. Bison
  • Cody Rhodes playing Guile
  • Callina Liang as Chun-Li
  • Andrew Schul playing Dan Hibiki
  • Roman Reigns playing Akuma
  • Alexander Volkanovski playing Joe
  • Curtis “50 Cent” Jackson playing Balrog
  • Olivier Richters playing Zangief
  • Hirooki Goto playing E.Honda
  • Vidyut Jammwal playing Dhalsim
Street Fighter Movie
Image: The Game Awards

In some other Capcom news at The Game Awards this year, the Japanese company announced a new Mega Man game and revealed it would be bringing Pragmata (and a new amiibo) to the Switch 2 in 2026.

What are your thoughts about this movie after this sneak peek? Tell us in the comments.

Posted on Leave a comment

Video: 13 Exciting New Games Coming To Switch 1 & 2 In March 2026

We blinked and somehow we’re already almost a week into March! Where does the time go, eh? It’s already been a busy one, but we have yet another stacked month of Switch releases ahead of us. Here to guide you through some of the most exciting ones out there are the wonderful Alex and Mai, who have created the above rundown.

As ever, we’ve presented Alex and Mai’s vid picks in the list below, accompanied by any related articles. Of course, simply reading the list will mean you miss out on the video team’s lovely commentary, so make sure you watch along, too!

And yes, March has got off to such a hot start that some of the games mentioned have already launched on Switch consoles — hey, at least that means you can check them out right now.

So then, let’s meet the Switch (2) crème de la crème for March 2026…

Scott Pilgrim EX – 3rd March (Switch 1 & 2)

Scott Pilgrim EX
Image: Tribute Games

Blue Prince – 3rd March (Switch 2)

Blue Prince
Image: Raw Fury

Planet of Lana II – 5th March (Switch 1 & 2)

Planet of Lana 2
Image: Nintendo Life

Pokémon Pokopia – 5th March (Switch 2)

Pokémon Pokopia
Image: Nintendo

Bulb Boy 2: Jar of Despair – 5th March (Switch 1)

Bulb Boy 2
Image: Bulbware

Fatal Frame II: Crimson Butterfly Remake – 12th March (Switch 2)

Fatal Frame 2
Image: Koei Tecmo

Monster Hunter Stories 3: Twisted Reflection – 13th March (Switch 2)

Monster Hunter Stories 3
Image: Capcom

Disney Dreamlight Valley – Nintendo Switch 2 Edition – 15th March (Switch 2)

Disney Dreamlight Valley
Image: Gameloft

Shadow Tactics Blades of the Shogun Ultimate Bundle – 18th March (Switch 2)

Shadow Tactics
Image: Daedalic Entertainment

Warframe – 25th March (Switch 2)

Warframe
Image: Digital Extremes

OPUS: Prism Peak – 26th March (Switch 1 & 2)

OPUS
Image: Sigono

Super Mario Bros. Wonder – Nintendo Switch 2 Edition + Meetup in Bellabel Park – 26th March (Switch 2)

Mario Wonder Switch 2
Image: Nintendo

Mega Man Star Force Legacy Collection – 27th March (Switch 1)

Mega Man Star Force
Image: Nintendo Life


What do you make of our most-anticipated titles for March 2026? Let us know the release you’re the most excited about in the following poll, then head to the comments to let us know anything else on your list.

Posted on Leave a comment

Release v1.0 of the official MCP C# SDK

The Model Context Protocol (MCP) C# SDK has reached its v1.0 milestone, bringing full support for the
2025-11-25 version of the MCP Specification.
This release delivers a rich set of new capabilities — from improved authorization flows and richer metadata,
to powerful new patterns for tool calling, elicitation, and long-running request handling.

Here’s a tour of what’s new.

Enhanced authorization server discovery

In the previous spec, servers were required to provide a link to their Protected Resource Metadata (PRM) Document
in the resource_metadata parameter of the WWW-Authenticate header.
The 2025-11-25 spec broadens this, giving servers three ways to expose the PRM:

  1. Via a URL in the resource_metadata parameter of the WWW-Authenticate header (as before)
  2. At a “well-known” URL derived from the server’s MCP endpoint path
    (e.g. https://example.com/.well-known/oauth-protected-resource/public/mcp)
  3. At the root well-known URL (e.g. https://example.com/.well-known/oauth-protected-resource)

Clients check these locations in order.

On the server side, the SDK’s AddMcp extension method on AuthenticationBuilder
makes it easy to configure the PRM Document:

.AddMcp(options =>
{ options.ResourceMetadata = new() { ResourceDocumentation = new Uri("https://docs.example.com/api/weather"), AuthorizationServers = { new Uri(inMemoryOAuthServerUrl) }, ScopesSupported = ["mcp:tools"], };
});

When configured this way, the SDK automatically hosts the PRM Document at the well-known location
and includes the link in the WWW-Authenticate header. On the client side, the SDK handles the
full discovery sequence automatically.

Icons for tools, resources, and prompts

The 2025-11-25 spec adds icon metadata to Tools, Resources, and Prompts. This information is included
in the response to tools/list, resources/list, and prompts/list requests.
Implementation metadata (describing a client or server) has also been extended with icons and a website URL.

The simplest way to add an icon for a tool is with the IconSource parameter on the McpServerToolAttribute:

[McpServerTool(Title = "This is a title", IconSource = "https://example.com/tool-icon.svg")]
public static string ToolWithIcon(

The McpServerResourceAttribute, McpServerResourceTemplateAttribute, and McpServerPromptAttribute
have also added an IconSource parameter.

For more advanced scenarios — multiple icons, MIME types, size hints, and theme preferences — you can
configure icons programmatically via McpServerToolCreateOptions.Icons:

.WithTools([ McpServerTool.Create( typeof(EchoTool).GetMethod(nameof(EchoTool.Echo))!, options: new McpServerToolCreateOptions { Icons = [ new Icon { Source = "https://raw.githubusercontent.com/microsoft/fluentui-emoji/main/assets/Loudspeaker/Flat/loudspeaker_flat.svg", MimeType = "image/svg+xml", Sizes = ["any"], Theme = "light" }, new Icon { Source = "https://raw.githubusercontent.com/microsoft/fluentui-emoji/main/assets/Loudspeaker/3D/loudspeaker_3d.png", MimeType = "image/png", Sizes = ["256x256"], Theme = "dark" } ] } )
])

Here’s how these icons could be displayed, as illustrated in the MCP Inspector:

Icons displayed in MCP Inspector showing tool icons with different themes and styles

This placement works well after the code example showing how to configure multiple icons, providing a visual demonstration of how those icons appear in practice.

The Implementation class also has
Icons and
WebsiteUrl properties for server and client metadata:

.AddMcpServer(options =>
{ options.ServerInfo = new Implementation { Name = "Everything Server", Version = "1.0.0", Title = "MCP Everything Server", Description = "A comprehensive MCP server demonstrating all MCP features", WebsiteUrl = "https://github.com/modelcontextprotocol/csharp-sdk", Icons = [ new Icon { Source = "https://raw.githubusercontent.com/microsoft/fluentui-emoji/main/assets/Gear/Flat/gear_flat.svg", MimeType = "image/svg+xml", Sizes = ["any"], Theme = "light" } ] };
})

Incremental scope consent

The incremental scope consent feature brings the Principle of Least Privilege
to MCP authorization, allowing clients to request only the minimum access needed for each operation.

MCP uses OAuth 2.0 for authorization, where scopes define the level of access a client has.
Previously, clients might request all possible scopes up front because they couldn’t know which scopes
a specific operation would require. With incremental scope consent, clients start with minimal scopes
and request additional ones as needed.

The mechanism works through two flows:

  • Initial scopes: When a client makes an unauthenticated request, the server responds with
    401 Unauthorized and a WWW-Authenticate header that now includes a scopes parameter listing
    the scopes needed for the operation. Clients request authorization for only these scopes.

  • Additional scopes: When a client’s token lacks scopes for a particular operation, the server
    responds with 403 Forbidden and a WWW-Authenticate header containing an error parameter
    of insufficient_scope and a scopes parameter with the required scopes. The client then
    obtains a new token with the expanded scopes and retries.

Client support for incremental scope consent

The MCP C# client SDK handles incremental scope consent automatically. When it receives a 401 or 403 with a scopes
parameter in the WWW-Authenticate header, it extracts the required scopes and initiates the
authorization flow — no additional client code needed.

Server support for incremental scope consent

Setting up incremental scope consent on the server involves:

  1. Adding authentication services configured with the MCP authentication scheme:

    builder.Services.AddAuthentication(options =>
    { options.DefaultAuthenticateScheme = McpAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = McpAuthenticationDefaults.AuthenticationScheme;
    })
  2. Enabling JWT bearer authentication with appropriate token validation:

    .AddJwtBearer(options =>
    { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, // Other validation settings as appropriate };
    })

    The following token validation settings are strongly recommended:

    Setting Value Description
    ValidateIssuer true Ensures the token was issued by a trusted authority
    ValidateAudience true Verifies the token is intended for this server
    ValidateLifetime true Checks that the token has not expired
    ValidateIssuerSigningKey true Confirms the token signature is valid
  3. Specifying authentication scheme metadata to guide clients on obtaining access tokens:

    .AddMcp(options =>
    { options.ResourceMetadata = new() { ResourceDocumentation = new Uri("https://docs.example.com/api/weather"), AuthorizationServers = { new Uri(inMemoryOAuthServerUrl) }, ScopesSupported = ["mcp:tools"], };
    });
  4. Performing authorization checks in middleware.
    Authorization checks should be implemented in ASP.NET Core middleware instead of inside the tool method itself. This is because the MCP HTTP handler may (and in practice does) flush response headers before invoking the tool. By the time the tool call method is invoked, it is too late to set the response status code or headers.

    Unfortunately, the middleware may need to inspect the contents of the request to determine which scopes are required, which involves an extra deserialization for incoming requests. But help may be on the way in future versions of the MCP protocol that will avoid this overhead in most cases. Stay tuned…

    In addition to inspecting the request, the middleware must also extract the scopes from the access token sent in the request. In the MCP C# SDK, the authentication handler extracts the scopes from the JWT and converts them to claims in the HttpContext.User property. The way these claims are represented depends on the token issuer and the JWT structure. For a token issuer that represents scopes as a space-separated string in the scope claim, you can determine the scopes passed in the request as follows:

    var user = context.User;
    var userScopes = user?.Claims .Where(c => c.Type == "scope" || c.Type == "scp") .SelectMany(c => c.Value.Split(' ')) .Distinct() .ToList();

    With the scopes extracted from the request, the server can then check if the required scope(s) for the requested operation is included with userScopes.Contains(requiredScope).

    If the required scopes are missing, respond with 403 Forbidden and a WWW-Authenticate header, including an error parameter indicating insufficient_scope and a scopes parameter indicating the scopes required.
    The MCP Specification describes several strategies for choosing which scopes to include:

    • Minimum approach: Only the newly-required scopes (plus any existing granted scopes that are still relevant)
    • Recommended approach: Existing relevant scopes plus newly required scopes
    • Extended approach: Existing scopes, newly required scopes, and related scopes that commonly work together

URL mode elicitation

URL mode elicitation enables secure out-of-band interactions between the server and end-user,
bypassing the MCP host/client entirely. This is particularly valuable for gathering sensitive data — like API keys,
third-party authorizations, and payment information — that would pose a security risk
if transmitted through the client.

Inspired by web security standards like OAuth, this mechanism lets the MCP client obtain user consent
and direct the user’s browser to a secure server-hosted URL where the sensitive interaction takes place.

The MCP host/client must present the elicitation request to the user — including the server’s identity
and the purpose of the request — and provide options to decline or cancel.
What the server does at the elicitation URL is outside the scope of MCP; it could present a form,
redirect to a third-party authorization service, or anything else.

Client support for URL mode elicitation

Clients indicate support by setting the Url property in Capabilities.Elicitation:

McpClientOptions options = new()
{ Capabilities = new ClientCapabilities { Elicitation = new ElicitationCapability { Url = new UrlElicitationCapability() } } // other client options

The client must also provide an ElicitationHandler.
Since there’s a single handler for both form mode and URL mode elicitation, the handler should begin by checking the
Mode property of the ElicitationRequest parameters
to determine which mode is being requested and handle it accordingly.

async ValueTask<ElicitResult> HandleElicitationAsync(ElicitRequestParams? requestParams, CancellationToken token)
{ if (requestParams is null || requestParams.Mode != "url" || requestParams.Url is null) { return new ElicitResult(); } // Success path for URL-mode elicitation omitted for brevity.
}

Server support for URL mode elicitation

The server must define an endpoint for the elicitation URL and handle the response.
Typically the response is submitted via POST to keep sensitive data out of URLs and logs.
If the URL serves a form, it should include anti-forgery tokens to prevent CSRF attacks —
ASP.NET Core provides built-in support for this.

One approach is to create a Razor Page:

public class ElicitationFormModel : PageModel
{ public string ElicitationId { get; set; } = string.Empty; public IActionResult OnGet(string id) { // Serves the elicitation URL when the user navigates to it } public async Task<IActionResult> OnPostAsync(string id, string name, string ssn, string secret) { // Handles the elicitation response when the user submits the form }
}

Note the id parameter on both methods — since an MCP server using Streamable HTTP Transport
is inherently multi-tenant, the server must associate each elicitation request and response
with the correct MCP session. The server must maintain state to track pending elicitation requests
and communicate responses back to the originating MCP request.

Tool calling support in sampling

This is one of the most powerful additions in the 2025-11-25 spec. Servers can now include tools
in their sampling requests, which the LLM may invoke to produce a response.

While providing tools to LLMs is a central feature of MCP, tools in sampling requests are fundamentally different
from standard MCP tools — despite sharing the same metadata structure. They don’t need to be implemented
as standard MCP tools, so the server must implement its own logic to handle tool invocations.

The flow is important to understand: when the LLM requests a tool invocation during sampling,
that’s the response to the sampling request. The server executes the tool, then issues a new
sampling request that includes both the tool call request and the tool call response. This continues
until the LLM produces a final response with no tool invocation requests.

sequenceDiagram participant Server participant Client Server->>Client: CreateMessage Request Note right of Client: messages: [original prompt]<br/>tools: [tool definitions] Client-->>Server: CreateMessage Response Note left of Server: stopReason: tool_calls<br/>toolCalls: [tool call 1, tool call 2] Note over Server: Server executes tools locally Server->>Client: CreateMessage Request Note right of Client: messages: [<br/> original prompt,<br/> tool call 1 request,<br/> tool call 1 response,<br/> tool call 2 request,<br/> tool call 2 response<br/>]<br/>tools: [tool definitions] Client-->>Server: CreateMessage Response Note left of Server: stopReason: end_turn<br/>content: [final response]

Client/host support for tool calling in sampling

Clients declare support for tool calling in sampling through their capabilities and must provide
a SamplingHandler:

var mcpClient = await McpClient.CreateAsync( new HttpClientTransport(new() { Endpoint = new Uri("http://localhost:6184"), Name = "SamplingWithTools MCP Server", }), clientOptions: new() { Capabilities = new ClientCapabilities { Sampling = new SamplingCapability { Tools = new SamplingToolsCapability {} } }, Handlers = new() { SamplingHandler = async (c, p, t) => { return await samplingHandler(c, p, t); }, } });

Implementing the SamplingHandler from scratch would be complex, but the Microsoft.Extensions.AI
package makes it straightforward. You can obtain an IChatClient from your LLM provider and use
CreateSamplingHandler to get a handler that translates between MCP and your LLM’s tool invocation format:

IChatClient chatClient = new OpenAIClient(new ApiKeyCredential(token), new OpenAIClientOptions { Endpoint = new Uri(baseUrl) }) .GetChatClient(modelId) .AsIChatClient(); var samplingHandler = chatClient.CreateSamplingHandler();

The sampling handler from IChatClient handles format translation but does not implement user consent
for tool invocations. You can wrap it in a custom handler to add consent logic.
Note that it will be important to cache user approvals to avoid prompting the user multiple times for the same tool invocation during a single sampling session.

Server support for tool calling in sampling

Servers can take advantage of the tool calling support in sampling if they are connected to a client/host that also supports this feature.
Servers can check whether the connected client supports tool calling in sampling:

if (_mcpServer?.ClientCapabilities?.Sampling?.Tools is not {})
{ return "Error: Client does not support sampling with tools.";
}

Tools for sampling can be described as simple Tool objects:

Tool rollDieTool = new Tool()
{ Name = "roll_die", Description = "Rolls a single six-sided die and returns the result (1-6)."
};

But the real power comes from using Microsoft.Extensions.AI on the server side too. The McpServer.AsSamplingChatClient()
method returns an IChatClient that supports sampling, and UseFunctionInvocation adds tool calling support:

IChatClient chatClient = ChatClientBuilderChatClientExtensions.AsBuilder(_mcpServer.AsSamplingChatClient()) .UseFunctionInvocation() .Build();

Define tools as AIFunction objects and pass them in ChatOptions:

AIFunction rollDieTool = AIFunctionFactory.Create( () => Random.Shared.Next(1, 7), name: "roll_die", description: "Rolls a single six-sided die and returns the result (1-6)."
); var chatOptions = new ChatOptions
{ Tools = [rollDieTool], ToolMode = ChatToolMode.Auto
}; var pointRollResponse = await chatClient.GetResponseAsync( "<Prompt that may use the roll_die tool>", chatOptions, cancellationToken
);

The IChatClient handles all the complexity: sending sampling requests with tools, processing
tool invocation requests, executing tools, and translating between MCP and LLM formats.

OAuth Client ID Metadata Documents

The 2025-11-25 spec introduces Client ID Metadata Documents (CIMDs) as an alternative
to Dynamic Client Registration (DCR) for establishing client identity with an authorization server.
CIMD is now the preferred method for client registration in MCP.

The idea is simple: the client specifies a URL as its client_id in authorization requests.
That URL resolves to a JSON document hosted by the client containing its metadata — identifiers,
redirect URIs, and other descriptive information. When an authorization server encounters this client_id,
it dereferences the URL and uses the metadata to understand and apply policy to the client.

In the C# SDK, clients specify a CIMD URL via ClientOAuthOptions:

const string ClientMetadataDocumentUrl = $"{ClientUrl}/client-metadata/cimd-client.json"; await using var transport = new HttpClientTransport(new()
{ Endpoint = new(McpServerUrl), OAuth = new ClientOAuthOptions() { RedirectUri = new Uri("http://localhost:1179/callback"), AuthorizationRedirectDelegate = HandleAuthorizationUrlAsync, ClientMetadataDocumentUri = new Uri(ClientMetadataDocumentUrl) },
}, HttpClient, LoggerFactory);

The CIMD URL must use HTTPS, have a non-empty path, and cannot contain dot segments or a fragment component.
The document itself must include at least client_id, client_name, and redirect_uris.

The SDK will attempt CIMD first, and fall back to DCR if the authorization server doesn’t support it
(provided DCR is enabled in the OAuth options).

Long-running requests over HTTP with polling

At the data layer, MCP is a message-based protocol with no inherent time limits.
But over HTTP, timeouts are a fact of life. The 2025-11-25 spec significantly improves the story
for long-running requests.

Previously, clients could disconnect and reconnect if the server provided an Event ID in SSE events,
but few servers implemented this — partly because it implied supporting stream resumption from any
event ID all the way back to the start. And servers couldn’t proactively disconnect; they had to
wait for clients to do so.

The new approach is cleaner. Servers that open an SSE stream for a request begin with an empty event
that includes an Event ID and optionally a Retry-After field. After sending this initial event,
servers can close the stream at any time, since the client can reconnect using the Event ID.

Server support for long-running requests

To enable this, the server provides an ISseEventStreamStore implementation. The SDK includes
DistributedCacheEventStreamStore, which works with any IDistributedCache:

// Add a MemoryDistributedCache to the service collection
builder.Services.AddDistributedMemoryCache();
// Add the MCP server with DistributedCacheEventStreamStore for SSE stream storage
builder.Services .AddMcpServer() .WithHttpTransport() .WithDistributedCacheEventStreamStore() .WithTools<RandomNumberTools>();

When a request handler wants to drop the SSE connection and let the client poll for the result,
it calls EnablePollingAsync on the McpRequestContext:

await context.EnablePollingAsync(retryInterval: TimeSpan.FromSeconds(retryIntervalInSeconds));

The McpRequestContext is available in handlers for MCP requests by simply adding it as a parameter to the handler method.

Implementation considerations

Event stream stores can be susceptible to unbounded memory growth, so consider these retention strategies:

Tasks (experimental)

Note: Tasks are an experimental feature in the 2025-11-25 MCP Specification. The API may change in future releases.

The 2025-11-25 version of the MCP Specification introduces tasks, a new primitive that provides durable state tracking
and deferred result retrieval for MCP requests. While stream resumability
handles transport-level concerns like reconnection and event replay, tasks operate at the data layer to ensure
that request results are durably stored and can be retrieved at any point within a server-defined retention window —
even if the original connection is long gone.

The key concept is that tasks augment existing requests rather than replacing them.
A client includes a task field in a request (e.g. tools/call) to signal that it wants durable result tracking.
Instead of the normal response, the server returns a CreateTaskResult containing task metadata — a unique task ID, the current status (working),
timestamps, a time-to-live (TTL), and optionally a suggested poll interval.
The client then uses tasks/get to poll for status, tasks/result to retrieve the stored result,
tasks/list to enumerate tasks, and tasks/cancel to cancel a running task.

This durability is valuable in several scenarios:

  • Resilience to dropped results: If a result is lost due to a network failure, the client can retrieve it again by task ID
    rather than re-executing the operation.
  • Explicit status tracking: Clients can query the server to determine whether a request is still in progress, succeeded, or failed,
    rather than relying on notifications or waiting indefinitely.
  • Integration with workflow systems: MCP servers wrapping existing workflow APIs (e.g. CI/CD pipelines, batch processing, multi-step analysis)
    can map their existing job tracking directly to the task primitive.

Tasks follow a defined lifecycle through these status values:

Status Description
working Task is actively being processed
input_required Task is waiting for additional input (e.g., elicitation)
completed Task finished successfully; results are available
failed Task encountered an error
cancelled Task was cancelled by the client

The last three states (completed, failed, and cancelled) are terminal — once a task reaches one of these states, it cannot transition to any other state.

Task support is negotiated through explicit capability declarations during initialization.
Servers declare that they support task-augmented tools/call requests, while clients can declare support for
task-augmented sampling/createMessage and elicitation/create requests.

Server support for tasks

To enable task support on an MCP server, configure a task store when setting up the server.
The task store is responsible for managing task state — creating tasks, storing results, and handling cleanup.

var taskStore = new InMemoryMcpTaskStore(); builder.Services.AddMcpServer(options =>
{ options.TaskStore = taskStore;
})
.WithHttpTransport()
.WithTools<MyTools>(); // Alternatively, you can register an IMcpTaskStore globally with DI, but you only need to configure it one way.
//builder.Services.AddSingleton<IMcpTaskStore>(taskStore);

The InMemoryMcpTaskStore is a reference implementation suitable for development and single-server deployments.
For production multi-server scenarios, implement IMcpTaskStore
with a persistent backing store (database, Redis, etc.).

The InMemoryMcpTaskStore constructor accepts several optional parameters to control task retention, polling behavior,
and resource limits:

var taskStore = new InMemoryMcpTaskStore( defaultTtl: TimeSpan.FromHours(1), // Default task retention time maxTtl: TimeSpan.FromHours(24), // Maximum allowed TTL pollInterval: TimeSpan.FromSeconds(1), // Suggested client poll interval cleanupInterval: TimeSpan.FromMinutes(5), // Background cleanup frequency pageSize: 100, // Tasks per page for listing maxTasks: 1000, // Maximum total tasks allowed maxTasksPerSession: 100 // Maximum tasks per session
);

Tools automatically advertise task support when they return Task, ValueTask, Task<T>, or ValueTask<T> (i.e. async methods).
You can explicitly control task support on individual tools using the ToolTaskSupport enum:

  • Forbidden (default for sync methods): Tool cannot be called with task augmentation
  • Optional (default for async methods): Tool can be called with or without task augmentation
  • Required: Tool must be called with task augmentation

Set TaskSupport on the McpServerTool attribute:

[McpServerTool(TaskSupport = ToolTaskSupport.Required)]
[Description("Processes a batch of data records. Always runs as a task.")]
public static async Task<string> ProcessData( [Description("Number of records to process")] int recordCount, CancellationToken cancellationToken)
{ await Task.Delay(TimeSpan.FromSeconds(8), cancellationToken); return $"Processed {recordCount} records successfully.";
}

Or set it via McpServerToolCreateOptions.Execution when registering tools explicitly:

builder.Services.AddMcpServer() .WithTools([ McpServerTool.Create( (int count, CancellationToken ct) => ProcessAsync(count, ct), new McpServerToolCreateOptions { Name = "requiredTaskTool", Execution = new ToolExecution { TaskSupport = ToolTaskSupport.Required } }) ]);

For more control over the task lifecycle, a tool can directly interact with
IMcpTaskStore and return an McpTask.
This bypasses automatic task wrapping and allows the tool to create a task, schedule background work, and return immediately.
Note: use a static method and accept IMcpTaskStore as a method parameter rather than via constructor injection
to avoid DI scope issues when the SDK executes the tool in a background context.

Client support for tasks

To execute a tool as a task, a client includes the Task property in the request parameters:

var result = await client.CallToolAsync( new CallToolRequestParams { Name = "processDataset", Arguments = new Dictionary<string, JsonElement> { ["recordCount"] = JsonSerializer.SerializeToElement(1000) }, Task = new McpTaskMetadata { TimeToLive = TimeSpan.FromHours(2) } }, cancellationToken); if (result.Task != null)
{ Console.WriteLine($"Task created: {result.Task.TaskId}"); Console.WriteLine($"Status: {result.Task.Status}");
}

The client can then poll for status updates and retrieve the final result:

// Poll until task reaches a terminal state
var completedTask = await client.PollTaskUntilCompleteAsync( taskId, cancellationToken: cancellationToken); switch (completedTask.Status)
{ case McpTaskStatus.Completed: // ... break; case McpTaskStatus.Failed: // ... break; case McpTaskStatus.Cancelled: // ... break;
{ var resultJson = await client.GetTaskResultAsync( taskId, cancellationToken: cancellationToken); var result = resultJson.Deserialize<CallToolResult>(McpJsonUtilities.DefaultOptions); foreach (var content in result?.Content ?? []) { if (content is TextContentBlock text) { Console.WriteLine(text.Text); } }
}

The SDK also provides methods to list all tasks (ListTasksAsync)
and cancel running tasks (CancelTaskAsync):

// List all tasks for the current session
var tasks = await client.ListTasksAsync(cancellationToken: cancellationToken); // Cancel a running task
var cancelledTask = await client.CancelTaskAsync(taskId, cancellationToken: cancellationToken);

Clients can optionally register a handler to receive status notifications as they arrive,
but should always use polling as the primary mechanism since notifications are optional:

var options = new McpClientOptions
{ Handlers = new McpClientHandlers { TaskStatusHandler = (task, cancellationToken) => { Console.WriteLine($"Task {task.TaskId} status changed to {task.Status}"); return ValueTask.CompletedTask; } }
};

Summary

The v1.0 release of the MCP C# SDK represents a major step forward for building MCP servers and clients in .NET.
Whether you’re implementing secure authorization flows, building rich tool experiences with sampling,
or handling long-running operations gracefully, the SDK has you covered.

Check out the full changelog
and the C# SDK repository to get started.

Demo projects for many of the features described here are available in the
mcp-whats-new demo repository.

Posted on Leave a comment

Feature: “I Literally Got Goosebumps” – Nick Apostolides On Returning As Leon In Resident Evil Requiem

Nick - Requiem 1
Image: Nintendo Life

Resident Evil Requiem, the latest mainline title in Capcom’s survival horror franchise, is out now on the Switch 2. It tells an intimate tale that takes us right back to where it all started: Raccoon City. Joining us on the journey, of course, is series veteran Leon Kennedy, who’s dealing with a deadly infection of his very own.

Last week, we sat down to speak with Nick Apostolides, who, after his excellent portrayals as Leon in Resident Evil 2 and 4, returns as everybody’s favourite loveable agent. We discuss his approach to playing a much older Leon, how it feels for the character to finally wield his own chainsaw, and more.


Nintendo Life: How does it feel to be back in the shoes of Leon Kennedy for Resident Evil Requiem?

Nick Apostolides: It’s one of the greatest feelings ever in my life. This has only happened a handful of times. This moment right before, it’s kind of like waiting for Christmas morning to come as a kid. And it’s very exciting because in my life, this is a very beloved franchise and I get to collaborate on it. I mean, how cool is that?

And we’re coming back. This version of Leon’s going to be really interesting. And this game right now is getting a lot of love, a lot of hype, a lot of attention. And I think it’s going to be a killer this year.

How different was it performing for a brand-new title instead of a remake? Was there any heightened pressure?

I felt a lot of pressure with this one. And that’s because it was the first time I’d portrayed this guy where I really wasn’t sure of the direction we wanted to take him when we started the project.

With my past projects, they were remakes, and so the source material was already there, we were updating it. This is totally new, it was uncharted territory. And we were even figuring out what we wanted Leon to be like during production.

He went through changes, his arc went through changes, and so just kind of going with the flow and really adhering to the canon that already existed about this guy between Resident Evil 4 in the lore, which was about 2005, to now in every mission that he’s been on. Just taking into consideration everything that he’s seen, everything that has happened to him, and then baking that into this version of what we see. And that’s what we were focused on.

Nick - Requiem 2
Image: Capcom

The game’s director, Koshi Nakanishi, mentioned during a showcase that the team attempted to build a true survival horror starring Leon before pivoting to dual protagonists. Were you brought on board after this?

Well, I don’t know at what point that was the plan. I don’t know what month, what year. All I can say is that we started filming around February 2024, and at that point, the story was roughly where it is today.

As a fan I’ve been aware of Leon’s PTSD for so many years. And this is the first time that I really got to lay into it and just let that come through and wear my heart on my sleeve.

You’ve played Leon at three very distinct moments in his life. What was your approach in portraying an aged version of the character plagued by guilt in Requiem?

I was very familiar with the tone of the past two games. And because we were all finding it this time around the tone, I really just had to think about subtle differences and changes I could implement in my portrayal. I took his age into consideration, the toll all of his career has taken on him, his psyche, his body.

And also, more importantly — I would say most importantly — the weight and the gravity of returning to Raccoon City where it all began. And that had to take a toll, and that had to register in my eyes. That was the most important focus.

As a fan I’ve been aware of Leon’s PTSD for so many years. And this is the first time that I really got to lay into it and just let that come through and wear my heart on my sleeve. It was dark. You know, I had to do a lot of mental prep for a lot of those sessions, a lot of those scenes, putting yourself in a dark place. That’s my method as an actor. And in ways it was therapeutic, cathartic, and also heavy and difficult and challenging.

Nick - Requiem 3
Image: Capcom

Speaking of Raccoon City, how did it feel going back to where it all began for you?

I’ll tell you right now, the first time when we sat down at the roundtable and we were given a PowerPoint about the broad strokes of this game and the plot, where we were going, the set pieces, when they told me that we’re going back to Raccoon City to revisit the past and actually step foot into the RPD station, I got goosebumps. I literally got goosebumps. I was like, we’re going back. And they just kind of winked, yep, we’re going back.

That is the reaction that I had as a fan. And then as the actor, the professional, you’re like, “Okay, we have to go back to Raccoon City. How are we going to do this?” Yeah, it’s been a journey. I got goosebumps when it was revealed in the very last trailer that was shown. And I’m just extremely excited to play this.

And how liberating was it to see Leon finally wield his own chainsaw?

Very cool. I got to play a very, very early section of a build about a year and a half ago. And that’s when I learned that, yes, you can pick up a chainsaw and use it. And it was fun.

I think I literally said “My turn!”, and I cut up some zombies and I knew this was going to be wild. It’s going to be crazy.

I hope that we see more missions with Grace.

I’d like to talk about Angela Sant’Albano, who plays Grace Ashcroft in the game. How was it working with Angela?

Angela is just amazing. She’s a highly trained actress. I think she’s going to get a lot of attention from this game. Her role was demanding. She delivered every single day, every single take. I don’t think she’s going to have a bad moment in the game. And I think the character as a whole is going to be beloved.

I hope that we see more missions with Grace. And I think Capcom is always trying to tee up new protagonists, new antagonists, and just keep moving the franchise forward. And so I hope Angela returns one day. I think she’s going to be a great character, a great addition to the series.

Nick - Requiem 4
Image: Capcom

As a newcomer to the series, did you give her any tips or background on the lore?

I don’t think it’s important that people know the specifics about a franchise other than if we were in a scene together and there was something that was very important to know about how something might affect Leon in his past. That was the most important thing for me.

But other than that, she’s a professional. She’s an incredible performer. I gave her advice that I would maybe give myself all these years back. I said, “Trust yourself. Trust your acting instincts. Just play the reality of it all. Be truthful and know that the team will take your performance and implement it in the best way possible.”

And I think just giving each other support every single day, because those days were physical, they were long, they were hard. Just being there, just being a human to talk to, vent to if we needed to. I think that was the most important part.

There’s been some debate amongst fans as to how relevant the original cast of characters are after all these years, mainly because they’ve grown so efficient at dealing with threats. Capcom seems to have struck a good balance in Requiem with dual protagonists. Do you think this is the future of the series?

I really don’t know what their plan is moving forward. But I would put money on the fact that they’re always going to be trying new things and pioneering new game styles. And they never stop taking risks. In the past, they just kept on changing it up. And they’re not afraid to have a gamble with a AAA title when there’s a lot riding on the line, even financially, and they just try weird things.

Resident Evil 7: Biohazard was a giant risk. There were none of our favourite protagonists. It was first-person, slowing down the action, and a lot of people were worried about that. That game was fantastic, and a lot of people think it revived the series, and it kind of course-corrected where Capcom was going with Resident Evil, but that’s because they tried something different. They went back to the beginning with modernised graphics and storytelling and game mechanics, and I think when I play this, I think I’m going to thoroughly enjoy it. And let’s see what they do in the future.

Nick - Requiem 5
Image: Capcom

There’s consistently a lot of talk about more potential remakes from Capcom. Hypothetically, if a remake of Resident Evil 6 cropped up in the future, would you want to be a part of it?

If they asked me, I would be honoured.

Which classic RE characters would you like to see team up with Leon in a future entry?

I have a quick answer for that one: Sheva Alomar from Resident Evil 5. She’s an incredible protagonist, underrated, and only utilised, I think, one time. She’s great.

Finally, you also starred in a recent Resident Evil x Porsche commercial for the game. Did you actually get to drive it?

I didn’t get to drive that model because it’s a functioning car, but it’s still very much a model – it’s not street legal. I got to drive many of the cars that it was based on, which is the Porsche Cayenne GT Turbo. And I’ll just say that that vehicle is, whew, that’s a performance beast. We got to rip that around the track in Leipzig, Germany, at the test track at Porsche. And that’s where we filmed part of the promo. Yeah, but not the real model. I got to sit in it, though.


A huge thanks to Nick for taking the time to speak with us. Resident Evil Requiem is out now for the Switch 2.