security-review-mcp-tool
Version:
Servidor MCP para revisão de segurança de código
158 lines • 5.91 kB
JavaScript
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