- Add /mcp-servers/ to .gitignore for MCP server installations - Extend mcp_installations table with status, logs, and validation fields - Refactor MCP install route to support custom configs, enable logs, and async installation - Improve MCPSyncService with promise-based syncing to prevent concurrent operations This update improves MCP management by adding robust installation tracking, custom configuration support, and better error handling for a more reliable user experience.
129 lines
3.4 KiB
TypeScript
129 lines
3.4 KiB
TypeScript
import { NextResponse } from "next/server";
|
|
import { MCPRepository } from "@/database/repositories/mcp";
|
|
import { MCPValidatorService } from "@/lib/services/mcp-validator";
|
|
|
|
export const dynamic = "force-dynamic";
|
|
|
|
export async function POST(request: Request) {
|
|
try {
|
|
const { mcpId } = await request.json();
|
|
|
|
if (!mcpId) {
|
|
return NextResponse.json(
|
|
{ success: false, error: "MCP ID é obrigatório" },
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
console.log(`🧪 Testing MCP server: ${mcpId}`);
|
|
|
|
// Buscar dados do MCP no banco
|
|
const mcpData = MCPRepository.getInstalledMCP(mcpId);
|
|
if (!mcpData) {
|
|
return NextResponse.json(
|
|
{ success: false, error: "MCP não encontrado" },
|
|
{ status: 404 }
|
|
);
|
|
}
|
|
|
|
// Obter ambiente de instalação
|
|
const environment = MCPRepository.getEnvironment(mcpId);
|
|
|
|
if (!environment) {
|
|
return NextResponse.json(
|
|
{
|
|
success: false,
|
|
error:
|
|
"MCP não está instalado corretamente. Ambiente não encontrado.",
|
|
},
|
|
{ status: 400 }
|
|
);
|
|
}
|
|
|
|
console.log(
|
|
`Testing environment: ${environment.executable} ${environment.args?.join(
|
|
" "
|
|
)}`
|
|
);
|
|
|
|
// Validar servidor usando protocolo JSON-RPC MCP
|
|
const validationResult = await MCPValidatorService.validateMCPServer(
|
|
environment,
|
|
mcpData.config
|
|
);
|
|
|
|
// Salvar resultado da validação
|
|
MCPRepository.saveValidationResult(mcpId, validationResult);
|
|
|
|
if (validationResult.success) {
|
|
// Atualizar ferramentas se validação foi bem-sucedida
|
|
if (validationResult.tools && validationResult.tools.length > 0) {
|
|
MCPRepository.saveTools(mcpId, validationResult.tools);
|
|
}
|
|
|
|
console.log(`✅ Test successful for ${mcpId}:`, {
|
|
protocol: validationResult.protocol,
|
|
tools: validationResult.tools.length,
|
|
});
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
result: {
|
|
success: true,
|
|
protocol: validationResult.protocol,
|
|
toolsCount: validationResult.tools.length,
|
|
tools: validationResult.tools,
|
|
capabilities: validationResult.capabilities,
|
|
},
|
|
});
|
|
}
|
|
|
|
// Se validação falhou, tentar validação simples
|
|
console.warn(`⚠️ JSON-RPC validation failed, trying simple validation...`);
|
|
|
|
const simpleResult = await MCPValidatorService.simpleValidation(
|
|
environment,
|
|
mcpData.config,
|
|
5000
|
|
);
|
|
|
|
if (simpleResult.success) {
|
|
console.log(`✅ Simple validation passed for ${mcpId}`);
|
|
|
|
return NextResponse.json({
|
|
success: true,
|
|
result: {
|
|
success: true,
|
|
protocol: "unknown",
|
|
message: "Server starts but JSON-RPC validation failed",
|
|
toolsCount: 0,
|
|
tools: [],
|
|
},
|
|
});
|
|
}
|
|
|
|
// Ambas validações falharam
|
|
console.error(`❌ All validations failed for ${mcpId}`);
|
|
|
|
return NextResponse.json({
|
|
success: false,
|
|
error:
|
|
validationResult.error || simpleResult.error || "Validation failed",
|
|
result: {
|
|
success: false,
|
|
protocol: validationResult.protocol,
|
|
error: validationResult.error,
|
|
},
|
|
});
|
|
} catch (error: any) {
|
|
console.error("Error testing MCP server:", error);
|
|
return NextResponse.json(
|
|
{
|
|
success: false,
|
|
error: error.message || "Internal server error",
|
|
},
|
|
{ status: 500 }
|
|
);
|
|
}
|
|
}
|