UNPKG

security-review-mcp-tool

Version:

Servidor MCP para revisão de segurança de código

158 lines 5.91 kB
import express from "express"; import { randomUUID } from "crypto"; import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StreamableHTTPServerTransport } from "@modelcontextprotocol/sdk/server/streamableHttp.js"; import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js"; import { z } from "zod"; import { analisarSegurancaCodigo } from "./security-analyzer.js"; const app = express(); app.use(express.json()); // Mapa para armazenar transportes por ID de sessão const transportes = {}; /** * Cria um novo servidor MCP com as ferramentas de segurança * @returns Instância do servidor MCP */ function criarServidorMCP() { const servidor = new McpServer({ name: "Revisor de Segurança", version: "1.0.0" }); // Adicionar ferramenta para revisar segurança do código servidor.tool("revisar-seguranca-codigo", { codigo: z.string(), linguagem: z.string().optional(), nivel_detalhe: z.enum(["baixo", "medio", "alto"]).optional().default("medio") }, async ({ codigo, linguagem, nivel_detalhe }) => { try { const resultadoAnalise = await analisarSegurancaCodigo(codigo, linguagem, nivel_detalhe); return { content: [ { type: "text", text: resultadoAnalise } ] }; } catch (erro) { return { content: [ { type: "text", text: `Erro ao analisar código: ${erro.message}` } ], isError: true }; } }); // Adicionar prompt para ajudar na revisão de código servidor.prompt("revisar-codigo", { codigo: z.string(), linguagem: z.string().optional(), nivel_detalhe: z.enum(["baixo", "medio", "alto"]).optional() }, ({ codigo, linguagem, nivel_detalhe }) => ({ messages: [{ role: "user", content: { type: "text", text: `Por favor, realize uma revisão de segurança completa ${nivel_detalhe ? `com nível de detalhe ${nivel_detalhe}` : "detalhada"} do seguinte código ${linguagem ? `em ${linguagem}` : ""}:\n\n${codigo}\n\nIdentifique vulnerabilidades de segurança, potenciais falhas, e recomende melhorias para aumentar a segurança.` } }] })); return servidor; } // Rota principal para solicitações MCP app.post('/mcp', async (req, res) => { // Verificar ID de sessão existente const sessionId = req.headers['mcp-session-id']; let transporte; if (sessionId && transportes[sessionId]) { // Reutilizar transporte existente transporte = transportes[sessionId]; } else if (!sessionId && isInitializeRequest(req.body)) { // Nova solicitação de inicialização transporte = new StreamableHTTPServerTransport({ sessionIdGenerator: () => randomUUID(), onsessioninitialized: (sessionId) => { // Armazenar o transporte pelo ID da sessão transportes[sessionId] = transporte; } }); // Limpar transporte quando fechado transporte.onclose = () => { if (transporte.sessionId) { delete transportes[transporte.sessionId]; } }; const servidor = criarServidorMCP(); // Conectar ao servidor MCP await servidor.connect(transporte); } else { // Solicitação inválida res.status(400).json({ jsonrpc: '2.0', error: { code: -32000, message: 'Solicitação inválida: ID de sessão não fornecido ou inválido', }, id: null, }); return; } // Tratar a solicitação await transporte.handleRequest(req, res, req.body); }); // Manipulador reutilizável para solicitações GET e DELETE const tratarSolicitacaoSessao = async (req, res) => { const sessionId = req.headers['mcp-session-id']; if (!sessionId || !transportes[sessionId]) { res.status(400).send('ID de sessão inválido ou ausente'); return; } const transporte = transportes[sessionId]; await transporte.handleRequest(req, res); }; // Tratar solicitações GET para notificações servidor-cliente via SSE app.get('/mcp', tratarSolicitacaoSessao); // Tratar solicitações DELETE para encerramento de sessão app.delete('/mcp', tratarSolicitacaoSessao); // Página inicial simples app.get('/', (req, res) => { res.send(` <html> <head> <title>Revisor de Segurança MCP</title> <style> body { font-family: Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px; } h1 { color: #2c3e50; } pre { background-color: #f8f9fa; padding: 15px; border-radius: 5px; } </style> </head> <body> <h1>Revisor de Segurança MCP</h1> <p>API MCP para revisão de segurança de código. Use o endpoint <code>/mcp</code> para interagir com o serviço usando o Model Context Protocol.</p> <h2>Exemplo de Ferramenta:</h2> <pre> { "name": "revisar-seguranca-codigo", "arguments": { "codigo": "function getUserData(userId) { return db.query('SELECT * FROM users WHERE id = ' + userId); }", "linguagem": "javascript", "nivel_detalhe": "alto" } } </pre> </body> </html> `); }); // Iniciar o servidor const PORTA = process.env.PORT ? parseInt(process.env.PORT) : 3000; app.listen(PORTA, () => { console.log(`Servidor MCP de revisão de segurança rodando em http://localhost:${PORTA}`); }); //# sourceMappingURL=http-server.js.map