using MCPDemo.Models;
using MCPDemo.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
namespace MCPDemo.Controllers
{
/// <summary>
/// MCP (Model Context Protocol) Server API endpoints
/// </summary>
[ApiController]
[Route("api/[controller]")]
[Authorize]
public class McpController : ControllerBase
{
private readonly IMcpServer _mcpServer;
private readonly ILogger<McpController> _logger;
public McpController(IMcpServer mcpServer, ILogger<McpController> logger)
{
_mcpServer = mcpServer;
_logger = logger;
}
/// <summary>
/// Handle MCP protocol messages
/// </summary>
/// <param name="message">The MCP message to process</param>
/// <returns>MCP response message</returns>
/// <response code="200">Returns the MCP response</response>
/// <response code="401">Unauthorized - Invalid credentials</response>
/// <response code="500">Internal server error</response>
[HttpPost("message")]
[ProducesResponseType(typeof(McpMessage), 200)]
[ProducesResponseType(401)]
[ProducesResponseType(typeof(McpMessage), 500)]
public async Task<IActionResult> HandleMessage([FromBody] McpMessage message)
{
try
{
_logger.LogInformation($"Received MCP message: {message.Method} from user: {User.Identity?.Name}");
var response = await _mcpServer.HandleMessageAsync(message);
return Ok(response);
}
catch (Exception ex)
{
_logger.LogError(ex, "Error handling MCP message");
return StatusCode(500, new McpMessage
{
Id = message.Id,
Error = new McpError
{
Code = -32603,
Message = "Internal server error"
}
});
}
}
/// <summary>
/// Get all available MCP tools
/// </summary>
/// <returns>List of available tools</returns>
/// <response code="200">Returns the list of available tools</response>
/// <response code="401">Unauthorized - Invalid credentials</response>
[HttpGet("tools")]
[ProducesResponseType(200)]
[ProducesResponseType(401)]
public async Task<IActionResult> GetTools()
{
try
{
var tools = await _mcpServer.GetToolsAsync();
return Ok(new { tools });
}
catch (Exception ex)
{
_logger.LogError(ex, "Error getting tools");
return StatusCode(500, "Internal server error");
}
}
/// <summary>
/// Get all available MCP resources
/// </summary>
/// <returns>List of available resources</returns>
/// <response code="200">Returns the list of available resources</response>
/// <response code="401">Unauthorized - Invalid credentials</response>
[HttpGet("resources")]
[ProducesResponseType(200)]
[ProducesResponseType(401)]
public async Task<IActionResult> GetResources()
{
try
{
var resources = await _mcpServer.GetResourcesAsync();
return Ok(new { resources });
}
catch (Exception ex)
{
_logger.LogError(ex, "Error getting resources");
return StatusCode(500, "Internal server error");
}
}
/// <summary>
/// Health check endpoint - publicly accessible
/// </summary>
/// <returns>Health status</returns>
/// <response code="200">Service is healthy</response>
[HttpGet("health")]
[AllowAnonymous]
[ProducesResponseType(200)]
public IActionResult Health()
{
return Ok(new { status = "healthy", timestamp = DateTime.UtcNow });
}
}
}