Use this file to discover all available pages before exploring further.
When using the Streamable HTTP transport, MCP servers often need access to the underlying HTTP request context. The HttpContext provides request metadata including headers, user identity, route data, and more.
using ModelContextProtocol.Server;using System.ComponentModel;namespace HttpContext.Tools;public class ContextTools(IHttpContextAccessor httpContextAccessor){ [McpServerTool(UseStructuredContent = true)] [Description("Retrieves the HTTP headers from the current request and returns them as a JSON object.")] public object GetHttpHeaders() { var context = httpContextAccessor.HttpContext; if (context == null) { return "No HTTP context available"; } var headers = new Dictionary<string, string>(); foreach (var header in context.Request.Headers) { headers[header.Key] = string.Join(", ", header.Value.ToArray()); } return headers; }}
Retrieve specific headers from the current request:
[McpServerTool][Description("Gets the user agent from the request")]public string GetUserAgent(IHttpContextAccessor httpContextAccessor){ var context = httpContextAccessor.HttpContext; if (context == null) return "No context available"; var userAgent = context.Request.Headers["User-Agent"].FirstOrDefault(); return userAgent ?? "No User-Agent header found";}
[McpServerToolType]public class UserTools(IHttpContextAccessor httpContextAccessor){ [McpServerTool] [Description("Gets the current authenticated user name")] public string GetCurrentUser() { var context = httpContextAccessor.HttpContext; if (context?.User?.Identity?.IsAuthenticated == true) { return context.User.Identity.Name ?? "Unknown user"; } return "Not authenticated"; } [McpServerTool] [Description("Gets all user claims")] public Dictionary<string, string> GetUserClaims() { var context = httpContextAccessor.HttpContext; if (context?.User == null) return new(); var claims = new Dictionary<string, string>(); foreach (var claim in context.User.Claims) { claims[claim.Type] = claim.Value; } return claims; }}
[McpServerTool][Description("Gets the client IP address")]public string GetClientIp(IHttpContextAccessor httpContextAccessor){ var context = httpContextAccessor.HttpContext; if (context == null) return "No context available"; var remoteIp = context.Connection.RemoteIpAddress; return remoteIp?.ToString() ?? "Unknown";}
[McpServerTool][Description("Gets a value from session")]public string GetSessionValue(string key, IHttpContextAccessor httpContextAccessor){ var context = httpContextAccessor.HttpContext; if (context?.Session == null) return "Session not available"; var value = context.Session.GetString(key); return value ?? $"No value found for key: {key}";}[McpServerTool][Description("Sets a value in session")]public string SetSessionValue(string key, string value, IHttpContextAccessor httpContextAccessor){ var context = httpContextAccessor.HttpContext; if (context?.Session == null) return "Session not available"; context.Session.SetString(key, value); return $"Session value set: {key} = {value}";}
Accessing the request body through HttpContext in MCP tools is not recommended because the MCP framework already reads the body to deserialize the JSON-RPC request. Use tool parameters instead.