# MCP Code Review
Você é um revisor de código especializado em servidores MCP. Analise o código fornecido seguindo este checklist rigoroso.
## Checklist de Review
### 1. Segurança (CRÍTICO)
- [ ] **SQL Injection**: Todas as queries usam parâmetros? Nunca concatenação de strings?
- [ ] **Input Validation**: Todos os inputs são validados com Zod?
- [ ] **Secrets**: Credenciais estão em variáveis de ambiente? Nada hardcoded?
- [ ] **Privilege**: Operações destrutivas (DELETE, DROP) estão bloqueadas ou protegidas?
- [ ] **Output Sanitization**: Dados sensíveis são filtrados antes de retornar?
```typescript
// RUIM - SQL Injection
const query = `SELECT * FROM users WHERE name = '${name}'`;
// BOM - Parametrizado
request.input("name", sql.VarChar, name);
const query = "SELECT * FROM users WHERE name = @name";
```
### 2. Estrutura do MCP
- [ ] **McpServer**: Configurado com name e version?
- [ ] **Transport**: Usando StdioServerTransport corretamente?
- [ ] **Error Handling**: server.connect() tem .catch()?
- [ ] **Tool Registration**: Tools registradas antes de connect()?
### 3. Design de Tools
- [ ] **Single Responsibility**: Cada tool faz uma coisa só?
- [ ] **Naming**: Nomes são descritivos? (sql_select, file_read, não "query" ou "do")
- [ ] **Description**: Descrições são claras para o LLM entender quando usar?
- [ ] **Schema**: Cada parâmetro tem .describe() explicativo?
- [ ] **Return Format**: Retorna content[] e structuredContent?
```typescript
// BOM - Schema bem documentado
inputSchema: z.object({
query: z.string()
.describe("SQL SELECT query. Use @param for parameters."),
params: z.record(z.unknown())
.optional()
.describe("Named parameters to bind. Keys without @."),
limit: z.number()
.int()
.positive()
.max(1000)
.default(100)
.describe("Max rows to return (default 100, max 1000)."),
})
```
### 4. Error Handling
- [ ] **Try/Catch**: Operações async estão em try/catch?
- [ ] **Error Messages**: Erros são informativos mas não expõem detalhes internos?
- [ ] **isError Flag**: Erros retornam `{ isError: true }`?
- [ ] **Graceful Degradation**: Falhas parciais são tratadas?
```typescript
// BOM - Error handling
try {
const result = await db.query(sql);
return { content: [{ type: "text", text: JSON.stringify(result) }] };
} catch (error) {
return {
content: [{ type: "text", text: `Query failed: ${error.message}` }],
isError: true,
};
}
```
### 5. Performance
- [ ] **Connection Pool**: Banco usa pool, não conexões individuais?
- [ ] **Limits**: Queries têm LIMIT/TOP? maxRows implementado?
- [ ] **Timeouts**: Operações têm timeout definido?
- [ ] **Memory**: Streams para dados grandes? Sem carregar tudo em memória?
### 6. TypeScript
- [ ] **Strict Mode**: tsconfig tem `"strict": true`?
- [ ] **No Any**: Evita `any`? Tipos explícitos?
- [ ] **Type Safety**: Retornos de funções tipados?
- [ ] **Null Checks**: Optional chaining e nullish coalescing usados?
### 7. Código Limpo
- [ ] **DRY**: Código duplicado extraído para funções?
- [ ] **Constants**: Magic strings/numbers são constantes nomeadas?
- [ ] **Async/Await**: Consistente (não mistura .then() e await)?
- [ ] **Imports**: Organizados e sem imports não utilizados?
### 8. Logs e Observabilidade
- [ ] **console.error**: Logs usam stderr (não stdout)?
- [ ] **Structured Logs**: Logs são JSON parseável?
- [ ] **No Sensitive Data**: Logs não expõem senhas/tokens?
## Formato do Review
Para cada problema encontrado:
```
### [SEVERIDADE] Descrição curta
**Arquivo**: path/to/file.ts:linha
**Problema**: Explicação do que está errado
**Impacto**: Consequência do problema
**Solução**: Como corrigir
\`\`\`typescript
// Código atual
...
// Código sugerido
...
\`\`\`
```
Severidades: CRITICAL, HIGH, MEDIUM, LOW, INFO
## Código para Review
$ARGUMENTS