
Many developers struggle with managing temporary, request-specific data on their backend servers, especially in distributed or concurrent environments. Passing state through long chains of function calls can lead to convoluted code and potential bugs, particularly when dealing with asynchronous operations or shared resources. This is where advanced Model Context Protocol (MCP) server patterns, specifically the concept of scoped context, shine. Instead of relying on global variables or complex dependency injection containers for ephemeral data, scoped context allows you to define a temporary, isolated environment for a specific operation or request.
MCP’s ContextManager is your key tool here. You can define custom context objects that encapsulate request-specific data, such as authentication tokens, tracing IDs, or even pre-fetched data relevant only to the current transaction. By creating a new ContextManager for each request or logical unit of work and binding your custom context to it, you ensure that this data is isolated and automatically cleaned up when the scope ends. This prevents state leakage between requests and simplifies debugging significantly.
To implement this, you’ll typically create a ContextManager factory that generates a new scope for incoming requests. Within that scope, you can then create and populate your custom context object. This pattern is particularly useful for building middleware or interceptors that need to augment or modify request-specific data without altering the core business logic.
Here’s a simplified example of how you might set up a scoped context for managing a request-specific user ID in your MCP server. This pattern ensures that the UserId is always available within the current request’s context and is automatically discarded afterward.
{
"hooks": {
"server_request_start": "scripts/request_context.ts:startRequestContext",
"server_request_end": "scripts/request_context.ts:endRequestContext"
}
}
Try it: Create a .claude/settings.json file in your project root, add the above hooks configuration, and define corresponding startRequestContext and endRequestContext functions in scripts/request_context.ts that utilize claude.getContextManager().set() and claude.getContextManager().clear().