McpServiceController.java

package fr.tiogars.chat.domains.mcp.controllers;

import fr.tiogars.chat.domains.mcp.models.McpActionRequest;
import fr.tiogars.chat.domains.mcp.models.McpActionResponse;
import fr.tiogars.chat.domains.mcp.models.McpServiceConfig;
import fr.tiogars.chat.domains.mcp.services.McpService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * REST controller for MCP service operations.
 */
@RestController
@RequestMapping("/api/mcp/services")
@Tag(name = "MCP Services", description = "MCP service management and actions")
public class McpServiceController {

    private final McpService mcpService;

    public McpServiceController(McpService mcpService) {
        this.mcpService = mcpService;
    }

    @GetMapping
    @Operation(summary = "List all MCP services", description = "Get all registered MCP service configurations")
    public ResponseEntity<List<McpServiceConfig>> listServices() {
        List<McpServiceConfig> services = mcpService.getAllServices();
        return ResponseEntity.ok(services);
    }

    @GetMapping("/{serviceId}")
    @Operation(summary = "Get MCP service configuration", description = "Get configuration for a specific MCP service")
    public ResponseEntity<McpServiceConfig> getService(@PathVariable String serviceId) {
        McpServiceConfig config = mcpService.getService(serviceId);
        if (config == null) {
            return ResponseEntity.notFound().build();
        }
        return ResponseEntity.ok(config);
    }

    @PostMapping
    @Operation(summary = "Register MCP service", description = "Register a new MCP service configuration")
    public ResponseEntity<McpServiceConfig> registerService(@Valid @RequestBody McpServiceConfig config) {
        McpServiceConfig registered = mcpService.registerService(config);
        return ResponseEntity.ok(registered);
    }

    @PostMapping("/{serviceId}/actions")
    @Operation(summary = "Execute MCP action", description = "Execute an action on a specific MCP service")
    public ResponseEntity<McpActionResponse> executeAction(
            @PathVariable String serviceId,
            @Valid @RequestBody McpActionRequest request
    ) {
        // Override serviceId from path
        McpActionRequest updatedRequest = new McpActionRequest(
                serviceId,
                request.action(),
                request.parameters()
        );
        McpActionResponse response = mcpService.executeAction(updatedRequest);
        return ResponseEntity.ok(response);
    }
}