using ColaFlow.Modules.Mcp.Application.Services;
using ColaFlow.Modules.Mcp.Contracts.Resources;
using Microsoft.Extensions.Logging;
namespace ColaFlow.Modules.Mcp.Application.Handlers;
///
/// Handler for 'resources/health' method
/// Checks availability and health of all registered resources
///
public class ResourceHealthCheckHandler(
ILogger logger,
IMcpResourceRegistry resourceRegistry)
: IMcpMethodHandler
{
public string MethodName => "resources/health";
public async Task HandleAsync(object? @params, CancellationToken cancellationToken)
{
logger.LogDebug("Handling resources/health request");
var resources = resourceRegistry.GetAllResources();
var healthResults = new List();
var totalResources = resources.Count;
var healthyResources = 0;
var unhealthyResources = 0;
foreach (var resource in resources)
{
try
{
// Try to get descriptor - if this fails, resource is unhealthy
var descriptor = resource.GetDescriptor();
// Basic validation
var isHealthy = !string.IsNullOrWhiteSpace(descriptor.Uri)
&& !string.IsNullOrWhiteSpace(descriptor.Name)
&& descriptor.IsEnabled;
if (isHealthy)
{
healthyResources++;
}
else
{
unhealthyResources++;
}
healthResults.Add(new
{
uri = descriptor.Uri,
name = descriptor.Name,
category = descriptor.Category,
status = isHealthy ? "healthy" : "unhealthy",
isEnabled = descriptor.IsEnabled,
version = descriptor.Version
});
}
catch (Exception ex)
{
unhealthyResources++;
logger.LogError(ex, "Health check failed for resource {ResourceType}", resource.GetType().Name);
healthResults.Add(new
{
uri = resource.Uri,
name = resource.Name,
category = resource.Category,
status = "error",
error = ex.Message
});
}
}
var overallStatus = unhealthyResources == 0 ? "healthy" : "degraded";
logger.LogInformation("Resource health check completed: {Healthy}/{Total} healthy",
healthyResources, totalResources);
var response = new
{
status = overallStatus,
totalResources = totalResources,
healthyResources = healthyResources,
unhealthyResources = unhealthyResources,
timestamp = DateTime.UtcNow,
resources = healthResults
};
return await Task.FromResult(response);
}
}